From 78a70c0e8caa6fc5b8789e2e6f0a2a58d8f4c484 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Tue, 4 Jul 2023 11:58:53 +0200 Subject: [PATCH] feature : Job that archives po, poc, parcel, parcel_traces fix : orders with empty logistic_channel_name were not displayed in invoicing page with manual selection --- .../shippingInvoice/InvoiceController.java | 10 +- .../modules/business/domain/job/CMKJob.java | 124 ++++++++++++++++++ .../business/domain/job/DBArchivingJob.java | 41 +++--- .../jeecg/modules/business/entity/Parcel.java | 49 +++---- .../modules/business/entity/ParcelTrace.java | 67 +++++----- .../modules/business/mapper/ParcelMapper.java | 14 ++ .../business/mapper/ParcelTraceMapper.java | 16 +++ .../mapper/PlatformOrderContentMapper.java | 1 + .../business/mapper/PlatformOrderMapper.java | 1 + .../business/mapper/xml/ParcelMapper.xml | 40 ++++++ .../business/mapper/xml/ParcelTraceMapper.xml | 47 ++++++- .../mapper/xml/PlatformOrderContentMapper.xml | 30 +++++ .../mapper/xml/PlatformOrderMapper.xml | 47 +++++++ .../business/service/IParcelService.java | 3 + .../business/service/IParcelTraceService.java | 12 ++ .../service/IPlatformOrderContentService.java | 7 + .../service/IPlatformOrderService.java | 10 +- .../service/impl/ParcelServiceImpl.java | 59 +++++++++ .../service/impl/ParcelTraceServiceImpl.java | 6 + .../PlatformOrderContentServiceImpl.java | 9 +- .../impl/PlatformOrderServiceImpl.java | 4 + .../src/main/resources/application-dev.yml | 28 ++-- 22 files changed, 517 insertions(+), 108 deletions(-) create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/CMKJob.java rename jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/{purchase => }/PlatformOrderContentServiceImpl.java (85%) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java index 449cfdd19..9e628a34f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java @@ -122,19 +122,19 @@ public class InvoiceController { log.info("Specified period between " + start + " and " + end); if (type.equals("shipping")) lambdaQueryWrapper.inSql(PlatformOrder::getId, "SELECT po.id FROM platform_order po\n" + - "JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name\n" + + "LEFT JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name\n" + "WHERE po.shipping_time between '" + start + "' AND '" + end + "'\n" + - "AND lc.warehouse_in_china IN (" + warehouseString + ")"); + "AND (lc.warehouse_in_china IN (" + warehouseString + ") OR po.logistic_channel_name = '' OR po.logistic_channel_name IS NULL)"); else lambdaQueryWrapper.inSql(PlatformOrder::getId, "SELECT po.id FROM platform_order po\n" + - "JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name\n" + + "LEFT JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name\n" + "WHERE po.order_time between '" + start + "' AND '" + end + "'\n" + - "AND lc.warehouse_in_china IN (" + warehouseString + ")"); + "AND (lc.warehouse_in_china IN (" + warehouseString + ") OR po.logistic_channel_name = '' OR po.logistic_channel_name IS NULL)"); } else {// obsolete lambdaQueryWrapper.inSql(PlatformOrder::getId, "SELECT po.id FROM platform_order po\n" + "JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name\n" + - "WHERE lc.warehouse_in_china IN (" + warehouseString + ")"); + "WHERE (lc.warehouse_in_china IN (" + warehouseString + ") OR po.logistic_channel_name = '' OR po.logistic_channel_name IS NULL)"); } pageList = platformOrderMapper.selectPage(page, lambdaQueryWrapper); return Result.OK(pageList); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/CMKJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/CMKJob.java new file mode 100644 index 000000000..2df72bb49 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/CMKJob.java @@ -0,0 +1,124 @@ +package org.jeecg.modules.business.domain.job; + +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.util.EntityUtils; +import org.codehaus.jettison.json.JSONArray; +import org.codehaus.jettison.json.JSONException; +import org.codehaus.jettison.json.JSONObject; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelTraceData; +import org.jeecg.modules.business.domain.api.cmk.CMKRequest; +import org.jeecg.modules.business.domain.api.cmk.CMKResponse; +import org.jeecg.modules.business.service.IParcelService; +import org.jeecg.modules.business.service.IPlatformOrderService; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.sql.Date; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@Slf4j +public class CMKJob implements Job { + + @Autowired + private IParcelService parcelService; + @Autowired + private IPlatformOrderService platformOrderService; + + private static final Integer DEFAULT_NUMBER_OF_DAYS = 15; + private static final Integer DEFAULT_NUMBER_OF_THREADS = 10; + private static final Integer DEFAULT_MAXIMUM_NUMBER_OF_PARCELS_PER_TRANSACTION = 800; + private static final List DEFAULT_TRANSPORTERS = Arrays.asList("CMK-JJ-PH 法 美 德", "CMK-DB-PH6000", "CMK-DB-PH18000", "CMK-DB-PH10000"); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + LocalDate endDate = LocalDate.now(); + LocalDate startDate = endDate.minusDays(DEFAULT_NUMBER_OF_DAYS); + List transporters = DEFAULT_TRANSPORTERS; + boolean overrideRestriction = false; + ObjectMapper mapper = new ObjectMapper(); + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + JobDataMap jobDataMap = context.getMergedJobDataMap(); + String parameter = ((String) jobDataMap.get("parameter")); + if (parameter != null) { + try { + JSONObject jsonObject = new JSONObject(parameter); + if (!jsonObject.isNull("startDate")) { + String startDateStr = jsonObject.getString("startDate"); + startDate = LocalDate.parse(startDateStr); + } + if (!jsonObject.isNull("endDate")) { + String endDateStr = jsonObject.getString("endDate"); + endDate = LocalDate.parse(endDateStr); + } + if (!jsonObject.isNull("transporters")) { + JSONArray transporterArray = jsonObject.getJSONArray("transporters"); + List transporterList = new ArrayList<>(); + for (int i = 0; i < transporterArray.length(); i++) { + transporterList.add(transporterArray.getString(i)); + } + transporters = transporterList; + } + if (!jsonObject.isNull("override")) { + overrideRestriction = jsonObject.getBoolean("override"); + } + } catch (JSONException e) { + log.error("Error while parsing parameter as JSON, falling back to default parameters."); + } + } + + if (!endDate.isAfter(startDate)) { + throw new RuntimeException("EndDate must be strictly greater than StartDate !"); + } else if (endDate.minusDays(30).isAfter(startDate) && !overrideRestriction) { + throw new RuntimeException("No more than 30 days can separate startDate and endDate !"); + } + + log.info("Starting to retrieve parcel traces of {} from {} to {}", transporters, startDate, endDate); + List billCodes = platformOrderService.fetchBillCodesOfParcelsWithoutTrace( + Date.valueOf(startDate), Date.valueOf(endDate), transporters); + log.info("{} parcels without trace in total", billCodes.size()); + List> billCodeLists = Lists.partition(billCodes, 10); + log.info("Requests will be divided in to {} parts", billCodeLists.size()); + List parcelTraces = new ArrayList<>(); + List cmkRequests = new ArrayList<>(); + billCodeLists.forEach(billcodeList -> { + CMKRequest cmkRequest = new CMKRequest(billcodeList); + cmkRequests.add(cmkRequest); + }); + List results = new ArrayList<>(); + for (CMKRequest request : cmkRequests) { + boolean success = false; + HttpEntity entity = request.send().getEntity(); + try { + // String of the response + String responseString = EntityUtils.toString(entity, "UTF-8"); + CMKResponse cmkResponse = mapper.readValue(responseString, CMKResponse.class); + parcelTraces.addAll(cmkResponse.getParcelData()); + success = true; + } catch (IOException e) { + log.error("Error while parsing response into String", e); + } finally { + results.add(success); + } + log.info("{} parcel added to the queue to be inserted into DB.", parcelTraces.size()); + } + long nbSuccesses = results.stream().filter(b -> b).count(); + log.info("{}/{} lots of 10 parcel traces have been retrieved.", nbSuccesses, cmkRequests.size()); + + List> parcelTraceList = Lists.partition(parcelTraces, DEFAULT_MAXIMUM_NUMBER_OF_PARCELS_PER_TRANSACTION); + for (List parcelTracesPerTransaction : parcelTraceList) { + parcelService.saveCMKParcelAndTraces(parcelTracesPerTransaction); + } + } + +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/DBArchivingJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/DBArchivingJob.java index 45acf2bcb..5d54b4987 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/DBArchivingJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/DBArchivingJob.java @@ -68,30 +68,39 @@ public class DBArchivingJob implements Job { if (!endDateTime.isAfter(startDateTime)) { throw new RuntimeException("EndDateTime must be strictly greater than StartDateTime !"); } - System.out.println("startdatetime : " + startDateTime + "\nendDateTime : " + endDateTime); String startDate = startDateTime.toString().substring(0,10); endDateTime = endDateTime.plusDays(1); String endDate = endDateTime.toString().substring(0,10); - System.out.println("startdatetime : " + startDateTime + "\nendDateTime : " + endDateTime); - System.out.println("startdate : " + startDate + "\nendDate : " + endDate); - - // step1: sauvegarde des entrées dans des objets - // insertion des objets dans les tables d'archives - // drop les entrées dans l'ancienne table + // sauvegarde des entrées dans des listes + // suppression des entrées dans l'ancienne table List platformOrders = platformOrderService.fetchPlatformOrdersToArchive(startDate, endDate); List platformOrderIDs = platformOrders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); List platformOrderContents = platformOrderContentService.fetchPlatformOrderContentsToArchive(platformOrderIDs); - List platformOrderTrackingNumber = platformOrders.stream().map(PlatformOrder::getTrackingNumber).collect(Collectors.toList()); - try { - List parcels = parcelService.fetchParcelsToArchive(platformOrderTrackingNumber); - List parcelIDs = parcels.stream().map(Parcel::getId).collect(Collectors.toList()); - List parcelTraces = parcelTraceService.fetchParcelTracesToArchive(parcelIDs); - System.out.println("Parcel count : " + parcels.size()); - System.out.println("Parcel_trace count : " + parcelTraces.size()); - } catch (Exception ignored) { + log.info("Archiving entries between ["+startDate+" and "+endDate+"]\n" + +"- Platform Order entries : " + platformOrders.size() + "\n" + +"- Platform Order Content entries : " + platformOrderContents.size()); + platformOrderService.savePlatformOrderArchive(platformOrders); + platformOrderContentService.savePlatformOrderContentArchive(platformOrderContents); + platformOrderService.delBatchMain(platformOrderIDs); + + List platformOrderTrackingNumber = platformOrders.stream().map(PlatformOrder::getTrackingNumber).collect(Collectors.toList()); + if(platformOrderTrackingNumber.size() > 0) { + List parcels = parcelService.fetchParcelsToArchive(platformOrderTrackingNumber); + if(parcels.size() > 0) { + log.info("- Parcel entries : " + parcels.size()); + parcelService.saveParcelArchive(parcels); + + List parcelIDs = parcels.stream().map(Parcel::getId).collect(Collectors.toList()); + List parcelTraces = parcelTraceService.fetchParcelTracesToArchive(parcelIDs); + if(parcelTraces.size() > 0) { + log.info("- Parcel trace entries : " + parcelTraces.size()); + parcelTraceService.saveParcelTraceArchive(parcelTraces); + } + parcelService.delBatchMain(parcelIDs); + } } - System.out.println(platformOrderIDs); + log.info("Archiving Done."); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Parcel.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Parcel.java index b956a70b5..072f90587 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Parcel.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Parcel.java @@ -24,58 +24,45 @@ import java.io.Serializable; public class Parcel implements Serializable { private static final long serialVersionUID = 1L; - /** - * 主键 - */ + /**主键*/ @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "主键") private java.lang.String id; - /** - * 创建人 - */ + /**创建人*/ @ApiModelProperty(value = "创建人") private java.lang.String createBy; - /** - * 创建日期 - */ - @JsonFormat(timezone = "GMT+2", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "创建日期") private java.util.Date createTime; - /** - * 更新人 - */ + /**更新人*/ @ApiModelProperty(value = "更新人") private java.lang.String updateBy; - /** - * 更新日期 - */ - @JsonFormat(timezone = "GMT+2", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "更新日期") private java.util.Date updateTime; - /** - * 运单编号 - */ + /**运单编号*/ @Excel(name = "运单编号", width = 15) @ApiModelProperty(value = "运单编号") private java.lang.String billCode; - /** - * 目的国家 - */ + /**目的国家*/ @Excel(name = "目的国家", width = 15) @ApiModelProperty(value = "目的国家") private java.lang.String country; - /** - * 末端派送单号 - */ + /**末端派送单号*/ @Excel(name = "末端派送单号", width = 15) @ApiModelProperty(value = "末端派送单号") private java.lang.String thirdBillCode; - /** - * 订单编号 - */ + /**订单编号*/ @Excel(name = "订单编号", width = 15) @ApiModelProperty(value = "订单编号") private java.lang.String orderNo; + /**物流承运商产品代码*/ + @Excel(name = "物流承运商产品代码", width = 15) + @ApiModelProperty(value = "物流承运商产品代码") + private java.lang.String productCode; } + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ParcelTrace.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ParcelTrace.java index 452d22ece..382cf322f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ParcelTrace.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ParcelTrace.java @@ -24,65 +24,58 @@ import java.io.Serializable; public class ParcelTrace implements Serializable { private static final long serialVersionUID = 1L; - /** - * 主键 - */ + /**主键*/ @TableId(type = IdType.ASSIGN_ID) @ApiModelProperty(value = "主键") private java.lang.String id; - /** - * 创建人 - */ + /**创建人*/ @ApiModelProperty(value = "创建人") private java.lang.String createBy; - /** - * 创建日期 - */ - @JsonFormat(timezone = "GMT+2", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /**创建日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "创建日期") private java.util.Date createTime; - /** - * 更新人 - */ + /**更新人*/ @ApiModelProperty(value = "更新人") private java.lang.String updateBy; - /** - * 更新日期 - */ - @JsonFormat(timezone = "GMT+2", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /**更新日期*/ + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "更新日期") private java.util.Date updateTime; - /** - * 包裹ID - */ + /**包裹ID*/ + @Excel(name = "包裹ID", width = 15) @ApiModelProperty(value = "包裹ID") private java.lang.String parcelId; - /** - * 操作时间 - */ - @Excel(name = "操作时间", width = 20, format = "yyyy-MM-dd HH:mm:ss") - @JsonFormat(timezone = "GMT+2", pattern = "yyyy-MM-dd HH:mm:ss") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + /**操作时间*/ + @Excel(name = "操作时间", width = 15, format = "yyyy-MM-dd") + @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd") + @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "操作时间") private java.util.Date scanTime; - /** - * 操作类型 - */ + /**操作类型*/ @Excel(name = "操作类型", width = 15) @ApiModelProperty(value = "操作类型") private java.lang.String scanType; - /** - * 操作描述 - */ + /**操作描述*/ @Excel(name = "操作描述", width = 15) @ApiModelProperty(value = "操作描述") private java.lang.String description; - /** - * 英文操作描述 - */ + /**英文操作描述*/ @Excel(name = "英文操作描述", width = 15) @ApiModelProperty(value = "英文操作描述") private java.lang.String descriptionEn; + /**包裹当前所在地*/ + @Excel(name = "包裹当前所在地", width = 15) + @ApiModelProperty(value = "包裹当前所在地") + private java.lang.String traceLocation; + /**包裹状态*/ + @Excel(name = "包裹状态", width = 15) + @ApiModelProperty(value = "包裹状态") + private java.lang.String traceStatus; + /**轨迹代码*/ + @Excel(name = "轨迹代码", width = 15) + @ApiModelProperty(value = "轨迹代码") + private java.lang.String traceCode; } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelMapper.java index c8e4bb730..ae6c8b825 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelMapper.java @@ -2,6 +2,7 @@ package org.jeecg.modules.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelTraceData; import org.jeecg.modules.business.domain.api.equick.EQuickResponse; import org.jeecg.modules.business.domain.api.jt.JTParcelTrace; import org.jeecg.modules.business.domain.api.yd.YDTraceData; @@ -26,5 +27,18 @@ public interface ParcelMapper extends BaseMapper { void insertOrUpdateEQParcels(List parcels); void insertOrIgnoreYDParcels(List parcels); + void insertOrIgnoreCMKParcels(List parcels); + + /** + * fetch all parcels from platform order's tracking number, to archive + * @param trackingNumbers + * @return List of parcels + */ List fetchParcelsToArchive(@Param("trackingNumbers") List trackingNumbers); + + /** + * Inserts into parce_trace_delete table parcel traces to archive + * @param parcels + */ + void insertParcelsArchive(@Param("parcels") List parcels); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelTraceMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelTraceMapper.java index ca91a9ead..d7f0f797e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelTraceMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ParcelTraceMapper.java @@ -2,6 +2,8 @@ package org.jeecg.modules.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelTrace; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelTraceData; import org.jeecg.modules.business.domain.api.equick.EQuickTraceData; import org.jeecg.modules.business.domain.api.jt.JTParcelTraceDetail; import org.jeecg.modules.business.domain.api.yd.YDTraceDetail; @@ -28,5 +30,19 @@ public interface ParcelTraceMapper extends BaseMapper { void insertOrUpdateEQTraces(@Param("traces") List traceDetails); void insertOrIgnoreYDTraces(@Param("traces") List traceDetails); + + void insertOrIgnoreCMKTraces(@Param("traces") List traceDetails); + + /** + * Fetches parcel traces to archive + * @param parcelIDs + * @return List of parcel traces + */ List fetchParcelTracesToArchive(@Param("parcelIDs") List parcelIDs); + + /** + * inserts into parce_trace_delete table parcels to archive + * @param parcelTraces + */ + void insertParceTracesArchive(@Param("parcelTraces") List parcelTraces); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java index 98ff39b02..0c66de46a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java @@ -72,4 +72,5 @@ public interface PlatformOrderContentMapper extends BaseMapper findUninvoicedShippedOrderContents(); List fetchPlatformOrderContentsToArchive(@Param("orderIDs") List orderIDs); + void insertPlatformOrderContentsArchives(@Param("orderContents") List platformOrderContents); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java index d12cc1aa9..380ee7fcf 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java @@ -178,4 +178,5 @@ public interface PlatformOrderMapper extends BaseMapper { @Param("erpStatuses") List erpStatuses, @Param("warehouses") List warehouses); List fetchPlatformOrdersToArchive(@Param("startDate") String startDate, @Param("endDate") String endDate); + void insertPlatformOrdersArchives(@Param("orders") List platformOrders); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelMapper.xml index c290e098e..24a6c96c9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelMapper.xml @@ -67,6 +67,25 @@ ) + + INSERT IGNORE INTO parcel(id, create_by, create_time, update_by, update_time, bill_code, country, + third_bill_code, order_no, product_code) + VALUES + + ( + #{parcel.id}, + 'cmk api', + NOW(), + 'cmk api', + NOW(), + #{parcel.thirdBillCode}, + #{parcel.country}, + #{parcel.thirdBillCode}, + #{parcel.detail.orderNo}, + #{parcel.detail.productCode} + ) + + + + INSERT INTO parcel_delete(id, create_by, create_time, + update_by, update_time, bill_code, + country, third_bill_code, + order_no, product_code) + VALUES + + ( + #{parcel.id}, + #{parcel.createBy}, + #{parcel.createTime}, + #{parcel.updateBy}, + #{parcel.updateTime}, + #{parcel.billCode}, + #{parcel.country}, + #{parcel.thirdBillCode}, + #{parcel.orderNo}, + #{parcel.productCode} + ) + ; + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelTraceMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelTraceMapper.xml index 0cf9a9277..0c8e4bd3a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelTraceMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ParcelTraceMapper.xml @@ -80,7 +80,27 @@ ) - SELECT * FROM parcel_trace WHERE parcel_id IN @@ -88,4 +108,29 @@ #{parcelID} ; + + INSERT INTO parcel_trace_delete (id, create_by, create_time, + update_by, update_time, + parcel_id, scan_time, scan_type, + description, description_en, + trace_location, trace_status, trace_code) + VALUES + + ( + #{trace.id}, + #{trace.createBy}, + #{trace.createTime}, + #{trace.updateBy}, + #{trace.updateTime}, + #{trace.parcelId}, + #{trace.scanTime}, + #{trace.scanType}, + #{trace.description}, + #{trace.descriptionEn}, + #{trace.traceLocation}, + #{trace.traceStatus}, + #{trace.traceCode} + ) + ; + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml index b7543deae..5c0ba30f5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml @@ -249,4 +249,34 @@ #{orderID} ; + + INSERT INTO platform_order_content_delete(id, create_by, create_time, + update_by, update_time, + platform_order_id, sku_id, + quantity, purchase_fee, + shipping_fee, service_fee, + vat, status, erp_status, + product_available, picking_fee) + VALUES + + ( + #{content.id}, + #{content.createBy}, + #{content.createTime}, + #{content.updateBy}, + #{content.updateTime}, + #{content.platformOrderId}, + #{content.skuId}, + #{content.quantity}, + #{content.purchaseFee}, + #{content.shippingFee}, + #{content.serviceFee}, + #{content.vat}, + #{content.status}, + #{content.erpStatus}, + #{content.productAvailable}, + #{content.pickingFee} + ) + ; + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml index 8ac078e23..9f3568827 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml @@ -532,4 +532,51 @@ WHERE erp_status IN (4,5) AND order_time BETWEEN #{startDate} AND #{endDate}; + + INSERT INTO platform_order_delete(id, create_by, + create_time, update_by, + update_time, shop_id, + logistic_channel_name, platform_order_id, + platform_order_number, tracking_number, + order_time, shipping_time, + recipient, country, postcode, status, fret_fee, + order_service_fee, shipping_invoice_number, + target, erp_order_id, erp_status, invoice_logistic_channel_name, + internal_tracking_number, product_available, ready_for_shopify_sync, + can_send, picking_fee, packaging_material_fee) + VALUES + + ( + #{order.id}, + #{order.createBy}, + #{order.createTime}, + #{order.updateBy}, + #{order.updateTime}, + #{order.shopId}, + #{order.logisticChannelName}, + #{order.platformOrderId}, + #{order.platformOrderNumber}, + #{order.trackingNumber}, + #{order.orderTime}, + #{order.shippingTime}, + #{order.recipient}, + #{order.country}, + #{order.postcode}, + #{order.status}, + #{order.fretFee}, + #{order.orderServiceFee}, + #{order.shippingInvoiceNumber}, + #{order.target}, + #{order.erpOrderId}, + #{order.erpStatus}, + #{order.invoiceLogisticChannelName}, + #{order.internalTrackingNumber}, + #{order.productAvailable}, + #{order.readyForShopifySync}, + #{order.canSend}, + #{order.pickingFee}, + #{order.packagingMaterialFee} + ) + ; + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelService.java index bb09b561f..8eee3e9de 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelService.java @@ -1,6 +1,7 @@ package org.jeecg.modules.business.service; import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelTraceData; import org.jeecg.modules.business.domain.api.equick.EQuickResponse; import org.jeecg.modules.business.domain.api.jt.JTParcelTrace; import org.jeecg.modules.business.domain.api.yd.YDTraceData; @@ -46,5 +47,7 @@ public interface IParcelService extends IService { void saveEQParcelAndTraces(List parcelTraces); void saveYDParcelAndTraces(List traceData); + void saveCMKParcelAndTraces(List traceData); List fetchParcelsToArchive(List trackingNumbers); + void saveParcelArchive(List parcels); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelTraceService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelTraceService.java index dfd0e6112..745c0c6ea 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelTraceService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IParcelTraceService.java @@ -14,5 +14,17 @@ import java.util.List; public interface IParcelTraceService extends IService { public List selectByMainId(String mainId); + + /** + * Fetch all parcel traces to archive from parcel id + * @param parcelIDs + * @return list of parcel traces + */ List fetchParcelTracesToArchive(List parcelIDs); + + /** + * Saves parcel traces in parcel_trace_delete table + * @param parcelTraces + */ + void saveParcelTraceArchive(List parcelTraces); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderContentService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderContentService.java index 2884d870c..da552bd2f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderContentService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderContentService.java @@ -34,5 +34,12 @@ public interface IPlatformOrderContentService extends IService getAllSKUWeightsDiscountsServiceFees(); List searchOrderContent(List orderIDList); + + /** + * Fetches all platform order centents to archive from platform order id + * @param orderIDs platform order id + * @return list of platform order content to archive + */ List fetchPlatformOrderContentsToArchive(List orderIDs); + void savePlatformOrderContentArchive(List platformOrderContents); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java index dbdfc4428..ff8f8d3ce 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java @@ -143,9 +143,15 @@ public interface IPlatformOrderService extends IService { /** * Fetch all platform orders between 2 dates and of status erp_status 4 or 5 * this list will then be archived - * @param startDate - * @param endDate + * @param startDate Start date time + * @param endDate End date time * @return List of PlatformOrder */ List fetchPlatformOrdersToArchive(String startDate, String endDate); + + /** + * Archive a list of platform orders + * @param platformOrders list of platform orders + */ + void savePlatformOrderArchive(List platformOrders); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelServiceImpl.java index 7132f533f..1b0cb5341 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelServiceImpl.java @@ -2,14 +2,19 @@ package org.jeecg.modules.business.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelDetail; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelTrace; +import org.jeecg.modules.business.domain.api.cmk.CMKParcelTraceData; import org.jeecg.modules.business.domain.api.equick.EQuickResponse; import org.jeecg.modules.business.domain.api.equick.EQuickTraceData; import org.jeecg.modules.business.domain.api.jt.JTParcelTrace; import org.jeecg.modules.business.domain.api.jt.JTParcelTraceDetail; import org.jeecg.modules.business.domain.api.yd.YDTraceData; import org.jeecg.modules.business.domain.api.yd.YDTraceDetail; +import org.jeecg.modules.business.entity.Country; import org.jeecg.modules.business.entity.Parcel; import org.jeecg.modules.business.entity.ParcelTrace; +import org.jeecg.modules.business.mapper.CountryMapper; import org.jeecg.modules.business.mapper.ParcelMapper; import org.jeecg.modules.business.mapper.ParcelTraceMapper; import org.jeecg.modules.business.service.IParcelService; @@ -36,6 +41,8 @@ public class ParcelServiceImpl extends ServiceImpl impleme private ParcelMapper parcelMapper; @Autowired private ParcelTraceMapper parcelTraceMapper; + @Autowired + private CountryMapper countryMapper; @Override @Transactional @@ -218,7 +225,59 @@ public class ParcelServiceImpl extends ServiceImpl impleme } log.info("Finished inserting {} parcels and their traces into DB.", parcelTraces.size()); } + @Override + @Transactional + public void saveCMKParcelAndTraces(List parcelTraces) { + if (parcelTraces.isEmpty()) { + return; + } + log.info("Started inserting {} CMK parcels and their traces into DB.", parcelTraces.size() ); + List parcelBillCodes = parcelTraces.stream() + .map(CMKParcelTraceData::getThirdBillCode) + .collect(Collectors.toList()); + List existingParcels = parcelMapper.searchByBillCode(parcelBillCodes); + Map billCodeToExistingParcels = existingParcels.stream().collect( + Collectors.toMap(Parcel::getBillCode, Function.identity()) + ); + List countryList = countryMapper.findAll(); + Map countryNameMap = new HashMap<>(); + countryList.forEach(country -> countryNameMap.put(country.getNameZh(), country.getCode())); + + List parcelToInsert = new ArrayList<>(); + List tracesToInsert = new ArrayList<>(); + for (CMKParcelTraceData parcelAndTrace : parcelTraces) { + List traceDetails = parcelAndTrace.getTraceList(); + CMKParcelDetail parcelDetail = parcelAndTrace.getDetail(); + if (traceDetails.isEmpty()) { + break; + } + // Country name in detail is in Chinese, have to be converted to country code + parcelAndTrace.setCountry(countryNameMap.get(parcelDetail.getCountry())); + Parcel existingParcel = billCodeToExistingParcels.get(parcelAndTrace.getThirdBillCode()); + if (existingParcel == null) { + parcelToInsert.add(parcelAndTrace); + traceDetails.forEach(trace -> trace.parcelTraceProcess(parcelAndTrace.getId())); + } else { + traceDetails.forEach(trace -> trace.parcelTraceProcess(existingParcel.getId())); + } + tracesToInsert.addAll(new ArrayList<>(traceDetails).stream().filter(CMKParcelTrace::isUseful).collect(Collectors.toList())); + } + log.info("After filtering, {} parcels will be inserted into the DB.", parcelToInsert.size()); + if (!parcelToInsert.isEmpty()) { + parcelMapper.insertOrIgnoreCMKParcels(parcelToInsert); + } + if (!tracesToInsert.isEmpty()) { + parcelTraceMapper.insertOrIgnoreCMKTraces(tracesToInsert); + } + log.info("Finished inserting {} parcels and their traces into DB.", parcelTraces.size()); + } + @Override + @Transactional public List fetchParcelsToArchive(List trackingNumbers) { return parcelMapper.fetchParcelsToArchive(trackingNumbers); } + @Override + public void saveParcelArchive(List parcels) { + parcelMapper.insertParcelsArchive(parcels); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelTraceServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelTraceServiceImpl.java index ac7ff5e8f..dfea7f3d2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelTraceServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ParcelTraceServiceImpl.java @@ -2,6 +2,7 @@ package org.jeecg.modules.business.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.jeecg.modules.business.entity.ParcelTrace; +import org.jeecg.modules.business.entity.PlatformOrder; import org.jeecg.modules.business.mapper.ParcelTraceMapper; import org.jeecg.modules.business.service.IParcelTraceService; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +26,12 @@ public class ParcelTraceServiceImpl extends ServiceImpl selectByMainId(String mainId) { return parcelTraceMapper.selectByMainId(mainId); } + @Override public List fetchParcelTracesToArchive(List parcelIDs) { return parcelTraceMapper.fetchParcelTracesToArchive(parcelIDs); } + @Override + public void saveParcelTraceArchive(List parcelTraces) { + parcelTraceMapper.insertParceTracesArchive(parcelTraces); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PlatformOrderContentServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderContentServiceImpl.java similarity index 85% rename from jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PlatformOrderContentServiceImpl.java rename to jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderContentServiceImpl.java index 152f57be0..d80c3c838 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PlatformOrderContentServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderContentServiceImpl.java @@ -1,4 +1,4 @@ -package org.jeecg.modules.business.service.impl.purchase; +package org.jeecg.modules.business.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; @@ -11,6 +11,7 @@ import org.jeecg.modules.business.vo.SkuWeightDiscountServiceFees; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.transaction.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @@ -54,7 +55,11 @@ public class PlatformOrderContentServiceImpl extends ServiceImpl fetchPlatformOrderContentsToArchive(List orderIDs) { + @Override + public List fetchPlatformOrderContentsToArchive(List orderIDs) { return platformOrderContentMapper.fetchPlatformOrderContentsToArchive(orderIDs); } + public void savePlatformOrderContentArchive(List platformOrderContents) { + platformOrderContentMapper.insertPlatformOrderContentsArchives(platformOrderContents); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java index fbe201bd6..f5a383cd2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java @@ -370,4 +370,8 @@ public class PlatformOrderServiceImpl extends ServiceImpl fetchPlatformOrdersToArchive(String startDate, String endDate) { return platformOrderMap.fetchPlatformOrdersToArchive(startDate, endDate); } + @Override + public void savePlatformOrderArchive(List platformOrders) { + platformOrderMap.insertPlatformOrdersArchives(platformOrders); + } } diff --git a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml index 3f12cea3d..ba643802d 100644 --- a/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml +++ b/jeecg-module-system/jeecg-system-start/src/main/resources/application-dev.yml @@ -135,7 +135,7 @@ spring: master: url: jdbc:mysql://127.0.0.1:3306/wia_app_3?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Europe/Paris username: admin - password: admin + password: WIASourcing2021 driver-class-name: com.mysql.cj.jdbc.Driver # 多数据源配置 #multi-datasource1: @@ -190,28 +190,28 @@ jeecg: app: http://localhost:8051 path: #文件上传根目录 设置 - upload: E:\data\upload - save: E:\data\save + upload: C:\dev\upload + save: C:\dev\save # email template folder - emailTemplateDir: E://IdeaProject//wia_app_3//wia_app//jeecg-module-system//jeecg-system-biz//src//main//resources//templates + emailTemplateDir: C://Users//logau//IdeaProject//wia_app_3//wia_app//jeecg-module-system//jeecg-system-biz//src//main//resources//templates # purchase invoice template - purchaseTemplatePath: E://data//templates//Purchase_Invoice_Template.xlsx + purchaseTemplatePath: C://dev//templates//Purchase_Invoice_Template.xlsx # where to store generated file - purchaseInvoiceDir: E://data//invoices//purchase + purchaseInvoiceDir: C://dev//invoices//purchase # purchase invoice template - shippingTemplatePath_EU: E://data//templates//Shipping_Invoice_Template_EU.xlsx - shippingTemplatePath_US: E://data//templates//Shipping_Invoice_Template_US.xlsx + shippingTemplatePath_EU: C://dev//templates//Shipping_Invoice_Template_EU.xlsx + shippingTemplatePath_US: C://dev//templates//Shipping_Invoice_Template_US.xlsx # complete invoice template - completeTemplatePath_EU: E://data//templates//Complete_Invoice_Template_EU.xlsx - completeTemplatePath_US: E://data//templates//Complete_Invoice_Template_US.xlsx + completeTemplatePath_EU: C://dev//templates//Complete_Invoice_Template_EU.xlsx + completeTemplatePath_US: C://dev//templates//Complete_Invoice_Template_US.xlsx # where to store generated file - shippingInvoiceDir: E://data//invoices//shipping - shippingInvoiceDetailDir: E://data//invoices//shippingDetail - shippingInvoicePdfDir: E://data//invoices//pdf//shipping - shippingInvoiceDetailPdfDir: E://data//invoices//pdf//shippingDetail + shippingInvoiceDir: C://dev//invoices//shipping + shippingInvoiceDetailDir: C://dev//invoices//shippingDetail + shippingInvoicePdfDir: C://dev//invoices//pdf//shipping + shippingInvoiceDetailPdfDir: C://dev//invoices//pdf//shippingDetail #webapp文件路径 webapp: /opt/webapp shiro: