增加订单主表
This commit is contained in:
@@ -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<String> orderNos;
|
||||
private String trackingNo;
|
||||
private List<String> trackingNos;
|
||||
private String transferNo;
|
||||
private List<String> 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<String> 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<String> 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<String> failCodes;
|
||||
}
|
||||
@@ -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<String> 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;
|
||||
|
||||
+3
-8
@@ -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;
|
||||
@@ -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<String, Object> upstreamRow;
|
||||
|
||||
@JsonIgnore
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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<PrcOrder> 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);
|
||||
}
|
||||
+5
-9
@@ -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<String, Object> row)
|
||||
public static void fillFromRow(PrcOrderExt ext, Map<String, Object> 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"));
|
||||
@@ -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<String, Object> 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<String, Object> 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<String, Object> row, String key)
|
||||
{
|
||||
BigDecimal d = decimal(row, key);
|
||||
return d == null ? null : Integer.valueOf(d.intValue());
|
||||
}
|
||||
|
||||
private static BigDecimal decimal(Map<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> e : row.entrySet())
|
||||
{
|
||||
if (e.getKey() != null && e.getKey().equalsIgnoreCase(key))
|
||||
{
|
||||
return e.getValue();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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<PrcOrder> 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<String, Object> upstreamRow, TmsPriceBillRequest billReq, Date bizDate);
|
||||
|
||||
void updateBillingStatus(String orderId, String successStatus, String failCode);
|
||||
}
|
||||
+90
-28
@@ -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<String, Object> 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<String, Object> 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)
|
||||
{
|
||||
|
||||
+15
-10
@@ -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<String, Object> 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<TmsPriceQuoteFeeLine> toIncomeFeeLines(List<PrcIncomeBillFee> fees)
|
||||
|
||||
+108
@@ -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<PrcOrder> selectPrcOrderList(PrcOrder query)
|
||||
{
|
||||
return prcOrderMapper.selectPrcOrderList(query);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public PrcOrder upsertFromUpstream(Map<String, Object> 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user