mirror of https://github.com/jeecgboot/jeecg-boot
(WIP) invoiced order remark
parent
55eea18803
commit
007fecf9b6
|
@ -2,20 +2,24 @@ package org.jeecg.modules.business.domain.api.mabang.dochangeorder;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSON;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import lombok.Getter;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.Response;
|
import org.jeecg.modules.business.domain.api.mabang.Response;
|
||||||
|
|
||||||
|
@Getter
|
||||||
public class ChangeOrderResponse extends Response {
|
public class ChangeOrderResponse extends Response {
|
||||||
private final String message;
|
private final String message;
|
||||||
/**
|
/**
|
||||||
* Erp order number
|
* Erp order number
|
||||||
*/
|
*/
|
||||||
private final String orderId;
|
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);
|
super(status);
|
||||||
this.message = message;
|
this.message = message;
|
||||||
this.orderId = orderId;
|
this.orderId = orderId;
|
||||||
|
this.platformOrderId = platformOrderId;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ChangeOrderResponse parse(String json) {
|
public static ChangeOrderResponse parse(String json) {
|
||||||
|
@ -25,25 +29,19 @@ public class ChangeOrderResponse extends Response {
|
||||||
if (code.equals("200")) {
|
if (code.equals("200")) {
|
||||||
JSONObject data = jsonObject.getJSONObject("data");
|
JSONObject data = jsonObject.getJSONObject("data");
|
||||||
String orderId = data.getString("orderId");
|
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 {
|
} 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
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "ChangeOrderResponse{" +
|
return "ChangeOrderResponse{" +
|
||||||
"message='" + message + '\'' +
|
"message='" + message + '\'' +
|
||||||
", orderId='" + orderId + '\'' +
|
", orderId='" + orderId + '\'' +
|
||||||
|
", platformOrderId='" + platformOrderId + '\'' +
|
||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -125,6 +125,12 @@ public class Order {
|
||||||
@JSONField(name = "isNewOrder")
|
@JSONField(name = "isNewOrder")
|
||||||
private String isNewOrder;
|
private String isNewOrder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单备注
|
||||||
|
*/
|
||||||
|
@JSONField(name = "remark")
|
||||||
|
private String remark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 1 = 有货
|
* 1 = 有货
|
||||||
* 2 = 缺货
|
* 2 = 缺货
|
||||||
|
|
|
@ -218,6 +218,7 @@ public interface PlatformOrderMapper extends BaseMapper<PlatformOrder> {
|
||||||
List<ShippingFeeBillableOrders> fetchShippingFeeBillableOrders();
|
List<ShippingFeeBillableOrders> fetchShippingFeeBillableOrders();
|
||||||
|
|
||||||
List<PlatformOrder> getPlatformOrdersByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber);
|
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);
|
OrderKpi countPlatformOrders(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("showAllData") boolean showAllData, @Param("username") String username);
|
||||||
|
|
||||||
|
|
|
@ -962,6 +962,11 @@
|
||||||
FROM platform_order
|
FROM platform_order
|
||||||
WHERE shipping_invoice_number = #{invoiceNumber};
|
WHERE shipping_invoice_number = #{invoiceNumber};
|
||||||
</select>
|
</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">
|
<select id="countPlatformOrders" resultType="org.jeecg.modules.business.vo.OrderKpi">
|
||||||
WITH processedByUser AS (
|
WITH processedByUser AS (
|
||||||
SELECT invoice_number
|
SELECT invoice_number
|
||||||
|
|
|
@ -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.domain.api.mabang.getorderlist.OrderListRequestBody;
|
||||||
import org.jeecg.modules.business.vo.PlatformOrderOperation;
|
import org.jeecg.modules.business.vo.PlatformOrderOperation;
|
||||||
import org.jeecg.modules.business.vo.Responses;
|
import org.jeecg.modules.business.vo.Responses;
|
||||||
|
import org.jeecg.modules.business.vo.ResponsesWithMsg;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -44,4 +45,6 @@ public interface IPlatformOrderMabangService extends IService<Order> {
|
||||||
String stripAccents(String input);
|
String stripAccents(String input);
|
||||||
|
|
||||||
JSONObject syncOrdersFromMabang(List<String> platformOrderIds) throws JSONException;
|
JSONObject syncOrdersFromMabang(List<String> platformOrderIds) throws JSONException;
|
||||||
|
|
||||||
|
ResponsesWithMsg<String> editOrdersRemark(String invoiceNumber);
|
||||||
}
|
}
|
||||||
|
|
|
@ -261,6 +261,7 @@ public interface IPlatformOrderService extends IService<PlatformOrder> {
|
||||||
List<ShippingFeeBillableOrders> fetchShippingFeeBillableOrders();
|
List<ShippingFeeBillableOrders> fetchShippingFeeBillableOrders();
|
||||||
|
|
||||||
List<PlatformOrder> getPlatformOrdersByInvoiceNumber(String invoiceNumber);
|
List<PlatformOrder> getPlatformOrdersByInvoiceNumber(String invoiceNumber);
|
||||||
|
List<String> getPlatformOrderIdsByInvoiceNumber(String invoiceNumber);
|
||||||
|
|
||||||
Map<String, String> fetchShippingPeriodAndType(String invoiceNumber);
|
Map<String, String> fetchShippingPeriodAndType(String invoiceNumber);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.shiro.SecurityUtils;
|
import org.apache.shiro.SecurityUtils;
|
||||||
import org.codehaus.jettison.json.JSONException;
|
import org.codehaus.jettison.json.JSONException;
|
||||||
import org.codehaus.jettison.json.JSONObject;
|
import org.codehaus.jettison.json.JSONObject;
|
||||||
import org.jeecg.common.system.api.ISysBaseAPI;
|
|
||||||
import org.jeecg.common.system.vo.LoginUser;
|
import org.jeecg.common.system.vo.LoginUser;
|
||||||
import org.jeecg.modules.business.domain.api.mabang.dochangeorder.*;
|
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.getorderlist.*;
|
||||||
|
@ -20,6 +19,7 @@ import org.jeecg.modules.business.service.IPlatformOrderMabangService;
|
||||||
import org.jeecg.modules.business.service.IPlatformOrderService;
|
import org.jeecg.modules.business.service.IPlatformOrderService;
|
||||||
import org.jeecg.modules.business.vo.PlatformOrderOperation;
|
import org.jeecg.modules.business.vo.PlatformOrderOperation;
|
||||||
import org.jeecg.modules.business.vo.Responses;
|
import org.jeecg.modules.business.vo.Responses;
|
||||||
|
import org.jeecg.modules.business.vo.ResponsesWithMsg;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
@ -31,6 +31,8 @@ import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static java.util.stream.Collectors.toList;
|
import static java.util.stream.Collectors.toList;
|
||||||
|
@ -49,10 +51,12 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl<PlatformOrderMab
|
||||||
@Autowired
|
@Autowired
|
||||||
private IPlatformOrderService orderservice;
|
private IPlatformOrderService orderservice;
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISysBaseAPI ISysBaseApi;
|
private IPlatformOrderService platformOrderService;
|
||||||
|
|
||||||
private static final Integer DEFAULT_NUMBER_OF_THREADS = 2;
|
private static final Integer DEFAULT_NUMBER_OF_THREADS = 2;
|
||||||
private static final Integer MABANG_API_RATE_LIMIT_PER_MINUTE = 10;
|
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
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void saveOrderFromMabang(List<Order> orders) {
|
public void saveOrderFromMabang(List<Order> orders) {
|
||||||
|
@ -379,4 +383,56 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl<PlatformOrderMab
|
||||||
return res;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -494,6 +494,10 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
|
||||||
public List<PlatformOrder> getPlatformOrdersByInvoiceNumber(String invoiceNumber) {
|
public List<PlatformOrder> getPlatformOrdersByInvoiceNumber(String invoiceNumber) {
|
||||||
return platformOrderMap.getPlatformOrdersByInvoiceNumber(invoiceNumber);
|
return platformOrderMap.getPlatformOrdersByInvoiceNumber(invoiceNumber);
|
||||||
}
|
}
|
||||||
|
@Override
|
||||||
|
public List<String> getPlatformOrderIdsByInvoiceNumber(String invoiceNumber) {
|
||||||
|
return platformOrderMap.getPlatformOrderIdsByInvoiceNumber(invoiceNumber);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, String> fetchShippingPeriodAndType(String invoiceNumber) {
|
public Map<String, String> fetchShippingPeriodAndType(String invoiceNumber) {
|
||||||
|
|
Loading…
Reference in New Issue