diff --git a/app/common/dao/store/coupon/StoreCouponUserDao.php b/app/common/dao/store/coupon/StoreCouponUserDao.php index 23b23d48..72e04073 100644 --- a/app/common/dao/store/coupon/StoreCouponUserDao.php +++ b/app/common/dao/store/coupon/StoreCouponUserDao.php @@ -160,11 +160,13 @@ class StoreCouponUserDao extends BaseDao * 增加优惠券余额 * @param $id * @param $amount + * @param $order + * @param $mark * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ - public function increase($id, $amount) + public function increase($id, $amount, $order, $mark = '') { $storeCouponUser = StoreCouponUser::where('coupon_user_id', $id)->find(); if (empty($storeCouponUser)) { @@ -174,6 +176,7 @@ class StoreCouponUserDao extends BaseDao if (!$storeCouponUser->save()) { throw new ValidateException('优惠券余额更新出错'); } + StoreCouponDetail::income($order, $storeCouponUser['coupon_user_id'], $storeCouponUser->coupon_price, $mark); } /** @@ -193,11 +196,12 @@ class StoreCouponUserDao extends BaseDao throw new ValidateException('优惠券不存在'); } $isBalance = $storeCouponUser->isbalance(); - $couponPrice = bcsub($storeCouponUser->coupon_price, $amount, 2); - if ($isBalance && $couponPrice > 0) { - $storeCouponUser->coupon_price = $couponPrice; + $couponBalance = bcsub($storeCouponUser->coupon_price, $amount, 2); + $couponBalance = max($couponBalance, 0); + if ($isBalance) { + $storeCouponUser->coupon_price = $couponBalance; } - if ($couponPrice <= 0 || !$isBalance) { + if ($couponBalance <= 0 || !$isBalance) { $storeCouponUser->status = 1; } if (!$storeCouponUser->save()) { diff --git a/app/common/model/store/coupon/StoreCouponDetail.php b/app/common/model/store/coupon/StoreCouponDetail.php index 4603e3c0..55f050b1 100644 --- a/app/common/model/store/coupon/StoreCouponDetail.php +++ b/app/common/model/store/coupon/StoreCouponDetail.php @@ -13,6 +13,8 @@ class StoreCouponDetail extends BaseModel const TYPE_EXPEND = 1; //支出 const TYPE_INCOME = 2; //收入 + const STATUS_VALID = 1; //有效的 + const STATUS_INVALID = 0; //无效的 /** * @return string @@ -35,6 +37,11 @@ class StoreCouponDetail extends BaseModel return $this->hasOne(StoreCoupon::class, 'coupon_id', 'coupon_id'); } + public function couponUser() + { + return $this->hasOne(StoreCouponUser::class, 'coupon_user_id', 'coupon_user_id'); + } + /** * 使用优惠券 * @param $order @@ -61,10 +68,11 @@ class StoreCouponDetail extends BaseModel * @param $order * @param $id * @param $amount + * @param $mark * @param $status * @return void */ - public static function income($order, $id, $amount, $status = 1) + public static function income($order, $id, $amount, $mark = '', $status = 1) { $detailModel = new self(); $detailModel->uid = $order['uid']; @@ -75,6 +83,7 @@ class StoreCouponDetail extends BaseModel $detailModel->amount = $amount; $detailModel->pay_price = $order['pay_price']; $detailModel->status = $status; + $detailModel->mark = $mark; $detailModel->create_time = time(); $detailModel->save(); } diff --git a/crmeb/jobs/CancelGroupOrderJob.php b/crmeb/jobs/CancelGroupOrderJob.php index 483675c2..c4a63905 100644 --- a/crmeb/jobs/CancelGroupOrderJob.php +++ b/crmeb/jobs/CancelGroupOrderJob.php @@ -14,6 +14,9 @@ namespace crmeb\jobs; +use app\common\dao\store\coupon\StoreCouponUserDao; +use app\common\model\store\coupon\StoreCouponDetail; +use app\common\repositories\store\coupon\StoreCouponRepository; use app\common\repositories\store\coupon\StoreCouponUserRepository; use app\common\repositories\store\order\StoreGroupOrderRepository; use app\common\repositories\store\product\ProductAttrValueRepository; @@ -45,7 +48,21 @@ class CancelGroupOrderJob implements JobInterface } } if (count($couponId)) { - app()->make(StoreCouponUserRepository::class)->updates($couponId, ['status' => 0]); + $storeCouponDetails = StoreCouponDetail::with('couponUser') + ->where('group_order_id', $groupOrder->group_order_id) + ->where('type', StoreCouponDetail::TYPE_EXPEND) + ->where('status', StoreCouponDetail::STATUS_VALID) + ->select(); + $otherCoupon = []; + foreach ($storeCouponDetails as $item) { + if (in_array($item['couponUser']['coupon_type'], [StoreCouponRepository::TYPE_STORE_COUPON, StoreCouponRepository::TYPE_PLATFORM_CARD])) { + $mark = '订单关闭,返还' . $item['couponUser']['coupon_title'] . '金额'; + (new StoreCouponUserDao())->increase($item['coupon_user_id'], $item['amount'], $groupOrder, $mark); + } else { + $otherCoupon[] = $item['coupon_user_id']; + } + } + app()->make(StoreCouponUserRepository::class)->updates($otherCoupon, ['status' => 0]); } }); return $job->delete(); diff --git a/crmeb/listens/AutoCancelGroupOrderListen.php b/crmeb/listens/AutoCancelGroupOrderListen.php index 271e4505..301a21e5 100644 --- a/crmeb/listens/AutoCancelGroupOrderListen.php +++ b/crmeb/listens/AutoCancelGroupOrderListen.php @@ -26,6 +26,7 @@ class AutoCancelGroupOrderListen extends TimerService implements ListenerInterfa public function handle($event): void { $this->tick(60000, function () { + /** @var StoreGroupOrderRepository $storeGroupOrderRepository */ $storeGroupOrderRepository = app()->make(StoreGroupOrderRepository::class); request()->clearCache(); $timer = ((int)systemConfig('auto_close_order_timer')) ?: 15; diff --git a/crmeb/listens/OrderDeliveryListen.php b/crmeb/listens/OrderDeliveryListen.php index 5e8882b3..e3e4b867 100644 --- a/crmeb/listens/OrderDeliveryListen.php +++ b/crmeb/listens/OrderDeliveryListen.php @@ -28,7 +28,7 @@ class OrderDeliveryListen implements ListenerInterface } $coupon->coupon_price = $order->total_price; $couponUser = $repo->sendCoupon($coupon, $order['uid'], StoreCouponUserRepository::SEND_TYPE_BUY); - StoreCouponDetail::income($order, $couponUser['coupon_user_id'], $coupon->coupon_price); + StoreCouponDetail::income($order, $couponUser['coupon_user_id'], $coupon->coupon_price, $coupon['title']); if (!empty($orderProduct->product->give_coupon_ids)) { $giveCoupons = $repo->getGiveCoupon($orderProduct->product->give_coupon_ids); @@ -43,7 +43,7 @@ class OrderDeliveryListen implements ListenerInterface $repo->endTime = '2025-07-01'; $repo->status = -1; $couponUser = $repo->sendCoupon($giveCoupon, $order['uid'], StoreCouponUserRepository::SEND_TYPE_BUY); - StoreCouponDetail::income($order, $couponUser['coupon_user_id'], $giveCoupon->coupon_price, 0); + StoreCouponDetail::income($order, $couponUser['coupon_user_id'], $giveCoupon->coupon_price, $giveCoupon['title'], 0); } catch (\Exception $e) { Log::info('自动发放买赠优惠券:' . $e->getMessage()); }