AgentReward.php 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  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 addons\Area\common\models\AreaRegional;
  14. use common\enums\AddonsEnum;
  15. use common\enums\GoodsTypeEnum;
  16. use common\enums\OrderStatusEnum;
  17. use common\enums\RedisKeyEnum;
  18. use common\enums\StatusEnum;
  19. use common\enums\UserWalletEnum;
  20. use common\helpers\LockHelper;
  21. use common\models\goods\Goods;
  22. use common\models\mall\Mall;
  23. use services\common\UserWalletService;
  24. use common\models\mall\MallAddons;
  25. use common\models\order\Order;
  26. use common\models\order\OrderDetail;
  27. use common\models\user\UserPartitionRelationship;
  28. use yii\db\Exception;
  29. /**
  30. * @desc 渠道奖励
  31. * Class AgentReward
  32. * @Author: hua
  33. * @DateTime: 2021/10/27 15:24
  34. * @Copyright: copyright (c) 2021 广东七件事集团
  35. * @package addons\Agent\common\logic\reward
  36. */
  37. class AgentReward extends AgentBase
  38. {
  39. public $level_config;//等级配置
  40. public $goods_config;//商品独立设置
  41. public $extension;//扩展
  42. public $order_detail = [];
  43. /**
  44. * @desc:等级配置
  45. * @Author: hua
  46. * @Date: 2021/10/28
  47. * @Time: 16:09
  48. * @Copyright: copyright (c) 2021 广东七件事集团
  49. * @return array
  50. */
  51. public function getLevelConfig()
  52. {
  53. $params['where'] = [['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]];
  54. $params['select'] = 'id,mall_id,level,name,is_auto_upgrade,upgrade_type_condition,checked_condition_values,checked_condition_keys,condition_type,
  55. upgrade_type_goods,buy_goods_type,goods_type,goods_ids,goods_list,explain,status';
  56. $name = $this->name;
  57. $mall_id = $this->mall_id;
  58. $params['with'] = ['commissionLevelSetting' => function ($query) use ($name, $mall_id) {
  59. $query->where(['commission_type' => $name, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED])
  60. ->select('id,mall_id,level,commission_type,from_type,is_percent_team,is_percent_equal,
  61. 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,is_repurchase_subsidy,repurchase_subsidy_condition');
  62. }];
  63. $agent_level_list = AgentLevel::lists($params);
  64. $config_arr = [];
  65. foreach ($agent_level_list as $item) {
  66. $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) : [];
  67. $item['commissionLevelSetting']['repurchase_subsidy_condition'] = !empty($item['commissionLevelSetting']['repurchase_subsidy_condition']) ? json_decode($item['commissionLevelSetting']['repurchase_subsidy_condition'],true) : [];
  68. $config_arr[$item['level']] = $item['commissionLevelSetting'];
  69. }
  70. $this->level_config = $config_arr;
  71. $where = [['item_id' => $this->order_detail['goods_id']], ['item_type' => 'goods'], ['commission_type' => $name], ['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]];
  72. $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,
  73. is_percent_drainage_subsidy,is_percent_team_subsidy,is_percent_recommend,is_enable_recommend,is_alone_agent_equal_prize,alone_agent_equal_prize_type,is_self_buy_alone,is_self_buy,enable_goods_deduct,is_equal_by_upgrade,is_enable_regular_bonus,extra';
  74. $with = ['detail' => function ($query) {
  75. $query->select('id,mall_id,agent_commission_item_setting_id,level,agent_team_prize,agent_equal_prize,agent_over_prize,agent_extra_prize,status,
  76. agent_drainage_subsidy_prize,agent_team_subsidy_prize,extra_equal_prize1,extra_equal_prize2,agent_recommend_prize,alone_agent_equal_prize_info');
  77. }];
  78. $agent_goods_setting = AgentCommissionItemSetting::getOne($where, true, $with, false, $select);
  79. if (!empty($agent_goods_setting)) {
  80. if ($agent_goods_setting['commission_type'] == $name && $agent_goods_setting['is_enable']) {
  81. $config_arr = [];
  82. foreach ($agent_goods_setting['detail'] as $val) {
  83. $config_arr[$val['level']] = [
  84. 'is_percent_team' => $agent_goods_setting['is_percent_team'],
  85. 'is_percent_equal' => $agent_goods_setting['is_percent_equal'],
  86. 'is_percent_over' => $agent_goods_setting['is_percent_over'],
  87. 'is_percent_extra' => $agent_goods_setting['is_percent_extra'],
  88. 'is_percent_drainage_subsidy' => $agent_goods_setting['is_percent_drainage_subsidy'],
  89. 'is_percent_team_subsidy' => $agent_goods_setting['is_percent_team_subsidy'],
  90. 'agent_team_prize' => $val['agent_team_prize'],
  91. 'agent_equal_prize' => $val['agent_equal_prize'],
  92. 'agent_over_prize' => $val['agent_over_prize'],
  93. 'agent_extra_prize' => $val['agent_extra_prize'],
  94. 'agent_drainage_subsidy_prize' => $val['agent_drainage_subsidy_prize'],
  95. 'agent_team_subsidy_prize' => $val['agent_team_subsidy_prize'],
  96. 'extra_equal_prize1' => $val['extra_equal_prize1'],
  97. 'extra_equal_prize2' => $val['extra_equal_prize2'],
  98. 'is_percent_recommend' => $agent_goods_setting['is_percent_recommend'] ?? 0,
  99. 'is_enable_recommend' => $agent_goods_setting['is_enable_recommend'] ?? 0,
  100. 'agent_recommend_prize' => $val['agent_recommend_prize'] ?? 0,
  101. 'is_alone_agent_equal_prize' => $agent_goods_setting['is_alone_agent_equal_prize'] ?? 0,
  102. 'alone_agent_equal_prize_info' => $val['alone_agent_equal_prize_info'] ? json_decode($val['alone_agent_equal_prize_info'],true) : [],
  103. ];
  104. if(isset($this->level_config[$val['level']]['is_repurchase_subsidy']) && isset($this->level_config[$val['level']]['repurchase_subsidy_condition'])){
  105. $config_arr[$val['level']]['is_repurchase_subsidy'] = $this->level_config[$val['level']]['is_repurchase_subsidy'];
  106. $config_arr[$val['level']]['repurchase_subsidy_condition'] = !empty($this->level_config[$val['level']]['repurchase_subsidy_condition']) ? $this->level_config[$val['level']]['repurchase_subsidy_condition'] : AgentEnum::getRepurchaseSubsidyConditionInitValue();
  107. }
  108. //开启独立平级奖 平级奖励类型改为独立平级奖的设置
  109. if(!empty($agent_goods_setting['is_alone_agent_equal_prize'])){
  110. $config_arr[$val['level']]['is_percent_equal'] = $agent_goods_setting['alone_agent_equal_prize_type'] ?? 0;
  111. }
  112. }
  113. $this->goods_config = $config_arr;
  114. }
  115. $this->basic_conf['is_equal_by_upgrade'] = $agent_goods_setting['is_equal_by_upgrade'] ?? 0;
  116. if(!empty($agent_goods_setting['is_self_buy_alone'])){
  117. $this->basic_conf['is_self_buy'] = $agent_goods_setting['is_self_buy'] ?? 0;
  118. $this->basic_conf['enable_goods_deduct'] = $agent_goods_setting['enable_goods_deduct'] ?? 0;
  119. }
  120. if($agent_goods_setting['commission_type'] == 'commission' && $agent_goods_setting['is_enable_regular_bonus'] == StatusEnum::ENABLED){
  121. if(class_exists($this->regular_bonus_handle_class)){
  122. $this->regular_bonus_handle_instance = new $this->regular_bonus_handle_class;
  123. $this->is_enable_regular_bonus = $this->regular_bonus_handle_instance->getAgentOrDistributionStatus($mall_id, AgentEnum::ADDONS_NAME);
  124. if($this->is_enable_regular_bonus && !empty($agent_goods_setting['extra'])){
  125. $extra = json_decode($agent_goods_setting['extra'], true);
  126. $regular_bonus_setting = $extra['RegularBonus'] ?? [];
  127. $regular_bonus_setting = $regular_bonus_setting['commission'] ?? [];
  128. $regular_goods_setting = $regular_bonus_setting;
  129. if(!empty($regular_bonus_setting)){
  130. $regular_goods_setting = [];
  131. foreach($regular_bonus_setting['detail'] as $value){
  132. $regular_goods_setting[$value['level']] = [
  133. 'is_percent_team' => $regular_bonus_setting['is_percent_team'],
  134. 'is_percent_equal' => $regular_bonus_setting['is_percent_equal'],
  135. 'is_percent_over' => $regular_bonus_setting['is_percent_over'],
  136. 'agent_team_prize' => $value['agent_team_prize'],
  137. 'agent_equal_prize' => $value['agent_equal_prize'],
  138. 'agent_over_prize' => $value['agent_over_prize'],
  139. ];
  140. }
  141. }
  142. $this->regular_bonus_goods_setting = $regular_goods_setting;
  143. }
  144. }
  145. }
  146. }
  147. return $config_arr;
  148. }
  149. /**
  150. * @desc:奖励规则
  151. * @Author: hua
  152. * @Date: 2021/10/28
  153. * @Time: 16:08
  154. * @Copyright: copyright (c) 2021 广东七件事集团
  155. * @return array
  156. */
  157. public function getRules(int $method = null)
  158. {
  159. $method = isset($method) ? $method : $this->basic_conf['computing_method']; // 不传则用默认的计算方式
  160. //0支付价格1商品售价2商品利润
  161. $money = $this->order_detail['goods_price']??0;
  162. $multiple = $this->order_detail['num'] ?? 1;
  163. switch ($method) {
  164. case ComputingEnum::COMPUTING_METHOD_PAY_PRICE:
  165. $adjust_money = $this->order_detail['adjust_money']??0;
  166. $money = $this->order_detail['goods_price']??0;
  167. $money = (($money+$adjust_money)/$multiple);
  168. break;
  169. case ComputingEnum::COMPUTING_METHOD_GOODS_PRICE:
  170. $money = $this->order_detail['original_goods_price']??0;
  171. $money = ($money/$multiple);
  172. break;
  173. case ComputingEnum::COMPUTING_METHOD_GOODS_PROFIT:
  174. $goods_price = $this->order_detail['goods_price']??0;
  175. $cost_price = $this->order_detail['cost_price']??0;
  176. $adjust_money = $this->order_detail['adjust_money']??0;
  177. $money = ($goods_price/$multiple) - $cost_price+$adjust_money/$multiple;
  178. if($money<0) $money= 0;
  179. break;
  180. }
  181. $extension = ['source_table' => 'order_detail', 'source_table_id' => $this->order_detail['id']??0, 'from_type' => AgentEnum::ADDONS_NAME];
  182. $this->extension = $extension;
  183. return ['money' => $money, 'multiple' => $multiple, 'extension' => $extension];
  184. }
  185. /**
  186. * @desc:记录每次触发奖励的相关配置
  187. * @Author: hua
  188. * @Date: 2021/11/18
  189. * @Time: 11:09
  190. * @Copyright: copyright (c) 2021 广东七件事集团
  191. */
  192. public function addRewardConfigLog()
  193. {
  194. $extension = $this->extension;
  195. $add_data['source_table'] = $extension['source_table'];
  196. $add_data['source_table_id'] = $extension['source_table_id'];
  197. $add_data['type'] = $this->name;
  198. $add_data['from_type'] = $extension['from_type'];
  199. $add_data['basic_config'] = !empty($this->basic_conf) ? json_encode($this->basic_conf) : '';
  200. $add_data['level_config'] = !empty($this->level_config) ? json_encode($this->level_config) : '';
  201. if (!empty($this->goods_config)) $add_data['goods_config'] = json_encode($this->goods_config);
  202. $agent_arr = [];
  203. foreach ($this->agent_list as $agent) {
  204. $agent_arr[$agent['id']] = [
  205. 'user_id' => $agent['user_id'],
  206. 'level' => $agent['level'],
  207. ];
  208. }
  209. $add_data['relation_ship'] = !empty($agent_arr) ? json_encode($agent_arr) : '';
  210. $add_data['mall_id'] = $this->mall_id;
  211. $add_data['status'] = StatusEnum::ENABLED;
  212. $res = AgentCommissionBasisLog::setData($add_data);
  213. if ($res == false) echo 'AgentReward:addRewardConfigLog:err:' . AgentCommissionBasisLog::getStaticError();
  214. }
  215. /**
  216. * @desc:组装数据
  217. * @Author: hua
  218. * @Date: 2021/11/18
  219. * @Time: 15:29
  220. * @Copyright: copyright (c) 2021 广东七件事集团
  221. * @param $capital_type //奖励类型
  222. * @param $compute_type //支付完成/订单完成结算
  223. * @param $prize_list //奖励列表
  224. * @param $extension //扩展列表
  225. * @param $deduct_prize_list //扣减奖励
  226. * @return array
  227. */
  228. public function packData($capital_type, $compute_type, $prize_list, $extension, $deduct_prize_list = [])
  229. {
  230. $type_map = ComputingEnum::getTypeMap();
  231. $insert_wallet = [];
  232. $is_frozen = true;
  233. $goods_id = $this->order_detail['goods_id'];
  234. $goods = Goods::findOne(['id'=>$goods_id]);
  235. // TODO: 渠道分红延时结算——判断是否是打开延时结算
  236. if (isset($this->basic_conf['compute_delay_day']) && !empty($this->basic_conf['compute_delay_day'])){
  237. $is_frozen = true;
  238. }else if($goods['goods_type']==GoodsTypeEnum::GoodsTypeVirtual){
  239. //虚拟商品,支付后-直接订单完成,所以直接结算
  240. $is_frozen = false;
  241. }else{
  242. if ($compute_type == ComputingEnum::ORDER_PAY) $is_frozen = false;
  243. if ($compute_type == ComputingEnum::ORDER_FINISH) $is_frozen = true;
  244. }
  245. $from_type = $extension['from_type'] ?? AgentEnum::ADDONS_NAME;
  246. //是否安装渠道业绩插件
  247. $is_install_agent_base = MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_AGENT_BASE);
  248. $goods_deduct = \Yii::$app->services->setting->mall->get($this->mall_id, 'order.goods_deduct');
  249. foreach ($prize_list as $user_id => $item) {
  250. //渠道内购,商品抵扣
  251. 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) {
  252. //没安装渠道分红插件或者订单设置-抵扣设置-内购抵扣选择渠道分红时
  253. if (!$is_install_agent_base || $goods_deduct != 'agent_base') {
  254. continue;
  255. }
  256. }
  257. if (!empty($deduct_prize_list[$user_id]['deduct_money'])) {
  258. $item['price'] = bcsub($item['price'], $deduct_prize_list[$user_id]['deduct_money'], 2); // 保留2位小数精度
  259. }
  260. $item['price'] = bcmul($item['price'],1,2);
  261. if ($item['price'] > 0) {
  262. $prize_name = $type_map[$capital_type] ?? '未知资金类型';
  263. if($capital_type == ComputingEnum::TEAM_PRIZE){
  264. $item_prize_type = $item['prize_type'] ?? '';
  265. $prize_name = $item_prize_type == ComputingEnum::RECOMMEND_PRIZE ? $type_map[ComputingEnum::RECOMMEND_PRIZE] : $type_map[ComputingEnum::TEAM_PRIZE];
  266. }
  267. $order_desc = $this->order_detail['order_id'];
  268. if ($this->repurchase_reward && $user_id == $this->user_id) {
  269. $order_desc = "复购订单[{$this->order_detail['order_id']}]";
  270. }
  271. $desc = '用户(' . $user_id . '),获得订单(' . $order_desc . ')奖励,奖励类型:' . $prize_name . ',金额:' . ($this->is_additional_score ? '{{money}}' : $item['price']);
  272. // echo $desc.PHP_EOL;
  273. $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $user_id,
  274. 'is_frozen' => $is_frozen,
  275. 'wallet_type' => $this->commission_name_map[$this->name] ?? $this->name,
  276. 'money' => $item['price'],
  277. 'desc' => $desc,
  278. 'source_table' => $extension['source_table'] ?? '',
  279. 'source_table_id' => $extension['source_table_id'] ?? '',
  280. 'from_type' => $from_type,
  281. 'capital_type' => $capital_type,
  282. 'order_no' =>$this->order_detail['order_no'],
  283. 'contributor_name' =>$this->order_detail['goods_name'],
  284. 'contributor_id' =>$this->user_id,
  285. 'contributor_money' =>$this->order_detail['goods_price'],
  286. ];
  287. }
  288. }
  289. return $insert_wallet;
  290. }
  291. /**
  292. * @desc:获取投入资金队列的数据
  293. * @Author: hua
  294. * @Date: 2021/11/18
  295. * @Time: 15:46
  296. * @Copyright: copyright (c) 2021 广东七件事集团
  297. * @param $team_prize_list
  298. * @param $equal_prize_list
  299. * @param $extra_prize_list
  300. * @param $over_prize_list
  301. * @param $deduct_agent_prize_list
  302. * @return array
  303. */
  304. public function getInsertWalletData($team_prize_list, $equal_prize_list, $extra_prize_list, $over_prize_list, $deduct_agent_prize_list)
  305. {
  306. $extension = $this->extension;
  307. $team_reward_arr = $this->packData(ComputingEnum::TEAM_PRIZE, $this->basic_conf['compute_type'], $team_prize_list, $extension, $deduct_agent_prize_list);
  308. $extra_reward_arr = $this->packData(ComputingEnum::EXTRA_PRIZE, $this->basic_conf['compute_type'], $extra_prize_list, $extension);
  309. $over_reward_arr = $this->packData(ComputingEnum::OVER_PRIZE, $this->basic_conf['compute_type'], $over_prize_list, $extension);
  310. $equal_reward_arr = $this->packData(ComputingEnum::EQUAL_PRIZE, $this->basic_conf['compute_type'], $equal_prize_list, $extension);
  311. return array_merge($team_reward_arr, $extra_reward_arr, $over_reward_arr, $equal_reward_arr);
  312. }
  313. public function teamAchievementExtra(){
  314. //结算按月结算渠道业绩额外奖励
  315. $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_AGENT_TEAM_ACHIEVEMENT);
  316. $identification = uniqid();
  317. $t = \Yii::$app->db->beginTransaction();
  318. try {
  319. if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new \Exception('业绩进入待结算,当前访问过多');
  320. $commission_type = 'commission';
  321. $text = $commission_type == 'commission' ? '佣金' : '积分';
  322. //加锁
  323. $time = time();
  324. $day = date('d', $time);
  325. if ($day != '01') throw new Exception('现在不是每月1号');
  326. $last_month = date('Y-m', strtotime("-1 month"));
  327. // $last_month ='2022-07';
  328. $mall_list = Mall::getEnableMallList(true);
  329. foreach ($mall_list as $mall) {
  330. $mall_id = $mall['id'];
  331. while (true){
  332. $agent_team_achievement_list = AgentTeamAchievement::find()->where(['mall_id' =>$mall_id, 'month' => $last_month,'is_settlement'=>0])->orderBy('created_at asc')->all();
  333. if(empty($agent_team_achievement_list)) break;
  334. $user_ids = array_column($agent_team_achievement_list, 'user_id');
  335. $agent_list = Agent::lists(['where' => [['user_id' => $user_ids], ['status' => StatusEnum::ENABLED]], 'index' => 'user_id'],false);
  336. $level_arr = array_column($agent_list, 'level');
  337. $where = [];
  338. $where[] = ['mall_id' => $mall_id];
  339. $where[] = ['level' => $level_arr];
  340. $where[] = ['status' => StatusEnum::ENABLED];
  341. $where[] = ['commission_type' => $commission_type];
  342. $agent_commission_level_setting = AgentCommissionLevelSetting::lists(['where' => $where, 'index' => 'level']);
  343. foreach ($agent_team_achievement_list as $agent_team_achievement) {
  344. $insert_wallet = [];
  345. $total_performance = $agent_team_achievement['personal_performance'] + $agent_team_achievement['team_performance'];
  346. if (isset($agent_list[$agent_team_achievement['user_id']])) {
  347. $agent = $agent_list[$agent_team_achievement['user_id']];
  348. if (isset($agent_commission_level_setting[$agent['level']])) {
  349. $team_achievement_rate = $agent_commission_level_setting[$agent['level']]['team_achievement'];
  350. $commission_nums = bcdiv($total_performance * $team_achievement_rate, 100, 2);
  351. $agent_team_achievement->rate = $team_achievement_rate;
  352. $agent_team_achievement->level = $agent['level'];
  353. if ($commission_nums >0){
  354. $capital_type = UserWalletEnum::TEAM_ACHIEVEMENT_EXTRA;
  355. $prize_name = $type_map[$capital_type] ?? '渠道业绩额外奖励';
  356. $desc = '用户(' . $agent['user_id'] . '),获得奖励,奖励类型:' . $prize_name . ',' . $text . ':' . $commission_nums;
  357. // echo $desc.PHP_EOL;
  358. $insert_wallet [] = ['mall_id' => $mall_id, 'user_id' => $agent['user_id'],
  359. 'is_frozen' => false,
  360. 'wallet_type' => $commission_type,
  361. 'money' => $commission_nums,
  362. 'desc' => $desc,
  363. 'source_table' => AgentTeamAchievement::tableName(),
  364. 'source_table_id' => $agent_team_achievement['id'],
  365. 'from_type' => AddonsEnum::ADDONS_NAME_AGENT,
  366. 'capital_type' => $capital_type,
  367. 'order_no' => $agent_team_achievement['id'],
  368. 'contributor_name' => '',
  369. 'contributor_id' => 0,
  370. 'contributor_money' => $total_performance,
  371. ];
  372. $res = UserWalletService::batchHandleByQueue($insert_wallet);
  373. if (empty($res)) throw new \Exception(UserWalletService::getStaticError());
  374. $field = 'total_' . $commission_type;
  375. $agent->$field += $commission_nums;
  376. $res = $agent->save();
  377. if ($res == false) throw new \Exception(Agent::getStaticError());
  378. }
  379. }
  380. }
  381. $agent_team_achievement->is_settlement = 1;
  382. $res = $agent_team_achievement->save();
  383. var_dump($res);
  384. if (empty($res)) throw new \Exception($agent_team_achievement->getErrorMessage());
  385. }
  386. }
  387. }
  388. LockHelper::uLock($lock_key,$identification);
  389. $t->commit();
  390. return true;
  391. } catch (Exception $e) {
  392. var_dump($e->getMessage());
  393. $t->rollBack();
  394. LockHelper::uLock($lock_key,$identification);
  395. return false;
  396. }
  397. }
  398. public function areaData($mall_id,$user_id,$money,$basic_config){
  399. // 判断用户插件是否安装
  400. if (MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_AREA) == 0) return [];
  401. $config = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_AREA, 'basic');
  402. if (empty($config['is_enable'])) return [];
  403. $basic_config['is_equal'] = $config['is_equal'];
  404. $basic_config['is_level'] = $config['is_level'];
  405. $order_detail_list = [$this->order_detail];
  406. $order = Order::findOne($this->order_detail['order_id']);
  407. $province_id = $order['province'];
  408. $city_id = $order['city'];
  409. $district_id = $order['area'];
  410. $town_id = $order['town'];
  411. $community_id = $order['community']; // 小区
  412. $goods_ids = array_column($order_detail_list,'goods_id');
  413. $res = Goods::findOne(['id'=>$goods_ids,'goods_type'=>GoodsTypeEnum::GoodsTypeVirtual]);
  414. if(!empty($res)){
  415. $user_address = UserAddress::findOne(['user_id'=>$order['user_id'],'status'=>StatusEnum::ENABLED,'is_default'=>1]);
  416. if(!empty($user_address)){
  417. $province_id = $user_address['province_id'];
  418. $city_id = $user_address['city_id'];
  419. $district_id = $user_address['district_id'];
  420. $town_id = $user_address['town_id'];
  421. $community_id = $user_address['community_id']; // 小区
  422. }
  423. }
  424. $regional_id = 0; // 大区ID
  425. if (!empty($province_id)) {
  426. $like_conditions = ['%,'. $province_id, '%,'. $province_id. ',%', $province_id. ',%'];
  427. $regional = AreaRegional::getOne([['or like', 'province_ids', $like_conditions, false], ['status' => StatusEnum::ENABLED], ['mall_id' => $order['mall_id']]]);
  428. !empty($regional) && $regional_id = $regional['id'];
  429. }
  430. $result = [];
  431. foreach ($order_detail_list as $order_detail) {
  432. $last_level = 0;
  433. $order_detail['order_no'] = $order['order_no'];
  434. $area_agent_reward_obj = new AreaReward($mall_id, $user_id, $money,$basic_config);
  435. $area_agent_reward_obj->order_detail = $order_detail;
  436. if ($community_id > 0) { // 没有小区的时候那么就不做处理
  437. $result = array_merge($result,$area_agent_reward_obj->addFrozenCommission(AreaEnum::COMMUNITY, $last_level, $community_id));
  438. }
  439. $result = array_merge($result,$area_agent_reward_obj->addFrozenCommission(AreaEnum::TOWN, $last_level, $town_id));
  440. $result = array_merge($result,$area_agent_reward_obj->addFrozenCommission(AreaEnum::DISTRICT, $last_level, $district_id));
  441. $result = array_merge($result,$area_agent_reward_obj->addFrozenCommission(AreaEnum::CITY, $last_level, $city_id));
  442. $result = array_merge($result,$area_agent_reward_obj->addFrozenCommission(AreaEnum::PROVINCE, $last_level, $province_id));
  443. !empty($regional_id) && $result = array_merge($result,$area_agent_reward_obj->addFrozenCommission(AreaEnum::REGIONAL, $last_level, $regional_id)); // 大区代内容
  444. }
  445. return $result;
  446. }
  447. public function obtainInsertWalletData($team_prize_list, $equal_prize_list, $over_prize_list, $deduct_agent_prize_list)
  448. {
  449. $extension = $this->extension;
  450. $team_reward_arr = $this->organizeData(ComputingEnum::TEAM_PRIZE, $team_prize_list, $extension, $deduct_agent_prize_list);
  451. $over_reward_arr = $this->organizeData(ComputingEnum::OVER_PRIZE, $over_prize_list, $extension);
  452. $equal_reward_arr = $this->organizeData(ComputingEnum::EQUAL_PRIZE, $equal_prize_list, $extension);
  453. return array_merge($team_reward_arr, $over_reward_arr, $equal_reward_arr);
  454. }
  455. public function organizeData($capital_type, $prize_list, $extension, $deduct_prize_list = [])
  456. {
  457. $type_map = ComputingEnum::getTypeMap();
  458. $insert_wallet = [];
  459. $is_frozen = true;
  460. $from_type = AddonsEnum::ADDONS_NAME_REGULAR_BONUS. '_'. AgentEnum::ADDONS_NAME;
  461. foreach ($prize_list as $user_id => $item) {
  462. if (!empty($deduct_prize_list[$user_id]['deduct_money'])) $item['price'] -= $deduct_prize_list[$user_id]['deduct_money'];
  463. $item['price'] = bcmul($item['price'],1,2);
  464. if ($item['price'] > 0) {
  465. $prize_name = $type_map[$capital_type] ?? '未知资金类型';
  466. if($capital_type == ComputingEnum::TEAM_PRIZE){
  467. $item_prize_type = $item['prize_type'] ?? '';
  468. $prize_name = $item_prize_type == ComputingEnum::RECOMMEND_PRIZE ? $type_map[ComputingEnum::RECOMMEND_PRIZE] : $type_map[ComputingEnum::TEAM_PRIZE];
  469. }
  470. $order_desc = $this->order_detail['order_id'];
  471. $desc = '用户(' . $user_id . '),获得订单(' . $order_desc . ')奖励,奖励类型:' . $prize_name . ',金额:' . ($this->is_additional_score ? '{{money}}' : $item['price']);
  472. // echo $desc.PHP_EOL;
  473. $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $user_id,
  474. 'is_frozen' => $is_frozen,
  475. 'wallet_type' => $this->commission_name_map[$this->name] ?? $this->name,
  476. 'money' => $item['price'],
  477. 'desc' => $desc,
  478. 'source_table' => $extension['source_table'] ?? '',
  479. 'source_table_id' => $extension['source_table_id'] ?? '',
  480. 'from_type' => $from_type,
  481. 'capital_type' => $capital_type,
  482. 'order_no' =>$this->order_detail['order_no'],
  483. 'contributor_name' =>$this->order_detail['goods_name'],
  484. 'contributor_id' =>$this->user_id,
  485. 'contributor_money' =>$this->order_detail['goods_price'],
  486. ];
  487. }
  488. }
  489. return $insert_wallet;
  490. }
  491. public function handleRepurchaseSubsidy($mall_id, $user_id, $config)
  492. {
  493. $month_start_at = strtotime(date('Y-m-01 00:00:00',time()));
  494. $month_end_at = strtotime(date('Y-m-t 23:59:59',time()));
  495. $repurchase_subsidy_prize_list1 = [];
  496. $repurchase_subsidy_prize_list2 = [];
  497. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  498. $parent_id_arr = array_reverse($parent_id_arr);
  499. $where = ['user_id' => $parent_id_arr, 'mall_id' => $mall_id, 'status' => StatusEnum::ENABLED];
  500. $addons_agent_list = Agent::find()->where($where)->indexBy('user_id')->all();//查询经销商列表
  501. $agent_list = [];
  502. foreach ($parent_id_arr as $key => $parent_id) {
  503. if (!empty($addons_agent_list[$parent_id])) $agent_list[$key+1] = $addons_agent_list[$parent_id];//按照关系排序
  504. }
  505. foreach($agent_list as $key => $agent){
  506. if(!isset($config[$agent->level])) continue;
  507. if(!isset($config[$agent->level]['is_repurchase_subsidy'])) continue;
  508. if(empty($config[$agent->level]['is_repurchase_subsidy'])) continue;
  509. if(!isset($config[$agent->level]['repurchase_subsidy_condition'])) continue;
  510. if(is_string($config[$agent->level]['repurchase_subsidy_condition'])){
  511. $config[$agent->level]['repurchase_subsidy_condition'] = json_decode($config[$agent->level]['repurchase_subsidy_condition'],true);
  512. }
  513. if(!isset($config[$agent->level]['repurchase_subsidy_condition']['condition_goods_ids']) || empty($config[$agent->level]['repurchase_subsidy_condition']['condition_goods_ids'])) continue;
  514. if($config[$agent->level]['repurchase_subsidy_condition']['before_layer'] > 0 && $config[$agent->level]['repurchase_subsidy_condition']['after_layer'] > 0){
  515. $buy_count = OrderDetail::find()->where(['user_id' => $agent->user_id, 'goods_id' => $config[$agent->level]['repurchase_subsidy_condition']['condition_goods_ids']])
  516. ->andWhere(['>=','order_status', OrderStatusEnum::PAY])
  517. ->andWhere(['between','created_at',$month_start_at, $month_end_at])
  518. ->count();
  519. if($buy_count <= 0) continue;
  520. $prize = 0;
  521. if($key <= $config[$agent->level]['repurchase_subsidy_condition']['before_layer']){
  522. $prize= $config[$agent->level]['repurchase_subsidy_condition']['subsidy_reward1'] ?? 0;
  523. $prize = bcmul($prize, $this->order_detail['num'] ?? 1, 2);
  524. if($prize > 0){
  525. $repurchase_subsidy_prize_list1[$agent->user_id] = ['price' => $prize, 'agent_id' => $agent->id, 'agent_level' => $agent->level];
  526. }
  527. }else if($key >= $config[$agent->level]['repurchase_subsidy_condition']['after_layer'] + 1){
  528. $prize= $config[$agent->level]['repurchase_subsidy_condition']['subsidy_reward2'] ?? 0;
  529. $prize = bcmul($prize, $this->order_detail['num'] ?? 1, 2);
  530. if($prize > 0){
  531. $repurchase_subsidy_prize_list2[$agent->user_id] = ['price' => $prize, 'agent_id' => $agent->id, 'agent_level' => $agent->level];
  532. }
  533. }
  534. }
  535. }
  536. return compact('repurchase_subsidy_prize_list1', 'repurchase_subsidy_prize_list2');
  537. }
  538. }