Forráskód Böngészése

027线下转账支付payType=6:收款账户查询+商家确认收款+骑手门禁

GET /chanting/store/bankInfo(商家银行三字段缺一返回null);GET confirmTransferPayment(镜像现金版,外送单确认后notifyOrderAvailable推骑手);骑手acceptOrder对未确认转账单拒绝;下单透传与新单列表过滤零改动;零DDL;i18n五份properties

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
qmj 2 napja
szülő
commit
216a03f4b9

+ 23 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/mendian/PosStoreController.java

@@ -237,6 +237,29 @@ public class PosStoreController extends BaseController {
 
     }
 
+    /**
+     * 商家收款账户(線下轉賬收银台展示用):门店 到 所属商家主账号 到 审核资料银行三字段
+     * 商家级数据,连锁门店共享同一收款账户;任一字段为空返回 data=null,客户端据此隐藏線下支付选项
+     */
+    @Anonymous
+    @GetMapping("/bankInfo")
+    public AjaxResult bankInfo(@RequestParam Integer id) {
+        PosStore store = posStoreService.getById(id);
+        if (store == null || store.getUserId() == null) {
+            return success(null);
+        }
+        InfoUser merchant = infoUserService.selectInfoUserByUserId(store.getUserId());
+        if (merchant == null || StringUtils.isBlank(merchant.getBankAccountName())
+                || StringUtils.isBlank(merchant.getBankName()) || StringUtils.isBlank(merchant.getBankAccountNo())) {
+            return success(null);
+        }
+        JSONObject data = new JSONObject();
+        data.put("accountName", merchant.getBankAccountName().trim());
+        data.put("bankName", merchant.getBankName().trim());
+        data.put("accountNo", merchant.getBankAccountNo().trim());
+        return success(data);
+    }
+
     //根据行业分类查询门店列表
     @Anonymous
     @GetMapping("/getstorelist")

+ 2 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/OrderLifecycleService.java

