From 98ae52540370e27f20bc636f2656da743de1f73e Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Tue, 3 Nov 2026 17:50:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=90=E5=8D=95=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bms/price/airbill/domain/SrvBillAir.java | 36 ++ .../airbill/domain/SrvBillAirFinance.java | 31 ++ .../airbill/domain/SrvBillAirFlight.java | 26 ++ .../price/airbill/domain/SrvBillAirOp.java | 31 ++ .../price/airbill/domain/SrvBillAirTrack.java | 50 +++ .../airbill/mapper/OracleBillAirMapper.java | 12 + .../airbill/mapper/SrvBillAirSyncMapper.java | 25 ++ .../airbill/sync/BillAirSyncService.java | 322 ++++++++++++++++++ .../price/airbill/sync/BillAirSyncWriter.java | 64 ++++ .../airbill/sync/OracleBillAirReader.java | 34 ++ .../price/airbill/task/BillAirSyncTask.java | 29 ++ .../mapper/price/OracleBillAirMapper.xml | 38 +++ .../mapper/price/SrvBillAirSyncMapper.xml | 220 ++++++++++++ bms-back/sql/price/srv_bill_air_tables.sql | 169 +++++++++ 14 files changed, 1087 insertions(+) create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAir.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFinance.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFlight.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirOp.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirTrack.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/OracleBillAirMapper.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/SrvBillAirSyncMapper.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncService.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncWriter.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/OracleBillAirReader.java create mode 100644 bms-back/bms-system/src/main/java/com/bms/price/airbill/task/BillAirSyncTask.java create mode 100644 bms-back/bms-system/src/main/resources/mapper/price/OracleBillAirMapper.xml create mode 100644 bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirSyncMapper.xml create mode 100644 bms-back/sql/price/srv_bill_air_tables.sql diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAir.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAir.java new file mode 100644 index 00000000..bf1f4903 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAir.java @@ -0,0 +1,36 @@ +package com.bms.price.airbill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** 空运提单主表 srv_bill_air */ +@Data +public class SrvBillAir +{ + private String guid; + private String billCode; + private Integer billType; + private Integer blStatus; + private Integer warningStatus; + private Integer warningCount; + private String startAirport; + private String endAirport; + private String desPort; + private String routeName; + private String airType; + private Integer pieceNumber; + private BigDecimal volume; + private BigDecimal actualWeight; + private BigDecimal actualVolume; + private BigDecimal volumeWeight; + private String airCompany; + private String sendManCode; + private String acceptManCode; + private String dataFrom; + private String createManCode; + private Date createTime; + private String modifierCode; + private Date modifyTime; + private String remark; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFinance.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFinance.java new file mode 100644 index 00000000..cb3f0a82 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFinance.java @@ -0,0 +1,31 @@ +package com.bms.price.airbill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** 空运提单财务表 srv_bill_air_finance */ +@Data +public class SrvBillAirFinance +{ + private String guid; + private String billCode; + private Integer blCheck; + private String checkRemark; + private Integer blConfirm; + private String confirmManCode; + private Date confirmTime; + private BigDecimal price; + private BigDecimal amount; + private String calcExp; + private String calcRe; + private String priceRemark; + private BigDecimal baoguanFee; + private BigDecimal baoguanOtherFee; + private BigDecimal stockFee; + private BigDecimal desPortAgentFee; + private BigDecimal airOtherFee; + private BigDecimal otherFee; + private String compensateRemark; + private String chargeManCode; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFlight.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFlight.java new file mode 100644 index 00000000..c3e37fd1 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirFlight.java @@ -0,0 +1,26 @@ +package com.bms.price.airbill.domain; + +import java.math.BigDecimal; +import java.util.Date; +import lombok.Data; + +/** 空运航班干线表 srv_bill_air_flight */ +@Data +public class SrvBillAirFlight +{ + private String guid; + private String billCode; + private String airNo; + private String actualAirNo; + private String airOmpanyAgent; + private String desPortAgentCode; + private String boardNo; + private Integer bandBoxCount; + private BigDecimal bandVolume; + private BigDecimal bandBoxWeight; + private BigDecimal divisorValue; + private Date firstLandingTime; + private Date secondTakeoffTime; + private Date airDelayTime; + private String trunkDestinations; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirOp.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirOp.java new file mode 100644 index 00000000..652bedff --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirOp.java @@ -0,0 +1,31 @@ +package com.bms.price.airbill.domain; + +import java.util.Date; +import lombok.Data; + +/** 空运提单操作派送表 srv_bill_air_op */ +@Data +public class SrvBillAirOp +{ + private String guid; + private String billCode; + private Integer blRetrieval; + private Date retrievalDate; + private String retrievalManCode; + private Integer pickBoxCount; + private Integer pickCountReal; + private String declareCode; + private String clearanceCode; + private String qingguanAgent; + private String clearanceOpCode; + private String stockAddr; + private String stockOutRemark; + private Integer deliverCount; + private Integer firstDeliverCount; + private Integer lastDeliverCount; + private String acDeliverDiff; + private String deliverEndDiff; + private Integer checkOrderCount; + private Integer checkLeaveCount; + private Date internalCheckTime; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirTrack.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirTrack.java new file mode 100644 index 00000000..bf08148b --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/domain/SrvBillAirTrack.java @@ -0,0 +1,50 @@ +package com.bms.price.airbill.domain; + +import java.util.Date; +import lombok.Data; + +/** 空运提单时效轨迹表 srv_bill_air_track */ +@Data +public class SrvBillAirTrack +{ + private String guid; + private String billCode; + private Date startTimePlan; + private Date arriveTimePlan; + private Date shippingDate; + private Date startTime; + private Date arriveTime; + private Date arriveStockTime; + private Date clearanceTime; + private Date endOprateTime; + private Integer blBgfx; + private Date bgfxTime; + private Date updateTimeBgfx; + private Integer blSjqf; + private Date sjqfTime; + private Date updateTimeSjqf; + private Integer blSjdd; + private Date sjddTime; + private Date updateTimeSjdd; + private Integer blTzdc; + private Date tzdcTime; + private String updateTimeTzdc; + private Integer blThdc; + private Date thdcTime; + private Date updateTimeThdc; + private Integer blQgwc; + private Date qgwcTime; + private Date updateTimeQgwc; + private Integer blGxfc; + private Date gxfcTime; + private String updateTimeGxfc; + private Integer blFjh; + private Date fjhTime; + private String updateTimeFjh; + private Integer blTrackGenBg; + private Integer blTrackGenBgfx; + private Integer blTrackGenQf; + private Integer blTrackGenDd; + private Integer blTrackGenQg; + private Integer blTrackGenDc; +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/OracleBillAirMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/OracleBillAirMapper.java new file mode 100644 index 00000000..95b5b260 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/OracleBillAirMapper.java @@ -0,0 +1,12 @@ +package com.bms.price.airbill.mapper; + +import java.util.List; +import java.util.Map; + +/** + * Oracle WEISHI_USER.TAB_BILL_AIR 只读 + */ +public interface OracleBillAirMapper +{ + List> selectAllBillAir(); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/SrvBillAirSyncMapper.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/SrvBillAirSyncMapper.java new file mode 100644 index 00000000..6ec08b52 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/mapper/SrvBillAirSyncMapper.java @@ -0,0 +1,25 @@ +package com.bms.price.airbill.mapper; + +import java.util.List; +import org.apache.ibatis.annotations.Param; +import com.bms.price.airbill.domain.SrvBillAir; +import com.bms.price.airbill.domain.SrvBillAirFinance; +import com.bms.price.airbill.domain.SrvBillAirFlight; +import com.bms.price.airbill.domain.SrvBillAirOp; +import com.bms.price.airbill.domain.SrvBillAirTrack; + +/** + * 空运提单镜像表 upsert + */ +public interface SrvBillAirSyncMapper +{ + int upsertBillAir(@Param("list") List list); + + int upsertBillAirFinance(@Param("list") List list); + + int upsertBillAirFlight(@Param("list") List list); + + int upsertBillAirOp(@Param("list") List list); + + int upsertBillAirTrack(@Param("list") List list); +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncService.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncService.java new file mode 100644 index 00000000..e673ff89 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncService.java @@ -0,0 +1,322 @@ +package com.bms.price.airbill.sync; + +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.bms.price.airbill.domain.SrvBillAir; +import com.bms.price.airbill.domain.SrvBillAirFinance; +import com.bms.price.airbill.domain.SrvBillAirFlight; +import com.bms.price.airbill.domain.SrvBillAirOp; +import com.bms.price.airbill.domain.SrvBillAirTrack; + +/** + * Oracle TAB_BILL_AIR -> srv_bill_air* 全量同步编排(按 guid 幂等 upsert) + */ +@Service +public class BillAirSyncService +{ + private static final Logger log = LoggerFactory.getLogger(BillAirSyncService.class); + + @Autowired + private OracleBillAirReader reader; + + @Autowired + private BillAirSyncWriter writer; + + public String syncFromOracle() + { + long start = System.currentTimeMillis(); + List> rows = reader.readAll(); + List airList = new ArrayList<>(rows.size()); + List financeList = new ArrayList<>(rows.size()); + List flightList = new ArrayList<>(rows.size()); + List opList = new ArrayList<>(rows.size()); + List trackList = new ArrayList<>(rows.size()); + int skip = 0; + for (Map row : rows) + { + String guid = str(row, "GUID"); + String billCode = str(row, "BILL_CODE"); + if (guid == null || billCode == null) + { + skip++; + continue; + } + airList.add(toAir(row, guid, billCode)); + financeList.add(toFinance(row, guid, billCode)); + flightList.add(toFlight(row, guid, billCode)); + opList.add(toOp(row, guid, billCode)); + trackList.add(toTrack(row, guid, billCode)); + } + int airN = writer.writeAir(airList); + int finN = writer.writeFinance(financeList); + int flightN = writer.writeFlight(flightList); + int opN = writer.writeOp(opList); + int trackN = writer.writeTrack(trackList); + String summary = String.format( + "billAir sync done: oracle=%d skip=%d air=%d finance=%d flight=%d op=%d track=%d costMs=%d", + rows.size(), skip, airN, finN, flightN, opN, trackN, System.currentTimeMillis() - start); + log.info(summary); + return summary; + } + + private static SrvBillAir toAir(Map row, String guid, String billCode) + { + SrvBillAir a = new SrvBillAir(); + a.setGuid(guid); + a.setBillCode(billCode); + a.setBillType(integer(row, "BILL_TYPE")); + a.setBlStatus(integer(row, "BL_STATUS")); + a.setWarningStatus(integer(row, "WARNING_STATUS")); + a.setWarningCount(integer(row, "WARNING_COUNT")); + a.setStartAirport(str(row, "START_AIRPORT")); + a.setEndAirport(str(row, "END_AIRPORT")); + a.setDesPort(str(row, "DES_PORT")); + a.setRouteName(str(row, "ROUTE_NAME")); + a.setAirType(str(row, "AIR_TYPE")); + a.setPieceNumber(integer(row, "PIECE_NUMBER")); + a.setVolume(decimal(row, "VOLUME")); + a.setActualWeight(decimal(row, "ACTUAL_WEIGHT")); + a.setActualVolume(decimal(row, "ACTUAL_VOLUME")); + a.setVolumeWeight(decimal(row, "VOLUME_WEIGHT")); + a.setAirCompany(str(row, "AIR_COMPANY")); + a.setSendManCode(str(row, "SEND_MAN_CODE")); + a.setAcceptManCode(str(row, "ACCEPT_MAN_CODE")); + a.setDataFrom(str(row, "DATA_FROM")); + a.setCreateManCode(str(row, "CREATE_MAN_CODE")); + a.setCreateTime(date(row, "CREATE_TIME")); + a.setModifierCode(str(row, "MODIFIER_CODE")); + a.setModifyTime(date(row, "MODIFY_TIME")); + a.setRemark(str(row, "REMARK")); + return a; + } + + private static SrvBillAirFinance toFinance(Map row, String guid, String billCode) + { + SrvBillAirFinance f = new SrvBillAirFinance(); + f.setGuid(guid); + f.setBillCode(billCode); + f.setBlCheck(integer(row, "BL_CHECK")); + f.setCheckRemark(str(row, "CHECK_REMARK")); + f.setBlConfirm(integer(row, "BL_CONFIRM")); + f.setConfirmManCode(str(row, "CONFIRM_MAN_CODE")); + f.setConfirmTime(date(row, "CONFIRM_TIME")); + f.setPrice(decimal(row, "PRICE")); + f.setAmount(decimal(row, "AMOUNT")); + f.setCalcExp(str(row, "CALC_EXP")); + f.setCalcRe(asText(row, "CALC_RE")); + f.setPriceRemark(str(row, "PRICE_REMARK")); + f.setBaoguanFee(decimal(row, "BAOGUAN_FEE")); + f.setBaoguanOtherFee(decimal(row, "BAOGUAN_OTHER_FEE")); + f.setStockFee(decimal(row, "STOCK_FEE")); + f.setDesPortAgentFee(decimal(row, "DES_PORT_AGENT_FEE")); + f.setAirOtherFee(decimal(row, "AIR_OTHER_FEE")); + f.setOtherFee(decimal(row, "OTHER_FEE")); + f.setCompensateRemark(str(row, "COMPENSATE_REMARK")); + f.setChargeManCode(str(row, "CHARGE_MAN_CODE")); + return f; + } + + private static SrvBillAirFlight toFlight(Map row, String guid, String billCode) + { + SrvBillAirFlight fl = new SrvBillAirFlight(); + fl.setGuid(guid); + fl.setBillCode(billCode); + fl.setAirNo(str(row, "AIR_NO")); + fl.setActualAirNo(str(row, "ACTUAL_AIR_NO")); + fl.setAirOmpanyAgent(str(row, "AIR_OMPANY_AGENT")); + fl.setDesPortAgentCode(str(row, "DES_PORT_AGENT")); + fl.setBoardNo(str(row, "BOARD_NO")); + fl.setBandBoxCount(integer(row, "BAND_BOX_COUNT")); + fl.setBandVolume(decimal(row, "BAND_VOLUME")); + fl.setBandBoxWeight(decimal(row, "BAND_BOX_WEIGHT")); + fl.setDivisorValue(decimal(row, "DIVISOR_VALUE")); + fl.setFirstLandingTime(date(row, "FIRST_LANDING_TIME")); + fl.setSecondTakeoffTime(date(row, "SECOND_TAKEOFF_TIME")); + fl.setAirDelayTime(date(row, "AIR_DELAY_TIME")); + fl.setTrunkDestinations(str(row, "TRUNK_DESTINATIONS")); + return fl; + } + + private static SrvBillAirOp toOp(Map row, String guid, String billCode) + { + SrvBillAirOp o = new SrvBillAirOp(); + o.setGuid(guid); + o.setBillCode(billCode); + o.setBlRetrieval(integer(row, "BL_RETRIEVAL")); + o.setRetrievalDate(date(row, "RETRIEVAL_DATE")); + o.setRetrievalManCode(str(row, "RETRIEVAL_MAN_CODE")); + o.setPickBoxCount(integer(row, "PICK_BOX_COUNT")); + o.setPickCountReal(integer(row, "PICK_COUNT_REAL")); + o.setDeclareCode(str(row, "DECLARE_CODE")); + o.setClearanceCode(str(row, "CLEARANCE_CODE")); + o.setQingguanAgent(str(row, "QINGGUAN_AGENT")); + o.setClearanceOpCode(str(row, "CLEARANCE_OP_CODE")); + o.setStockAddr(str(row, "STOCK_ADDR")); + o.setStockOutRemark(str(row, "STOCK_OUT_REMARK")); + o.setDeliverCount(integer(row, "DELIVER_COUNT")); + o.setFirstDeliverCount(integer(row, "FIRST_DELIVER_COUNT")); + o.setLastDeliverCount(integer(row, "LAST_DELIVER_COUNT")); + o.setAcDeliverDiff(asText(row, "AC_DELIVER_DIFF")); + o.setDeliverEndDiff(asText(row, "DELIVER_END_DIFF")); + o.setCheckOrderCount(integer(row, "CHECK_ORDER_COUNT")); + o.setCheckLeaveCount(integer(row, "CHECK_LEAVE_COUNT")); + o.setInternalCheckTime(date(row, "INTERNAL_CHECK_TIME")); + return o; + } + + private static SrvBillAirTrack toTrack(Map row, String guid, String billCode) + { + SrvBillAirTrack t = new SrvBillAirTrack(); + t.setGuid(guid); + t.setBillCode(billCode); + t.setStartTimePlan(date(row, "START_TIME_PLAN")); + t.setArriveTimePlan(date(row, "ARRIVE_TIME_PLAN")); + t.setShippingDate(date(row, "SHIPPING_DATE")); + t.setStartTime(date(row, "START_TIME")); + t.setArriveTime(date(row, "ARRIVE_TIME")); + t.setArriveStockTime(date(row, "ARRIVE_STOCK_TIME")); + t.setClearanceTime(date(row, "CLEARANCE_TIME")); + t.setEndOprateTime(date(row, "END_OPRATE_TIME")); + t.setBlBgfx(integer(row, "BL_BGFX")); + t.setBgfxTime(date(row, "BGFX_TIME")); + t.setUpdateTimeBgfx(date(row, "UPDATE_TIME_BGFX")); + t.setBlSjqf(integer(row, "BL_SJQF")); + t.setSjqfTime(date(row, "SJQF_TIME")); + t.setUpdateTimeSjqf(date(row, "UPDATE_TIME_SJQF")); + t.setBlSjdd(integer(row, "BL_SJDD")); + t.setSjddTime(date(row, "SJDD_TIME")); + t.setUpdateTimeSjdd(date(row, "UPDATE_TIME_SJDD")); + t.setBlTzdc(integer(row, "BL_TZDC")); + t.setTzdcTime(date(row, "TZDC_TIME")); + t.setUpdateTimeTzdc(dateText(row, "UPDATE_TIME_TZDC")); + t.setBlThdc(integer(row, "BL_THDC")); + t.setThdcTime(date(row, "THDC_TIME")); + t.setUpdateTimeThdc(date(row, "UPDATE_TIME_THDC")); + t.setBlQgwc(integer(row, "BL_QGWC")); + t.setQgwcTime(date(row, "QGWC_TIME")); + t.setUpdateTimeQgwc(date(row, "UPDATE_TIME_QGWC")); + t.setBlGxfc(integer(row, "BL_GXFC")); + t.setGxfcTime(date(row, "GXFC_TIME")); + t.setUpdateTimeGxfc(dateText(row, "UPDATE_TIME_GXFC")); + t.setBlFjh(integer(row, "BL_FJH")); + t.setFjhTime(date(row, "FJH_TIME")); + t.setUpdateTimeFjh(dateText(row, "UPDATE_TIME_FJH")); + t.setBlTrackGenBg(integer(row, "BL_TRACK_GEN_BG")); + t.setBlTrackGenBgfx(integer(row, "BL_TRACK_GEN_BGFX")); + t.setBlTrackGenQf(integer(row, "BL_TRACK_GEN_QF")); + t.setBlTrackGenDd(integer(row, "BL_TRACK_GEN_DD")); + t.setBlTrackGenQg(integer(row, "BL_TRACK_GEN_QG")); + t.setBlTrackGenDc(integer(row, "BL_TRACK_GEN_DC")); + return t; + } + + private static String str(Map row, String key) + { + Object v = row.get(key); + if (v == null) + { + v = row.get(key.toLowerCase()); + } + if (v == null) + { + return null; + } + String s = String.valueOf(v).trim(); + return s.isEmpty() ? null : s; + } + + private static String asText(Map row, String key) + { + Object v = get(row, key); + if (v == null) + { + return null; + } + return String.valueOf(v); + } + + private static String dateText(Map row, String key) + { + Date d = date(row, key); + if (d == null) + { + String s = str(row, key); + return s; + } + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(d); + } + + private static Object get(Map row, String key) + { + Object v = row.get(key); + return v != null ? v : row.get(key.toLowerCase()); + } + + private static Integer integer(Map row, String key) + { + Object v = get(row, key); + if (v == null) + { + return null; + } + if (v instanceof Number) + { + return ((Number) v).intValue(); + } + try + { + return Integer.valueOf(String.valueOf(v).trim()); + } + catch (Exception e) + { + return null; + } + } + + private static BigDecimal decimal(Map row, String key) + { + Object v = get(row, key); + if (v == null) + { + 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; + } + return null; + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncWriter.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncWriter.java new file mode 100644 index 00000000..55d6efb1 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/BillAirSyncWriter.java @@ -0,0 +1,64 @@ +package com.bms.price.airbill.sync; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import com.bms.price.airbill.domain.SrvBillAir; +import com.bms.price.airbill.domain.SrvBillAirFinance; +import com.bms.price.airbill.domain.SrvBillAirFlight; +import com.bms.price.airbill.domain.SrvBillAirOp; +import com.bms.price.airbill.domain.SrvBillAirTrack; +import com.bms.price.airbill.mapper.SrvBillAirSyncMapper; + +/** + * 空运提单镜像表写库(MASTER,分批 upsert) + */ +@Service +public class BillAirSyncWriter +{ + private static final int BATCH_SIZE = 200; + + @Autowired + private SrvBillAirSyncMapper mapper; + + @Transactional(rollbackFor = Exception.class) + public int writeAir(List list) + { + return batch(list, mapper::upsertBillAir); + } + + @Transactional(rollbackFor = Exception.class) + public int writeFinance(List list) + { + return batch(list, mapper::upsertBillAirFinance); + } + + @Transactional(rollbackFor = Exception.class) + public int writeFlight(List list) + { + return batch(list, mapper::upsertBillAirFlight); + } + + @Transactional(rollbackFor = Exception.class) + public int writeOp(List list) + { + return batch(list, mapper::upsertBillAirOp); + } + + @Transactional(rollbackFor = Exception.class) + public int writeTrack(List list) + { + return batch(list, mapper::upsertBillAirTrack); + } + + private int batch(List list, java.util.function.ToIntFunction> fn) + { + int rows = 0; + for (int from = 0; from < list.size(); from += BATCH_SIZE) + { + rows += fn.applyAsInt(list.subList(from, Math.min(from + BATCH_SIZE, list.size()))); + } + return rows; + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/OracleBillAirReader.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/OracleBillAirReader.java new file mode 100644 index 00000000..8a94c65d --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/sync/OracleBillAirReader.java @@ -0,0 +1,34 @@ +package com.bms.price.airbill.sync; + +import java.util.List; +import java.util.Map; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.github.pagehelper.PageHelper; +import com.bms.common.annotation.DataSource; +import com.bms.common.enums.DataSourceType; +import com.bms.price.airbill.mapper.OracleBillAirMapper; + +/** + * Oracle 空运提单只读(SLAVE)。独立 Bean,保证 @DataSource 切面生效。 + */ +@Service +public class OracleBillAirReader +{ + @Autowired + private OracleBillAirMapper oracleBillAirMapper; + + @DataSource(DataSourceType.SLAVE) + public List> readAll() + { + try + { + PageHelper.clearPage(); + return oracleBillAirMapper.selectAllBillAir(); + } + finally + { + PageHelper.clearPage(); + } + } +} diff --git a/bms-back/bms-system/src/main/java/com/bms/price/airbill/task/BillAirSyncTask.java b/bms-back/bms-system/src/main/java/com/bms/price/airbill/task/BillAirSyncTask.java new file mode 100644 index 00000000..faaa7267 --- /dev/null +++ b/bms-back/bms-system/src/main/java/com/bms/price/airbill/task/BillAirSyncTask.java @@ -0,0 +1,29 @@ +package com.bms.price.airbill.task; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import com.bms.common.utils.StringUtils; +import com.bms.price.airbill.sync.BillAirSyncService; + +/** + * 老系统空运提单每日同步任务。 + * sys_job.invoke_target = billAirSyncTask.syncFromOracle() + */ +@Component("billAirSyncTask") +public class BillAirSyncTask +{ + @Autowired + private BillAirSyncService billAirSyncService; + + /** + * 全量同步 Oracle TAB_BILL_AIR -> srv_bill_air / finance / flight / op / track + */ + public void syncFromOracle() + { + String summary = billAirSyncService.syncFromOracle(); + if (StringUtils.isEmpty(summary)) + { + throw new RuntimeException("老系统空运提单同步未返回结果"); + } + } +} diff --git a/bms-back/bms-system/src/main/resources/mapper/price/OracleBillAirMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/OracleBillAirMapper.xml new file mode 100644 index 00000000..1a6af025 --- /dev/null +++ b/bms-back/bms-system/src/main/resources/mapper/price/OracleBillAirMapper.xml @@ -0,0 +1,38 @@ + + + + + + diff --git a/bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirSyncMapper.xml b/bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirSyncMapper.xml new file mode 100644 index 00000000..53d02b4f --- /dev/null +++ b/bms-back/bms-system/src/main/resources/mapper/price/SrvBillAirSyncMapper.xml @@ -0,0 +1,220 @@ + + + + + + INSERT INTO srv_bill_air ( + guid, bill_code, bill_type, bl_status, warning_status, warning_count, + start_airport, end_airport, des_port, route_name, air_type, + piece_number, volume, actual_weight, actual_volume, volume_weight, + air_company, send_man_code, accept_man_code, data_from, + create_man_code, create_time, modifier_code, modify_time, remark + ) VALUES + + (#{it.guid}, #{it.billCode}, #{it.billType}, #{it.blStatus}, #{it.warningStatus}, #{it.warningCount}, + #{it.startAirport}, #{it.endAirport}, #{it.desPort}, #{it.routeName}, #{it.airType}, + #{it.pieceNumber}, #{it.volume}, #{it.actualWeight}, #{it.actualVolume}, #{it.volumeWeight}, + #{it.airCompany}, #{it.sendManCode}, #{it.acceptManCode}, #{it.dataFrom}, + #{it.createManCode}, #{it.createTime}, #{it.modifierCode}, #{it.modifyTime}, #{it.remark}) + + ON DUPLICATE KEY UPDATE + bill_code = VALUES(bill_code), + bill_type = VALUES(bill_type), + bl_status = VALUES(bl_status), + warning_status = VALUES(warning_status), + warning_count = VALUES(warning_count), + start_airport = VALUES(start_airport), + end_airport = VALUES(end_airport), + des_port = VALUES(des_port), + route_name = VALUES(route_name), + air_type = VALUES(air_type), + piece_number = VALUES(piece_number), + volume = VALUES(volume), + actual_weight = VALUES(actual_weight), + actual_volume = VALUES(actual_volume), + volume_weight = VALUES(volume_weight), + air_company = VALUES(air_company), + send_man_code = VALUES(send_man_code), + accept_man_code = VALUES(accept_man_code), + data_from = VALUES(data_from), + create_man_code = VALUES(create_man_code), + create_time = VALUES(create_time), + modifier_code = VALUES(modifier_code), + modify_time = VALUES(modify_time), + remark = VALUES(remark) + + + + INSERT INTO srv_bill_air_finance ( + guid, bill_code, bl_check, check_remark, bl_confirm, confirm_man_code, confirm_time, + price, amount, calc_exp, calc_re, price_remark, + baoguan_fee, baoguan_other_fee, stock_fee, des_port_agent_fee, + air_other_fee, other_fee, compensate_remark, charge_man_code + ) VALUES + + (#{it.guid}, #{it.billCode}, #{it.blCheck}, #{it.checkRemark}, #{it.blConfirm}, #{it.confirmManCode}, #{it.confirmTime}, + #{it.price}, #{it.amount}, #{it.calcExp}, #{it.calcRe}, #{it.priceRemark}, + #{it.baoguanFee}, #{it.baoguanOtherFee}, #{it.stockFee}, #{it.desPortAgentFee}, + #{it.airOtherFee}, #{it.otherFee}, #{it.compensateRemark}, #{it.chargeManCode}) + + ON DUPLICATE KEY UPDATE + bill_code = VALUES(bill_code), + bl_check = VALUES(bl_check), + check_remark = VALUES(check_remark), + bl_confirm = VALUES(bl_confirm), + confirm_man_code = VALUES(confirm_man_code), + confirm_time = VALUES(confirm_time), + price = VALUES(price), + amount = VALUES(amount), + calc_exp = VALUES(calc_exp), + calc_re = VALUES(calc_re), + price_remark = VALUES(price_remark), + baoguan_fee = VALUES(baoguan_fee), + baoguan_other_fee = VALUES(baoguan_other_fee), + stock_fee = VALUES(stock_fee), + des_port_agent_fee = VALUES(des_port_agent_fee), + air_other_fee = VALUES(air_other_fee), + other_fee = VALUES(other_fee), + compensate_remark = VALUES(compensate_remark), + charge_man_code = VALUES(charge_man_code) + + + + INSERT INTO srv_bill_air_flight ( + guid, bill_code, air_no, actual_air_no, air_ompany_agent, des_port_agent_code, + board_no, band_box_count, band_volume, band_box_weight, divisor_value, + first_landing_time, second_takeoff_time, air_delay_time, trunk_destinations + ) VALUES + + (#{it.guid}, #{it.billCode}, #{it.airNo}, #{it.actualAirNo}, #{it.airOmpanyAgent}, #{it.desPortAgentCode}, + #{it.boardNo}, #{it.bandBoxCount}, #{it.bandVolume}, #{it.bandBoxWeight}, #{it.divisorValue}, + #{it.firstLandingTime}, #{it.secondTakeoffTime}, #{it.airDelayTime}, #{it.trunkDestinations}) + + ON DUPLICATE KEY UPDATE + bill_code = VALUES(bill_code), + air_no = VALUES(air_no), + actual_air_no = VALUES(actual_air_no), + air_ompany_agent = VALUES(air_ompany_agent), + des_port_agent_code = VALUES(des_port_agent_code), + board_no = VALUES(board_no), + band_box_count = VALUES(band_box_count), + band_volume = VALUES(band_volume), + band_box_weight = VALUES(band_box_weight), + divisor_value = VALUES(divisor_value), + first_landing_time = VALUES(first_landing_time), + second_takeoff_time = VALUES(second_takeoff_time), + air_delay_time = VALUES(air_delay_time), + trunk_destinations = VALUES(trunk_destinations) + + + + INSERT INTO srv_bill_air_op ( + guid, bill_code, bl_retrieval, retrieval_date, retrieval_man_code, + pick_box_count, pick_count_real, declare_code, clearance_code, qingguan_agent, + clearance_op_code, stock_addr, stock_out_remark, deliver_count, + first_deliver_count, last_deliver_count, ac_deliver_diff, deliver_end_diff, + check_order_count, check_leave_count, internal_check_time + ) VALUES + + (#{it.guid}, #{it.billCode}, #{it.blRetrieval}, #{it.retrievalDate}, #{it.retrievalManCode}, + #{it.pickBoxCount}, #{it.pickCountReal}, #{it.declareCode}, #{it.clearanceCode}, #{it.qingguanAgent}, + #{it.clearanceOpCode}, #{it.stockAddr}, #{it.stockOutRemark}, #{it.deliverCount}, + #{it.firstDeliverCount}, #{it.lastDeliverCount}, #{it.acDeliverDiff}, #{it.deliverEndDiff}, + #{it.checkOrderCount}, #{it.checkLeaveCount}, #{it.internalCheckTime}) + + ON DUPLICATE KEY UPDATE + bill_code = VALUES(bill_code), + bl_retrieval = VALUES(bl_retrieval), + retrieval_date = VALUES(retrieval_date), + retrieval_man_code = VALUES(retrieval_man_code), + pick_box_count = VALUES(pick_box_count), + pick_count_real = VALUES(pick_count_real), + declare_code = VALUES(declare_code), + clearance_code = VALUES(clearance_code), + qingguan_agent = VALUES(qingguan_agent), + clearance_op_code = VALUES(clearance_op_code), + stock_addr = VALUES(stock_addr), + stock_out_remark = VALUES(stock_out_remark), + deliver_count = VALUES(deliver_count), + first_deliver_count = VALUES(first_deliver_count), + last_deliver_count = VALUES(last_deliver_count), + ac_deliver_diff = VALUES(ac_deliver_diff), + deliver_end_diff = VALUES(deliver_end_diff), + check_order_count = VALUES(check_order_count), + check_leave_count = VALUES(check_leave_count), + internal_check_time = VALUES(internal_check_time) + + + + INSERT INTO srv_bill_air_track ( + guid, bill_code, start_time_plan, arrive_time_plan, shipping_date, + start_time, arrive_time, arrive_stock_time, clearance_time, end_oprate_time, + bl_bgfx, bgfx_time, update_time_bgfx, + bl_sjqf, sjqf_time, update_time_sjqf, + bl_sjdd, sjdd_time, update_time_sjdd, + bl_tzdc, tzdc_time, update_time_tzdc, + bl_thdc, thdc_time, update_time_thdc, + bl_qgwc, qgwc_time, update_time_qgwc, + bl_gxfc, gxfc_time, update_time_gxfc, + bl_fjh, fjh_time, update_time_fjh, + bl_track_gen_bg, bl_track_gen_bgfx, bl_track_gen_qf, bl_track_gen_dd, + bl_track_gen_qg, bl_track_gen_dc + ) VALUES + + (#{it.guid}, #{it.billCode}, #{it.startTimePlan}, #{it.arriveTimePlan}, #{it.shippingDate}, + #{it.startTime}, #{it.arriveTime}, #{it.arriveStockTime}, #{it.clearanceTime}, #{it.endOprateTime}, + #{it.blBgfx}, #{it.bgfxTime}, #{it.updateTimeBgfx}, + #{it.blSjqf}, #{it.sjqfTime}, #{it.updateTimeSjqf}, + #{it.blSjdd}, #{it.sjddTime}, #{it.updateTimeSjdd}, + #{it.blTzdc}, #{it.tzdcTime}, #{it.updateTimeTzdc}, + #{it.blThdc}, #{it.thdcTime}, #{it.updateTimeThdc}, + #{it.blQgwc}, #{it.qgwcTime}, #{it.updateTimeQgwc}, + #{it.blGxfc}, #{it.gxfcTime}, #{it.updateTimeGxfc}, + #{it.blFjh}, #{it.fjhTime}, #{it.updateTimeFjh}, + #{it.blTrackGenBg}, #{it.blTrackGenBgfx}, #{it.blTrackGenQf}, #{it.blTrackGenDd}, + #{it.blTrackGenQg}, #{it.blTrackGenDc}) + + ON DUPLICATE KEY UPDATE + bill_code = VALUES(bill_code), + start_time_plan = VALUES(start_time_plan), + arrive_time_plan = VALUES(arrive_time_plan), + shipping_date = VALUES(shipping_date), + start_time = VALUES(start_time), + arrive_time = VALUES(arrive_time), + arrive_stock_time = VALUES(arrive_stock_time), + clearance_time = VALUES(clearance_time), + end_oprate_time = VALUES(end_oprate_time), + bl_bgfx = VALUES(bl_bgfx), + bgfx_time = VALUES(bgfx_time), + update_time_bgfx = VALUES(update_time_bgfx), + bl_sjqf = VALUES(bl_sjqf), + sjqf_time = VALUES(sjqf_time), + update_time_sjqf = VALUES(update_time_sjqf), + bl_sjdd = VALUES(bl_sjdd), + sjdd_time = VALUES(sjdd_time), + update_time_sjdd = VALUES(update_time_sjdd), + bl_tzdc = VALUES(bl_tzdc), + tzdc_time = VALUES(tzdc_time), + update_time_tzdc = VALUES(update_time_tzdc), + bl_thdc = VALUES(bl_thdc), + thdc_time = VALUES(thdc_time), + update_time_thdc = VALUES(update_time_thdc), + bl_qgwc = VALUES(bl_qgwc), + qgwc_time = VALUES(qgwc_time), + update_time_qgwc = VALUES(update_time_qgwc), + bl_gxfc = VALUES(bl_gxfc), + gxfc_time = VALUES(gxfc_time), + update_time_gxfc = VALUES(update_time_gxfc), + bl_fjh = VALUES(bl_fjh), + fjh_time = VALUES(fjh_time), + update_time_fjh = VALUES(update_time_fjh), + bl_track_gen_bg = VALUES(bl_track_gen_bg), + bl_track_gen_bgfx = VALUES(bl_track_gen_bgfx), + bl_track_gen_qf = VALUES(bl_track_gen_qf), + bl_track_gen_dd = VALUES(bl_track_gen_dd), + bl_track_gen_qg = VALUES(bl_track_gen_qg), + bl_track_gen_dc = VALUES(bl_track_gen_dc) + + diff --git a/bms-back/sql/price/srv_bill_air_tables.sql b/bms-back/sql/price/srv_bill_air_tables.sql new file mode 100644 index 00000000..56fd6187 --- /dev/null +++ b/bms-back/sql/price/srv_bill_air_tables.sql @@ -0,0 +1,169 @@ +-- ===================================================================== +-- 空运提单:镜像表 + 每日 02:00 同步任务(生产库执行) +-- 来源:Oracle WEISHI_USER.TAB_BILL_AIR,按 guid / bill_code 1:1 拆分 +-- 相关脚本(可选执行): +-- sql/price/air_bill_type_dict.sql +-- sql/price/air_bill_menu.sql +-- ===================================================================== +SET NAMES utf8mb4; + +CREATE TABLE IF NOT EXISTS `srv_bill_air` ( + `guid` varchar(64) NOT NULL COMMENT '主键', + `bill_code` varchar(64) NOT NULL COMMENT '提单号', + `bill_type` int(11) DEFAULT NULL COMMENT '提单类型', + `bl_status` int(11) DEFAULT NULL COMMENT '状态', + `warning_status` tinyint(4) DEFAULT NULL COMMENT '预警状态', + `warning_count` int(11) DEFAULT NULL COMMENT '预警次数', + `start_airport` varchar(64) DEFAULT NULL COMMENT '始发机场', + `end_airport` varchar(64) DEFAULT NULL COMMENT '目的机场', + `des_port` varchar(64) DEFAULT NULL COMMENT '目的港', + `route_name` varchar(64) DEFAULT NULL COMMENT '航线名称', + `air_type` varchar(64) DEFAULT NULL COMMENT '空运类型', + `piece_number` int(11) DEFAULT NULL COMMENT '总件数', + `volume` decimal(20,3) DEFAULT NULL COMMENT '总体积', + `actual_weight` decimal(20,2) DEFAULT NULL COMMENT '实际重量', + `actual_volume` decimal(20,3) DEFAULT NULL COMMENT '实际体积', + `volume_weight` decimal(20,3) DEFAULT NULL COMMENT '体积重', + `air_company` varchar(64) DEFAULT NULL COMMENT '航空公司', + `send_man_code` varchar(64) DEFAULT NULL COMMENT '发货人编码', + `accept_man_code` varchar(64) DEFAULT NULL COMMENT '收货人编码', + `data_from` varchar(64) DEFAULT NULL COMMENT '数据来源', + `create_man_code` varchar(64) DEFAULT NULL COMMENT '创建人工号', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `modifier_code` varchar(64) DEFAULT NULL COMMENT '修改人工号', + `modify_time` datetime DEFAULT NULL COMMENT '修改时间', + `remark` varchar(500) DEFAULT NULL COMMENT '总备注', + PRIMARY KEY (`guid`), + UNIQUE KEY `uk_bill_code` (`bill_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空运提单主表'; + +CREATE TABLE IF NOT EXISTS `srv_bill_air_finance` ( + `guid` varchar(64) NOT NULL COMMENT '主键', + `bill_code` varchar(64) NOT NULL COMMENT '提单号', + `bl_check` tinyint(4) DEFAULT NULL COMMENT '是否核对', + `check_remark` varchar(64) DEFAULT NULL COMMENT '核对备注', + `bl_confirm` int(11) DEFAULT NULL COMMENT '是否确认', + `confirm_man_code` varchar(64) DEFAULT NULL COMMENT '确认人工号', + `confirm_time` datetime DEFAULT NULL COMMENT '确认时间', + `price` decimal(20,2) DEFAULT NULL COMMENT '单价', + `amount` decimal(20,2) DEFAULT NULL COMMENT '金额', + `calc_exp` varchar(64) DEFAULT NULL COMMENT '应付计算', + `calc_re` varchar(64) DEFAULT NULL COMMENT '应收计算', + `price_remark` varchar(128) DEFAULT NULL COMMENT '价格备注', + `baoguan_fee` decimal(20,4) DEFAULT NULL COMMENT '报关费', + `baoguan_other_fee` decimal(20,4) DEFAULT NULL COMMENT '报关其他费用', + `stock_fee` decimal(20,4) DEFAULT NULL COMMENT '仓储费', + `des_port_agent_fee` decimal(20,4) DEFAULT NULL COMMENT '目的港代理费', + `air_other_fee` decimal(20,4) DEFAULT NULL COMMENT '空运其他费用', + `other_fee` decimal(20,4) DEFAULT NULL COMMENT '其他费用', + `compensate_remark` varchar(64) DEFAULT NULL COMMENT '索赔备注', + `charge_man_code` varchar(64) DEFAULT NULL COMMENT '计费人工号', + PRIMARY KEY (`guid`), + UNIQUE KEY `uk_bill_code` (`bill_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空运提单财务费用表'; + +CREATE TABLE IF NOT EXISTS `srv_bill_air_flight` ( + `guid` varchar(64) NOT NULL COMMENT '主键', + `bill_code` varchar(64) NOT NULL COMMENT '提单号', + `air_no` varchar(64) DEFAULT NULL COMMENT '航班号', + `actual_air_no` varchar(64) DEFAULT NULL COMMENT '实际航班号', + `air_ompany_agent` varchar(128) DEFAULT NULL COMMENT '航空公司代理', + `des_port_agent_code` varchar(64) DEFAULT NULL COMMENT '目的港代理编码', + `board_no` varchar(64) DEFAULT NULL COMMENT '板号', + `band_box_count` int(11) DEFAULT NULL COMMENT '打板箱数', + `band_volume` decimal(20,2) DEFAULT NULL COMMENT '打板体积', + `band_box_weight` decimal(20,2) DEFAULT NULL COMMENT '打板重量', + `divisor_value` decimal(20,3) DEFAULT NULL COMMENT '体积系数', + `first_landing_time` datetime DEFAULT NULL COMMENT '首程落地时间', + `second_takeoff_time` datetime DEFAULT NULL COMMENT '二程起飞时间', + `air_delay_time` datetime DEFAULT NULL COMMENT '航班延误时间', + `trunk_destinations` varchar(64) DEFAULT NULL COMMENT '干线目的地', + PRIMARY KEY (`guid`), + UNIQUE KEY `uk_bill_code` (`bill_code`), + KEY `idx_air_no` (`air_no`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空运航班干线表'; + +CREATE TABLE IF NOT EXISTS `srv_bill_air_op` ( + `guid` varchar(64) NOT NULL COMMENT '主键', + `bill_code` varchar(64) NOT NULL COMMENT '提单号', + `bl_retrieval` tinyint(4) DEFAULT NULL COMMENT '是否提货', + `retrieval_date` datetime DEFAULT NULL COMMENT '提货日期', + `retrieval_man_code` varchar(64) DEFAULT NULL COMMENT '提货人工号', + `pick_box_count` int(11) DEFAULT NULL COMMENT '提货箱数', + `pick_count_real` int(11) DEFAULT NULL COMMENT '实际提货件数', + `declare_code` varchar(64) DEFAULT NULL COMMENT '报关公司编码', + `clearance_code` varchar(64) DEFAULT NULL COMMENT '清关编码', + `qingguan_agent` varchar(64) DEFAULT NULL COMMENT '清关代理', + `clearance_op_code` varchar(64) DEFAULT NULL COMMENT '清关操作人工号', + `stock_addr` varchar(64) DEFAULT NULL COMMENT '出仓仓库地址', + `stock_out_remark` varchar(500) DEFAULT NULL COMMENT '出库备注', + `deliver_count` int(11) DEFAULT NULL COMMENT '派送件数', + `first_deliver_count` int(11) DEFAULT NULL COMMENT '首批派送件数', + `last_deliver_count` int(11) DEFAULT NULL COMMENT '末批派送件数', + `ac_deliver_diff` varchar(64) DEFAULT NULL COMMENT '派送差异', + `deliver_end_diff` varchar(64) DEFAULT NULL COMMENT '派送完成差异', + `check_order_count` int(11) DEFAULT NULL COMMENT '查验订单数', + `check_leave_count` int(11) DEFAULT NULL COMMENT '查验放行数', + `internal_check_time` datetime DEFAULT NULL COMMENT '内部查验时间', + PRIMARY KEY (`guid`), + UNIQUE KEY `uk_bill_code` (`bill_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空运提单操作派送表'; + +CREATE TABLE IF NOT EXISTS `srv_bill_air_track` ( + `guid` varchar(64) NOT NULL COMMENT '主键', + `bill_code` varchar(64) NOT NULL COMMENT '提单号', + `start_time_plan` datetime DEFAULT NULL COMMENT '计划起飞时间', + `arrive_time_plan` datetime DEFAULT NULL COMMENT '计划到达时间', + `shipping_date` datetime DEFAULT NULL COMMENT '发货日期', + `start_time` datetime DEFAULT NULL COMMENT '起飞时间', + `arrive_time` datetime DEFAULT NULL COMMENT '到达时间', + `arrive_stock_time` datetime DEFAULT NULL COMMENT '到仓时间', + `clearance_time` datetime DEFAULT NULL COMMENT '清关时间', + `end_oprate_time` datetime DEFAULT NULL COMMENT '结束操作时间', + `bl_bgfx` tinyint(4) DEFAULT NULL, + `bgfx_time` datetime DEFAULT NULL, + `update_time_bgfx` datetime DEFAULT NULL, + `bl_sjqf` tinyint(4) DEFAULT NULL, + `sjqf_time` datetime DEFAULT NULL, + `update_time_sjqf` datetime DEFAULT NULL, + `bl_sjdd` tinyint(4) DEFAULT NULL, + `sjdd_time` datetime DEFAULT NULL, + `update_time_sjdd` datetime DEFAULT NULL, + `bl_tzdc` tinyint(4) DEFAULT NULL, + `tzdc_time` datetime DEFAULT NULL, + `update_time_tzdc` varchar(64) DEFAULT NULL, + `bl_thdc` tinyint(4) DEFAULT NULL, + `thdc_time` datetime DEFAULT NULL, + `update_time_thdc` datetime DEFAULT NULL, + `bl_qgwc` tinyint(4) DEFAULT NULL, + `qgwc_time` datetime DEFAULT NULL, + `update_time_qgwc` datetime DEFAULT NULL, + `bl_gxfc` tinyint(4) DEFAULT NULL, + `gxfc_time` datetime DEFAULT NULL, + `update_time_gxfc` varchar(64) DEFAULT NULL, + `bl_fjh` tinyint(4) DEFAULT NULL, + `fjh_time` datetime DEFAULT NULL, + `update_time_fjh` varchar(64) DEFAULT NULL, + `bl_track_gen_bg` tinyint(4) DEFAULT NULL, + `bl_track_gen_bgfx` tinyint(4) DEFAULT NULL, + `bl_track_gen_qf` tinyint(4) DEFAULT NULL, + `bl_track_gen_dd` tinyint(4) DEFAULT NULL, + `bl_track_gen_qg` tinyint(4) DEFAULT NULL, + `bl_track_gen_dc` tinyint(4) DEFAULT NULL, + PRIMARY KEY (`guid`), + UNIQUE KEY `uk_bill_code` (`bill_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='空运提单时效轨迹表'; + +-- ---------------------------- +-- 定时任务:老系统 Oracle TAB_BILL_AIR -> srv_bill_air* 提单每日同步 +-- 调用目标:billAirSyncTask.syncFromOracle() +-- cron 0 0 2 * * ? = 每天 02:00:00;concurrent=1 禁止并发;misfire=3 放弃错过的执行 +-- 幂等:按 guid upsert,可重复执行 +-- ---------------------------- +INSERT INTO sys_job (job_name, job_group, invoke_target, cron_expression, + misfire_policy, concurrent, status, create_by, create_time, remark) +SELECT N'老系统空运提单每日同步', 'DEFAULT', 'billAirSyncTask.syncFromOracle()', '0 0 2 * * ?', + '3', '1', '0', 'admin', NOW(), + N'每天02:00从Oracle(WEISHI_USER.TAB_BILL_AIR,只读账号)全量同步到srv_bill_air/finance/flight/op/track;按guid upsert,可重复执行' +FROM DUAL +WHERE NOT EXISTS (SELECT 1 FROM sys_job WHERE invoke_target = 'billAirSyncTask.syncFromOracle()');