AreaBase.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <?php
  2. namespace addons\Area\common\logic\reward;
  3. use addons\Area\common\enums\AreaEnum;
  4. use addons\Area\common\models\AreaAgent;
  5. use addons\Area\common\models\AreaCumulativeRewardLog;
  6. use common\enums\StatusEnum;
  7. use common\models\user\UserDigital;
  8. use common\models\user\UserPartitionRelationship;
  9. use services\common\UserWalletService;
  10. abstract class AreaBase
  11. {
  12. public $mall_id;
  13. public $user_id;
  14. public $basic_conf;
  15. public $name = '';//佣金:commission;积分:score
  16. public function __construct($mall_id, $user_id, $basic_conf, $name = 'commission')
  17. {
  18. $this->mall_id = $mall_id;
  19. $this->name = $name;
  20. $this->user_id = $user_id;
  21. $this->basic_conf = $basic_conf;
  22. }
  23. public function addFrozenCommission($level, &$last_level, $address_id)
  24. {
  25. //地区id = 0,不进行分红
  26. if ($address_id <= 0) return 0;
  27. //查询镇一级的区域代理
  28. $area_agent_list = AreaAgent::getAreaAgentByLevel($level, $address_id, $this->mall_id);
  29. $config = $this->getLevelConfig();
  30. if (!empty($area_agent_list)) {
  31. $team_prize_list = $equal_prize_list = [];
  32. ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules();
  33. $area_agent_num = count($area_agent_list);
  34. $area_agent_prize = self::computing($config, $money, 'team', $area_agent_num, $level, $last_level, $multiple);
  35. $equal_area_agent_prize = self::computing($config, $money, 'equal', 0, $level, 0, $multiple, $area_agent_prize);
  36. $equal_agent_list = [];
  37. foreach ($area_agent_list as $area_agent) {
  38. //默认分红
  39. if ($area_agent_prize > 0) {
  40. $team_prize_list[$area_agent->user_id] = ['price' => $area_agent_prize, 'user_id' => $area_agent['user_id'], 'level' => $level];
  41. $last_level = $level;
  42. }
  43. //平级奖
  44. if (!empty($equal_area_agent_prize)) {
  45. $parent_id_arr = UserPartitionRelationship::getParentIdArr($area_agent->user_id);
  46. $parent_agent_list = AreaAgent::lists(['where' => [['user_id' => $parent_id_arr], ['level' => $level], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id']);
  47. $parent_id_arr = array_reverse($parent_id_arr);
  48. $parent_agent_list_new = [];
  49. foreach ($parent_id_arr as $user_id) {
  50. if (isset($parent_agent_list[$user_id])) {
  51. $parent_agent_list_new[] = $parent_agent_list[$user_id];
  52. }
  53. }
  54. if (!empty($parent_agent_list_new)) {
  55. $equal_prize_deep = 0;
  56. $equal_prize_max_deep = $this->basic_conf['equal_prize_deep'];
  57. foreach ($parent_agent_list_new as $equal_area_agent) {
  58. if ($equal_prize_deep >= $equal_prize_max_deep) break;
  59. if(!empty($this->basic_conf['is_equal'])) {
  60. $equal_agent_list[$equal_prize_deep][$equal_area_agent['user_id']] = $equal_area_agent;
  61. }else{
  62. $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];
  63. }
  64. $equal_prize_deep++;
  65. }
  66. }
  67. }
  68. }
  69. if(!empty($equal_agent_list)){
  70. foreach ($equal_agent_list as $equal_prize_deep=>$equal_agent_arr){
  71. $equal_prize_num = count($equal_agent_arr);
  72. $equal_area_agent_prize_temp = bcdiv($equal_area_agent_prize,$equal_prize_num,2);
  73. foreach ($equal_agent_arr as $user_id=>$equal_area_agent) {
  74. $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];
  75. }
  76. }
  77. }
  78. $money = 0;
  79. try {
  80. //投递到资产队列
  81. $insert_wallet = $this->getInsertWalletData($team_prize_list, $equal_prize_list);
  82. if (!empty($insert_wallet)) {
  83. if($this->name != 'digital'){
  84. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  85. if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  86. }
  87. foreach ($insert_wallet as $k => $user) {
  88. if($user['capital_type']=='equal'){
  89. if(isset($user['extra1'])){
  90. switch ($level){
  91. case 1:
  92. $address_id = $user['extra1']['province_id']??0;
  93. break;
  94. case 2:
  95. $address_id = $user['extra1']['city_id']??0;
  96. break;
  97. case 3:
  98. $address_id = $user['extra1']['district_id']??0;
  99. break;
  100. case 4:
  101. $address_id = $user['extra1']['town_id']??0;
  102. break;
  103. case 5:
  104. $address_id = $user['extra1']['community_id']??0;
  105. break;
  106. case 6:
  107. $address_id = $user['extra1']['regional_id']??0;
  108. break;
  109. }
  110. }
  111. $agent = AreaAgent::getAreaAgentOneByLevel($user['user_id'], $level, $address_id, $this->mall_id);
  112. }else{
  113. $agent = AreaAgent::getAreaAgentOneByLevel($user['user_id'], $level, $address_id, $this->mall_id);
  114. }
  115. if($user['wallet_type'] == 'digital'){
  116. $res = UserDigital::handleUserDigital($user['mall_id'],$user['user_id'],$user['money'],$user['is_frozen'],$user);
  117. if($res === false) continue;
  118. }
  119. if (empty($agent)) continue;
  120. $field = 'total_' . $this->name;
  121. $agent->$field += $user['money'];
  122. $money += $user['money'];
  123. $res = $agent->save();
  124. if (empty($res)) throw new \Exception($agent->getErrorMessage());
  125. // 记录佣金累计
  126. AreaCumulativeRewardLog::setData([
  127. 'mall_id' => $this->mall_id,
  128. 'source_table' => $user['source_table'],
  129. 'source_table_id' => $user['source_table_id'],
  130. 'wallet_type' => $this->name,
  131. 'change_num' => $user['money'],
  132. 'agent_id' => $agent->id,
  133. 'user_id' => $agent->user_id,
  134. 'level' => $agent->level,
  135. 'agent_area' => $agent[AreaAgent::LEVEL_FIELD_MAP[$agent->level]] ?? 0,
  136. 'reward_type' => $user['capital_type'],
  137. ]);
  138. }
  139. }
  140. return $money;
  141. } catch (\Exception $e) {
  142. echo 'AreaBase:addFrozenCommission' . $e->getMessage();
  143. return 0;
  144. }
  145. }
  146. }
  147. /**
  148. * @desc:计算
  149. * @Author: hua
  150. * @Date: 2022/1/21
  151. * @Time: 17:13
  152. * @Copyright: copyright (c) 2021 广东七件事集团
  153. * @param $config
  154. * @param $money
  155. * @param $type
  156. * @param $agent_num
  157. * @param $level
  158. * @param $last_level
  159. * @param int $multiple
  160. * @param int $parent_commission
  161. * @return float|int
  162. */
  163. public function computing($config, $money, $type, $agent_num, $level, $last_level, $multiple = 1, $parent_commission = 0)
  164. {
  165. $is_percent_key = "is_percent_{$type}";
  166. $prize = self::getPrizeByLevel($config, $level, $type);
  167. if (empty($prize)) return 0;
  168. if ($type == 'team' && !empty($this->basic_conf['is_level'])) {
  169. //走级差
  170. $last_price = $last_level === 0 ? 0 : self::getPrizeByLevel($config, $last_level, $type);
  171. $prize -= $last_price;
  172. }
  173. if ($type == 'equal' && $this->basic_conf['equal_compute_type'] == 2) $money = $parent_commission;
  174. $commission = empty($config[$is_percent_key]) == 0 ? $multiple * $prize : $multiple*$money * $prize / 100;
  175. // 平分
  176. if ($type == 'team' && !empty($this->basic_conf['is_equal'])) {
  177. if ($agent_num == 0) return 0;
  178. $commission /= $agent_num;
  179. }
  180. $commission = bcmul($commission, 1,2);
  181. return $commission;
  182. }
  183. /**
  184. * @desc:获取对应等级的奖励值
  185. * @Author: hua
  186. * @Date: 2022/1/21
  187. * @Time: 16:57
  188. * @Copyright: copyright (c) 2021 广东七件事集团
  189. * @param $config
  190. * @param $level
  191. * @param $type
  192. * @return int|mixed
  193. */
  194. public static function getPrizeByLevel($config, $level, $type)
  195. {
  196. switch ($level) {
  197. case AreaEnum::PROVINCE:
  198. $prize_key = "province_{$type}_prize";
  199. break;
  200. case AreaEnum::CITY:
  201. $prize_key = "city_{$type}_prize";
  202. break;
  203. case AreaEnum::DISTRICT:
  204. $prize_key = "district_{$type}_prize";
  205. break;
  206. case AreaEnum::TOWN:
  207. $prize_key = "town_{$type}_prize";
  208. break;
  209. case AreaEnum::COMMUNITY:
  210. $prize_key = "community_{$type}_prize";
  211. break;
  212. case AreaEnum::REGIONAL:
  213. $prize_key = "regional_{$type}_prize";
  214. break;
  215. }
  216. if (empty($config[$prize_key])) return 0;
  217. return $config[$prize_key];
  218. }
  219. abstract public function getLevelConfig();
  220. abstract public function getRules();
  221. abstract public function getInsertWalletData($team_prize_list, $equal_prize_list);
  222. }