mall_id = $mall_id; $this->name = $name; $this->user_id = $user_id; $this->basic_conf = $basic_conf; } 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)) { $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); $equal_agent_list = []; foreach ($area_agent_list as $area_agent) { //默认分红 if ($area_agent_prize > 0) { $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']; foreach ($parent_agent_list_new as $equal_area_agent) { if ($equal_prize_deep >= $equal_prize_max_deep) break; if(!empty($this->basic_conf['is_equal'])) { $equal_agent_list[$equal_prize_deep][$equal_area_agent['user_id']] = $equal_area_agent; }else{ $equal_prize_list[] = ['price' => $equal_area_agent_prize,'equal_prize_deep'=>$equal_prize_deep, 'user_id' => $equal_area_agent['user_id'], 'level' => $level,'equal_area_agent'=>$equal_area_agent]; } $equal_prize_deep++; } } } } if(!empty($equal_agent_list)){ foreach ($equal_agent_list as $equal_prize_deep=>$equal_agent_arr){ $equal_prize_num = count($equal_agent_arr); $equal_area_agent_prize_temp = bcdiv($equal_area_agent_prize,$equal_prize_num,2); foreach ($equal_agent_arr as $user_id=>$equal_area_agent) { $equal_prize_list[] = ['price' => $equal_area_agent_prize_temp,'equal_prize_deep'=>$equal_prize_deep+1, 'user_id' => $user_id, 'level' => $level,'equal_area_agent'=>$equal_area_agent]; } } } $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['capital_type']=='equal'){ if(isset($user['extra1'])){ switch ($level){ case 1: $address_id = $user['extra1']['province_id']??0; break; case 2: $address_id = $user['extra1']['city_id']??0; break; case 3: $address_id = $user['extra1']['district_id']??0; break; case 4: $address_id = $user['extra1']['town_id']??0; break; case 5: $address_id = $user['extra1']['community_id']??0; break; case 6: $address_id = $user['extra1']['regional_id']??0; break; } } $agent = AreaAgent::getAreaAgentOneByLevel($user['user_id'], $level, $address_id, $this->mall_id); }else{ $agent = AreaAgent::getAreaAgentOneByLevel($user['user_id'], $level, $address_id, $this->mall_id); } if($user['wallet_type'] == 'digital'){ $res = UserDigital::handleUserDigital($user['mall_id'],$user['user_id'],$user['money'],$user['is_frozen'],$user); if($res === false) continue; } 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()); // 记录佣金累计 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 float|int */ 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 0; 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 : $multiple*$money * $prize / 100; // 平分 if ($type == 'team' && !empty($this->basic_conf['is_equal'])) { if ($agent_num == 0) return 0; $commission /= $agent_num; } $commission = bcmul($commission, 1,2); return $commission; } /** * @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]; } abstract public function getLevelConfig(); abstract public function getRules(); abstract public function getInsertWalletData($team_prize_list, $equal_prize_list); }