AgentBase.php 52 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974
  1. <?php
  2. namespace addons\Agent\common\logic\reward;
  3. use addons\Agent\common\enums\AgentEnum;
  4. use addons\Agent\common\enums\ComputingEnum;
  5. use addons\Agent\common\models\Agent;
  6. use addons\Agent\common\models\AgentLevel;
  7. use addons\Agent\common\models\AgentSupplierOrder;
  8. use addons\PointUpperLimit\common\service\ScoreLogService;
  9. use common\enums\AddonsEnum;
  10. use common\enums\OrderStatusEnum;
  11. use common\enums\RabbitMqEnum;
  12. use common\enums\StatusEnum;
  13. use common\helpers\FormatHelper;
  14. use common\helpers\TaskHelper;
  15. use common\models\order\OrderDetail;
  16. use common\models\user\User;
  17. use common\models\user\UserDigital;
  18. use common\models\user\UserPartitionRelationship;
  19. use PhpAmqpLib\Message\AMQPMessage;
  20. use services\common\UserWalletService;
  21. abstract class AgentBase
  22. {
  23. public $mall_id;
  24. public $user_id;
  25. public $basic_conf;
  26. public $agent_list = [];
  27. public $name = '';//佣金:commission;积分:score
  28. public $team_prize_agents = [];
  29. public $self_buy_user_id;
  30. public $repurchase_reward;
  31. public $regular_bonus_handle_class = '\addons\RegularBonus\common\services\CommissionService';
  32. /** @var \addons\RegularBonus\common\services\CommissionService|null $regular_bonus_handle_instance */
  33. public $regular_bonus_handle_instance;
  34. public $is_enable_regular_bonus = 0;
  35. public $regular_bonus_goods_setting = [];
  36. public $user_level = null; // 购买者等级
  37. /**
  38. * 是否为额外积分
  39. * @var bool
  40. */
  41. public $is_additional_score = false;
  42. /**
  43. * 额外积分与积分映射
  44. * @var string[]
  45. */
  46. protected $commission_name_map = [
  47. 'additional_score' => 'score'
  48. ];
  49. public $insert_wallet = [];
  50. public function __construct($mall_id, $user_id, $basic_conf, $agent_list, $self_buy_user_id, $repurchase_reward = StatusEnum::DISABLED, $name = 'commission')
  51. {
  52. $this->mall_id = $mall_id;
  53. // 如果是额外积分
  54. if ($name == 'additional_score') {
  55. $this->is_additional_score = true;
  56. // $name = 'score';
  57. }
  58. $this->name = $name;
  59. $this->user_id = $user_id;
  60. $this->basic_conf = $basic_conf;
  61. $this->agent_list = $agent_list;
  62. $this->self_buy_user_id = $self_buy_user_id;
  63. $this->repurchase_reward = $repurchase_reward;
  64. }
  65. public function addFrozenCommission()
  66. {
  67. // 验证
  68. $config = $this->getLevelConfig();
  69. $regular_bonus_setting = $this->regular_bonus_goods_setting;
  70. if (!isset($this->basic_conf['is_self_buy'])) $this->basic_conf['is_self_buy'] = 0;
  71. // if (!isset($this->basic_conf['enable_goods_deduct'])) $this->basic_conf['enable_goods_deduct'] = 0;
  72. if (!isset($this->basic_conf['team_prize_deep'])) $this->basic_conf['team_prize_deep'] = 0;
  73. if (!isset($this->basic_conf['equal_prize_deep'])) $this->basic_conf['equal_prize_deep'] = 0;
  74. if (!isset($this->basic_conf['equal_settle_type'])) $this->basic_conf['equal_settle_type'] = 0;
  75. if (!isset($this->basic_conf['calculation_basis'])) $this->basic_conf['calculation_basis'] = 0;
  76. if (!isset($this->basic_conf['over_settle_type'])) $this->basic_conf['over_settle_type'] = 0;
  77. if (!isset($this->basic_conf['over_calculation_basis'])) $this->basic_conf['over_calculation_basis'] = 0;
  78. if (!isset($this->basic_conf['is_find_equal_parent'])) $this->basic_conf['is_find_equal_parent'] = 0;
  79. if (!isset($this->basic_conf['enable_goods_deduct'])) $this->basic_conf['enable_goods_deduct'] = 0;
  80. if (!isset($this->basic_conf['find_a_level'])) $this->basic_conf['find_a_level'] = 0;
  81. if (!isset($this->basic_conf['alone_equal_settle_type'])) $this->basic_conf['alone_equal_settle_type'] = 0;
  82. if (!isset($this->basic_conf['is_enable_diff_bonus'])) $this->basic_conf['is_enable_diff_bonus'] = 0;
  83. if (!isset($this->basic_conf['is_equal_by_upgrade'])) $this->basic_conf['is_equal_by_upgrade'] = 0;
  84. ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules();
  85. // 所有经销商数量
  86. $all_agent_num = count($this->agent_list);
  87. $user_id_arr = [];
  88. // 初始化渠道奖代理
  89. if (empty($this->team_prize_agents)) {
  90. $current_agent_level = 0;
  91. foreach ($this->agent_list as $key => $agent) {
  92. $user_id_arr[] = $agent->user_id;
  93. if ($agent->level > $current_agent_level) {
  94. $this->team_prize_agents[$key] = $agent;
  95. $current_agent_level = $agent->level;
  96. }
  97. }
  98. }
  99. $parents_list = User::lists(['where' => [['in','id', $user_id_arr]], 'select' => 'id, parent_id', 'index' => 'id']);
  100. if (!empty($this->basic_conf['is_extra_equal_prize'])) {
  101. $user_ids = array_column($this->agent_list, 'user_id');
  102. $user_list = User::lists(['where' => [['id' => $user_ids]], 'select' => 'id,parent_id,second_parent_id', 'index' => 'id']);
  103. }
  104. $team_prize_num = 0;
  105. $team_prize_list = [];
  106. $log_total_price = 0;
  107. $regular_team_prize_num = 0;
  108. $regular_team_prize_list = [];
  109. $regular_log_total_price = 0;
  110. $drainage_subsidy_num = 0;
  111. $drainage_subsidy_prize_list = [];
  112. $log_total_price_drainage_subsidy = 0;
  113. $team_subsidy_num = 0;
  114. $team_subsidy_prize_list = [];
  115. $log_total_price_team_subsidy = 0;
  116. $extra_prize_list = [];
  117. $equal_prize_list = [];
  118. $over_prize_list = [];
  119. $regular_bonus_equal_prize_list = [];
  120. $regular_bonus_over_prize_list = [];
  121. $deduct_agent_prize_list = [];
  122. $equal_settle_type = 0;
  123. $province_id = $this->team_prize_agents[0]['province_id'] ?? 0;
  124. $recommend_prize = 0;
  125. $over_temp_money = $money;
  126. $over_reward_bear_user_id = 0;
  127. $is_exec_a_find = false;
  128. $is_level_a_find = false;
  129. $basic_money = $money;
  130. $over_temp_regular_bonus_money = $money;
  131. $has_over = false; // 是否产生了越级奖
  132. if (($agentListCount = count($this->agent_list)) >= 2) {
  133. $temp_team_prize = 0;
  134. $temp_prize_num = 0;
  135. $temp_total_price = 0;
  136. $temp_j = 0;
  137. foreach ($this->team_prize_agents as $row) {
  138. if ($temp_prize_num < $this->basic_conf['team_prize_deep']) {
  139. //计算渠道奖励
  140. if (isset($config[$row->level])) {
  141. $temp_team_prize = $this->computing($config[$row->level], $money, 'team');
  142. }
  143. switch ($this->basic_conf['over_calculation_basis']){
  144. case 0:
  145. // 是否开启平级奖独立计算方式
  146. if (isset($this->basic_conf['is_over_computing_method']) && $this->basic_conf['is_over_computing_method']) {
  147. $over_mothod = $this->basic_conf['over_computing_method'];
  148. ['money' => $over_money] = $this->getRules($over_mothod);
  149. $over_temp_money = $over_money;
  150. }
  151. break;
  152. case 1://上级渠道奖或级差
  153. if($temp_j==1) {
  154. $over_temp_money = bcsub($temp_team_prize, $temp_total_price, 2);
  155. $over_temp_regular_bonus_money = bcsub($temp_team_prize, $temp_total_price, 2);
  156. }
  157. break;
  158. case 2://下级渠道奖或级差
  159. if($temp_j==0){
  160. $over_temp_money = $temp_team_prize;
  161. $over_temp_regular_bonus_money = $temp_team_prize;
  162. }
  163. break;
  164. }
  165. if ($temp_team_prize > 0){
  166. $temp_prize_num++;
  167. $temp_total_price = bcadd($temp_total_price, $temp_team_prize, 2);
  168. }
  169. }
  170. switch ($this->basic_conf['over_settle_type']) {
  171. case 1:
  172. if($temp_j==1) {
  173. $over_reward_bear_user_id = $row->user_id;
  174. }
  175. break;
  176. case 2:
  177. if($temp_j==0) {
  178. $over_reward_bear_user_id = $row->user_id;
  179. }
  180. break;
  181. }
  182. $temp_j++;
  183. }
  184. //// 推荐人等级小于被推荐人,拿越级奖,只判断第一个拿渠道奖的上级是否会有越级奖
  185. if ($this->agent_list[0]->level >= $this->agent_list[1]->level) {
  186. // 循环找出可以拿越级奖的
  187. for ($agentListI = 1; $agentListI < $agentListCount; $agentListI++) {
  188. // 设置了平级奖跳过的等级则跳过平级奖继续做越级奖判断
  189. if (
  190. !empty($this->basic_conf['is_enable_to_buyer_equal']) &&
  191. !empty($this->basic_conf['skip_equal_level']) &&
  192. $this->agent_list[$agentListI]->level == $this->basic_conf['skip_equal_level'] &&
  193. $this->agent_list[$agentListI]->level == $this->agent_list[0]->level
  194. ) continue;
  195. if ($this->agent_list[$agentListI]->level >= $this->agent_list[0]->level) break;
  196. // 如果开启了越级奖跳过某个等级,并且满足了跳过这个等级的条件
  197. if (
  198. !empty($this->basic_conf['is_enable_skip_level']) &&
  199. isset($this->basic_conf['skip_level']) &&
  200. is_numeric($this->basic_conf['skip_level']) &&
  201. $this->agent_list[$agentListI]->level == $this->basic_conf['skip_level']
  202. ) continue;
  203. $over_agent = $this->agent_list[$agentListI]; break;
  204. }
  205. if (isset($over_agent)) {
  206. $has_over = true;
  207. $over_prize = $this->computing($config[$over_agent->level], $over_temp_money, 'over', $multiple);
  208. if ($over_prize > 0) {
  209. $over_prize_list[$over_agent->user_id] = ['price' => $over_prize, 'agent_id' => $over_agent->id, 'agent_level' => $over_agent->level];
  210. if(!empty($over_reward_bear_user_id)){
  211. if (!empty($deduct_agent_prize_list[$over_reward_bear_user_id]['deduct_money'])) {
  212. $deduct_agent_prize_list[$over_reward_bear_user_id]['deduct_money'] += $over_prize;
  213. } else {
  214. $deduct_agent_prize_list[$over_reward_bear_user_id]['deduct_money'] = $over_prize;
  215. }
  216. }
  217. }
  218. }
  219. }
  220. $regular_bonus_over_prize = 0;
  221. if (isset($regular_bonus_setting[$over_agent->level])) {
  222. $regular_bonus_over_prize = $this->computing($regular_bonus_setting[$over_agent->level], $over_temp_regular_bonus_money, 'over', $multiple);
  223. if ($regular_bonus_over_prize > 0) {
  224. $regular_bonus_over_prize_list[$over_agent->user_id] = ['price' => $regular_bonus_over_prize, 'agent_id' => $over_agent->id, 'agent_level' => $over_agent->level];
  225. }
  226. }
  227. }
  228. $j = 0;
  229. foreach ($this->team_prize_agents as $key => $team_agent) {
  230. $team_prize = 0;
  231. $extra_prize = 0;
  232. $drainage_subsidy_prize = 0;
  233. $team_subsidy_prize = 0;
  234. $next_team_agent = next($this->team_prize_agents);
  235. if ($team_prize_num < $this->basic_conf['team_prize_deep']) {
  236. //计算渠道奖励
  237. if (isset($config[$team_agent->level])) {
  238. $team_prize = $this->computing($config[$team_agent->level], $money, 'team', $multiple);
  239. }
  240. if ($team_prize > 0) {
  241. $team_prize -= $log_total_price;
  242. // 批处理组装数据
  243. $team_prize_list[$team_agent->user_id] = ['price' => $team_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  244. $team_prize_num++;
  245. $log_total_price = bcadd($log_total_price, $team_prize, 2);
  246. }
  247. }
  248. // 定期分红业务
  249. if ($regular_team_prize_num < $this->basic_conf['team_prize_deep']) {
  250. if (isset($regular_bonus_setting[$team_agent->level])) {
  251. $regular_bonus_team_prize = $this->computing($regular_bonus_setting[$team_agent->level], $money, 'team', $multiple);
  252. }
  253. if ($regular_bonus_team_prize > 0) {
  254. $regular_bonus_team_prize -= $regular_log_total_price;
  255. // 批处理组装数据
  256. $regular_team_prize_list[$team_agent->user_id] = ['price' => $regular_bonus_team_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  257. $regular_team_prize_num++;
  258. $regular_log_total_price += $regular_bonus_team_prize;
  259. }
  260. }
  261. //计算引流补贴
  262. if (!empty($this->basic_conf['is_drainage_subsidy'])) {
  263. if ($drainage_subsidy_num < $this->basic_conf['team_prize_deep']) {
  264. if (isset($config[$team_agent->level])) {
  265. $drainage_subsidy_prize = $this->computing($config[$team_agent->level], $money, 'drainage_subsidy', $multiple);
  266. }
  267. if ($drainage_subsidy_prize > 0) {
  268. $drainage_subsidy_prize -= $log_total_price_drainage_subsidy;
  269. // 批处理组装数据
  270. $drainage_subsidy_prize_list[$team_agent->user_id] = ['price' => $drainage_subsidy_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  271. $drainage_subsidy_num++;
  272. $log_total_price_drainage_subsidy += $drainage_subsidy_prize;
  273. }
  274. }
  275. }
  276. //计算渠道补贴
  277. if (!empty($this->basic_conf['is_team_subsidy'])) {
  278. if ($team_subsidy_num < $this->basic_conf['team_prize_deep']) {
  279. if (isset($config[$team_agent->level])) {
  280. $team_subsidy_prize = $this->computing($config[$team_agent->level], $money, 'team_subsidy', $multiple);
  281. }
  282. if ($team_subsidy_prize > 0) {
  283. $team_subsidy_prize -= $log_total_price_team_subsidy;
  284. // 批处理组装数据
  285. $team_subsidy_prize_list[$team_agent->user_id] = ['price' => $team_subsidy_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  286. $team_subsidy_num++;
  287. $log_total_price_team_subsidy += $team_subsidy_prize;
  288. }
  289. }
  290. }
  291. //计算额外奖励
  292. if (isset($config[$team_agent->level])) {
  293. $extra_prize = $this->computing($config[$team_agent->level], $money, 'extra', $multiple);
  294. }
  295. if (!empty($extra_prize) && $extra_prize > 0) {
  296. // 批处理组装数据
  297. $extra_prize_list[$team_agent->user_id] = ['price' => $extra_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  298. }
  299. $wait_deduct_equal_money = 0;
  300. // 平级奖与越级奖互斥
  301. $is_open_over_equal = true;
  302. if (!empty($this->basic_conf['is_enable_me_over_equal']) && $has_over) {
  303. $is_open_over_equal = false;
  304. }
  305. if ($this->basic_conf['is_equal'] && $is_open_over_equal) {
  306. $current_agent_list = array_slice($this->agent_list, $key + 1, $all_agent_num - $key - 1);
  307. // 与当前拿级差的人的等级比较,如果等于当前拿级差的人
  308. $team_agent_level = $team_agent->level;
  309. $equal_prize_num = 0; // 平级奖已领取层级数量
  310. $alone_equal_prize = $team_prize;//独立平级奖计算金额
  311. $alone_equal_user_id = 0;//最近拿平级奖代理
  312. $is_exec_find = false;
  313. $regular_bonus_equal_prize_num = 0;
  314. foreach ($current_agent_list as $k => $equal_agent) {
  315. // 找到下一个拿级差的人就不继续往下找
  316. if($this->basic_conf['is_find_equal_parent'] == 1 && ($this->basic_conf['find_a_level'] == 1 || $this->basic_conf['find_a_level'] == 2)){
  317. if ($equal_agent->level - $team_agent_level > 1) break;
  318. }else{
  319. if ($equal_agent->level > $team_agent_level) break;
  320. }
  321. // 平级找直推上级
  322. if($this->basic_conf['is_find_equal_parent']){
  323. //只找直推上级
  324. if($equal_agent->user_id != $parents_list[$team_agent->user_id]['parent_id']) break;
  325. if(empty($this->basic_conf['find_a_level'])){
  326. if($is_exec_find) break;
  327. }elseif($this->basic_conf['find_a_level'] == 1){
  328. if($is_exec_a_find) break;
  329. $is_exec_a_find = true;
  330. }elseif($this->basic_conf['find_a_level'] == 2){
  331. if($is_level_a_find) break;
  332. if(empty($config[$team_agent->level]['agent_equal_prize']) || $config[$team_agent->level]['agent_equal_prize'] == 0) break;
  333. $is_level_a_find = true;
  334. }
  335. $is_exec_find = true;
  336. }
  337. // 如果和拿级差的人等级相同则该经销商可以获得平级奖
  338. // 判断是否开启“首代平级奖开关”,开启之后,只判断拿第一个极差奖的代理,与他关系链最近的上级是否跟他平级,若平级则拿平级奖,反之不拿。
  339. $bool_equal_agent = ($this->basic_conf['is_equal_prize_first'] && $j == 0 && $equal_agent->level == $team_agent_level && $k == 0) || (!$this->basic_conf['is_equal_prize_first'] && $equal_agent->level == $team_agent_level && $equal_prize_num < $this->basic_conf['equal_prize_deep']);
  340. // 平级奖仅针对下单的人
  341. if (!empty($this->basic_conf['is_enable_to_buyer_equal'])) {
  342. // 与下单人等级不一样则跳过
  343. !empty($this->user_level) && $equal_agent->level != $this->user_level && $bool_equal_agent = false;
  344. // 设置了平级奖跳过的等级与当前等级一样也跳过
  345. !empty($this->basic_conf['skip_equal_level']) && $equal_agent->level == $this->basic_conf['skip_equal_level'] && $bool_equal_agent = false;
  346. }
  347. if ($bool_equal_agent) {
  348. $equal_prize = 0;
  349. //独立平级奖计算
  350. if(!empty($config[$team_agent->level]['is_alone_agent_equal_prize'])){
  351. $alone_agent_equal_prize_info = $config[$team_agent->level]['alone_agent_equal_prize_info'];
  352. if(!empty($alone_agent_equal_prize_info)){
  353. foreach($alone_agent_equal_prize_info as $info){
  354. if($info['deep'] == $equal_prize_num + 1){
  355. if(!empty($config[$team_agent->level]['is_percent_equal'])){
  356. $equal_prize = $info['prize'] * $multiple;
  357. }else{
  358. if (empty($info['prize'])) {
  359. $info['prize'] = 0;
  360. }
  361. $equal_prize = $alone_equal_prize * $info['prize'] / 100;
  362. }
  363. }
  364. }
  365. }
  366. }else{
  367. switch ($this->basic_conf['calculation_basis']) {
  368. case ComputingEnum::EQUAL_COMPUTING:
  369. // 平级奖默认计算方式,$money
  370. $equal_money = $money;
  371. // 是否开启平级奖独立计算方式
  372. if ($this->basic_conf['is_equal_computing_method']) {
  373. $equal_mothod = $this->basic_conf['equal_computing_method'];
  374. ['money' => $equal_money] = $this->getRules($equal_mothod);
  375. }
  376. if (isset($config[$equal_agent->level])) {
  377. $equal_prize = $this->computing($config[$equal_agent->level], $equal_money, 'equal', $multiple);
  378. }
  379. break;
  380. case ComputingEnum::EQUAL_COMPUTING_PARENT:
  381. // 计算依据,1=从上级极差收益计算可得的平级奖
  382. if ($team_prize_num < $this->basic_conf['team_prize_deep'] && !empty($next_team_agent)) {
  383. if (isset($config[$next_team_agent->level])) {
  384. $parent_team_prize = $this->computing($config[$next_team_agent->level], $money, 'team', $multiple);
  385. $parent_team_prize = bcsub($parent_team_prize, $log_total_price, 2);
  386. $equal_prize = $this->computing($config[$equal_agent->level], $parent_team_prize, 'equal');
  387. }
  388. }
  389. break;
  390. case ComputingEnum::EQUAL_COMPUTING_CHILDREN:
  391. if (isset($config[$equal_agent->level])) {
  392. $equal_prize = $this->computing($config[$equal_agent->level], $team_prize, 'equal');
  393. }
  394. break;
  395. }
  396. }
  397. if ($equal_prize > 0) {
  398. // 从上/下一个拿级差的经销商手下扣除金额
  399. $wait_deduct_equal_money += $equal_prize;
  400. $equal_prize_num++;
  401. //开启独立平级奖
  402. if(!empty($config[$team_agent->level]['is_alone_agent_equal_prize'])){
  403. // 首层 扣减 上级拿极差奖代理 非首层扣减上级拿平级奖代理
  404. if(empty($this->basic_conf['alone_equal_settle_type'])){
  405. if($equal_prize_num == 1){
  406. if($equal_prize > $team_prize_list[$team_agent->user_id]['price']){
  407. $equal_prize = $team_prize_list[$team_agent->user_id]['price'];
  408. $team_prize_list[$team_agent->user_id]['price'] = 0;
  409. }else{
  410. $team_prize_list[$team_agent->user_id]['price'] -= $equal_prize;
  411. }
  412. }else{
  413. if($equal_prize > $equal_prize_list[$alone_equal_user_id]['price']){
  414. $equal_prize = $equal_prize_list[$alone_equal_user_id]['price'];
  415. $equal_prize_list[$alone_equal_user_id]['price'] = 0;
  416. }else{
  417. $equal_prize_list[$alone_equal_user_id]['price'] -= $equal_prize;
  418. }
  419. }
  420. }
  421. $alone_equal_prize = $equal_prize;
  422. $alone_equal_user_id = $equal_agent->user_id;
  423. }
  424. // 批处理组装数据
  425. $equal_prize_list[$equal_agent->user_id] = ['price' => $equal_prize, 'agent_id' => $equal_agent->id, 'agent_level' => $equal_agent->level];
  426. }
  427. }
  428. // 定期分红业务
  429. if ($equal_agent->level == $team_agent_level && $regular_bonus_equal_prize_num < $this->basic_conf['equal_prize_deep']) {
  430. $regular_bonus_equal_prize = 0;
  431. if (isset($regular_bonus_setting[$equal_agent->level])) {
  432. $regular_bonus_equal_prize = $this->computing($regular_bonus_setting[$equal_agent->level], $money, 'equal', $multiple);
  433. }
  434. if ($regular_bonus_equal_prize > 0) {
  435. $regular_bonus_equal_prize_num++;
  436. // 批处理组装数据
  437. $regular_bonus_equal_prize_list[$equal_agent->user_id] = ['price' => $regular_bonus_equal_prize, 'agent_id' => $equal_agent->id, 'agent_level' => $equal_agent->level];
  438. }
  439. }
  440. }
  441. //平级奖励,独立结算
  442. $agent_level = AgentLevel::findOne(['mall_id' => $this->mall_id, 'level' => $team_agent_level, 'status' => StatusEnum::ENABLED]);
  443. $equal_settle_type = $this->basic_conf['equal_settle_type'];
  444. if (!empty($agent_level['is_open_equal_settle_type'])) $equal_settle_type = $agent_level['equal_settle_type'];
  445. }
  446. //额外平级奖,平1,2级
  447. if (!empty($this->basic_conf['is_extra_equal_prize'])) {
  448. $current_agent_list = array_slice($this->agent_list, $key + 1, $all_agent_num - $key - 1);
  449. // 与当前拿级差的人的等级比较,如果等于当前拿级差的人
  450. $team_agent_level = $team_agent->level;
  451. $parent_id = $second_parent_id = 0;
  452. if (isset($user_list[$team_agent['user_id']])) {
  453. $parent_id = $user_list[$team_agent['user_id']]['parent_id'];
  454. $second_parent_id = $user_list[$team_agent['user_id']]['second_parent_id'];
  455. }
  456. // 默认平级奖
  457. if (empty($this->basic_conf['equal_prize_type'])) {
  458. for ($i = 0; $i <= 1; $i++) {
  459. if (isset($current_agent_list[$i])) {
  460. $temp_agent = $current_agent_list[$i];
  461. $temp_user_id = 0;
  462. if ($team_agent_level == $temp_agent['level']) {
  463. switch ($i) {
  464. case 0:
  465. $temp_user_id = $parent_id;
  466. break;
  467. case 1:
  468. $temp_user_id = $second_parent_id;
  469. break;
  470. }
  471. if ($temp_user_id == $temp_agent['user_id']) {
  472. $temp_key = $i + 1;
  473. $extra_equal_prize_key = 'extra_equal_prize' . $temp_key;
  474. if (!empty($config[$temp_agent['level']][$extra_equal_prize_key])) {
  475. $extra_equal_prize = $config[$temp_agent['level']][$extra_equal_prize_key] * ($this->order_detail['num'] ?? 1);
  476. $over_equal_prize_list[$i][$temp_agent['user_id']] = ['price' => $extra_equal_prize, 'agent_id' => $temp_agent['id'], 'agent_level' => $temp_agent['level']];
  477. $wait_deduct_equal_money += $extra_equal_prize;
  478. }
  479. }
  480. }
  481. }
  482. }
  483. } else { // 给同等级的极差奖
  484. $num = 0;
  485. foreach ($current_agent_list as $item) {
  486. if ($item->level > $team_agent_level) {
  487. break;
  488. }
  489. if ($item->level == $team_agent_level) {
  490. $num++;
  491. $temp_key = $num;
  492. $extra_equal_prize_key = 'extra_equal_prize' . $temp_key;
  493. if (!empty($config[$item->level][$extra_equal_prize_key])) {
  494. $extra_equal_prize = $config[$item->level][$extra_equal_prize_key] * ($this->order_detail['num'] ?? 1);
  495. $over_equal_prize_list[$temp_key - 1][$item->user_id] = ['price' => $extra_equal_prize, 'agent_id' => $item->id, 'agent_level' => $item->level];
  496. $wait_deduct_equal_money += $extra_equal_prize;
  497. }
  498. if ($num >= 2) {
  499. break;
  500. }
  501. }
  502. }
  503. }
  504. }
  505. //未开启独立平级奖
  506. if(empty($config[$team_agent->level]['is_alone_agent_equal_prize'])){
  507. switch ($equal_settle_type) {
  508. case ComputingEnum::EQUAL_SETTLE_PARENT:
  509. //上级级拿渠道奖者付平级奖
  510. if ($next_team_agent) {
  511. if (!empty($deduct_agent_prize_list[$next_team_agent->user_id]['deduct_money'])) {
  512. $deduct_agent_prize_list[$next_team_agent->user_id]['deduct_money'] += $wait_deduct_equal_money;
  513. } else {
  514. $deduct_agent_prize_list[$next_team_agent->user_id]['deduct_money'] = $wait_deduct_equal_money;
  515. }
  516. }
  517. break;
  518. case ComputingEnum::EQUAL_SETTLE_CHILDREN:
  519. //下级拿渠道奖者付平级奖
  520. $prev_team_agent = $team_agent;
  521. if (empty($deduct_agent_prize_list[$prev_team_agent->user_id]['deduct_money'])) {
  522. $deduct_agent_prize_list[$prev_team_agent->user_id]['deduct_money'] = $wait_deduct_equal_money;
  523. } else {
  524. $deduct_agent_prize_list[$prev_team_agent->user_id]['deduct_money'] += $wait_deduct_equal_money;
  525. }
  526. break;
  527. }
  528. }
  529. $j++;
  530. }
  531. if($this->basic_conf['is_self_buy'] && $this->basic_conf['is_enable_recommend_award'] && $team_prize_list) {
  532. $new_team_prize_list = [];
  533. $last_origin_team_prize = 0;
  534. $bear_recommend_prize = false; //上级是否承担了推荐奖
  535. foreach ($this->agent_list as $one_agent) {
  536. //推荐奖
  537. $team_prize = $team_prize_list[$one_agent->user_id]['price'] ?? 0;
  538. $origin_team_prize = $team_prize;
  539. //echo 'user_id:'.$one_agent->user_id.',team_prize='.$team_prize.',province_id='.$one_agent->province_id.',level='.$one_agent->level.PHP_EOL;
  540. if($one_agent->user_id != $this->user_id){
  541. if($one_agent->province_id == $province_id){
  542. //同省
  543. if($team_prize > 0 || $last_origin_team_prize > 0){
  544. if(!$bear_recommend_prize && $recommend_prize > 0){
  545. $team_prize = $team_prize - $recommend_prize;
  546. $bear_recommend_prize = true;
  547. }
  548. if($last_origin_team_prize > 0 && $recommend_prize > 0){
  549. $team_prize = $team_prize + $last_origin_team_prize;
  550. //拿走了极差
  551. $origin_team_prize = 0;
  552. }
  553. $new_team_prize_list[$one_agent->user_id] = ['price' => $team_prize, 'agent_id' => $one_agent->id, 'agent_level' => $one_agent->level];
  554. }else{
  555. $team_prize = 0;
  556. if($recommend_prize == 0){
  557. //推荐奖
  558. $team_prize = $this->computing($config[$one_agent->level], $money, 'recommend', $multiple);
  559. $recommend_prize = $team_prize;
  560. $new_team_prize_list[$one_agent->user_id] = ['price' => $team_prize, 'agent_id' => $one_agent->id, 'agent_level' => $one_agent->level,'prize_type' => 'recommend'];
  561. }
  562. }
  563. }else{
  564. //跨省
  565. $team_prize = 0;
  566. if($recommend_prize == 0){
  567. $team_prize = $this->computing($config[$one_agent->level], $money, 'recommend', $multiple);
  568. $recommend_prize = $team_prize;
  569. $new_team_prize_list[$one_agent->user_id] = ['price' => $team_prize, 'agent_id' => $one_agent->id, 'agent_level' => $one_agent->level,'prize_type' => ComputingEnum::RECOMMEND_PRIZE];
  570. }
  571. }
  572. if($origin_team_prize != $team_prize && $origin_team_prize > 0 && $origin_team_prize != $team_prize + $recommend_prize){
  573. $last_origin_team_prize = $origin_team_prize;
  574. }else{
  575. $last_origin_team_prize = 0;
  576. }
  577. //$last_origin_team_prize = $origin_team_prize > 0 ? $origin_team_prize : $last_origin_team_prize;
  578. }
  579. //$team_prize_list[$one_agent->user_id] = ['price' => $team_prize, 'agent_id' => $one_agent->id, 'agent_level' => $one_agent->level];
  580. //$province_id = $one_agent->province_id;
  581. }
  582. $team_prize_list = $new_team_prize_list;
  583. }
  584. $insert_wallet = [];
  585. //极差分红
  586. if(!empty($this->self_buy_user_id) && !empty($this->basic_conf['is_self_buy']) && !empty($this->basic_conf['enable_goods_deduct']) && !empty($this->basic_conf['is_enable_diff_bonus'])){
  587. $is_self_buy = false;
  588. foreach($team_prize_list as $user_id => $team_prize){
  589. if($user_id == $this->self_buy_user_id){
  590. $is_self_buy = true;
  591. continue;
  592. }
  593. if(!$is_self_buy) continue;
  594. $diff_reward_money = $team_prize['price'];
  595. if($diff_reward_money > 0){
  596. //上级代理奖励
  597. if(!empty($this->basic_conf['parent_diff_bonus'])){
  598. $parent_diff_money = $diff_reward_money * $this->basic_conf['parent_diff_bonus'] / 100;
  599. if($parent_diff_money > 0){
  600. $team_prize_list[$user_id]['price'] = $parent_diff_money;
  601. }
  602. }
  603. //区域分红
  604. if(!empty($this->basic_conf['diff_bonus_area'])){
  605. $diff_bonus_area = json_decode($this->basic_conf['diff_bonus_area'],true);
  606. $diff_bonus_area['compute_type'] = $this->basic_conf['compute_type'];
  607. $result = $this->areaData($this->mall_id,$this->user_id,$diff_reward_money,$diff_bonus_area);
  608. $insert_wallet = array_merge($insert_wallet, $result);
  609. }
  610. //指定账户
  611. if(!empty($this->basic_conf['diff_bonus_user'])){
  612. $diff_bonus_user_prize_list = [];
  613. $diff_bonus_user = json_decode($this->basic_conf['diff_bonus_user'],true);
  614. foreach($diff_bonus_user as $diff_user){
  615. $diff_user_money = $diff_reward_money * $diff_user['prize'] / 100;
  616. if($diff_user_money <= 0) continue;
  617. $agent = Agent::findOne(['user_id' => $diff_user['id'], 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);// 查询用户身份
  618. $diff_bonus_user_prize_list[$diff_user['id']] = ['price' => $diff_user_money, 'agent_id' => $agent ? $agent['id'] : 0, 'agent_level' => $agent ? $agent['level'] : 0];
  619. }
  620. $result = $this->packData(ComputingEnum::DIFF_USER, $this->basic_conf['compute_type'], $diff_bonus_user_prize_list, $extension);
  621. $insert_wallet = array_merge($insert_wallet, $result);
  622. }
  623. }
  624. }
  625. }
  626. //代理平级奖励
  627. if(!empty($this->basic_conf['is_equal_by_upgrade']) && !empty($team_prize_list)){
  628. $equal_by_upgrade_list = [];
  629. $equal_by_upgrade_lists = [];
  630. foreach ($this->team_prize_agents as $key => $team_agent) {
  631. if(array_key_exists($team_agent->user_id, $team_prize_list)){
  632. //是否存在极差平级,存在则均分极差奖励
  633. if(!empty($equal_by_upgrade_list)){
  634. $num = count($equal_by_upgrade_list) + 1;
  635. $equal_by_upgrade_money = $team_prize_list[$team_agent->user_id]['price'] / $num;
  636. if($equal_by_upgrade_money > 0){
  637. foreach($equal_by_upgrade_list as $user_id => $equal_by_upgrade_agent){
  638. $equal_by_upgrade_lists[$user_id] = $equal_by_upgrade_agent;
  639. $equal_by_upgrade_lists[$user_id]['price'] = $equal_by_upgrade_money;
  640. }
  641. $team_prize_list[$team_agent->user_id]['price'] = $equal_by_upgrade_money;
  642. }
  643. $equal_by_upgrade_list = [];
  644. }
  645. //当前拿极差代理
  646. $current_agent_list = array_slice($this->agent_list, $key + 1, $all_agent_num - $key - 1);
  647. foreach ($current_agent_list as $equal_agent) {
  648. // 找到下一个拿级差的人就不继续往下找
  649. if ($equal_agent->level > $team_agent->level) break;
  650. $equal_by_upgrade_list[$equal_agent->user_id] = ['price' => 0, 'agent_id' => $equal_agent->id, 'agent_level' => $equal_agent->level];
  651. }
  652. }
  653. }
  654. if(!empty($equal_by_upgrade_lists)){
  655. $result = $this->packData(ComputingEnum::EQUAL_UPGRADE, $this->basic_conf['compute_type'], $equal_by_upgrade_lists, $extension);
  656. $insert_wallet = array_merge($insert_wallet, $result);
  657. }
  658. }
  659. $repurchase_subsidy_prize_list1 = [];
  660. $repurchase_subsidy_prize_list2 = [];
  661. if(method_exists($this, 'handleRepurchaseSubsidy')){
  662. $repurchase_subsidy_prize_list = $this->handleRepurchaseSubsidy(
  663. $this->mall_id,
  664. $this->user_id,
  665. $config
  666. );
  667. $repurchase_subsidy_prize_list1 = $repurchase_subsidy_prize_list['repurchase_subsidy_prize_list1'];
  668. $repurchase_subsidy_prize_list2 = $repurchase_subsidy_prize_list['repurchase_subsidy_prize_list2'];
  669. }
  670. if(!empty($repurchase_subsidy_prize_list1)){
  671. $result = $this->packData(ComputingEnum::REPURCHASE_SUBSIDY1, $this->basic_conf['compute_type'], $repurchase_subsidy_prize_list1, $extension);
  672. $insert_wallet = array_merge($insert_wallet, $result);
  673. }
  674. if(!empty($repurchase_subsidy_prize_list2)){
  675. $result = $this->packData(ComputingEnum::REPURCHASE_SUBSIDY2, $this->basic_conf['compute_type'], $repurchase_subsidy_prize_list2, $extension);
  676. $insert_wallet = array_merge($insert_wallet, $result);
  677. }
  678. $result = $this->getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list);
  679. $insert_wallet = array_merge($insert_wallet, $result);
  680. //print_r($insert_wallet);exit;
  681. //引流补贴
  682. if (!empty($drainage_subsidy_prize_list)) {
  683. $result = $this->packData(ComputingEnum::DRAINAGE_SUBSIDY_PRIZE, $this->basic_conf['compute_type'], $drainage_subsidy_prize_list, $extension);
  684. $insert_wallet = array_merge($insert_wallet, $result);
  685. }
  686. //渠道补贴
  687. if (!empty($team_subsidy_prize_list)) {
  688. $result = $this->packData(ComputingEnum::TEAM_SUBSIDY_PRIZE, $this->basic_conf['compute_type'], $team_subsidy_prize_list, $extension);
  689. $insert_wallet = array_merge($insert_wallet, $result);
  690. }
  691. //额外平级奖,平1,2级
  692. if (!empty($over_equal_prize_list)) {
  693. $capital_type_map = [ComputingEnum::EXTRA_EQUAL_PRIZE_1,ComputingEnum::EXTRA_EQUAL_PRIZE_2];
  694. for ($i = 0; $i <= 1; $i++) {
  695. if(isset($over_equal_prize_list[$i])){
  696. $extra_equal_reward_arr = $this->packData($capital_type_map[$i], $this->basic_conf['compute_type'], $over_equal_prize_list[$i], $extension);
  697. $insert_wallet = array_merge($insert_wallet, $extra_equal_reward_arr);
  698. }
  699. }
  700. }
  701. //计算管理奖
  702. $manage_prize_list = [];
  703. if (!empty($this->basic_conf['is_manage_prize']) && $this->basic_conf['manage_prize_deep'] > 0 && !empty($team_prize_list)) {
  704. $agent_level_select = json_decode($this->basic_conf['agent_level_select'],true);
  705. if(!empty($agent_level_select)){
  706. $agent_level_info = json_decode($this->basic_conf['agent_level_info'],true);
  707. $manage_agent_num = $this->basic_conf['manage_prize_deep'];
  708. $manage_user_id = 0;
  709. $manage_key = 0;
  710. $manage_agent_level = 0;
  711. foreach($team_prize_list as $user_id => $team_prize){
  712. if(in_array($team_prize['agent_level'],$agent_level_select)){
  713. $manage_agent_level = $team_prize['agent_level'];
  714. $manage_user_id = $user_id;
  715. break;
  716. }
  717. }
  718. if($manage_user_id && !empty($agent_level_info[$manage_agent_level])){
  719. foreach($this->agent_list as $key => $agent){
  720. if($agent['user_id'] == $manage_user_id){
  721. $manage_key = $key;
  722. break;
  723. }
  724. }
  725. $manage_list = array_slice($this->agent_list, $key + 1);
  726. $manage_agent_list = [];
  727. $manage_agent_select = 0;
  728. foreach($manage_list as $manage_item){
  729. if(in_array($manage_item['level'],$agent_level_select)){
  730. $manage_agent_list[] = $manage_item;
  731. $manage_agent_select++;
  732. }
  733. if($manage_agent_select == $manage_agent_num) break;
  734. }
  735. if(!empty($manage_agent_list)){
  736. $i = 0;
  737. foreach($manage_agent_list as $manage_agent){
  738. $manage_money = 0;
  739. if(!empty($agent_level_info[$manage_agent_level][$i])){
  740. $manage_money = $money * $agent_level_info[$manage_agent_level][$i]['prize'] * $multiple / 100;
  741. }
  742. if($manage_money > 0){
  743. $manage_prize_list[$manage_agent['user_id']] = ['price' => $manage_money, 'agent_id' => $manage_agent['id'], 'agent_level' => $manage_agent['level']];
  744. }
  745. $i++;
  746. if($i == $manage_agent_num) break;
  747. }
  748. }
  749. }
  750. }
  751. }
  752. if(!empty($manage_prize_list)){
  753. $result = $this->packData(ComputingEnum::MANAGE_PRIZE, $this->basic_conf['compute_type'], $manage_prize_list, $extension);
  754. $insert_wallet = array_merge($insert_wallet, $result);
  755. }
  756. $regular_bonus_insert_wallet = $this->obtainInsertWalletData($regular_team_prize_list, $regular_bonus_equal_prize_list, $regular_bonus_over_prize_list, []);
  757. if(!empty($regular_bonus_insert_wallet)){
  758. $insert_wallet = array_merge($insert_wallet, $regular_bonus_insert_wallet);
  759. }
  760. // 批量插入数据
  761. $money = 0;
  762. try {
  763. //投递到资产队列
  764. if ($insert_wallet) {
  765. // 如果是额外积分那么插件那边需要记录一下
  766. if ($this->is_additional_score) {
  767. $insert_wallet = (new ScoreLogService())->batchInsert($insert_wallet);
  768. }
  769. if (empty($insert_wallet)) return 0;
  770. if($this->name != 'digital'){
  771. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  772. if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  773. }
  774. $status = StatusEnum::ENABLED;
  775. foreach ($insert_wallet as $k => $user) {
  776. if($user['wallet_type'] == 'digital'){
  777. $res = UserDigital::handleUserDigital($user['mall_id'],$user['user_id'],$user['money'],$user['is_frozen'],$user);
  778. if($res === false) continue;
  779. }
  780. if($user['from_type'] == AddonsEnum::ADDONS_NAME_REGULAR_BONUS. '_'. AgentEnum::ADDONS_NAME) continue;
  781. $agent = Agent::findOne(['user_id' => $user['user_id'],'status'=>[StatusEnum::DISABLED,StatusEnum::ENABLED], 'mall_id' => $this->mall_id]);
  782. if(empty($agent)) continue;
  783. $field = 'total_' . ($this->commission_name_map[$this->name] ?? $this->name);
  784. $agent->$field += $user['money'];
  785. if (!in_array($user['capital_type'], [ComputingEnum::DRAINAGE_SUBSIDY_PRIZE, ComputingEnum::TEAM_SUBSIDY_PRIZE])) {
  786. $money += $user['money'];
  787. }
  788. $res = $agent->save();
  789. if (empty($res)) throw new \Exception(Agent::getStaticError());
  790. }
  791. if($this->name=='commission'){
  792. $agent = Agent::findOne(['user_id' => $this->user_id, 'mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED]);// 查询购买者身份
  793. $buy_user_level = 0;
  794. if(!empty($agent)) $buy_user_level = $agent['level'];
  795. $agent_list = [];
  796. foreach ($this->agent_list as $agent){
  797. $agent_list[$agent['user_id']] = [
  798. 'level'=>$agent['level']
  799. ];
  800. }
  801. $insert_data = [
  802. 'insert_wallet'=>$insert_wallet,
  803. 'order_no'=>$this->order_detail['order_no'],
  804. 'goods_nums'=>$this->order_detail['num'],
  805. 'buy_user_id'=>$this->user_id,
  806. 'buy_level'=>$buy_user_level,
  807. 'payment_amount'=>$basic_money,
  808. 'agent_list'=>$agent_list,
  809. ];
  810. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_ORDER, RabbitMqEnum::ORDER_QUEUE, $insert_data, AgentSupplierOrder::class, 'insertData');
  811. }
  812. if($this->is_enable_regular_bonus){
  813. if(property_exists($this, 'order_detail') && !empty($this->order_detail)){
  814. TaskHelper::pushTaskQueue(RabbitMqEnum::EXCHANGE_TASK,RabbitMqEnum::TASK_QUEUE, [
  815. 'mall_id' => $this->mall_id, 'order_detail_id' => $this->order_detail['id'], 'addons_name' => AgentEnum::ADDONS_NAME, 'status' => (int)$status,
  816. ], $this->regular_bonus_handle_class, 'handleAgentOrDistributionWalletData', function(AMQPMessage $message){
  817. // 生产错误
  818. \Yii::error('发送异步任务失败');
  819. });
  820. }
  821. }
  822. }
  823. $this->insert_wallet = $insert_wallet;
  824. $this->addRewardConfigLog();
  825. return $money;
  826. } catch (\Exception $e) {
  827. echo 'AgentBase:addFrozenCommission ' . ($this->order_detail['order_no'] ?? ' 无订单号 ') . FormatHelper::exception($e, __METHOD__);
  828. return 0;
  829. }
  830. }
  831. //额外平级奖,平1,2级
  832. public function extraEqual($config)
  833. {
  834. $user = User::findOne(['id' => $this->user_id]);
  835. $parent_id = $user['parent_id'];
  836. $second_parent_id = $user['second_parent_id'];
  837. $temp_agent_list = array_column($this->agent_list, null, 'user_id');
  838. $over_equal_prize_list1 = $over_equal_prize_list2 = [];
  839. $agent_model = Agent::findOne(['user_id' => $this->user_id, 'status' => StatusEnum::ENABLED]);
  840. if (!empty($agent_model)) {
  841. //平一级
  842. if (!empty($temp_agent_list[$parent_id]) && $temp_agent_list[$parent_id]['level'] == $agent_model['level']) {
  843. $agent = $temp_agent_list[$parent_id];
  844. if (!empty($config[$agent['level']]['extra_equal_prize1'])) {
  845. $over_equal_prize_list1[$agent['user_id']] = ['price' => $config[$agent['level']]['extra_equal_prize1'], 'agent_id' => $agent['id'], 'agent_level' => $agent['level']];
  846. }
  847. }
  848. //平二级
  849. if (!empty($temp_agent_list[$second_parent_id]) && $temp_agent_list[$second_parent_id]['level'] == $agent_model['level']) {
  850. $agent = $temp_agent_list[$second_parent_id];
  851. if (!empty($config[$agent['level']]['extra_equal_prize2'])) {
  852. $over_equal_prize_list2[$agent['user_id']] = ['price' => $config[$agent['level']]['extra_equal_prize2'], 'agent_id' => $agent['id'], 'agent_level' => $agent['level']];
  853. }
  854. }
  855. }
  856. return [$over_equal_prize_list1, $over_equal_prize_list2];
  857. }
  858. /**
  859. * @desc:计算
  860. * @Author: hua
  861. * @Date: 2021/10/27
  862. * @Time: 18:28
  863. * @Copyright: copyright (c) 2021 广东七件事集团
  864. * @param $config
  865. * @param $money
  866. * @param $type
  867. * @param int $multiple
  868. * @return float|int
  869. */
  870. public function computing($config, $money, $type, $multiple = 1)
  871. {
  872. $is_percent_key = "is_percent_{$type}";
  873. $agent_prize_key = "agent_{$type}_prize";
  874. $num = 0;
  875. if (isset($config[$is_percent_key]) && isset($config[$agent_prize_key])) {
  876. // $num = $config[$is_percent_key] == 0 ? $money * $config["agent_{$type}_prize"] / 100 * $multiple : $config[$agent_prize_key] * $multiple;
  877. // 金额精确到小数点后两位
  878. $agentPrice = $money * $config["agent_{$type}_prize"] / 100;
  879. $num = $config[$is_percent_key] == 0 ? bcmul($agentPrice, $multiple, 2) :
  880. bcmul($config[$agent_prize_key], $multiple , 2);
  881. }
  882. return $num;
  883. }
  884. abstract public function getLevelConfig();
  885. abstract public function getRules(int $method = null);
  886. abstract public function addRewardConfigLog();
  887. abstract public function getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list);
  888. public function obtainInsertWalletData($team_prize_list, $equal_prize_list, $over_prize_list, $deduct_agent_prize_list){
  889. return [];
  890. }
  891. }