(WIP) invoiced order remark

pull/8523/head
Gauthier LO 2025-05-05 09:59:24 +02:00
parent 55eea18803
commit 007fecf9b6
10 changed files with 138 additions and 13 deletions

View File

@ -2,20 +2,24 @@ package org.jeecg.modules.business.domain.api.mabang.dochangeorder;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import org.jeecg.modules.business.domain.api.mabang.Response;
@Getter
public class ChangeOrderResponse extends Response {
private final String message;
/**
* Erp order number
*/
private final String orderId;
private final String platformOrderId;
private ChangeOrderResponse(Code status, String message, String orderId) {
private ChangeOrderResponse(Code status, String message, String orderId, String platformOrderId) {
super(status);
this.message = message;
this.orderId = orderId;
this.platformOrderId = platformOrderId;
}
public static ChangeOrderResponse parse(String json) {
@ -25,25 +29,19 @@ public class ChangeOrderResponse extends Response {
if (code.equals("200")) {
JSONObject data = jsonObject.getJSONObject("data");
String orderId = data.getString("orderId");
return new ChangeOrderResponse(Code.SUCCESS, message, orderId);
String platformOrderId = data.getString("platformOrderId");
return new ChangeOrderResponse(Code.SUCCESS, message, orderId, platformOrderId);
} else {
return new ChangeOrderResponse(Code.ERROR, message, null);
return new ChangeOrderResponse(Code.ERROR, message, null, null);
}
}
public String getMessage() {
return message;
}
public String getOrderId() {
return orderId;
}
@Override
public String toString() {
return "ChangeOrderResponse{" +
"message='" + message + '\'' +
", orderId='" + orderId + '\'' +
", platformOrderId='" + platformOrderId + '\'' +
'}';
}
}

View File

@ -0,0 +1,15 @@
package org.jeecg.modules.business.domain.api.mabang.dochangeorder;
import org.jeecg.modules.business.domain.api.mabang.Request;
public class EditRemarkRequest extends Request {
public EditRemarkRequest(EditRemarkRequestBody body) {
super(body);
}
@Override
public ChangeOrderResponse send() {
String jsonString = rawSend().getBody();
return ChangeOrderResponse.parse(jsonString);
}
}

View File

@ -0,0 +1,36 @@
package org.jeecg.modules.business.domain.api.mabang.dochangeorder;
import com.alibaba.fastjson.JSONObject;
import lombok.Getter;
import org.jeecg.modules.business.domain.api.mabang.RequestBody;
import java.util.Map;
@Getter
public class EditRemarkRequestBody implements RequestBody {
private final String platformOrderId;
private final String remark;
public EditRemarkRequestBody(String platformOrderId, String remark) {
this.platformOrderId = platformOrderId;
this.remark = remark;
}
@Override
public String api() {
return "order-do-change-order";
}
@Override
public Map<String, Object> parameters() {
JSONObject json = new JSONObject();
putNonNull(json, "platformOrderId", platformOrderId);
putNonNull(json, "remark", remark);
return json;
}
private <E> void putNonNull(JSONObject json, String key, E value) {
if (value != null) {
json.put(key, value);
}
}
}

View File

@ -125,6 +125,12 @@ public class Order {
@JSONField(name = "isNewOrder")
private String isNewOrder;
/**
*
*/
@JSONField(name = "remark")
private String remark;
/**
* 1 =
* 2 =

View File

@ -218,6 +218,7 @@ public interface PlatformOrderMapper extends BaseMapper<PlatformOrder> {
List<ShippingFeeBillableOrders> fetchShippingFeeBillableOrders();
List<PlatformOrder> getPlatformOrdersByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
List<String> getPlatformOrderIdsByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
OrderKpi countPlatformOrders(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("showAllData") boolean showAllData, @Param("username") String username);

View File

@ -962,6 +962,11 @@
FROM platform_order
WHERE shipping_invoice_number = #{invoiceNumber};
</select>
<select id="getPlatformOrderIdsByInvoiceNumber" resultType="java.lang.String">
SELECT platform_order_id
FROM platform_order
WHERE shipping_invoice_number = #{invoiceNumber};
</select>
<select id="countPlatformOrders" resultType="org.jeecg.modules.business.vo.OrderKpi">
WITH processedByUser AS (
SELECT invoice_number

View File

@ -7,6 +7,7 @@ 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 org.jeecg.modules.business.vo.ResponsesWithMsg;
import java.util.Collection;
import java.util.List;
@ -44,4 +45,6 @@ public interface IPlatformOrderMabangService extends IService<Order> {
String stripAccents(String input);
JSONObject syncOrdersFromMabang(List<String> platformOrderIds) throws JSONException;
ResponsesWithMsg<String> editOrdersRemark(String invoiceNumber);
}

View File

@ -261,6 +261,7 @@ public interface IPlatformOrderService extends IService<PlatformOrder> {
List<ShippingFeeBillableOrders> fetchShippingFeeBillableOrders();
List<PlatformOrder> getPlatformOrdersByInvoiceNumber(String invoiceNumber);
List<String> getPlatformOrderIdsByInvoiceNumber(String invoiceNumber);
Map<String, String> fetchShippingPeriodAndType(String invoiceNumber);

View File

@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.shiro.SecurityUtils;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.business.domain.api.mabang.dochangeorder.*;
import org.jeecg.modules.business.domain.api.mabang.getorderlist.*;
@ -20,6 +19,7 @@ import org.jeecg.modules.business.service.IPlatformOrderMabangService;
import org.jeecg.modules.business.service.IPlatformOrderService;
import org.jeecg.modules.business.vo.PlatformOrderOperation;
import org.jeecg.modules.business.vo.Responses;
import org.jeecg.modules.business.vo.ResponsesWithMsg;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -31,6 +31,8 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
@ -49,10 +51,12 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl<PlatformOrderMab
@Autowired
private IPlatformOrderService orderservice;
@Autowired
private ISysBaseAPI ISysBaseApi;
private IPlatformOrderService platformOrderService;
private static final Integer DEFAULT_NUMBER_OF_THREADS = 2;
private static final Integer MABANG_API_RATE_LIMIT_PER_MINUTE = 10;
private static final Pattern INVOICE_NUMBER_REMARK_PATTERN = Pattern.compile("^([0-9]{4}-[0-9]{2}-[1278][0-9]{3})?(.*)$");
@Override
@Transactional
public void saveOrderFromMabang(List<Order> orders) {
@ -379,4 +383,56 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl<PlatformOrderMab
return res;
}
@Override
public ResponsesWithMsg<String> editOrdersRemark(String invoiceNumber) {
ResponsesWithMsg<String> responses = new ResponsesWithMsg<>();
List<String> platformOrderIds = platformOrderService.getPlatformOrderIdsByInvoiceNumber(invoiceNumber);
ExecutorService executor = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS,
MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES);
List<OrderListRequestBody> Ordersrequests = new ArrayList<>();
List<List<String>> orderIdsPartition = Lists.partition(platformOrderIds, 10);
for (List<String> platformOrderIdList : orderIdsPartition) {
Ordersrequests.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList));
}
List<Order> ordersFromMabang = getOrdersFromMabang(Ordersrequests, executor);
List<EditRemarkRequestBody> editRemarkRequests = new ArrayList<>();
for(Order order: ordersFromMabang) {
String orderRemark = order.getRemark();
StringBuilder remark = new StringBuilder();
remark.append(invoiceNumber);
Matcher invoiceMatcher = INVOICE_NUMBER_REMARK_PATTERN.matcher(order.getRemark());
// TODO : do we override the invoice number if one is present ? Ask
if (orderRemark != null && !orderRemark.isEmpty()) {
if(invoiceMatcher.matches() && !invoiceMatcher.group(2).isEmpty()) {
log.info("Order {} has remark {}", order.getPlatformOrderId(), invoiceMatcher.group(2));
remark.append(invoiceMatcher.group(2));
}
}
editRemarkRequests.add(new EditRemarkRequestBody(order.getPlatformOrderId(), remark.toString()));
}
List<CompletableFuture<Boolean>> editRemarkFutures = editRemarkRequests.stream()
.map(request -> CompletableFuture.supplyAsync(() -> {
boolean success = false;
try {
EditRemarkRequest editRemarkRequest = new EditRemarkRequest(request);
ChangeOrderResponse response = editRemarkRequest.send();
success = response.success();
if (success) {
responses.addSuccess(request.getPlatformOrderId());
} else {
responses.addFailure(request.getPlatformOrderId(), response.getMessage());
}
} catch (RuntimeException e) {
log.error("Error editing order remark {} : {}", request.getPlatformOrderId(), e.getMessage());
responses.addFailure(request.getPlatformOrderId(), e.getMessage());
}
return success;
}, executor))
.collect(Collectors.toList());
List<Boolean> results = editRemarkFutures.stream().map(CompletableFuture::join).collect(Collectors.toList());
long nbSuccesses = results.stream().filter(b -> b).count();
log.info("{}/{} order remarks updated successfully.", nbSuccesses, editRemarkRequests.size());
return responses;
}
}

View File

@ -494,6 +494,10 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
public List<PlatformOrder> getPlatformOrdersByInvoiceNumber(String invoiceNumber) {
return platformOrderMap.getPlatformOrdersByInvoiceNumber(invoiceNumber);
}
@Override
public List<String> getPlatformOrderIdsByInvoiceNumber(String invoiceNumber) {
return platformOrderMap.getPlatformOrderIdsByInvoiceNumber(invoiceNumber);
}
@Override
public Map<String, String> fetchShippingPeriodAndType(String invoiceNumber) {