From db396458c53bd9ab3205079324cfca3494531b86 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Fri, 16 Oct 2026 17:27:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=A2=E5=8D=95=E4=B8=BB?= =?UTF-8?q?=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monitor/PrcOrderMonitorController.java | 116 ++++++++ .../java/com/bms/price/domain/PrcOrder.java | 66 +++++ .../com/bms/price/domain/PrcOrderBill.java | 4 +- ...{PrcOrderBillExt.java => PrcOrderExt.java} | 11 +- .../price/domain/vo/TmsPriceBillRequest.java | 5 +- .../price/mapper/PrcBillingTaskMapper.java | 3 + .../price/mapper/PrcOrderBillExtMapper.java | 15 - .../bms/price/mapper/PrcOrderExtMapper.java | 15 + .../com/bms/price/mapper/PrcOrderMapper.java | 28 ++ ...tFiller.java => OracleOrderExtFiller.java} | 14 +- .../bms/price/oracle/OracleOrderFiller.java | 201 +++++++++++++ .../price/service/IPrcBillingTaskService.java | 6 + .../bms/price/service/IPrcOrderService.java | 25 ++ .../impl/PrcBillingTaskServiceImpl.java | 118 ++++++-- .../service/impl/PrcOrderBillServiceImpl.java | 25 +- .../service/impl/PrcOrderServiceImpl.java | 108 +++++++ .../mapper/price/PrcBillingTaskMapper.xml | 4 + .../mapper/price/PrcOrderBillMapper.xml | 14 +- ...illExtMapper.xml => PrcOrderExtMapper.xml} | 54 ++-- .../resources/mapper/price/PrcOrderMapper.xml | 256 +++++++++++++++++ bms-back/sql/price/prc_order.sql | 267 ++++++++++++++++++ bms-back/sql/price/prc_order_ext_fk_fix.sql | 30 ++ bms-front/src/api/monitor/prcOrder.js | 31 ++ .../components/BillingTaskDetailDrawer.vue | 36 +-- .../src/views/monitor/billingTask/index.vue | 176 +----------- 25 files changed, 1326 insertions(+), 302 deletions(-) create mode 100644 bms-back/bms-admin/src/main/java/com/bms/web/controller/monitor/PrcOrderMonitorController.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrder.java rename bms-back/bms-system/src/main/java/com/bms/price/domain/{PrcOrderBillExt.java => PrcOrderExt.java} (95%) delete mode 100644 bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillExtMapper.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderExtMapper.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderMapper.java rename bms-back/bms-system/src/main/java/com/bms/price/oracle/{OracleOrderBillExtFiller.java => OracleOrderExtFiller.java} (95%) create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderFiller.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderService.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderServiceImpl.java rename bms-back/bms-system/src/main/resources/mapper/price/{PrcOrderBillExtMapper.xml => PrcOrderExtMapper.xml} (75%) create mode 100644 bms-back/bms-system/src/main/resources/mapper/price/PrcOrderMapper.xml create mode 100644 bms-back/sql/price/prc_order.sql create mode 100644 bms-back/sql/price/prc_order_ext_fk_fix.sql create mode 100644 bms-front/src/api/monitor/prcOrder.js diff --git a/bms-back/bms-admin/src/main/java/com/bms/web/controller/monitor/PrcOrderMonitorController.java b/bms-back/bms-admin/src/main/java/com/bms/web/controller/monitor/PrcOrderMonitorController.java new file mode 100644 index 00000000..8efd8a23 --- /dev/null +++ b/bms-back/bms-admin/src/main/java/com/bms/web/controller/monitor/PrcOrderMonitorController.java @@ -0,0 +1,116 @@ +package com.bms.web.controller.monitor; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.bms.common.annotation.Log; +import com.bms.common.core.controller.BaseController; +import com.bms.common.core.domain.AjaxResult; +import com.bms.common.core.page.TableDataInfo; +import com.bms.common.enums.BusinessType; +import com.bms.price.domain.PrcOrder; +import com.bms.price.enums.BillTaskSuccessStatus; +import com.bms.price.service.IPrcBillingTaskService; +import com.bms.price.service.IPrcOrderService; + +/** + * Monitor: prc_order billing status list and manual resync (replaces task-queue view after upsert). + * Reuses monitor:billingTask:* perms so menu/roles stay stable. + */ +@RestController +@RequestMapping("/monitor/prcOrder") +public class PrcOrderMonitorController extends BaseController +{ + @Autowired + private IPrcOrderService prcOrderService; + + @Autowired + private IPrcBillingTaskService billingTaskService; + + /** Default list = FAILED. */ + @PreAuthorize("@ss.hasPermi('monitor:billingTask:list')") + @GetMapping("/list") + public TableDataInfo list(PrcOrder query) + { + if (query.getSuccessStatus() == null || query.getSuccessStatus().isEmpty()) + { + query.setSuccessStatus(BillTaskSuccessStatus.FAILED.getCode()); + } + else if ("ALL".equalsIgnoreCase(query.getSuccessStatus())) + { + query.setSuccessStatus(null); + } + startPage(); + List list = prcOrderService.selectPrcOrderList(query); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('monitor:billingTask:list')") + @GetMapping("/{orderId}") + public AjaxResult getInfo(@PathVariable("orderId") String orderId) + { + return success(prcOrderService.selectPrcOrderById(orderId)); + } + + @PreAuthorize("@ss.hasPermi('monitor:billingTask:retry')") + @Log(title = "prc_order retry", businessType = BusinessType.UPDATE) + @PostMapping("/retry/{orderId}") + public AjaxResult retry(@PathVariable("orderId") String orderId) + { + return success(billingTaskService.retryByOrderId(orderId)); + } + + @PreAuthorize("@ss.hasPermi('monitor:billingTask:retry')") + @Log(title = "prc_order batch retry", businessType = BusinessType.UPDATE) + @PostMapping("/retry") + public AjaxResult retryBatch(@RequestBody String[] orderIds) + { + if (orderIds == null || orderIds.length == 0) + { + return error("orderIds required"); + } + int ok = 0; + int fail = 0; + List> details = new ArrayList>(); + for (String orderId : orderIds) + { + Map row = new HashMap(); + row.put("orderId", orderId); + try + { + PrcOrder order = billingTaskService.retryByOrderId(orderId); + row.put("successStatus", order == null ? null : order.getSuccessStatus()); + row.put("failCode", order == null ? null : order.getFailCode()); + if (order != null && BillTaskSuccessStatus.SUCCESS.getCode().equals(order.getSuccessStatus())) + { + ok++; + } + else + { + fail++; + } + } + catch (RuntimeException e) + { + fail++; + row.put("successStatus", BillTaskSuccessStatus.FAILED.getCode()); + row.put("failCode", e.getMessage()); + } + details.add(row); + } + Map data = new HashMap(); + data.put("ok", Integer.valueOf(ok)); + data.put("fail", Integer.valueOf(fail)); + data.put("details", details); + return success(data); + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrder.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrder.java new file mode 100644 index 00000000..ca575ebc --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrder.java @@ -0,0 +1,66 @@ +package com.bms.price.domain; + +import java.math.BigDecimal; +import java.util.Date; +import java.util.List; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.bms.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** Order master prc_order (upstream TAB_ORDER core + billing status) */ +@Data +@EqualsAndHashCode(callSuper = true) +public class PrcOrder extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + private String orderId; + private String orderNo; + private List orderNos; + private String trackingNo; + private List trackingNos; + private String transferNo; + private List transferNos; + private String trackId; + private String belongSaler; + private String belongSalerCode; + private String settlementMan; + private String settlementManCode; + private String serviceMan; + private String serviceManCode; + private String customerCode; + private String customerName; + private List customerCodes; + private Integer pieces; + private BigDecimal actualWeight; + private BigDecimal weight; + private BigDecimal dimensionalWeightFactor; + private BigDecimal volume; + private BigDecimal volumeWeight; + private BigDecimal pkgLength; + private BigDecimal pkgWidth; + private BigDecimal pkgHeight; + private String shipperName; + private String consigneeName; + private String consigneePostcode; + private String warehouseCode; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date orderTime; + private String orderRemark; + private String productCode; + private String productName; + private List productCodes; + private String productFloorCode; + private String countryCode; + private String countryName; + private Integer orderStatus; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date pickupDate; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date bizDate; + /** WAITING / SUCCESS / FAILED */ + private String successStatus; + private String failCode; + private List failCodes; +} 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 7fb0fc44..d18fb6bf 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 @@ -17,6 +17,8 @@ public class PrcOrderBill extends BaseEntity private static final long serialVersionUID = 1L; private String billId; + /** FK to prc_order.order_id (wired by parent). */ + private String orderId; /** 批量查询:多个账单ID精确匹配(仅查询用,非表字段) */ private List billIds; private String billKey; @@ -62,7 +64,7 @@ public class PrcOrderBill extends BaseEntity private String warehouseCode; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date orderTime; - /** 应收来源查询专用:从 prc_order_bill_ext.pickup_date 读取的收件时间。 */ + /** 应收来源查询专用:从 prc_order.pickup_date 读取的收件时间。 */ @JsonIgnore private Date pickupDate; private String orderRemark; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBillExt.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderExt.java similarity index 95% rename from bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBillExt.java rename to bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderExt.java index a78c61ae..5e2d1954 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderBillExt.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/PrcOrderExt.java @@ -6,13 +6,13 @@ import java.math.BigDecimal; import java.util.Date; import lombok.Data; -/** 计费订单扩展表:TAB_ORDER 剩余字段 + 同步请求快照 */ +/** Order ext leftover TAB_ORDER fields on prc_order_ext */ @Data -public class PrcOrderBillExt implements Serializable +public class PrcOrderExt implements Serializable { private static final long serialVersionUID = 1L; - private String billId; + private String orderId; private String orderNo; private String upstreamId; private String lineNo; @@ -70,7 +70,6 @@ public class PrcOrderBillExt implements Serializable private String importState; private String importCountry; private String buyerid; - private Integer orderStatus; private String createAt; private Integer payType; private String lineCode; @@ -78,7 +77,6 @@ public class PrcOrderBillExt implements Serializable private String productType; private String lineType; private String cargoName; - private String productFloorCode; private BigDecimal orderInsurance; private BigDecimal productSumPrice; private BigDecimal productSum; @@ -88,8 +86,6 @@ public class PrcOrderBillExt implements Serializable private String productFloor; private String latestTrajectory; private String wayBill; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private Date pickupDate; private Integer blBaging; private Integer blPickup; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @@ -174,7 +170,6 @@ public class PrcOrderBillExt implements Serializable @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date airConfirmTime; private Integer packageType; - private BigDecimal dimensionalWeightFactor; private String updateBy; private String customerPickupSite; private String barcodeNumber; diff --git a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceBillRequest.java b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceBillRequest.java index 1bd054ea..74d76af5 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceBillRequest.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/domain/vo/TmsPriceBillRequest.java @@ -20,6 +20,9 @@ public class TmsPriceBillRequest extends TmsPriceQuoteRequest @NotBlank(message = "orderNo is required") private String orderNo; + /** FK to prc_order.order_id when order master already upserted */ + private String orderId; + private String trackingNo; /** transfer order no */ private String transferNo; @@ -51,7 +54,7 @@ public class TmsPriceBillRequest extends TmsPriceQuoteRequest @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date orderTime; private String orderRemark; - /** 上游 TAB_ORDER 整行,用于写入 prc_order_bill_ext 扩展字段 */ + /** 上游 TAB_ORDER 整行,用于写入 prc_order_ext 扩展字段 */ private Map upstreamRow; @JsonIgnore diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcBillingTaskMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcBillingTaskMapper.java index 7fbb8714..a6a59778 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcBillingTaskMapper.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcBillingTaskMapper.java @@ -12,6 +12,9 @@ public interface PrcBillingTaskMapper int insertPrcBillingTask(PrcBillingTask task); + /** Delete queue rows by unique transfer_no after prc_order upsert. */ + int deleteByTransferNo(@Param("transferNo") String transferNo); + int updatePrcBillingTask(PrcBillingTask task); /** CAS: WAITING -> processing claim not needed; writeback SUCCESS/FAILED */ diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillExtMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillExtMapper.java deleted file mode 100644 index 8e4a195d..00000000 --- a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderBillExtMapper.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.bms.price.mapper; - -import com.bms.price.domain.PrcOrderBillExt; - -/** prc_order_bill_ext mapper */ -public interface PrcOrderBillExtMapper -{ - public PrcOrderBillExt selectByBillId(String billId); - - public PrcOrderBillExt selectByOrderNo(String orderNo); - - public int insertPrcOrderBillExt(PrcOrderBillExt ext); - - public int upsertPrcOrderBillExt(PrcOrderBillExt ext); -} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderExtMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderExtMapper.java new file mode 100644 index 00000000..210cfe2c --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderExtMapper.java @@ -0,0 +1,15 @@ +package com.bms.price.mapper; + +import com.bms.price.domain.PrcOrderExt; + +/** prc_order_ext mapper */ +public interface PrcOrderExtMapper +{ + public PrcOrderExt selectByOrderId(String orderId); + + public PrcOrderExt selectByOrderNo(String orderNo); + + public int insertPrcOrderExt(PrcOrderExt ext); + + public int upsertPrcOrderExt(PrcOrderExt ext); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderMapper.java new file mode 100644 index 00000000..6b1d5379 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/mapper/PrcOrderMapper.java @@ -0,0 +1,28 @@ +package com.bms.price.mapper; + +import java.util.List; +import com.bms.price.domain.PrcOrder; +import org.apache.ibatis.annotations.Param; + +/** prc_order mapper */ +public interface PrcOrderMapper +{ + PrcOrder selectPrcOrderById(String orderId); + + PrcOrder selectPrcOrderByTransferNo(String transferNo); + + PrcOrder selectPrcOrderByOrderNo(String orderNo); + + List selectPrcOrderList(PrcOrder query); + + int insertPrcOrder(PrcOrder order); + + int updatePrcOrder(PrcOrder order); + + int upsertPrcOrderByTransferNo(PrcOrder order); + + int updateBillingStatus(@Param("orderId") String orderId, + @Param("successStatus") String successStatus, + @Param("failCode") String failCode, + @Param("updateBy") String updateBy); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderBillExtFiller.java b/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderExtFiller.java similarity index 95% rename from bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderBillExtFiller.java rename to bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderExtFiller.java index 6a098021..ed6bf560 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderBillExtFiller.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderExtFiller.java @@ -5,16 +5,16 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.Map; -import com.bms.price.domain.PrcOrderBillExt; +import com.bms.price.domain.PrcOrderExt; /** - * 从 Oracle TAB_ORDER 行填充 prc_order_bill_ext(仅包含未落在 prc_order_bill 的字段)。 + * 从 Oracle TAB_ORDER 行填充 prc_order_ext(仅包含未落在 prc_order_bill 的字段)。 */ -public final class OracleOrderBillExtFiller +public final class OracleOrderExtFiller { - private OracleOrderBillExtFiller() {} + private OracleOrderExtFiller() {} - public static void fillFromRow(PrcOrderBillExt ext, Map row) + public static void fillFromRow(PrcOrderExt ext, Map row) { if (ext == null || row == null || row.isEmpty()) { @@ -76,7 +76,6 @@ public final class OracleOrderBillExtFiller ext.setImportState(str(row, "IMPORT_STATE")); ext.setImportCountry(str(row, "IMPORT_COUNTRY")); ext.setBuyerid(str(row, "BUYERID")); - ext.setOrderStatus(integer(row, "ORDER_STATUS")); ext.setCreateAt(str(row, "CREATE_AT")); ext.setPayType(integer(row, "PAY_TYPE")); ext.setLineCode(str(row, "LINE_CODE")); @@ -84,7 +83,6 @@ public final class OracleOrderBillExtFiller ext.setProductType(str(row, "PRODUCT_TYPE")); ext.setLineType(str(row, "LINE_TYPE")); ext.setCargoName(str(row, "CARGO_NAME")); - ext.setProductFloorCode(str(row, "PRODUCT_FLOOR_CODE")); ext.setOrderInsurance(decimal(row, "ORDER_INSURANCE")); ext.setProductSumPrice(decimal(row, "PRODUCT_SUM_PRICE")); ext.setProductSum(decimal(row, "PRODUCT_SUM")); @@ -94,7 +92,6 @@ public final class OracleOrderBillExtFiller ext.setProductFloor(str(row, "PRODUCT_FLOOR")); ext.setLatestTrajectory(str(row, "LATEST_TRAJECTORY")); ext.setWayBill(str(row, "WAY_BILL")); - ext.setPickupDate(date(row, "PICKUP_DATE")); ext.setBlBaging(integer(row, "BL_BAGING")); ext.setBlPickup(integer(row, "BL_PICKUP")); ext.setBagDate(date(row, "BAG_DATE")); @@ -162,7 +159,6 @@ public final class OracleOrderBillExtFiller ext.setTrackQueryTime(date(row, "TRACK_QUERY_TIME")); ext.setAirConfirmTime(date(row, "AIR_CONFIRM_TIME")); ext.setPackageType(integer(row, "PACKAGE_TYPE")); - ext.setDimensionalWeightFactor(decimal(row, "DIMENSIONAL_WEIGHT_FACTOR")); ext.setUpdateBy(str(row, "UPDATE_BY")); ext.setCustomerPickupSite(str(row, "CUSTOMER_PICKUP_SITE")); ext.setBarcodeNumber(str(row, "BARCODE_NUMBER")); diff --git a/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderFiller.java b/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderFiller.java new file mode 100644 index 00000000..68e19613 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/oracle/OracleOrderFiller.java @@ -0,0 +1,201 @@ +package com.bms.price.oracle; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.Map; +import com.bms.common.utils.StringUtils; +import com.bms.price.domain.PrcOrder; +import com.bms.price.domain.vo.TmsPriceBillRequest; +import com.bms.price.enums.BillTaskSuccessStatus; + +/** + * Fill prc_order core fields from upstream TAB_ORDER row (+ bill request overlay). + */ +public final class OracleOrderFiller +{ + private OracleOrderFiller() {} + + public static void fillFromRow(PrcOrder order, Map row, TmsPriceBillRequest req, Date bizDate) + { + if (order == null || row == null || row.isEmpty()) + { + return; + } + if (req != null) + { + if (StringUtils.isNotEmpty(req.getOrderNo())) + { + order.setOrderNo(req.getOrderNo()); + } + if (StringUtils.isNotEmpty(req.getTrackingNo())) + { + order.setTrackingNo(req.getTrackingNo()); + } + if (StringUtils.isNotEmpty(req.getTransferNo())) + { + order.setTransferNo(req.getTransferNo()); + } + order.setBelongSaler(req.getBelongSaler()); + order.setBelongSalerCode(req.getBelongSalerCode()); + order.setSettlementMan(req.getSettlementMan()); + order.setSettlementManCode(req.getSettlementManCode()); + order.setServiceMan(req.getServiceMan()); + order.setServiceManCode(req.getServiceManCode()); + order.setCustomerCode(req.getCustomerCode()); + order.setCustomerName(req.getCustomerName()); + order.setPieces(req.getPieces()); + order.setActualWeight(req.getActualWeight()); + order.setWeight(req.getReceiveWeight()); + order.setDimensionalWeightFactor(req.getWeight()); + order.setVolume(req.getVolume()); + order.setVolumeWeight(req.getVolumeWeight()); + order.setPkgLength(req.getPkgLength()); + order.setPkgWidth(req.getPkgWidth()); + order.setPkgHeight(req.getPkgHeight()); + order.setShipperName(req.getShipperName()); + order.setConsigneeName(req.getConsigneeName()); + order.setConsigneePostcode(req.getDestPostcode()); + order.setWarehouseCode(req.getWarehouseCode()); + order.setOrderTime(req.getOrderTime()); + order.setOrderRemark(req.getOrderRemark()); + order.setProductCode(req.getProductCode()); + order.setCountryCode(req.getCountryCode()); + order.setCountryName(req.getCountryName()); + } + if (StringUtils.isEmpty(order.getOrderNo())) + { + order.setOrderNo(str(row, "ORDER_ID")); + } + if (StringUtils.isEmpty(order.getTrackingNo())) + { + order.setTrackingNo(str(row, "ORG_ORDER_ID")); + } + if (StringUtils.isEmpty(order.getTransferNo())) + { + order.setTransferNo(str(row, "TRANSFER_ORDER_ID")); + } + order.setTrackId(str(row, "TRACK_ID")); + order.setProductFloorCode(str(row, "PRODUCT_FLOOR_CODE")); + if (StringUtils.isEmpty(order.getProductName())) + { + order.setProductName(str(row, "PRODUCT_NAME")); + } + order.setOrderStatus(integer(row, "ORDER_STATUS")); + order.setPickupDate(date(row, "PICKUP_DATE")); + if (order.getDimensionalWeightFactor() == null) + { + order.setDimensionalWeightFactor(decimal(row, "DIMENSIONAL_WEIGHT_FACTOR")); + } + if (order.getWeight() == null) + { + order.setWeight(decimal(row, "WEIGHT")); + } + if (order.getVolumeWeight() == null) + { + order.setVolumeWeight(decimal(row, "VOLUME_WEIGHT")); + } + if (order.getConsigneePostcode() == null) + { + order.setConsigneePostcode(str(row, "CONSIGNEE_POSTCODE")); + } + order.setBizDate(bizDate); + if (StringUtils.isEmpty(order.getSuccessStatus())) + { + order.setSuccessStatus(BillTaskSuccessStatus.WAITING.getCode()); + } + } + + private static String str(Map row, String key) + { + Object v = get(row, key); + if (v == null) + { + return null; + } + String s = String.valueOf(v).trim(); + return s.isEmpty() ? null : s; + } + + private static Integer integer(Map row, String key) + { + BigDecimal d = decimal(row, key); + return d == null ? null : Integer.valueOf(d.intValue()); + } + + private static BigDecimal decimal(Map row, String key) + { + Object v = get(row, key); + if (v == null || "".equals(String.valueOf(v).trim())) + { + return null; + } + if (v instanceof BigDecimal) + { + return (BigDecimal) v; + } + if (v instanceof Number) + { + return BigDecimal.valueOf(((Number) v).doubleValue()); + } + try + { + return new BigDecimal(String.valueOf(v).trim()); + } + catch (Exception e) + { + return null; + } + } + + private static Date date(Map row, String key) + { + Object v = get(row, key); + if (v == null) + { + return null; + } + if (v instanceof Date) + { + return (Date) v; + } + String s = String.valueOf(v).trim(); + String[] formats = { + "dd/MM/yyyy HH:mm:ss", "dd/MM/yyyy HH:mm", "yyyy-MM-dd HH:mm:ss", + "yyyy-MM-dd'T'HH:mm:ss", "yyyy-MM-dd" + }; + for (String fmt : formats) + { + try + { + return new SimpleDateFormat(fmt, Locale.ENGLISH).parse(s); + } + catch (Exception ignored) + { + } + } + return null; + } + + private static Object get(Map row, String key) + { + if (row.containsKey(key)) + { + return row.get(key); + } + String upper = key.toUpperCase(Locale.ROOT); + if (row.containsKey(upper)) + { + return row.get(upper); + } + for (Map.Entry e : row.entrySet()) + { + if (e.getKey() != null && e.getKey().equalsIgnoreCase(key)) + { + return e.getValue(); + } + } + return null; + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcBillingTaskService.java b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcBillingTaskService.java index 8f21d116..ac67dfed 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcBillingTaskService.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcBillingTaskService.java @@ -35,6 +35,12 @@ public interface IPrcBillingTaskService */ PrcBillingTask retryTask(Long taskId); + /** + * Manual resync by prc_order.order_id (task queue row may already be deleted). + * @return order after retry + */ + com.bms.price.domain.PrcOrder retryByOrderId(String orderId); + /** * Start async filter retry (customer + bill_time). Returns async task id for progress poll. */ diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderService.java b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderService.java new file mode 100644 index 00000000..7d64b773 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/IPrcOrderService.java @@ -0,0 +1,25 @@ +package com.bms.price.service; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import com.bms.price.domain.PrcOrder; +import com.bms.price.domain.vo.TmsPriceBillRequest; + +/** prc_order service */ +public interface IPrcOrderService +{ + PrcOrder selectPrcOrderById(String orderId); + + PrcOrder selectPrcOrderByTransferNo(String transferNo); + + List selectPrcOrderList(PrcOrder query); + + /** + * Upsert prc_order + prc_order_ext by transfer_no (overwrite upstream fields when exists). + * @return persisted order (stable orderId) + */ + PrcOrder upsertFromUpstream(Map upstreamRow, TmsPriceBillRequest billReq, Date bizDate); + + void updateBillingStatus(String orderId, String successStatus, String failCode); +} 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 b8488537..d14d4d60 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 @@ -15,6 +15,7 @@ import com.bms.common.utils.StringUtils; import com.bms.price.config.BillingProperties; import com.bms.price.domain.PrcBillingTask; import com.bms.price.domain.PrcBillingTaskRetryTask; +import com.bms.price.domain.PrcOrder; import com.bms.price.domain.PrcOrderBill; import com.bms.price.domain.vo.BillingTaskRetryByFilterRequest; import com.bms.price.domain.vo.BillingTaskSubmitRequest; @@ -32,6 +33,7 @@ import com.bms.price.oracle.OracleOrderBillMapper; import com.bms.price.oracle.OracleUpstreamOrderService; import com.bms.price.service.IPrcBillingTaskService; import com.bms.price.service.IPrcOrderBillService; +import com.bms.price.service.IPrcOrderService; import com.bms.price.task.PrcBillingTaskRetryAsyncRunner; @Service @@ -57,6 +59,9 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService @Autowired private IPrcOrderBillService prcOrderBillService; + @Autowired + private IPrcOrderService prcOrderService; + @Autowired private BillingProperties billingProperties; @@ -249,29 +254,17 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService } /** - * 用上游 Oracle 全行数据映射并计费(公共逻辑:MQ 处理与订单列表同步复用)。 - * 订单列表同步时行数据已由分页查询拉回,避免每单再走 findMainOrder 的公网往返。 + * Map upstream row -> upsert prc_order(+ext) -> delete billing task by transfer_no -> bill + * -> write success_status/fail_code onto prc_order (task is already gone). */ private void billFromUpstreamRow(PrcBillingTask task, Map row) { Long taskId = task.getTaskId(); TmsPriceBillRequest billReq = oracleOrderBillMapper.toBillRequest(row, billingProperties.getOracle().getDefaultProductCode()); - if (billReq == null || StringUtils.isEmpty(billReq.getOrderNo())) + if (billReq == null) { - throw new ServiceException("Oracle order mapped orderNo empty"); - } - if (StringUtils.isEmpty(billReq.getCustomerCode())) - { - throw new ServiceException("Oracle order mapped customerCode empty"); - } - if (StringUtils.isEmpty(billReq.getProductCode())) - { - throw new ServiceException("Oracle order mapped productCode empty"); - } - if (billReq.getWeight() == null || billReq.getWeight().signum() <= 0) - { - throw new ServiceException("Oracle order mapped weight invalid"); + throw new ServiceException("Oracle order mapped empty"); } // Identity keys from mobile inbound are source of truth; do not replace with Oracle remap. if (StringUtils.isNotEmpty(task.getTransferNo())) @@ -290,21 +283,55 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService billReq.setBizDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(task.getBillTime())); task.setCustomerCode(billReq.getCustomerCode()); - TmsPriceQuoteResult result = billWithDbRetry(taskId, billReq); - // Soft-fail (product/country/weight miss): order bill already persisted with zero amounts; - // still mark task FAILED so it appears in abnormal-task list for retry/ops. - if (result != null && BillBillingFailStatus.isFail(result.getBillingFailStatus())) + // Always persist upstream onto prc_order first (even if later billing validation fails). + PrcOrder order = prcOrderService.upsertFromUpstream(row, billReq, task.getBillTime()); + billReq.setOrderId(order.getOrderId()); + String transferNo = order.getTransferNo(); + if (StringUtils.isNotEmpty(transferNo)) { - String err = StringUtils.isNotEmpty(result.getMatchMessage()) - ? result.getMatchMessage() - : ("billingFailStatus=" + result.getBillingFailStatus()); - writeback(task, BillTaskSuccessStatus.FAILED, result.getBillId(), cut(err, 900), - BillBillingFailStatus.toTaskFailCode(result.getBillingFailStatus())); + billingTaskMapper.deleteByTransferNo(transferNo); } - else + + try { - writeback(task, BillTaskSuccessStatus.SUCCESS, result == null ? null : result.getBillId(), - null, null); + if (StringUtils.isEmpty(billReq.getOrderNo())) + { + throw new ServiceException("Oracle order mapped orderNo empty"); + } + if (StringUtils.isEmpty(billReq.getCustomerCode())) + { + throw new ServiceException("Oracle order mapped customerCode empty"); + } + if (StringUtils.isEmpty(billReq.getProductCode())) + { + throw new ServiceException("Oracle order mapped productCode empty"); + } + if (billReq.getWeight() == null || billReq.getWeight().signum() <= 0) + { + throw new ServiceException("Oracle order mapped weight invalid"); + } + + TmsPriceQuoteResult result = billWithDbRetry(taskId, billReq); + if (result != null && BillBillingFailStatus.isFail(result.getBillingFailStatus())) + { + String failCode = BillBillingFailStatus.toTaskFailCode(result.getBillingFailStatus()); + prcOrderService.updateBillingStatus(order.getOrderId(), + BillTaskSuccessStatus.FAILED.getCode(), failCode); + } + else + { + prcOrderService.updateBillingStatus(order.getOrderId(), + BillTaskSuccessStatus.SUCCESS.getCode(), null); + } + } + catch (RuntimeException e) + { + // Task row already deleted; persist fail on prc_order only (do not rethrow for writeback). + String failCode = BillTaskFailCode.resolveCode(e.getMessage()); + prcOrderService.updateBillingStatus(order.getOrderId(), + BillTaskSuccessStatus.FAILED.getCode(), failCode); + log.error("billing failed after prc_order upsert orderId={} transferNo={}", + order.getOrderId(), transferNo, e); } } @@ -451,6 +478,41 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService return billingTaskMapper.selectPrcBillingTaskList(query); } + @Override + public PrcOrder retryByOrderId(String orderId) + { + if (StringUtils.isEmpty(orderId)) + { + throw new ServiceException("orderId required"); + } + PrcOrder order = prcOrderService.selectPrcOrderById(orderId.trim()); + if (order == null) + { + throw new ServiceException("prc_order not found"); + } + if (order.getBizDate() == null) + { + throw new ServiceException("prc_order bizDate empty (billing time required)"); + } + Map row = oracleUpstreamOrderService.findMainOrder( + order.getTransferNo(), order.getOrderNo(), order.getTrackingNo()); + if (row == null || row.isEmpty()) + { + prcOrderService.updateBillingStatus(order.getOrderId(), + BillTaskSuccessStatus.FAILED.getCode(), BillTaskFailCode.ORACLE_ORDER_NOT_FOUND.getCode()); + return prcOrderService.selectPrcOrderById(order.getOrderId()); + } + PrcBillingTask transientTask = new PrcBillingTask(); + transientTask.setTransferNo(order.getTransferNo()); + transientTask.setTrackingNo(order.getTrackingNo()); + transientTask.setOrderNo(order.getOrderNo()); + transientTask.setCustomerCode(order.getCustomerCode()); + transientTask.setBillTime(order.getBizDate()); + transientTask.setBillType(BillTaskType.REBILL.getCode()); + billFromUpstreamRow(transientTask, row); + return prcOrderService.selectPrcOrderById(order.getOrderId()); + } + @Override public PrcBillingTask retryTask(Long taskId) { 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 b83ee9bf..b3a5bc08 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 @@ -39,7 +39,7 @@ import com.bms.system.service.IBmsBizRuleService; import com.bms.price.domain.PrcIncomeBill; import com.bms.price.domain.PrcIncomeBillFee; import com.bms.price.domain.PrcOrderBill; -import com.bms.price.domain.PrcOrderBillExt; +import com.bms.price.domain.PrcOrderExt; import com.bms.price.domain.PrcPayBill; import com.bms.price.domain.PrcPayBillFee; import com.bms.price.domain.PrcSurcharge; @@ -67,11 +67,11 @@ import com.bms.price.enums.BillBillingFailStatus; import com.bms.price.enums.TmsOrderBillMatchType; import com.bms.price.mapper.PrcIncomeBillFeeMapper; import com.bms.price.mapper.PrcIncomeBillMapper; -import com.bms.price.mapper.PrcOrderBillExtMapper; +import com.bms.price.mapper.PrcOrderExtMapper; import com.bms.price.mapper.PrcOrderBillMapper; import com.bms.price.mapper.PrcPayBillFeeMapper; import com.bms.price.mapper.PrcPayBillMapper; -import com.bms.price.oracle.OracleOrderBillExtFiller; +import com.bms.price.oracle.OracleOrderExtFiller; import com.bms.price.search.EsBizLogSupport; import com.bms.price.search.EsLogType; import com.bms.price.search.IBillSearchStore; @@ -108,7 +108,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService private SysUserMapper sysUserMapper; @Autowired - private PrcOrderBillExtMapper orderBillExtMapper; + private PrcOrderExtMapper orderExtMapper; @Autowired private PrcIncomeBillFeeMapper incomeBillFeeMapper; @@ -1255,6 +1255,10 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService } bill.setBillKey(billKey); bill.setOrderNo(orderNo); + if (StringUtils.isNotEmpty(request.getOrderId())) + { + bill.setOrderId(request.getOrderId()); + } Long customerId = request.getCustomerId(); if (customerId == null && result != null) { @@ -1873,22 +1877,23 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService return r; } - /** 仅在存在上游 TAB_ORDER 行时写入 prc_order_bill_ext。 */ + /** Persist prc_order_ext when upstream TAB_ORDER row exists. Requires bill.orderId (parent wires prc_order first). */ private void persistBillExt(PrcOrderBill bill, java.util.Map upstreamRow) { - if (bill == null || StringUtils.isEmpty(bill.getBillId())) + if (bill == null || StringUtils.isEmpty(bill.getOrderId())) { + // skip ext persist until orderId is set (parent will wire order first) return; } if (upstreamRow == null || upstreamRow.isEmpty()) { return; } - PrcOrderBillExt ext = new PrcOrderBillExt(); - ext.setBillId(bill.getBillId()); + PrcOrderExt ext = new PrcOrderExt(); + ext.setOrderId(bill.getOrderId()); ext.setOrderNo(bill.getOrderNo()); - OracleOrderBillExtFiller.fillFromRow(ext, upstreamRow); - orderBillExtMapper.upsertPrcOrderBillExt(ext); + OracleOrderExtFiller.fillFromRow(ext, upstreamRow); + orderExtMapper.upsertPrcOrderExt(ext); } private List toIncomeFeeLines(List fees) diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderServiceImpl.java new file mode 100644 index 00000000..fd54f6e3 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcOrderServiceImpl.java @@ -0,0 +1,108 @@ +package com.bms.price.service.impl; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.bms.common.exception.ServiceException; +import com.bms.common.utils.DateUtils; +import com.bms.common.utils.StringUtils; +import com.bms.price.domain.PrcOrder; +import com.bms.price.domain.PrcOrderExt; +import com.bms.price.domain.vo.TmsPriceBillRequest; +import com.bms.price.enums.BillTaskSuccessStatus; +import com.bms.price.mapper.PrcOrderExtMapper; +import com.bms.price.mapper.PrcOrderMapper; +import com.bms.price.oracle.OracleOrderExtFiller; +import com.bms.price.oracle.OracleOrderFiller; +import com.bms.price.service.IPrcOrderService; + +@Service +public class PrcOrderServiceImpl implements IPrcOrderService +{ + @Autowired + private PrcOrderMapper prcOrderMapper; + + @Autowired + private PrcOrderExtMapper prcOrderExtMapper; + + @Override + public PrcOrder selectPrcOrderById(String orderId) + { + return prcOrderMapper.selectPrcOrderById(orderId); + } + + @Override + public PrcOrder selectPrcOrderByTransferNo(String transferNo) + { + return prcOrderMapper.selectPrcOrderByTransferNo(transferNo); + } + + @Override + public List selectPrcOrderList(PrcOrder query) + { + return prcOrderMapper.selectPrcOrderList(query); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public PrcOrder upsertFromUpstream(Map upstreamRow, TmsPriceBillRequest billReq, Date bizDate) + { + if (upstreamRow == null || upstreamRow.isEmpty()) + { + throw new ServiceException("upstream order row required"); + } + PrcOrder order = new PrcOrder(); + OracleOrderFiller.fillFromRow(order, upstreamRow, billReq, bizDate); + if (StringUtils.isEmpty(order.getTransferNo())) + { + throw new ServiceException("transferNo required for prc_order upsert"); + } + if (StringUtils.isEmpty(order.getOrderNo())) + { + throw new ServiceException("orderNo required for prc_order upsert"); + } + Date now = DateUtils.getNowDate(); + PrcOrder existing = prcOrderMapper.selectPrcOrderByTransferNo(order.getTransferNo()); + if (existing != null && StringUtils.isNotEmpty(existing.getOrderId())) + { + order.setOrderId(existing.getOrderId()); + order.setUpdateTime(now); + // keep prior status unless caller resets; default WAITING on re-sync before bill + order.setSuccessStatus(BillTaskSuccessStatus.WAITING.getCode()); + order.setFailCode(null); + prcOrderMapper.updatePrcOrder(order); + } + else + { + order.setOrderId(UUID.randomUUID().toString()); + order.setSuccessStatus(BillTaskSuccessStatus.WAITING.getCode()); + order.setFailCode(null); + order.setCreateTime(now); + order.setUpdateTime(now); + prcOrderMapper.insertPrcOrder(order); + } + + PrcOrderExt ext = new PrcOrderExt(); + ext.setOrderId(order.getOrderId()); + ext.setOrderNo(order.getOrderNo()); + OracleOrderExtFiller.fillFromRow(ext, upstreamRow); + ext.setCreateTime(now); + ext.setUpdateTime(now); + prcOrderExtMapper.upsertPrcOrderExt(ext); + return order; + } + + @Override + public void updateBillingStatus(String orderId, String successStatus, String failCode) + { + if (StringUtils.isEmpty(orderId)) + { + return; + } + prcOrderMapper.updateBillingStatus(orderId, successStatus, failCode, null); + } +} 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 4b673985..dc1a53b2 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 @@ -108,6 +108,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" limit #{limit} + + delete from prc_billing_task where transfer_no = #{transferNo} + + insert into prc_billing_task ( transfer_no, tracking_no, order_no, customer_code, bill_type, success_status, diff --git a/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml index 05bc058c..8c1ac2b3 100644 --- a/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml +++ b/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderBillMapper.xml @@ -8,6 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -84,7 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select bill_id, bill_key, order_no, tracking_no, transfer_no, + select bill_id, order_id, bill_key, order_no, tracking_no, transfer_no, belong_saler, belong_saler_code, settlement_man, settlement_man_code, service_man, service_man_code, customer_id, customer_code, customer_name, pieces, actual_weight, receive_weight, volume, volume_weight, pkg_length, pkg_width, pkg_height, @@ -102,11 +103,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select p.bill_id, p.bill_key, p.order_no, p.tracking_no, p.transfer_no, + select p.bill_id, p.order_id, p.bill_key, p.order_no, p.tracking_no, p.transfer_no, p.belong_saler, p.belong_saler_code, p.settlement_man, p.settlement_man_code, p.service_man, p.service_man_code, p.customer_id, p.customer_code, p.customer_name, p.pieces, p.actual_weight, p.receive_weight, p.volume, p.volume_weight, p.pkg_length, p.pkg_width, p.pkg_height, - p.shipper_name, p.consignee_name, p.dest_postcode, p.warehouse_code, p.order_time, e.pickup_date, p.order_remark, + p.shipper_name, p.consignee_name, p.dest_postcode, p.warehouse_code, p.order_time, o.pickup_date, p.order_remark, p.product_code, p.product_name, p.country_code, p.country_name, p.weight, p.biz_date, p.tms_id, p.match_source, p.match_message, p.price_set_id, p.price_set_code, p.price_set_name, p.set_type, p.bind_priority, p.customer_priceset_id, p.psv_id, p.psd_id, p.product_country_id, @@ -121,7 +122,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" p.customer_active_status, p.credit_arrears_status, p.refund_status, p.billing_fail_status, p.round_mode, p.created_by, p.create_time, p.updated_by, p.update_time from prc_order_bill p - left join prc_order_bill_ext e on e.bill_id = p.bill_id + left join prc_order o on o.order_id = p.order_id - - where bill_id = #{billId} + - + where order_no = #{orderNo} - - insert into prc_order_bill_ext ( - bill_id, order_no, upstream_id, line_no, package_num, actual_volume, cp_type, consignee_mobile, order_returnsign, trade_type, duty_type, battery_type, consignee_companyname, consignee_address, consignee_telephone, consignee_state, consignee_city, consignee_suburb, consignee_passportno, consignee_email, consignee_taxno, consignee_taxnotype, consignee_taxnocountry, consignee_streetno, consignee_doorno, shipper_taxnotype, shipper_taxno, shipper_taxnocountry, customer_id, product_imagepath, order_transactionurl, order_cargoamount, cargo_type, shipper_companyname, shipper_address1, shipper_address2, shipper_address3, shipper_city, shipper_state, shipper_postcode, shipper_country, shipper_telephone, shipper_suburb, shipper_email, shipper_passportno, import_code, import_name, import_companyname, import_address, import_address2, import_address3, import_telephone, import_email, import_postcode, import_city, import_state, import_country, buyerid, order_status, create_at, pay_type, line_code, line_name, product_type, line_type, cargo_name, product_floor_code, order_insurance, product_sum_price, product_sum, shipper_doorno, tariff_payment_account, topayment, product_floor, latest_trajectory, way_bill, pickup_date, bl_baging, bl_pickup, bag_date, org_order_status, status_description, zz_date, shipping_date, order_type, receiving_photo, freight, is_receivable, is_meet, bill_no_receivable, bill_no_meet, country_eingth_name, is_receivable_fee, settlement_fee, product_id, service_freight, is_pay_fee, has_added_surcharge, yf_fee, yf_totail_fee, trajectory_status, cargo_type_name, service_code, three_code, volume_height_old, volume_length_old, volume_width_old, register_man_old, bag_no_old, air_no_old, box_sizi_old, baging_man_old, retrieval_man_old, invoice_amount_old, invoice_title_old, invoice_weight_old, sku_old, hs_code_old, register_date_old, invoice_currency_old, trajectory_sub_state, sign_in_time, warehouse_time, declaration_time, release_time, station_time, takeoff_time, landing_time, clearance_and_delivery_time, supplier_name, credit_code, other_id, platform_code, sync_shipment_status, update_weight, other_bag_no, bag_flag, online_time, outbound_time, air_confirm_date, shipment_type, track_query_time, air_confirm_time, package_type, dimensional_weight_factor, update_by, customer_pickup_site, barcode_number, tracking_reflect_status, remote_postcode, clearance_time, arrive_stock_time, departure_time, first_deliver_time, hs_code_tax_count, hs_code_tax_amount, hs_code_tax_currency, invoice_url, clearance_no, push_weight, internal_check_time, air_delay_time, first_landing_time, second_takeoff_time, des_port_check_time, stay_remark, miss_box_remark, product_channel_id, customer_track_id, register_site, package_type_financial, mrn, create_time + + insert into prc_order_ext ( + order_id, order_no, upstream_id, line_no, package_num, actual_volume, cp_type, consignee_mobile, order_returnsign, trade_type, duty_type, battery_type, consignee_companyname, consignee_address, consignee_telephone, consignee_state, consignee_city, consignee_suburb, consignee_passportno, consignee_email, consignee_taxno, consignee_taxnotype, consignee_taxnocountry, consignee_streetno, consignee_doorno, shipper_taxnotype, shipper_taxno, shipper_taxnocountry, customer_id, product_imagepath, order_transactionurl, order_cargoamount, cargo_type, shipper_companyname, shipper_address1, shipper_address2, shipper_address3, shipper_city, shipper_state, shipper_postcode, shipper_country, shipper_telephone, shipper_suburb, shipper_email, shipper_passportno, import_code, import_name, import_companyname, import_address, import_address2, import_address3, import_telephone, import_email, import_postcode, import_city, import_state, import_country, buyerid, create_at, pay_type, line_code, line_name, product_type, line_type, cargo_name, order_insurance, product_sum_price, product_sum, shipper_doorno, tariff_payment_account, topayment, product_floor, latest_trajectory, way_bill, bl_baging, bl_pickup, bag_date, org_order_status, status_description, zz_date, shipping_date, order_type, receiving_photo, freight, is_receivable, is_meet, bill_no_receivable, bill_no_meet, country_eingth_name, is_receivable_fee, settlement_fee, product_id, service_freight, is_pay_fee, has_added_surcharge, yf_fee, yf_totail_fee, trajectory_status, cargo_type_name, service_code, three_code, volume_height_old, volume_length_old, volume_width_old, register_man_old, bag_no_old, air_no_old, box_sizi_old, baging_man_old, retrieval_man_old, invoice_amount_old, invoice_title_old, invoice_weight_old, sku_old, hs_code_old, register_date_old, invoice_currency_old, trajectory_sub_state, sign_in_time, warehouse_time, declaration_time, release_time, station_time, takeoff_time, landing_time, clearance_and_delivery_time, supplier_name, credit_code, other_id, platform_code, sync_shipment_status, update_weight, other_bag_no, bag_flag, online_time, outbound_time, air_confirm_date, shipment_type, track_query_time, air_confirm_time, package_type, update_by, customer_pickup_site, barcode_number, tracking_reflect_status, remote_postcode, clearance_time, arrive_stock_time, departure_time, first_deliver_time, hs_code_tax_count, hs_code_tax_amount, hs_code_tax_currency, invoice_url, clearance_no, push_weight, internal_check_time, air_delay_time, first_landing_time, second_takeoff_time, des_port_check_time, stay_remark, miss_box_remark, product_channel_id, customer_track_id, register_site, package_type_financial, mrn, create_time ) values ( - #{billId}, + #{orderId}, #{orderNo}, #{upstreamId}, #{lineNo}, @@ -258,7 +254,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{importState}, #{importCountry}, #{buyerid}, - #{orderStatus}, #{createAt}, #{payType}, #{lineCode}, @@ -266,7 +261,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{productType}, #{lineType}, #{cargoName}, - #{productFloorCode}, #{orderInsurance}, #{productSumPrice}, #{productSum}, @@ -276,7 +270,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{productFloor}, #{latestTrajectory}, #{wayBill}, - #{pickupDate}, #{blBaging}, #{blPickup}, #{bagDate}, @@ -344,7 +337,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{trackQueryTime}, #{airConfirmTime}, #{packageType}, - #{dimensionalWeightFactor}, #{updateBy}, #{customerPickupSite}, #{barcodeNumber}, @@ -376,11 +368,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) - - insert into prc_order_bill_ext ( - bill_id, order_no, upstream_id, line_no, package_num, actual_volume, cp_type, consignee_mobile, order_returnsign, trade_type, duty_type, battery_type, consignee_companyname, consignee_address, consignee_telephone, consignee_state, consignee_city, consignee_suburb, consignee_passportno, consignee_email, consignee_taxno, consignee_taxnotype, consignee_taxnocountry, consignee_streetno, consignee_doorno, shipper_taxnotype, shipper_taxno, shipper_taxnocountry, customer_id, product_imagepath, order_transactionurl, order_cargoamount, cargo_type, shipper_companyname, shipper_address1, shipper_address2, shipper_address3, shipper_city, shipper_state, shipper_postcode, shipper_country, shipper_telephone, shipper_suburb, shipper_email, shipper_passportno, import_code, import_name, import_companyname, import_address, import_address2, import_address3, import_telephone, import_email, import_postcode, import_city, import_state, import_country, buyerid, order_status, create_at, pay_type, line_code, line_name, product_type, line_type, cargo_name, product_floor_code, order_insurance, product_sum_price, product_sum, shipper_doorno, tariff_payment_account, topayment, product_floor, latest_trajectory, way_bill, pickup_date, bl_baging, bl_pickup, bag_date, org_order_status, status_description, zz_date, shipping_date, order_type, receiving_photo, freight, is_receivable, is_meet, bill_no_receivable, bill_no_meet, country_eingth_name, is_receivable_fee, settlement_fee, product_id, service_freight, is_pay_fee, has_added_surcharge, yf_fee, yf_totail_fee, trajectory_status, cargo_type_name, service_code, three_code, volume_height_old, volume_length_old, volume_width_old, register_man_old, bag_no_old, air_no_old, box_sizi_old, baging_man_old, retrieval_man_old, invoice_amount_old, invoice_title_old, invoice_weight_old, sku_old, hs_code_old, register_date_old, invoice_currency_old, trajectory_sub_state, sign_in_time, warehouse_time, declaration_time, release_time, station_time, takeoff_time, landing_time, clearance_and_delivery_time, supplier_name, credit_code, other_id, platform_code, sync_shipment_status, update_weight, other_bag_no, bag_flag, online_time, outbound_time, air_confirm_date, shipment_type, track_query_time, air_confirm_time, package_type, dimensional_weight_factor, update_by, customer_pickup_site, barcode_number, tracking_reflect_status, remote_postcode, clearance_time, arrive_stock_time, departure_time, first_deliver_time, hs_code_tax_count, hs_code_tax_amount, hs_code_tax_currency, invoice_url, clearance_no, push_weight, internal_check_time, air_delay_time, first_landing_time, second_takeoff_time, des_port_check_time, stay_remark, miss_box_remark, product_channel_id, customer_track_id, register_site, package_type_financial, mrn, create_time + + insert into prc_order_ext ( + order_id, order_no, upstream_id, line_no, package_num, actual_volume, cp_type, consignee_mobile, order_returnsign, trade_type, duty_type, battery_type, consignee_companyname, consignee_address, consignee_telephone, consignee_state, consignee_city, consignee_suburb, consignee_passportno, consignee_email, consignee_taxno, consignee_taxnotype, consignee_taxnocountry, consignee_streetno, consignee_doorno, shipper_taxnotype, shipper_taxno, shipper_taxnocountry, customer_id, product_imagepath, order_transactionurl, order_cargoamount, cargo_type, shipper_companyname, shipper_address1, shipper_address2, shipper_address3, shipper_city, shipper_state, shipper_postcode, shipper_country, shipper_telephone, shipper_suburb, shipper_email, shipper_passportno, import_code, import_name, import_companyname, import_address, import_address2, import_address3, import_telephone, import_email, import_postcode, import_city, import_state, import_country, buyerid, create_at, pay_type, line_code, line_name, product_type, line_type, cargo_name, order_insurance, product_sum_price, product_sum, shipper_doorno, tariff_payment_account, topayment, product_floor, latest_trajectory, way_bill, bl_baging, bl_pickup, bag_date, org_order_status, status_description, zz_date, shipping_date, order_type, receiving_photo, freight, is_receivable, is_meet, bill_no_receivable, bill_no_meet, country_eingth_name, is_receivable_fee, settlement_fee, product_id, service_freight, is_pay_fee, has_added_surcharge, yf_fee, yf_totail_fee, trajectory_status, cargo_type_name, service_code, three_code, volume_height_old, volume_length_old, volume_width_old, register_man_old, bag_no_old, air_no_old, box_sizi_old, baging_man_old, retrieval_man_old, invoice_amount_old, invoice_title_old, invoice_weight_old, sku_old, hs_code_old, register_date_old, invoice_currency_old, trajectory_sub_state, sign_in_time, warehouse_time, declaration_time, release_time, station_time, takeoff_time, landing_time, clearance_and_delivery_time, supplier_name, credit_code, other_id, platform_code, sync_shipment_status, update_weight, other_bag_no, bag_flag, online_time, outbound_time, air_confirm_date, shipment_type, track_query_time, air_confirm_time, package_type, update_by, customer_pickup_site, barcode_number, tracking_reflect_status, remote_postcode, clearance_time, arrive_stock_time, departure_time, first_deliver_time, hs_code_tax_count, hs_code_tax_amount, hs_code_tax_currency, invoice_url, clearance_no, push_weight, internal_check_time, air_delay_time, first_landing_time, second_takeoff_time, des_port_check_time, stay_remark, miss_box_remark, product_channel_id, customer_track_id, register_site, package_type_financial, mrn, create_time ) values ( - #{billId}, + #{orderId}, #{orderNo}, #{upstreamId}, #{lineNo}, @@ -438,7 +430,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{importState}, #{importCountry}, #{buyerid}, - #{orderStatus}, #{createAt}, #{payType}, #{lineCode}, @@ -446,7 +437,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{productType}, #{lineType}, #{cargoName}, - #{productFloorCode}, #{orderInsurance}, #{productSumPrice}, #{productSum}, @@ -456,7 +446,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{productFloor}, #{latestTrajectory}, #{wayBill}, - #{pickupDate}, #{blBaging}, #{blPickup}, #{bagDate}, @@ -524,7 +513,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{trackQueryTime}, #{airConfirmTime}, #{packageType}, - #{dimensionalWeightFactor}, #{updateBy}, #{customerPickupSite}, #{barcodeNumber}, @@ -612,7 +600,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" import_state = values(import_state), import_country = values(import_country), buyerid = values(buyerid), - order_status = values(order_status), create_at = values(create_at), pay_type = values(pay_type), line_code = values(line_code), @@ -620,7 +607,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" product_type = values(product_type), line_type = values(line_type), cargo_name = values(cargo_name), - product_floor_code = values(product_floor_code), order_insurance = values(order_insurance), product_sum_price = values(product_sum_price), product_sum = values(product_sum), @@ -630,7 +616,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" product_floor = values(product_floor), latest_trajectory = values(latest_trajectory), way_bill = values(way_bill), - pickup_date = values(pickup_date), bl_baging = values(bl_baging), bl_pickup = values(bl_pickup), bag_date = values(bag_date), @@ -698,7 +683,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" track_query_time = values(track_query_time), air_confirm_time = values(air_confirm_time), package_type = values(package_type), - dimensional_weight_factor = values(dimensional_weight_factor), update_by = values(update_by), customer_pickup_site = values(customer_pickup_site), barcode_number = values(barcode_number), diff --git a/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderMapper.xml new file mode 100644 index 00000000..bfdd1c9c --- /dev/null +++ b/bms-back/bms-system/src/main/resources/mapper/price/PrcOrderMapper.xml @@ -0,0 +1,256 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select order_id, order_no, tracking_no, transfer_no, track_id, + belong_saler, belong_saler_code, settlement_man, settlement_man_code, service_man, service_man_code, + customer_code, customer_name, pieces, actual_weight, weight, dimensional_weight_factor, + volume, volume_weight, pkg_length, pkg_width, pkg_height, + shipper_name, consignee_name, consignee_postcode, warehouse_code, + order_time, order_remark, product_code, product_name, product_floor_code, + country_code, country_name, order_status, pickup_date, biz_date, + success_status, fail_code, created_by, create_time, updated_by, update_time + from prc_order + + + + + + + + + + + + insert into prc_order ( + order_id, order_no, tracking_no, transfer_no, track_id, + belong_saler, belong_saler_code, settlement_man, settlement_man_code, service_man, service_man_code, + customer_code, customer_name, pieces, actual_weight, weight, dimensional_weight_factor, + volume, volume_weight, pkg_length, pkg_width, pkg_height, + shipper_name, consignee_name, consignee_postcode, warehouse_code, + order_time, order_remark, product_code, product_name, product_floor_code, + country_code, country_name, order_status, pickup_date, biz_date, + success_status, fail_code, created_by, create_time, updated_by, update_time + ) values ( + #{orderId}, #{orderNo}, #{trackingNo}, #{transferNo}, #{trackId}, + #{belongSaler}, #{belongSalerCode}, #{settlementMan}, #{settlementManCode}, #{serviceMan}, #{serviceManCode}, + #{customerCode}, #{customerName}, #{pieces}, #{actualWeight}, #{weight}, #{dimensionalWeightFactor}, + #{volume}, #{volumeWeight}, #{pkgLength}, #{pkgWidth}, #{pkgHeight}, + #{shipperName}, #{consigneeName}, #{consigneePostcode}, #{warehouseCode}, + #{orderTime}, #{orderRemark}, #{productCode}, #{productName}, #{productFloorCode}, + #{countryCode}, #{countryName}, #{orderStatus}, #{pickupDate}, #{bizDate}, + #{successStatus}, #{failCode}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime} + ) + + + + update prc_order + + order_no = #{orderNo}, + tracking_no = #{trackingNo}, + track_id = #{trackId}, + belong_saler = #{belongSaler}, + belong_saler_code = #{belongSalerCode}, + settlement_man = #{settlementMan}, + settlement_man_code = #{settlementManCode}, + service_man = #{serviceMan}, + service_man_code = #{serviceManCode}, + customer_code = #{customerCode}, + customer_name = #{customerName}, + pieces = #{pieces}, + actual_weight = #{actualWeight}, + weight = #{weight}, + dimensional_weight_factor = #{dimensionalWeightFactor}, + volume = #{volume}, + volume_weight = #{volumeWeight}, + pkg_length = #{pkgLength}, + pkg_width = #{pkgWidth}, + pkg_height = #{pkgHeight}, + shipper_name = #{shipperName}, + consignee_name = #{consigneeName}, + consignee_postcode = #{consigneePostcode}, + warehouse_code = #{warehouseCode}, + order_time = #{orderTime}, + order_remark = #{orderRemark}, + product_code = #{productCode}, + product_name = #{productName}, + product_floor_code = #{productFloorCode}, + country_code = #{countryCode}, + country_name = #{countryName}, + order_status = #{orderStatus}, + pickup_date = #{pickupDate}, + biz_date = #{bizDate}, + success_status = #{successStatus}, + fail_code = #{failCode}, + updated_by = #{updateBy}, + update_time = #{updateTime} + + where order_id = #{orderId} + + + + + insert into prc_order ( + order_id, order_no, tracking_no, transfer_no, track_id, + belong_saler, belong_saler_code, settlement_man, settlement_man_code, service_man, service_man_code, + customer_code, customer_name, pieces, actual_weight, weight, dimensional_weight_factor, + volume, volume_weight, pkg_length, pkg_width, pkg_height, + shipper_name, consignee_name, consignee_postcode, warehouse_code, + order_time, order_remark, product_code, product_name, product_floor_code, + country_code, country_name, order_status, pickup_date, biz_date, + success_status, fail_code, created_by, create_time, updated_by, update_time + ) values ( + #{orderId}, #{orderNo}, #{trackingNo}, #{transferNo}, #{trackId}, + #{belongSaler}, #{belongSalerCode}, #{settlementMan}, #{settlementManCode}, #{serviceMan}, #{serviceManCode}, + #{customerCode}, #{customerName}, #{pieces}, #{actualWeight}, #{weight}, #{dimensionalWeightFactor}, + #{volume}, #{volumeWeight}, #{pkgLength}, #{pkgWidth}, #{pkgHeight}, + #{shipperName}, #{consigneeName}, #{consigneePostcode}, #{warehouseCode}, + #{orderTime}, #{orderRemark}, #{productCode}, #{productName}, #{productFloorCode}, + #{countryCode}, #{countryName}, #{orderStatus}, #{pickupDate}, #{bizDate}, + #{successStatus}, #{failCode}, #{createBy}, #{createTime}, #{updateBy}, #{updateTime} + ) + on duplicate key update + order_id = values(order_id), + order_no = values(order_no), + tracking_no = values(tracking_no), + track_id = values(track_id), + belong_saler = values(belong_saler), + belong_saler_code = values(belong_saler_code), + settlement_man = values(settlement_man), + settlement_man_code = values(settlement_man_code), + service_man = values(service_man), + service_man_code = values(service_man_code), + customer_code = values(customer_code), + customer_name = values(customer_name), + pieces = values(pieces), + actual_weight = values(actual_weight), + weight = values(weight), + dimensional_weight_factor = values(dimensional_weight_factor), + volume = values(volume), + volume_weight = values(volume_weight), + pkg_length = values(pkg_length), + pkg_width = values(pkg_width), + pkg_height = values(pkg_height), + shipper_name = values(shipper_name), + consignee_name = values(consignee_name), + consignee_postcode = values(consignee_postcode), + warehouse_code = values(warehouse_code), + order_time = values(order_time), + order_remark = values(order_remark), + product_code = values(product_code), + product_name = values(product_name), + product_floor_code = values(product_floor_code), + country_code = values(country_code), + country_name = values(country_name), + order_status = values(order_status), + pickup_date = values(pickup_date), + biz_date = values(biz_date), + success_status = values(success_status), + fail_code = values(fail_code), + updated_by = values(updated_by), + update_time = values(update_time) + + + + update prc_order + set success_status = #{successStatus}, + fail_code = #{failCode}, + updated_by = #{updateBy}, + update_time = now() + where order_id = #{orderId} + + diff --git a/bms-back/sql/price/prc_order.sql b/bms-back/sql/price/prc_order.sql new file mode 100644 index 00000000..1d544145 --- /dev/null +++ b/bms-back/sql/price/prc_order.sql @@ -0,0 +1,267 @@ +-- ------------------------------------------------------------ +-- REVIEW DRAFT: prc_order + rename ext -> prc_order_ext +-- Confirm schema before app code changes. +-- +-- Target model: +-- prc_billing_task --transfer_no--> TAB_ORDER +-- -> upsert prc_order (UK transfer_no), delete task by transfer_no +-- -> prc_order 1:1 prc_order_ext (PK/FK = order_id) +-- -> prc_order_bill keeps bill_id; adds order_id + transfer_no +-- +-- Naming: +-- order_id = BMS UUID PK (same rule as bill_id) +-- old prc_order_bill_ext renamed to prc_order_ext +-- columns moved to prc_order are DROPped from prc_order_ext +-- ------------------------------------------------------------ + +SET NAMES utf8mb4; + +-- ============================================================ +-- 1) New table: prc_order +-- ============================================================ +-- TAB_ORDER mapping (core): +-- ORDER_ID -> order_no +-- ORG_ORDER_ID -> tracking_no +-- TRANSFER_ORDER_ID -> transfer_no +-- TRACK_ID -> track_id +-- CUSTOMER_CODE/NAME -> customer_code/name +-- PRODUCT_CODE/NAME -> product_code/name +-- PRODUCT_FLOOR_CODE -> product_floor_code +-- COUNTRY / COUNTRY_NAME -> country_code / country_name +-- CONSIGNEE_POSTCODE -> consignee_postcode +-- CONSIGNEE_NAME -> consignee_name +-- SHIPPER_NAME -> shipper_name +-- REGISTER_SITE_CODE -> warehouse_code +-- ORDER_PIECE/PACKAGE_NUM -> pieces +-- ACTUAL_WEIGHT -> actual_weight +-- VOLUME -> volume +-- VOLUME_WEIGHT -> volume_weight +-- LENGTH/WIDTH/HEIGHT -> pkg_length/width/height +-- DIMENSIONAL_WEIGHT_FACTOR -> dimensional_weight_factor +-- WEIGHT -> weight +-- BELONG_SALER* -> belong_saler / belong_saler_code +-- SETTLEMENT_MAN* -> settlement_man / settlement_man_code +-- SERVICE_MAN* -> service_man / service_man_code +-- TRACK_REMARK/... -> order_remark +-- ORDER_STATUS -> order_status +-- PICKUP_DATE -> pickup_date +-- CREATE_DATE -> order_time +-- (task.bill_time) -> biz_date +-- ============================================================ +CREATE TABLE IF NOT EXISTS `prc_order` ( + `order_id` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '订单ID(BMS主键,规则同 bill_id:UUID)', + `order_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户订单号(TAB_ORDER.ORDER_ID)', + `tracking_no` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '运单号(TAB_ORDER.ORG_ORDER_ID)', + `transfer_no` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '转单号(TAB_ORDER.TRANSFER_ORDER_ID,唯一)', + `track_id` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '轨迹ID(TAB_ORDER.TRACK_ID)', + `belong_saler` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '所属销售员(TAB_ORDER.BELONG_SALER*)', + `belong_saler_code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '销售员编码(TAB_ORDER.BELONG_SALER_CODE)', + `settlement_man` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '结算员(TAB_ORDER.SETTLEMENT_MAN*)', + `settlement_man_code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '结算员编码(TAB_ORDER.SETTLEMENT_MAN_CODE)', + `service_man` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客服员(TAB_ORDER.SERVICE_MAN*)', + `service_man_code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客服员编码', + `customer_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户代码(TAB_ORDER.CUSTOMER_CODE)', + `customer_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '客户名称(TAB_ORDER.CUSTOMER_NAME)', + `pieces` int(11) DEFAULT NULL COMMENT '件数(TAB_ORDER.ORDER_PIECE/PACKAGE_NUM)', + `actual_weight` decimal(10,3) DEFAULT NULL COMMENT '实际重量KG(TAB_ORDER.ACTUAL_WEIGHT)', + `weight` decimal(10,3) DEFAULT NULL COMMENT '实重/收货重KG(TAB_ORDER.WEIGHT)', + `dimensional_weight_factor` decimal(10,3) DEFAULT NULL COMMENT '计费重KG(TAB_ORDER.DIMENSIONAL_WEIGHT_FACTOR)', + `volume` decimal(12,4) DEFAULT NULL COMMENT '体积m3(TAB_ORDER.VOLUME)', + `volume_weight` decimal(10,3) DEFAULT NULL COMMENT '体积重KG(TAB_ORDER.VOLUME_WEIGHT)', + `pkg_length` decimal(10,2) DEFAULT NULL COMMENT '长CM(TAB_ORDER.LENGTH)', + `pkg_width` decimal(10,2) DEFAULT NULL COMMENT '宽CM(TAB_ORDER.WIDTH)', + `pkg_height` decimal(10,2) DEFAULT NULL COMMENT '高CM(TAB_ORDER.HEIGHT)', + `shipper_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '发件人(TAB_ORDER.SHIPPER_NAME)', + `consignee_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '收件人(TAB_ORDER.CONSIGNEE_NAME)', + `consignee_postcode` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '收件人邮编(TAB_ORDER.CONSIGNEE_POSTCODE)', + `warehouse_code` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '仓库(TAB_ORDER.REGISTER_SITE_CODE)', + `order_time` datetime DEFAULT NULL COMMENT '下单时间(TAB_ORDER.CREATE_DATE)', + `order_remark` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单备注(TAB_ORDER.TRACK_REMARK/等)', + `product_code` varchar(20) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '产品代码(TAB_ORDER.PRODUCT_CODE)', + `product_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '产品名称(TAB_ORDER.PRODUCT_NAME)', + `product_floor_code` text COLLATE utf8mb4_unicode_ci COMMENT '产品底级/渠道编码(TAB_ORDER.PRODUCT_FLOOR_CODE)', + `country_code` char(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '国家二字码(TAB_ORDER.COUNTRY)', + `country_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '国家名称(TAB_ORDER.COUNTRY_NAME)', + `order_status` tinyint(4) DEFAULT NULL COMMENT '订单状态(TAB_ORDER.ORDER_STATUS)', + `pickup_date` datetime DEFAULT NULL COMMENT '提货/收件时间(TAB_ORDER.PICKUP_DATE)', + `biz_date` datetime DEFAULT NULL COMMENT '计费时间(任务bill_time,非上游字段)', + `success_status` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'WAITING' COMMENT '计费成功状态:WAITING待处理 SUCCESS成功 FAILED失败', + `fail_code` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '计费失败码(同 prc_billing_task.fail_code / BillTaskFailCode)', + `created_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建人', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `updated_by` varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新人', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (`order_id`), + UNIQUE KEY `uk_prc_order_transfer_no` (`transfer_no`), + KEY `idx_prc_order_order_no` (`order_no`), + KEY `idx_prc_order_tracking_no` (`tracking_no`), + KEY `idx_prc_order_track_id` (`track_id`), + KEY `idx_prc_order_customer` (`customer_code`,`biz_date`), + KEY `idx_prc_order_pickup_date` (`pickup_date`), + KEY `idx_prc_order_success_status` (`success_status`,`create_time`), + KEY `idx_prc_order_fail_code` (`fail_code`), + KEY `idx_prc_order_product` (`product_code`,`country_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单主表(上游TAB_ORDER核心字段+计费状态)'; + +-- ============================================================ +-- 2) prc_order_bill: add order_id (keep bill_id; keep transfer_no) +-- ============================================================ +SET @col := ( + SELECT COLUMN_NAME FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_bill' + AND COLUMN_NAME = 'order_id' + LIMIT 1 +); +SET @sql := IF( + @col IS NULL, + 'ALTER TABLE prc_order_bill ADD COLUMN order_id varchar(36) DEFAULT NULL COMMENT \'订单ID,对应 prc_order.order_id\' AFTER bill_id, ADD KEY idx_order_bill_order_id (order_id)', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- Optional FK (enable after data backfill): +-- ALTER TABLE prc_order_bill +-- ADD CONSTRAINT fk_order_bill_order +-- FOREIGN KEY (order_id) REFERENCES prc_order(order_id); + +-- ============================================================ +-- 3) prc_order_bill_ext -> prc_order_ext, rebind to prc_order +-- WARNING: prefer empty/dev env; production needs data migration. +-- ============================================================ + +-- 3.1 Drop old FK to prc_order_bill (table may still be old name) +SET @fk := ( + SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_bill_ext' + AND CONSTRAINT_TYPE = 'FOREIGN KEY' + AND CONSTRAINT_NAME = 'fk_order_bill_ext_bill' + LIMIT 1 +); +SET @sql := IF( + @fk IS NOT NULL, + 'ALTER TABLE prc_order_bill_ext DROP FOREIGN KEY fk_order_bill_ext_bill', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- 3.2 Rename table bill_ext -> order_ext +SET @tbl := ( + SELECT TABLE_NAME FROM information_schema.TABLES + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_bill_ext' + LIMIT 1 +); +SET @sql := IF( + @tbl IS NOT NULL, + 'RENAME TABLE prc_order_bill_ext TO prc_order_ext', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- 3.3 Rename PK column bill_id -> order_id +SET @col := ( + SELECT COLUMN_NAME FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_ext' + AND COLUMN_NAME = 'bill_id' + LIMIT 1 +); +SET @sql := IF( + @col IS NOT NULL, + 'ALTER TABLE prc_order_ext CHANGE COLUMN bill_id order_id varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT \'订单ID,对应 prc_order.order_id\'', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- 3.4 Drop columns moved onto prc_order +SET @col := ( + SELECT COLUMN_NAME FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_ext' + AND COLUMN_NAME = 'product_floor_code' + LIMIT 1 +); +SET @sql := IF( + @col IS NOT NULL, + 'ALTER TABLE prc_order_ext DROP COLUMN `product_floor_code`', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @col := ( + SELECT COLUMN_NAME FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_ext' + AND COLUMN_NAME = 'order_status' + LIMIT 1 +); +SET @sql := IF( + @col IS NOT NULL, + 'ALTER TABLE prc_order_ext DROP COLUMN `order_status`', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @col := ( + SELECT COLUMN_NAME FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_ext' + AND COLUMN_NAME = 'pickup_date' + LIMIT 1 +); +SET @sql := IF( + @col IS NOT NULL, + 'ALTER TABLE prc_order_ext DROP COLUMN `pickup_date`', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @col := ( + SELECT COLUMN_NAME FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_ext' + AND COLUMN_NAME = 'dimensional_weight_factor' + LIMIT 1 +); +SET @sql := IF( + @col IS NOT NULL, + 'ALTER TABLE prc_order_ext DROP COLUMN `dimensional_weight_factor`', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- 3.5 MUST empty ext before FK (old order_id values are former bill_id) +-- Run these 3 statements even if the rest of the script already succeeded. +TRUNCATE TABLE prc_order_ext; + +-- 3.6 Add FK to prc_order (skip if already exists) +SET @fk := ( + SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_ext' + AND CONSTRAINT_TYPE = 'FOREIGN KEY' + AND CONSTRAINT_NAME = 'fk_order_ext_order' + LIMIT 1 +); +SET @sql := IF( + @fk IS NULL, + 'ALTER TABLE prc_order_ext ADD CONSTRAINT fk_order_ext_order FOREIGN KEY (order_id) REFERENCES prc_order (order_id) ON DELETE CASCADE', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +-- 3.7 Refresh table comment +ALTER TABLE prc_order_ext COMMENT = '订单扩展表(上游TAB_ORDER非主表字段,挂 prc_order)'; + +-- ============================================================ +-- Review checklist +-- ------------------------------------------------------------ +-- prc_order: identity + L/W/H + weights + staff + billing status +-- prc_order_ext: leftover TAB_ORDER only (no dup of moved cols) +-- prc_order_bill: pricing result; +order_id; still has bill_id +-- Dropped from ext (now on prc_order): +-- product_floor_code, order_status, pickup_date, dimensional_weight_factor +-- ============================================================ + diff --git a/bms-back/sql/price/prc_order_ext_fk_fix.sql b/bms-back/sql/price/prc_order_ext_fk_fix.sql new file mode 100644 index 00000000..9fe8be55 --- /dev/null +++ b/bms-back/sql/price/prc_order_ext_fk_fix.sql @@ -0,0 +1,30 @@ +-- Fix 1452: empty orphan prc_order_ext then add FK to prc_order +-- Confirm DB = bms, then run in order. + +SELECT DATABASE() AS current_db; +SELECT COUNT(*) AS ext_rows_before FROM prc_order_ext; +SELECT COUNT(*) AS order_rows FROM prc_order; + +TRUNCATE TABLE prc_order_ext; + +SELECT COUNT(*) AS ext_rows_after FROM prc_order_ext; + +-- Drop failed/partial FK name if present (ignore error if missing) +SET @fk := ( + SELECT CONSTRAINT_NAME FROM information_schema.TABLE_CONSTRAINTS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = 'prc_order_ext' + AND CONSTRAINT_TYPE = 'FOREIGN KEY' + AND CONSTRAINT_NAME = 'fk_order_ext_order' + LIMIT 1 +); +SET @sql := IF( + @fk IS NOT NULL, + 'ALTER TABLE prc_order_ext DROP FOREIGN KEY fk_order_ext_order', + 'SELECT 1' +); +PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +ALTER TABLE prc_order_ext + ADD CONSTRAINT fk_order_ext_order + FOREIGN KEY (order_id) REFERENCES prc_order (order_id) ON DELETE CASCADE; diff --git a/bms-front/src/api/monitor/prcOrder.js b/bms-front/src/api/monitor/prcOrder.js new file mode 100644 index 00000000..0b607d1f --- /dev/null +++ b/bms-front/src/api/monitor/prcOrder.js @@ -0,0 +1,31 @@ +import request from '@/utils/request' + +export function listPrcOrder(query) { + return request({ + url: '/monitor/prcOrder/list', + method: 'get', + params: query + }) +} + +export function getPrcOrder(orderId) { + return request({ + url: '/monitor/prcOrder/' + orderId, + method: 'get' + }) +} + +export function retryPrcOrder(orderId) { + return request({ + url: '/monitor/prcOrder/retry/' + orderId, + method: 'post' + }) +} + +export function retryPrcOrderBatch(orderIds) { + return request({ + url: '/monitor/prcOrder/retry', + method: 'post', + data: orderIds + }) +} diff --git a/bms-front/src/views/monitor/billingTask/components/BillingTaskDetailDrawer.vue b/bms-front/src/views/monitor/billingTask/components/BillingTaskDetailDrawer.vue index 0b5a6495..9966486d 100644 --- a/bms-front/src/views/monitor/billingTask/components/BillingTaskDetailDrawer.vue +++ b/bms-front/src/views/monitor/billingTask/components/BillingTaskDetailDrawer.vue @@ -5,65 +5,47 @@ diff --git a/bms-front/src/views/monitor/billingTask/index.vue b/bms-front/src/views/monitor/billingTask/index.vue index 524080b6..a3cf9b54 100644 --- a/bms-front/src/views/monitor/billingTask/index.vue +++ b/bms-front/src/views/monitor/billingTask/index.vue @@ -1,38 +1,15 @@