mirror of https://github.com/jeecgboot/jeecg-boot
feature : Job that archives po, poc, parcel, parcel_traces
fix : orders with empty logistic_channel_name were not displayed in invoicing page with manual selectionpull/6221/head
parent
d9286f5181
commit
78a70c0e8c
|
@ -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);
|
||||
|
|
|
@ -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<String> 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<String> 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<String> 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<String> billCodes = platformOrderService.fetchBillCodesOfParcelsWithoutTrace(
|
||||
Date.valueOf(startDate), Date.valueOf(endDate), transporters);
|
||||
log.info("{} parcels without trace in total", billCodes.size());
|
||||
List<List<String>> billCodeLists = Lists.partition(billCodes, 10);
|
||||
log.info("Requests will be divided in to {} parts", billCodeLists.size());
|
||||
List<CMKParcelTraceData> parcelTraces = new ArrayList<>();
|
||||
List<CMKRequest> cmkRequests = new ArrayList<>();
|
||||
billCodeLists.forEach(billcodeList -> {
|
||||
CMKRequest cmkRequest = new CMKRequest(billcodeList);
|
||||
cmkRequests.add(cmkRequest);
|
||||
});
|
||||
List<Boolean> 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<List<CMKParcelTraceData>> parcelTraceList = Lists.partition(parcelTraces, DEFAULT_MAXIMUM_NUMBER_OF_PARCELS_PER_TRANSACTION);
|
||||
for (List<CMKParcelTraceData> parcelTracesPerTransaction : parcelTraceList) {
|
||||
parcelService.saveCMKParcelAndTraces(parcelTracesPerTransaction);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -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<PlatformOrder> platformOrders = platformOrderService.fetchPlatformOrdersToArchive(startDate, endDate);
|
||||
List<String> platformOrderIDs = platformOrders.stream().map(PlatformOrder::getId).collect(Collectors.toList());
|
||||
List<PlatformOrderContent> platformOrderContents = platformOrderContentService.fetchPlatformOrderContentsToArchive(platformOrderIDs);
|
||||
List<String> platformOrderTrackingNumber = platformOrders.stream().map(PlatformOrder::getTrackingNumber).collect(Collectors.toList());
|
||||
try {
|
||||
List<Parcel> parcels = parcelService.fetchParcelsToArchive(platformOrderTrackingNumber);
|
||||
List<String> parcelIDs = parcels.stream().map(Parcel::getId).collect(Collectors.toList());
|
||||
List<ParcelTrace> 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<String> platformOrderTrackingNumber = platformOrders.stream().map(PlatformOrder::getTrackingNumber).collect(Collectors.toList());
|
||||
if(platformOrderTrackingNumber.size() > 0) {
|
||||
List<Parcel> parcels = parcelService.fetchParcelsToArchive(platformOrderTrackingNumber);
|
||||
if(parcels.size() > 0) {
|
||||
log.info("- Parcel entries : " + parcels.size());
|
||||
parcelService.saveParcelArchive(parcels);
|
||||
|
||||
List<String> parcelIDs = parcels.stream().map(Parcel::getId).collect(Collectors.toList());
|
||||
List<ParcelTrace> 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.");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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<Parcel> {
|
|||
void insertOrUpdateEQParcels(List<EQuickResponse> parcels);
|
||||
|
||||
void insertOrIgnoreYDParcels(List<YDTraceData> parcels);
|
||||
void insertOrIgnoreCMKParcels(List<CMKParcelTraceData> parcels);
|
||||
|
||||
/**
|
||||
* fetch all parcels from platform order's tracking number, to archive
|
||||
* @param trackingNumbers
|
||||
* @return List of parcels
|
||||
*/
|
||||
List<Parcel> fetchParcelsToArchive(@Param("trackingNumbers") List<String> trackingNumbers);
|
||||
|
||||
/**
|
||||
* Inserts into parce_trace_delete table parcel traces to archive
|
||||
* @param parcels
|
||||
*/
|
||||
void insertParcelsArchive(@Param("parcels") List<Parcel> parcels);
|
||||
}
|
||||
|
|
|
@ -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<ParcelTrace> {
|
|||
void insertOrUpdateEQTraces(@Param("traces") List<EQuickTraceData> traceDetails);
|
||||
|
||||
void insertOrIgnoreYDTraces(@Param("traces") List<YDTraceDetail> traceDetails);
|
||||
|
||||
void insertOrIgnoreCMKTraces(@Param("traces") List<CMKParcelTrace> traceDetails);
|
||||
|
||||
/**
|
||||
* Fetches parcel traces to archive
|
||||
* @param parcelIDs
|
||||
* @return List of parcel traces
|
||||
*/
|
||||
List<ParcelTrace> fetchParcelTracesToArchive(@Param("parcelIDs") List<String> parcelIDs);
|
||||
|
||||
/**
|
||||
* inserts into parce_trace_delete table parcels to archive
|
||||
* @param parcelTraces
|
||||
*/
|
||||
void insertParceTracesArchive(@Param("parcelTraces") List<ParcelTrace> parcelTraces);
|
||||
}
|
||||
|
|
|
@ -72,4 +72,5 @@ public interface PlatformOrderContentMapper extends BaseMapper<PlatformOrderCont
|
|||
|
||||
List<PlatformOrderContent> findUninvoicedShippedOrderContents();
|
||||
List<PlatformOrderContent> fetchPlatformOrderContentsToArchive(@Param("orderIDs") List<String> orderIDs);
|
||||
void insertPlatformOrderContentsArchives(@Param("orderContents") List<PlatformOrderContent> platformOrderContents);
|
||||
}
|
||||
|
|
|
@ -178,4 +178,5 @@ public interface PlatformOrderMapper extends BaseMapper<PlatformOrder> {
|
|||
@Param("erpStatuses") List<Integer> erpStatuses,
|
||||
@Param("warehouses") List<String> warehouses);
|
||||
List<PlatformOrder> fetchPlatformOrdersToArchive(@Param("startDate") String startDate, @Param("endDate") String endDate);
|
||||
void insertPlatformOrdersArchives(@Param("orders") List<PlatformOrder> platformOrders);
|
||||
}
|
||||
|
|
|
@ -67,6 +67,25 @@
|
|||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<insert id="insertOrIgnoreCMKParcels" parameterType="list">
|
||||
INSERT IGNORE INTO parcel(id, create_by, create_time, update_by, update_time, bill_code, country,
|
||||
third_bill_code, order_no, product_code)
|
||||
VALUES
|
||||
<foreach collection="parcels" separator="," open="" close="" item="parcel" index="index">
|
||||
(
|
||||
#{parcel.id},
|
||||
'cmk api',
|
||||
NOW(),
|
||||
'cmk api',
|
||||
NOW(),
|
||||
#{parcel.thirdBillCode},
|
||||
#{parcel.country},
|
||||
#{parcel.thirdBillCode},
|
||||
#{parcel.detail.orderNo},
|
||||
#{parcel.detail.productCode}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<select id="fetchParcelsToArchive" resultType="org.jeecg.modules.business.entity.Parcel">
|
||||
SELECT *
|
||||
FROM parcel
|
||||
|
@ -75,4 +94,25 @@
|
|||
#{number}
|
||||
</foreach>;
|
||||
</select>
|
||||
<insert id="insertParcelsArchive" parameterType="list">
|
||||
INSERT INTO parcel_delete(id, create_by, create_time,
|
||||
update_by, update_time, bill_code,
|
||||
country, third_bill_code,
|
||||
order_no, product_code)
|
||||
VALUES
|
||||
<foreach collection="parcels" separator="," open="" close="" item="parcel" index="index">
|
||||
(
|
||||
#{parcel.id},
|
||||
#{parcel.createBy},
|
||||
#{parcel.createTime},
|
||||
#{parcel.updateBy},
|
||||
#{parcel.updateTime},
|
||||
#{parcel.billCode},
|
||||
#{parcel.country},
|
||||
#{parcel.thirdBillCode},
|
||||
#{parcel.orderNo},
|
||||
#{parcel.productCode}
|
||||
)
|
||||
</foreach>;
|
||||
</insert>
|
||||
</mapper>
|
|
@ -80,7 +80,27 @@
|
|||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<select id="fetchParcelTracesToArchive" resultType="org.jeecg.modules.business.entity.Parcel">
|
||||
<insert id="insertOrIgnoreCMKTraces" parameterType="list">
|
||||
INSERT IGNORE INTO parcel_trace(id, create_by, create_time, update_by, update_time, parcel_id, scan_time,
|
||||
description, description_en, trace_location, scan_type)
|
||||
VALUES
|
||||
<foreach collection="traces" separator="," open="" close="" item="trace" index="index">
|
||||
(
|
||||
UUID(),
|
||||
'cmk api',
|
||||
NOW(),
|
||||
'cmk api',
|
||||
NOW(),
|
||||
#{trace.parcelId},
|
||||
#{trace.time},
|
||||
#{trace.description},
|
||||
#{trace.descriptionEn},
|
||||
#{trace.location},
|
||||
#{trace.scanType}
|
||||
)
|
||||
</foreach>
|
||||
</insert>
|
||||
<select id="fetchParcelTracesToArchive" resultType="org.jeecg.modules.business.entity.ParcelTrace">
|
||||
SELECT *
|
||||
FROM parcel_trace
|
||||
WHERE parcel_id IN
|
||||
|
@ -88,4 +108,29 @@
|
|||
#{parcelID}
|
||||
</foreach>;
|
||||
</select>
|
||||
<insert id="insertParceTracesArchive" parameterType="list">
|
||||
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
|
||||
<foreach collection="parcelTraces" separator="," open="" close="" item="trace" index="index">
|
||||
(
|
||||
#{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}
|
||||
)
|
||||
</foreach>;
|
||||
</insert>
|
||||
</mapper>
|
||||
|
|
|
@ -249,4 +249,34 @@
|
|||
#{orderID}
|
||||
</foreach>;
|
||||
</select>
|
||||
<insert id="insertPlatformOrderContentsArchives" parameterType="list">
|
||||
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
|
||||
<foreach collection="orderContents" separator="," open="" close="" item="content" index="index">
|
||||
(
|
||||
#{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}
|
||||
)
|
||||
</foreach>;
|
||||
</insert>
|
||||
</mapper>
|
||||
|
|
|
@ -532,4 +532,51 @@
|
|||
WHERE erp_status IN (4,5)
|
||||
AND order_time BETWEEN #{startDate} AND #{endDate};
|
||||
</select>
|
||||
<insert id="insertPlatformOrdersArchives" parameterType="list">
|
||||
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
|
||||
<foreach collection="orders" separator="," open="" close="" item="order" index="index">
|
||||
(
|
||||
#{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}
|
||||
)
|
||||
</foreach>;
|
||||
</insert>
|
||||
</mapper>
|
||||
|
|
|
@ -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<Parcel> {
|
|||
void saveEQParcelAndTraces(List<EQuickResponse> parcelTraces);
|
||||
|
||||
void saveYDParcelAndTraces(List<YDTraceData> traceData);
|
||||
void saveCMKParcelAndTraces(List<CMKParcelTraceData> traceData);
|
||||
List<Parcel> fetchParcelsToArchive(List<String> trackingNumbers);
|
||||
void saveParcelArchive(List<Parcel> parcels);
|
||||
}
|
||||
|
|
|
@ -14,5 +14,17 @@ import java.util.List;
|
|||
public interface IParcelTraceService extends IService<ParcelTrace> {
|
||||
|
||||
public List<ParcelTrace> selectByMainId(String mainId);
|
||||
|
||||
/**
|
||||
* Fetch all parcel traces to archive from parcel id
|
||||
* @param parcelIDs
|
||||
* @return list of parcel traces
|
||||
*/
|
||||
List<ParcelTrace> fetchParcelTracesToArchive(List<String> parcelIDs);
|
||||
|
||||
/**
|
||||
* Saves parcel traces in parcel_trace_delete table
|
||||
* @param parcelTraces
|
||||
*/
|
||||
void saveParcelTraceArchive(List<ParcelTrace> parcelTraces);
|
||||
}
|
||||
|
|
|
@ -34,5 +34,12 @@ public interface IPlatformOrderContentService extends IService<PlatformOrderCont
|
|||
List<SkuWeightDiscountServiceFees> getAllSKUWeightsDiscountsServiceFees();
|
||||
|
||||
List<SkuQuantity> searchOrderContent(List<String> 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<PlatformOrderContent> fetchPlatformOrderContentsToArchive(List<String> orderIDs);
|
||||
void savePlatformOrderContentArchive(List<PlatformOrderContent> platformOrderContents);
|
||||
}
|
||||
|
|
|
@ -143,9 +143,15 @@ public interface IPlatformOrderService extends IService<PlatformOrder> {
|
|||
/**
|
||||
* 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<PlatformOrder> fetchPlatformOrdersToArchive(String startDate, String endDate);
|
||||
|
||||
/**
|
||||
* Archive a list of platform orders
|
||||
* @param platformOrders list of platform orders
|
||||
*/
|
||||
void savePlatformOrderArchive(List<PlatformOrder> platformOrders);
|
||||
}
|
||||
|
|
|
@ -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<ParcelMapper, Parcel> impleme
|
|||
private ParcelMapper parcelMapper;
|
||||
@Autowired
|
||||
private ParcelTraceMapper parcelTraceMapper;
|
||||
@Autowired
|
||||
private CountryMapper countryMapper;
|
||||
|
||||
@Override
|
||||
@Transactional
|
||||
|
@ -218,7 +225,59 @@ public class ParcelServiceImpl extends ServiceImpl<ParcelMapper, Parcel> impleme
|
|||
}
|
||||
log.info("Finished inserting {} parcels and their traces into DB.", parcelTraces.size());
|
||||
}
|
||||
@Override
|
||||
@Transactional
|
||||
public void saveCMKParcelAndTraces(List<CMKParcelTraceData> parcelTraces) {
|
||||
if (parcelTraces.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
log.info("Started inserting {} CMK parcels and their traces into DB.", parcelTraces.size() );
|
||||
List<String> parcelBillCodes = parcelTraces.stream()
|
||||
.map(CMKParcelTraceData::getThirdBillCode)
|
||||
.collect(Collectors.toList());
|
||||
List<Parcel> existingParcels = parcelMapper.searchByBillCode(parcelBillCodes);
|
||||
Map<String, Parcel> billCodeToExistingParcels = existingParcels.stream().collect(
|
||||
Collectors.toMap(Parcel::getBillCode, Function.identity())
|
||||
);
|
||||
List<Country> countryList = countryMapper.findAll();
|
||||
Map<String, String> countryNameMap = new HashMap<>();
|
||||
countryList.forEach(country -> countryNameMap.put(country.getNameZh(), country.getCode()));
|
||||
|
||||
List<CMKParcelTraceData> parcelToInsert = new ArrayList<>();
|
||||
List<CMKParcelTrace> tracesToInsert = new ArrayList<>();
|
||||
for (CMKParcelTraceData parcelAndTrace : parcelTraces) {
|
||||
List<CMKParcelTrace> 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<Parcel> fetchParcelsToArchive(List<String> trackingNumbers) {
|
||||
return parcelMapper.fetchParcelsToArchive(trackingNumbers);
|
||||
}
|
||||
@Override
|
||||
public void saveParcelArchive(List<Parcel> parcels) {
|
||||
parcelMapper.insertParcelsArchive(parcels);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<ParcelTraceMapper, Parce
|
|||
public List<ParcelTrace> selectByMainId(String mainId) {
|
||||
return parcelTraceMapper.selectByMainId(mainId);
|
||||
}
|
||||
@Override
|
||||
public List<ParcelTrace> fetchParcelTracesToArchive(List<String> parcelIDs) {
|
||||
return parcelTraceMapper.fetchParcelTracesToArchive(parcelIDs);
|
||||
}
|
||||
@Override
|
||||
public void saveParcelTraceArchive(List<ParcelTrace> parcelTraces) {
|
||||
parcelTraceMapper.insertParceTracesArchive(parcelTraces);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<PlatformOrderCo
|
|||
}
|
||||
|
||||
}
|
||||
@Override public List<PlatformOrderContent> fetchPlatformOrderContentsToArchive(List<String> orderIDs) {
|
||||
@Override
|
||||
public List<PlatformOrderContent> fetchPlatformOrderContentsToArchive(List<String> orderIDs) {
|
||||
return platformOrderContentMapper.fetchPlatformOrderContentsToArchive(orderIDs);
|
||||
}
|
||||
public void savePlatformOrderContentArchive(List<PlatformOrderContent> platformOrderContents) {
|
||||
platformOrderContentMapper.insertPlatformOrderContentsArchives(platformOrderContents);
|
||||
}
|
||||
}
|
|
@ -370,4 +370,8 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
|
|||
public List<PlatformOrder> fetchPlatformOrdersToArchive(String startDate, String endDate) {
|
||||
return platformOrderMap.fetchPlatformOrdersToArchive(startDate, endDate);
|
||||
}
|
||||
@Override
|
||||
public void savePlatformOrderArchive(List<PlatformOrder> platformOrders) {
|
||||
platformOrderMap.insertPlatformOrdersArchives(platformOrders);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue