| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- <?php
- namespace addons\Area\common\logic\reward;
- use addons\Area\common\enums\AreaEnum;
- use addons\Area\common\models\AreaAgent;
- use addons\Area\common\models\AreaCumulativeRewardLog;
- use common\enums\StatusEnum;
- use common\models\user\UserDigital;
- use common\models\user\UserPartitionRelationship;
- use services\common\UserWalletService;
- abstract class AreaBase
- {
- public $mall_id;
- public $user_id;
- public $basic_conf;
- public $name = '';//佣金:commission;积分:score
- public function __construct($mall_id, $user_id, $basic_conf, $name = 'commission')
- {
- $this->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);
- }
|