Эх сурвалжийг харах

fix(010-order-invoice): 会员载具改走 PrintFlag=Y 纸本,修复 ezPay INV10013 强制要邮箱

MEMBER 原映射为 ezPay CarrierType=2 电子载具(PrintFlag=N),ezPay 对该类型强制要求
BuyerEmail,缺失回 INV10013,导致所有会员载具发票开立失败(如 pos_order_invoice id=6)。
按原始产品要求改为 PrintFlag=Y 索取纸本(不传 CarrierType):ezPay 不校验邮箱,且避开
「载具+PrintFlag=Y」法定互斥(防一票两份)。会员身份改由 BuyerName=手机号 +
invoice_choice=MEMBER 体现,会员发票夹按 userId 归集。

- OrderInvoiceService: buildAutoIssueDto MEMBER 分支不再 setCarrierType("2");
  autoIssue 删掉 carrier 回填;validateCheckout/validateInvoiceInput 注释更正并标注【决定 2026-08-05】
- UserOrderController: createOrder 捕获 MEMBER 时不再 setCarrierType("2")

数据清理 SQL 与 016 菜单 SQL 见后续 chore 提交。

Co-Authored-By: Claude <noreply@anthropic.com>
qmj 1 сар өмнө
parent
commit
75b8e94162

+ 7 - 10
ruoyi-admin/src/main/java/com/ruoyi/app/order/OrderInvoiceService.java

@@ -262,12 +262,7 @@ public class OrderInvoiceService {
                     new LambdaQueryWrapper<InfoUser>().eq(InfoUser::getUserId, order.getUserId()));
             String phone = u != null && StrUtil.isNotBlank(u.getPhone()) ? u.getPhone() : "會員";
             dto.setBuyerName(phone);
-            if ("MEMBER".equals(row.getInvoiceChoice())) {
-                // 会员载具:载具号=会员手机号;同步落库保持发票行载具信息完整
-                dto.setCarrierNum(phone);
-                row.setCarrierType("2");
-                row.setCarrierNum(phone);
-            }
+            // 【决定 2026-08-05】MEMBER 不再设 carrierType=2 电子载具(见 buildAutoIssueDto 决策备注),走 PrintFlag=Y 纸本;会员手机号已写入 BuyerName。
         }
         // 出餐触发开票:在意图行上落结果,并标记已触发(与 invoiceStatus 独立)
         row.setInvoiceCategory(dto.getCategory());
@@ -291,9 +286,11 @@ public class OrderInvoiceService {
                 dto.setCarrierNum(intent.getCarrierNum());
                 break;
             case "MEMBER":
-                // 会员载具 ezPay 类型 2;载具号(会员手机号)与买方名由 autoIssue 取 InfoUser.phone 回填
+                // 【决定 2026-08-05】会员载具(MEMBER) 走 PrintFlag=Y 索取纸本,不传 ezPay CarrierType=2 电子载具。
+                // 原因:ezPay 电子载具(type2+PrintFlag=N)强制要 BuyerEmail,缺失回 INV10013;且「载具+PrintFlag=Y」
+                // 法定互斥(一票两份)。故不设 carrierType,buildIssueData 走「无载具→PrintFlag=Y」分支,ezPay 不校验邮箱。
+                // 会员身份由 BuyerName=手机号 + invoice_choice=MEMBER 体现,供会员发票夹归集。
                 dto.setCategory("B2C");
-                dto.setCarrierType("2");
                 break;
             case "LOVE_CODE":
                 dto.setCategory("DONATION");
@@ -611,7 +608,7 @@ public class OrderInvoiceService {
                 }
                 break;
             case "MEMBER":
-                // 会员载具:载具号=会员手机号(出餐 autoIssue 时取 InfoUser.phone),免联网验真、免格式校验
+                // 会员载具走 PrintFlag=Y 纸本(不传 ezPay 载具,见 buildAutoIssueDto 决策备注),免联网验真、免格式校验、免邮箱
                 break;
             case "LOVE_CODE":
                 if (StrUtil.isBlank(loveCode) || !loveCode.matches("^\\d{3,7}$")) {
@@ -668,7 +665,7 @@ public class OrderInvoiceService {
 
     /**
      * 场景入参校验(service 内强校验,拦截非法请求不调 ezPay)。对齐 ezPay 开票模型:
-     * B2B:统编(8位)+邮箱必填、无载具;B2C:载具(0/1/2)+号码必填;会员载具(2)载具号=会员手机号、不收邮箱
+     * B2B:统编(8位)+邮箱必填、无载具;B2C:载具(0/1/2)+号码必填;会员载具(MEMBER)走 PrintFlag=Y 纸本、不传载具不收邮箱(见 buildAutoIssueDto 2026-08-05 决策)
      */
     private void validateInvoiceInput(ApplyInvoiceDto dto) {
         if ("B2B".equals(dto.getCategory())) {

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/app/order/UserOrderController.java

@@ -313,7 +313,7 @@ public class UserOrderController extends BaseController {
                 } else if ("CITIZEN".equals(choice)) {
                     intent.setCarrierType("1");
                 } else if ("MEMBER".equals(choice)) {
-                    intent.setCarrierType("2");
+                    // 【决定 2026-08-05】会员载具走 PrintFlag=Y 纸本,不传 ezPay 电子载具(见 OrderInvoiceService.buildAutoIssueDto 决策备注);carrierType 留空
                 } else {
                     intent.setCarrierType(input.getCarrierType());
                 }