diff --git a/app/common/model/store/order/PresellOrder.php b/app/common/model/store/order/PresellOrder.php index 1ea8bf8f..2e281596 100644 --- a/app/common/model/store/order/PresellOrder.php +++ b/app/common/model/store/order/PresellOrder.php @@ -66,7 +66,7 @@ class PresellOrder extends BaseModel return $status; } - public function getCombinePayParams() + public function getCombinePayParams($attach = 'presell') { return [ 'order_sn' => $this->presell_order_sn, @@ -77,7 +77,7 @@ class PresellOrder extends BaseModel 'sub_mchid' => $this->merchant->sub_mchid, ] ], - 'attach' => 'presell', + 'attach' => $attach, 'body' => '尾款支付', ]; } diff --git a/app/common/model/store/order/StoreGroupOrder.php b/app/common/model/store/order/StoreGroupOrder.php index 8c6b7cf4..ef3b69e2 100644 --- a/app/common/model/store/order/StoreGroupOrder.php +++ b/app/common/model/store/order/StoreGroupOrder.php @@ -76,12 +76,12 @@ class StoreGroupOrder extends BaseModel return $value ? implode(',', $value) : ''; } - public function getCombinePayParams() + public function getCombinePayParams($attach = 'order') { $params = [ 'order_sn' => $this->group_order_sn, 'sub_orders' => [], - 'attach' => 'order', + 'attach' => $attach, 'body' => '订单支付', ]; foreach ($this->orderList as $order) { diff --git a/app/common/repositories/store/order/StoreOrderRepository.php b/app/common/repositories/store/order/StoreOrderRepository.php index cdb2453f..b2ca8121 100644 --- a/app/common/repositories/store/order/StoreOrderRepository.php +++ b/app/common/repositories/store/order/StoreOrderRepository.php @@ -2459,7 +2459,7 @@ class StoreOrderRepository extends BaseRepository if ($payMoney > 0) { if (!in_array($type, ['balance', 'scrcu'])) { if (systemConfig('open_wx_combine')) { - $service = new CombinePayService($type, $groupOrder->getCombinePayParams()); + $service = new CombinePayService($type, $groupOrder->getCombinePayParams('order_settle')); } else { $service = new PayService($type, $groupOrder->getPayParams($type === 'alipay' ? request()->param('return_url') : '')); } @@ -2471,12 +2471,11 @@ class StoreOrderRepository extends BaseRepository $result = $payTool->pay($groupOrder); } } + $groupOrder->interest->interest = $interest; if ($result === true) { app()->make(MerchantRepository::class)->computedLockMoney($groupOrder->order); $groupOrder->interest->status = StoreOrderInterest::STATUS_SETTLED; $groupOrder->interest->settle_time = date('Y-m-d H:i:s'); - $groupOrder->interest->interest = $interest; - $groupOrder->interest->save(); /** @var UserBillRepository $userBillRepository */ $userBillRepository = app()->make(UserBillRepository::class); @@ -2495,6 +2494,7 @@ class StoreOrderRepository extends BaseRepository $merchantRepo->unfreeze($groupOrder->interest->mer_id); } } + $groupOrder->interest->save(); Db::commit(); return $data; } catch (\Exception $e) { diff --git a/app/event.php b/app/event.php index fd11c809..2c33c4f2 100644 --- a/app/event.php +++ b/app/event.php @@ -60,6 +60,7 @@ return [ 'pay_success_user_recharge' => [\crmeb\listens\pay\UserRechargeSuccessListen::class], 'pay_success_user_order' => [\crmeb\listens\pay\UserOrderSuccessListen::class], 'pay_success_order' => [\crmeb\listens\pay\OrderPaySuccessListen::class], + 'pay_success_order_settle' => [\crmeb\listens\pay\OrderSettlePaySuccessListen::class], 'pay_success_micro_pay' => [\crmeb\listens\pay\OrderMicroPaySuccessListen::class], 'pay_success_presell' => [\crmeb\listens\pay\PresellPaySuccessListen::class], 'pay_success_meal' => [\crmeb\listens\pay\MealSuccessListen::class], diff --git a/crmeb/listens/pay/OrderSettlePaySuccessListen.php b/crmeb/listens/pay/OrderSettlePaySuccessListen.php new file mode 100644 index 00000000..08ca1208 --- /dev/null +++ b/crmeb/listens/pay/OrderSettlePaySuccessListen.php @@ -0,0 +1,54 @@ + +// +---------------------------------------------------------------------- + + +namespace crmeb\listens\pay; + + +use app\common\model\store\order\StoreOrderInterest; +use app\common\repositories\store\order\StoreGroupOrderRepository; +use app\common\repositories\system\merchant\MerchantRepository; +use crmeb\interfaces\ListenerInterface; +use crmeb\utils\DingTalk; +use think\facade\Db; +use think\facade\Log; + +class OrderSettlePaySuccessListen implements ListenerInterface +{ + + public function handle($data): void + { + $orderSn = $data['order_sn']; + $groupOrder = app()->make(StoreGroupOrderRepository::class)->getWhere(['group_order_sn' => $orderSn]); + if (!$groupOrder || $groupOrder->paid == 1) return; + Db::startTrans(); + try { + app()->make(MerchantRepository::class)->computedLockMoney($groupOrder->order); + $groupOrder->interest->status = StoreOrderInterest::STATUS_SETTLED; + $groupOrder->interest->settle_time = date('Y-m-d H:i:s'); + if (!$groupOrder->interest->save()) { + throw new \Exception('订单结算信息保存失败'); + } + $unSettleCount = StoreOrderInterest::where('mer_id', $groupOrder->interest->mer_id)->where('status', 0)->count(); + if ($unSettleCount === 0) { + /** @var MerchantRepository $merchantRepo */ + $merchantRepo = app()->make(MerchantRepository::class); + $merchantRepo->unfreeze($groupOrder->interest->mer_id); + } + Db::commit(); + } catch (\Exception $e) { + Db::rollback(); + Log::error($e->getMessage(), $data); + DingTalk::exception($e, $e->getMessage()); + } + } +}