'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'); } }