From d08758aa35e5a1ef1c7cc8a0160c1e6ebce2bcc1 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Tue, 29 Sep 2026 09:20:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=A1=E8=B4=B9=E6=96=87?= =?UTF-8?q?=E6=A1=A3=EF=BC=8C=E5=8A=A0=E4=B8=8A=E5=AE=A2=E6=88=B7=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bms/price/domain/PrcBillingTask.java | 2 ++ .../domain/vo/BillingTaskSubmitRequest.java | 2 ++ .../impl/PrcBillingTaskServiceImpl.java | 33 +++++++++++++++++-- .../mapper/price/PrcBillingTaskMapper.xml | 16 ++++++--- bms-back/sql/bms_init.sql | 2 ++ .../billing_task_customer_code_alter.sql | 26 +++++++++++++++ .../src/views/monitor/billingTask/index.vue | 3 ++ 7 files changed, 78 insertions(+), 6 deletions(-) create mode 100644 bms-back/sql/price/billing_task_customer_code_alter.sql diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcBillingTask.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcBillingTask.java index 1fee332d..9da2bc19 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcBillingTask.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcBillingTask.java @@ -17,6 +17,8 @@ public class PrcBillingTask extends BaseEntity private String transferNo; private String trackingNo; private String orderNo; + /** Customer code snapshot for filter / rebill */ + private String customerCode; /** PENDING / REBILL / REFUND */ private String billType; /** WAITING / SUCCESS / FAILED */ diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BillingTaskSubmitRequest.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BillingTaskSubmitRequest.java index 3eff5aff..82b4f3ba 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BillingTaskSubmitRequest.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/BillingTaskSubmitRequest.java @@ -18,6 +18,8 @@ public class BillingTaskSubmitRequest implements Serializable private String transferNo; private String trackingNo; private String orderNo; + /** Optional customer code; also filled from Oracle when task runs */ + private String customerCode; /** Billing time from mobile; persisted to prc_billing_task.bill_time */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date billTime; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcBillingTaskServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcBillingTaskServiceImpl.java index 1b09521a..5586e05c 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcBillingTaskServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcBillingTaskServiceImpl.java @@ -86,6 +86,7 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService task.setTransferNo(transferNo); task.setTrackingNo(trackingNo); task.setOrderNo(orderNo); + task.setCustomerCode(trim(request.getCustomerCode())); task.setBillTime(billTime); task.setBillType(type.getCode()); task.setSuccessStatus(BillTaskSuccessStatus.WAITING.getCode()); @@ -93,8 +94,8 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService billingTaskMapper.insertPrcBillingTask(task); billingTaskMqPublisher.publish(new BillingTaskMessage(task.getTaskId())); - log.info("billing task submitted taskId={} type={} billTime={} transferNo={} trackingNo={} orderNo={}", - task.getTaskId(), task.getBillType(), billTime, transferNo, trackingNo, orderNo); + log.info("billing task submitted taskId={} type={} billTime={} customerCode={} transferNo={} trackingNo={} orderNo={}", + task.getTaskId(), task.getBillType(), billTime, task.getCustomerCode(), transferNo, trackingNo, orderNo); return task; } @@ -130,6 +131,7 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService { String refundOrderNo = resolveRefundOrderNo(task); log.info("billing task REFUND path taskId={} orderNo={}", taskId, refundOrderNo); + fillCustomerCodeFromBill(task, refundOrderNo); TmsPriceQuoteResult result = refundWithDbRetry(taskId, refundOrderNo); writeback(task, BillTaskSuccessStatus.SUCCESS, result == null ? null : result.getBillId(), null); @@ -175,6 +177,7 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService } // Billing date from task.bill_time (mobile), not Oracle CREATE_DATE. billReq.setBizDate(new SimpleDateFormat("yyyy-MM-dd").format(task.getBillTime())); + task.setCustomerCode(billReq.getCustomerCode()); TmsPriceQuoteResult result = billWithDbRetry(taskId, billReq); writeback(task, BillTaskSuccessStatus.SUCCESS, result == null ? null : result.getBillId(), @@ -381,6 +384,28 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService } /** Write back status/billId/failCode/error only; keep inbound transfer/tracking/order/billTime untouched. */ + /** Prefer existing bill customer when task has none (REFUND path). */ + private void fillCustomerCodeFromBill(PrcBillingTask task, String orderNo) + { + if (task == null || StringUtils.isNotEmpty(task.getCustomerCode())) + { + return; + } + PrcOrderBill bill = null; + if (StringUtils.isNotEmpty(orderNo)) + { + bill = orderBillMapper.selectPrcOrderBillByOrderNo(orderNo.trim()); + } + if (bill == null && StringUtils.isNotEmpty(task.getBillId())) + { + bill = orderBillMapper.selectPrcOrderBillById(task.getBillId()); + } + if (bill != null && StringUtils.isNotEmpty(bill.getCustomerCode())) + { + task.setCustomerCode(bill.getCustomerCode().trim()); + } + } + private void writeback(PrcBillingTask task, BillTaskSuccessStatus status, String billId, String errorMessage) { @@ -388,6 +413,10 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService upd.setTaskId(task.getTaskId()); upd.setSuccessStatus(status.getCode()); upd.setBillId(billId); + if (StringUtils.isNotEmpty(task.getCustomerCode())) + { + upd.setCustomerCode(task.getCustomerCode()); + } if (BillTaskSuccessStatus.FAILED == status) { upd.setFailCode(BillTaskFailCode.resolveCode(errorMessage)); diff --git a/bms-back/bms-system/src/main/resources/mapper/price/PrcBillingTaskMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/PrcBillingTaskMapper.xml index e6d2c04c..08f9474d 100644 --- a/bms-back/bms-system/src/main/resources/mapper/price/PrcBillingTaskMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/price/PrcBillingTaskMapper.xml @@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -22,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select task_id, transfer_no, tracking_no, order_no, bill_type, success_status, + select task_id, transfer_no, tracking_no, order_no, customer_code, bill_type, success_status, bill_time, bill_id, fail_code, error_message, create_by, create_time, update_by, update_time from prc_billing_task @@ -44,6 +45,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND order_no like concat('%', #{orderNo}, '%') + + AND customer_code like concat('%', #{customerCode}, '%') + AND bill_type = #{billType} @@ -65,10 +69,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" insert into prc_billing_task ( - transfer_no, tracking_no, order_no, bill_type, success_status, + transfer_no, tracking_no, order_no, customer_code, bill_type, success_status, bill_time, bill_id, fail_code, error_message, create_by, create_time ) values ( - #{transferNo}, #{trackingNo}, #{orderNo}, #{billType}, #{successStatus}, + #{transferNo}, #{trackingNo}, #{orderNo}, #{customerCode}, #{billType}, #{successStatus}, #{billTime}, #{billId}, #{failCode}, #{errorMessage}, #{createBy}, sysdate() ) @@ -79,6 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" transfer_no = #{transferNo}, tracking_no = #{trackingNo}, order_no = #{orderNo}, + customer_code = #{customerCode}, bill_type = #{billType}, success_status = #{successStatus}, bill_time = #{billTime}, @@ -91,13 +96,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where task_id = #{taskId} - + update prc_billing_task set success_status = #{successStatus}, bill_id = #{billId}, fail_code = #{failCode}, error_message = #{errorMessage}, + + customer_code = #{customerCode}, + update_time = sysdate() where task_id = #{taskId} diff --git a/bms-back/sql/bms_init.sql b/bms-back/sql/bms_init.sql index 51d98d19..2542d228 100644 --- a/bms-back/sql/bms_init.sql +++ b/bms-back/sql/bms_init.sql @@ -812,6 +812,7 @@ CREATE TABLE `prc_billing_task` ( `transfer_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '转单号', `tracking_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运单号', `order_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单号', + `customer_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户代码', `bill_type` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '计费类型:PENDING待计费 REBILL重计费 REFUND退费', `success_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'WAITING' COMMENT '是否计费成功:WAITING待处理 SUCCESS成功 FAILED失败', `bill_time` datetime DEFAULT NULL COMMENT '计费时间', @@ -826,6 +827,7 @@ CREATE TABLE `prc_billing_task` ( KEY `idx_billing_task_transfer` (`transfer_no`), KEY `idx_billing_task_tracking` (`tracking_no`), KEY `idx_billing_task_order` (`order_no`), + KEY `idx_billing_task_customer` (`customer_code`), KEY `idx_billing_task_status` (`success_status`,`create_time`), KEY `idx_billing_task_type` (`bill_type`), KEY `idx_billing_task_fail_code` (`fail_code`) diff --git a/bms-back/sql/price/billing_task_customer_code_alter.sql b/bms-back/sql/price/billing_task_customer_code_alter.sql new file mode 100644 index 00000000..69c304d6 --- /dev/null +++ b/bms-back/sql/price/billing_task_customer_code_alter.sql @@ -0,0 +1,26 @@ +-- prc_billing_task add customer_code for customer filter / rebill +SET NAMES utf8mb4; + +SET @col := ( + SELECT COLUMN_NAME FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_billing_task' + AND COLUMN_NAME = 'customer_code' + LIMIT 1 +); +SET @sql := IF( + @col IS NULL, + CONCAT( + 'ALTER TABLE prc_billing_task ADD COLUMN customer_code varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT ', + CHAR(39), '客户代码', CHAR(39), + ' AFTER order_no, ADD KEY idx_billing_task_customer (customer_code)' + ), + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +UPDATE prc_billing_task t +INNER JOIN prc_order_bill b ON b.bill_id = t.bill_id +SET t.customer_code = b.customer_code +WHERE (t.customer_code IS NULL OR t.customer_code = '') + AND b.customer_code IS NOT NULL AND b.customer_code <> ''; diff --git a/bms-front/src/views/monitor/billingTask/index.vue b/bms-front/src/views/monitor/billingTask/index.vue index 735ac5f9..e8781c87 100644 --- a/bms-front/src/views/monitor/billingTask/index.vue +++ b/bms-front/src/views/monitor/billingTask/index.vue @@ -55,6 +55,7 @@ {{ detail.taskId }} + {{ detail.customerCode || '-' }} {{ detail.orderNo || '-' }} {{ detail.trackingNo || '-' }} {{ detail.transferNo || '-' }} @@ -128,6 +129,7 @@ const searchColumns = [ { label: '状态', prop: 'successStatus', component: 'select', options: statusOptions, placeholder: '请选择状态', width: '140px', props: { clearable: true } }, { label: '计费类型', prop: 'billType', component: 'select', options: billTypeOptions, placeholder: '请选择类型', width: '140px', props: { clearable: true } }, { label: '失败码', prop: 'failCode', component: 'select', options: failCodeOptions, placeholder: '请选择失败码', width: '220px', props: { clearable: true, filterable: true } }, + { label: '客户代码', prop: 'customerCode', component: 'input', placeholder: '客户代码', width: '160px' }, { label: '订单号', prop: 'orderNo', component: 'input', placeholder: '订单号', width: '180px' }, { label: '运单号', prop: 'trackingNo', component: 'input', placeholder: '运单号', width: '180px' }, { label: '转单号', prop: 'transferNo', component: 'input', placeholder: '转单号', width: '180px' }, @@ -136,6 +138,7 @@ const searchColumns = [ const columns = [ { label: '任务ID', prop: 'taskId', align: 'center', width: 100 }, + { label: '客户代码', prop: 'customerCode', minWidth: 120, showOverflowTooltip: true }, { label: '订单号', prop: 'orderNo', minWidth: 160, showOverflowTooltip: true }, { label: '运单号', prop: 'trackingNo', minWidth: 150, showOverflowTooltip: true }, { label: '转单号', prop: 'transferNo', minWidth: 160, showOverflowTooltip: true },