From 3b9d03eda3981bd47a633b36f7f34557542b4801 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Fri, 28 Jun 2024 10:42:57 +0200 Subject: [PATCH 1/3] feat : client orders management --- .../controller/SecurityController.java | 10 +- .../controller/admin/AdminController.java | 10 +- .../admin/PlatformOrderController.java | 107 ++++++++++++--- .../admin/UserClientController.java | 34 +++-- .../shippingInvoice/InvoiceController.java | 126 +++++++++++++----- .../client/TransactionController.java | 13 +- .../ChangeWarehouseRequestBody.java | 17 +++ .../domain/job/ChangeWarehouseJob.java | 16 +-- .../domain/job/RemoveVirtualProductJob.java | 41 +----- .../business/entity/ShippingInvoice.java | 33 ----- .../business/mapper/PlatformOrderMapper.java | 8 +- .../modules/business/mapper/ShopMapper.java | 4 + .../mapper/xml/PlatformOrderContentMapper.xml | 2 +- .../mapper/xml/PlatformOrderMapper.xml | 9 +- .../business/mapper/xml/ShopMapper.xml | 10 ++ .../service/IPlatformOrderMabangService.java | 8 ++ .../service/IPlatformOrderService.java | 11 +- .../business/service/ISecurityService.java | 5 + .../business/service/IShopService.java | 4 + .../impl/PlatformOrderMabangServiceImpl.java | 68 +++++++++- .../impl/PlatformOrderServiceImpl.java | 5 +- .../service/impl/SecurityServiceImp.java | 24 ++++ .../service/impl/ShopServiceImpl.java | 10 ++ .../jeecg/modules/business/vo/Estimation.java | 23 +++- .../business/vo/PlatformOrderOperation.java | 11 +- .../client/orderManagementNotification.ftl | 16 +++ pom.xml | 2 +- 27 files changed, 434 insertions(+), 193 deletions(-) create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISecurityService.java create mode 100644 jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SecurityServiceImp.java diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/SecurityController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/SecurityController.java index 414405da7..1d4b7af4c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/SecurityController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/SecurityController.java @@ -2,10 +2,8 @@ package org.jeecg.modules.business.controller; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; -import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; -import org.jeecg.common.system.vo.LoginUser; -import org.jeecg.modules.system.service.ISysDepartService; +import org.jeecg.modules.business.service.ISecurityService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; @@ -18,13 +16,11 @@ import org.springframework.web.bind.annotation.RestController; @Slf4j public class SecurityController { @Autowired - private ISysDepartService sysDepartService; + private ISecurityService securityService; @Autowired private Environment env; @GetMapping(value = "/isEmployee") public Result checkIsEmployee () { - String companyOrgCode = sysDepartService.queryCodeByDepartName(env.getProperty("company.orgName")); - LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - return Result.ok(sysUser.getOrgCode().equals(companyOrgCode)); + return Result.ok(securityService.checkIsEmployee()); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/AdminController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/AdminController.java index c10897ab0..1aae6817f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/AdminController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/AdminController.java @@ -1,13 +1,12 @@ package org.jeecg.modules.business.controller.admin; -import cn.hutool.core.date.DateTime; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.business.service.DashboardService; -import org.jeecg.modules.system.service.ISysDepartService; +import org.jeecg.modules.business.service.ISecurityService; import org.jeecg.modules.system.service.impl.SysBaseApiImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; @@ -28,7 +27,7 @@ import java.util.Map; public class AdminController { @Autowired private DashboardService dashboardService; @Autowired private SysBaseApiImpl sysBaseApi; - @Autowired private ISysDepartService sysDepartService; + @Autowired private ISecurityService securityService; @Autowired private Environment env; private final Integer PERIOD = 5; @@ -52,10 +51,9 @@ public class AdminController { @GetMapping(value = "/packageStatuses") public Result packageStatuses() { - String companyOrgCode = sysDepartService.queryCodeByDepartName(env.getProperty("company.orgName")); + boolean isEmployee = securityService.checkIsEmployee(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - String orgCode = sysUser.getOrgCode(); - if(!companyOrgCode.equals(orgCode)){ + if(!isEmployee){ log.info("User {}, tried to access /admin/packageStatuses but is not authorized.", sysUser.getUsername()); return Result.error(403,"Not authorized to view this page."); } 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 48624b983..aa5fcce11 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 @@ -17,15 +17,18 @@ import javax.servlet.http.HttpServletRequest; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.google.common.collect.Lists; import freemarker.template.Template; import freemarker.template.TemplateException; -import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderStatus; +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; +import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; import org.jeecg.modules.business.domain.job.ThrottlingExecutorService; import org.jeecg.modules.business.entity.Client; import org.jeecg.modules.business.mapper.PlatformOrderMapper; import org.jeecg.modules.business.service.*; import org.jeecg.modules.business.vo.*; -import org.jeecg.modules.system.service.ISysDepartService; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; @@ -55,8 +58,7 @@ import io.swagger.annotations.ApiOperation; import org.jeecg.common.aspect.annotation.AutoLog; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; -import static org.jeecg.modules.business.vo.PlatformOrderOperation.Action.CANCEL; -import static org.jeecg.modules.business.vo.PlatformOrderOperation.Action.SUSPEND; +import static org.jeecg.modules.business.vo.PlatformOrderOperation.Action.*; /** * @Description: 平台订单表 @@ -82,7 +84,7 @@ public class PlatformOrderController { @Autowired private IShopService shopService; @Autowired - private ISysDepartService sysDepartService; + private ISecurityService securityService; @Autowired private Environment env; @@ -384,10 +386,10 @@ public class PlatformOrderController { @PostMapping("/orderManagement") public Result orderManagement(@RequestBody List orderOperations) throws IOException { - String companyOrgCode = sysDepartService.queryCodeByDepartName(env.getProperty("company.orgName")); + boolean isEmployee = securityService.checkIsEmployee(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); Client client; - if(!sysUser.getOrgCode().equals(companyOrgCode)) { + if(!isEmployee) { client = clientService.getCurrentClient(); if (client == null) { return Result.error(500,"Client not found. Please contact administrator."); @@ -401,31 +403,38 @@ public class PlatformOrderController { client = clientService.getByShopId(orderOperations.get(0).getShopId()); } - long suspendCount = 0, cancelCount = 0; + long suspendCount = 0, cancelCount = 0, editCount = 0; List ordersToSuspend = orderOperations.stream() .filter(orderOperation -> orderOperation.getAction().equalsIgnoreCase(SUSPEND.getValue())) .collect(Collectors.toList()); List ordersToCancel = orderOperations.stream() .filter(orderOperation -> orderOperation.getAction().equalsIgnoreCase(CANCEL.getValue())) .collect(Collectors.toList()); + List ordersToEdit = orderOperations.stream() + .filter(orderOperation -> orderOperation.getAction().equalsIgnoreCase(EDIT.getValue())) + .collect(Collectors.toList()); for(PlatformOrderOperation orderOperation : ordersToSuspend) { suspendCount += orderOperation.getOrderIds().split(",").length; } for(PlatformOrderOperation orderOperation : ordersToCancel) { cancelCount += orderOperation.getOrderIds().split(",").length; } + editCount = ordersToEdit.size(); log.info("{} Orders to suspend: {}", suspendCount, ordersToSuspend); log.info("{} Orders to cancel: {}", cancelCount, ordersToCancel); + log.info("{} Orders to edit: {}", editCount, ordersToEdit); Responses cancelResponses = new Responses(); Responses suspendResponses = new Responses(); - // Cancel orders - ExecutorService cancelExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS, + Responses editResponses = new Responses(); + + ExecutorService executor = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS, MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES); + // Cancel orders List> futuresCancel = ordersToCancel.stream() .map(orderOperation -> CompletableFuture.supplyAsync( () -> platformOrderMabangService.cancelOrders(orderOperation), - cancelExecutorService) + executor) ).collect(Collectors.toList()); ListcancelResults = futuresCancel.stream().map(CompletableFuture::join).collect(Collectors.toList()); cancelResults.forEach(res -> { @@ -437,12 +446,10 @@ public class PlatformOrderController { // Suspend orders - ExecutorService suspendExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS, - MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES); List> futuresSuspend = ordersToSuspend.stream() .map(orderOperation -> CompletableFuture.supplyAsync( () -> platformOrderMabangService.suspendOrder(orderOperation), - suspendExecutorService) + executor) ).collect(Collectors.toList()); List suspendResults = futuresSuspend.stream().map(CompletableFuture::join).collect(Collectors.toList()); suspendResults.forEach(res -> { @@ -451,9 +458,49 @@ public class PlatformOrderController { }); log.info("{}/{} orders suspended successfully.", suspendResponses.getSuccesses().size(), suspendCount); + // Edit orders + // First we clear logistic channel if order has one + List> editOrderIds = Lists.partition(ordersToEdit.stream().map(PlatformOrderOperation::getOrderIds).collect(Collectors.toList()), 10); + List ordersWithTrackingNumber = new ArrayList<>(); + + List requests = new ArrayList<>(); + for (List platformOrderIdList : editOrderIds) { + requests.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList)); + } + List mabangOrders = platformOrderMabangService.getOrdersFromMabang(requests, executor); + for(Order mabangOrder : mabangOrders) { + if(!mabangOrder.getTrackingNumber().isEmpty()) { + ordersWithTrackingNumber.add(mabangOrder); + } + } + platformOrderMabangService.clearLogisticChannel(ordersWithTrackingNumber, executor); + + List> futuresEdit = ordersToEdit.stream() + .map(orderOperation -> CompletableFuture.supplyAsync(() -> { + ChangeWarehouseRequestBody body = new ChangeWarehouseRequestBody(orderOperation); + ChangeWarehouseRequest request = new ChangeWarehouseRequest(body); + ChangeOrderResponse response = request.send(); + Responses r = new Responses(); + if(response.success()) + r.addSuccess(orderOperation.getOrderIds()); + else + r.addFailure(orderOperation.getOrderIds()); + return r; + }, + executor) + ).collect(Collectors.toList()); + List editResults = futuresEdit.stream().map(CompletableFuture::join).collect(Collectors.toList()); + editResults.forEach(res -> { + editResponses.getSuccesses().addAll(res.getSuccesses()); + editResponses.getFailures().addAll(res.getFailures()); + }); + log.info("{}/{} orders edited successfully.", editResponses.getSuccesses().size(), editCount); + executor.shutdown(); + JSONObject result = new JSONObject(); result.put("cancelResult", cancelResponses); result.put("suspendResult", suspendResponses); + result.put("editResult", editResponses); // send mail String subject = "[" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + "] Orders management report"; @@ -462,12 +509,18 @@ public class PlatformOrderController { Map templateModel = new HashMap<>(); templateModel.put("firstname", client.getFirstName()); templateModel.put("lastname", client.getSurname()); - if(cancelCount > 0) + if(cancelCount > 0) { templateModel.put("cancelSuccessCount", cancelResponses.getSuccesses().size() + "/" + cancelCount); - if(suspendCount > 0) + templateModel.put("cancelFailures", cancelResponses.getFailures()); + } + if(suspendCount > 0) { templateModel.put("suspendSuccessCount", suspendResponses.getSuccesses().size() + "/" + suspendCount); - templateModel.put("cancelFailures", cancelResponses.getFailures()); - templateModel.put("suspendFailures", suspendResponses.getFailures()); + templateModel.put("suspendFailures", suspendResponses.getFailures()); + } + if(editCount > 0) { + templateModel.put("editSuccessCount", editResponses.getSuccesses().size() + "/" + editCount); + templateModel.put("editFailures", editResponses.getFailures()); + } Session session = Session.getInstance(prop, new Authenticator() { @Override @@ -488,4 +541,22 @@ public class PlatformOrderController { return Result.OK(result); } + @GetMapping("/recipientInfo") + public Result getRecipientInfo(@RequestParam("orderId") String platformOrderId) { + + OrderListRequestBody body = new OrderListRequestBody().setPlatformOrderIds(Collections.singletonList(platformOrderId)); + OrderListRawStream rawStream = new OrderListRawStream(body); + OrderListStream stream = new OrderListStream(rawStream); + List orders = stream.all(); + if(orders.isEmpty()) { + return Result.error(400, "Order not found."); + } + Order order = orders.get(0); + JSONObject recipient = new JSONObject(); + recipient.put("recipient", order.getRecipient()); + recipient.put("phone", order.getPhone1()); + recipient.put("street1", order.getAddress()); + recipient.put("street2", order.getAddress2()); + return Result.OK(recipient); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/UserClientController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/UserClientController.java index 99c0fbdb3..10518c58d 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/UserClientController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/UserClientController.java @@ -7,8 +7,8 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.business.entity.Client; import org.jeecg.modules.business.entity.ClientCategory; +import org.jeecg.modules.business.service.ISecurityService; import org.jeecg.modules.business.service.IUserClientService; -import org.jeecg.modules.system.service.ISysDepartService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; @@ -27,7 +27,7 @@ public class UserClientController { @Autowired private IUserClientService userClientService; @Autowired - private ISysDepartService sysDepartService; + private ISecurityService securityService; @Autowired private Environment env; /** @@ -36,23 +36,21 @@ public class UserClientController { */ @GetMapping(value = "/getClient") public Result getClientByUserId() { - String companyOrgCode = sysDepartService.queryCodeByDepartName(env.getProperty("company.orgName")); - LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - String orgCode = loginUser.getOrgCode(); - String userId = loginUser.getId(); - Client client = userClientService.getClientMinInfoByUserId(userId); - if(client == null) { - if(orgCode.equals(companyOrgCode)) { - Map> internalClientList = new HashMap<>(); - internalClientList.put("internal", userClientService.listClients()); - return Result.OK("internal usage", internalClientList); - } - else - return Result.error(403, "Access Denied."); + boolean isEmployee = securityService.checkIsEmployee(); + if(isEmployee) { + Map> internalClientList = new HashMap<>(); + internalClientList.put("internal", userClientService.listClients()); + return Result.OK("internal usage", internalClientList); + } + else { + String userId = ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getId(); + Client client = userClientService.getClientMinInfoByUserId(userId); + if(client == null) + return Result.error(403, "Access Denied."); + Map clientMap = new HashMap<>(); + clientMap.put("client", client); + return Result.ok(clientMap); } - Map clientMap = new HashMap<>(); - clientMap.put("client", client); - return Result.ok(clientMap); } @GetMapping(value = "/getSelfServiceClients") public Result getSelfServiceClients() { 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 f25f26c22..a3ce2a3a5 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 @@ -5,11 +5,11 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.alibaba.fastjson.JSONObject; +import com.google.common.base.CaseFormat; import freemarker.template.Template; import freemarker.template.TemplateException; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.tuple.MutableTriple; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.dto.message.TemplateMessageDTO; import org.jeecg.common.api.vo.Result; @@ -25,11 +25,9 @@ import org.jeecg.modules.business.mapper.PlatformOrderContentMapper; import org.jeecg.modules.business.mapper.PlatformOrderMapper; import org.jeecg.modules.business.mapper.PurchaseOrderContentMapper; import org.jeecg.modules.business.service.*; -import org.jeecg.modules.business.service.impl.ProviderMabangServiceImpl; import org.jeecg.modules.business.vo.*; import org.jeecg.modules.quartz.entity.QuartzJob; import org.jeecg.modules.quartz.service.IQuartzJobService; -import org.jeecg.modules.system.service.ISysDepartService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -47,7 +45,6 @@ import javax.servlet.http.HttpServletRequest; import java.io.*; import java.math.BigDecimal; import java.math.RoundingMode; -import java.net.StandardSocketOptions; import java.net.URISyntaxException; import java.text.ParseException; import java.time.LocalDate; @@ -56,6 +53,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDictSql; import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; import static org.jeecg.modules.business.entity.Task.TaskCode.SI_G; import static org.jeecg.modules.business.entity.TaskHistory.TaskStatus.*; @@ -75,14 +73,10 @@ public class InvoiceController { @Autowired private IClientService clientService; @Autowired - private ICurrencyService currencyService; - @Autowired private ExchangeRatesMapper exchangeRatesMapper; @Autowired private IShopService shopService; @Autowired - private ILogisticChannelService logisticChannelService; - @Autowired private PlatformOrderShippingInvoiceService shippingInvoiceService; @Autowired private PlatformOrderMapper platformOrderMapper; @@ -93,8 +87,6 @@ public class InvoiceController { @Autowired private IProductService productService; @Autowired - private ProviderMabangServiceImpl providerMabangService; - @Autowired private IPurchaseOrderService purchaseOrderService; @Autowired private PurchaseOrderContentMapper purchaseOrderContentMapper; @@ -119,7 +111,7 @@ public class InvoiceController { @Autowired private ISysBaseAPI ISysBaseApi; @Autowired - private ISysDepartService sysDepartService; + private ISecurityService securityService; @Autowired private IUserClientService userClientService; @Autowired @@ -228,7 +220,7 @@ public class InvoiceController { } @PostMapping(value = "/period") public Result getValidPeriod(@RequestBody List shopIDs) { - log.info("Request for valid period for shops: " + shopIDs.toString()); + log.info("Request for valid period for shops: {}", shopIDs.toString()); Period period = shippingInvoiceService.getValidPeriod(shopIDs); if (period.isValid()) return Result.OK(period); @@ -455,8 +447,7 @@ public class InvoiceController { } @GetMapping(value = "/preShipping/orderTime") public Result getValidOrderTimePeriod(@RequestParam("shopIds[]") List shopIDs, @RequestParam("erpStatuses[]") List erpStatuses) { - log.info("Request for valid order time period for shops: " + shopIDs.toString() + - " and erpStatuses : " + erpStatuses.toString()); + log.info("Request for valid order time period for shops: {} and erpStatuses : {}", shopIDs.toString(), erpStatuses.toString()); Period period = shippingInvoiceService.getValidOrderTimePeriod(shopIDs, erpStatuses); if (period.isValid()) { return Result.OK(period); @@ -475,15 +466,15 @@ public class InvoiceController { public Result getOrdersBetweenOrderDates(PlatformOrder platformOrder, @RequestBody ShippingInvoiceParam param, HttpServletRequest req) { QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(platformOrder, req.getParameterMap()); LambdaQueryWrapper lambdaQueryWrapper = queryWrapper.lambda(); - log.info("Requesting orders for : " + param.toString()); + log.info("Requesting orders for : {}", param.toString()); if (param.shopIDs() == null || param.shopIDs().isEmpty()) { return Result.error("Missing shop IDs"); } - log.info("Specified shop IDs : " + param.shopIDs()); + log.info("Specified shop IDs : {}", param.shopIDs()); lambdaQueryWrapper.in(PlatformOrder::getShopId, param.shopIDs()); lambdaQueryWrapper.isNull(PlatformOrder::getShippingInvoiceNumber); if(param.getErpStatuses() != null) { - log.info("Specified erpStatuses : " + param.getErpStatuses()); + log.info("Specified erpStatuses : {}", param.getErpStatuses()); lambdaQueryWrapper.in(PlatformOrder::getErpStatus, param.getErpStatuses()); } lambdaQueryWrapper.inSql(PlatformOrder::getId, "SELECT id FROM platform_order po WHERE po.order_time between '" + param.getStart() + "' AND '" + param.getEnd() + "'" ); @@ -516,24 +507,54 @@ public class InvoiceController { * @return A triplet of order, shipping invoice availability and purchase invoice availability */ @GetMapping(value = "/preShipping/ordersStatusByShops") - public Result getOrdersStatusByShops(@RequestParam("shopIds") String shopIds) { + public Result getOrdersStatusByShops(@RequestParam("shopIds") String shopIds, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "50") Integer pageSize, + @RequestParam(name = "column", defaultValue = "order_time") String column, + @RequestParam(name = "order", defaultValue = "ASC") String order) { log.info("User : {} is requesting uninvoiced orders for shops : [{}]", ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(), shopIds); - + String parsedColumn = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, column.replace("_dictText","")); + String parsedOrder = order.toUpperCase(); + if(!parsedOrder.equals("ASC") && !parsedOrder.equals("DESC")) { + return Result.error("Error 400 Bad Request"); + } + try { + specialFilterContentForDictSql(parsedColumn); + } + catch (RuntimeException e) { + e.printStackTrace(); + return Result.error("Error 400 : Bad Request"); + } // checking shipping data availability List shopIdList = Arrays.asList(shopIds.split(",")); - // fetch order that can be invoice either by shipping or purchase or both - List orders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1)); + // fetch order that can be invoiced either by shipping or purchase or both + LinkedList allOrders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, 1, -1); + int total = allOrders.size(); + LinkedList orders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, pageNo, pageSize); +// LinkedList sortedOrders = orders.stream().sorted(Comparator.comparing(PlatformOrder::getOrderTime)).collect(Collectors.toCollection(LinkedList::new)); if(orders.isEmpty()) return Result.OK("No order to invoice."); Map shops = shopService.listByIds(shopIdList).stream().collect(Collectors.toMap(Shop::getId, Shop::getName)); List orderIds = orders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); Map> orderContentMap = platformOrderService.fetchOrderData(orderIds); + // some orders may not have content, so we have to re-add them + if(orderIds.size() != orderContentMap.size()) { + List orderIdsInMap = orderContentMap.keySet().stream().map(PlatformOrder::getId).collect(Collectors.toList()); + List orderIdsWithoutContent = orderIds.stream().filter(id -> !orderIdsInMap.contains(id)).collect(Collectors.toList()); + List ordersWithoutContent = platformOrderService.listByIds(orderIdsWithoutContent); + Map> orderContentMapWithoutContent = new HashMap<>(); + for(PlatformOrder po : ordersWithoutContent) { + orderContentMapWithoutContent.put(po, new ArrayList<>()); + } + orderContentMap.putAll(orderContentMapWithoutContent); + } Map errorMapToOrderId = new HashMap<>(); List orderFronts = new ArrayList<>(); + int tmpCpt = 0; for(Map.Entry> entry : orderContentMap.entrySet()) { PlatformOrderFront orderFront = new PlatformOrderFront(); BeanUtils.copyProperties(entry.getKey(), orderFront); @@ -543,6 +564,18 @@ public class InvoiceController { // set default value of shipping and purchase availability orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Available.code); orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Available.code); + + if(entry.getValue().isEmpty()) { + if(!errorMapToOrderId.containsKey(entry.getKey().getPlatformOrderId())) + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : order has no content : " + entry.getKey().getPlatformOrderId()); + else + errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and has no content"); + orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFronts.add(orderFront); + continue; + } + List skuIds = entry.getValue().stream().map(PlatformOrderContent::getSkuId).distinct().collect(Collectors.toList()); // finds the first sku that isn't in db List skuIdsFound = skuService.listByIds(skuIds); @@ -554,6 +587,7 @@ public class InvoiceController { orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + continue; } if(entry.getKey().getShippingInvoiceNumber() == null) { @@ -646,7 +680,9 @@ public class InvoiceController { IPage page = new Page<>(); page.setRecords(orderFronts); - page.setTotal(orderFronts.size()); + page.setSize(pageSize); + page.setCurrent(pageNo); + page.setTotal(total); return Result.OK(page); } @@ -661,11 +697,11 @@ public class InvoiceController { public Result getOrdersBetweenDates(PlatformOrder platformOrder, @RequestBody ShippingInvoiceParam param, HttpServletRequest req) { QueryWrapper queryWrapper = QueryGenerator.initQueryWrapper(platformOrder, req.getParameterMap()); LambdaQueryWrapper lambdaQueryWrapper = queryWrapper.lambda(); - log.info("Requesting orders for : " + param.toString()); + log.info("Requesting orders for : {}", param.toString()); if (param.shopIDs() == null || param.shopIDs().isEmpty()) { return Result.error("Missing shop IDs"); } - log.info("Specified shop IDs : " + param.shopIDs()); + log.info("Specified shop IDs : {}", param.shopIDs()); lambdaQueryWrapper.in(PlatformOrder::getShopId, param.shopIDs()); lambdaQueryWrapper.isNull(PlatformOrder::getShippingInvoiceNumber); lambdaQueryWrapper.inSql(PlatformOrder::getId, "SELECT id FROM platform_order po WHERE po.erp_status = '3' AND po.shipping_time between '" + param.getStart() + "' AND '" + param.getEnd() + "'" ); @@ -897,14 +933,20 @@ public class InvoiceController { * @param param Parameters for creating a pre-shipping invoice * @return One ShippingFeesEstimation */ - @PostMapping(value = "/selfEstimateFees") - public Result getPurchaseFeesEstimateByOrders(@RequestBody ShippingInvoiceOrderParam param) { + @PostMapping(value = "/completeFeesEstimation") + public Result getCompleteFeesEstimation(@RequestBody ShippingInvoiceOrderParam param) { + boolean isEmployee = securityService.checkIsEmployee(); String currency = clientService.getById(param.clientID()).getCurrency(); List orders = platformOrderMapper.fetchByIds(param.orderIds()); Map> ordersMapByShop = orders.stream().collect(Collectors.groupingBy(PlatformOrder::getShopId)); Map estimationsByShop = new HashMap<>(); for(Map.Entry> entry : ordersMapByShop.entrySet()) { String shopId = entry.getKey(); + String shop; + if(!isEmployee) + shop = shopService.getNameById(shopId); + else + shop = shopService.getCodeById(shopId); List orderIds = entry.getValue().stream().map(PlatformOrder::getId).collect(Collectors.toList()); ShippingInvoiceOrderParam finalParam = new ShippingInvoiceOrderParam(param.clientID(), orderIds, param.getType()); List errorMessages = new ArrayList<>(); @@ -912,6 +954,7 @@ public class InvoiceController { finalParam.orderIds(), errorMessages); if(shippingFeesEstimations.isEmpty()) return Result.OK("No estimation found."); + String internalCode = shippingFeesEstimations.get(0).getCode(); // purchase estimation // only calculate purchase estimation if products are not available and purchaseInvoiceNumber is null, else it's already been paid @@ -921,25 +964,37 @@ public class InvoiceController { && order.getPurchaseInvoiceNumber() == null && order.getVirtualProductAvailable().equals("0")) .map(PlatformOrder::getId).collect(Collectors.toList()); + BigDecimal shippingFeesEstimation = BigDecimal.ZERO; BigDecimal purchaseEstimation = BigDecimal.ZERO; + int ordersToProccess = 0; + int processedOrders = 0; boolean isCompleteInvoiceReady = true; + for(ShippingFeesEstimation estimation: shippingFeesEstimations) { shippingFeesEstimation = shippingFeesEstimation.add(estimation.getDueForProcessedOrders()); + ordersToProccess += estimation.getOrdersToProcess(); + processedOrders += estimation.getProcessedOrders(); } if(!orderIdsWithProductUnavailable.isEmpty()) { List orderContents = platformOrderContentMap.fetchOrderContent(orderIdsWithProductUnavailable); List skuIds = orderContents.stream().map(PlatformOrderContent::getSkuId).collect(Collectors.toList()); List skuPrices = platformOrderContentMap.searchSkuPrice(skuIds); BigDecimal exchangeRateEurToRmb = exchangeRatesMapper.getLatestExchangeRate("EUR", "RMB"); - if(skuPrices.size() != skuIds.size()) { - isCompleteInvoiceReady = false; - errorMessages.add("Some sku prices are missing."); + for(SkuPrice skuPrice : skuPrices) { + if(skuPrice.getPrice() == null) { + isCompleteInvoiceReady = false; + errorMessages.add("Some sku prices are missing."); + break; + } } for(PlatformOrderContent content : orderContents){ for (SkuPrice skuPrice : skuPrices) { if(content.getSkuId().equals(skuPrice.getSkuId())) { - purchaseEstimation = purchaseEstimation.add(skuPrice.getPrice(content.getQuantity(), exchangeRateEurToRmb)); + BigDecimal price = skuPrice.getPrice(content.getQuantity(), exchangeRateEurToRmb); + price = price.multiply(new BigDecimal(content.getQuantity())); + purchaseEstimation = purchaseEstimation.add(price); + break; } } } @@ -952,9 +1007,9 @@ public class InvoiceController { purchaseEstimation = purchaseEstimation.multiply(exchangeRate).setScale(2, RoundingMode.CEILING); shippingFeesEstimation = shippingFeesEstimation.multiply(exchangeRate).setScale(2, RoundingMode.CEILING); } - log.info("Purchase Fee " + currency + " : " + purchaseEstimation); - log.info("Shipping Fee " + currency + " : " + shippingFeesEstimation); - estimationsByShop.put(shopId, new Estimation(shippingFeesEstimation, purchaseEstimation, currency, errorMessages, Collections.singletonList(shopId), "", "", isCompleteInvoiceReady)); + log.info("Purchase Fee {} : {}", currency, purchaseEstimation); + log.info("Shipping Fee {} : {}", currency, shippingFeesEstimation); + estimationsByShop.put(shopId, new Estimation(internalCode, ordersToProccess, processedOrders, shippingFeesEstimation, purchaseEstimation, currency, errorMessages, shop, Collections.singletonList(shopId), "", "", isCompleteInvoiceReady, orderIds)); } // return list of estimation by shop return Result.ok(estimationsByShop); @@ -962,9 +1017,8 @@ public class InvoiceController { @GetMapping(value = "/checkInvoiceValidity") public Result checkInvoiceValidity(@RequestParam("invoiceNumber") String invoiceNumber) { - String companyOrgCode = sysDepartService.queryCodeByDepartName(env.getProperty("company.orgName")); + boolean isEmployee = securityService.checkIsEmployee(); LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); - String orgCode = sysUser.getOrgCode(); String email = sysUser.getEmail(); String invoiceID; String customerFullName; @@ -985,7 +1039,7 @@ public class InvoiceController { client = clientService.getClientFromPurchase(invoiceID); customerFullName = client.fullName(); String destEmail; - if(!orgCode.equals(companyOrgCode)) { + if(!isEmployee) { log.info("User {} is trying to access invoice {} from client {}", sysUser.getUsername(), invoiceNumber, client.getInternalCode()); Client userClient = userClientService.getClientByUserId(sysUser.getId()); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java index 42416eae4..89c933f36 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/client/TransactionController.java @@ -93,10 +93,14 @@ public class TransactionController { List errorMessages = new ArrayList<>(); List shopIds = shopService.listIdByClient(clientId); List shippingOrders = platformOrderService.findUninvoicedShippingOrdersByShopForClient(shopIds, Arrays.asList(1,2,3)); + List orderIds = shippingOrders.stream().map(PlatformOrder::getId).collect(Collectors.toList()); Date startDate = null; Date endDate = null; List shippingFeesEstimations; BigDecimal shippingFeesEstimation = BigDecimal.ZERO; + String internalCode = ""; + int ordersToProcess = 0; + int processedOrders = 0; if(!shippingOrders.isEmpty()) { startDate = shippingOrders.stream().map(PlatformOrder::getOrderTime).min(Date::compareTo).get(); endDate = shippingOrders.stream().map(PlatformOrder::getOrderTime).max(Date::compareTo).get(); @@ -109,7 +113,10 @@ public class TransactionController { shippingFeesEstimations = factory.getEstimations(clientId, shippingOrderIds, errorMessages); for (ShippingFeesEstimation estimation : shippingFeesEstimations) { shippingFeesEstimation = shippingFeesEstimation.add(estimation.getDueForProcessedOrders()); + ordersToProcess += estimation.getOrdersToProcess(); + processedOrders += estimation.getProcessedOrders(); } + internalCode = shippingFeesEstimations.get(0).getCode(); } // purchase estimation @@ -160,8 +167,8 @@ public class TransactionController { shippingFeesEstimation = shippingFeesEstimation.multiply(exchangeRate).setScale(2, RoundingMode.CEILING); } - log.info("Purchase Fee " + currency + " : " + purchaseEstimation); - log.info("Shipping Fee " + currency + " : " + shippingFeesEstimation); + log.info("Purchase Fee {} : {}", currency, purchaseEstimation); + log.info("Shipping Fee {} : {}", currency, shippingFeesEstimation); // system notification String errors = SECTION_START; int max_entries = 100; @@ -184,6 +191,6 @@ public class TransactionController { ISysBaseApi.sendTemplateAnnouncement(message); } } - return Result.ok(new Estimation(shippingFeesEstimation, purchaseEstimation, currency, errorMessages, shopIds, new DateTime(startDate).toString(), new DateTime(endDate).toString(), isCompleteInvoiceReady)); + return Result.ok(new Estimation(internalCode, ordersToProcess, processedOrders, shippingFeesEstimation, purchaseEstimation, currency, errorMessages,null, shopIds, new DateTime(startDate).toString(), new DateTime(endDate).toString(), isCompleteInvoiceReady, orderIds)); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeWarehouseRequestBody.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeWarehouseRequestBody.java index b27eb57ca..30cac8bab 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeWarehouseRequestBody.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeWarehouseRequestBody.java @@ -7,6 +7,7 @@ import lombok.Setter; import org.jeecg.modules.business.domain.api.mabang.RequestBody; import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order; import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderItem; +import org.jeecg.modules.business.vo.PlatformOrderOperation; import java.util.function.Function; @@ -20,6 +21,7 @@ public class ChangeWarehouseRequestBody implements RequestBody { private String recipient; private String street1; private String street2; + private String phone; public ChangeWarehouseRequestBody(Order order, String warehouseName) { this.platformOrderId = order.getPlatformOrderId(); @@ -27,8 +29,16 @@ public class ChangeWarehouseRequestBody implements RequestBody { this.recipient = order.getRecipient(); this.street1 = order.getAddress(); this.street2 = order.getAddress2(); + this.phone = order.getPhone1(); this.order = order; } + public ChangeWarehouseRequestBody(PlatformOrderOperation order) { + this.setOrderId(order.getOrderIds()); + this.recipient = order.getRecipient(); + this.street1 = order.getStreet1(); + this.street2 = order.getStreet2(); + this.phone = order.getPhone(); + } @Override public String api() { @@ -43,6 +53,9 @@ public class ChangeWarehouseRequestBody implements RequestBody { putNonNull(json, "buyerName", recipient); putNonNull(json, "street1", street1); putNonNull(json, "street2", street2); + putNonNull(json, "phone1", phone); + if(order == null) + return json; if(order.getOrderItems() != null && !order.getOrderItems().isEmpty()) { for(OrderItem orderItem : order.getOrderItems()) { if(!isSkuValidFormat(orderItem.getErpCode())) @@ -72,4 +85,8 @@ public class ChangeWarehouseRequestBody implements RequestBody { json.put(key, mapper.apply(value)); } } + public void setOrderId(String orderId) { + // clean string from spaces, comas and quotes + this.platformOrderId = orderId.replaceAll("[,\\s\"]", ""); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ChangeWarehouseJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ChangeWarehouseJob.java index d47cf2dd8..cbd12ceb9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ChangeWarehouseJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/ChangeWarehouseJob.java @@ -10,6 +10,7 @@ import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendRequest; import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendRequestBody; import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendResponse; +import org.jeecg.modules.business.service.IPlatformOrderMabangService; import org.jeecg.modules.business.service.IPlatformOrderService; import org.jeecg.modules.business.vo.Responses; import org.quartz.Job; @@ -18,14 +19,12 @@ import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.beans.factory.annotation.Autowired; -import java.text.Normalizer; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static java.util.stream.Collectors.toList; @@ -34,6 +33,8 @@ import static java.util.stream.Collectors.toList; public class ChangeWarehouseJob implements Job { @Autowired private IPlatformOrderService platformOrderService; + @Autowired + private IPlatformOrderMabangService platformOrderMabangService; private static final Integer DEFAULT_NUMBER_OF_DAYS = 5; private static final Integer DEFAULT_NUMBER_OF_THREADS = 10; @@ -179,14 +180,9 @@ public class ChangeWarehouseJob implements Job { } public void replaceOrdersAccents(List orders) { for(Order order: orders) { - order.setRecipient(stripAccents(order.getRecipient())); - order.setAddress(stripAccents(order.getAddress())); - order.setAddress2(stripAccents(order.getAddress2())); + order.setRecipient(platformOrderMabangService.stripAccents(order.getRecipient())); + order.setAddress(platformOrderMabangService.stripAccents(order.getAddress())); + order.setAddress2(platformOrderMabangService.stripAccents(order.getAddress2())); } } - public String stripAccents(String input) { - input = Normalizer.normalize(input, Normalizer.Form.NFD); - input = input.replaceAll("[^\\p{ASCII}]", ""); - return input; - } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/RemoveVirtualProductJob.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/RemoveVirtualProductJob.java index d9e9e80c4..a78771114 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/RemoveVirtualProductJob.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/job/RemoveVirtualProductJob.java @@ -9,6 +9,7 @@ import org.codehaus.jettison.json.JSONObject; import org.jeecg.modules.business.domain.api.mabang.dochangeorder.*; import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; import org.jeecg.modules.business.entity.PlatformOrder; +import org.jeecg.modules.business.service.IPlatformOrderMabangService; import org.jeecg.modules.business.service.IPlatformOrderService; import org.quartz.Job; import org.quartz.JobDataMap; @@ -34,6 +35,8 @@ public class RemoveVirtualProductJob implements Job { @Autowired private IPlatformOrderService platformOrderService; + @Autowired + private IPlatformOrderMabangService platformOrderMabangService; @Override public void execute(JobExecutionContext context) throws JobExecutionException { @@ -88,28 +91,8 @@ public class RemoveVirtualProductJob implements Job { 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()); - log.info("{}/{} mabang orders have been retrieved.", mabangOrders.size(), platformOrderIds.size()); + List mabangOrders = platformOrderMabangService.getOrdersFromMabang(requests, executor); log.info("Constructing virtual SKU removal requests"); List ordersWithLogistic = new ArrayList<>(); @@ -139,17 +122,7 @@ public class RemoveVirtualProductJob implements Job { log.info("{} virtual SKU removal requests to be sent to MabangAPI", removeSkuRequests.size()); // First we delete the logistic channel names, otherwise we can't delete virtual skus - List> clearLogisticFutures = ordersWithLogistic.stream() - .map(orderWithLogistic -> CompletableFuture.supplyAsync(() -> { - ClearLogisticRequestBody body = new ClearLogisticRequestBody(orderWithLogistic.getPlatformOrderId()); - ClearLogisticRequest request = new ClearLogisticRequest(body); - ClearLogisticResponse response = request.send(); - return response.success(); - }, executor)) - .collect(Collectors.toList()); - List logisticResults = clearLogisticFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); - long logisticClearSuccessCount = logisticResults.stream().filter(b -> b).count(); - log.info("{}/{} logistic channel names cleared successfully.", logisticClearSuccessCount, ordersWithLogistic.size()); + platformOrderMabangService.clearLogisticChannel(ordersWithLogistic, executor); List> removeSkuFutures = removeSkuRequests.stream() .map(removeSkuRequestBody -> CompletableFuture.supplyAsync(() -> { @@ -164,8 +137,8 @@ public class RemoveVirtualProductJob implements Job { return success; }, executor)) .collect(Collectors.toList()); - results = removeSkuFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); - nbSuccesses = results.stream().filter(b -> b).count(); + List results = removeSkuFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); + long nbSuccesses = results.stream().filter(b -> b).count(); log.info("{}/{} virtual SKU removal requests have succeeded.", nbSuccesses, removeSkuRequests.size()); } } 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 9dba40b02..afa8c16b9 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 @@ -102,39 +102,6 @@ public class ShippingInvoice implements Serializable { @ApiModelProperty(value = "currency ID") private java.lang.String currencyId; - public void setID(String id) { - this.id = id; - } - public void setCreateBy(String user) { - this.createBy = user; - } - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - public void setUpdateBy(String updateBy) { - this.updateBy = updateBy; - } - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } - public void setClientI(String clientId) { - this.clientId = clientId; - } - public void setInvoiceNumber(String invoiceNumber) { - this.invoiceNumber = invoiceNumber; - } - public void setTotalAmount(java.math.BigDecimal totalAmount) { - this.totalAmount = totalAmount; - } - public void setDiscountAmount(java.math.BigDecimal discountAmount) { - this.discountAmount = discountAmount; - } - public void setFinalAmount(java.math.BigDecimal finalAmount) { - this.finalAmount = finalAmount; - } - public void setPaidAmount(java.math.BigDecimal paidAmount) { - this.paidAmount = paidAmount; - } public ShippingInvoice() { // this.id = null; // this.createBy = null; 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 30ffdbd0c..656139756 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 @@ -13,10 +13,7 @@ import org.jeecg.modules.business.vo.clientPlatformOrder.section.OrderQuantity; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @Description: 平台订单表 @@ -193,7 +190,8 @@ public interface PlatformOrderMapper extends BaseMapper { List findUninvoicedShippingOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List fetchUninvoicedPurchaseOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); - List findUninvoicedOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); + LinkedList findUninvoicedOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses, + @Param("column") String column, @Param("order") String order, @Param("offset") Integer offset, @Param("size") Integer pageSize); List findUninvoicedOrderIdsByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List fetchEmptyLogisticChannelOrders(@Param("startDate") String startDate,@Param("endDate") String endDate); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShopMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShopMapper.java index 61af732ce..b21b81299 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShopMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/ShopMapper.java @@ -24,4 +24,8 @@ public interface ShopMapper extends BaseMapper { List selectShopIdByClient(@Param("clientID") String clientID); List getShopIdsByClientAndType(@Param("clientIds") List clientIds, @Param("type") String clientType); + + String getNameById(@Param("shopId") String shopId); + + String getCodeById(@Param("shopId") String shopId); } 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 0d7681bb5..e079bb505 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 @@ -334,7 +334,7 @@ ); INSERT INTO platform_order_delete(id, create_by, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShopMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShopMapper.xml index d5c3bbd73..a55f5f0c9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShopMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/ShopMapper.xml @@ -35,4 +35,14 @@ AND cc.name = #{type} + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java index cd6e542b8..414cf78c8 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderMabangService.java @@ -2,11 +2,13 @@ package org.jeecg.modules.business.service; import com.baomidou.mybatisplus.extension.service.IService; import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order; +import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderListRequestBody; import org.jeecg.modules.business.vo.PlatformOrderOperation; import org.jeecg.modules.business.vo.Responses; import java.util.Collection; import java.util.List; +import java.util.concurrent.ExecutorService; /** * Services related to operations on {@code Order} entity @@ -32,4 +34,10 @@ public interface IPlatformOrderMabangService extends IService { Responses suspendOrder(PlatformOrderOperation orderOperation); Responses cancelOrders(PlatformOrderOperation orderOperation); + + List getOrdersFromMabang(List requests, ExecutorService executor); + + void clearLogisticChannel(List orders, ExecutorService executor); + + String stripAccents(String input); } 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 fdd185cf7..70d830d10 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 @@ -16,10 +16,7 @@ import org.jeecg.modules.business.vo.clientPlatformOrder.section.OrdersStatistic import java.io.Serializable; import java.time.LocalDateTime; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @Description: 平台订单表 @@ -205,9 +202,13 @@ public interface IPlatformOrderService extends IService { * Find all order that can be invoiced (shipping and purchase). * @param shopIds * @param erpStatuses + * @param column + * @param order + * @param pageNo + * @param pageSize * @return */ - List findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses); + LinkedList findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize); /** * Get ids of all order that can be invoiced by small clients (type 2) themselves. * @param shopIds list of shop id diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISecurityService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISecurityService.java new file mode 100644 index 000000000..6e9ab218e --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISecurityService.java @@ -0,0 +1,5 @@ +package org.jeecg.modules.business.service; + +public interface ISecurityService { + boolean checkIsEmployee(); +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShopService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShopService.java index 2234e76ea..a73eca7b8 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShopService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IShopService.java @@ -18,4 +18,8 @@ public interface IShopService extends IService { List listIdByClient(String clientID); List getShopIdsByClientAndType(List clientIds, String clientType); + + String getNameById(String shopId); + + String getCodeById(String shopId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java index bda7348c9..17555acd1 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderMabangServiceImpl.java @@ -4,12 +4,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.vo.LoginUser; -import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderRequest; -import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderRequestBody; -import org.jeecg.modules.business.domain.api.mabang.dochangeorder.ChangeOrderResponse; -import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order; -import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderItem; -import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderStatus; +import org.jeecg.modules.business.domain.api.mabang.dochangeorder.*; +import org.jeecg.modules.business.domain.api.mabang.getorderlist.*; import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendRequest; import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendRequestBody; import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendResponse; @@ -23,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.text.Normalizer; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -267,7 +264,64 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl orders) { + /** + * + * @param requests List + * @param executor ExecutorService + * @return orders retrieved from mabang + */ + @Override + public List getOrdersFromMabang(List requests, ExecutorService executor) { + List mabangOrders = new ArrayList<>(); + + 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()); + log.info("{}/{} mabang orders have been retrieved.", mabangOrders.size(), requests.size()); + return mabangOrders; } + + /** + * Sends a request to clear orders Logistic Channel to Mabang + * (usually it is called upon modifying an order) + * @param orders List + * @param executor Executor Service + */ + @Override + public void clearLogisticChannel(List orders, ExecutorService executor) { + // First we delete the logistic channel names, otherwise we can't delete virtual skus + List> clearLogisticFutures = orders.stream() + .map(order -> CompletableFuture.supplyAsync(() -> { + ClearLogisticRequestBody body = new ClearLogisticRequestBody(order.getPlatformOrderId()); + ClearLogisticRequest request = new ClearLogisticRequest(body); + ClearLogisticResponse response = request.send(); + return response.success(); + }, executor)) + .collect(Collectors.toList()); + List logisticResults = clearLogisticFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); + long logisticClearSuccessCount = logisticResults.stream().filter(b -> b).count(); + log.info("{}/{} logistic channel names cleared successfully.", logisticClearSuccessCount, orders.size()); + } + @Override + public String stripAccents(String input) { + input = Normalizer.normalize(input, Normalizer.Form.NFD); + input = input.replaceAll("[^\\p{ASCII}]", ""); + return input; + } } 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 b898bd59d..67efcb1ba 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 @@ -429,8 +429,9 @@ public class PlatformOrderServiceImpl extends ServiceImpl findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses) { - return platformOrderMap.findUninvoicedOrdersByShopForClient(shopIds, erpStatuses); + public LinkedList findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize) { + int offset = (pageNo - 1) * pageSize; + return platformOrderMap.findUninvoicedOrdersByShopForClient(shopIds, erpStatuses, column, order, offset, pageSize); } @Override diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SecurityServiceImp.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SecurityServiceImp.java new file mode 100644 index 000000000..addf4e5b0 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SecurityServiceImp.java @@ -0,0 +1,24 @@ +package org.jeecg.modules.business.service.impl; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.jeecg.common.system.vo.LoginUser; +import org.jeecg.modules.business.service.ISecurityService; +import org.jeecg.modules.system.service.ISysDepartService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class SecurityServiceImp implements ISecurityService { + @Autowired private ISysDepartService sysDepartService; + @Autowired private Environment env; + + @Override + public boolean checkIsEmployee() { + String companyOrgCode = sysDepartService.queryCodeByDepartName(env.getProperty("company.orgName")); + LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); + return sysUser.getOrgCode().equals(companyOrgCode); + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShopServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShopServiceImpl.java index 4dfb38de8..bac2d1635 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShopServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ShopServiceImpl.java @@ -38,4 +38,14 @@ public class ShopServiceImpl extends ServiceImpl implements IS public List getShopIdsByClientAndType(List clientIds, String clientType) { return shopMapper.getShopIdsByClientAndType(clientIds, clientType); } + + @Override + public String getNameById(String shopId) { + return shopMapper.getNameById(shopId); + } + + @Override + public String getCodeById(String shopId) { + return shopMapper.getCodeById(shopId); + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/Estimation.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/Estimation.java index 94df806c3..c5b30b98c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/Estimation.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/Estimation.java @@ -9,32 +9,47 @@ import java.util.List; @Data public class Estimation { + private String code; + private Integer ordersToProcess; + private Integer processedOrders; private BigDecimal shippingFeesEstimation; private BigDecimal purchaseEstimation; private BigDecimal totalEstimation; private String currency; private List errorMessages; + private String shop = ""; private List shopIds; private String startDate; private String endDate; private boolean isCompleteInvoiceReady; - - public Estimation(@JsonProperty("shippingFeesEstimation") BigDecimal shippingFeesEstimation, + private List orderIds; + public Estimation(@JsonProperty("code") String code, + @JsonProperty("ordersToProcess") Integer ordersToProcess, + @JsonProperty("processedOrders") Integer processedOrders, + @JsonProperty("shippingFeesEstimation") BigDecimal shippingFeesEstimation, @JsonProperty("purchaseEstimation") BigDecimal purchaseEstimation, @JsonProperty("currency") String currency, @JsonProperty("errorMessages") List errorMessages, - @JsonProperty("orderIds") List shopIds, + @JsonProperty("shop") String shop, + @JsonProperty("shopIds") List shopIds, @JsonProperty("startDate") String startDate, @JsonProperty("endDate") String endDate, - @JsonProperty("isCompleteInvoiceReady") boolean isCompleteInvoiceReady) { + @JsonProperty("isCompleteInvoiceReady") boolean isCompleteInvoiceReady, + @JsonProperty("orderIds") List orderIds + ) { + this.code = code; + this.ordersToProcess = ordersToProcess; + this.processedOrders = processedOrders; this.currency = currency; this.purchaseEstimation = purchaseEstimation; this.shippingFeesEstimation = shippingFeesEstimation; this.errorMessages = errorMessages; + this.shop = shop; this.shopIds = shopIds; this.startDate = startDate; this.endDate = endDate; this.isCompleteInvoiceReady = isCompleteInvoiceReady; + this.orderIds = orderIds; totalEstimation = shippingFeesEstimation.add(purchaseEstimation).setScale(2, RoundingMode.CEILING); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderOperation.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderOperation.java index 4d6a2283f..abee921bb 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderOperation.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/vo/PlatformOrderOperation.java @@ -13,10 +13,19 @@ public class PlatformOrderOperation { private String action; @JSONField(name = "reason") private String reason; + @JSONField(name = "recipient") + private String recipient; + @JSONField(name = "phone") + private String phone; + @JSONField(name = "street1") + private String street1; + @JSONField(name = "street2") + private String street2; public enum Action { CANCEL("cancel"), - SUSPEND("suspend"); + SUSPEND("suspend"), + EDIT("edit"); private final String action; diff --git a/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl b/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl index eae9071cf..c41d01daf 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl +++ b/jeecg-module-system/jeecg-system-biz/src/main/resources/templates/client/orderManagementNotification.ftl @@ -37,6 +37,22 @@ + <#if editSuccessCount??> + + Demandes de modification d'informations de commande : ${editSuccessCount} réussie(s) + + <#if editFailures?size gt 0 > + + Demandes de modification de commande échouées :
+
    + <#list editFailures as failure> +
  • ${failure}
  • + +
+ + + + Pour toute information complémentaire nous vous invitons à vous rapprocher de votre conseiller. diff --git a/pom.xml b/pom.xml index 18263d7fb..a14bae4b5 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 org.jeecgframework.boot jeecg-boot-parent - 2.2.0 + 3.6.3 pom WIA APP ${project.version} From af3540274c4956e6ed34148b3437666b14ca78df Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Fri, 28 Jun 2024 17:03:56 +0200 Subject: [PATCH 2/3] cleanup --- .../shippingInvoice/InvoiceController.java | 32 +++++++++---------- .../business/mapper/PlatformOrderMapper.java | 2 +- .../service/IPlatformOrderService.java | 2 +- .../impl/PlatformOrderServiceImpl.java | 2 +- 4 files changed, 19 insertions(+), 19 deletions(-) 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 a3ce2a3a5..913f2b3af 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 @@ -57,6 +57,7 @@ import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDict import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; import static org.jeecg.modules.business.entity.Task.TaskCode.SI_G; import static org.jeecg.modules.business.entity.TaskHistory.TaskStatus.*; +import static org.jeecg.modules.business.vo.PlatformOrderFront.invoiceStatus.*; /** * Controller for request related to shipping invoice @@ -530,9 +531,9 @@ public class InvoiceController { // checking shipping data availability List shopIdList = Arrays.asList(shopIds.split(",")); // fetch order that can be invoiced either by shipping or purchase or both - LinkedList allOrders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, 1, -1); + List allOrders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, 1, -1); int total = allOrders.size(); - LinkedList orders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, pageNo, pageSize); + List orders = platformOrderService.findUninvoicedOrdersByShopForClient(shopIdList, Collections.singletonList(1), parsedColumn, parsedOrder, pageNo, pageSize); // LinkedList sortedOrders = orders.stream().sorted(Comparator.comparing(PlatformOrder::getOrderTime)).collect(Collectors.toCollection(LinkedList::new)); if(orders.isEmpty()) return Result.OK("No order to invoice."); @@ -554,7 +555,6 @@ public class InvoiceController { Map errorMapToOrderId = new HashMap<>(); List orderFronts = new ArrayList<>(); - int tmpCpt = 0; for(Map.Entry> entry : orderContentMap.entrySet()) { PlatformOrderFront orderFront = new PlatformOrderFront(); BeanUtils.copyProperties(entry.getKey(), orderFront); @@ -562,16 +562,16 @@ public class InvoiceController { //rename shop id by shop name to prevent it to leak in front orderFront.setShopId(shops.get(orderFront.getShopId())); // set default value of shipping and purchase availability - orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Available.code); - orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Available.code); + orderFront.setShippingAvailable(Available.code); + orderFront.setPurchaseAvailable(Available.code); if(entry.getValue().isEmpty()) { if(!errorMapToOrderId.containsKey(entry.getKey().getPlatformOrderId())) errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : order has no content : " + entry.getKey().getPlatformOrderId()); else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and has no content"); - orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); - orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFront.setShippingAvailable(Unavailable.code); + orderFront.setPurchaseAvailable(Unavailable.code); orderFronts.add(orderFront); continue; } @@ -585,8 +585,8 @@ public class InvoiceController { else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing one or more sku in db"); - orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); - orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFront.setShippingAvailable(Unavailable.code); + orderFront.setPurchaseAvailable(Unavailable.code); continue; } @@ -597,7 +597,7 @@ public class InvoiceController { errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing logistic channel for order : " + entry.getKey().getPlatformOrderId()); else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing logistic channel"); - orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFront.setShippingAvailable(Unavailable.code); } // finds the first product with missing weight String missingWeightProductId = productService.searchFirstEmptyWeightProduct(skuIds); @@ -606,7 +606,7 @@ public class InvoiceController { errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing one or more weight for order : " + entry.getKey().getPlatformOrderId()); else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing weight"); - orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFront.setShippingAvailable(Unavailable.code); } } if(entry.getKey().getPurchaseInvoiceNumber() == null) { @@ -617,7 +617,7 @@ public class InvoiceController { errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), "Error : Missing one or more sku price for order : " + entry.getKey().getPlatformOrderId()); else errorMapToOrderId.put(entry.getKey().getPlatformOrderId(), errorMapToOrderId.get(entry.getKey().getPlatformOrderId()) + " and missing one or more sku price"); - orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Unavailable.code); + orderFront.setPurchaseAvailable(Unavailable.code); } } @@ -634,18 +634,18 @@ public class InvoiceController { if(entry.getKey().getPurchaseInvoiceNumber() != null) { PurchaseOrder purchase = purchaseOrderService.getPurchaseByInvoiceNumber(entry.getKey().getPurchaseInvoiceNumber()); if(purchase.getPaidAmount().compareTo(BigDecimal.ZERO) == 0) - orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Invoiced.code);// invoiced + orderFront.setPurchaseAvailable(Invoiced.code);// invoiced else - orderFront.setPurchaseAvailable(PlatformOrderFront.invoiceStatus.Paid.code);// paid + orderFront.setPurchaseAvailable(Paid.code);// paid } // set shipping order status (-1 = unavailable, 0 = available, 1 = invoiced, 2 = paid) if(entry.getKey().getShippingInvoiceNumber() != null) { ShippingInvoice shippingInvoice = iShippingInvoiceService.getShippingInvoice(entry.getKey().getShippingInvoiceNumber()); if(shippingInvoice.getPaidAmount().compareTo(BigDecimal.ZERO) == 0) { - orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Invoiced.code); // invoiced + orderFront.setShippingAvailable(Invoiced.code); // invoiced } else { - orderFront.setShippingAvailable(PlatformOrderFront.invoiceStatus.Paid.code); // paid + orderFront.setShippingAvailable(Paid.code); // paid } } orderFronts.add(orderFront); 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 656139756..b76e19a1b 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 @@ -190,7 +190,7 @@ public interface PlatformOrderMapper extends BaseMapper { List findUninvoicedShippingOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); List fetchUninvoicedPurchaseOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); - LinkedList findUninvoicedOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses, + List findUninvoicedOrdersByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses, @Param("column") String column, @Param("order") String order, @Param("offset") Integer offset, @Param("size") Integer pageSize); List findUninvoicedOrderIdsByShopForClient(@Param("shopIds") List shopIds, @Param("erpStatuses") List erpStatuses); 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 70d830d10..77760ca44 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 @@ -208,7 +208,7 @@ public interface IPlatformOrderService extends IService { * @param pageSize * @return */ - LinkedList findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize); + List findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize); /** * Get ids of all order that can be invoiced by small clients (type 2) themselves. * @param shopIds list of shop id 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 67efcb1ba..8c42f8a74 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 @@ -429,7 +429,7 @@ public class PlatformOrderServiceImpl extends ServiceImpl findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize) { + public List findUninvoicedOrdersByShopForClient(List shopIds, List erpStatuses, String column, String order, Integer pageNo, Integer pageSize) { int offset = (pageNo - 1) * pageSize; return platformOrderMap.findUninvoicedOrdersByShopForClient(shopIds, erpStatuses, column, order, offset, pageSize); } From 97793b76b4af5a63345c7c145cf3dc37bb80e163 Mon Sep 17 00:00:00 2001 From: Gauthier LO Date: Tue, 2 Jul 2024 14:35:21 +0200 Subject: [PATCH 3/3] feat: better pagination and new filter logic for skuOrderPage --- .../controller/admin/SkuController.java | 49 ++++++++- .../shippingInvoice/InvoiceController.java | 2 +- .../modules/business/mapper/SkuMapper.java | 5 +- .../modules/business/mapper/xml/SkuMapper.xml | 99 ++++++++++++++++++- .../modules/business/service/ISkuService.java | 5 +- .../business/service/impl/SkuServiceImpl.java | 38 ++++++- 6 files changed, 187 insertions(+), 11 deletions(-) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java index 473f48a17..7a64c65c5 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java @@ -3,6 +3,7 @@ package org.jeecg.modules.business.controller.admin; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.google.common.base.CaseFormat; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -33,6 +34,8 @@ import java.io.IOException; import java.util.*; import java.util.stream.Collectors; +import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDictSql; + /** * @Description: SKU表 * @Author: jeecg-boot @@ -343,13 +346,53 @@ public class SkuController { .collect(Collectors.toList()) ); } + @GetMapping("/skuListByClient") + public Result skusListByClient(@RequestParam("clientId") String clientId) { + List skus = skuService.listByClientId(clientId); + return Result.OK(skus); + } @GetMapping("/skusByClient") - public Result skusByClient(@RequestParam String clientId) { - List skuOrdersPage = skuService.fetchSkusByClient(clientId); + public Result skusByClient(@RequestParam(name = "clientId") String clientId, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "50") Integer pageSize, + @RequestParam(name = "column", defaultValue = "erp_code") String column, + @RequestParam(name = "order", defaultValue = "ASC") String order, + @RequestParam(name = "erpCodes", required = false) String erpCodes, + @RequestParam(name = "zhNames", required = false) String zhNames, + @RequestParam(name = "enNames", required = false) String enNames + ) { + String parsedColumn = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, column.replace("_dictText", "")); + String parsedOrder = order.toUpperCase(); + if(!parsedOrder.equals("ASC") && !parsedOrder.equals("DESC")) { + return Result.error("Error 400 Bad Request"); + } + try { + specialFilterContentForDictSql(parsedColumn); + } catch (RuntimeException e) { + return Result.error("Error 400 Bad Request"); + } + List allSkuOrdersPage = new ArrayList<>(); + List skuOrdersPage = new ArrayList<>(); + int total = 0; + if(erpCodes != null || zhNames != null || enNames != null) { + List erpCodeList = erpCodes == null ? null : Arrays.asList(erpCodes.split(",")); + List zhNameList = zhNames == null ? null : Arrays.asList(zhNames.split(",")); + List enNameList = enNames == null ? null : Arrays.asList(enNames.split(",")); + allSkuOrdersPage = skuService.fetchSkusByClientWithFilters(clientId, 1, -1, parsedColumn, parsedOrder, erpCodeList, zhNameList, enNameList); + skuOrdersPage = skuService.fetchSkusByClientWithFilters(clientId, pageNo, pageSize, parsedColumn, parsedOrder, erpCodeList, zhNameList, enNameList); + + } + else { + allSkuOrdersPage = skuService.fetchSkusByClient(clientId, 1, -1, parsedColumn, parsedOrder); + skuOrdersPage = skuService.fetchSkusByClient(clientId, pageNo, pageSize, parsedColumn, parsedOrder); + } + total = allSkuOrdersPage.size(); IPage page = new Page<>(); page.setRecords(skuOrdersPage); - page.setTotal(skuOrdersPage.size()); + page.setCurrent(pageNo); + page.setSize(pageSize); + page.setTotal(total); return Result.OK(page); } } 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 913f2b3af..e6b0d835d 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 @@ -508,7 +508,7 @@ public class InvoiceController { * @return A triplet of order, shipping invoice availability and purchase invoice availability */ @GetMapping(value = "/preShipping/ordersStatusByShops") - public Result getOrdersStatusByShops(@RequestParam("shopIds") String shopIds, + public Result getOrdersStatusByShops(@RequestParam(name = "shopIds") String shopIds, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "50") Integer pageSize, @RequestParam(name = "column", defaultValue = "order_time") String column, diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java index a853e6e62..1047e8685 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/SkuMapper.java @@ -54,7 +54,8 @@ public interface SkuMapper extends BaseMapper { List getSkuQuantitiesFromOrderIds(@Param("orderIds") List orderIds); - List fetchSkusByClient(@Param("clientId") String clientId); + List fetchSkusByClient(@Param("clientId") String clientId, @Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order); + List fetchSkusByClientWithFilters(@Param("clientId") String clientId, @Param("offset") Integer offset, @Param("size") Integer pageSize, @Param("column") String column, @Param("order") String order, @Param("erpCodes") String erpCodesRegex, @Param("zhNames") String zhNamesRegex, @Param("enNames") String enNamesRegex); String getIdFromErpCode(@Param("erpCode") String erpCode); @@ -65,4 +66,6 @@ public interface SkuMapper extends BaseMapper { void updateBatchStockByIds(@Param("skus") List skuToUpdate); List getInventoryByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber); + + List listByClientId(@Param("clientId") String clientId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml index 0b80bae6f..bcc68487f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/SkuMapper.xml @@ -160,7 +160,7 @@ JOIN shop s ON po.shop_id = s.id JOIN client c ON s.owner_id = c.id WHERE c.id = #{clientId} - AND po.erp_status IN ('1','2') + AND po.erp_status IN ('1','2') AND poc.erp_status IN ('1','2') GROUP BY sku_id ) @@ -208,7 +208,92 @@ LEFT JOIN sales_42 s42 ON s.id = s42.sku_id LEFT JOIN sales_7 s7 ON s.id = s7.sku_id LEFT JOIN qtyInOrdersNotShipped ON s.id = qtyInOrdersNotShipped.ID - WHERE client_sku.client_id = #{clientId}; + WHERE client_sku.client_id = #{clientId} + ORDER BY ${column} ${order} + + LIMIT #{offset}, #{size} + + ; + + + SELECT s.id, + s.erp_code, + p.en_name as productEn, + p.zh_name as product + FROM sku s + JOIN client_sku ON s.id = client_sku.sku_id + JOIN product p ON s.product_id = p.id + WHERE client_sku.client_id = #{clientId}; + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java index ecc8062f6..c981cee02 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/ISkuService.java @@ -95,12 +95,13 @@ public interface ISkuService extends IService { List getSkuQuantitiesFromOrderIds(List orderIds); - List fetchSkusByClient(String clientId); + List fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order); + List fetchSkusByClientWithFilters(String clientId, Integer pageNo, Integer pageSize, String column, String order, List erpCodes, List zhNames, List enNames); void addSkuQuantity(Map quantityPurchased); - String getIdFromErpCode(String erpCode); Sku getByErpCode(String erpCode); void updateBatchStockByIds(List skuToUpdate); List getInventoryByInvoiceNumber(String invoiceNumber); + List listByClientId(String clientId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java index 067a1794a..5be3da6e3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/SkuServiceImpl.java @@ -417,8 +417,37 @@ public class SkuServiceImpl extends ServiceImpl implements ISkuS } @Override - public List fetchSkusByClient(String clientId) { - return skuMapper.fetchSkusByClient(clientId); + public List fetchSkusByClient(String clientId, Integer pageNo, Integer pageSize, String column, String order) { + int offset = (pageNo - 1) * pageSize; + return skuMapper.fetchSkusByClient(clientId, offset, pageSize, column, order); + } + + @Override + public List fetchSkusByClientWithFilters(String clientId, Integer pageNo, Integer pageSize, String column, String order, List erpCodes, List zhNames, List enNames) { + int offset = (pageNo - 1) * pageSize; + StringBuilder erpCodesRegex= new StringBuilder(), zhNamesRegex = new StringBuilder(), enNamesRegex = new StringBuilder(); + if(erpCodes != null){ + erpCodesRegex.append("^"); + for(String name : erpCodes){ + erpCodesRegex.append("(?=.*").append(name).append(")"); + } + erpCodesRegex.append(".*"); + } + if(enNames != null){ + enNamesRegex.append("^"); + for(String name : enNames){ + enNamesRegex.append("(?=.*").append(name).append(")"); + } + enNamesRegex.append(".*"); + } + if(zhNames != null){ + zhNamesRegex.append("^"); + for(String name : zhNames){ + zhNamesRegex.append("(?=.*").append(name).append(")"); + } + zhNamesRegex.append(".*$"); + } + return skuMapper.fetchSkusByClientWithFilters(clientId, offset, pageSize, column, order, erpCodesRegex.toString(), zhNamesRegex.toString(), enNamesRegex.toString()); } @Override @@ -446,4 +475,9 @@ public class SkuServiceImpl extends ServiceImpl implements ISkuS return skuMapper.getInventoryByInvoiceNumber(invoiceNumber); } + @Override + public List listByClientId(String clientId) { + return skuMapper.listByClientId(clientId); + } + } \ No newline at end of file