Loading... ``` /** * 领取优惠券 * @param array $params * @return void * @throws \Es3\Exception\ErrorException * Created by PhpStorm * User:jill * Date:2022/11/10 * Time:13:27 */ public function addCoupon(array $params): void { /** 声明变量 **/ $couponIds = $params['coupon_ids'] ?? []; $customerId = $params['customer_id'] ?? 0; $storeId = $params['store_id'] ?? 0; $couponDetails = []; //领取的数量集合 $endIds = []; //记录发放完毕 /**获取优惠券**/ $where = ['id' => $couponIds, 'activity_status' => 'ING', 'store_id' => $storeId]; $coupons = $this->getDao()->getCouponList($where); $couponsGroup = ArrayUtility::groupBy($coupons, 'id'); /** 获取这个客户领取记录 **/ $logs = (new CouponDetailDao())->getCouponDetailLogsCountGroup(['marketing_coupon_id' => $couponIds, 'store_id' => $storeId, 'customer_id' => $customerId]); $logsGroup = ArrayUtility::groupByArray($logs, ['marketing_coupon_id', 'store_id', 'customer_id']); /** 查询用户使用量 **/ $details = (new CouponDetailDao())->getCouponDetailCountGroup(['marketing_coupon_id' => $couponIds]); $detailsGroup = ArrayUtility::groupBy($details, 'marketing_coupon_id'); /** 遍历要领取的优惠券 **/ foreach ($couponIds as $couponId) { /** 防止刷券 **/ if (superEmpty($couponsGroup[$couponId][0])) { Logger::getInstance()->console("{$couponId}_不好意思 你是来刷券的吧 !!!!"); continue; } /** 声明变量 **/ $circulation = $couponsGroup[$couponId][0]['circulation'] ?? 0;//发行量 $eachLimit = $couponsGroup[$couponId][0]['each_limit'] ?? 0;//每人限制领取数量 $useCount = $detailsGroup[$couponId][0]['count'] ?? 0; //领取量 $surplus = $circulation - $useCount; //剩余数量 $key = $couponId . "_" . $storeId . "_" . $customerId; $logNum = $logsGroup[$couponId . "_" . $storeId . "_" . $customerId] [0]['count']; //领取过的数量 /** 剩余量小于1 不在领取该优惠券**/ if ($surplus < 1) { $endIds[] = $couponId; Logger::getInstance()->console("{$key}剩余量小于1 不在领取该优惠券"); continue; } /** 剩余量小于限购数量领取量等于剩余数量 **/ if ($surplus < $eachLimit) { $eachLimit = $surplus; } /** 领取过的数量大于领取数量则不在领取 **/ if ($logNum > $eachLimit) { Logger::getInstance()->console("{$key}领取过的数量{$logNum}大于领取数量{$eachLimit}则不在领取"); continue; } /** 把限制领取数量的优惠券直接全部发给用户 **/ for ($i = 0; $i < $eachLimit; $i++) { $couponDetails[] = [ "marketing_coupon_id" => $couponId, "app_code" => $params['app_code'], "customer_id" => $customerId, "store_id" => $storeId, ]; } } /** 发放完毕记录一下 **/ if ($endIds) { $this->update(['is_surplus' => 1], ["id" => [$endIds, "IN"]]); } /** 用户真实领取优惠券 **/ if ($couponDetails) { (new CouponDetailDao())->insertAll($couponDetails); } } ```` ` ``` /** * 领取优惠券 * GET /app/coupon/add * @throws \Throwable */ public function addCoupon(): void { /** @var $result Result */ $result = ContextManager::getInstance()->get(AppConst::DI_RESULT); /** 获取参数 */ $params = $this->getParams(); /** 增加业务锁 **/ Lock::redisLock(MarketingConstant::COUPON_ADD_LOCK_PREFIX, $params['coupon_ids']); /** 开启事务 */ DbManager::getInstance()->startTransaction(); try { /** 业务逻辑 */ $this->getService()->addCoupon($params); /** 提交事物 */ DbManager::getInstance()->commit(); /** 解除业务锁 **/ Lock::redisLock(MarketingConstant::COUPON_ADD_LOCK_PREFIX, $params['coupon_ids'], false); /** 成功返回 */ $result->set(ResultConst::RESULT_DATA_KEY, []); Json::success(); } catch (Throwable $throwable) { /** 事务回滚 */ DbManager::getInstance()->rollback(); /** 解除业务锁 **/ Lock::redisLock(MarketingConstant::COUPON_ADD_LOCK_PREFIX, $params['coupon_ids'], false); /** 失败返回 */ Json::fail($throwable, $throwable->getCode(), $throwable->getMessage()); } } ``` 最后修改:2022 年 11 月 10 日 02 : 05 PM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 ×Close 赞赏作者 扫一扫支付 支付宝支付 微信支付