AreaReward.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <?php
  2. namespace addons\Area\common\logic\reward;
  3. use addons\Agent\common\enums\ComputingEnum;
  4. use addons\Area\common\enums\AreaEnum;
  5. use addons\Area\common\models\AreaCommissionItemSetting;
  6. use addons\Store\common\models\StoreGoodsExtra;
  7. use addons\Store\common\models\StoreSettings;
  8. use common\enums\AddonsEnum;
  9. use common\enums\GoodsTypeEnum;
  10. use common\enums\StatusEnum;
  11. use common\enums\UserWalletEnum;
  12. use common\models\goods\Goods;
  13. use common\models\mall\MallAddons;
  14. /**
  15. * @desc 经销商奖励
  16. * Class AgentReward
  17. * @Author: hua
  18. * @DateTime: 2021/10/27 15:24
  19. * @Copyright: copyright (c) 2021 广东七件事集团
  20. * @package addons\Agent\common\logic\reward
  21. */
  22. class AreaReward extends AreaBase
  23. {
  24. public $order_detail = [];
  25. public $extension;//扩展
  26. public $source_table ='order_detail';
  27. /**
  28. * @desc:等级配置
  29. * @Author: hua
  30. * @Date: 2021/10/28
  31. * @Time: 16:09
  32. * @Copyright: copyright (c) 2021 广东七件事集团
  33. * @return array
  34. */
  35. public function getLevelConfig()
  36. {
  37. $config_arr = $this->basic_conf;
  38. if ($this->name == 'score' || $this->name == 'digital') {
  39. $config_arr['regional_equal_prize'] = $config_arr['regional_equal_prize_' . $this->name] ?? 0;
  40. $config_arr['province_equal_prize'] = $config_arr['province_equal_prize_' . $this->name] ?? 0;
  41. $config_arr['city_equal_prize'] = $config_arr['city_equal_prize_' . $this->name] ?? 0;
  42. $config_arr['district_equal_prize'] = $config_arr['district_equal_prize_' . $this->name] ?? 0;
  43. $config_arr['town_equal_prize'] = $config_arr['town_equal_prize_' . $this->name] ?? 0;
  44. $config_arr['community_equal_prize'] = $config_arr['community_equal_prize_' . $this->name] ?? 0;
  45. $config_arr['regional_team_prize'] = $config_arr['regional_team_prize_' . $this->name] ?? 0;
  46. $config_arr['province_team_prize'] = $config_arr['province_team_prize_' . $this->name] ?? 0;
  47. $config_arr['city_team_prize'] = $config_arr['city_team_prize_' . $this->name] ?? 0;
  48. $config_arr['district_team_prize'] = $config_arr['district_team_prize_' . $this->name] ?? 0;
  49. $config_arr['town_team_prize'] = $config_arr['town_team_prize_' . $this->name] ?? 0;
  50. $config_arr['community_team_prize'] = $config_arr['community_team_prize_' . $this->name] ?? 0;
  51. }
  52. $name = $this->name;
  53. $config_arr['is_percent_team'] = $config_arr['is_percent_equal'] = 0;//默认百分比
  54. $config_arr['commission_type'] = $name;//默认佣金
  55. $where = [['item_id' => $this->order_detail['goods_id'], 'item_type' => 'goods', 'commission_type' => $name, 'status' => StatusEnum::ENABLED]];
  56. $select = 'id,mall_id,is_enable,item_id,item_type,commission_type,is_percent_team,is_percent_equal,status';
  57. $with = ['detail' => function ($query) {
  58. $query->select('id,mall_id,area_commission_item_setting_id,level,agent_team_prize,agent_equal_prize,status');
  59. }];
  60. $agent_goods_setting = AreaCommissionItemSetting::getOne($where, true, $with, false, $select);
  61. if (!empty($agent_goods_setting)) {
  62. if ($agent_goods_setting['commission_type'] == $name && $agent_goods_setting['is_enable']) {
  63. foreach ($agent_goods_setting['detail'] as $val) {
  64. switch ($val['level']) {
  65. case AreaEnum::PROVINCE:
  66. $config_arr['province_team_prize'] = $val['agent_team_prize'];
  67. $config_arr['province_equal_prize'] = $val['agent_equal_prize'];
  68. break;
  69. case AreaEnum::CITY:
  70. $config_arr['city_team_prize'] = $val['agent_team_prize'];
  71. $config_arr['city_equal_prize'] = $val['agent_equal_prize'];
  72. break;
  73. case AreaEnum::DISTRICT:
  74. $config_arr['district_team_prize'] = $val['agent_team_prize'];
  75. $config_arr['district_equal_prize'] = $val['agent_equal_prize'];
  76. break;
  77. case AreaEnum::TOWN:
  78. // 没有镇级别的情况下 那么镇级别无需奖励
  79. $config_arr['town_team_prize'] = $val['agent_team_prize'];
  80. $config_arr['town_equal_prize'] = $val['agent_equal_prize'];
  81. break;
  82. case AreaEnum::COMMUNITY:
  83. $config_arr['community_team_prize'] = $val['agent_team_prize'];
  84. $config_arr['community_equal_prize'] = $val['agent_equal_prize'];
  85. break;
  86. case AreaEnum::REGIONAL:
  87. $config_arr['regional_team_prize'] = $val['agent_team_prize'];
  88. $config_arr['regional_equal_prize'] = $val['agent_equal_prize'];
  89. break;
  90. }
  91. }
  92. $config_arr['is_enable'] = $agent_goods_setting['is_enable'];
  93. $config_arr['is_percent_team'] = $agent_goods_setting['is_percent_team'];
  94. $config_arr['is_percent_equal'] = $agent_goods_setting['is_percent_equal'];
  95. $config_arr['commission_type'] = $agent_goods_setting['commission_type'];
  96. }
  97. }
  98. return $config_arr;
  99. }
  100. /**
  101. * @desc:奖励规则
  102. * @Author: hua
  103. * @Date: 2021/10/28
  104. * @Time: 16:08
  105. * @Copyright: copyright (c) 2021 广东七件事集团
  106. * @return array
  107. */
  108. public function getRules()
  109. {
  110. $area_compute_type = 1;
  111. if (!empty($this->basic_conf['area_compute_type'])) {
  112. $area_compute_type = $this->basic_conf['area_compute_type'];
  113. }
  114. $multiple = $this->order_detail['num'] ?? 1;
  115. $money = $this->order_detail['goods_price'];
  116. switch ($area_compute_type) {
  117. case 1:
  118. //实际支付金额
  119. $money = $this->order_detail['goods_price'] ?? 0;
  120. $adjust_money = $this->order_detail['adjust_money']??0;
  121. $money = (($money+$adjust_money)/$multiple);
  122. break;
  123. case 2:
  124. //商品售价
  125. $money = $this->order_detail['original_goods_price'] ?? 0;
  126. $money = ($money/$multiple);
  127. break;
  128. case 3:
  129. ///商品利润
  130. $goods_price = $this->order_detail['goods_price'] ?? 0;
  131. $cost_price = $this->order_detail['cost_price'] ?? 0;
  132. $adjust_money = $this->order_detail['adjust_money'] ?? 0;
  133. $money = ($goods_price/$multiple) - $cost_price + $adjust_money/$multiple;
  134. if($money<0) $money= 0;
  135. break;
  136. }
  137. $extension = ['source_table' => $this->source_table, 'source_table_id' => $this->order_detail['id'], 'from_type' => AddonsEnum::ADDONS_NAME_AREA];
  138. $this->extension = $extension;
  139. return ['money' => $money, 'multiple' => $multiple, 'extension' => $extension];
  140. }
  141. /**
  142. * @desc:获取投入资金队列的数据
  143. * @Author: hua
  144. * @Date: 2021/11/18
  145. * @Time: 15:46
  146. * @Copyright: copyright (c) 2021 广东七件事集团
  147. * @param $team_prize_list
  148. * @param $equal_prize_list
  149. * @return array
  150. */
  151. public function getInsertWalletData($team_prize_list, $equal_prize_list)
  152. {
  153. $level = 0;
  154. $levels = array_column($team_prize_list, 'level');
  155. if (!empty($levels)) {
  156. $level = $levels[0];
  157. }
  158. $extension = $this->extension;
  159. $capital_type1 = AreaEnum::TEAM_PRIZE;
  160. if ($this->name == 'score') $capital_type1 = UserWalletEnum::AREA_SCORE;
  161. $team_reward_arr = $this->packData($capital_type1, $this->basic_conf['compute_type'], $team_prize_list, $extension, $level);
  162. $equal_reward_arr = $this->packData(AreaEnum::EQUAL_PRIZE, $this->basic_conf['compute_type'], $equal_prize_list, $extension, $level);
  163. return array_merge($team_reward_arr, $equal_reward_arr);
  164. }
  165. public function packData($capital_type, $compute_type, $prize_list, $extension, $level)
  166. {
  167. $type_map = AreaEnum::getTypeMap();
  168. $insert_wallet = [];
  169. $is_frozen = true;
  170. $goods_id = $this->order_detail['goods_id'];
  171. $goods = Goods::findOne(['id' => $goods_id]);
  172. if (isset($goods)&&$goods['goods_type'] == GoodsTypeEnum::GoodsTypeVirtual) {
  173. //虚拟商品,支付后-直接订单完成,所以直接结算
  174. $is_frozen = false;
  175. } else {
  176. if ($compute_type == AreaEnum::ORDER_PAY) $is_frozen = false;
  177. if ($compute_type == AreaEnum::ORDER_FINISH) $is_frozen = true;
  178. }
  179. $from_type = $extension['from_type'] ?? AddonsEnum::ADDONS_NAME_AREA;
  180. foreach ($prize_list as $item) {
  181. $user_id = $item['user_id'];
  182. if (!empty($deduct_prize_list[$user_id]['deduct_money'])) $item['price'] -= $deduct_prize_list[$user_id]['deduct_money'];
  183. $item['price'] = bcmul($item['price'], 1, 2);
  184. if ($item['price'] > 0) {
  185. $prize_name = $type_map[$capital_type] ?? '未知资金类型';
  186. $prize_name_source = AreaEnum::getLevelMap($level, $this->mall_id);
  187. $desc = '用户(' . $user_id . '),获得订单(' . $this->order_detail['order_id'] . ')奖励,奖励类型:' . $prize_name . '[' . $prize_name_source . ']';
  188. if(isset($item['equal_prize_deep']))$desc .= '平' . $item['equal_prize_deep'];
  189. $desc .= ',金额:' . $item['price'];
  190. // echo $desc.PHP_EOL;
  191. $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $user_id,
  192. 'is_frozen' => $is_frozen, 'wallet_type' => $this->name, 'money' => $item['price'],
  193. 'desc' => $desc,
  194. 'source_table' => $extension['source_table'] ?? '',
  195. 'source_table_id' => $extension['source_table_id'] ?? '',
  196. 'from_type' => $from_type,
  197. 'capital_type' => $capital_type,
  198. 'order_no' => $this->order_detail['order_no'],
  199. 'contributor_name' => $this->order_detail['goods_name'],
  200. 'contributor_id' => $this->user_id,
  201. 'contributor_money' => $this->order_detail['goods_price'],
  202. 'extra1'=>$item['equal_area_agent']??[],
  203. ];
  204. }
  205. }
  206. return $insert_wallet;
  207. }
  208. public function computeServiceCharge($order)
  209. {
  210. $platform_ratio= 0;
  211. $is_update = false;
  212. // 门店
  213. $store_settings = StoreSettings::getOne([['store_id' => $order['store_id']]]);
  214. $basic = \Yii::$app->services->setting->addons->get($order['mall_id'], AddonsEnum::ADDONS_NAME_STORE, 'basic');
  215. $alone_setting = StoreGoodsExtra::find()->where([
  216. 'status' => StatusEnum::ENABLED,
  217. 'store_id' => $order['store_id'],
  218. 'mall_id' => $order['mall_id'],
  219. 'goods_id' => $order['goods_id']
  220. ])
  221. ->asArray()
  222. ->one();
  223. $alone_service_fee_setting = json_decode($alone_setting['service_fee_setting'], true);
  224. $price = $order['goods_price'];
  225. if ($alone_service_fee_setting && $alone_service_fee_setting['is_alone'] == 1) {
  226. //商品独立配置
  227. $platform_ratio = $alone_service_fee_setting['service_fee_ratio'];
  228. $is_update = true;
  229. } else if (isset($store_settings['store_service_fee'])) {
  230. //门店独立配置
  231. if (!empty($store_settings['store_service_fee'])) {
  232. $platform_ratio = $store_settings['store_service_ratio'] ?? 0;
  233. $is_update = true;
  234. }
  235. $service_fee_settle_type = $store_settings['store_service_fee_settle_type'] ?? 1;
  236. } else {
  237. //公共配置
  238. if (!empty($basic['service_fee'])) {
  239. $platform_ratio = $basic['service_fee_type'] == 1 ? $basic['max_platform_ratio'] : ($basic['platform_ratio'] ?? 0);
  240. $is_update = true;
  241. }
  242. $service_fee_settle_type = $basic['service_fee_settle_type'] ?? 1;
  243. }
  244. if($service_fee_settle_type == 2){
  245. $price = $order['original_goods_price'];
  246. }elseif($service_fee_settle_type == 3){
  247. $price = $order['cost_price'];
  248. }
  249. return bcdiv($price * $platform_ratio,100,2);
  250. }
  251. }