diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java index 27adedf58..42130a11f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpStatus; import org.apache.shiro.SecurityUtils; import org.jeecg.common.api.vo.Result; import org.jeecg.common.aspect.annotation.AutoLog; @@ -14,6 +15,7 @@ import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.business.controller.UserException; +import org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder.UpdateResult; import org.jeecg.modules.business.domain.job.ThrottlingExecutorService; import org.jeecg.modules.business.entity.*; import org.jeecg.modules.business.service.*; @@ -45,8 +47,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; -import static org.jeecg.modules.business.entity.Invoice.isInvoiceNumber; - /** * @Description: API Handler related admin purchase order * @Author: Wenke @@ -208,6 +208,7 @@ public class PurchaseOrderController { @ApiOperation(value="purchase_order-编辑", notes="purchase_order-编辑") @RequestMapping(value = "/editPurchaseAndOrder", method = {RequestMethod.PUT,RequestMethod.POST}) public Result editPurchaseAndOrder(@RequestBody PurchaseOrderPage purchaseOrderPage) { + // TODO : refacto using Reponses PurchaseOrder purchaseOrder = new PurchaseOrder(); BeanUtils.copyProperties(purchaseOrderPage, purchaseOrder); purchaseOrder.setPaymentDocumentString(new String(purchaseOrderPage.getPaymentDocument())); @@ -601,7 +602,7 @@ public class PurchaseOrderController { responsesMappedByInvoiceNumber.get(invoiceNumber).getFailures().addAll(results.getFailures()); responsesMappedByInvoiceNumber.get(invoiceNumber).getSuccesses().addAll(results.getSuccesses()); } else { - responsesMappedByInvoiceNumber.put(invoiceNumber, results); + responsesMappedByInvoiceNumber.put(invoiceNumber, results); } return results.getFailures().isEmpty(); },throttlingExecutorService)) @@ -621,6 +622,28 @@ public class PurchaseOrderController { log.info("Deleting purchase orders that have been incompletely created in Mabang : {}", groupIdsToDelete); Responses groupIdsDeleteResult = providerMabangService.deletePurchaseOrderFromMabang(groupIdsToDelete); responsesMappedByInvoiceNumber.put("groupIdDelete", groupIdsDeleteResult); + } else { + log.info("Updating order erp status to 2 in Mabang"); + List platformOrderIds = platformOrderService.getPlatformOrderIdsByInvoiceNumbers(invoiceNumbers); + Response, List> updateResponse = providerMabangService.updateOrderStatusToPreparing(platformOrderIds); + Responses updateOrderStatusResponse = new Responses(); + if(updateResponse.getStatus() == HttpStatus.SC_INTERNAL_SERVER_ERROR) { + String errMsg = updateResponse.getError().get(0).getReason(); + updateOrderStatusResponse.addFailure(errMsg); + responsesMappedByInvoiceNumber.put("UpdateOrderStatusError", updateOrderStatusResponse); + } + else { + List updateOrderStatusSuccess = updateResponse.getData().stream() + .map(UpdateResult::getPlatformOrderId) + .collect(Collectors.toList()); + List updateOrderStatusFailure = updateResponse.getError().stream() + .map(UpdateResult::getPlatformOrderId) + .collect(Collectors.toList()); + log.info("Update order errors : {}", updateResponse.getError()); + updateOrderStatusResponse.getSuccesses().addAll(updateOrderStatusSuccess); + updateOrderStatusResponse.getFailures().addAll(updateOrderStatusFailure); + responsesMappedByInvoiceNumber.put("UpdateOrderStatus", updateOrderStatusResponse); + } } return Result.OK(responsesMappedByInvoiceNumber); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderRequest.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderRequest.java new file mode 100644 index 000000000..e9d01f6f8 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderRequest.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder; + +import org.jeecg.modules.business.domain.api.mabang.Request; + +public class OrderUpdateOrderNewOrderRequest extends Request { + public OrderUpdateOrderNewOrderRequest(OrderUpdateOrderNewOrderRequestBody body) { + super(body); + } + + @Override + public OrderUpdateOrderNewOrderResponse send() { + String jsonString = rawSend().getBody(); + return OrderUpdateOrderNewOrderResponse.parse(jsonString); + } +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderRequestBody.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderRequestBody.java new file mode 100644 index 000000000..bdba7e4f2 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderRequestBody.java @@ -0,0 +1,50 @@ +package org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.jeecg.modules.business.domain.api.mabang.RequestBody; + +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +/** + * Updates order from erp status 1 to 2 + */ +public class OrderUpdateOrderNewOrderRequestBody implements RequestBody { + private final List platformOrderIds; + + public OrderUpdateOrderNewOrderRequestBody(List platformOrderIds) { + this.platformOrderIds = platformOrderIds; + } + + @Override + public String api() { + return "order-update-order-new-order"; + } + + @Override + public JSONObject parameters() { + JSONObject json = new JSONObject(); + JSONArray platformOrderIdsArray = new JSONArray(); + if (platformOrderIds != null) { + platformOrderIdsArray.addAll(platformOrderIds); + } else { + platformOrderIdsArray = new JSONArray(Collections.emptyList()); + } + putNonNull(json,"platformOrderIds", platformOrderIdsArray); + return json; + } + + private void putNonNull(JSONObject json, String key, E value) { + if (value != null) { + json.put(key, value); + } + } + + private void putNonNull(JSONObject json, String key, E value, Function mapper) { + if (value != null) { + json.put(key, mapper.apply(value)); + } + } +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderResponse.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderResponse.java new file mode 100644 index 000000000..2f68b8b76 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/OrderUpdateOrderNewOrderResponse.java @@ -0,0 +1,48 @@ +package org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import lombok.Getter; +import org.jeecg.modules.business.domain.api.mabang.Response; + +import java.util.List; + +@Getter +public class OrderUpdateOrderNewOrderResponse extends Response { + private final String message; + private final List ordersNotFound; + private final List successOrders; + + + private OrderUpdateOrderNewOrderResponse(Code status, String message, List ordersNotFound, List successOrders) { + super(status); + this.message = message; + this.ordersNotFound = ordersNotFound; + this.successOrders = successOrders; + } + + public static OrderUpdateOrderNewOrderResponse parse(String json) { + JSONObject jsonObject = JSON.parseObject(json); + String code = jsonObject.getString("code"); + String message = jsonObject.getString("message"); + if (code.equals("200")) { + JSONObject data = jsonObject.getJSONObject("data"); + JSONArray notFoundPlatformOrderIds = data.getJSONArray("notFoundPlatformOrderIds"); + List notFoundPlatformOrderIdsList = notFoundPlatformOrderIds.toJavaList(UpdateResult.class); + JSONArray platformOrderIdsForSuccess = data.getJSONArray("platformOrderIdsForSuccess"); + List platformOrderIdsForSuccessList = platformOrderIdsForSuccess.toJavaList(UpdateResult.class); + return new OrderUpdateOrderNewOrderResponse(Code.SUCCESS, message, notFoundPlatformOrderIdsList, platformOrderIdsForSuccessList); + } else { + return new OrderUpdateOrderNewOrderResponse(Code.ERROR, message, null, null); + } + } + @Override + public String toString() { + return "AddPurchaseOrderResponse{" + + "message='" + message + '\'' + + ", order not found='" + ordersNotFound + '\'' + + ", success orders='" + successOrders + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/UpdateResult.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/UpdateResult.java new file mode 100644 index 000000000..1b92367e4 --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/orderUpdateOrderNewOrder/UpdateResult.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +@Data +public class UpdateResult { + @JSONField(name = "platformOrderId") + private String platformOrderId; + @JSONField(name = "platformOrderNumber") + private String platformOrderNumber; + @JSONField(name = "reason") + private String reason; +} \ No newline at end of file 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 e9bbc05a3..7b5f8a85b 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 @@ -241,4 +241,6 @@ public interface PlatformOrderMapper extends BaseMapper { List pagePotentialShoumanOrders(long pageNo, long pageSize, String column, String order); Integer countPotentialShoumanOrders(); + + List getPlatformOrderIdsByInvoiceNumbers(@Param("invoiceNumbers") List invoiceNumbers); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml index 186241de9..62e2a6f86 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml @@ -1259,4 +1259,16 @@ AND p.platform_order_id NOT IN (SELECT platform_order_id FROM shouman_order) AND p.create_time > '2024-10-01' + 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 bb9bbd90d..76173710e 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 @@ -284,4 +284,6 @@ public interface IPlatformOrderService extends IService { void updateLocalTrackingNumber(List data); void pagePotentialShoumanOrders(IPage page, String column, String order); + + List getPlatformOrderIdsByInvoiceNumbers(List invoiceNumbers); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IProviderMabangService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IProviderMabangService.java index c77b2f8f3..974bee770 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IProviderMabangService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IProviderMabangService.java @@ -1,8 +1,10 @@ package org.jeecg.modules.business.service; import com.baomidou.mybatisplus.extension.service.IService; +import org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder.UpdateResult; import org.jeecg.modules.business.domain.api.mabang.purDoGetProvider.ProviderData; import org.jeecg.modules.business.vo.InvoiceMetaData; +import org.jeecg.modules.business.vo.Response; import org.jeecg.modules.business.vo.Responses; import java.time.LocalDateTime; @@ -21,4 +23,6 @@ public interface IProviderMabangService extends IService { Responses addPurchaseOrderToMabang(Map skuQuantities, InvoiceMetaData metaData, AtomicReference> providersHistory); Responses deletePurchaseOrderFromMabang(List groupIds); + + Response, List> updateOrderStatusToPreparing(List platformOrderIds); } 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 bdda7a8d6..4e3171fad 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 @@ -551,4 +551,9 @@ public class PlatformOrderServiceImpl extends ServiceImpl getPlatformOrderIdsByInvoiceNumbers(List invoiceNumbers) { + return platformOrderMap.getPlatformOrderIdsByInvoiceNumbers(invoiceNumbers); + } + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ProviderMabangServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ProviderMabangServiceImpl.java index e77f175c2..ff6548efe 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ProviderMabangServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/ProviderMabangServiceImpl.java @@ -1,10 +1,16 @@ package org.jeecg.modules.business.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpStatus; import org.apache.shiro.SecurityUtils; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.*; +import org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder.OrderUpdateOrderNewOrderRequest; +import org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder.OrderUpdateOrderNewOrderRequestBody; +import org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder.OrderUpdateOrderNewOrderResponse; +import org.jeecg.modules.business.domain.api.mabang.orderUpdateOrderNewOrder.UpdateResult; import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderRequest; import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderRequestBody; import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderResponse; @@ -20,6 +26,7 @@ import org.jeecg.modules.business.service.IProviderMabangService; import org.jeecg.modules.business.service.IProviderService; import org.jeecg.modules.business.service.IPurchaseOrderService; import org.jeecg.modules.business.vo.InvoiceMetaData; +import org.jeecg.modules.business.vo.Response; import org.jeecg.modules.business.vo.Responses; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -236,4 +243,42 @@ public class ProviderMabangServiceImpl extends ServiceImpl, List> updateOrderStatusToPreparing(List platformOrderIds) { + Response, List> updateResponse = new Response<>(); + updateResponse.setData(new ArrayList<>()); + updateResponse.setError(new ArrayList<>()); + List> platformOrderIdsPartition = Lists.partition(platformOrderIds, 50); + + ExecutorService throttlingExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS, + MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES); + List> updateOrderFutures = platformOrderIdsPartition.stream() + .map(platformOrderIdList -> CompletableFuture.supplyAsync(() -> { + log.info("Updating order status on Mabang for PlatformOrderIds : {}", platformOrderIdList); + OrderUpdateOrderNewOrderRequestBody body = new OrderUpdateOrderNewOrderRequestBody(platformOrderIdList); + OrderUpdateOrderNewOrderRequest request = new OrderUpdateOrderNewOrderRequest(body); + OrderUpdateOrderNewOrderResponse response = request.send(); + + if(!response.success()) { + log.error("Failed to update order status on Mabang. PlatformOrderIds : {} - Reason : {}", platformOrderIdList, response.getMessage()); + UpdateResult error = new UpdateResult(); + error.setReason(response.getMessage()); + updateResponse.setError(Collections.singletonList(error)); + updateResponse.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR); + return false; + } else { + updateResponse.getData().addAll(response.getSuccessOrders()); + updateResponse.getError().addAll(response.getOrdersNotFound()); + updateResponse.setStatus(!response.getOrdersNotFound().isEmpty() ? HttpStatus.SC_NOT_FOUND : HttpStatus.SC_OK); + return true; + } + }, throttlingExecutorService)).collect(Collectors.toList()); + + List results = updateOrderFutures.stream().map(CompletableFuture::join).collect(Collectors.toList()); + long nbSuccesses = results.stream().filter(b -> b).count(); + log.info("{}/{} platform orders status updated successfully on Mabang. PlatformOrderIds : {}", nbSuccesses, platformOrderIds.size(), platformOrderIds); + + return updateResponse; + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java index ba5e18bba..1cd327169 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/purchase/PurchaseOrderServiceImpl.java @@ -35,6 +35,7 @@ import java.util.*; import java.util.stream.Collectors; import static org.jeecg.modules.business.entity.Invoice.InvoiceType.COMPLETE; +import static org.jeecg.modules.business.entity.Invoice.InvoiceType.PURCHASE; /** * @Description: 商品采购订单 @@ -236,7 +237,7 @@ public class PurchaseOrderServiceImpl extends ServiceImpl