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 9e628a34f..8d02eed09 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 @@ -323,9 +323,9 @@ public class InvoiceController { } @GetMapping(value = "/downloadInvoiceDetail") - public byte[] downloadInvoiceDetail(@RequestParam("invoiceNumber") String invoiceNumber) throws IOException { + public byte[] downloadInvoiceDetail(@RequestParam("invoiceNumber") String invoiceNumber, @RequestParam("invoiceEntity") String invoiceEntity) throws IOException { List res = shippingInvoiceService.getInvoiceDetail(invoiceNumber); - return shippingInvoiceService.exportToExcel(res, invoiceNumber); + return shippingInvoiceService.exportToExcel(res, invoiceNumber, invoiceEntity); } @GetMapping(value = "/breakdown/byShop") diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/ShippingInvoiceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/ShippingInvoiceController.java index 64b32c356..064066ec2 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/ShippingInvoiceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/ShippingInvoiceController.java @@ -17,8 +17,7 @@ import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.business.entity.Client; import org.jeecg.modules.business.entity.ShippingInvoice; -import org.jeecg.modules.business.service.EmailService; -import org.jeecg.modules.business.service.IShippingInvoiceService; +import org.jeecg.modules.business.service.*; import org.jeecg.modules.business.vo.ShippingInvoicePage; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; @@ -70,6 +69,14 @@ import java.util.stream.Stream; @RequestMapping("/generated/shippingInvoice") @Slf4j public class ShippingInvoiceController { + @Autowired + private IClientService clientService; + @Autowired + private IPlatformOrderContentService platformOrderContentService; + @Autowired + private IPlatformOrderService platformOrderService; + @Autowired + private ISavRefundService savRefundService; @Autowired private IShippingInvoiceService shippingInvoiceService; @Autowired @@ -296,6 +303,30 @@ public class ShippingInvoiceController { return pathList; } + /** Finds the absolute path of invoice file by recursively walking the directory and it's subdirectories + * + * @param dirPath + * @param invoiceNumber + * @return List of paths for the file but should only find one result + */ + public List getPath(String dirPath, String invoiceNumber, String invoiceEntity) { + List pathList = new ArrayList<>(); + //Recursively list all files + //The walk() method returns a Stream by walking the file tree beginning with a given starting file/directory in a depth-first manner. + try (Stream stream = Files.walk(Paths.get(dirPath))) { + pathList = stream.map(Path::normalize) + .filter(Files::isRegularFile) // directories, hidden files and files without extension are not included + .filter(path -> path.getFileName().toString().contains(invoiceNumber)) + .filter(path -> path.getFileName().toString().contains(invoiceEntity)) + .filter(path -> path.getFileName().toString().endsWith(EXTENSION)) + .collect(Collectors.toList()); + } + catch(IOException e) { + e.printStackTrace(); + } + return pathList; + } + /** * Finds the absolute path of invoice file and return the path * @param invoiceNumber @@ -471,4 +502,55 @@ public class ShippingInvoiceController { log.info("Found client for invoice {} : {}", invoiceNumber, client.fullName()); return Result.OK(client); } + + /** + * Deletes an invoice + * @param invoiceNumber invoice number to cancel + * @return if update successful + */ + @PostMapping(value = "/cancelInvoice") + public Result cancelInvoice(@RequestParam("id") String id, @RequestParam("invoiceNumber") String invoiceNumber, @RequestParam("clientId") String clientId) { + log.info("Cancelling invoice number : {}", invoiceNumber); + platformOrderContentService.cancelInvoice(invoiceNumber); + platformOrderService.cancelInvoice(invoiceNumber); + savRefundService.cancelInvoice(invoiceNumber); + shippingInvoiceService.delMain(id); + log.info("Deleting invoice files ..."); + String invoiceEntity = clientService.getClientEntity(clientId); + List invoicePathList = getPath(INVOICE_LOCATION, invoiceNumber, invoiceEntity); + List detailPathList = getPath(INVOICE_DETAIL_LOCATION, invoiceNumber, invoiceEntity); + if(invoicePathList.isEmpty() ||detailPathList.isEmpty()) { + log.error("FILE NOT FOUND : " + invoiceNumber); + return Result.ok("Invoice canceled, but file not found."); + } + else { + for (Path path : invoicePathList) { + log.info(path.toString()); + } + for (Path path : detailPathList) { + log.info(path.toString()); + } + try { + File invoiceFile = new File(invoicePathList.get(0).toString()); + File detailFile = new File(detailPathList.get(0).toString()); + if(invoiceFile.delete()) { + log.info("Invoice file {} delete successful.", invoicePathList.get(0).toString()); + } else { + log.error("Invoice file delete fail."); + return Result.error("Invoice file delete fail."); + } + if(detailFile.delete()) { + log.info("Detail file {} delete successful.", detailPathList.get(0).toString()); + } else { + log.error("Detail file delete fail."); + return Result.error("Detail file delete fail."); + } + } catch (Exception e) { + e.printStackTrace(); + return Result.error(e.getMessage()); + } + } + log.info("Invoice files deleted."); + return Result.ok("Invoice cancel successful."); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/ScanType.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/ScanType.java index 9159167b5..b0a64b5e0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/ScanType.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/ScanType.java @@ -6,6 +6,7 @@ public enum ScanType { END_DELIVERED("End Delivered"), END_DELIVERY("End Delivery"), END_RECEIVED("End Received"), + END_SEND("End Send"), END_ARRIVED("End Arrived"), FLIGHT_ARRIVED("Flight Arrived"), FLIGHT_DEPARTURE("Flight Departure"), @@ -13,12 +14,15 @@ public enum ScanType { FACILITY_ARRIVED("Received by Consolidation Warehouse"), FACILITY_DEPARTURE("Consolidation Center Dispatch"), FACILITY_OUTBOUND("Consolidation Center Outbound"), + CUSTOMS_CLEARANCE("Customs Clearance"), CUSTOMS_CLEARANCE_COMPLETED("Customs Clearance Completed"), ORDER_PLACED("Order Placed"), WAITING_FOR_DELIVERY("Waiting for Delivery"), ARRIVED_PORT("Arrived at Port"), FLIGHT_PREPARING("Flight Preparing"), CN_CUSTOMS_INSPECTION("Customs Inspection"), + EXPORT_CUSTOMS_DECLARATION("Export Declaration"), + EXPORT_CUSTOMS_DECLARATION_COMPLETED("Export Declaration Completed"), BAGGING("Bagging"); private final String desc; diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLParcelTraceDetail.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLParcelTraceDetail.java new file mode 100644 index 000000000..336fd9176 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLParcelTraceDetail.java @@ -0,0 +1,140 @@ +package org.jeecg.modules.business.domain.api.hualei; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.format.annotation.DateTimeFormat; + +import static org.jeecg.modules.business.domain.api.ScanType.*; + +@Slf4j +@Data +public class HLParcelTraceDetail { + + @JSONField(deserialize = false) + private String parcelId; + + @JsonProperty("track_date") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss.S") + private String scanTime; + + private String scanType; + + @JsonProperty("track_kind") + private String trackKind; + + @JsonProperty("track_content") + private String descriptionCn; + + private String descriptionEn; + + @JsonProperty("track_location") + private String location; + + private static final String ARRIVAL_AT_RECEPTION_CN = "到达收货点"; + private static final String ARRIVAL_AT_RECEPTION = "Parcel has been handed to logistics company"; + private static final String DELIVERED = "Package delivered"; + private static final String ARRIVAL_LOCAL_DELIVERY = "Arrived at local delivery center"; + private static final String OUT_FOR_DELIVERY = "Out for delivery"; + private static final String LOCAL_DELIVERY_RECEPTION = "Received by local delivery company"; + private static final String DEPART_CUSTOMS = "Departed from customs"; + private static final String AWAITING_TRANSIT_TO_FINAL_DELIVERY_OFFICE = "Awaiting for transit to final delivery office"; + private static final String DEPARTED_FROM_TRANSIT_COUNTRY = "Departed from transit country/region"; + private static final String LEAVING_TRANSIT_COUNTRY = "Leaving transit country/region"; + private static final String IMPORT_CUSTOMS_CLEARANCE_COMPLETE = "Import customs clearance complete"; + private static final String IMPORT_CUSTOMS_CLEARANCE_STARTED = "Import customs clearance started"; + private static final String ARRIVAL_IN_TRANSIT_COUNTRY = "Arrived in transit country/region"; + private static final String HANDED_TO_LINEHAUL = "Handed over from linehaul office"; + private static final String ARRIVAL_LINEHAUL = "Arrived at linehaul office"; + private static final String DEPARTED_FROM_ORIGIN = "Departed from departure country/region"; + private static final String LEAVING_FROM_ORIGIN = "Leaving from departure country/region"; + private static final String EXPORT_CUSTOMS_CLEARANCE_COMPLETE = "Export customs clearance complete"; + private static final String EXPORT_CUSTOMS_CLEARANCE_START = "Export customs clearance started"; + private static final String TRANSPORT_HUB_ARRIVAL = "Arrived at departure transport hub"; + private static final String SORTING_CENTER_DEPARTURE = "[Fenggang Town] Departed from sorting center"; + private static final String SORTING_CENTER_PROCESSING = "[Fenggang Town] Processing at sorting center"; + private static final String ORDER_RECEIVED = "货物电子信息已经收到"; + private static final String ORDER_RECEIVED_EN = "Order received by logistics company"; + + + public HLParcelTraceDetail() { + } + + public HLParcelTraceDetail(String parcelId, String scanTime, String scanType, String trackKind, + String descriptionCn, String descriptionEn, String location) { + this.parcelId = parcelId; + this.scanTime = scanTime; + this.scanType = scanType; + this.trackKind = trackKind; + this.descriptionCn = descriptionCn; + this.descriptionEn = descriptionEn; + this.location = location; + } + + /** + * Set parcel ID, and write the scan type into the trace according to description + * @param parcelId Parcel ID to which the trace belongs to + */ + public void parcelTraceProcess(String parcelId) { + setParcelId(parcelId); + switch (descriptionCn) { + case DELIVERED: + setScanType(END_DELIVERED.getDesc()); + break; + case ARRIVAL_LOCAL_DELIVERY: + setScanType(END_ARRIVED.getDesc()); + break; + case OUT_FOR_DELIVERY: + setScanType(END_DELIVERY.getDesc()); + break; + case LOCAL_DELIVERY_RECEPTION: + setScanType(END_RECEIVED.getDesc()); + break; + case DEPART_CUSTOMS: + case IMPORT_CUSTOMS_CLEARANCE_COMPLETE: + setScanType(CUSTOMS_CLEARANCE_COMPLETED.getDesc()); + break; + case AWAITING_TRANSIT_TO_FINAL_DELIVERY_OFFICE: + setScanType(END_SEND.getDesc()); + break; + case DEPARTED_FROM_TRANSIT_COUNTRY: + case LEAVING_TRANSIT_COUNTRY: + case ARRIVAL_IN_TRANSIT_COUNTRY: + setScanType(FLIGHT_ARRIVED.getDesc()); + break; + case IMPORT_CUSTOMS_CLEARANCE_STARTED: + setScanType(CUSTOMS_CLEARANCE.getDesc()); + break; + case HANDED_TO_LINEHAUL: + setScanType(FLIGHT_DEPARTURE.getDesc()); + break; + case ARRIVAL_LINEHAUL: + case DEPARTED_FROM_ORIGIN: + case LEAVING_FROM_ORIGIN: + setScanType(FLIGHT_PREPARING.getDesc()); + break; + case EXPORT_CUSTOMS_CLEARANCE_COMPLETE: + setScanType(EXPORT_CUSTOMS_DECLARATION_COMPLETED.getDesc()); + break; + case EXPORT_CUSTOMS_CLEARANCE_START: + setScanType(EXPORT_CUSTOMS_DECLARATION.getDesc()); + break; + case TRANSPORT_HUB_ARRIVAL: + case SORTING_CENTER_DEPARTURE: + setScanType(FACILITY_DEPARTURE.getDesc()); + break; + case SORTING_CENTER_PROCESSING: + setScanType(FACILITY_ARRIVED.getDesc()); + break; + case ORDER_RECEIVED: + setDescriptionEn(ORDER_RECEIVED_EN); + setScanType(ORDER_PLACED.getDesc()); + break; + case ARRIVAL_AT_RECEPTION_CN: + setDescriptionEn(ARRIVAL_AT_RECEPTION); + setScanType(BAGGING.getDesc()); + break; + } + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLRequest.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLRequest.java new file mode 100644 index 000000000..55651f820 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLRequest.java @@ -0,0 +1,68 @@ +package org.jeecg.modules.business.domain.api.hualei; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.message.BasicNameValuePair; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class contains some key information and necessary procedures + * to send a request body to mabang API, for example target URL, + * correspondent HTTP method, procedure to generate authorization. + */ +@Slf4j +public class HLRequest { + private final static String URL = "http://www.antugj.com:8082/selectTrack.htm"; + private static final RequestConfig REQUEST_CONFIG = RequestConfig.custom().build(); + + private final List billCodes; + + public HLRequest(List billCodes) { + this.billCodes = billCodes; + } + + /** + * Sent request to the mabang API with a request body. + * + * @return the response + */ + public HttpResponse send() { + int attempts = 0; + while (attempts++ < 5) { + try { + HttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(REQUEST_CONFIG).build(); + HttpPost request = new HttpPost(URL); + + // adding the form data + request.setEntity(new UrlEncodedFormEntity(generateFormData(), "UTF-8")); + return httpClient.execute(request); + } catch (Exception e) { + log.error("Request failed on attempt n°" + attempts); + } + } + return null; + } + + /** + * Convert body's json parameters to json string with the necessary extra parameter to + * send request. + * + * @return json string + */ + private List generateFormData() { + List pairs = new ArrayList<>(); + String billCodesWithComas = String.join(",", billCodes); + pairs.add(new BasicNameValuePair("documentCode", billCodesWithComas)); + return pairs; + } + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLResponse.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLResponse.java new file mode 100644 index 000000000..f832807b5 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLResponse.java @@ -0,0 +1,27 @@ +package org.jeecg.modules.business.domain.api.hualei; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.business.domain.api.jt.JTResponseItem; + +import java.util.List; + +@Slf4j +@Data +public class HLResponse { + + @JsonProperty("ack") + private Boolean acknowledgment; + + @JsonProperty("data") + private List responseItems; + + public HLResponse(Boolean acknowledgment, List responseItems) { + this.acknowledgment = acknowledgment; + this.responseItems = responseItems; + } + + public HLResponse() { + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLResponseItem.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLResponseItem.java new file mode 100644 index 000000000..fb4770d80 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/hualei/HLResponseItem.java @@ -0,0 +1,52 @@ +package org.jeecg.modules.business.domain.api.hualei; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.core.toolkit.IdWorker; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.List; + +@Slf4j +@Data +@TableName("parcel") +public class HLResponseItem { + + @TableId(type = IdType.ASSIGN_ID) + private String id = IdWorker.getIdStr(); + + @JsonProperty("trackingNumber") + private String trackingNumber; + + @JsonProperty("consigneeCountry") + private String country; + + @JsonProperty("productKindName") + private String productCode; + + @JsonProperty("business_seqinvoicecode") + private String billCode; + + @JsonProperty("referenceNumber") + private String orderNumber; + + @JsonProperty("trackDetails") + private List tracesList; + + public HLResponseItem(String id, String trackingNumber, String country, String productCode, String billCode, + String orderNumber, List tracesList) { + this.id = id; + this.trackingNumber = trackingNumber; + this.country = country; + this.productCode = productCode; + this.billCode = billCode; + this.orderNumber = orderNumber; + this.tracesList = tracesList; + } + + public HLResponseItem() { + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/shopify/CreateFulfillmentRequest.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/shopify/CreateFulfillmentRequest.java index 02b786590..93252f5c6 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/shopify/CreateFulfillmentRequest.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/shopify/CreateFulfillmentRequest.java @@ -20,7 +20,7 @@ public class CreateFulfillmentRequest extends ShopifyRequest { CANADA_POST("https://www.canadapost-postescanada.ca/track-reperage/en#/search?searchFor=%s", "Canada Post", "(201255|732131)[0-9]{10}"), SWISS_POST("https://service.post.ch/ekp-web/ui/entry/search/%s", "Swiss Post", "[0-9]{18}"), EARLY_BIRD("https://earlybird.se/", "Early Bird", "[0-9]{19}"), - DAO("https://www.dao.as/privat/find-din-pakke?stregkode=%s", "DAO", "00057151271[0-9]{9}"), + DAO("https://www.dao.as/privat/find-din-pakke?stregkode=%s", "DAO", "00057151270[0-9]{10}"), DHL_PACKET("https://www.dhl.de/en/privatkunden/pakete-empfangen/verfolgen.html?piececode=%s", "DHL Packet", "0034[0-9]{16}"), GLS_NL("https://www.gls-info.nl/tracking", "GLS", "[0-9]{20}"), GLS_NL_2("https://www.gls-info.nl/tracking", "GLS", "(1437|1000)[0-9]{10}"), diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/HLJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/HLJob.java new file mode 100644 index 000000000..27e776f7d --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/HLJob.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.hualei.HLRequest; +import org.jeecg.modules.business.domain.api.hualei.HLResponse; +import org.jeecg.modules.business.domain.api.hualei.HLResponseItem; +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 HLJob implements Job { + + @Autowired + private IParcelService parcelService; + @Autowired + private IPlatformOrderService platformOrderService; + + private static final Integer DEFAULT_NUMBER_OF_DAYS = 15; + private static final Integer DEFAULT_MAXIMUM_NUMBER_OF_PARCELS_PER_TRANSACTION = 800; + private static final List DEFAULT_TRANSPORTERS = Arrays.asList("法国专线普货"); + + @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, 40); + log.info("Requests will be divided in to {} parts", billCodeLists.size()); + List parcelTraces = new ArrayList<>(); + List hlRequests = new ArrayList<>(); + billCodeLists.forEach(billcodeList -> { + HLRequest hlRequest = new HLRequest(billcodeList); + hlRequests.add(hlRequest); + }); + List results = new ArrayList<>(); + for (HLRequest request : hlRequests) { + boolean success = false; + HttpEntity entity = request.send().getEntity(); + try { + // String of the response + String responseString = EntityUtils.toString(entity, "UTF-8"); + // Geniuses at HL decided to put the sole response object in an array.... + HLResponse[] hlResponseArray = mapper.readValue(responseString, HLResponse[].class); + parcelTraces.addAll(hlResponseArray[0].getResponseItems()); + 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 40 parcel traces have been retrieved.", nbSuccesses, hlRequests.size()); + + List> parcelTraceList = Lists.partition(parcelTraces, DEFAULT_MAXIMUM_NUMBER_OF_PARCELS_PER_TRANSACTION); + for (List parcelTracesPerTransaction : parcelTraceList) { + parcelService.saveHLParcelAndTraces(parcelTracesPerTransaction); + } + } + +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java index 1d1af156a..08c81e0d8 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java @@ -387,7 +387,7 @@ public class ShippingInvoiceFactory { List savRefunds, String subject, boolean skipShippingTimeComparing) throws UserException { log.info("Orders to be invoiced: {}", orderAndContent); - if (orderAndContent == null) { + if (orderAndContent == null || orderAndContent.size() == 0) { throw new UserException("No platform order in the selected period!"); } Map skuRealWeights = new HashMap<>(); @@ -397,7 +397,7 @@ public class ShippingInvoiceFactory { Map> channelPriceMap; Map logisticChannelMap = logisticChannelMapper.getAll().stream() .collect(toMap(LogisticChannel::getId, Function.identity())); - if(subject.contains("Pre") || subject.contains("All")) { + if(subject.contains("order time")) { channelPriceMap = getChannelPriceMap(logisticChannelMap, orderAndContent, skipShippingTimeComparing, "order"); } else { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ShippingInvoice.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ShippingInvoice.java index f129d4592..395c4aab4 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ShippingInvoice.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/ShippingInvoice.java @@ -50,6 +50,12 @@ public class ShippingInvoice implements Serializable { */ @ApiModelProperty(value = "更新人") private String updateBy; + /** + * 客户 ID + */ + @Excel(name = "客户", width = 15) + @ApiModelProperty(value = "客户") + private String clientId; /** * 更新日期 */ @@ -103,6 +109,9 @@ public class ShippingInvoice implements Serializable { public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; } + public void setClientI(String clientId) { + this.clientId = clientId; + } public void setInvoiceNumber(String invoiceNumber) { this.invoiceNumber = invoiceNumber; } @@ -135,6 +144,7 @@ public class ShippingInvoice implements Serializable { Date createTime, String updateBy, Date updateTime, + String clientId, String invoiceNumber, BigDecimal totalAmount, BigDecimal discountAmount, @@ -145,6 +155,7 @@ public class ShippingInvoice implements Serializable { this.createTime = createTime; this.updateBy = updateBy; this.updateTime = updateTime; + this.clientId = clientId; this.invoiceNumber = invoiceNumber; this.totalAmount = totalAmount; this.discountAmount = discountAmount; @@ -153,12 +164,13 @@ public class ShippingInvoice implements Serializable { } public static ShippingInvoice of( String username, + String clientId, String invoiceNumber, BigDecimal totalAmount, BigDecimal discountAmount, BigDecimal paidAmount ) { - return new ShippingInvoice(null, username, new Date(), username, new Date(), + return new ShippingInvoice(null, username, new Date(), username, new Date(), clientId, invoiceNumber, totalAmount, discountAmount, totalAmount.subtract(discountAmount), paidAmount); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java index 57d5d428a..59c7a0ebf 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ClientMapper.java @@ -1,6 +1,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.entity.Client; import org.springframework.stereotype.Repository; @@ -13,4 +14,5 @@ import org.springframework.stereotype.Repository; @Repository public interface ClientMapper extends BaseMapper { + String getClientEntity(@Param("id") String id); } 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 ae6c8b825..4b2d3081b 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 @@ -4,6 +4,7 @@ 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.hualei.HLResponseItem; import org.jeecg.modules.business.domain.api.jt.JTParcelTrace; import org.jeecg.modules.business.domain.api.yd.YDTraceData; import org.jeecg.modules.business.entity.Parcel; @@ -28,6 +29,7 @@ public interface ParcelMapper extends BaseMapper { void insertOrIgnoreYDParcels(List parcels); void insertOrIgnoreCMKParcels(List parcels); + void insertOrIgnoreHLParcels(List parcels); /** * fetch all parcels from platform order's tracking number, to archive 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 d7f0f797e..b507694e1 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 @@ -5,6 +5,7 @@ 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.hualei.HLParcelTraceDetail; import org.jeecg.modules.business.domain.api.jt.JTParcelTraceDetail; import org.jeecg.modules.business.domain.api.yd.YDTraceDetail; import org.jeecg.modules.business.entity.ParcelTrace; @@ -33,6 +34,8 @@ public interface ParcelTraceMapper extends BaseMapper { void insertOrIgnoreCMKTraces(@Param("traces") List traceDetails); + void insertOrIgnoreHLTraces(@Param("traces") List tracesToInsert); + /** * Fetches parcel traces to archive * @param parcelIDs 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 0c66de46a..df27a4824 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 @@ -73,4 +73,5 @@ public interface PlatformOrderContentMapper extends BaseMapper findUninvoicedShippedOrderContents(); List fetchPlatformOrderContentsToArchive(@Param("orderIDs") List orderIDs); void insertPlatformOrderContentsArchives(@Param("orderContents") List platformOrderContents); + void cancelInvoice(@Param("invoiceNumber") String invoiceNumber); } 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 99edad025..9b3c61370 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 @@ -181,4 +181,5 @@ public interface PlatformOrderMapper extends BaseMapper { List fetchOrdersToArchiveBetweenDate(@Param("startDate") String startDate, @Param("endDate") String endDate); List fetchOrdersToArchiveBeforeDate(@Param("endDate") String endDate); void insertPlatformOrdersArchives(@Param("orders") List platformOrders); + void cancelInvoice(@Param("invoiceNumber") String invoiceNumber); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SavRefundMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SavRefundMapper.java index 7cd72dbb7..fe65d9da7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SavRefundMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SavRefundMapper.java @@ -17,4 +17,5 @@ import java.util.List; @Repository public interface SavRefundMapper extends BaseMapper { List fetchRefundAmount(@Param("invoiceNumber") String invoiceNumber); + void cancelInvoice(@Param("invoiceNumber") String invoiceNumber); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml index aac109c6a..532a226d4 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ClientMapper.xml @@ -1,5 +1,9 @@ - + \ No newline at end of file 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 c745bb1bd..35471682c 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 @@ -86,6 +86,27 @@ ) + + + 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}, + 'hl api', + NOW(), + 'hl api', + NOW(), + #{parcel.billCode}, + #{parcel.country}, + #{parcel.trackingNumber}, + #{parcel.orderNumber}, + #{parcel.productCode} + ) + + + SELECT * FROM parcel_trace 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 5c0ba30f5..143bb48c4 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 @@ -279,4 +279,13 @@ ) ; + + UPDATE platform_order_content + SET picking_fee = 0.0, + shipping_fee = NULL, + service_fee = NULL, + vat = NULL, + purchase_fee = 0.0 + WHERE platform_order_id IN (SELECT id FROM platform_order WHERE shipping_invoice_number = #{invoiceNumber}); + 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 15f9e20f3..13d743a4b 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 @@ -258,7 +258,6 @@ JOIN shop as s ON po.shop_id = s.id WHERE po.shipping_invoice_number IS NULL - AND po.order_time IS NOT NULL AND po.erp_status IN AND po.shipping_time between #{startDate} AND #{endDate} + AND po.shipping_invoice_number IS NULL AND po.erp_status = 3; + + UPDATE sav_refund + SET invoice_number = NULL, + refund_date = NULL, + total_refund_amount = 0.0 + WHERE invoice_number = #{invoiceNumber}; + \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java index 8d7d89273..230017761 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IClientService.java @@ -37,7 +37,7 @@ public interface IClientService extends IService { * 批量删除一对多 */ public void delBatchMain (Collection idList); - + public String getClientEntity(String id); /** * Get current user's client information * @return client or null if current user's role is not client 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 8eee3e9de..2c06d3270 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 @@ -3,6 +3,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.hualei.HLResponseItem; import org.jeecg.modules.business.domain.api.jt.JTParcelTrace; import org.jeecg.modules.business.domain.api.yd.YDTraceData; import org.jeecg.modules.business.entity.Parcel; @@ -48,6 +49,8 @@ public interface IParcelService extends IService { void saveYDParcelAndTraces(List traceData); void saveCMKParcelAndTraces(List traceData); + + void saveHLParcelAndTraces(List parcelTraces); 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/IPlatformOrderContentService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderContentService.java index da552bd2f..d2c1b6e51 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 @@ -42,4 +42,10 @@ public interface IPlatformOrderContentService extends IService fetchPlatformOrderContentsToArchive(List orderIDs); void savePlatformOrderContentArchive(List platformOrderContents); + + /** + * Cancels an invoice + * @param invoiceNumber + */ + void cancelInvoice(String invoiceNumber); } 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 214e974d2..75bfa0487 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 @@ -165,4 +165,10 @@ public interface IPlatformOrderService extends IService { * @param platformOrders list of platform orders */ void savePlatformOrderArchive(List platformOrders); + + /** + * Cancel Invoice + * @param invoiceNumber + */ + void cancelInvoice(String invoiceNumber); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISavRefundService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISavRefundService.java index a0fcf6965..143d0f3c0 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISavRefundService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISavRefundService.java @@ -13,5 +13,9 @@ import java.util.List; * @Version: V1.0 */ public interface ISavRefundService extends IService { - List getRefundAmount(String invoiceNumber); + List getRefundAmount(String invoiceNumber);/** + * Cancel Invoice + * @param invoiceNumber + */ + void cancelInvoice(String invoiceNumber); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java index 9466401d0..18878d0ec 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java @@ -258,13 +258,14 @@ public class PlatformOrderShippingInvoiceService { // save to DB org.jeecg.modules.business.entity.ShippingInvoice shippingInvoiceEntity = org.jeecg.modules.business.entity.ShippingInvoice.of( username, + invoice.client().getId(), invoice.code(), invoice.getTotalAmount(), invoice.reducedAmount(), invoice.paidAmount() ); shippingInvoiceMapper.insert(shippingInvoiceEntity); - return new InvoiceMetaData(filename, invoice.code()); + return new InvoiceMetaData(filename, invoice.code(), invoice.client().getInvoiceEntity()); } /** @@ -317,7 +318,7 @@ public class PlatformOrderShippingInvoiceService { return factureDetailMapper.selectList(queryWrapper); } - public byte[] exportToExcel(List details, String invoiceNumber) throws IOException { + public byte[] exportToExcel(List details, String invoiceNumber, String invoiceEntity) throws IOException { SheetManager sheetManager = SheetManager.createXLSX(); for (String title : titles) { sheetManager.write(title); @@ -370,15 +371,16 @@ public class PlatformOrderShippingInvoiceService { sheetManager.nextRow(); } - Path target = Paths.get(INVOICE_DETAIL_DIR, "Détail_calcul_de_facture_" + invoiceNumber + ".xlsx"); + Path target = Paths.get(INVOICE_DETAIL_DIR, "Détail_calcul_de_facture_" + invoiceNumber + "_(" + invoiceEntity + ").xlsx"); int i = 2; while (Files.exists(target)) { - target = Paths.get(INVOICE_DETAIL_DIR, "Détail_calcul_de_facture_" + invoiceNumber + "_" + i + ".xlsx"); + target = Paths.get(INVOICE_DETAIL_DIR, "Détail_calcul_de_facture_" + invoiceNumber + "_(" + invoiceEntity + ")_" + i + ".xlsx"); i++; } Files.createFile(target); sheetManager.export(target); sheetManager.getWorkbook().close(); + System.gc(); return Files.readAllBytes(target); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java index 128154ab9..830a1c7de 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ClientServiceImpl.java @@ -117,4 +117,8 @@ public class ClientServiceImpl extends ServiceImpl impleme return clientUserMap.selectClientByUserId(sysUser.getId()); } + @Override + public String getClientEntity(String id) { + return clientMapper.getClientEntity(id); + } } 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 e65b25397..c2a73badd 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 @@ -7,6 +7,8 @@ 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.hualei.HLParcelTraceDetail; +import org.jeecg.modules.business.domain.api.hualei.HLResponseItem; 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; @@ -272,6 +274,46 @@ public class ParcelServiceImpl extends ServiceImpl impleme } log.info("Finished inserting {} parcels and their traces into DB.", parcelTraces.size()); } + + @Override + @Transactional + public void saveHLParcelAndTraces(List parcelTraces) { + if (parcelTraces.isEmpty()) { + return; + } + log.info("Started inserting {} HL parcels and their traces into DB.", parcelTraces.size() ); + List parcelBillCodes = parcelTraces.stream() + .map(HLResponseItem::getBillCode) + .collect(Collectors.toList()); + List existingParcels = parcelMapper.searchByBillCode(parcelBillCodes); + Map billCodeToExistingParcels = existingParcels.stream().collect( + Collectors.toMap(Parcel::getBillCode, Function.identity()) + ); + List parcelToInsert = new ArrayList<>(); + List tracesToInsert = new ArrayList<>(); + for (HLResponseItem parcelAndTrace : parcelTraces) { + List traceDetails = parcelAndTrace.getTracesList(); + if (traceDetails.isEmpty()) { + break; + } + Parcel existingParcel = billCodeToExistingParcels.get(parcelAndTrace.getBillCode()); + if (existingParcel == null) { + parcelToInsert.add(parcelAndTrace); + traceDetails.forEach(trace -> trace.parcelTraceProcess(parcelAndTrace.getId())); + } else { + traceDetails.forEach(trace -> trace.parcelTraceProcess(existingParcel.getId())); + } + tracesToInsert.addAll(traceDetails); + } + log.info("After filtering, {} parcels will be inserted into the DB.", parcelToInsert.size()); + if (!parcelToInsert.isEmpty()) { + parcelMapper.insertOrIgnoreHLParcels(parcelToInsert); + } + if (!tracesToInsert.isEmpty()) { + parcelTraceMapper.insertOrIgnoreHLTraces(tracesToInsert); + } + log.info("Finished inserting {} HL parcels and their traces into DB.", parcelTraces.size()); + } @Override @Transactional public List fetchParcelsToArchive(List trackingNumbers) { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderContentServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderContentServiceImpl.java index d80c3c838..522ee5516 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderContentServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderContentServiceImpl.java @@ -62,4 +62,8 @@ public class PlatformOrderContentServiceImpl extends ServiceImpl platformOrderContents) { platformOrderContentMapper.insertPlatformOrderContentsArchives(platformOrderContents); } + @Override + public void cancelInvoice(String invoiceNumber) { + platformOrderContentMapper.cancelInvoice(invoiceNumber); + } } 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 22d879c8f..38b9c84e3 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 @@ -378,4 +378,8 @@ public class PlatformOrderServiceImpl extends ServiceImpl platformOrders) { platformOrderMap.insertPlatformOrdersArchives(platformOrders); } + @Override + public void cancelInvoice(String invoiceNumber) { + platformOrderMap.cancelInvoice(invoiceNumber); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SavRefundServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SavRefundServiceImpl.java index ef9d5ce08..de28f24d7 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SavRefundServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SavRefundServiceImpl.java @@ -32,4 +32,8 @@ public class SavRefundServiceImpl extends ServiceImpl getRefundAmount(String invoiceNumber) { return savRefundMapper.fetchRefundAmount(invoiceNumber); } + @Override + public void cancelInvoice(String invoiceNumber) { + savRefundMapper.cancelInvoice(invoiceNumber); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/InvoiceMetaData.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/InvoiceMetaData.java index 489d699b1..3aac152d9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/InvoiceMetaData.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/InvoiceMetaData.java @@ -8,4 +8,6 @@ public class InvoiceMetaData { private final String filename; private final String invoiceCode; + + private final String invoiceEntity; } diff --git a/pom.xml b/pom.xml index e2c6b0bc9..3d8532c47 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 org.jeecgframework.boot jeecg-boot-parent - 1.1.2 + 1.3.0 pom WIA APP ${project.version}