mall_id = $mall_id; $this->name = $name; $this->user_id = $user_id; $this->basic_conf = $basic_conf; $this->order = $order; $this->order_detail = $order_detail; } public function addFrozenCommission($level, &$last_level, $address_id) { //地区id = 0,不进行分红 if($address_id <=0 ) return 0; //查询镇一级的区域代理 $area_agent_list = AreaAgent::getAreaAgentByLevel($level, $address_id, $this->mall_id); $config = $this->getLevelConfig(); if (!empty($area_agent_list)) { foreach ($area_agent_list as $key => $item) { if (!$this->valid($item)) unset($area_agent_list[$key]); } // 过滤后是否还有能拿的 if (empty($area_agent_list)) return 0; $team_prize_list = $equal_prize_list = []; ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules(); $area_agent_num = count($area_agent_list); $area_agent_prize = self::computing($config, $money, 'team', $area_agent_num, $level, $last_level, $multiple); $equal_area_agent_prize = self::computing($config, $money, 'equal', 0, $level, 0, $multiple, $area_agent_prize); foreach ($area_agent_list as $area_agent) { //默认分红 if (!empty($area_agent_prize)) { $team_prize_list[$area_agent->user_id] = ['price' => $area_agent_prize, 'user_id' => $area_agent['user_id'], 'level' => $level]; $last_level = $level; } //平级奖 if (!empty($equal_area_agent_prize)) { $parent_id_arr = UserPartitionRelationship::getParentIdArr($area_agent->user_id); $parent_agent_list = AreaAgent::lists(['where' => [['user_id' => $parent_id_arr], ['level' => $level],['status'=>StatusEnum::ENABLED]],'index'=>'user_id']); $parent_id_arr = array_reverse($parent_id_arr); $parent_agent_list_new = []; foreach ($parent_id_arr as $user_id){ if(isset($parent_agent_list[$user_id])){ $parent_agent_list_new[]=$parent_agent_list[$user_id]; } } if (!empty($parent_agent_list_new)) { $equal_prize_deep = 0; $equal_prize_max_deep = $this->basic_conf['equal_prize_deep']; $equal_prize_deep_temp = 0; if(!empty($this->basic_conf['equal_reward_is_equal'])){ foreach ($parent_agent_list_new as $equal_area_agent) { if ($equal_prize_deep_temp >= $equal_prize_max_deep) break; $equal_prize_deep_temp++; } if($equal_prize_deep_temp>0){ $equal_area_agent_prize = bcdiv($equal_area_agent_prize,$equal_prize_deep_temp,2); } } foreach ($parent_agent_list_new as $equal_area_agent) { if ($equal_prize_deep >= $equal_prize_max_deep) break; $equal_prize_list[] = ['price' => $equal_area_agent_prize, 'user_id' => $equal_area_agent['user_id'], 'level' => $level]; $equal_prize_deep++; } } } } $money = 0; try { //投递到资产队列 $insert_wallet = $this->getInsertWalletData($team_prize_list, $equal_prize_list); if (!empty($insert_wallet)) { if($this->name != 'digital') { $res = UserWalletService::batchHandleByQueue($insert_wallet); if (empty($res)) throw new \Exception(UserWalletService::getStaticError()); } foreach ($insert_wallet as $k => $user) { if($user['wallet_type'] == 'digital'){ $res = UserDigital::handleUserDigital($user['mall_id'],$user['user_id'],$user['money'],$user['is_frozen'],$user); if($res === false) continue; } $agent = AreaAgent::getAreaAgentOneByLevel($user['user_id'],$level, $address_id, $this->mall_id); if(empty($agent)) continue; $field = 'total_' . $this->name; $agent->$field += $user['money']; $money+=$user['money']; $res = $agent->save(); if (empty($res)) throw new \Exception($agent->getErrorMessage()); // 这里做处理 AreaCommissionLog::setData($user, $this->order_detail, $user['___is_fixed___'], $user['___rate___'], $level); // 记录佣金累计 AreaCumulativeRewardLog::setData([ 'mall_id' => $this->mall_id, 'source_table' => $user['source_table'], 'source_table_id' => $user['source_table_id'], 'wallet_type' => $this->name, 'change_num' => $user['money'], 'agent_id' => $agent->id, 'user_id' => $agent->user_id, 'level' => $agent->level, 'agent_area' => $agent[AreaAgent::LEVEL_FIELD_MAP[$agent->level]] ?? 0, 'reward_type' => $user['capital_type'], ]); } } return $money; } catch (\Exception $e) { echo 'AreaBase:addFrozenCommission' . $e->getMessage(); return 0; } } } /** * @desc:计算 * @Author: hua * @Date: 2022/1/21 * @Time: 17:13 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $config * @param $money * @param $type * @param $agent_num * @param $level * @param $last_level * @param int $multiple * @param int $parent_commission * @return array */ public function computing($config, $money, $type, $agent_num, $level, $last_level, $multiple = 1, $parent_commission = 0) { $is_percent_key = "is_percent_{$type}"; $prize = self::getPrizeByLevel($config, $level, $type); if (empty($prize)) return []; if ($type == 'team' && !empty($this->basic_conf['is_level'])) { //走级差 $last_price = $last_level === 0 ? 0 : self::getPrizeByLevel($config, $last_level, $type); $prize -= $last_price; } if ($type == 'equal' && $this->basic_conf['equal_compute_type'] == 2) $money = $parent_commission; $commission = empty($config[$is_percent_key]) == 0 ? $multiple * $prize : $money * $prize / 100; // 平分 if ($type == 'team' && !empty($this->basic_conf['is_equal'])) { if ($agent_num == 0) return []; $commission /= $agent_num; } $commission = bcmul($commission, 1,2); return ['commission' => $commission, 'is_fixed' => !empty($config[$is_percent_key]) ? StatusEnum::ENABLED : StatusEnum::DISABLED, 'rate' => $prize]; } /** * @desc:获取对应等级的奖励值 * @Author: hua * @Date: 2022/1/21 * @Time: 16:57 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $config * @param $level * @param $type * @return int|mixed */ public static function getPrizeByLevel($config, $level, $type) { switch ($level) { case AreaEnum::PROVINCE: $prize_key = "province_{$type}_prize"; break; case AreaEnum::CITY: $prize_key = "city_{$type}_prize"; break; case AreaEnum::DISTRICT: $prize_key = "district_{$type}_prize"; break; case AreaEnum::TOWN: $prize_key = "town_{$type}_prize"; break; case AreaEnum::COMMUNITY: $prize_key = "community_{$type}_prize"; break; case AreaEnum::REGIONAL: $prize_key = "regional_{$type}_prize"; break; } if (empty($config[$prize_key])) return 0; return $config[$prize_key]; } /** * @param AreaAgent $agent * @return mixed|true|null */ public function valid(AreaAgent $agent) { // 当前用户有无分佣权限 if ($agent->is_enable_dividend == StatusEnum::DISABLED) return false; // 当前用户是否有当前商品的分佣权限 if ($this->basic_conf['only_dividend_goods_type'] == StatusEnum::DISABLED && !AreaGoods::existByAgentIdAndGoodsId($agent->mall_id, $agent->id, $this->order_detail['goods_id'])) return false; // 当前用户是否与当前买家在同一关系链中 - 上级/下级 // 上级 $parent_id_arr = UserPartitionRelationship::getParentIdArr($this->user_id); if (!empty($parent_id_arr) && in_array($agent->user_id, $parent_id_arr)) return false; // 下级 $child_id_arr = UserPartitionRelationship::getChildIdArr($this->user_id); if (!empty($child_id_arr) && in_array($agent->user_id, $child_id_arr)) return false; return true; } abstract public function getLevelConfig(); abstract public function getRules(); abstract public function getInsertWalletData($team_prize_list, $equal_prize_list); }