修改订单号功能

This commit is contained in:
wuweihua
2026-09-21 10:55:41 +08:00
parent ab11c235e5
commit 1e31d71f0f
17 changed files with 1585 additions and 60 deletions
@@ -23,6 +23,12 @@ public class PrcOrderBill extends BaseEntity
private String trackingNo;
/** transfer order no */
private String transferNo;
/** 所属销售员 */
private String belongSaler;
/** 结算员 */
private String settlementMan;
/** 客服员 */
private String serviceMan;
private Long customerId;
private String customerCode;
private String customerName;
@@ -1,22 +1,216 @@
package com.ruoyi.price.domain;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import lombok.Data;
/** Extension of prc_order_bill: upstream sync payload snapshot. */
/** 计费订单扩展表:TAB_ORDER 剩余字段 + 同步请求快照 */
@Data
public class PrcOrderBillExt implements Serializable
{
private static final long serialVersionUID = 1L;
/** prc_order_bill.bill_id */
private String billId;
/** business order no */
private String orderNo;
/** upstream request JSON after prc_order_bill persist success */
private String syncJson;
private String upstreamId;
private String lineNo;
private Integer packageNum;
private BigDecimal actualVolume;
private Integer cpType;
private String consigneeMobile;
private String orderReturnsign;
private String tradeType;
private String dutyType;
private String batteryType;
private String consigneeCompanyname;
private String consigneeAddress;
private String consigneeTelephone;
private String consigneeState;
private String consigneeCity;
private String consigneeSuburb;
private String consigneePassportno;
private String consigneeEmail;
private String consigneeTaxno;
private String consigneeTaxnotype;
private String consigneeTaxnocountry;
private String consigneeStreetno;
private String consigneeDoorno;
private String shipperTaxnotype;
private String shipperTaxno;
private String shipperTaxnocountry;
private String customerId;
private String productImagepath;
private String orderTransactionurl;
private BigDecimal orderCargoamount;
private String cargoType;
private String shipperCompanyname;
private String shipperAddress1;
private String shipperAddress2;
private String shipperAddress3;
private String shipperCity;
private String shipperState;
private String shipperPostcode;
private String shipperCountry;
private String shipperTelephone;
private String shipperSuburb;
private String shipperEmail;
private String shipperPassportno;
private String importCode;
private String importName;
private String importCompanyname;
private String importAddress;
private String importAddress2;
private String importAddress3;
private String importTelephone;
private String importEmail;
private String importPostcode;
private String importCity;
private String importState;
private String importCountry;
private String buyerid;
private Integer orderStatus;
private String createAt;
private Integer payType;
private String lineCode;
private String lineName;
private String productType;
private String lineType;
private String cargoName;
private String productFloorCode;
private BigDecimal orderInsurance;
private BigDecimal productSumPrice;
private BigDecimal productSum;
private String shipperDoorno;
private String tariffPaymentAccount;
private BigDecimal topayment;
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")
private Date bagDate;
private Integer orgOrderStatus;
private String statusDescription;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date zzDate;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date shippingDate;
private BigDecimal orderType;
private String receivingPhoto;
private BigDecimal freight;
private Integer isReceivable;
private Integer isMeet;
private String billNoReceivable;
private String billNoMeet;
private String countryEingthName;
private Integer isReceivableFee;
private BigDecimal settlementFee;
private String productId;
private BigDecimal serviceFreight;
private Integer isPayFee;
private Integer hasAddedSurcharge;
private BigDecimal yfFee;
private BigDecimal yfTotailFee;
private Integer trajectoryStatus;
private String cargoTypeName;
private String serviceCode;
private String threeCode;
private BigDecimal volumeHeightOld;
private BigDecimal volumeLengthOld;
private BigDecimal volumeWidthOld;
private String registerManOld;
private String bagNoOld;
private String airNoOld;
private String boxSiziOld;
private String bagingManOld;
private String retrievalManOld;
private String invoiceAmountOld;
private String invoiceTitleOld;
private String invoiceWeightOld;
private String skuOld;
private String hsCodeOld;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date registerDateOld;
private String invoiceCurrencyOld;
private Integer trajectorySubState;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date signInTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date warehouseTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date declarationTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date releaseTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date stationTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date takeoffTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date landingTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date clearanceAndDeliveryTime;
private String supplierName;
private String creditCode;
private String otherId;
private String platformCode;
private Integer syncShipmentStatus;
private BigDecimal updateWeight;
private String otherBagNo;
private Integer bagFlag;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date onlineTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date outboundTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date airConfirmDate;
private String shipmentType;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date trackQueryTime;
@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;
private String trackingReflectStatus;
private Integer remotePostcode;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date clearanceTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date arriveStockTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date departureTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date firstDeliverTime;
private BigDecimal hsCodeTaxCount;
private BigDecimal hsCodeTaxAmount;
private String hsCodeTaxCurrency;
private String invoiceUrl;
private String clearanceNo;
private BigDecimal pushWeight;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date internalCheckTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date airDelayTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date firstLandingTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date secondTakeoffTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date desPortCheckTime;
private String stayRemark;
private String missBoxRemark;
private String productChannelId;
private String customerTrackId;
private String registerSite;
private Integer packageTypeFinancial;
private String mrn;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -2,6 +2,7 @@ package com.ruoyi.price.domain.vo;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.validation.constraints.AssertTrue;
@@ -22,6 +23,12 @@ public class TmsPriceBillRequest extends TmsPriceQuoteRequest
private String trackingNo;
/** transfer order no */
private String transferNo;
/** 所属销售员 */
private String belongSaler;
/** 结算员 */
private String settlementMan;
/** 客服员 */
private String serviceMan;
private String customerName;
private Integer pieces;
private BigDecimal actualWeight;
@@ -36,6 +43,8 @@ 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 扩展字段 */
private Map<String, Object> upstreamRow;
@JsonIgnore
@AssertTrue(message = "bizDate is required")
@@ -75,6 +75,12 @@ public class TmsPriceQuoteResult implements Serializable
private String trackingNo;
/** transfer order no */
private String transferNo;
/** 所属销售员 */
private String belongSaler;
/** 结算员 */
private String settlementMan;
/** 客服员 */
private String serviceMan;
private String customerCode;
private String customerName;
/** ACTIVE / MISSING / DISABLED */
@@ -96,7 +102,7 @@ public class TmsPriceQuoteResult implements Serializable
private String orderRemark;
/** true=hit stored quote */
private Boolean fromCache;
/** original TMS sync request JSON from prc_order_bill_ext */
/** 计费请求 JSON(当次响应/日志用,不落库) */
private String requestJson;
/** original billing response JSON from Elasticsearch */
private String responseJson;
@@ -0,0 +1,253 @@
package com.ruoyi.price.oracle;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import com.ruoyi.price.domain.PrcOrderBillExt;
/**
* 从 Oracle TAB_ORDER 行填充 prc_order_bill_ext(仅包含未落在 prc_order_bill 的字段)。
*/
public final class OracleOrderBillExtFiller
{
private OracleOrderBillExtFiller() {}
public static void fillFromRow(PrcOrderBillExt ext, Map<String, Object> row)
{
if (ext == null || row == null || row.isEmpty())
{
return;
}
ext.setUpstreamId(str(row, "ID"));
ext.setLineNo(str(row, "LINE_NO"));
ext.setPackageNum(integer(row, "PACKAGE_NUM"));
ext.setActualVolume(decimal(row, "ACTUAL_VOLUME"));
ext.setCpType(integer(row, "CP_TYPE"));
ext.setConsigneeMobile(str(row, "CONSIGNEE_MOBILE"));
ext.setOrderReturnsign(str(row, "ORDER_RETURNSIGN"));
ext.setTradeType(str(row, "TRADE_TYPE"));
ext.setDutyType(str(row, "DUTY_TYPE"));
ext.setBatteryType(str(row, "BATTERY_TYPE"));
ext.setConsigneeCompanyname(str(row, "CONSIGNEE_COMPANYNAME"));
ext.setConsigneeAddress(str(row, "CONSIGNEE_ADDRESS"));
ext.setConsigneeTelephone(str(row, "CONSIGNEE_TELEPHONE"));
ext.setConsigneeState(str(row, "CONSIGNEE_STATE"));
ext.setConsigneeCity(str(row, "CONSIGNEE_CITY"));
ext.setConsigneeSuburb(str(row, "CONSIGNEE_SUBURB"));
ext.setConsigneePassportno(str(row, "CONSIGNEE_PASSPORTNO"));
ext.setConsigneeEmail(str(row, "CONSIGNEE_EMAIL"));
ext.setConsigneeTaxno(str(row, "CONSIGNEE_TAXNO"));
ext.setConsigneeTaxnotype(str(row, "CONSIGNEE_TAXNOTYPE"));
ext.setConsigneeTaxnocountry(str(row, "CONSIGNEE_TAXNOCOUNTRY"));
ext.setConsigneeStreetno(str(row, "CONSIGNEE_STREETNO"));
ext.setConsigneeDoorno(str(row, "CONSIGNEE_DOORNO"));
ext.setShipperTaxnotype(str(row, "SHIPPER_TAXNOTYPE"));
ext.setShipperTaxno(str(row, "SHIPPER_TAXNO"));
ext.setShipperTaxnocountry(str(row, "SHIPPER_TAXNOCOUNTRY"));
ext.setCustomerId(str(row, "CUSTOMER_ID"));
ext.setProductImagepath(str(row, "PRODUCT_IMAGEPATH"));
ext.setOrderTransactionurl(str(row, "ORDER_TRANSACTIONURL"));
ext.setOrderCargoamount(decimal(row, "ORDER_CARGOAMOUNT"));
ext.setCargoType(str(row, "CARGO_TYPE"));
ext.setShipperCompanyname(str(row, "SHIPPER_COMPANYNAME"));
ext.setShipperAddress1(str(row, "SHIPPER_ADDRESS1"));
ext.setShipperAddress2(str(row, "SHIPPER_ADDRESS2"));
ext.setShipperAddress3(str(row, "SHIPPER_ADDRESS3"));
ext.setShipperCity(str(row, "SHIPPER_CITY"));
ext.setShipperState(str(row, "SHIPPER_STATE"));
ext.setShipperPostcode(str(row, "SHIPPER_POSTCODE"));
ext.setShipperCountry(str(row, "SHIPPER_COUNTRY"));
ext.setShipperTelephone(str(row, "SHIPPER_TELEPHONE"));
ext.setShipperSuburb(str(row, "SHIPPER_SUBURB"));
ext.setShipperEmail(str(row, "SHIPPER_EMAIL"));
ext.setShipperPassportno(str(row, "SHIPPER_PASSPORTNO"));
ext.setImportCode(str(row, "IMPORT_CODE"));
ext.setImportName(str(row, "IMPORT_NAME"));
ext.setImportCompanyname(str(row, "IMPORT_COMPANYNAME"));
ext.setImportAddress(str(row, "IMPORT_ADDRESS"));
ext.setImportAddress2(str(row, "IMPORT_ADDRESS2"));
ext.setImportAddress3(str(row, "IMPORT_ADDRESS3"));
ext.setImportTelephone(str(row, "IMPORT_TELEPHONE"));
ext.setImportEmail(str(row, "IMPORT_EMAIL"));
ext.setImportPostcode(str(row, "IMPORT_POSTCODE"));
ext.setImportCity(str(row, "IMPORT_CITY"));
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"));
ext.setLineName(str(row, "LINE_NAME"));
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"));
ext.setShipperDoorno(str(row, "SHIPPER_DOORNO"));
ext.setTariffPaymentAccount(str(row, "TARIFF_PAYMENT_ACCOUNT"));
ext.setTopayment(decimal(row, "TOPAYMENT"));
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"));
ext.setOrgOrderStatus(integer(row, "ORG_ORDER_STATUS"));
ext.setStatusDescription(str(row, "STATUS_DESCRIPTION"));
ext.setZzDate(date(row, "ZZ_DATE"));
ext.setShippingDate(date(row, "SHIPPING_DATE"));
ext.setOrderType(decimal(row, "ORDER_TYPE"));
ext.setReceivingPhoto(str(row, "RECEIVING_PHOTO"));
ext.setFreight(decimal(row, "FREIGHT"));
ext.setIsReceivable(integer(row, "IS_RECEIVABLE"));
ext.setIsMeet(integer(row, "IS_MEET"));
ext.setBillNoReceivable(str(row, "BILL_NO_RECEIVABLE"));
ext.setBillNoMeet(str(row, "BILL_NO_MEET"));
ext.setCountryEingthName(str(row, "COUNTRY_EINGTH_NAME"));
ext.setIsReceivableFee(integer(row, "IS_RECEIVABLE_FEE"));
ext.setSettlementFee(decimal(row, "SETTLEMENT_FEE"));
ext.setProductId(str(row, "PRODUCT_ID"));
ext.setServiceFreight(decimal(row, "SERVICE_FREIGHT"));
ext.setIsPayFee(integer(row, "IS_PAY_FEE"));
ext.setHasAddedSurcharge(integer(row, "HAS_ADDED_SURCHARGE"));
ext.setYfFee(decimal(row, "YF_FEE"));
ext.setYfTotailFee(decimal(row, "YF_TOTAIL_FEE"));
ext.setTrajectoryStatus(integer(row, "TRAJECTORY_STATUS"));
ext.setCargoTypeName(str(row, "CARGO_TYPE_NAME"));
ext.setServiceCode(str(row, "SERVICE_CODE"));
ext.setThreeCode(str(row, "THREE_CODE"));
ext.setVolumeHeightOld(decimal(row, "VOLUME_HEIGHT_OLD"));
ext.setVolumeLengthOld(decimal(row, "VOLUME_LENGTH_OLD"));
ext.setVolumeWidthOld(decimal(row, "VOLUME_WIDTH_OLD"));
ext.setRegisterManOld(str(row, "REGISTER_MAN_OLD"));
ext.setBagNoOld(str(row, "BAG_NO_OLD"));
ext.setAirNoOld(str(row, "AIR_NO_OLD"));
ext.setBoxSiziOld(str(row, "BOX_SIZI_OLD"));
ext.setBagingManOld(str(row, "BAGING_MAN_OLD"));
ext.setRetrievalManOld(str(row, "RETRIEVAL_MAN_OLD"));
ext.setInvoiceAmountOld(str(row, "INVOICE_AMOUNT_OLD"));
ext.setInvoiceTitleOld(str(row, "INVOICE_TITLE_OLD"));
ext.setInvoiceWeightOld(str(row, "INVOICE_WEIGHT_OLD"));
ext.setSkuOld(str(row, "SKU_OLD"));
ext.setHsCodeOld(str(row, "HS_CODE_OLD"));
ext.setRegisterDateOld(date(row, "REGISTER_DATE_OLD"));
ext.setInvoiceCurrencyOld(str(row, "INVOICE_CURRENCY_OLD"));
ext.setTrajectorySubState(integer(row, "TRAJECTORY_SUB_STATE"));
ext.setSignInTime(date(row, "SIGN_IN_TIME"));
ext.setWarehouseTime(date(row, "WAREHOUSE_TIME"));
ext.setDeclarationTime(date(row, "DECLARATION_TIME"));
ext.setReleaseTime(date(row, "RELEASE_TIME"));
ext.setStationTime(date(row, "STATION_TIME"));
ext.setTakeoffTime(date(row, "TAKEOFF_TIME"));
ext.setLandingTime(date(row, "LANDING_TIME"));
ext.setClearanceAndDeliveryTime(date(row, "CLEARANCE_AND_DELIVERY_TIME"));
ext.setSupplierName(str(row, "SUPPLIER_NAME"));
ext.setCreditCode(str(row, "CREDIT_CODE"));
ext.setOtherId(str(row, "OTHER_ID"));
ext.setPlatformCode(str(row, "PLATFORM_CODE"));
ext.setSyncShipmentStatus(integer(row, "SYNC_SHIPMENT_STATUS"));
ext.setUpdateWeight(decimal(row, "UPDATE_WEIGHT"));
ext.setOtherBagNo(str(row, "OTHER_BAG_NO"));
ext.setBagFlag(integer(row, "BAG_FLAG"));
ext.setOnlineTime(date(row, "ONLINE_TIME"));
ext.setOutboundTime(date(row, "OUTBOUND_TIME"));
ext.setAirConfirmDate(date(row, "AIR_CONFIRM_DATE"));
ext.setShipmentType(str(row, "SHIPMENT_TYPE"));
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"));
ext.setTrackingReflectStatus(str(row, "TRACKING_REFLECT_STATUS"));
ext.setRemotePostcode(integer(row, "REMOTE_POSTCODE"));
ext.setClearanceTime(date(row, "CLEARANCE_TIME"));
ext.setArriveStockTime(date(row, "ARRIVE_STOCK_TIME"));
ext.setDepartureTime(date(row, "DEPARTURE_TIME"));
ext.setFirstDeliverTime(date(row, "FIRST_DELIVER_TIME"));
ext.setHsCodeTaxCount(decimal(row, "HS_CODE_TAX_COUNT"));
ext.setHsCodeTaxAmount(decimal(row, "HS_CODE_TAX_AMOUNT"));
ext.setHsCodeTaxCurrency(str(row, "HS_CODE_TAX_CURRENCY"));
ext.setInvoiceUrl(str(row, "INVOICE_URL"));
ext.setClearanceNo(str(row, "CLEARANCE_NO"));
ext.setPushWeight(decimal(row, "PUSH_WEIGHT"));
ext.setInternalCheckTime(date(row, "INTERNAL_CHECK_TIME"));
ext.setAirDelayTime(date(row, "AIR_DELAY_TIME"));
ext.setFirstLandingTime(date(row, "FIRST_LANDING_TIME"));
ext.setSecondTakeoffTime(date(row, "SECOND_TAKEOFF_TIME"));
ext.setDesPortCheckTime(date(row, "DES_PORT_CHECK_TIME"));
ext.setStayRemark(str(row, "STAY_REMARK"));
ext.setMissBoxRemark(str(row, "MISS_BOX_REMARK"));
ext.setProductChannelId(str(row, "PRODUCT_CHANNEL_ID"));
ext.setCustomerTrackId(str(row, "CUSTOMER_TRACK_ID"));
ext.setRegisterSite(str(row, "REGISTER_SITE"));
ext.setPackageTypeFinancial(integer(row, "PACKAGE_TYPE_FINANCIAL"));
ext.setMrn(str(row, "MRN"));
}
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 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 Integer integer(Map<String, Object> row, String key)
{
BigDecimal d = decimal(row, key);
return d == null ? null : Integer.valueOf(d.intValue());
}
private static Long longVal(Map<String, Object> row, String key)
{
BigDecimal d = decimal(row, key);
return d == null ? null : Long.valueOf(d.longValue());
}
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;
}
}
@@ -22,9 +22,14 @@ public class OracleOrderBillMapper
return null;
}
TmsPriceBillRequest req = new TmsPriceBillRequest();
req.setOrderNo(firstStr(row, "ORG_ORDER_ID", "ORDER_ID", "TRANSFER_ORDER_ID"));
req.setTrackingNo(firstStr(row, "TRANSFER_ORDER_ID", "TRACK_ID", "BARCODE_NUMBER", "CUSTOMER_TRACK_ID"));
// TAB_ORDER: ORDER_ID=客户订单号, ORG_ORDER_ID=运单号, TRANSFER_ORDER_ID=转单号, TRACK_ID=轨迹ID
req.setOrderNo(firstStr(row, "ORDER_ID", "ORG_ORDER_ID", "TRANSFER_ORDER_ID"));
req.setTrackingNo(firstStr(row, "ORG_ORDER_ID", "TRACK_ID", "BARCODE_NUMBER", "CUSTOMER_TRACK_ID"));
req.setTransferNo(firstStr(row, "TRANSFER_ORDER_ID"));
req.setBelongSaler(firstStr(row, "BELONG_SALER_OLD"));
req.setSettlementMan(firstStr(row, "SETTLEMENT_MAN_OLD"));
req.setServiceMan(firstStr(row, "SERVICE_MAN_OLD"));
req.setUpstreamRow(row);
req.setCustomerCode(firstStr(row, "CUSTOMER_CODE"));
req.setCustomerName(firstStr(row, "CUSTOMER_NAME"));
String product = firstStr(row, "PRODUCT_CODE", "GOODS_CODE", "CHANNEL_CODE");
@@ -140,15 +140,19 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
{
throw new ServiceException("Oracle order mapped weight invalid");
}
// Prefer task keys when Oracle mapping missed them
if (StringUtils.isEmpty(billReq.getTransferNo()) && StringUtils.isNotEmpty(task.getTransferNo()))
// Identity keys from mobile inbound are source of truth; do not replace with Oracle remap.
if (StringUtils.isNotEmpty(task.getTransferNo()))
{
billReq.setTransferNo(task.getTransferNo());
}
if (StringUtils.isEmpty(billReq.getTrackingNo()) && StringUtils.isNotEmpty(task.getTrackingNo()))
if (StringUtils.isNotEmpty(task.getTrackingNo()))
{
billReq.setTrackingNo(task.getTrackingNo());
}
if (StringUtils.isNotEmpty(task.getOrderNo()))
{
billReq.setOrderNo(task.getOrderNo());
}
// Billing date from task.bill_time (mobile), not Oracle CREATE_DATE.
if (task.getBillTime() == null)
{
@@ -165,12 +169,12 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
TmsPriceQuoteResult result = prcOrderBillService.bill(billReq);
writeback(task, BillTaskSuccessStatus.SUCCESS, result == null ? null : result.getBillId(),
billReq, null);
null);
}
catch (RuntimeException e)
{
log.error("billing task failed taskId={}", taskId, e);
writeback(task, BillTaskSuccessStatus.FAILED, null, null, cut(e.getMessage(), 900));
writeback(task, BillTaskSuccessStatus.FAILED, null, cut(e.getMessage(), 900));
}
}
@@ -204,21 +208,15 @@ public class PrcBillingTaskServiceImpl implements IPrcBillingTaskService
return existed == null ? BillTaskType.PENDING : BillTaskType.REBILL;
}
/** Write back status/billId/error only; keep inbound transfer/tracking/order/billTime untouched. */
private void writeback(PrcBillingTask task, BillTaskSuccessStatus status, String billId,
TmsPriceBillRequest billReq, String errorMessage)
String errorMessage)
{
PrcBillingTask upd = new PrcBillingTask();
upd.setTaskId(task.getTaskId());
upd.setSuccessStatus(status.getCode());
// Keep bill_time as mobile billing time; do not overwrite on writeback.
upd.setBillId(billId);
upd.setErrorMessage(errorMessage);
if (billReq != null)
{
upd.setOrderNo(billReq.getOrderNo());
upd.setTrackingNo(billReq.getTrackingNo());
upd.setTransferNo(billReq.getTransferNo());
}
billingTaskMapper.updateBillingResult(upd);
}
@@ -33,6 +33,7 @@ import com.ruoyi.price.mapper.PrcIncomeBillFeeMapper;
import com.ruoyi.price.mapper.PrcOrderBillExtMapper;
import com.ruoyi.price.mapper.PrcOrderBillMapper;
import com.ruoyi.price.mapper.PrcPayBillFeeMapper;
import com.ruoyi.price.oracle.OracleOrderBillExtFiller;
import com.ruoyi.price.search.EsBizLogSupport;
import com.ruoyi.price.search.EsLogType;
import com.ruoyi.price.search.IBillSearchStore;
@@ -196,6 +197,9 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
bill.setCustomerName(request.getCustomerName());
bill.setTrackingNo(request.getTrackingNo());
bill.setTransferNo(request.getTransferNo());
bill.setBelongSaler(request.getBelongSaler());
bill.setSettlementMan(request.getSettlementMan());
bill.setServiceMan(request.getServiceMan());
String customerActiveStatus = result == null ? null : result.getCustomerActiveStatus();
if (StringUtils.isEmpty(customerActiveStatus))
{
@@ -277,7 +281,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
incomeBillFeeMapper.insertBatch(fees);
}
String syncJson = toRequestJson(request);
persistBillExt(bill, syncJson);
persistBillExt(bill, request.getUpstreamRow());
result.setRequestJson(syncJson);
billSearchStore.save(EsLogType.BILL, orderNo, syncJson, toResponseJson(result));
}
@@ -513,37 +517,27 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
r.setBizDate(bill.getBizDate());
r.setFeeDetails(toIncomeFeeLines(incomeFees));
r.setPayFeeDetails(toPayFeeLines(payFees));
fillSyncJson(r, bill.getBillId());
return r;
}
/** Persist upstream request JSON after prc_order_bill insert/update succeeds. */
private void persistBillExt(PrcOrderBill bill, String syncJson)
/** 仅在存在上游 TAB_ORDER 行时写入 prc_order_bill_ext。 */
private void persistBillExt(PrcOrderBill bill, java.util.Map<String, Object> upstreamRow)
{
if (bill == null || StringUtils.isEmpty(bill.getBillId()) || StringUtils.isEmpty(syncJson))
if (bill == null || StringUtils.isEmpty(bill.getBillId()))
{
return;
}
if (upstreamRow == null || upstreamRow.isEmpty())
{
return;
}
PrcOrderBillExt ext = new PrcOrderBillExt();
ext.setBillId(bill.getBillId());
ext.setOrderNo(bill.getOrderNo());
ext.setSyncJson(syncJson);
OracleOrderBillExtFiller.fillFromRow(ext, upstreamRow);
orderBillExtMapper.upsertPrcOrderBillExt(ext);
}
private void fillSyncJson(TmsPriceQuoteResult result, String billId)
{
if (result == null || StringUtils.isEmpty(billId))
{
return;
}
PrcOrderBillExt ext = orderBillExtMapper.selectByBillId(billId);
if (ext != null)
{
result.setRequestJson(ext.getSyncJson());
}
}
private List<TmsPriceQuoteFeeLine> toIncomeFeeLines(List<PrcIncomeBillFee> fees)
{
List<TmsPriceQuoteFeeLine> lines = new ArrayList<TmsPriceQuoteFeeLine>();
@@ -592,6 +586,9 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
{
r.setTrackingNo(bill.getTrackingNo());
r.setTransferNo(bill.getTransferNo());
r.setBelongSaler(bill.getBelongSaler());
r.setSettlementMan(bill.getSettlementMan());
r.setServiceMan(bill.getServiceMan());
r.setCustomerName(bill.getCustomerName());
r.setCustomerActiveStatus(bill.getCustomerActiveStatus());
r.setCreditArrearsStatus(bill.getCreditArrearsStatus());
@@ -618,6 +615,7 @@ public class PrcOrderBillServiceImpl implements IPrcOrderBillService
return null;
}
obj.remove("apiCode");
obj.remove("upstreamRow");
return obj.toJSONString();
}