Merge pull request #150 from LQYBill/fix/purchaseOrderStatus

fix: Change Order status to "preparing" after creating purchase order…
pull/8523/head
Qiuyi LI 2025-04-08 15:08:37 +02:00 committed by GitHub
commit d1eb759631
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 223 additions and 3 deletions

View File

@ -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<String> platformOrderIds = platformOrderService.getPlatformOrderIdsByInvoiceNumbers(invoiceNumbers);
Response<List<UpdateResult>, List<UpdateResult>> 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<String> updateOrderStatusSuccess = updateResponse.getData().stream()
.map(UpdateResult::getPlatformOrderId)
.collect(Collectors.toList());
List<String> 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);
}

View File

@ -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);
}
}

View File

@ -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<String> platformOrderIds;
public OrderUpdateOrderNewOrderRequestBody(List<String> 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 <E> void putNonNull(JSONObject json, String key, E value) {
if (value != null) {
json.put(key, value);
}
}
private <E, T> void putNonNull(JSONObject json, String key, E value, Function<E, T> mapper) {
if (value != null) {
json.put(key, mapper.apply(value));
}
}
}

View File

@ -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<UpdateResult> ordersNotFound;
private final List<UpdateResult> successOrders;
private OrderUpdateOrderNewOrderResponse(Code status, String message, List<UpdateResult> ordersNotFound, List<UpdateResult> 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<UpdateResult> notFoundPlatformOrderIdsList = notFoundPlatformOrderIds.toJavaList(UpdateResult.class);
JSONArray platformOrderIdsForSuccess = data.getJSONArray("platformOrderIdsForSuccess");
List<UpdateResult> 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 + '\'' +
'}';
}
}

View File

@ -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;
}

View File

@ -241,4 +241,6 @@ public interface PlatformOrderMapper extends BaseMapper<PlatformOrder> {
List<PlatformOrderPage> pagePotentialShoumanOrders(long pageNo, long pageSize, String column, String order);
Integer countPotentialShoumanOrders();
List<String> getPlatformOrderIdsByInvoiceNumbers(@Param("invoiceNumbers") List<String> invoiceNumbers);
}

View File

@ -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'
</select>
<select id="getPlatformOrderIdsByInvoiceNumbers" resultType="java.lang.String">
SELECT platform_order_id
FROM platform_order
WHERE shipping_invoice_number IN
<foreach collection="invoiceNumbers" separator="," open="(" close=")" index="index" item="invoiceNumber">
#{invoiceNumber}
</foreach>
OR purchase_invoice_number IN
<foreach collection="invoiceNumbers" separator="," open="(" close=")" index="index" item="invoiceNumber">
#{invoiceNumber}
</foreach>
</select>
</mapper>

View File

@ -284,4 +284,6 @@ public interface IPlatformOrderService extends IService<PlatformOrder> {
void updateLocalTrackingNumber(List<YDTrackingNumberData> data);
void pagePotentialShoumanOrders(IPage<PlatformOrderPage> page, String column, String order);
List<String> getPlatformOrderIdsByInvoiceNumbers(List<String> invoiceNumbers);
}

View File

@ -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<ProviderData> {
Responses addPurchaseOrderToMabang(Map<String, Integer> skuQuantities, InvoiceMetaData metaData, AtomicReference<Map<String, LocalDateTime>> providersHistory);
Responses deletePurchaseOrderFromMabang(List<String> groupIds);
Response<List<UpdateResult>, List<UpdateResult>> updateOrderStatusToPreparing(List<String> platformOrderIds);
}

View File

@ -551,4 +551,9 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
page.setTotal(platformOrderMap.countPotentialShoumanOrders());
}
@Override
public List<String> getPlatformOrderIdsByInvoiceNumbers(List<String> invoiceNumbers) {
return platformOrderMap.getPlatformOrderIdsByInvoiceNumbers(invoiceNumbers);
}
}

View File

@ -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<ProviderMabangMapper,
log.info("{}/{} purchase orders deleted successfully from Mabang. GroupIds : {}", nbSuccesses, groupIds.size(), groupIds);
return groupIdsDeleteResult;
}
@Override
public Response<List<UpdateResult>, List<UpdateResult>> updateOrderStatusToPreparing(List<String> platformOrderIds) {
Response<List<UpdateResult>, List<UpdateResult>> updateResponse = new Response<>();
updateResponse.setData(new ArrayList<>());
updateResponse.setError(new ArrayList<>());
List<List<String>> platformOrderIdsPartition = Lists.partition(platformOrderIds, 50);
ExecutorService throttlingExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS,
MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES);
List<CompletableFuture<Boolean>> 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<Boolean> 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;
}
}