From 719d8c7208f151b073dfd6c95363c907373eccef Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Fri, 11 Sep 2026 16:12:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=B0=E5=BD=95=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/PriceSyncEsLogAdvice.java | 61 +++++++++ .../controller/api/TmsPriceController.java | 27 +++- .../controller/monitor/EsLogController.java | 5 +- .../ruoyi/price/search/BillSyncSnapshot.java | 22 +++ .../ruoyi/price/search/EsBillSearchStore.java | 27 +++- .../ruoyi/price/search/EsBizLogSupport.java | 126 ++++++++++++++++++ .../com/ruoyi/price/search/EsLogType.java | 18 ++- .../ruoyi/price/search/IBillSearchStore.java | 9 +- .../price/search/NoopBillSearchStore.java | 5 +- .../service/impl/PrcBillServiceImpl.java | 96 +++---------- .../impl/TmsPriceQuoteServiceImpl.java | 15 +++ bms-front/src/views/monitor/eslog/index.vue | 29 +++- .../price/billing/components/BillDetail.vue | 67 ---------- 13 files changed, 346 insertions(+), 161 deletions(-) create mode 100644 bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PriceSyncEsLogAdvice.java create mode 100644 bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBizLogSupport.java diff --git a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PriceSyncEsLogAdvice.java b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PriceSyncEsLogAdvice.java new file mode 100644 index 00000000..5bdc28fc --- /dev/null +++ b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/PriceSyncEsLogAdvice.java @@ -0,0 +1,61 @@ +package com.ruoyi.web.controller.api; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.annotation.Order; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.price.domain.vo.TmsPriceBillRequest; +import com.ruoyi.price.domain.vo.TmsPriceQuoteRequest; +import com.ruoyi.price.search.EsBizLogSupport; +import com.ruoyi.price.search.EsLogType; +import com.ruoyi.price.search.IBillSearchStore; +import com.ruoyi.web.controller.price.BillingController; + +/** + * Persist validation failures of quote/bill APIs to Elasticsearch. + */ +@Order(0) +@RestControllerAdvice(assignableTypes = { TmsPriceController.class, BillingController.class }) +public class PriceSyncEsLogAdvice +{ + @Autowired + private IBillSearchStore billSearchStore; + + @ExceptionHandler(MethodArgumentNotValidException.class) + public AjaxResult handleValid(MethodArgumentNotValidException e) + { + String message = e.getBindingResult().getFieldError() == null + ? e.getMessage() + : e.getBindingResult().getFieldError().getDefaultMessage(); + saveFail(e.getBindingResult().getTarget(), message); + return AjaxResult.error(message); + } + + @ExceptionHandler(BindException.class) + public AjaxResult handleBind(BindException e) + { + String message = e.getAllErrors().isEmpty() ? e.getMessage() : e.getAllErrors().get(0).getDefaultMessage(); + saveFail(e.getTarget(), message); + return AjaxResult.error(message); + } + + private void saveFail(Object target, String message) + { + if (target instanceof TmsPriceBillRequest) + { + TmsPriceBillRequest request = (TmsPriceBillRequest) target; + EsBizLogSupport.saveFail(billSearchStore, EsLogType.BILL, EsBizLogSupport.billFailBizId(request), request, + message); + return; + } + if (target instanceof TmsPriceQuoteRequest) + { + TmsPriceQuoteRequest request = (TmsPriceQuoteRequest) target; + EsBizLogSupport.saveFail(billSearchStore, EsLogType.QUOTE, EsBizLogSupport.quoteFailBizId(request), + request, message); + } + } +} diff --git a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TmsPriceController.java b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TmsPriceController.java index 50bcd4d7..84c33a67 100644 --- a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TmsPriceController.java +++ b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TmsPriceController.java @@ -19,6 +19,9 @@ import com.ruoyi.framework.config.properties.TmsApiProperties; import com.ruoyi.price.domain.vo.TmsPriceBillRequest; import com.ruoyi.price.domain.vo.TmsPriceQuoteRequest; import com.ruoyi.price.domain.vo.TmsPriceQuoteResult; +import com.ruoyi.price.search.EsBizLogSupport; +import com.ruoyi.price.search.EsLogType; +import com.ruoyi.price.search.IBillSearchStore; import com.ruoyi.price.service.IPrcBillService; import com.ruoyi.price.service.ITmsPriceQuoteService; @@ -46,6 +49,9 @@ public class TmsPriceController extends BaseController @Autowired private TmsApiProperties tmsApiProperties; + @Autowired + private IBillSearchStore billSearchStore; + /** * Quote by customerId + productCode + country + weight. * Match: customer package FIXED > DISCOUNT > product default. @@ -55,7 +61,16 @@ public class TmsPriceController extends BaseController @RequestHeader(value = HEADER_API_CODE, required = false) String headerApiCode, @Validated @RequestBody TmsPriceQuoteRequest request) { - assertApiCode(headerApiCode, request == null ? null : request.getApiCode()); + try + { + assertApiCode(headerApiCode, request == null ? null : request.getApiCode()); + } + catch (ServiceException e) + { + EsBizLogSupport.saveFail(billSearchStore, EsLogType.QUOTE, EsBizLogSupport.quoteFailBizId(request), + request, e); + throw e; + } TmsPriceQuoteResult result = tmsPriceQuoteService.quote(request); return success(result); } @@ -69,7 +84,15 @@ public class TmsPriceController extends BaseController @RequestHeader(value = HEADER_API_CODE, required = false) String headerApiCode, @Validated @RequestBody TmsPriceBillRequest request) { - assertApiCode(headerApiCode, request == null ? null : request.getApiCode()); + try + { + assertApiCode(headerApiCode, request == null ? null : request.getApiCode()); + } + catch (ServiceException e) + { + EsBizLogSupport.saveFail(billSearchStore, EsLogType.BILL, EsBizLogSupport.billFailBizId(request), request, e); + throw e; + } TmsPriceQuoteResult result = prcBillService.bill(request); return success(result); } diff --git a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/EsLogController.java b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/EsLogController.java index e3f7e244..c8b90aa6 100644 --- a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/EsLogController.java +++ b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/EsLogController.java @@ -30,12 +30,13 @@ public class EsLogController extends BaseController @GetMapping("/list") public TableDataInfo list( @RequestParam(value = "logType", required = false) String logType, - @RequestParam(value = "bizId", required = false) String bizId) + @RequestParam(value = "bizId", required = false) String bizId, + @RequestParam(value = "status", required = false) String status) { PageDomain pageDomain = TableSupport.buildPageRequest(); int pageNum = pageDomain.getPageNum() == null ? 1 : pageDomain.getPageNum().intValue(); int pageSize = pageDomain.getPageSize() == null ? 10 : pageDomain.getPageSize().intValue(); - BillSearchPage page = billSearchStore.search(logType, bizId, pageNum, pageSize); + BillSearchPage page = billSearchStore.search(logType, bizId, status, pageNum, pageSize); TableDataInfo rsp = new TableDataInfo(); rsp.setCode(HttpStatus.SUCCESS); rsp.setMsg("\u67e5\u8be2\u6210\u529f"); diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/BillSyncSnapshot.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/BillSyncSnapshot.java index 12360889..7dabb31e 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/BillSyncSnapshot.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/BillSyncSnapshot.java @@ -8,6 +8,8 @@ public class BillSyncSnapshot private String bizId; private String requestJson; private String responseJson; + private String status; + private String errorMessage; private String updatedAt; public String getDocId() @@ -60,6 +62,26 @@ public class BillSyncSnapshot this.responseJson = responseJson; } + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getErrorMessage() + { + return errorMessage; + } + + public void setErrorMessage(String errorMessage) + { + this.errorMessage = errorMessage; + } + public String getUpdatedAt() { return updatedAt; diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBillSearchStore.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBillSearchStore.java index a6d41082..f4833a80 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBillSearchStore.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBillSearchStore.java @@ -49,21 +49,25 @@ public class EsBillSearchStore implements IBillSearchStore } @Override - public void save(String logType, String bizId, String requestJson, String responseJson) + public void save(String logType, String bizId, String requestJson, String responseJson, String status, + String errorMessage) { if (StringUtils.isEmpty(logType) || StringUtils.isEmpty(bizId)) { return; } - String docId = EsLogType.docId(logType, bizId); + Date now = new Date(); + String docId = EsLogType.docId(logType, bizId, now); try { JSONObject doc = new JSONObject(); doc.put("logType", logType.trim()); doc.put("bizId", bizId.trim()); + doc.put("status", StringUtils.isEmpty(status) ? EsBizLogSupport.STATUS_SUCCESS : status.trim()); + doc.put("error", StringUtils.isEmpty(errorMessage) ? null : errorMessage); doc.put("request", parseOrRaw(requestJson)); doc.put("response", parseOrRaw(responseJson)); - doc.put("updatedAt", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); + doc.put("updatedAt", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(now)); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity(doc.toJSONString(), headers); @@ -82,7 +86,12 @@ public class EsBillSearchStore implements IBillSearchStore { return null; } - return getByDocId(EsLogType.docId(logType, bizId)); + BillSearchPage page = search(logType, bizId, null, 1, 1); + if (page.getRows() == null || page.getRows().isEmpty()) + { + return null; + } + return page.getRows().get(0); } @Override @@ -119,7 +128,7 @@ public class EsBillSearchStore implements IBillSearchStore } @Override - public BillSearchPage search(String logType, String bizId, int pageNum, int pageSize) + public BillSearchPage search(String logType, String bizId, String status, int pageNum, int pageSize) { BillSearchPage page = new BillSearchPage(); if (pageNum < 1) @@ -143,7 +152,7 @@ public class EsBillSearchStore implements IBillSearchStore sortItem.put("updatedAt.keyword", sortOpt); sort.add(sortItem); body.put("sort", sort); - body.put("query", buildQuery(logType, bizId)); + body.put("query", buildQuery(logType, bizId, status)); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity(body.toJSONString(), headers); @@ -210,14 +219,18 @@ public class EsBillSearchStore implements IBillSearchStore snap.setRequestJson(toJsonString(source.get("request"))); snap.setResponseJson(toJsonString(source.get("response"))); snap.setUpdatedAt(source.getString("updatedAt")); + String status = source.getString("status"); + snap.setStatus(StringUtils.isEmpty(status) ? EsBizLogSupport.STATUS_SUCCESS : status); + snap.setErrorMessage(source.getString("error")); return snap; } - private JSONObject buildQuery(String logType, String bizId) + private JSONObject buildQuery(String logType, String bizId, String status) { JSONArray filters = new JSONArray(); addTerm(filters, "logType", logType); addWildcard(filters, "bizId", bizId); + addTerm(filters, "status", status); if (filters.isEmpty()) { JSONObject matchAll = new JSONObject(); diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBizLogSupport.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBizLogSupport.java new file mode 100644 index 00000000..f3d4daf8 --- /dev/null +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsBizLogSupport.java @@ -0,0 +1,126 @@ +package com.ruoyi.price.search; + +import java.util.UUID; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sign.Md5Utils; +import com.ruoyi.price.domain.vo.TmsPriceBillRequest; +import com.ruoyi.price.domain.vo.TmsPriceQuoteRequest; + +/** Helpers for ES business logs (success / fail). */ +public final class EsBizLogSupport +{ + public static final String STATUS_SUCCESS = "SUCCESS"; + public static final String STATUS_FAIL = "FAIL"; + + private static final int ERROR_MAX = 2000; + + private EsBizLogSupport() + { + } + + public static String requestJson(Object request) + { + if (request == null) + { + return null; + } + JSONObject obj = JSON.parseObject(JSON.toJSONString(request)); + if (obj == null) + { + return null; + } + obj.remove("apiCode"); + return obj.toJSONString(); + } + + public static String failResponseJson(String errorMessage) + { + JSONObject obj = new JSONObject(); + obj.put("success", Boolean.FALSE); + obj.put("msg", errorMessage); + return obj.toJSONString(); + } + + public static String errorText(Throwable e) + { + if (e == null) + { + return "UNKNOWN_ERROR"; + } + String msg = e.getMessage(); + if (StringUtils.isEmpty(msg)) + { + msg = e.getClass().getSimpleName(); + } + Throwable cause = e.getCause(); + if (cause != null && StringUtils.isNotEmpty(cause.getMessage()) + && (msg == null || !msg.contains(cause.getMessage()))) + { + msg = msg + " | " + cause.getMessage(); + } + return cut(msg); + } + + public static String cut(String msg) + { + if (msg == null) + { + return null; + } + String text = msg.trim(); + if (text.length() > ERROR_MAX) + { + return text.substring(0, ERROR_MAX); + } + return text; + } + + public static String billBizId(TmsPriceBillRequest request) + { + if (request != null && StringUtils.isNotEmpty(request.getOrderNo())) + { + return request.getOrderNo().trim(); + } + return "FAIL-" + UUID.randomUUID(); + } + + public static String billFailBizId(TmsPriceBillRequest request) + { + return billBizId(request); + } + + public static String quoteFailBizId(TmsPriceQuoteRequest request) + { + if (request == null) + { + return "FAIL-" + UUID.randomUUID(); + } + String raw = nvl(request.getCustomerCode()) + "|" + nvl(request.getCustomerId()) + "|" + + nvl(request.getProductCode()) + "|" + nvl(request.getCountryCode()) + "|" + + nvl(request.getCountryName()) + "|" + nvl(request.getWeight()) + "|" + + nvl(request.getBizDate()); + return "FAIL-" + Md5Utils.hash(raw); + } + + public static void saveFail(IBillSearchStore store, String logType, String bizId, Object request, Throwable e) + { + saveFail(store, logType, bizId, request, errorText(e)); + } + + public static void saveFail(IBillSearchStore store, String logType, String bizId, Object request, String errorMessage) + { + if (store == null || StringUtils.isEmpty(logType) || StringUtils.isEmpty(bizId)) + { + return; + } + String msg = cut(errorMessage); + store.save(logType, bizId, requestJson(request), failResponseJson(msg), STATUS_FAIL, msg); + } + + private static String nvl(Object value) + { + return value == null ? "" : String.valueOf(value).trim(); + } +} diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsLogType.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsLogType.java index 07374890..f6b00c0f 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsLogType.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/EsLogType.java @@ -1,5 +1,8 @@ package com.ruoyi.price.search; +import java.text.SimpleDateFormat; +import java.util.Date; + /** Common ES business-log types. */ public final class EsLogType { @@ -10,10 +13,23 @@ public final class EsLogType { } + /** One document per bizId + write time. */ public static String docId(String logType, String bizId) + { + return docId(logType, bizId, new Date()); + } + + public static String docId(String logType, String bizId, Date at) { String type = logType == null ? "" : logType.trim(); String id = bizId == null ? "" : bizId.trim(); - return type + "_" + id; + Date time = at == null ? new Date() : at; + String ts = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(time); + String uniq = Long.toHexString(System.nanoTime()); + if (uniq.length() > 6) + { + uniq = uniq.substring(uniq.length() - 6); + } + return type + "_" + id + "_" + ts + "_" + uniq; } } diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/IBillSearchStore.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/IBillSearchStore.java index eee2b894..f9367b05 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/IBillSearchStore.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/IBillSearchStore.java @@ -5,11 +5,16 @@ package com.ruoyi.price.search; */ public interface IBillSearchStore { - void save(String logType, String bizId, String requestJson, String responseJson); + default void save(String logType, String bizId, String requestJson, String responseJson) + { + save(logType, bizId, requestJson, responseJson, EsBizLogSupport.STATUS_SUCCESS, null); + } + + void save(String logType, String bizId, String requestJson, String responseJson, String status, String errorMessage); BillSyncSnapshot get(String logType, String bizId); BillSyncSnapshot getByDocId(String docId); - BillSearchPage search(String logType, String bizId, int pageNum, int pageSize); + BillSearchPage search(String logType, String bizId, String status, int pageNum, int pageSize); } diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/NoopBillSearchStore.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/NoopBillSearchStore.java index e981d250..6ed78866 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/NoopBillSearchStore.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/search/NoopBillSearchStore.java @@ -6,7 +6,8 @@ package com.ruoyi.price.search; public class NoopBillSearchStore implements IBillSearchStore { @Override - public void save(String logType, String bizId, String requestJson, String responseJson) + public void save(String logType, String bizId, String requestJson, String responseJson, String status, + String errorMessage) { } @@ -23,7 +24,7 @@ public class NoopBillSearchStore implements IBillSearchStore } @Override - public BillSearchPage search(String logType, String bizId, int pageNum, int pageSize) + public BillSearchPage search(String logType, String bizId, String status, int pageNum, int pageSize) { return new BillSearchPage(); } diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcBillServiceImpl.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcBillServiceImpl.java index 0d479275..b40b32c0 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcBillServiceImpl.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcBillServiceImpl.java @@ -23,7 +23,7 @@ import com.ruoyi.price.domain.vo.TmsPriceQuoteFeeLine; import com.ruoyi.price.domain.vo.TmsPriceQuoteResult; import com.ruoyi.price.mapper.PrcBillFeeMapper; import com.ruoyi.price.mapper.PrcBillMapper; -import com.ruoyi.price.search.BillSyncSnapshot; +import com.ruoyi.price.search.EsBizLogSupport; import com.ruoyi.price.search.EsLogType; import com.ruoyi.price.search.IBillSearchStore; import com.ruoyi.price.service.IPrcBillService; @@ -48,20 +48,28 @@ public class PrcBillServiceImpl implements IPrcBillService @Transactional(rollbackFor = Exception.class) public TmsPriceQuoteResult bill(TmsPriceBillRequest request) { - if (request == null || StringUtils.isEmpty(request.getOrderNo())) + try { - throw new ServiceException(MessageUtils.message("price.bill.orderNoRequired")); + if (request == null || StringUtils.isEmpty(request.getOrderNo())) + { + throw new ServiceException(MessageUtils.message("price.bill.orderNoRequired")); + } + request.setOrderNo(request.getOrderNo().trim()); + if (StringUtils.isEmpty(request.getBizDate())) + { + throw new ServiceException(MessageUtils.message("price.bill.bizDateRequired")); + } + Date bizDate = resolveBizDate(request.getBizDate()); + BigDecimal weight = request.getWeight(); + TmsPriceQuoteResult result = tmsPriceQuoteService.calculate(request); + persistBill(request, weight, bizDate, result); + return result; } - request.setOrderNo(request.getOrderNo().trim()); - if (StringUtils.isEmpty(request.getBizDate())) + catch (RuntimeException e) { - throw new ServiceException(MessageUtils.message("price.bill.bizDateRequired")); + EsBizLogSupport.saveFail(billSearchStore, EsLogType.BILL, EsBizLogSupport.billFailBizId(request), request, e); + throw e; } - Date bizDate = resolveBizDate(request.getBizDate()); - BigDecimal weight = request.getWeight(); - TmsPriceQuoteResult result = tmsPriceQuoteService.calculate(request); - persistBill(request, weight, bizDate, result); - return result; } @Override @@ -261,31 +269,9 @@ public class PrcBillServiceImpl implements IPrcBillService } } r.setFeeDetails(lines); - fillSnapshotFromSearch(r, bill); return r; } - private void fillSnapshotFromSearch(TmsPriceQuoteResult r, PrcBill bill) - { - BillSyncSnapshot snap = billSearchStore.get(EsLogType.BILL, bill.getOrderNo()); - if (snap != null && StringUtils.isNotEmpty(snap.getRequestJson())) - { - r.setRequestJson(snap.getRequestJson()); - } - else - { - r.setRequestJson(rebuildRequestJson(bill)); - } - if (snap != null && StringUtils.isNotEmpty(snap.getResponseJson())) - { - r.setResponseJson(snap.getResponseJson()); - } - else - { - r.setResponseJson(toResponseJson(r)); - } - } - private void fillResultOrder(TmsPriceQuoteResult r, PrcBill bill) { r.setTrackingNo(bill.getTrackingNo()); @@ -328,42 +314,6 @@ public class PrcBillServiceImpl implements IPrcBillService return obj.toJSONString(); } - private String rebuildRequestJson(PrcBill bill) - { - JSONObject obj = new JSONObject(); - putIfNotNull(obj, "orderNo", bill.getOrderNo()); - putIfNotNull(obj, "trackingNo", bill.getTrackingNo()); - putIfNotNull(obj, "customerId", bill.getCustomerId()); - putIfNotNull(obj, "customerCode", bill.getCustomerCode()); - putIfNotNull(obj, "customerName", bill.getCustomerName()); - putIfNotNull(obj, "productCode", bill.getProductCode()); - putIfNotNull(obj, "countryCode", bill.getCountryCode()); - putIfNotNull(obj, "countryName", bill.getCountryName()); - putIfNotNull(obj, "weight", bill.getWeight()); - if (bill.getBizDate() != null) - { - obj.put("bizDate", new SimpleDateFormat("yyyy-MM-dd").format(bill.getBizDate())); - } - putIfNotNull(obj, "tmsId", bill.getTmsId()); - putIfNotNull(obj, "pieces", bill.getPieces()); - putIfNotNull(obj, "actualWeight", bill.getActualWeight()); - putIfNotNull(obj, "volume", bill.getVolume()); - putIfNotNull(obj, "volumeWeight", bill.getVolumeWeight()); - putIfNotNull(obj, "pkgLength", bill.getPkgLength()); - putIfNotNull(obj, "pkgWidth", bill.getPkgWidth()); - putIfNotNull(obj, "pkgHeight", bill.getPkgHeight()); - putIfNotNull(obj, "shipperName", bill.getShipperName()); - putIfNotNull(obj, "consigneeName", bill.getConsigneeName()); - putIfNotNull(obj, "destPostcode", bill.getDestPostcode()); - putIfNotNull(obj, "warehouseCode", bill.getWarehouseCode()); - if (bill.getOrderTime() != null) - { - obj.put("orderTime", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(bill.getOrderTime())); - } - putIfNotNull(obj, "orderRemark", bill.getOrderRemark()); - return obj.toJSONString(); - } - private JSONObject parseJsonObject(String json) { if (StringUtils.isEmpty(json)) @@ -380,14 +330,6 @@ public class PrcBillServiceImpl implements IPrcBillService } } - private void putIfNotNull(JSONObject obj, String key, Object value) - { - if (value != null && !(value instanceof String && ((String) value).isEmpty())) - { - obj.put(key, value); - } - } - private Date resolveBizDate(String bizDate) { if (StringUtils.isEmpty(bizDate)) diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java index 7e2720c6..10ede354 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/TmsPriceQuoteServiceImpl.java @@ -39,6 +39,7 @@ import com.ruoyi.price.mapper.PrcPriceSetMapper; import com.ruoyi.price.mapper.PrcQuoteFeeMapper; import com.ruoyi.price.mapper.PrcQuoteMapper; import com.ruoyi.price.mapper.PrcSurchargeRelMapper; +import com.ruoyi.price.search.EsBizLogSupport; import com.ruoyi.price.search.EsLogType; import com.ruoyi.price.search.IBillSearchStore; import com.ruoyi.price.service.ITmsPriceQuoteService; @@ -92,6 +93,20 @@ public class TmsPriceQuoteServiceImpl implements ITmsPriceQuoteService @Override @Transactional(rollbackFor = Exception.class) public TmsPriceQuoteResult quote(TmsPriceQuoteRequest request) + { + try + { + return quoteInternal(request); + } + catch (RuntimeException e) + { + EsBizLogSupport.saveFail(billSearchStore, EsLogType.QUOTE, EsBizLogSupport.quoteFailBizId(request), + request, e); + throw e; + } + } + + private TmsPriceQuoteResult quoteInternal(TmsPriceQuoteRequest request) { validateRequest(request); Date bizDate = resolveBizDate(request.getBizDate()); diff --git a/bms-front/src/views/monitor/eslog/index.vue b/bms-front/src/views/monitor/eslog/index.vue index e4707d6b..072f5fc4 100644 --- a/bms-front/src/views/monitor/eslog/index.vue +++ b/bms-front/src/views/monitor/eslog/index.vue @@ -10,6 +10,9 @@ + @@ -23,8 +26,14 @@ {{ typeLabel(detail.logType) }} + + {{ statusLabel(detail.status) }} + {{ detail.bizId || '-' }} - {{ detail.updatedAt || '-' }} + {{ detail.updatedAt || '-' }} + + {{ detail.errorMessage }} +
@@ -60,13 +69,20 @@ const typeOptions = [ { label: '试算', value: 'QUOTE' } ] +const statusOptions = [ + { label: '成功', value: 'SUCCESS' }, + { label: '失败', value: 'FAIL' } +] + const searchColumns = [ { label: '类型', prop: 'logType', component: 'select', options: typeOptions, placeholder: '请选择类型', width: '160px', props: { clearable: true } }, + { label: '状态', prop: 'status', component: 'select', options: statusOptions, placeholder: '请选择状态', width: '140px', props: { clearable: true } }, { label: '业务ID', prop: 'bizId', component: 'input', placeholder: '业务ID', width: '220px' } ] const columns = [ { label: '类型', prop: 'logType', align: 'center', width: 110, slot: 'logType' }, + { label: '状态', prop: 'status', align: 'center', width: 100, slot: 'status' }, { label: '业务ID', prop: 'bizId', minWidth: 180, showOverflowTooltip: true }, { label: '写入时间', prop: 'updatedAt', align: 'center', width: 180 }, { label: '操作', prop: 'action', align: 'center', width: 90, fixed: 'right', slot: 'action', showInToolbar: false } @@ -87,6 +103,16 @@ function typeTag(type) { return 'info' } +function statusLabel(status) { + const found = statusOptions.find(item => item.value === status) + if (found) return found.label + return status === 'FAIL' ? '失败' : '成功' +} + +function statusTag(status) { + return status === 'FAIL' ? 'danger' : 'success' +} + function handleView(row) { drawerTitle.value = 'ES日志详情 #' + (row.bizId || row.docId) open.value = true @@ -126,6 +152,7 @@ function copyJson(val) {