From a58de9bb7ef821859059544873372f8e040b0e7f Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Wed, 11 Nov 2026 09:49:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A1=E8=B4=B9=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BB=85=20billing=5Ffail=5Fstatus=20=3D=200=20?= =?UTF-8?q?=E6=89=8D=E5=86=99=20prc=5Fincome=5Fbill?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bms/price/domain/PrcOrderBill.java | 2 +- .../price/domain/vo/TmsPriceQuoteResult.java | 2 +- .../price/enums/BillBillingFailStatus.java | 29 +++++++++++++------ .../service/impl/PrcOrderBillServiceImpl.java | 3 +- .../support/OrderBillExportSupport.java | 1 + .../service/impl/ArBillServiceImpl.java | 1 + .../price/billing_fail_status_not_billed.sql | 3 ++ bms-front/src/views/price/billing/bill.vue | 1 + .../components/BatchAddIncomeFeeDialog.vue | 3 +- .../price/billing/components/BillDetail.vue | 4 ++- bms-front/src/views/price/orderBill/index.vue | 4 ++- 11 files changed, 38 insertions(+), 15 deletions(-) create mode 100644 bms-back/sql/price/billing_fail_status_not_billed.sql diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java index 943c8c7e..4d855f8e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBill.java @@ -122,7 +122,7 @@ public class PrcOrderBill extends BaseEntity private String creditArrearsStatus; /** NONE / REFUNDED */ private String refundStatus; - /** Billing fail: 0 ok; 1/2/3 sales miss; 23/24/25 catalog miss; soft-fail amount=0, no fee rows */ + /** Billing fail: 0 ok writes income bill+fee; non-0 amount=0, no income bill/fee */ private Integer billingFailStatus; /** 失败原因 */ private String errorMessage; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java index d7c16610..68b7b5c1 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceQuoteResult.java @@ -103,7 +103,7 @@ public class TmsPriceQuoteResult implements Serializable private String creditArrearsStatus; /** NONE / REFUNDED */ private String refundStatus; - /** Billing fail: 0 ok; 1/2/3 sales; 23/24/25 catalog (soft-fail on bill sync) */ + /** Billing fail: 0 ok (income bill+fee); 1/2/3 sales; 23/24/25 catalog */ private Integer billingFailStatus; private Integer pieces; private BigDecimal actualWeight; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java b/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java index b3194933..4203d69a 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/enums/BillBillingFailStatus.java @@ -6,7 +6,8 @@ package com.bms.price.enums; * 1/2/3 sales-price (package) miss: product / country / weight; * 23/24/25 product-catalog price miss: product / country / weight; * 4+ map to prc_billing_task.fail_code. - * Soft-fail income bill: 0/1/2/3/23/24/25; fee rows only for 0. + * 26 not billed yet (order-source sync only). + * Income bill + fee rows: only status 0. */ public enum BillBillingFailStatus { @@ -38,7 +39,9 @@ public enum BillBillingFailStatus /** Product catalog miss: product hit but country/zone miss. */ CATALOG_COUNTRY(24), /** Product catalog miss: product+country hit but weight band miss. */ - CATALOG_WEIGHT(25); + CATALOG_WEIGHT(25), + /** Order landed from upstream but not billed yet. */ + NOT_BILLED(26); private final int code; @@ -70,16 +73,23 @@ public enum BillBillingFailStatus public static boolean isFail(Integer code) { - return code != null && code.intValue() > SUCCESS.code; + if (code == null) + { + return false; + } + int value = code.intValue(); + return value != SUCCESS.code && value != NOT_BILLED.code; } - /** Soft-fail sales/catalog misses also persist prc_income_bill. */ + public static boolean isNotBilled(Integer code) + { + return code != null && code.intValue() == NOT_BILLED.code; + } + + /** Only success (0) persists prc_income_bill. */ public static boolean storesIncomeBill(Integer code) { - int value = code == null ? SUCCESS.code : code.intValue(); - return value == SUCCESS.code - || value == PRODUCT.code || value == COUNTRY.code || value == WEIGHT.code - || value == CATALOG_PRODUCT.code || value == CATALOG_COUNTRY.code || value == CATALOG_WEIGHT.code; + return code == null || code.intValue() == SUCCESS.code; } /** 仅 0 落 prc_income_bill_fee。 */ @@ -96,7 +106,7 @@ public enum BillBillingFailStatus } for (BillBillingFailStatus status : values()) { - if (status == SUCCESS) + if (status == SUCCESS || status == NOT_BILLED) { continue; } @@ -113,6 +123,7 @@ public enum BillBillingFailStatus switch (this) { case SUCCESS: + case NOT_BILLED: return null; case PRODUCT: return BillTaskFailCode.PRODUCT_NOT_HIT.getCode(); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java index be598462..03864c15 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderBillServiceImpl.java @@ -3089,7 +3089,8 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService bill.setBillId(UUID.randomUUID().toString()); bill.setArBillStatus(ArOrderBillStatus.UNBILLED.getCode()); bill.setRefundStatus(BillRefundStatus.NONE.getCode()); - bill.setBillingFailStatus(Integer.valueOf(BillBillingFailStatus.SUCCESS.getCode())); + // Order-source sync only: mark not billed until quote/bill runs. + bill.setBillingFailStatus(Integer.valueOf(BillBillingFailStatus.NOT_BILLED.getCode())); bill.setFreightRate(BigDecimal.ZERO); bill.setBaseFreightRate(BigDecimal.ZERO); bill.setRegistrationFee(BigDecimal.ZERO); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java b/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java index f299467b..9ab6ee9e 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/support/OrderBillExportSupport.java @@ -265,6 +265,7 @@ public final class OrderBillExportSupport case 20: return "客户已停用"; case 21: return "运费为空"; case 22: return "未知失败"; + case 26: return "未计费"; default: return String.valueOf(status); } } diff --git a/bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillServiceImpl.java index f4dac739..9b02fb6d 100644 --- a/bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/receivable/service/impl/ArBillServiceImpl.java @@ -1748,6 +1748,7 @@ public class ArBillServiceImpl implements IArBillService { } return switch (status) { case SUCCESS -> ""; + case NOT_BILLED -> "未计费"; case PRODUCT -> "销售价未匹配产品"; case COUNTRY -> "销售价未匹配国家"; case WEIGHT -> "销售价未匹配重量段"; diff --git a/bms-back/sql/price/billing_fail_status_not_billed.sql b/bms-back/sql/price/billing_fail_status_not_billed.sql new file mode 100644 index 00000000..6ffb865a --- /dev/null +++ b/bms-back/sql/price/billing_fail_status_not_billed.sql @@ -0,0 +1,3 @@ +-- prc_order_bill.billing_fail_status: add 26 NOT_BILLED +ALTER TABLE prc_order_bill + MODIFY COLUMN billing_fail_status tinyint NOT NULL DEFAULT 0 COMMENT '计费失败状态:0成功/1销售价未匹配产品/2销售价未匹配国家/3销售价未匹配重量段/23产品价未匹配产品/24产品价未匹配国家/25产品价未匹配重量段/4未绑定套餐/5无生效套餐版本/6已生成应收账单/7产品档案缺失/8未命中价格/9分区无价格/10邮编必填/11邮编未匹配分区/12上游订单不存在/13上游订单号为空/14上游客户为空/15上游产品为空/16上游重量无效/17计费时间为空/18退费订单无法解析/19客户代码为空/20客户已停用/21运费为空/22未知失败/26未计费。仅0写入应收主表,仅0写入应收费用'; diff --git a/bms-front/src/views/price/billing/bill.vue b/bms-front/src/views/price/billing/bill.vue index af47ada7..25da72a4 100644 --- a/bms-front/src/views/price/billing/bill.vue +++ b/bms-front/src/views/price/billing/bill.vue @@ -1098,6 +1098,7 @@ function billingFailLabel(status) { function billingFailTagType(status) { const code = status == null ? 0 : Number(status) + if (code === 26) return 'info' if (code > 0) return 'danger' return 'success' } diff --git a/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue b/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue index 4ada0adf..999c3f16 100644 --- a/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue +++ b/bms-front/src/views/price/billing/components/BatchAddIncomeFeeDialog.vue @@ -254,7 +254,8 @@ function billingFailStatusLabel(code) { 3: '销售价未匹配重量段', 23: '产品价未匹配产品', 24: '产品价未匹配国家', - 25: '产品价未匹配重量段' + 25: '产品价未匹配重量段', + 26: '未计费' } const key = Number(code) return map[key] != null ? map[key] : String(code) diff --git a/bms-front/src/views/price/billing/components/BillDetail.vue b/bms-front/src/views/price/billing/components/BillDetail.vue index 1859e9b1..b4d1fa6a 100644 --- a/bms-front/src/views/price/billing/components/BillDetail.vue +++ b/bms-front/src/views/price/billing/components/BillDetail.vue @@ -405,7 +405,8 @@ const billingFailStatusOptions = [ { label: '客户代码为空', value: 19 }, { label: '客户已停用', value: 20 }, { label: '运费为空', value: 21 }, - { label: '未知失败', value: 22 } + { label: '未知失败', value: 22 }, + { label: '未计费', value: 26 } ] function billingFailLabel(status) { @@ -416,6 +417,7 @@ function billingFailLabel(status) { function billingFailTagType(status) { const code = status == null ? 0 : Number(status) + if (code === 26) return 'info' if (code > 0) return 'danger' return 'success' } diff --git a/bms-front/src/views/price/orderBill/index.vue b/bms-front/src/views/price/orderBill/index.vue index 31ac313d..34123d7e 100644 --- a/bms-front/src/views/price/orderBill/index.vue +++ b/bms-front/src/views/price/orderBill/index.vue @@ -494,7 +494,8 @@ const billingFailStatusOptions = [ { label: '客户代码为空', value: 19 }, { label: '客户已停用', value: 20 }, { label: '运费为空', value: 21 }, - { label: '未知失败', value: 22 } + { label: '未知失败', value: 22 }, + { label: '未计费', value: 26 } ] const orderStatusAllValues = computed(() => orderStatusOptions.map(o => o.value)) @@ -1003,6 +1004,7 @@ function billingFailLabel(status) { function billingFailTagType(status) { const code = status == null ? 0 : Number(status) + if (code === 26) return 'info' return code > 0 ? 'danger' : 'success' }