| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- <?php
- namespace common\logic\order\marketing;
- use common\enums\AddonsEnum;
- use common\enums\AppEnum;
- use common\models\mall\MallAddons;
- use common\models\user\UserWallet;
- use yii\helpers\Json;
- class DeductionMarketing extends BaseMarketing
- {
- public function execute($form)
- {
- // TODO: Implement execute() method.
- }
- /**
- * 订单抵扣计算
- * @params $item
- * @params $form
- * @params $extra
- * @return array
- * @throws \Exception
- */
- public static function compute($item, &$form, &$extra = [])
- {
- $mall_id = $item['mch_order_info']['mall_id'];
- // 判断后台设置是否开启积分抵扣
- $is_score_setting_status = \Yii::$app->services->setting->mall->get($mall_id, 'order.is_score_deduct_status');
- if (!$is_score_setting_status) return $item;
- // 获取配置名称
- $score_name = \Yii::$app->services->setting->mall->get($mall_id, 'score.score_name');
- // 获取设置抵扣选项
- $score_deduct_value_list = \Yii::$app->services->setting->mall->get($mall_id, 'order.score_deduct_value_list');
- if ($score_deduct_value_list) $score_deduct_value_list = json_decode($score_deduct_value_list, true);
- if (!$score_deduct_value_list) return $item;
- // 获取抵扣比率
- $score_setting_ratio = \Yii::$app->services->setting->mall->get($mall_id, 'score.score_deduct_ratio');
- $score_deduct_status = \Yii::$app->services->setting->mall->get($mall_id, 'score.score_deduct_status');
- if (!$score_deduct_status) $score_setting_ratio = 1; // 当积分抵扣关闭时 积分抵扣比率默认为1
- // 判断是否有积分抵扣
- $is_score = $form->marketing['deduct']['score'];
- if ($is_score) return $item;
- $is_distributor = $form->marketing['deduct']['agent_deduct'];
- $is_member_price = $form->marketing['deduct']['member_price'];
- // 判断用户是否是积分抵扣或者经销商抵扣
- if (!$is_distributor && !$is_member_price) return $item;
- if (in_array('distributor', $score_deduct_value_list) && $is_distributor) {// 经销商内购商品抵扣
- // 检查是否安装经销商内购插件
- if (!MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_AGENT)) return $item;
- $member_price = abs($is_distributor['money']);
- $des_string = 'agent_deduct';
- } elseif (in_array('member', $score_deduct_value_list) && $is_member_price) {// 用户折扣抵扣
- // 因为用户价前面设置了负号所以此处转为正数
- $member_price = abs($is_member_price['money']);
- $des_string = 'member';
- } else {
- return $item;
- }
- // 获取用户总积分
- $where[] = ['user_id' => $form['user_id'], 'mall_id' => $mall_id];
- $user_score = UserWallet::getOne($where, false, [], false, 'score');
- $can_use_score = $user_score->score;
- // 根据会员折扣扣除对于积分(积分 = 会员价 * 折扣比率)
- $deduct_score = bcmul($member_price, $score_setting_ratio, 2);
- // 判断是否订单提交时访问
- if ($form['action'] == AppEnum::ACTION_CREATE) { // 订单生成访问
- if ($deduct_score > $can_use_score) {
- throw new \Exception($score_name . '不足无法购买');
- }
- }
- foreach ($item['goods'] as &$goods) {
- foreach ($goods['goods_details'] as $k => &$detail) {
- $detail['marketing']['deduct_score'] = $deduct_score;
- // 积分扣减详情
- $detail['marketing']['deduct_currency'] = json_encode(['offset' => ['score' => $deduct_score, 'score_deduct_ratio' => $score_setting_ratio, 'desc' => $des_string]]);
- }
- }
- $item['mch_order_info']['score'] = $deduct_score;
- $item['mch_order_info']['score_money'] = $member_price;
- $form->marketing['deduct']['offset'] = [
- 'name' => $score_name . '抵扣',
- 'money' => -($deduct_score),
- ];
- return $item;
- }
- }
|