0) $where[] = ['uid','=',$search['uid']]; // 列表获取 $model = self::uniacid() ->select($field) ->where($where) ->when(!empty($search['nickname']),function($query) use ($search){ // 合伙人 昵称|真实姓名搜索 $ids = Member::where('nickname','like',"%{$search['nickname']}%") ->orwhere('realname','like',"%{$search['nickname']}%") ->pluck('uid'); if($ids) $ids = $ids->toArray(); $query->whereIn('uid',(array)$ids); }) ->with([ 'member' => function($query){ $query->select(['uid','nickname','realname','avatar']); } ]) ->withCount(['record as sum_amount'=>function($query){ $query->select(DB::raw("sum(money) as sum_amount")); },'record as sum_total_money'=>function($query){ $query->select(DB::raw("sum(total_money) as sum_total_money")); }]) ->orderBy('created_at','DESC') ->orderBy('id','DESC'); $list = $model->paginate($pageSize); return $list ? $list->toArray() : []; } /** * Common: 店长信息统计 - 初始化 * Author: wu-hui * Time: 2023/09/18 14:46 */ public function infoStatistics(){ set_time_limit(0); try{ // 循环平台 进行处理 $uniAccount = UniAccount::getEnable() ?: []; foreach ($uniAccount as $u) { Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid; $set = Setting::get('plugin.team_dividend'); $isRun = (boolean)$this->isRun($set); // 判断:允许下一步 开启店长 店补比例大于0 if ($isRun && (int)$set['store_manager_switch'] == 1 && (float)$set['store_manager_proportion'] > 0) { \Log::debug('--- 经销商 - 店长统计 - 满足条件,开始处理:'.$u->uniacid); $this->infoStatisticsHandle($set); } else { \Log::debug('--- 经销商 - 店长统计 - 不满足条件:'.$u->uniacid); } } }catch(\Exception $e){ \Log::debug('--- 经销商 - 店长统计 - 错误:'.$e->getMessage()); } } /** * Common: 店长信息统计 - 判断是否允许执行统计 * Author: wu-hui * Time: 2023/09/18 14:26 * @param $set * @return bool */ public function isRun($set){ // 最后执行时间 如果没有最后执行时间则直接返回true $endTime = StoreManagerRecordModel::uniacid()->max('end_time'); if($endTime <= 0) return true; // 最后执行时间存在 判断:最后执行时间 + 一个周期 < 当前时间 $lastRunTime = strtotime(date("Y-m-d H:i:s",$endTime). " +1 month"); if($set['store_manager_cycle'] == 'yesterday') $lastRunTime = strtotime(date("Y-m-d H:i:s",$endTime). " +1 day"); else if($set['store_manager_cycle'] == 'last_week') $lastRunTime = strtotime(date("Y-m-d H:i:s",$endTime). " +1 week"); // 当前时间 大于 下一个周期执行时间 允许执行,否则不允许 return time() > $lastRunTime; } /** * Common: 店长信息统计 - 开始处理 * Author: wu-hui * Time: 2023/09/18 14:03 * @param $set */ public function infoStatisticsHandle($set){ // 获取所有店长 $storeManagerList = self::uniacid() ->select(['id','uid']) ->where('status',1) ->orderBy('id','DESC') ->get(); if(!$storeManagerList){ \Log::debug('--- 经销商 - 店长统计 - 没有店长信息'); return; } // 订单查询条件 $storeManagerCycle = $set['store_manager_cycle'] ?? 'last_month'; [$startTime,$endTime] = getTimeStamp($storeManagerCycle); $where = [ ['yz_order.pay_time','>=',$startTime], ['yz_order.pay_time','<',$endTime], ['yz_order_goods.payment_amount','>',0],// 实际支付金额必须大于0 ]; // 循环处理店长 $storeIds = array_column($storeManagerList->toArray(),'uid'); $insertData = []; $time = time(); foreach($storeManagerList as $storeInfo){ // 获取全部有效下级 $validChild = $this->getValidChild($storeInfo->uid,$storeIds); $validChild[] = $storeInfo->uid;// 包括本人 // 获取团队全部订单,这里以订单商品的实际支付价格算;统计已支付-待发货,已支付-待收货,已完成订单 $totalMoney = (float)OrderGoods::uniacid() ->join('yz_order', 'yz_order_goods.order_id', '=','yz_order.id') ->where($where) ->whereIn('yz_order.status',[Order::WAIT_SEND,Order::WAIT_RECEIVE,Order::COMPLETE]) ->whereIn('yz_order.uid',$validChild) ->sum('yz_order_goods.payment_amount'); $insertData[] = [ 'uniacid' => \YunShop::app()->uniacid, 'uid' => $storeInfo->uid, 'total_money' => $totalMoney, 'money' => sprintf("%.2f",$totalMoney * (float)$set['store_manager_proportion'] / 100), 'proportion' => (float)$set['store_manager_proportion'], 'start_time' => $startTime, 'end_time' => $endTime, 'created_at' => $time, ]; } // 添加记录 StoreManagerRecordModel::insert($insertData); return; } /** * Common: 店长信息统计 - 获取店长全部有效下级(去除店长及其团队的全部下级) * Author: wu-hui * Time: 2023/09/18 13:34 * @param $uid * @param $storeIds * @return array */ public function getValidChild($uid,$storeIds){ $allChild = MemberChild::uniacid()->where('member_id',$uid)->pluck('child_id')->toArray(); $diff = array_values(array_intersect($allChild,$storeIds));// 获取交集 判断下级中是否存在店长 if(count($diff) > 0){ // 下级中存在店长 进行处理,剔除所有店长及其团队成员 $subAllChild = MemberChild::uniacid()->whereIn('member_id',$diff)->pluck('child_id')->toArray(); $delIds = array_values(array_merge($diff,$subAllChild)); $allChild = array_diff($allChild,$delIds); } return $allChild; } /** * Common: 店长结算 * Author: wu-hui * Time: 2023/09/21 17:27 */ public function settlement(){ set_time_limit(0); try{ // 循环平台 进行处理 $uniAccount = UniAccount::getEnable() ?: []; foreach ($uniAccount as $u) { Setting::$uniqueAccountId = \YunShop::app()->uniacid = $u->uniacid; // 获取未结算列表 $list = StoreManagerRecordModel::uniacid() ->select(['id','uid','total_money','money','proportion']) ->where('is_settlement',0) ->get(); if($list){ $list = $list->toArray(); $this->settlementHandle($list); // 修改为已经结算 $ids = array_column($list,'id'); StoreManagerRecordModel::whereIn('id',$ids)->update([ 'is_settlement' => 1 ]); } } }catch(\Exception $e){ \Log::debug('--- 经销商 - 店长结算 - 错误:'.$e->getMessage()); } } /** * Common: 店长结算 - 处理结算信息 * Author: wu-hui * Time: 2023/09/21 17:23 * @param $list */ public function settlementHandle($list){ $incomeData = []; foreach($list as $item){ if((float)$item['money'] > 0){ $incomeData[] = [ 'uniacid' => \YunShop::app()->uniacid, 'member_id' => $item['uid'], 'amount' => $item['money'], 'detail' => '', 'dividend_table_id' => $item['id'], 'dividend_code' => IncomeService::STORE_MANAGER, 'order_sn' => '', ]; } } IncomeService::insertIncome($incomeData); } /** * Common: 一对一关联 - 用户信息表 * Author: wu-hui * Time: 2023/09/15 17:43 * @return \Illuminate\Database\Eloquent\Relations\HasOne */ public function member(){ return $this->hasOne(Member::class, 'uid', 'uid'); } /** * Common: 一对一关联 - 店长统计记录 * Author: wu-hui * Time: 2023/09/18 15:03 * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function record(){ return $this->hasMany(StoreManagerRecordModel::class, 'uid', 'uid'); } }