273 lines
12 KiB
PHP
273 lines
12 KiB
PHP
<?php
|
||
namespace Yunshop\CulturalSpace\models;
|
||
|
||
|
||
use app\common\models\BaseModel;
|
||
use app\common\models\Member;
|
||
use app\common\models\member\MemberChildren;
|
||
use app\common\models\Order;
|
||
use app\common\models\OrderGoods;
|
||
use app\common\models\UniAccount;
|
||
use app\common\facades\Setting;
|
||
use app\common\services\income\IncomeService;
|
||
use Illuminate\Support\Facades\DB;
|
||
|
||
class ContributionBonusLog extends BaseModel{
|
||
|
||
public $table = 'yz_cultural_space_contribution_bonus_log';
|
||
public $timestamps = false;
|
||
protected $hidden = ['uniacid'];
|
||
public $casts = [
|
||
'created_at' => 'datetime:Y-m-d H:i:s',
|
||
];
|
||
protected $fillable = ['uniacid','uid','total_money','money','total_contribution','hold_contribution','proportion','created_at'];
|
||
|
||
// 贡献分享分红相关内容
|
||
private $orderTotalMoney = 0;// 周期订单总金额
|
||
private $bonusTotalMoney = 0;// 分红总销售额(周期订单总金额的N%)
|
||
|
||
/**
|
||
* Common: 获取分红记录
|
||
* Author: wu-hui
|
||
* Time: 2023/11/03 15:53
|
||
* @param $search
|
||
* @return array
|
||
*/
|
||
public function getList($search){
|
||
// 条件生成
|
||
$where = [];
|
||
if($search['uid'] > 0) $where[] = ['uid','=',$search['uid']];
|
||
if($search['is_settlement'] >= 0 && $search['is_settlement'] != '') $where[] = ['is_settlement','=',$search['is_settlement']];
|
||
// 列表获取
|
||
$list = self::uniacid()
|
||
->select(['id','uid','total_money','money','total_contribution','hold_contribution','proportion','is_settlement','created_at'])
|
||
->where($where)
|
||
->with([
|
||
'member' => function($query){
|
||
$query->select(['uid','nickname','realname','avatar']);
|
||
}
|
||
])
|
||
->orderBy('created_at','DESC')
|
||
->orderBy('id','DESC')
|
||
->paginate(10);
|
||
|
||
return $list ? $list->toArray() : [];
|
||
}
|
||
/**
|
||
* Common: 获取用户贡献分享分红
|
||
* Author: wu-hui
|
||
* Time: 2023/11/20 16:06
|
||
* @param int $uid 用户id
|
||
* @param string $incomeStatus all=全部收益;undrawn=未提现收益,withdrawn=已提现收益
|
||
* @return mixed
|
||
*/
|
||
public static function getIncomeSum(int $uid,string $incomeStatus = 'all'){
|
||
return self::uniacid()
|
||
->leftJoin('yz_member_income', function ($join) {
|
||
$join->on('yz_member_income.member_id', 'yz_cultural_space_contribution_bonus_log.uid')->on('yz_member_income.incometable_id', 'yz_cultural_space_contribution_bonus_log.id');
|
||
})
|
||
->where('yz_member_income.dividend_code',201)
|
||
->where('yz_cultural_space_contribution_bonus_log.uid',$uid)
|
||
->when($incomeStatus != 'all',function($query) use ($incomeStatus){
|
||
$query->where('yz_member_income.status',$incomeStatus == 'undrawn' ? 0 : 1);
|
||
});
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* Common: 贡献分享分红 - 分红处理开始
|
||
* Author: wu-hui
|
||
* Time: 2023/11/03 15:09
|
||
*/
|
||
public function bonusInit(){
|
||
set_time_limit(0);
|
||
DB::beginTransaction();
|
||
try{
|
||
[$startTime,$endTime] = getTimeStamp('yesterday');// yesterday 计算前一天信息
|
||
// 循环平台 进行处理
|
||
$uniAccount = UniAccount::getEnable() ?: [];
|
||
foreach ($uniAccount as $u) {
|
||
Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid;
|
||
$set = Setting::get('plugin.cultural_space_set');
|
||
// 判断:是否符合执行条件
|
||
$isRun = (boolean)$this->isRun($set,$startTime,$endTime);
|
||
// 判断:允许下一步
|
||
if ($isRun) $this->bonusHandle($set,$startTime,$endTime);
|
||
}
|
||
|
||
\Log::debug('--- 文创空间 - 贡献分享分红 - 结束 end----');
|
||
DB::commit();
|
||
}catch(\Exception $e){
|
||
\Log::debug('--- 文创空间 - 贡献分享分红 - 错误:'.$e->getMessage());
|
||
DB::rollBack();
|
||
}
|
||
}
|
||
/**
|
||
* Common: 贡献分享分红 - 判断是否允许继续执行
|
||
* Author: wu-hui
|
||
* Time: 2023/11/03 13:43
|
||
* @param $set
|
||
* @param $startTime
|
||
* @param $endTime
|
||
* @return bool
|
||
*/
|
||
private function isRun($set,$startTime,$endTime){
|
||
$time = time();
|
||
// 判断:时间上是否允许继续执行(上一个周期结束时间存在 & 当前时间小于下一个周期开始时间 禁止继续执行)
|
||
$upCycleEndTime = ContributionBonus::uniacid()->max('end_time');
|
||
$lastRunTime = strtotime(date("Y-m-d H:i:s",$upCycleEndTime)." +1 day");// 下一个周期结束时间
|
||
if($upCycleEndTime > 0 && $time < $lastRunTime) {
|
||
\Log::debug("执行时间错误(上一个周期结束时间{$upCycleEndTime},下一个周期结束时间{$lastRunTime})",\YunShop::app()->uniacid);
|
||
return false;
|
||
}
|
||
// 判断:设置是否允许执行 未开启贡献值 || 分红总额比例为0或未设置
|
||
if((int)$set['is_give_contribution'] != 1 || (float)$set['contribution_bonus_ratio'] <= 0) {
|
||
\Log::debug("未开启贡献值或者分红总额比例为0或未设置",\YunShop::app()->uniacid);
|
||
return false;
|
||
}
|
||
// 判断:是否存在分红总金额 分红总金额,仅计算参与文创空间的商品的销售额
|
||
$this->orderTotalMoney = (float)OrderGoods::uniacid()
|
||
->leftjoin('yz_order','yz_order.id','=','yz_order_goods.order_id')
|
||
->leftjoin('yz_goods_cultural_space','yz_goods_cultural_space.goods_id','=','yz_order_goods.goods_id')
|
||
->where('yz_goods_cultural_space.is_open',1)
|
||
->where('yz_order.pay_time','>=',$startTime)
|
||
->where('yz_order.pay_time','<',$endTime)
|
||
->where('yz_order.price','>',0)
|
||
->whereIn('yz_order.status',[Order::WAIT_SEND,Order::WAIT_RECEIVE,Order::COMPLETE])// 待发货、待收货、已完成
|
||
->sum('yz_order_goods.price');
|
||
// $this->orderTotalMoney = (float)Order::uniacid()
|
||
// ->where('pay_time','>=',$startTime)
|
||
// ->where('pay_time','<',$endTime)
|
||
// ->where('price','>',0)
|
||
// ->whereIn('status',[Order::WAIT_SEND,Order::WAIT_RECEIVE,Order::COMPLETE])
|
||
// ->sum('price');
|
||
$this->bonusTotalMoney = (float)sprintf("%.2f",$this->orderTotalMoney * (float)$set['contribution_bonus_ratio'] / 100);
|
||
if($this->bonusTotalMoney <= 0) {
|
||
\Log::debug("分红总金额为0",\YunShop::app()->uniacid);
|
||
return false;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
/**
|
||
* Common: 贡献分享分红 - 处理每个站点所有用户的分红
|
||
* Author: wu-hui
|
||
* Time: 2023/11/03 15:09
|
||
* @param $set
|
||
* @param $startTime
|
||
* @param $endTime
|
||
* @return false|void
|
||
*/
|
||
private function bonusHandle($set,$startTime,$endTime){
|
||
// 获取贡献值信息(截止昨天24时)
|
||
$userList = ContributionLog::getAllList($endTime);
|
||
$totalContribution = (float)array_sum($userList);
|
||
if($totalContribution <= 0){
|
||
\Log::debug("不存在分红用户或截至当前周期结束时间总共的贡献值为0",\YunShop::app()->uniacid);
|
||
return false;
|
||
}
|
||
// 记录周期分红信息
|
||
$culturalSpaceContributionBonusId = ContributionBonus::insertGetId([
|
||
'uniacid' => \YunShop::app()->uniacid,
|
||
'order_total_money' => $this->orderTotalMoney,
|
||
'contribution_bonus_ratio' => (float)$set['contribution_bonus_ratio'],
|
||
'total_money' => $this->bonusTotalMoney,
|
||
'start_time' => $startTime,
|
||
'end_time' => $endTime,
|
||
'created_at' => time(),
|
||
]);
|
||
// 循环处理所有用户
|
||
$logInsertData = [];// 明细记录
|
||
$time = time();
|
||
$uniacid = \YunShop::app()->uniacid;
|
||
$oneLvPeople = (int)$set['one_lv_people'];
|
||
foreach($userList as $userId => $contributionValue){
|
||
// 判断:当前用户是否符合领取条件 直推多少人
|
||
if($oneLvPeople > 0){
|
||
$userNum = (int)MemberChildren::getTeamModel($userId,1)->count();
|
||
if($userNum < $oneLvPeople){
|
||
// 当前直推人数 小于 条件人数;不符合条件
|
||
continue;
|
||
}
|
||
}
|
||
// 添加贡献分享分红信息记录 这里必须进行100的偏移计算
|
||
$radio = (float)sprintf("%.2f",$contributionValue / $totalContribution * 100);// 佣金比例
|
||
$money = (float)sprintf("%.2f",$this->bonusTotalMoney * $radio / 100);// 实际获得佣金
|
||
if($money > 0){
|
||
$logInsertData[] = [
|
||
'uniacid' => $uniacid,
|
||
'uid' => $userId,
|
||
'total_money' => $this->bonusTotalMoney,
|
||
'money' => $money,
|
||
'total_contribution' => $totalContribution,
|
||
'hold_contribution' => $contributionValue,
|
||
'proportion' => $radio,
|
||
'cultural_space_contribution_bonus_id' => $culturalSpaceContributionBonusId,
|
||
'created_at' => $time,
|
||
];
|
||
}
|
||
}
|
||
|
||
self::insert($logInsertData);
|
||
}
|
||
/**
|
||
* Common: 贡献分享分红 - 结算
|
||
* Author: wu-hui
|
||
* Time: 2023/11/03 15:24
|
||
*/
|
||
public function contributionBonusSettlement(){
|
||
set_time_limit(0);
|
||
DB::beginTransaction();
|
||
try{
|
||
// 循环平台 进行处理
|
||
$uniAccount = UniAccount::getEnable() ?: [];
|
||
foreach ($uniAccount as $u) {
|
||
Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid;
|
||
// 获取未结算列表
|
||
$list = self::uniacid()
|
||
->select(['id','uid','money'])
|
||
->where('is_settlement',0)
|
||
->get()
|
||
->toArray();
|
||
if($list){
|
||
// 循环处理数据
|
||
$incomeData = [];
|
||
foreach($list as $item){
|
||
$incomeData[] = [
|
||
'uniacid' => \YunShop::app()->uniacid,
|
||
'member_id' => $item['uid'],
|
||
'amount' => $item['money'],
|
||
'detail' => '',
|
||
'dividend_table_id' => $item['id'],
|
||
'dividend_code' => IncomeService::CULTURAL_SPACE_CONTRIBUTION_BONUS,
|
||
'order_sn' => '',
|
||
];
|
||
}
|
||
IncomeService::insertIncome($incomeData);
|
||
// 修改为已经结算
|
||
$ids = array_column($list,'id');
|
||
self::whereIn('id',$ids)->update([
|
||
'is_settlement' => 1
|
||
]);
|
||
}
|
||
}
|
||
DB::commit();
|
||
}catch(\Exception $e){
|
||
\Log::debug('--- 文创空间 - 贡献分享分红结算 - 错误:'.$e->getMessage());
|
||
DB::rollBack();
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* Common: 一对一关联 用户信息
|
||
* Author: wu-hui
|
||
* Time: 2023/11/03 15:50
|
||
* @return \Illuminate\Database\Eloquent\Relations\HasOne
|
||
*/
|
||
public function member(){
|
||
return $this->hasOne(Member::class,'uid','uid');
|
||
}
|
||
}
|