diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java index aa5fcce11..5178a667f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PlatformOrderController.java @@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.google.common.collect.Lists; import freemarker.template.Template; import freemarker.template.TemplateException; +import org.codehaus.jettison.json.JSONException; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderResponse; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeWarehouseRequest; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeWarehouseRequestBody; @@ -385,7 +386,7 @@ public class PlatformOrderController { } @PostMapping("/orderManagement") - public Result orderManagement(@RequestBody List orderOperations) throws IOException { + public Result orderManagement(@RequestBody List orderOperations) throws IOException, JSONException { boolean isEmployee = securityService.checkIsEmployee(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); Client client; @@ -469,6 +470,9 @@ public class PlatformOrderController { } List mabangOrders = platformOrderMabangService.getOrdersFromMabang(requests, executor); for(Order mabangOrder : mabangOrders) { + if(mabangOrder.getTrackingNumber() == null) { + continue; + } if(!mabangOrder.getTrackingNumber().isEmpty()) { ordersWithTrackingNumber.add(mabangOrder); } @@ -511,14 +515,17 @@ public class PlatformOrderController { templateModel.put("lastname", client.getSurname()); if(cancelCount > 0) { templateModel.put("cancelSuccessCount", cancelResponses.getSuccesses().size() + "/" + cancelCount); + templateModel.put("cancelSuccesses", cancelResponses.getSuccesses()); templateModel.put("cancelFailures", cancelResponses.getFailures()); } if(suspendCount > 0) { templateModel.put("suspendSuccessCount", suspendResponses.getSuccesses().size() + "/" + suspendCount); + templateModel.put("suspendSuccesses", suspendResponses.getSuccesses()); templateModel.put("suspendFailures", suspendResponses.getFailures()); } if(editCount > 0) { templateModel.put("editSuccessCount", editResponses.getSuccesses().size() + "/" + editCount); + templateModel.put("editSuccesses", editResponses.getSuccesses()); templateModel.put("editFailures", editResponses.getFailures()); } @@ -539,6 +546,13 @@ public class PlatformOrderController { throw new RuntimeException(e); } + // sync orders from Mabang + List poIdsSuccesses = new ArrayList<>(); + poIdsSuccesses.addAll(cancelResponses.getSuccesses()); + poIdsSuccesses.addAll(suspendResponses.getSuccesses()); + poIdsSuccesses.addAll(editResponses.getSuccesses()); + platformOrderMabangService.syncOrdersFromMabang(poIdsSuccesses); + return Result.OK(result); } @GetMapping("/recipientInfo") diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuData.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuData.java index 2d5e4e7e3..b0285813c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuData.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuData.java @@ -90,6 +90,9 @@ public class SkuData { public SkuStatus getStatus() { return SkuStatus.fromCode(this.status); } + public int getStatusValue() { + return this.status; + } public String toString() { return "ID : " + this.id + "\nStockSkuId : " + this.stockSkuId + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRequestBody.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRequestBody.java index 52c486243..8433d44c1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRequestBody.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuListRequestBody.java @@ -18,7 +18,7 @@ public class SkuListRequestBody implements RequestBody { private String stockSku = null; // 50 skus max private String stockSkuList = null; - private DateType datetimeType; + private DateType datetimeType = DateType.CREATE; private LocalDateTime startDate; private LocalDateTime endDate; private Integer page = 1; diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuUpdateListStream.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuUpdateListStream.java new file mode 100644 index 000000000..1ded31b2c --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/doSearchSkuListNew/SkuUpdateListStream.java @@ -0,0 +1,122 @@ +package org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew; + +import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.business.domain.api.mabang.getorderlist.NetworkDataStream; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.NoSuchElementException; + +/** + * This class provide stream of order. + */ +@Slf4j +public class SkuUpdateListStream implements NetworkDataStream { + + private final NetworkDataStream rawStream; + + private List skus; + + private int index; + + private boolean began; + + /** + * Flag of current data is already empty, + * either currentOrders is null or currentIndex arrives at the end. + * In both case, we should call next() of the rawStream. + */ + private boolean empty; + + + public SkuUpdateListStream(NetworkDataStream rawStream) { + this.rawStream = rawStream; + skus = null; + this.index = 0; + this.empty = true; + this.began = false; + } + @Override + public List all() { + SkuData firstElement = attempt(); + if (firstElement == null) { + return Collections.emptyList(); + } + + ArrayList res = new ArrayList<>(); + if (firstElement.getStatus().equals(SkuStatus.Normal) || firstElement.getStatus().equals(SkuStatus.StoppedSelling)) { + res.add(firstElement); + } + while (hasNext()) { + SkuData nextSku = next(); + if(nextSku.getStatus().equals(SkuStatus.Normal) || firstElement.getStatus().equals(SkuStatus.StoppedSelling)) { + res.add(nextSku); + } + } + return res; + } + @Override + public SkuData attempt() { + began = true; + log.info("Attempting for the first request"); + SkuListResponse response = rawStream.attempt(); + if (response == null) { + log.info("No response"); + return null; + } + if (response.getData().isEmpty()) { + log.info("Response with empty data"); + return null; + } + skus = response.getData().toJavaList(SkuData.class); + index = 1; + log.info("Returned the first element"); + empty = index >= skus.size(); + return skus.get(0); + } + + @Override + public boolean hasNext() { + // the first time + if (!began) { + throw new IllegalStateException("Calling hasNext before begin"); + } + + // Current data is not yet empty + if (index < skus.size()) { + log.debug("Current order list is not empty yet"); + return true; + } + + /* Current data is empty */ + this.empty = true; + log.debug("Current order list is already empty,"); + // and raw stream is empty too. + if (!rawStream.hasNext()) { + log.debug("and source stream is empty too, hasNext: false"); + return false; + } + // but raw stream not empty. + else { + log.debug("but source stream still has data, hasNext: true"); + return true; + } + } + + @Override + public SkuData next() { + if (!hasNext()) { + throw new NoSuchElementException("Stream is empty!"); + } + if (empty) { + skus = this.rawStream.next().getData().toJavaList(SkuData.class); + empty = false; + index = 0; + } + log.debug("Return data at {}", index); + SkuData res = skus.get(index); + index++; + return res; + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ArchiveOrderJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ArchiveOrderJob.java index 89e9485b8..99591848f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ArchiveOrderJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ArchiveOrderJob.java @@ -7,6 +7,7 @@ import org.codehaus.jettison.json.JSONObject; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ArchiveOrderRequest; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ArchiveOrderRequestBody; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderResponse; +import org.jeecg.modules.business.service.IPlatformOrderMabangService; import org.jeecg.modules.business.service.IPlatformOrderService; import org.quartz.Job; import org.quartz.JobDataMap; @@ -36,6 +37,8 @@ public class ArchiveOrderJob implements Job { @Autowired private IPlatformOrderService platformOrderService; + @Autowired + private IPlatformOrderMabangService platformOrderMabangService; @Override public void execute(JobExecutionContext context) throws JobExecutionException { @@ -86,7 +89,7 @@ public class ArchiveOrderJob implements Job { platformOrderIds.forEach(s -> archiveOrderRequestBodies.add(new ArchiveOrderRequestBody(s))); log.info("{} order archiving requests to be sent to MabangAPI", archiveOrderRequestBodies.size()); - + List platformOrderIdsArchived = new ArrayList<>(); List> changeOrderFutures = archiveOrderRequestBodies.stream() .map(archiveOrderRequestBody -> CompletableFuture.supplyAsync(() -> { boolean success = false; @@ -94,7 +97,9 @@ public class ArchiveOrderJob implements Job { ArchiveOrderRequest archiveOrderRequest = new ArchiveOrderRequest(archiveOrderRequestBody); ChangeOrderResponse response = archiveOrderRequest.send(); success = response.success(); - } catch (RuntimeException e) { + if(success) + platformOrderIdsArchived.add(archiveOrderRequestBody.getPlatformOrderId()); + } catch (RuntimeException e) { log.error("Error communicating with MabangAPI", e); } return success; @@ -103,5 +108,11 @@ public class ArchiveOrderJob implements Job { List results = changeOrderFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); long nbSuccesses = results.stream().filter(b -> b).count(); log.info("{}/{} order archiving requests have succeeded.", nbSuccesses, archiveOrderRequestBodies.size()); + + try { + platformOrderMabangService.syncOrdersFromMabang(platformOrderIdsArchived); + } catch (JSONException e) { + throw new RuntimeException(e); + } } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java index 62f1e9fc2..87720542f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangOrderSyncJob.java @@ -1,13 +1,11 @@ package org.jeecg.modules.business.domain.job; -import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; import org.codehaus.jettison.json.JSONObject; import org.jeecg.common.api.dto.message.TemplateMessageDTO; import org.jeecg.common.system.api.ISysBaseAPI; -import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; import org.jeecg.modules.business.service.IPlatformOrderMabangService; import org.jetbrains.annotations.NotNull; import org.quartz.Job; @@ -17,10 +15,6 @@ import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.stream.Collectors; @Slf4j public class MabangOrderSyncJob implements Job { @@ -29,7 +23,6 @@ public class MabangOrderSyncJob implements Job { private IPlatformOrderMabangService platformOrderMabangService; @Autowired private ISysBaseAPI ISysBaseApi; - private static final Integer DEFAULT_NUMBER_OF_THREADS = 10; @Override public void execute(JobExecutionContext context) throws JobExecutionException { JobDataMap jobDataMap = context.getMergedJobDataMap(); @@ -54,53 +47,32 @@ public class MabangOrderSyncJob implements Job { throw new RuntimeException("PlatformOrder ID list can't be empty !"); } - log.info("Syncing following orders {}", platformOrderIds); - List> platformOrderIdLists = Lists.partition(platformOrderIds, 10); - List requests = new ArrayList<>(); - for (List platformOrderIdList : platformOrderIdLists) { - requests.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList)); - } - List mabangOrders = new ArrayList<>(); - ExecutorService executor = Executors.newFixedThreadPool(DEFAULT_NUMBER_OF_THREADS); - List> futures = requests.stream() - .map(request -> CompletableFuture.supplyAsync(() -> { - boolean success = false; - try { - OrderListRawStream rawStream = new OrderListRawStream(request); - OrderListStream stream = new OrderListStream(rawStream); - List orders = stream.all(); - mabangOrders.addAll(orders); - success = !orders.isEmpty(); - } catch (RuntimeException e) { - log.error("Error communicating with MabangAPI", e); - } - return success; - }, executor)) - .collect(Collectors.toList()); - List results = futures.stream().map(CompletableFuture::join).collect(Collectors.toList()); - long nbSuccesses = results.stream().filter(b -> b).count(); - log.info("{}/{} requests have succeeded.", nbSuccesses, requests.size()); - int syncedOrderNumber = mabangOrders.size(); - List syncedOrderIds = mabangOrders.stream().map(Order::getPlatformOrderId).collect(Collectors.toList()); - log.info("{}/{} mabang orders have been retrieved.", syncedOrderNumber, platformOrderIds.size()); - - log.info("{} orders to be updated.", syncedOrderNumber); - platformOrderMabangService.saveOrderFromMabang(mabangOrders); - - Map param = new HashMap<>(); - param.put("requested_order_number", String.valueOf(platformOrderIds.size())); - param.put("synced_order_number", String.valueOf(syncedOrderNumber)); - param.put("requested_order_ids", getHtmlListFromStringList(platformOrderIds)); - List failedToSyncOrderIds = new ArrayList<>(); - for (String platformOrderId : platformOrderIds) { - if (!syncedOrderIds.contains(platformOrderId)) { - failedToSyncOrderIds.add(platformOrderId); + try { + JSONObject res = platformOrderMabangService.syncOrdersFromMabang(platformOrderIds); + String syncedOrderNumber = String.valueOf(res.getInt("synced_order_number")); + List syncedOrderIds = new ArrayList<>(); + JSONArray syncedOrderIdsArray = res.getJSONArray("synced_order_ids"); + for (int i = 0; i < syncedOrderIdsArray.length(); i++) { + syncedOrderIds.add(syncedOrderIdsArray.getString(i)); } + Map param = new HashMap<>(); + param.put("requested_order_number", String.valueOf(platformOrderIds.size())); + param.put("synced_order_number", syncedOrderNumber); + param.put("requested_order_ids", getHtmlListFromStringList(platformOrderIds)); + List failedToSyncOrderIds = new ArrayList<>(); + for (String platformOrderId : platformOrderIds) { + if (!syncedOrderIds.contains(platformOrderId)) { + failedToSyncOrderIds.add(platformOrderId); + } + } + param.put("failed_to_sync_order_ids", getHtmlListFromStringList(failedToSyncOrderIds)); + TemplateMessageDTO message = new TemplateMessageDTO("admin", username == null ? "admin" : username, "马帮订单同步任务", param, "mabang_order_sync_job_result"); + ISysBaseApi.sendTemplateAnnouncement(message); + log.info("Order sync job recap message sent"); + } catch (JSONException e) { + throw new RuntimeException(e); } - param.put("failed_to_sync_order_ids", getHtmlListFromStringList(failedToSyncOrderIds)); - TemplateMessageDTO message = new TemplateMessageDTO("admin", username == null ? "admin" : username, "马帮订单同步任务", param, "mabang_order_sync_job_result"); - ISysBaseApi.sendTemplateAnnouncement(message); - log.info("Order sync job recap message sent"); + } @NotNull diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangSkuSyncJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangSkuSyncJob.java new file mode 100644 index 000000000..4b585f93b --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/MabangSkuSyncJob.java @@ -0,0 +1,113 @@ +package org.jeecg.modules.business.domain.job; + +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; +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.mabang.doSearchSkuListNew.*; +import org.jeecg.modules.business.service.ISkuListMabangService; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; +import java.util.List; + +/** + * A Job that retrieves all Sku from Mabang + * if the sku is of status 3 (normal) and not in DB, then we insert it in DB + */ +@Slf4j +@Component +public class MabangSkuSyncJob implements Job { + + @Autowired + private ISkuListMabangService skuListMabangService; + private static final Integer DEFAULT_NUMBER_OF_DAYS = 5; + private static final DateType DEFAULT_DATE_TYPE = DateType.UPDATE; + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + LocalDateTime endDateTime = LocalDateTime.now(ZoneId.of(ZoneId.SHORT_IDS.get("CTT"))); + LocalDateTime startDateTime = endDateTime.minusDays(DEFAULT_NUMBER_OF_DAYS); + List skus = new ArrayList<>(); + DateType dateType = DEFAULT_DATE_TYPE; + JobDataMap jobDataMap = context.getMergedJobDataMap(); + String parameter = ((String) jobDataMap.get("parameter")); + if (parameter != null) { + try { + JSONObject jsonObject = new JSONObject(parameter); + if (!jsonObject.isNull("startDateTime")) { + String startDateStr = jsonObject.getString("startDateTime"); + startDateTime = LocalDateTime.parse(startDateStr); + } + if (!jsonObject.isNull("endDateTime")) { + String endDateStr = jsonObject.getString("endDateTime"); + endDateTime = LocalDateTime.parse(endDateStr); + } + if (!jsonObject.isNull("dateType")) { + dateType = DateType.fromCode(jsonObject.getInt("dateType")); + } + if (!jsonObject.isNull("skus")) { + JSONArray array = jsonObject.getJSONArray("skus"); + for(int i = 0; i < array.length(); i++) { + skus.add(array.getString(i)); + } + } + } catch (JSONException e) { + log.error("Error while parsing parameter as JSON, falling back to default parameters."); + } + } + + if (!endDateTime.isAfter(startDateTime)) { + throw new RuntimeException("EndDateTime must be strictly greater than StartDateTime !"); + } + + try { + if(skus.isEmpty()) { + log.info("Updating skus by date"); + while (startDateTime.until(endDateTime, ChronoUnit.HOURS) > 0) { + LocalDateTime dayBeforeEndDateTime = endDateTime.minusDays(1); + SkuListRequestBody body = SkuListRequestBodys.allSkuOfDateType(dayBeforeEndDateTime, endDateTime, dateType); + SkuListRawStream rawStream = new SkuListRawStream(body); + SkuUpdateListStream stream = new SkuUpdateListStream(rawStream); + // the status is directly filtered in all() method + List skusFromMabang = stream.all(); + log.info("{} skus from {} to {} ({})to be updated.", skusFromMabang.size(), + dayBeforeEndDateTime, endDateTime, dateType); + + if (!skusFromMabang.isEmpty()) { + // we save the skuDatas in DB + skuListMabangService.updateSkusFromMabang(skusFromMabang); + } + endDateTime = dayBeforeEndDateTime; + } + } + else { + log.info("Updating skus by erpCode : {}", skus); + List> skusPartition = Lists.partition(skus, 50); + for(List skuPartition : skusPartition) { + SkuListRequestBody body = new SkuListRequestBody(); + body.setStockSkuList(String.join(",", skuPartition)); + SkuListRawStream rawStream = new SkuListRawStream(body); + SkuUpdateListStream stream = new SkuUpdateListStream(rawStream); + List skusFromMabang = stream.all(); + log.info("{} skus to be updated.", skusFromMabang.size()); + if (!skusFromMabang.isEmpty()) { + // we save the skuDatas in DB + skuListMabangService.updateSkusFromMabang(skusFromMabang); + } + } + } + } catch (SkuListRequestErrorException e) { + throw new RuntimeException(e); + } + } +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/logistic/CostTrialCalculation.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/logistic/CostTrialCalculation.java index 2100661e7..9a5cdc5bf 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/logistic/CostTrialCalculation.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/logistic/CostTrialCalculation.java @@ -32,9 +32,19 @@ public class CostTrialCalculation { private final BigDecimal additionalCost; + private final BigDecimal previousUnitPrice; - private CostTrialCalculation(String countryCode, String logisticsChannelName, String logisticChannelCode, BigDecimal unitPrice, BigDecimal shippingCost, - BigDecimal registrationCost, BigDecimal additionalCost, Date effectiveDate) { + private final BigDecimal previousShippingCost; + + private final BigDecimal previousRegistrationCost; + + private final BigDecimal previousAdditionalCost; + + + + private CostTrialCalculation(String countryCode, String logisticsChannelName, String logisticChannelCode, + BigDecimal unitPrice, BigDecimal shippingCost, BigDecimal registrationCost, BigDecimal additionalCost, Date effectiveDate, + BigDecimal previousUnitPrice,BigDecimal previousShippingCost, BigDecimal previousRegistrationCost, BigDecimal previousAdditionalCost) { this.countryCode = countryCode; this.logisticsChannelName = logisticsChannelName; this.logisticChannelCode = logisticChannelCode; @@ -43,15 +53,28 @@ public class CostTrialCalculation { this.registrationCost = registrationCost; this.additionalCost = additionalCost; this.effectiveDate = effectiveDate; + this.previousUnitPrice = previousUnitPrice; + this.previousShippingCost = previousShippingCost; + this.previousRegistrationCost = previousRegistrationCost; + this.previousAdditionalCost = previousAdditionalCost; } - public CostTrialCalculation(LogisticChannelPrice price, int weight, String logisticsChannelName, String code) { + public CostTrialCalculation(LogisticChannelPrice price, LogisticChannelPrice previousPrice,int weight, String logisticsChannelName, String code) { this(price.getEffectiveCountry(), logisticsChannelName, code, price.getCalUnitPrice(), price.calculateShippingPrice(BigDecimal.valueOf(weight)), - price.getRegistrationFee(), price.getAdditionalCost(), price.getEffectiveDate()); + price.getRegistrationFee(), price.getAdditionalCost(), price.getEffectiveDate(), + previousPrice.getCalUnitPrice(), previousPrice.calculateShippingPrice(BigDecimal.valueOf(weight)), previousPrice.getRegistrationFee(), previousPrice.getAdditionalCost() + ); } @JsonProperty("TotalCost") public double getTotalCost() { return shippingCost.add(registrationCost).add(additionalCost).setScale(2, RoundingMode.CEILING).doubleValue(); } + + @JsonProperty("CostDifference") + public double getCostDifference() { + double previousCost = previousShippingCost.add(previousRegistrationCost).add(previousAdditionalCost).setScale(2, RoundingMode.CEILING).doubleValue(); + BigDecimal diff = BigDecimal.valueOf((getTotalCost() - previousCost) / previousCost * 100); + return diff.setScale(2, RoundingMode.CEILING).doubleValue(); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Sku.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Sku.java index f4f4b1ebc..a1380c912 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Sku.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/entity/Sku.java @@ -98,4 +98,12 @@ public class Sku implements Serializable { @Excel(name = "服务费", width = 15) @ApiModelProperty(value = "服务费") private java.math.BigDecimal serviceFee; + /** + * Status + * 1:自动创建;2:待开发;3:正常;4:清仓;5:停止销售" + * default : 3 + */ + @Excel(name = "Status", width = 15) + @ApiModelProperty(value = "Status") + private java.lang.Integer status; } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/LogisticChannelPriceMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/LogisticChannelPriceMapper.java index 7002cedd9..955969d8f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/LogisticChannelPriceMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/LogisticChannelPriceMapper.java @@ -34,7 +34,7 @@ public interface LogisticChannelPriceMapper extends BaseMapper findBy( @Param("channelName") String channelName, @Param("date") Date shippingTime, @Param("trueWeight") BigDecimal weight, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/LogisticChannelPriceMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/LogisticChannelPriceMapper.xml index bdac56ddb..a36890c23 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/LogisticChannelPriceMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/LogisticChannelPriceMapper.xml @@ -33,7 +33,7 @@ AND effective_date <= #{date} AND active = 1 ORDER BY effective_date DESC - LIMIT 1 + LIMIT 2