DeductionMarketing.php 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace common\logic\order\marketing;
  3. use common\enums\AddonsEnum;
  4. use common\enums\AppEnum;
  5. use common\models\mall\MallAddons;
  6. use common\models\user\UserWallet;
  7. use yii\helpers\Json;
  8. class DeductionMarketing extends BaseMarketing
  9. {
  10. public function execute($form)
  11. {
  12. // TODO: Implement execute() method.
  13. }
  14. /**
  15. * 订单抵扣计算
  16. * @params $item
  17. * @params $form
  18. * @params $extra
  19. * @return array
  20. * @throws \Exception
  21. */
  22. public static function compute($item, &$form, &$extra = [])
  23. {
  24. $mall_id = $item['mch_order_info']['mall_id'];
  25. // 判断后台设置是否开启积分抵扣
  26. $is_score_setting_status = \Yii::$app->services->setting->mall->get($mall_id, 'order.is_score_deduct_status');
  27. if (!$is_score_setting_status) return $item;
  28. // 获取配置名称
  29. $score_name = \Yii::$app->services->setting->mall->get($mall_id, 'score.score_name');
  30. // 获取设置抵扣选项
  31. $score_deduct_value_list = \Yii::$app->services->setting->mall->get($mall_id, 'order.score_deduct_value_list');
  32. if ($score_deduct_value_list) $score_deduct_value_list = json_decode($score_deduct_value_list, true);
  33. if (!$score_deduct_value_list) return $item;
  34. // 获取抵扣比率
  35. $score_setting_ratio = \Yii::$app->services->setting->mall->get($mall_id, 'score.score_deduct_ratio');
  36. $score_deduct_status = \Yii::$app->services->setting->mall->get($mall_id, 'score.score_deduct_status');
  37. if (!$score_deduct_status) $score_setting_ratio = 1; // 当积分抵扣关闭时 积分抵扣比率默认为1
  38. // 判断是否有积分抵扣
  39. $is_score = $form->marketing['deduct']['score'];
  40. if ($is_score) return $item;
  41. $is_distributor = $form->marketing['deduct']['agent_deduct'];
  42. $is_member_price = $form->marketing['deduct']['member_price'];
  43. // 判断用户是否是积分抵扣或者经销商抵扣
  44. if (!$is_distributor && !$is_member_price) return $item;
  45. if (in_array('distributor', $score_deduct_value_list) && $is_distributor) {// 经销商内购商品抵扣
  46. // 检查是否安装经销商内购插件
  47. if (!MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_AGENT)) return $item;
  48. $member_price = abs($is_distributor['money']);
  49. $des_string = 'agent_deduct';
  50. } elseif (in_array('member', $score_deduct_value_list) && $is_member_price) {// 用户折扣抵扣
  51. // 因为用户价前面设置了负号所以此处转为正数
  52. $member_price = abs($is_member_price['money']);
  53. $des_string = 'member';
  54. } else {
  55. return $item;
  56. }
  57. // 获取用户总积分
  58. $where[] = ['user_id' => $form['user_id'], 'mall_id' => $mall_id];
  59. $user_score = UserWallet::getOne($where, false, [], false, 'score');
  60. $can_use_score = $user_score->score;
  61. // 根据会员折扣扣除对于积分(积分 = 会员价 * 折扣比率)
  62. $deduct_score = bcmul($member_price, $score_setting_ratio, 2);
  63. // 判断是否订单提交时访问
  64. if ($form['action'] == AppEnum::ACTION_CREATE) { // 订单生成访问
  65. if ($deduct_score > $can_use_score) {
  66. throw new \Exception($score_name . '不足无法购买');
  67. }
  68. }
  69. foreach ($item['goods'] as &$goods) {
  70. foreach ($goods['goods_details'] as $k => &$detail) {
  71. $detail['marketing']['deduct_score'] = $deduct_score;
  72. // 积分扣减详情
  73. $detail['marketing']['deduct_currency'] = json_encode(['offset' => ['score' => $deduct_score, 'score_deduct_ratio' => $score_setting_ratio, 'desc' => $des_string]]);
  74. }
  75. }
  76. $item['mch_order_info']['score'] = $deduct_score;
  77. $item['mch_order_info']['score_money'] = $member_price;
  78. $form->marketing['deduct']['offset'] = [
  79. 'name' => $score_name . '抵扣',
  80. 'money' => -($deduct_score),
  81. ];
  82. return $item;
  83. }
  84. }