@@ -34,6 +34,8 @@ public class OrderLifecycleService {
     public static final String PAY_TYPE_OMG = "2";
     /** 现金支付:仅商家创建订单可用(客户端下单拒绝);创建时未支付,商家App确认收款后置已支付 */
     public static final String PAY_TYPE_CASH = "4";
+    /** 線下轉賬支付:用户线下银行转账,商家确认收款(payStatus 从 0 置 1)后解锁骑手接单 */
+    public static final String PAY_TYPE_TRANSFER = "6";
 
     private final IPosOrderService posOrderService;
     private final OrderService billingService;

+ 5 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderQsOprateController.java

@@ -93,6 +93,11 @@ public class PosOrderQsOprateController extends BaseController {
         if (order.getAfterSaleStatus() != null && order.getAfterSaleStatus() > 0) {
             throw new ServiceException("订单存在售后申请,无法操作");
         }
+        // 线下转账单(payType=6):商家确认收款前骑手不可接单(抢单列表已过滤 payStatus=1,此处防绕过接口直调)
+        if (OrderLifecycleService.PAY_TYPE_TRANSFER.equals(order.getPayType())
+                && !Long.valueOf(1L).equals(order.getPayStatus())) {
+            throw new ServiceException(MessageUtils.message("no.order.transfer.not.paid"));
+        }
         PosOrder posOrder = new PosOrder();
         posOrder.setId(order.getId());
         posOrder.setDeliveryStatus(1L);

+ 37 - 0
ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderShOprateController.java

@@ -421,6 +421,43 @@ public class PosOrderShOprateController extends BaseController {
         return AjaxResult.success();
     }
 
+    /**
+     * 商家确认转账收款:payType=6 的订单 payStatus 从 0 置 1(用户线下转账、商家核对到账后触发)
+     * 外送单确认后推送附近骑手开放接单;与现金确认(confirmCashPayment)相互独立
+     */
+    @Anonymous
+    @Auth(session = true)
+    @GetMapping("/confirmTransferPayment")
+    public AjaxResult confirmTransferPayment(@RequestHeader String token, @RequestParam Long id) {
+        PosOrder order = posOrderService.getOne(new LambdaQueryWrapper<PosOrder>().eq(PosOrder::getId, id));
+        requireMerchantOrderAccess(order);
+        if (order == null) {
+            throw new ServiceException(MessageUtils.message("no.order.not.exist"));
+        }
+        if (!OrderLifecycleService.PAY_TYPE_TRANSFER.equals(order.getPayType())) {
+            throw new ServiceException(MessageUtils.message("no.order.paytype.not.transfer"));
+        }
+        // 已取消订单不允许确认收款:避免出现已取消+已支付的不可恢复状态(同现金确认)
+        if (order.getState() != null && order.getState() == 4L) {
+            throw new ServiceException(MessageUtils.message("no.order.transfer.cancelled"));
+        }
+        if (Long.valueOf(1L).equals(order.getPayStatus())) {
+            throw new ServiceException(MessageUtils.message("no.order.transfer.already.paid"));
+        }
+        PosOrder update = new PosOrder();
+        update.setId(order.getId());
+        update.setPayStatus(1L);
+        posOrderService.saveOrUpdate(update);
+        InfoUser shUser = infoUserService.getOne(new LambdaQueryWrapper<InfoUser>().eq(InfoUser::getUserId, Long.valueOf(new JwtUtil().getusid(token))));
+        String shName = shUser != null ? shUser.getNickName() : "";
+        orderLogHelper.log(String.valueOf(order.getDdId()), 2, Long.valueOf(new JwtUtil().getusid(token)), shName, "商家" + shName + "确认转账收款");
+        // 外送单:确认收款即支付完成,通知附近骑手开放接单(同 OMG 支付成功链路)
+        if (Long.valueOf(0L).equals(order.getType())) {
+            deliveryOrderNotificationService.notifyOrderAvailable(order);
+        }
+        return AjaxResult.success();
+    }
+
     /**
      * 商家取消订单:校验 state IN (0,1),设 state=4
      */

+ 4 - 0
ruoyi-admin/src/main/resources/i18n/messages.properties

@@ -260,6 +260,10 @@ omg.pay.refund.failed=OMG 退款操作失败,请稍后重试
 no.paytype.cash.merchant.only=Thanh toán tiền mặt chỉ dành cho đơn hàng do merchant tạo
 no.order.paytype.not.cash=Đơn hàng này không phải thanh toán tiền mặt
 no.order.cash.already.paid=Đơn hàng này đã được xác nhận thu tiền
+no.order.paytype.not.transfer=Đơn hàng này không phải thanh toán chuyển khoản
+no.order.transfer.cancelled=Đơn hàng đã hủy, không thể xác nhận thu tiền
+no.order.transfer.already.paid=Đơn hàng này đã được xác nhận thu tiền
+no.order.transfer.not.paid=Chỉ có thể nhận đơn sau khi nhà hàng xác nhận đã nhận tiền
 no.order.cash.cancelled=Đơn hàng đã bị hủy, không thể xác nhận thu tiền
 no.user.audit.reject.reason.required=审核不通过时必须填写审核不通过原因
 merchant.account.unavailable=Merchant account is unavailable

+ 4 - 0
ruoyi-admin/src/main/resources/i18n/messages_en_US.properties

@@ -263,6 +263,10 @@ omg.pay.refund.failed=The OMG refund operation failed; please try again later
 no.paytype.cash.merchant.only=Cash payment is only available for merchant-created orders
 no.order.paytype.not.cash=This order is not a cash payment order
 no.order.cash.already.paid=Cash payment for this order has already been confirmed
+no.order.paytype.not.transfer=This order is not a transfer payment order
+no.order.transfer.cancelled=Order cancelled; payment confirmation is not allowed
+no.order.transfer.already.paid=Payment for this order has already been confirmed
+no.order.transfer.not.paid=Riders can accept this order only after the merchant confirms payment
 no.order.cash.cancelled=The order has been cancelled; cash payment cannot be confirmed
 no.user.audit.reject.reason.required=A rejection reason is required when the audit is rejected
 merchant.account.unavailable=Merchant account is unavailable

+ 4 - 0
ruoyi-admin/src/main/resources/i18n/messages_vi.properties

@@ -263,6 +263,10 @@ omg.pay.refund.failed=Thao tác hoàn tiền OMG thất bại; vui lòng thử l
 no.paytype.cash.merchant.only=Thanh toán tiền mặt chỉ dành cho đơn hàng do merchant tạo
 no.order.paytype.not.cash=Đơn hàng này không phải thanh toán tiền mặt
 no.order.cash.already.paid=Đơn hàng này đã được xác nhận thu tiền
+no.order.paytype.not.transfer=Đơn hàng này không phải thanh toán chuyển khoản
+no.order.transfer.cancelled=Đơn hàng đã hủy, không thể xác nhận thu tiền
+no.order.transfer.already.paid=Đơn hàng này đã được xác nhận thu tiền
+no.order.transfer.not.paid=Chỉ có thể nhận đơn sau khi nhà hàng xác nhận đã nhận tiền
 no.order.cash.cancelled=Đơn hàng đã bị hủy, không thể xác nhận thu tiền
 no.user.audit.reject.reason.required=Phải nhập lý do khi kết quả xét duyệt không được thông qua
 merchant.account.unavailable=Tài khoản cửa hàng không khả dụng

+ 4 - 0
ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties

@@ -264,6 +264,10 @@ omg.pay.refund.failed=OMG 退款操作失败,请稍后重试
 no.paytype.cash.merchant.only=现金支付仅支持商家创建订单
 no.order.paytype.not.cash=该订单不是现金支付订单
 no.order.cash.already.paid=该订单已确认收款
+no.order.paytype.not.transfer=该订单不是转账支付订单
+no.order.transfer.cancelled=订单已取消,不能确认收款
+no.order.transfer.already.paid=该订单已确认收款
+no.order.transfer.not.paid=商家确认收款后骑手才能接单
 no.order.cash.cancelled=订单已取消,不能确认收款
 no.user.audit.reject.reason.required=审核不通过时必须填写审核不通过原因
 merchant.account.unavailable=商家账号不可用

+ 4 - 0
ruoyi-admin/src/main/resources/i18n/messages_zh_TW.properties

@@ -264,6 +264,10 @@ omg.pay.refund.failed=OMG 退款操作失敗,請稍後再試
 no.paytype.cash.merchant.only=現金支付僅支援商家建立訂單
 no.order.paytype.not.cash=該訂單不是現金支付訂單
 no.order.cash.already.paid=該訂單已確認收款
+no.order.paytype.not.transfer=該訂單不是轉賬支付訂單
+no.order.transfer.cancelled=訂單已取消,不能確認收款
+no.order.transfer.already.paid=該訂單已確認收款
+no.order.transfer.not.paid=商家確認收款後騎手才能接單
 no.order.cash.cancelled=訂單已取消,不能確認收款
 no.user.audit.reject.reason.required=審核不通過時必須填寫審核不通過原因
 merchant.account.unavailable=商家帳號不可用