255], [['receive_platform'], 'string', 'max' => 25], [['mch_id'], 'string'], [['store_id'], 'safe'], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => '商城ID', 'user_id' => '会员ID', 'coupon_id' => '优惠券ID', 'coupon_status' => '优惠券状态', 'status' => 'Status', 'is_giving' => '优惠券是否已转赠', 'giving_status' => '转赠状态', 'receive_type' => '领取场景', 'receive_platform' => '领取平台', 'is_force_failure' => '是否已被强制失效', 'is_send_reward' => '是否已发放奖励', 'give_time'=>'转赠次数', 'created_at' => 'Created At', 'updated_at' => 'Updated At', 'start_time' => '有效期开始时间', 'end_time' => '有效期结束时间', 'is_use' => '是否已使用', 'mch_id' => '商户id', ]; } /** * @return ActiveQueryInterface the relational query object. */ public function getUser() { return $this->hasOne(User::class, ['id' => 'user_id']); } /** * 商品 * @return \yii\db\ActiveQuery */ public function getCoupon() { return $this->hasOne(AddonsCoupon::class, ['id' => 'coupon_id']); // ->where(['status' => StatusEnum::ENABLED]); } /** * 保存数据 * @Author: zhengjianhua * @DateTime: 2021/12/18 0018 11:13 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $params * @return AddonsCoupon|bool * @throws \yii\db\Exception */ public static function setData($params) { $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_COUPON , $params['coupon_id']); $identification = uniqid(); $t = Yii::$app->db->beginTransaction(); try { if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new Exception('当前访问人数过多'); $where[] = ['id' => $params['coupon_id'], 'mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]; $coupon_model = AddonsCoupon::getOne($where); if (empty($coupon_model)) throw new Exception('该优惠券不存在'); if($coupon_model["coupon_status"]==AddonsCouponEnum::STATUS_NOT_BEGIN) throw new Exception('该优惠券不能领取'); if($coupon_model["coupon_status"]==AddonsCouponEnum::STATUS_EXPIRED) throw new Exception('该优惠券已过期'); if($coupon_model["coupon_status"]==AddonsCouponEnum::STATUS_FAILURE) { $message = '该优惠券已失效'; // 判断用户是否领取过优惠券 $counts = self::find()->where(['mall_id' => $params['mall_id'],'user_id' => $params['user_id'],'coupon_id' => $params['coupon_id']])->count(); if ($counts) { $message = '您已领取过优惠券'; } throw new Exception($message); } if ($coupon_model["total_count"] <= 0){ $coupon_model->status = StatusEnum::DISABLED; $coupon_model->save(); $t->commit(); throw new Exception('该优惠券被领完啦'); } if ($params['num'] > $coupon_model['total_count']){ throw new Exception('该优惠券数量不足'); } if($coupon_model['is_receive_limit']){ $counts= self::find()->where(['mall_id'=>$params['mall_id'],'user_id'=>$params['user_id'],'coupon_id'=>$params['coupon_id']])->count(); if(($counts+$params['num'])>$coupon_model['receive_count'])throw new Exception('每人只可以领取'.$coupon_model['receive_count'].'张'); } if($coupon_model['is_member']){ $member_relate_list = AddonsCouponMemberRelate::lists(['where'=>[['mall_id'=>$params['mall_id']],['coupon_id'=>$coupon_model['id']]], 'select' => 'member_level']); $level_arr = array_column($member_relate_list,'member_level'); if(!in_array($params['user']['level'],$level_arr))throw new Exception('该优惠券指定会员等级'); } $time = time(); switch ($coupon_model['expire_type']){ case AddonsCouponEnum::EXPIRE_TYPE2: $params['start_time'] = $coupon_model['begin_at']; $params['end_time'] = $coupon_model['end_at']; break; case AddonsCouponEnum::EXPIRE_TYPE1: $params['start_time'] = $time; $params['end_time'] = $coupon_model['expire_day'] * 86400 + $time; break; case AddonsCouponEnum::EXPIRE_TYPE3: $params['start_time'] = $coupon_model['effect_days'] * 86400 + $time; $params['end_time'] = $coupon_model['expire_day'] * 86400 + $params['start_time']; break; default: throw new Exception('有效期时间设置不对'); } $coupon_user_relate = null; if (!empty($params['coupon_id'])) { $insert = []; $remind_datas = []; $now = time(); for ($i = 0; $i < $params['num']; $i++) { $insert[] = [ $params['mall_id'], $params['user_id'], $params['coupon_id'], $coupon_model['coupon_status'], 1, $params['start_time'], $params['end_time'], 0, 0, 0, AddonsCouponEnum::getSendFromMap($params['receive_type'], $params['mall_id']), $params['receive_platform'], 0, 0, $now, $now,$coupon_model['mch_id'] ]; $remind_datas[] = [$params['mall_id'], $params['user_id'], $params['coupon_id'], $params['end_time'], 1, 1, $now, $now]; } $field = ['mall_id','user_id','coupon_id', 'coupon_status', 'status','start_time','end_time','is_use','is_giving','giving_status', 'receive_type','receive_platform', 'is_force_failure','is_send_reward', 'created_at', 'updated_at','mch_id']; // 批量插入数据 $res = Yii::$app->db->createCommand()->batchInsert(self::tableName(), $field, $insert)->execute(); if($res==false) throw new Exception('领取失败'); $coupon_user_relate = AddonsCouponUserRelate::getOne([ [ 'user_id'=>$params['user_id']], ['mall_id'=>$params['mall_id']], ['coupon_id'=>$params['coupon_id']] ],true,[],'id desc'); $total_count = $coupon_model->total_count - $params['num']; $coupon_model->total_count = $total_count >= 0 ? $total_count : 0; $res = $coupon_model->save(); if($res==false) throw new Exception('领取失败 ' . $coupon_model->getErrotMessage()); if (1 == $coupon_model->is_remind && !empty($remind_datas)) { $remind_fields = ['mall_id', 'user_id', 'coupon_id', 'expire_time', 'status', 'send_status', 'created_at', 'updated_at']; $remind_table_name = (new AddonsCouponRemind())->tableSchema->name; Yii::$app->db->createCommand()->batchInsert($remind_table_name, $remind_fields, $remind_datas)->execute(); } } LockHelper::ulock($lock_key,$identification); $t->commit(); return $coupon_user_relate; } catch (Exception $e) { LockHelper::ulock($lock_key,$identification); $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } /** * @desc:领取别人赠与 * @Author: hua * @Date: 2021/12/24 * @Time: 17:38 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $params * @return AddonsCoupon|false|null */ public static function receiveByGive($params) { $t = Yii::$app->db->beginTransaction(); try { $share_log_model = AddonsCouponShareLog::findOne(['id'=>$params['coupon_share_log_id']]); if (empty($share_log_model)) throw new Exception('未找到转赠记录'); $params['user_coupon_id'] = $share_log_model->user_coupon_id; $where[] = ['id' => $params['user_coupon_id'], 'mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED]; $coupon_user_relate_model = AddonsCouponUserRelate::getOne($where); if (empty($coupon_user_relate_model)) throw new Exception('该优惠券不存在'); if ($coupon_user_relate_model['user_id'] == $params['user_id']) throw new Exception('不能领取自己分享的优惠券'); if($coupon_user_relate_model["coupon_status"]==AddonsCouponEnum::STATUS_EXPIRED) throw new Exception('该优惠券已过期'); if($coupon_user_relate_model["coupon_status"]==AddonsCouponEnum::STATUS_FAILURE) throw new Exception('该优惠券已失效'); if($coupon_user_relate_model["is_use"]==1) throw new Exception('该优惠券已被赠送者使用'); if($coupon_user_relate_model["is_giving"]==0) throw new Exception('该优惠券没有被赠送者送出'); if($coupon_user_relate_model["giving_status"]==AddonsCouponEnum::GIVING_STATUS2) throw new Exception('该优惠券已被领取'); $coupon_model = AddonsCoupon::findOne(['id'=>$coupon_user_relate_model['coupon_id']]); if($coupon_model['is_member']){ $member_relate_list = AddonsCouponMemberRelate::lists(['where'=>[['mall_id'=>$params['mall_id']],['coupon_id'=>$coupon_model['id']]], 'select' => 'member_level']); $level_arr = array_column($member_relate_list,'member_level'); $receiveUserInfo = User::findOne(['id' => $params['user_id']]); if(!in_array($receiveUserInfo['level'],$level_arr))throw new Exception('该优惠券指定会员等级'); } if (1 == $coupon_model['is_receive_limit']) { $received_counts = AddonsCouponUserRelate::find() ->where(['mall_id' => $params['mall_id'], 'user_id' => $params['user_id'], 'status' => StatusEnum::ENABLED, 'coupon_id' => $coupon_model['id']]) ->andWhere(['or', ['is_giving' => 0], ['is_giving' => 1, 'giving_status' => [AddonsCouponEnum::GIVING_STATUS0,AddonsCouponEnum::GIVING_STATUS1]]]) ->count(); if(!empty($params['direct_gift'])){ if ($coupon_model['receive_count'] > 0 && $received_counts >= $coupon_model['receive_count']) throw new Exception('对方已经领取过了'); }else{ if ($coupon_model['receive_count'] > 0 && $received_counts >= $coupon_model['receive_count']) throw new Exception('你已经领取过了'); } } $now = time(); if(!empty($coupon_model->store_id)){ $coupon_user_model = new StoreCouponUserRelate(); $coupon_user_model->from_type = 1; }else{ $coupon_user_model = new self(); $coupon_user_model->mch_id = $coupon_model->mch_id; } $coupon_user_model->mall_id = $params['mall_id']; $coupon_user_model->user_id = $params['user_id']; $coupon_user_model->coupon_id = $coupon_user_relate_model['coupon_id']; $coupon_user_model->coupon_status = $coupon_user_relate_model['coupon_status']; $coupon_user_model->status = 1; $coupon_user_model->start_time = $coupon_user_relate_model['start_time']; $coupon_user_model->end_time = $coupon_user_relate_model['end_time']; $coupon_user_model->is_use = 0; $coupon_user_model->is_giving = 0; $coupon_user_model->giving_status = 0; $coupon_user_model->receive_type = AddonsCouponEnum::getSendFromMap(AddonsCouponEnum::SEND_FROM6, $params['mall_id']).',赠送者ID:'.$share_log_model->giving_user_id; $coupon_user_model->receive_platform = $params['receive_platform']; $coupon_user_model->is_force_failure = 0; $coupon_user_model->is_send_reward = 0; $coupon_user_model->created_at = $now; $coupon_user_model->updated_at = $now; $coupon_user_model->store_id = !empty($coupon_model->store_id) ? $coupon_model->store_id : 0; $res = $coupon_user_model->save(); if($res==false) throw new Exception($coupon_user_model->getErrorMessage()); $share_data = [ 'mall_id' => $params['mall_id'], 'coupon_share_log_id' => $params['coupon_share_log_id'], 'get_user_coupon_id' => $coupon_user_model->id, 'receive_user_id' => $params['user_id'], ]; $res = AddonsCouponShareLog::setData($share_data); if($res==false) throw new Exception($share_log_model->getErrorMessage()); $coupon_user_relate_model->giving_status = AddonsCouponEnum::GIVING_STATUS2; $coupon_user_relate_model->coupon_status = AddonsCouponEnum::STATUS_FAILURE; $res = $coupon_user_relate_model->save(); if($res==false) throw new Exception('更新赠送者优惠券状态失败'); if (1 == $coupon_model['is_remind']) { $remind_datas[] = [$params['mall_id'], $params['coupon_id'], $params['user_id'], $coupon_user_relate_model['end_time'], 1, 1, $now, $now]; $remind_fields = ['mall_id', 'coupon_id', 'user_id', 'expire_time', 'status', 'send_status', 'created_at', 'updated_at']; $remind_table_name = (new AddonsCouponRemind())->tableSchema->name; Yii::$app->db->createCommand()->batchInsert($remind_table_name, $remind_fields, $remind_datas)->execute(); } $t->commit(); return $coupon_user_model; } catch (Exception $e) { $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } /** * 更新 * @param $params * @return bool */ public static function updateData($params) { try { $count = self::updateAll($params['fields'], ['coupon_id' => $params['coupon_id'], 'user_id' => $params['user_id']]); if (!$count) return false; return true; } catch (Exception $e) { self::$static_error = $e->getMessage(); return false; } } /** * 转送 * @param $params * @return bool * @throws \yii\db\Exception */ /* public static function transfer($params) { $t = \Yii::$app->db->beginTransaction(); try { $model = self::findOne($params['user_coupon_id']); if (empty($model)) throw new Exception('查无数据'); $model->status = StatusEnum::DELETE; $model->save(); $data = [ 'coupon_id' => $model->coupon_id, 'user_id' => $params['user_id'], 'is_use' => 0, 'from' => ReceiveTypeEnum::TRANSFER, 'extra' => '来源user_coupon_id是:' . $params['user_coupon_id'], 'end_time' => $params['end_time'], ]; $model = new self(); if (!$model->load($data, '') || !$model->save()) throw new Exception($model->getErrorMessage()); $model->save(); $t->commit(); return true; } catch (Exception $e) { $t->rollBack(); self::$static_error = $e->getMessage(); return false; } } */ /** * @desc:购买商品赠送优惠券 * @Author: hua * @Date: 2021/12/3 * @Time: 15:42 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $mall_id * @param $goods_ids * @param $user_id * @param string $order_id * @param int $order_status * @return false */ public static function BuyGoodsGiveCoupon($mall_id, $goods_ids, $user_id,$order_id='', $order_status = OrderStatusEnum::ACCOMPLISH) { try { $is_install = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_COUPON); if (!$is_install) return false; $params = [ 'where'=>[['mall_id' => $mall_id],['item_id' => $goods_ids],[ 'is_enable' => 1],['status' => StatusEnum::ENABLED], ['item_type' => 'goods']], 'with'=>['detail'=>function($query){ $query->where(['status'=>StatusEnum::ENABLED]); }], ]; $give_item_setting_list = CouponGiveItemSetting::lists($params); if (empty($give_item_setting_list)) return false; $give_coupon_arr = []; foreach ($give_item_setting_list as $give_item_setting) { // 如果当前订单状态为完成,但是仅限于支付完成赠送或者当前订单状态为支付,但是仅限于订单完成赠送,那么就不执行赠送 if ($order_status == OrderStatusEnum::ACCOMPLISH && $give_item_setting['send_type'] == StatusEnum::ENABLED || $order_status == OrderStatusEnum::PAY && $give_item_setting['send_type'] == StatusEnum::DISABLED) continue; foreach ($give_item_setting['detail'] as $item) { if (isset($give_coupon_arr[$item['coupon_id']])) { $give_coupon_arr[$item['coupon_id']] += $item['num']; } else { $give_coupon_arr[$item['coupon_id']] = $item['num']; } } } if (count($give_coupon_arr) > 0) { $res = self::giveCoupon($mall_id,$user_id,$give_coupon_arr,AddonsCouponEnum::SEND_FROM2,'platform'); if($res==false) throw new \Exception('购买商品-订单完成order_id'.$order_id.'-赠送优惠券失败'); } } catch (\Exception $e) { self::setStaticError($e->getMessage()); return false; } } //订单满额赠送 public static function FullAmountGiveCoupon($mall_id, $user_id, $config = '', $order_id = '' ) { try { $is_install = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_COUPON); if (!$is_install) return false; if (empty($config)) return false; $config = json_decode($config, true); if (empty($config['multiple_selection'])) return false; $params = [ 'where'=>[['mall_id' => $mall_id],['item_id' => $order_id],[ 'is_enable' => 0],['status' => StatusEnum::ENABLED], ['item_type' => 'order']], ]; $give_item_setting_list = CouponGiveItemSetting::lists($params); if (!empty($give_item_setting_list)) return false; $give_coupon_arr = []; foreach ($config['multiple_selection'] as $key => $value) { $give_coupon_arr[$value['relevant_id']] = $value['num']; } if (!empty($give_coupon_arr)) { $res = self::giveCoupon($mall_id,$user_id,$give_coupon_arr,AddonsCouponEnum::SEND_FROM18,'platform'); if($res===false) throw new \Exception('订单满额赠送order_id'.$order_id.'-赠送优惠券失败'); } $result = Yii::$app->db->createCommand()->insert(CouponGiveItemSetting::tableName(),[ 'mall_id' => $mall_id, 'item_id' => $order_id, 'is_enable' => 0, 'status' => StatusEnum::ENABLED, 'item_type' => 'order', 'send_type' => 0, 'created_at' => time(), 'updated_at' => time()])->execute(); } catch (\Exception $e) { self::setStaticError($e->getMessage()); print_r($e->getMessage()); return false; } } /** * @desc:赠送优惠券 * @Author: hua * @Date: 2021/12/6 * @Time: 11:33 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $mall_id * @param $user_id * @param $give_coupon_arr //$give_coupon_arr=['coupon_id'=>'num']; * @param $receive_type * @param $receive_platform * @return array|bool */ public static function giveCouponOld($mall_id, $user_id,$give_coupon_arr,$receive_type =2,$receive_platform='platform') { $trans = Yii::$app->db->beginTransaction(); $locks = []; try { $is_install = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_COUPON); if (!$is_install) throw new Exception('优惠券并未安装'); $coupon_id_arr = array_keys($give_coupon_arr); $coupon_list = AddonsCoupon::findAll(['mall_id' => $mall_id, 'id' => $coupon_id_arr, 'status' => StatusEnum::ENABLED, 'coupon_status' => AddonsCouponEnum::STATUS_RECEIVING]); if (empty($coupon_list)) throw new Exception('暂无可用优惠券'); $user = User::findOne(['id' => $user_id]); $can_give_coupon_arr = []; $time = time(); foreach ($coupon_list as $coupon) { $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_COUPON , $coupon['id']); $identification = uniqid(); if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new Exception('当前访问人数过多'); $locks[$lock_key] = $identification; if ($coupon['expire_type'] == 2 && $coupon['end_at'] <= $time) continue; if ($coupon['total_count'] <= 0) continue; $member_level_arr = array_column($coupon['memberRelate'], 'level'); if(!empty($member_level_arr)&&!in_array($user['level'], $member_level_arr))continue; $time = time(); switch ($coupon['expire_type']){ case AddonsCouponEnum::EXPIRE_TYPE2: $start_time = $time; $end_time = $coupon['end_at']; break; case AddonsCouponEnum::EXPIRE_TYPE1: $start_time = $time; $end_time = $coupon['expire_day'] * 86400 + $time; break; case AddonsCouponEnum::EXPIRE_TYPE3: $start_time = $coupon['effect_days'] * 86400 + $time; $end_time = $coupon['expire_day'] * 86400 + $start_time; break; default: throw new Exception('有效期时间设置不对'); } $can_give_coupon_arr[$coupon['id']] = [ 'num' => $give_coupon_arr[$coupon['id']], 'start_time' => $start_time, 'end_time' => $end_time, 'total_count' => $coupon['total_count'], 'name' => $coupon['name'], 'coupon_status' => $coupon['coupon_status'], ]; } $field = ['mall_id','user_id','coupon_id', 'coupon_status', 'status','start_time','end_time','is_use','is_giving','giving_status', 'receive_type','receive_platform', 'is_force_failure','is_send_reward', 'created_at', 'updated_at']; $insert = []; foreach ($can_give_coupon_arr as $coupon_id => $item) { $num = $item['num']; if($item['total_count']<$item['num']) $num = $item['total_count']; for ($i = 0; $i < $num; $i++) { $insert[] = [ $mall_id, $user_id, $coupon_id, $item['coupon_status'], StatusEnum::ENABLED, $item['start_time'], $item['end_time'], 0, 0, 0, AddonsCouponEnum::getSendFromMap($receive_type, $mall_id), $receive_platform, 0, 0, $time, $time, ]; } $coupon_model = AddonsCoupon::findOne(['id'=>$coupon_id]); $coupon_model->total_count -= $num; $res = $coupon_model->save(); if($res==false) throw new \Exception('赠送优惠券失败'); } if (!empty($insert)) { $res = Yii::$app->db->createCommand()->batchInsert(AddonsCouponUserRelate::tableName(), $field, $insert)->execute(); if ($res==false) { throw new \Exception('赠送优惠券失败'); } } $trans->commit(); LockHelper::batchUlock($locks); return $can_give_coupon_arr; } catch (\Exception $e) { $trans->rollBack(); LockHelper::batchUlock($locks); self::setStaticError($e->getMessage()); return false; } } public static function giveCoupon($mall_id, $user_id,$give_coupon_arr,$receive_type =2,$receive_platform='platform') { $trans = Yii::$app->db->beginTransaction(); $locks = []; try { $is_install = MallAddons::isInstall($mall_id, AddonsEnum::ADDONS_NAME_COUPON); if (!$is_install) throw new Exception('优惠券并未安装'); $coupon_id_arr = array_keys($give_coupon_arr); $coupon_list = AddonsCoupon::findAll(['mall_id' => $mall_id, 'id' => $coupon_id_arr, 'status' => StatusEnum::ENABLED, 'coupon_status' => AddonsCouponEnum::STATUS_RECEIVING]); if (empty($coupon_list)) throw new Exception('暂无可用优惠券'); $user = User::findOne(['id' => $user_id]); $can_give_coupon_arr = []; $time = time(); foreach ($coupon_list as $coupon) { $lock_key = RedisKeyEnum::suffix(RedisKeyEnum::LOCK_COUPON , $coupon['id']); $identification = uniqid(); if (!LockHelper::lock($lock_key, $identification, 30, 60)) throw new Exception('当前访问人数过多'); $locks[$lock_key] = $identification; if ($coupon['expire_type'] == 2 && $coupon['end_at'] <= $time) continue; if ($coupon['total_count'] <= 0) continue; $member_level_arr = array_column($coupon['memberRelate'], 'level'); if(!empty($member_level_arr)&&!in_array($user['level'], $member_level_arr))continue; $time = time(); switch ($coupon['expire_type']){ case AddonsCouponEnum::EXPIRE_TYPE2: $start_time = $time; $end_time = $coupon['end_at']; break; case AddonsCouponEnum::EXPIRE_TYPE1: $start_time = $time; $end_time = $coupon['expire_day'] * 86400 + $time; break; case AddonsCouponEnum::EXPIRE_TYPE3: $start_time = $coupon['effect_days'] * 86400 + $time; $end_time = $coupon['expire_day'] * 86400 + $start_time; break; default: throw new Exception('有效期时间设置不对'); } if(!empty($coupon['store_id'])){ $give_destination = StoreCouponUserRelate::tableName(); // $give_destination_model = StoreCouponUserRelate::find(); }else{ $give_destination = AddonsCouponUserRelate::tableName(); // $give_destination_model = AddonsCouponUserRelate::find(); // //获取用户已领取的数量 // $user_have_num = $give_destination_model->where(['status' => StatusEnum::ENABLED, 'coupon_id' => $coupon['id'], 'mall_id' => $mall_id, 'user_id' => $user_id])->count(); // //如果优惠券限制可领取数量,用户已领取的优惠券超过限制数量则跳过领取 // if ($coupon['is_receive_limit'] == 1 && $user_have_num >= $coupon['receive_count']) continue; } $can_give_coupon_arr[$coupon['id']] = [ 'num' => $give_coupon_arr[$coupon['id']], 'start_time' => $start_time, 'end_time' => $end_time, 'total_count' => $coupon['total_count'], 'name' => $coupon['name'], 'store_id' => $coupon['store_id'], 'coupon_status' => $coupon['coupon_status'], 'give_destination' => $give_destination, ]; } $field = ['mall_id','user_id','coupon_id', 'coupon_status', 'status','start_time','end_time','is_use','is_giving','giving_status', 'receive_type','receive_platform', 'is_force_failure','is_send_reward', 'created_at', 'updated_at']; $insert = []; $insert_store = []; foreach ($can_give_coupon_arr as $coupon_id => $item) { switch ($item['give_destination']){ case AddonsCouponUserRelate::tableName(): $num = $item['num']; if($item['total_count']<$item['num']) $num = $item['total_count']; for ($i = 0; $i < $num; $i++) { $insert[] = [ $mall_id, $user_id, $coupon_id, $item['coupon_status'], StatusEnum::ENABLED, $item['start_time'], $item['end_time'], 0, 0, 0, AddonsCouponEnum::getSendFromMap($receive_type, $mall_id), $receive_platform, 0, 0, $time, $time, ]; } break; case StoreCouponUserRelate::tableName(): $num = $item['num']; if($item['total_count']<$item['num']) $num = $item['total_count']; for ($i = 0; $i < $num; $i++) { $insert_store[] = [$mall_id, $item['store_id'],1,$user_id, $coupon_id, $item['coupon_status'], StatusEnum::ENABLED, $item['start_time'], $item['end_time'], 0, 0, 0, AddonsCouponEnum::getSendFromMap($receive_type, $mall_id), $receive_platform, 0, 0, $time, $time, ]; } break; } $coupon_model = AddonsCoupon::findOne(['id'=>$coupon_id]); $coupon_model->total_count -= $num; $res = $coupon_model->save(); if($res==false) throw new \Exception('赠送优惠券失败'); } if (!empty($insert)) { $res = Yii::$app->db->createCommand()->batchInsert(AddonsCouponUserRelate::tableName(), $field, $insert)->execute(); if ($res==false) { throw new \Exception('赠送优惠券失败'); } } if (!empty($insert_store)) { $field = ['mall_id', 'store_id', 'from_type', 'user_id', 'coupon_id', 'coupon_status', 'status', 'start_time', 'end_time', 'is_use', 'is_giving', 'giving_status', 'receive_type', 'receive_platform', 'is_force_failure', 'is_send_reward', 'created_at', 'updated_at']; // 批量插入数据 $res = Yii::$app->db->createCommand()->batchInsert(StoreCouponUserRelate::tableName(), $field, $insert_store)->execute(); } $trans->commit(); LockHelper::batchUlock($locks); return $can_give_coupon_arr; } catch (\Exception $e) { $trans->rollBack(); LockHelper::batchUlock($locks); self::setStaticError($e->getMessage()); return false; } } /** * @notes:优惠券状态处理 * @param $params * @return bool * @throws \yii\db\Exception * @author: lun * @Time: 2022/10/27 9:45 */ public static function handle($params) { $trans = Yii::$app->db->beginTransaction(); try { $model = self::findOne(['mall_id' => $params['mall_id'], 'id' => $params['id'], 'status' => StatusEnum::ENABLED]); if (empty($model)) throw new Exception('查无此数据'); if ($params['status'] == StatusEnum::DELETE) { $model->status = $params['status']; $model->is_force_failure = StatusEnum::ENABLED; } if (!$model->save()) throw new \yii\db\Exception($model->getErrorMessage()); $trans->commit(); return true; } catch (Exception $e) { $trans->rollBack(); self::setData($e->getMessage()); return false; } } //直接赠送 public static function giveCouponBy2($params){ $t = Yii::$app->db->beginTransaction(); try { $mall_id = $params['mall_id']; $coupon_id = $params['coupon_id']; $user_id = $params['user_id']; $user_coupon_id = $params['user_coupon_id']; $receive_user_id = $params['receive_user_id']; $receive_platform = $params['receive_platform']; $num = $params['num']; $config = \Yii::$app->services->setting->addons->get($mall_id, AddonsEnum::ADDONS_NAME_COUPON, 'basic'); if(!empty($config['give_type'])&&$config['give_type']==2){ // $coupon = AddonsCoupon::findOne(['mall_id' => $mall_id, 'id' => $coupon_id, 'coupon_status' => 2, 'status' => StatusEnum::ENABLED]); $coupon = AddonsCoupon::findOne(['mall_id' => $mall_id, 'id' => $coupon_id]); if (empty($coupon)) { throw new Exception('优惠券不存在或者已经失效'); } if (1 != $coupon->is_giving) { throw new Exception('优惠券不可转赠'); } $params = [ 'mall_id' => $mall_id, 'coupon_id' => $coupon_id, 'user_coupon_id' => $user_coupon_id, 'giving_user_id' => $user_id, ]; $res = AddonsCouponShareLog::setData($params); if($res==false) throw new Exception(AddonsCouponShareLog::getStaticError()); $params = [ 'mall_id'=>$mall_id, 'coupon_share_log_id'=>$res['id'], 'coupon_id' => $coupon_id, 'user_id'=>$receive_user_id, 'num'=>$num, 'receive_platform'=>$receive_platform, 'direct_gift'=>1, ]; $res = AddonsCouponUserRelate::receiveByGive($params); if($res==false) throw new Exception(AddonsCouponUserRelate::getStaticError()); }else{ throw new Exception('不支持该赠送方式'); } $t->commit(); return $res; }catch (Exception $e){ $t->rollBack(); throw new Exception($e->getMessage()); } } public static function fixMchId(){ $list = AddonsCouponUserRelate::lists([ 'where' => [ ['>', 'mall_id', 0] ], 'select' => 'coupon_id', 'group' => 'coupon_id' ]); $coupon_ids = array_column($list, 'coupon_id'); $coupon_list = AddonsCoupon::lists(['where' => [['id' => $coupon_ids], ['<>', 'mch_id', '']], 'select' => 'id,mch_id']); foreach ($coupon_list as $item) { $res = AddonsCouponUserRelate::updateAll(['mch_id' => $item['mch_id']], ['coupon_id' => $item['id']]); var_dump($res); } } }