From b9cdb6c3f917fc0fe5f2c219f926c7d62e9e3a9e Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Thu, 5 Nov 2026 18:33:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9F=A5=E7=9C=8B=E8=AE=A1?= =?UTF-8?q?=E8=B4=B9=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/price/BillingController.java | 102 +++++++ bms-front/src/api/price/billing.js | 9 + .../components/BillBillingHistoryDrawer.vue | 265 ++++++++++++++++++ .../price/billing/components/BillDetail.vue | 23 +- 4 files changed, 398 insertions(+), 1 deletion(-) create mode 100644 bms-front/src/views/price/billing/components/BillBillingHistoryDrawer.vue diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java index cc8a5d03..4e348900 100644 --- a/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/price/BillingController.java @@ -22,9 +22,12 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.bms.common.annotation.Log; +import com.bms.common.constant.HttpStatus; import com.bms.common.core.controller.BaseController; import com.bms.common.core.domain.AjaxResult; +import com.bms.common.core.page.PageDomain; import com.bms.common.core.page.TableDataInfo; +import com.bms.common.core.page.TableSupport; import com.bms.common.enums.BusinessType; import com.bms.common.utils.DateUtils; import com.bms.common.utils.MessageUtils; @@ -54,6 +57,11 @@ import com.bms.price.domain.vo.TmsPriceQuoteRequest; import com.bms.price.domain.vo.TmsPriceQuoteResult; import com.bms.price.enums.BillTaskSuccessStatus; import com.bms.price.enums.BillTaskType; +import com.bms.price.search.BillSearchPage; +import com.bms.price.search.BillSyncSnapshot; +import com.bms.price.search.EsBizLogSupport; +import com.bms.price.search.EsLogType; +import com.bms.price.search.IBillSearchStore; import com.bms.price.service.IPrcBillingTaskService; import com.bms.price.service.IPrcOrderBillService; import com.bms.price.service.ITmsPriceQuoteService; @@ -84,6 +92,9 @@ public class BillingController extends BaseController @Autowired private OrderBillProductCheckService orderBillProductCheckService; + @Autowired + private IBillSearchStore billSearchStore; + /** * Historical quote list. */ @@ -355,6 +366,97 @@ public class BillingController extends BaseController return success(prcOrderBillService.getBill(billId)); } + /** + * ES BILL logs for this order (billing / upstream sync / fail snapshots). + * bizId prefers transferNo then orderNo (same as write path). + */ + @PreAuthorize("@ss.hasPermi('price:billing:bill') or @ss.hasPermi('price:orderBill:list')") + @GetMapping("/bill/{billId}/history") + public TableDataInfo billHistory(@PathVariable("billId") String billId) + { + if (StringUtils.isEmpty(billId)) + { + return getDataTable(new ArrayList()); + } + TmsPriceQuoteResult bill = prcOrderBillService.getBill(billId.trim()); + if (bill == null) + { + TableDataInfo empty = new TableDataInfo(); + empty.setCode(HttpStatus.SUCCESS); + empty.setMsg("查询成功"); + empty.setRows(new ArrayList()); + empty.setTotal(0L); + return empty; + } + PageDomain pageDomain = TableSupport.buildPageRequest(); + int pageNum = pageDomain.getPageNum() == null ? 1 : pageDomain.getPageNum().intValue(); + int pageSize = pageDomain.getPageSize() == null ? 10 : pageDomain.getPageSize().intValue(); + String primary = EsBizLogSupport.billBizId(bill.getTransferNo(), bill.getOrderNo()); + BillSearchPage page = billSearchStore.search(EsLogType.BILL, primary, null, pageNum, pageSize); + // Also pull by orderNo when transferNo was used as bizId, so older orderNo-keyed rows appear. + if (StringUtils.isNotEmpty(bill.getTransferNo()) && StringUtils.isNotEmpty(bill.getOrderNo()) + && !bill.getTransferNo().trim().equalsIgnoreCase(bill.getOrderNo().trim()) + && pageNum == 1) + { + BillSearchPage byOrder = billSearchStore.search(EsLogType.BILL, bill.getOrderNo().trim(), null, 1, + Math.max(pageSize, 50)); + page = mergeBillHistory(page, byOrder, pageSize); + } + TableDataInfo rsp = new TableDataInfo(); + rsp.setCode(HttpStatus.SUCCESS); + rsp.setMsg("查询成功"); + rsp.setRows(page.getRows()); + rsp.setTotal(page.getTotal()); + return rsp; + } + + private BillSearchPage mergeBillHistory(BillSearchPage primary, BillSearchPage secondary, int pageSize) + { + BillSearchPage out = new BillSearchPage(); + Map byId = new HashMap(); + if (primary != null && primary.getRows() != null) + { + for (BillSyncSnapshot row : primary.getRows()) + { + if (row != null && StringUtils.isNotEmpty(row.getDocId())) + { + byId.put(row.getDocId(), row); + } + } + } + if (secondary != null && secondary.getRows() != null) + { + for (BillSyncSnapshot row : secondary.getRows()) + { + if (row != null && StringUtils.isNotEmpty(row.getDocId()) && !byId.containsKey(row.getDocId())) + { + byId.put(row.getDocId(), row); + } + } + } + List merged = new ArrayList(byId.values()); + merged.sort((a, b) -> { + String ta = a == null || a.getUpdateTime() == null ? "" : a.getUpdateTime(); + String tb = b == null || b.getUpdateTime() == null ? "" : b.getUpdateTime(); + return tb.compareTo(ta); + }); + long total = Math.max(primary == null ? 0L : primary.getTotal(), merged.size()); + if (secondary != null) + { + total = Math.max(total, secondary.getTotal()); + } + out.setTotal(total); + if (merged.size() > pageSize) + { + out.setRows(new ArrayList(merged.subList(0, pageSize))); + } + else + { + out.setRows(merged); + } + return out; + } + /** * Refund one receivable bill via billing task billType=REFUND. */ diff --git a/bms-front/src/api/price/billing.js b/bms-front/src/api/price/billing.js index 470175bd..b0976de1 100644 --- a/bms-front/src/api/price/billing.js +++ b/bms-front/src/api/price/billing.js @@ -187,6 +187,15 @@ export function getBill(billId) { }) } +/** ES billing history for one bill/order */ +export function listBillHistory(billId, query) { + return request({ + url: '/price/billing/bill/' + encodeURIComponent(billId) + '/history', + method: 'get', + params: query + }) +} + /** Refund receivable bill (billType=REFUND) */ export function refundBill(billId) { return request({ diff --git a/bms-front/src/views/price/billing/components/BillBillingHistoryDrawer.vue b/bms-front/src/views/price/billing/components/BillBillingHistoryDrawer.vue new file mode 100644 index 00000000..d7a29ec2 --- /dev/null +++ b/bms-front/src/views/price/billing/components/BillBillingHistoryDrawer.vue @@ -0,0 +1,265 @@ + + + + + diff --git a/bms-front/src/views/price/billing/components/BillDetail.vue b/bms-front/src/views/price/billing/components/BillDetail.vue index 65325ca1..ce777a66 100644 --- a/bms-front/src/views/price/billing/components/BillDetail.vue +++ b/bms-front/src/views/price/billing/components/BillDetail.vue @@ -41,7 +41,17 @@
-
计费信息
+
+ 计费信息 + 历史计费 +
运费金额
@@ -184,12 +194,18 @@ :current-charge-weight="detail?.chargeWeight" @success="onChargeWeightUpdated" /> +