Files
water-back/app/Models/Bouns.php
2023-01-11 11:00:43 +08:00

129 lines
3.5 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model as BaseModel;
class Bouns extends Model
{
protected $dates = ['date'];
protected $casts = [
'source' => 'array',
];
const ONE_STAR = 1;
const TWO_STAR = 2;
const THREE_STAR = 3;
const FOUR_STAR = 4;
const FIVE_STAR = 5;
const TYPES = [
self::ONE_STAR => '一星分红',
self::TWO_STAR => '二星分红',
self::THREE_STAR => '三星分红',
self::FOUR_STAR => '四星分红',
self::FIVE_STAR => '五星分红',
];
const TYPEARRAY = [self::ONE_STAR, self::TWO_STAR, self::THREE_STAR, self::FOUR_STAR, self::FIVE_STAR];
const STATUS_INIT = 0;
const STATUS_SENDING = 1;
const STATUS_SENDED = 2;
const STATUS_REJECT = 8;
const STATUS_ERROR = 9;
const STATUS = [
self::STATUS_INIT => '待发放',
self::STATUS_SENDING => '发放中',
self::STATUS_SENDED => '发放完毕',
self::STATUS_REJECT => '停发',
self::STATUS_ERROR => '错误',
];
protected function orders()
{
return $this->hasMany(BounsOrder::class);
}
/**
* 增加累计额度,增加对应订单记录
* @param BaseModel $order
* @param float $total
* @param float $rate
* @return void
*/
protected function addAmount(BaseModel $order, float $total, float $rate)
{
$amount = bcmul($total, bcdiv($rate, 100, 4), 2);
if ($this->orders()->create([
'order_type' => $order->getMorphClass(),
'order_id' => $order->id,
'type' => $this->type,
'total' => $total,
'amount' => $amount,
])) {
$this->increment('total', $amount);
}
}
/**
* 获取分红模型
* @param int $type 类别
* @param bool $last 是否上一期
* @return mixed
*/
public static function getBouns(int $type, bool $last = false)
{
$time = now()->startOfMonth();
if ($last) {
$time = now()->subMonth()->startOfMonth();
}
return Bouns::firstOrCreate([
'type' => $type,
'date' => $time->toDateTimeString(),
], [
'total' => 0,
'status' => self::STATUS_INIT,
]);
}
/**
* 增加分红
* @param BaseModel $order 订单
* @param float $total 订单金额(未计算前)
* @return void
*/
public static function addBouns(BaseModel $order, float $total)
{
$rateArray = [
self::ONE_STAR => app('Conf_user')['one_star_balance_rate'] ?? 0,
self::TWO_STAR => app('Conf_user')['two_star_balance_rate'] ?? 0,
self::THREE_STAR => app('Conf_user')['three_star_balance_rate'] ?? 0,
self::FOUR_STAR => app('Conf_user')['four_star_balance_rate'] ?? 0,
self::FIVE_STAR => app('Conf_user')['five_star_balance_rate'] ?? 0,
];
foreach ($rateArray as $key => $rate) {
if ($rate > 0) {
$model = Bouns::getBouns($key);
$model->addAmount($order, $total, $rate);
}
}
}
public function doIng()
{
$this->status = self::STATUS_SENDING;
$this->save();
}
public function doEnd()
{
$this->status = self::STATUS_SENDED;
$this->save();
}
public function doError()
{
$this->status = self::STATUS_ERROR;
$this->save();
}
}