/**
     * 领取优惠券
     * @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 日
如果觉得我的文章对你有用,请随意赞赏