AgentRewardByUpgrade.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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\AgentCommissionBasisLog;
  7. use addons\Agent\common\models\AgentCommissionItemSetting;
  8. use addons\Agent\common\models\AgentCommissionLevelSetting;
  9. use addons\Agent\common\models\AgentLevel;
  10. use addons\Agent\common\models\AgentTeamAchievement;
  11. use addons\Agent\common\logic\reward\addons\area\AreaReward;
  12. use addons\Area\common\enums\AreaEnum;
  13. use common\enums\AddonsEnum;
  14. use common\enums\GoodsTypeEnum;
  15. use common\enums\RedisKeyEnum;
  16. use common\enums\StatusEnum;
  17. use common\enums\UserWalletEnum;
  18. use common\helpers\LockHelper;
  19. use common\models\goods\Goods;
  20. use common\models\mall\Mall;
  21. use services\common\UserWalletService;
  22. use common\models\mall\MallAddons;
  23. use common\models\order\Order;
  24. use yii\db\Exception;
  25. /**
  26. * @desc 渠道奖励
  27. * Class AgentReward
  28. * @Author: hua
  29. * @DateTime: 2021/10/27 15:24
  30. * @Copyright: copyright (c) 2021 广东七件事集团
  31. * @package addons\Agent\common\logic\reward
  32. */
  33. class AgentRewardByUpgrade extends AgentBase
  34. {
  35. public $level_config;//等级配置
  36. public $goods_config;//商品独立设置
  37. public $extension;//扩展
  38. public $order_detail = [];
  39. public $upgrade_agent;
  40. public function addFrozenCommission()
  41. {
  42. // 验证
  43. $config = $this->getLevelConfig();
  44. ['money' => $money, 'multiple' => $multiple, 'extension' => $extension] = $this->getRules();
  45. //极差奖励代理
  46. $diff_agent = null;
  47. //平级奖励结束等级
  48. $last_agent_level = 0;
  49. if (empty($this->team_prize_agents)) {
  50. foreach ($this->agent_list as $key => $agent) {
  51. var_dump($agent->user_id);
  52. if($diff_agent && $agent->level >= $diff_agent->level){
  53. $this->team_prize_agents[$key] = $agent;
  54. if($agent->level > $diff_agent->level){
  55. $last_agent_level = $agent->level;
  56. break;
  57. }
  58. }elseif ($agent->level > $this->upgrade_agent->level){
  59. $diff_agent = $agent;
  60. }
  61. }
  62. }
  63. if(empty($diff_agent)) return true;
  64. //计算渠道奖励
  65. $equal_prize_start = 0;
  66. $equal_prize_end = 0;
  67. $team_prize_list = [];
  68. if (isset($config[$diff_agent->level])) {
  69. $equal_prize_start = $this->computing($config[$diff_agent->level], $money, 'team', $multiple);
  70. if($equal_prize_start > 0){
  71. $team_prize_list[$diff_agent->user_id] = ['price' => $equal_prize_start, 'agent_id' => $diff_agent->id, 'agent_level' => $diff_agent->level];
  72. }
  73. }
  74. if (isset($config[$last_agent_level])) {
  75. $equal_prize_end = $this->computing($config[$last_agent_level], $money, 'team', $multiple);
  76. }
  77. $equal_prize = $equal_prize_end - $equal_prize_start;
  78. if(!empty($this->team_prize_agents) && $equal_prize > 0 ){
  79. // 获得奖励经销商数量
  80. $all_agent_num = count($this->team_prize_agents);
  81. $equal_prize = $equal_prize / $all_agent_num;
  82. foreach ($this->team_prize_agents as $key => $team_agent) {
  83. // 批处理组装数据
  84. $team_prize_list[$team_agent->user_id] = ['price' => $equal_prize, 'agent_id' => $team_agent->id, 'agent_level' => $team_agent->level];
  85. }
  86. }
  87. $insert_wallet = $this->packData(ComputingEnum::EQUAL_UPGRADE, $this->basic_conf['compute_type'], $team_prize_list, $extension);
  88. // 批量插入数据
  89. $money = 0;
  90. try {
  91. //投递到资产队列
  92. if ($insert_wallet) {
  93. foreach ($insert_wallet as $k => $user) {
  94. $agent = Agent::findOne(['user_id' => $user['user_id'],'status'=>[StatusEnum::DISABLED,StatusEnum::ENABLED], 'mall_id' => $this->mall_id]);
  95. if(empty($agent)) continue;
  96. $field = 'total_' . ($this->commission_name_map[$this->name] ?? $this->name);
  97. $agent->$field += $user['money'];
  98. if (!in_array($user['capital_type'], [ComputingEnum::DRAINAGE_SUBSIDY_PRIZE, ComputingEnum::TEAM_SUBSIDY_PRIZE])) {
  99. $money += $user['money'];
  100. }
  101. $res = $agent->save();
  102. if (empty($res)) throw new \Exception(Agent::getStaticError());
  103. }
  104. }
  105. //$this->addRewardConfigLog();
  106. return $money;
  107. } catch (\Exception $e) {
  108. echo 'AgentRewardByUpgrade:addFrozenCommission' . $e->getMessage();
  109. return 0;
  110. }
  111. }
  112. /**
  113. * @desc:等级配置
  114. * @Author: hua
  115. * @Date: 2021/10/28
  116. * @Time: 16:09
  117. * @Copyright: copyright (c) 2021 广东七件事集团
  118. * @return array
  119. */
  120. public function getLevelConfig()
  121. {
  122. $params['where'] = [['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]];
  123. $params['select'] = 'id,mall_id,level,name,is_auto_upgrade,upgrade_type_condition,checked_condition_values,checked_condition_keys,condition_type,
  124. upgrade_type_goods,buy_goods_type,goods_type,goods_ids,goods_list,explain,status';
  125. $name = $this->name;
  126. $mall_id = $this->mall_id;
  127. $params['with'] = ['commissionLevelSetting' => function ($query) use ($name, $mall_id) {
  128. $query->where(['commission_type' => $name, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])
  129. ->select('id,mall_id,level,commission_type,from_type,is_percent_team,is_percent_equal,
  130. is_percent_over,is_percent_extra,agent_team_prize,agent_equal_prize,agent_over_prize,agent_extra_prize,status,is_alone_agent_equal_prize,alone_agent_equal_prize_info');
  131. }];
  132. $agent_level_list = AgentLevel::lists($params);
  133. $config_arr = [];
  134. foreach ($agent_level_list as $item) {
  135. $item['commissionLevelSetting']['alone_agent_equal_prize_info'] = !empty($item['commissionLevelSetting']['alone_agent_equal_prize_info']) ? json_decode($item['commissionLevelSetting']['alone_agent_equal_prize_info'],true) : [];
  136. $config_arr[$item['level']] = $item['commissionLevelSetting'];
  137. }
  138. $this->level_config = $config_arr;
  139. $where = [['item_id' => $this->order_detail['goods_id']], ['item_type' => 'goods'], ['commission_type' => $name], ['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]];
  140. $select = 'id,mall_id,is_enable,item_id,item_type,commission_type,is_percent_team,is_percent_equal,is_percent_over,is_percent_extra,status,
  141. is_percent_drainage_subsidy,is_percent_team_subsidy,is_percent_recommend,is_enable_recommend,is_alone_agent_equal_prize,alone_agent_equal_prize_type';
  142. $with = ['detail' => function ($query) {
  143. $query->select('id,mall_id,agent_commission_item_setting_id,level,agent_team_prize,agent_equal_prize,agent_over_prize,agent_extra_prize,status,
  144. agent_drainage_subsidy_prize,agent_team_subsidy_prize,extra_equal_prize1,extra_equal_prize2,agent_recommend_prize,alone_agent_equal_prize_info');
  145. }];
  146. $agent_goods_setting = AgentCommissionItemSetting::getOne($where, true, $with, false, $select);
  147. if (!empty($agent_goods_setting)) {
  148. if ($agent_goods_setting['commission_type'] == $name && $agent_goods_setting['is_enable']) {
  149. $config_arr = [];
  150. foreach ($agent_goods_setting['detail'] as $val) {
  151. $config_arr[$val['level']] = [
  152. 'is_percent_team' => $agent_goods_setting['is_percent_team'],
  153. 'is_percent_equal' => $agent_goods_setting['is_percent_equal'],
  154. 'is_percent_over' => $agent_goods_setting['is_percent_over'],
  155. 'is_percent_extra' => $agent_goods_setting['is_percent_extra'],
  156. 'is_percent_drainage_subsidy' => $agent_goods_setting['is_percent_drainage_subsidy'],
  157. 'is_percent_team_subsidy' => $agent_goods_setting['is_percent_team_subsidy'],
  158. 'agent_team_prize' => $val['agent_team_prize'],
  159. 'agent_equal_prize' => $val['agent_equal_prize'],
  160. 'agent_over_prize' => $val['agent_over_prize'],
  161. 'agent_extra_prize' => $val['agent_extra_prize'],
  162. 'agent_drainage_subsidy_prize' => $val['agent_drainage_subsidy_prize'],
  163. 'agent_team_subsidy_prize' => $val['agent_team_subsidy_prize'],
  164. 'extra_equal_prize1' => $val['extra_equal_prize1'],
  165. 'extra_equal_prize2' => $val['extra_equal_prize2'],
  166. 'is_percent_recommend' => $agent_goods_setting['is_percent_recommend'] ?? 0,
  167. 'is_enable_recommend' => $agent_goods_setting['is_enable_recommend'] ?? 0,
  168. 'agent_recommend_prize' => $val['agent_recommend_prize'] ?? 0,
  169. 'is_alone_agent_equal_prize' => $agent_goods_setting['is_alone_agent_equal_prize'] ?? 0,
  170. 'alone_agent_equal_prize_info' => $val['alone_agent_equal_prize_info'] ? json_decode($val['alone_agent_equal_prize_info'],true) : [],
  171. ];
  172. //开启独立平级奖 平级奖励类型改为独立平级奖的设置
  173. if(!empty($agent_goods_setting['is_alone_agent_equal_prize'])){
  174. $config_arr[$val['level']]['is_percent_equal'] = $agent_goods_setting['alone_agent_equal_prize_type'] ?? 0;
  175. }
  176. }
  177. $this->goods_config = $config_arr;
  178. }
  179. }
  180. return $config_arr;
  181. }
  182. /**
  183. * @desc:奖励规则
  184. * @Author: hua
  185. * @Date: 2021/10/28
  186. * @Time: 16:08
  187. * @Copyright: copyright (c) 2021 广东七件事集团
  188. * @return array
  189. */
  190. public function getRules(int $method = null)
  191. {
  192. $method = isset($method) ? $method : $this->basic_conf['computing_method']; // 不传则用默认的计算方式
  193. //0支付价格1商品售价2商品利润
  194. $money = $this->order_detail['goods_price']??0;
  195. $multiple = $this->order_detail['num'] ?? 1;
  196. switch ($method) {
  197. case ComputingEnum::COMPUTING_METHOD_PAY_PRICE:
  198. $adjust_money = $this->order_detail['adjust_money']??0;
  199. $money = $this->order_detail['goods_price']??0;
  200. $money = (($money+$adjust_money)/$multiple);
  201. break;
  202. case ComputingEnum::COMPUTING_METHOD_GOODS_PRICE:
  203. $money = $this->order_detail['original_goods_price']??0;
  204. $money = ($money/$multiple);
  205. break;
  206. case ComputingEnum::COMPUTING_METHOD_GOODS_PROFIT:
  207. $goods_price = $this->order_detail['goods_price']??0;
  208. $cost_price = $this->order_detail['cost_price']??0;
  209. $adjust_money = $this->order_detail['adjust_money']??0;
  210. $money = ($goods_price/$multiple) - $cost_price+$adjust_money/$multiple;
  211. if($money<0) $money= 0;
  212. break;
  213. }
  214. $extension = ['source_table' => 'order_detail', 'source_table_id' => $this->order_detail['id']??0, 'from_type' => AgentEnum::ADDONS_NAME];
  215. $this->extension = $extension;
  216. return ['money' => $money, 'multiple' => $multiple, 'extension' => $extension];
  217. }
  218. /**
  219. * @desc:记录每次触发奖励的相关配置
  220. * @Author: hua
  221. * @Date: 2021/11/18
  222. * @Time: 11:09
  223. * @Copyright: copyright (c) 2021 广东七件事集团
  224. */
  225. public function addRewardConfigLog()
  226. {
  227. $extension = $this->extension;
  228. $add_data['source_table'] = $extension['source_table'];
  229. $add_data['source_table_id'] = $extension['source_table_id'];
  230. $add_data['type'] = $this->name;
  231. $add_data['from_type'] = $extension['from_type'];
  232. $add_data['basic_config'] = !empty($this->basic_conf) ? json_encode($this->basic_conf) : '';
  233. $add_data['level_config'] = !empty($this->level_config) ? json_encode($this->level_config) : '';
  234. if (!empty($this->goods_config)) $add_data['goods_config'] = json_encode($this->goods_config);
  235. $agent_arr = [];
  236. foreach ($this->agent_list as $agent) {
  237. $agent_arr[$agent['id']] = [
  238. 'user_id' => $agent['user_id'],
  239. 'level' => $agent['level'],
  240. ];
  241. }
  242. $add_data['relation_ship'] = !empty($agent_arr) ? json_encode($agent_arr) : '';
  243. $add_data['mall_id'] = $this->mall_id;
  244. $add_data['status'] = StatusEnum::ENABLED;
  245. $res = AgentCommissionBasisLog::setData($add_data);
  246. if ($res == false) echo 'AgentReward:addRewardConfigLog:err:' . AgentCommissionBasisLog::getStaticError();
  247. }
  248. /**
  249. * @desc:组装数据
  250. * @Author: hua
  251. * @Date: 2021/11/18
  252. * @Time: 15:29
  253. * @Copyright: copyright (c) 2021 广东七件事集团
  254. * @param $capital_type //奖励类型
  255. * @param $compute_type //支付完成/订单完成结算
  256. * @param $prize_list //奖励列表
  257. * @param $extension //扩展列表
  258. * @param $deduct_prize_list //扣减奖励
  259. * @return array
  260. */
  261. public function packData($capital_type, $compute_type, $prize_list, $extension, $deduct_prize_list = [])
  262. {
  263. $type_map = ComputingEnum::getTypeMap();
  264. $insert_wallet = [];
  265. $is_frozen = true;
  266. $goods_id = $this->order_detail['goods_id'];
  267. $goods = Goods::findOne(['id'=>$goods_id]);
  268. if($goods['goods_type']==GoodsTypeEnum::GoodsTypeVirtual){
  269. //虚拟商品,支付后-直接订单完成,所以直接结算
  270. $is_frozen = false;
  271. }else{
  272. if ($compute_type == ComputingEnum::ORDER_PAY) $is_frozen = false;
  273. if ($compute_type == ComputingEnum::ORDER_FINISH) $is_frozen = true;
  274. }
  275. $from_type = $extension['from_type'] ?? AgentEnum::ADDONS_NAME;
  276. foreach ($prize_list as $user_id => $item) {
  277. //渠道内购,商品抵扣
  278. if ($capital_type == ComputingEnum::TEAM_PRIZE && !empty($this->basic_conf['is_self_buy']) && !empty($this->basic_conf['enable_goods_deduct']) && $this->user_id == $user_id) {
  279. continue;
  280. }
  281. if (!empty($deduct_prize_list[$user_id]['deduct_money'])) $item['price'] -= $deduct_prize_list[$user_id]['deduct_money'];
  282. $item['price'] = bcmul($item['price'],1,2);
  283. if ($item['price'] > 0) {
  284. $prize_name = $type_map[$capital_type] ?? '未知资金类型';
  285. if($capital_type == ComputingEnum::TEAM_PRIZE){
  286. $item_prize_type = $item['prize_type'] ?? '';
  287. $prize_name = $item_prize_type == ComputingEnum::RECOMMEND_PRIZE ? $type_map[ComputingEnum::RECOMMEND_PRIZE] : $type_map[ComputingEnum::TEAM_PRIZE];
  288. }
  289. $order_desc = $this->order_detail['order_id'];
  290. if ($this->repurchase_reward && $user_id == $this->user_id) {
  291. $order_desc = "复购订单[{$this->order_detail['order_id']}]";
  292. }
  293. $desc = '用户(' . $user_id . '),获得订单(' . $order_desc . ')奖励,奖励类型:' . $prize_name . ',金额:' . ($this->is_additional_score ? '{{money}}' : $item['price']);
  294. // echo $desc.PHP_EOL;
  295. $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $user_id,
  296. 'is_frozen' => $is_frozen,
  297. 'wallet_type' => $this->commission_name_map[$this->name] ?? $this->name,
  298. 'money' => $item['price'],
  299. 'desc' => $desc,
  300. 'source_table' => $extension['source_table'] ?? '',
  301. 'source_table_id' => $extension['source_table_id'] ?? '',
  302. 'from_type' => $from_type,
  303. 'capital_type' => $capital_type,
  304. 'order_no' =>$this->order_detail['order_no'],
  305. 'contributor_name' =>$this->order_detail['goods_name'],
  306. 'contributor_id' =>$this->user_id,
  307. 'contributor_money' =>$this->order_detail['goods_price'],
  308. ];
  309. }
  310. }
  311. return $insert_wallet;
  312. }
  313. /**
  314. * @desc:获取投入资金队列的数据
  315. * @Author: hua
  316. * @Date: 2021/11/18
  317. * @Time: 15:46
  318. * @Copyright: copyright (c) 2021 广东七件事集团
  319. * @param $team_prize_list
  320. * @param $equal_prize_list
  321. * @param $extra_prize_list
  322. * @param $over_prize_list
  323. * @param $deduct_agent_prize_list
  324. * @return array
  325. */
  326. public function getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list)
  327. {
  328. }
  329. }