Merge pull request #161 from LQYBill/feat/mabangOrderRemark

Feat/mabang order remark
pull/8523/head
Qiuyi LI 2025-05-12 17:24:14 +02:00 committed by GitHub
commit 9de88bdc59
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 383 additions and 154 deletions

View File

@ -323,7 +323,7 @@ public interface CommonConstant {
String X_MiniFlowExclusionFieldMode = "X-Miniflowexclusionfieldmode"; String X_MiniFlowExclusionFieldMode = "X-Miniflowexclusionfieldmode";
/**===============================================================================================*/ /**===============================================================================================*/
String TOKEN_IS_INVALID_MSG = "Token失效请重新登录!"; String TOKEN_IS_INVALID_MSG = "Your session has expired, please log in again";
String X_FORWARDED_SCHEME = "X-Forwarded-Scheme"; String X_FORWARDED_SCHEME = "X-Forwarded-Scheme";

View File

@ -79,6 +79,8 @@ public class PurchaseOrderController {
@Autowired @Autowired
private IShippingInvoiceService shippingInvoiceService; private IShippingInvoiceService shippingInvoiceService;
@Autowired private IProviderMabangService providerMabangService; @Autowired private IProviderMabangService providerMabangService;
@Autowired
private IPlatformOrderMabangService platformOrderMabangService;
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;
@ -625,7 +627,7 @@ public class PurchaseOrderController {
} else { } else {
log.info("Updating order erp status to 2 in Mabang"); log.info("Updating order erp status to 2 in Mabang");
List<String> platformOrderIds = platformOrderService.getPlatformOrderIdsByInvoiceNumbers(invoiceNumbers); List<String> platformOrderIds = platformOrderService.getPlatformOrderIdsByInvoiceNumbers(invoiceNumbers);
Response<List<UpdateResult>, List<UpdateResult>> updateResponse = providerMabangService.updateOrderStatusToPreparing(platformOrderIds); Response<List<UpdateResult>, List<UpdateResult>> updateResponse = platformOrderMabangService.updateOrderStatusToPreparing(platformOrderIds);
Responses updateOrderStatusResponse = new Responses(); Responses updateOrderStatusResponse = new Responses();
if(updateResponse.getStatus() == HttpStatus.SC_INTERNAL_SERVER_ERROR) { if(updateResponse.getStatus() == HttpStatus.SC_INTERNAL_SERVER_ERROR) {
String errMsg = updateResponse.getError().get(0).getReason(); String errMsg = updateResponse.getError().get(0).getReason();
@ -634,10 +636,10 @@ public class PurchaseOrderController {
} }
else { else {
List<String> updateOrderStatusSuccess = updateResponse.getData().stream() List<String> updateOrderStatusSuccess = updateResponse.getData().stream()
.map(UpdateResult::getPlatformOrderId) .map(UpdateResult::getPlatformOrderNumber)
.collect(Collectors.toList()); .collect(Collectors.toList());
List<String> updateOrderStatusFailure = updateResponse.getError().stream() List<String> updateOrderStatusFailure = updateResponse.getError().stream()
.map(UpdateResult::getPlatformOrderId) .map(UpdateResult::getPlatformOrderNumber)
.collect(Collectors.toList()); .collect(Collectors.toList());
log.info("Update order errors : {}", updateResponse.getError()); log.info("Update order errors : {}", updateResponse.getError());
updateOrderStatusResponse.getSuccesses().addAll(updateOrderStatusSuccess); updateOrderStatusResponse.getSuccesses().addAll(updateOrderStatusSuccess);

View File

@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.common.base.CaseFormat; import com.google.common.base.CaseFormat;
import com.google.common.collect.Lists;
import freemarker.template.Template; import freemarker.template.Template;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -15,12 +14,7 @@ import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.common.util.oConvertUtils; import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuData;
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuListRawStream;
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuListRequestBody;
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuUpdateListStream;
import org.jeecg.modules.business.entity.*; import org.jeecg.modules.business.entity.*;
import org.jeecg.modules.business.model.SkuDocument;
import org.jeecg.modules.business.mongoService.SkuMongoService; import org.jeecg.modules.business.mongoService.SkuMongoService;
import org.jeecg.modules.business.service.*; import org.jeecg.modules.business.service.*;
import org.jeecg.modules.business.vo.*; import org.jeecg.modules.business.vo.*;
@ -622,70 +616,11 @@ public class SkuController {
public Result<?> compareClientSkuWithMabang(@RequestParam(name="clientId") String clientId, public Result<?> compareClientSkuWithMabang(@RequestParam(name="clientId") String clientId,
@RequestParam(name="erpStatuses[]") List<String> erpStatuses) { @RequestParam(name="erpStatuses[]") List<String> erpStatuses) {
Map<String, Sku> clientSkus = skuService.listInUninvoicedOrders(clientId, erpStatuses); Map<String, Sku> clientSkus = skuService.listInUninvoicedOrders(clientId, erpStatuses);
List<String> skuIds = new ArrayList<>(clientSkus.keySet()); if(clientSkus.isEmpty()) {
List<SkuDocument> clientSkuDocs = new ArrayList<>(); log.info("No skus to compare");
for(String skuId: skuIds) { return Result.OK();
List<SkuDocument> skus = skuMongoService.findBySkuId(skuId);
if(skus.isEmpty()) {
skuMongoService.migrateOneSku(clientSkus.get(skuId));
skus = skuMongoService.findBySkuId(skuId);
}
SkuDocument sku = skus.get(0);
clientSkuDocs.add(sku);
}
List<List<String>> erpCodePartition = Lists.partition(clientSkuDocs, 50)
.stream()
.map(skus -> skus.stream().map(SkuDocument::getErpCode).collect(Collectors.toList()))
.collect(Collectors.toList());
List<SkuData> skusFromMabang = new ArrayList<>();
for(List<String> partition : erpCodePartition) {
SkuListRequestBody body = new SkuListRequestBody();
body.setStockSkuList(String.join(",", partition));
SkuListRawStream rawStream = new SkuListRawStream(body);
SkuUpdateListStream stream = new SkuUpdateListStream(rawStream);
skusFromMabang.addAll(stream.all());
}
List<String> desyncedSkus = new ArrayList<>();
List<String> syncedSkus = new ArrayList<>();
for(SkuDocument sku : clientSkuDocs) {
SkuData skuData = skusFromMabang.stream().filter(s -> s.getErpCode().equals(sku.getErpCode()))
.findFirst().orElse(null);
if(skuData != null) {
boolean isDesynced = false;
BigDecimal mabangPrice = skuData.getSalePrice().setScale(2, RoundingMode.HALF_UP); // because price from mabang has 4 decimal places, so Objects.equals will always return false
if(skuData.getWeight() == null && sku.getLatestSkuWeight() != null) {
log.info("sku {} doesn't have a weight on Mabang but has one in Mongo", skuData.getErpCode());
isDesynced = true;
}
if (sku.getLatestSkuWeight() != null && !Objects.equals(skuData.getWeight(), sku.getLatestSkuWeight().getWeight())) {
log.info("sku {} has a different weight on Mabang and in Mongo : mabang :{}; mongo :{}", skuData.getErpCode() ,skuData.getWeight(), sku.getLatestSkuWeight().getWeight());
isDesynced = true;
}
if(skuData.getSalePrice() == null && sku.getLatestSkuPrice() != null) {
log.info("sku {} doesn't have a price on Mabang but has one in mongo", skuData.getErpCode());
isDesynced = true;
}
if(sku.getLatestSkuPrice() != null && !Objects.equals(mabangPrice, sku.getLatestSkuPrice().getPrice())) {
log.info("sku {} has a different price on Mabang and in Mongo : mabang :{}; mongo :{}", skuData.getErpCode() ,skuData.getSalePrice(), sku.getLatestSkuPrice().getPrice());
isDesynced = true;
}
if(isDesynced)
desyncedSkus.add(skuData.getErpCode());
else
syncedSkus.add(skuData.getErpCode());
} else {
desyncedSkus.add(sku.getErpCode());
}
}
if(!desyncedSkus.isEmpty()) {
log.info("Desynced skus : {}", desyncedSkus);
skuService.setIsSynced(desyncedSkus, false);
}
if(!syncedSkus.isEmpty()) {
log.info("Synced skus : {}", syncedSkus);
skuService.setIsSynced(syncedSkus, true);
} }
skuListMabangService.compareClientSkusWithMabang(clientSkus);
return Result.OK(); return Result.OK();
} }

View File

@ -15,7 +15,6 @@ import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.business.controller.UserException; import org.jeecg.modules.business.controller.UserException;
import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderStatus;
import org.jeecg.modules.business.domain.purchase.invoice.PurchaseInvoiceEntry; import org.jeecg.modules.business.domain.purchase.invoice.PurchaseInvoiceEntry;
import org.jeecg.modules.business.entity.*; import org.jeecg.modules.business.entity.*;
import org.jeecg.modules.business.mapper.ExchangeRatesMapper; import org.jeecg.modules.business.mapper.ExchangeRatesMapper;
@ -54,6 +53,7 @@ import java.util.stream.Collectors;
import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDictSql; import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDictSql;
import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*;
import static org.jeecg.modules.business.entity.Invoice.InvoicingMethod.*;
import static org.jeecg.modules.business.entity.Task.TaskCode.SI_G; 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.entity.TaskHistory.TaskStatus.*;
import static org.jeecg.modules.business.vo.PlatformOrderFront.*; import static org.jeecg.modules.business.vo.PlatformOrderFront.*;
@ -117,6 +117,8 @@ public class InvoiceController {
@Autowired @Autowired
private ICreditService creditService; private ICreditService creditService;
@Autowired @Autowired
private IPlatformOrderMabangService platformOrderMabangService;
@Autowired
Environment env; Environment env;
@Value("${jeecg.path.shippingInvoiceDir}") @Value("${jeecg.path.shippingInvoiceDir}")
@ -246,10 +248,20 @@ public class InvoiceController {
@PostMapping(value = "/makeComplete") @PostMapping(value = "/makeComplete")
public Result<?> makeCompleteShippingInvoice(@RequestBody ShippingInvoiceParam param) { public Result<?> makeCompleteShippingInvoice(@RequestBody ShippingInvoiceParam param) {
try { try {
String method = param.getErpStatuses().toString().equals("[3]") ? "post" : param.getErpStatuses().toString().equals("[1, 2]") ? "pre-shipping" : "all"; JSONObject response = new JSONObject();
String method = param.getErpStatuses().toString().equals("[3]") ? POSTSHIPPING.getMethod() : param.getErpStatuses().toString().equals("[1, 2]") ? PRESHIPPING.getMethod() : ALL.getMethod();
InvoiceMetaData metaData = shippingInvoiceService.makeCompleteInvoicePostShipping(param, method); InvoiceMetaData metaData = shippingInvoiceService.makeCompleteInvoicePostShipping(param, method);
balanceService.updateBalance(param.clientID(), metaData.getInvoiceCode(), COMPLETE.name()); balanceService.updateBalance(param.clientID(), metaData.getInvoiceCode(), COMPLETE.name());
return Result.OK(metaData);
if(method.equals(PRESHIPPING.getMethod())) {
ResponsesWithMsg<String> mabangResponses = platformOrderMabangService.editOrdersRemark(metaData.getInvoiceCode());
response.put("metaData", metaData);
response.put("mabangResponses", mabangResponses);
return Result.OK(response);
}
response.put("metaData", metaData);
return Result.OK(response);
} catch (UserException e) { } catch (UserException e) {
return Result.error(e.getMessage()); return Result.error(e.getMessage());
} catch (IOException | ParseException e) { } catch (IOException | ParseException e) {
@ -320,6 +332,7 @@ public class InvoiceController {
public Result<?> makeManualPurchaseInvoice(@RequestBody ShippingInvoiceOrderParam param) { public Result<?> makeManualPurchaseInvoice(@RequestBody ShippingInvoiceOrderParam param) {
InvoiceMetaData metaData; InvoiceMetaData metaData;
try { try {
JSONObject response = new JSONObject();
List<SkuQuantity> skuQuantities = skuService.getSkuQuantitiesFromOrderIds(param.orderIds()); List<SkuQuantity> skuQuantities = skuService.getSkuQuantitiesFromOrderIds(param.orderIds());
if(skuQuantities.isEmpty()) { if(skuQuantities.isEmpty()) {
return Result.error("Nothing to invoice."); return Result.error("Nothing to invoice.");
@ -353,7 +366,14 @@ public class InvoiceController {
emailService.sendSimpleMessage(destEmail, subject, htmlBody, session); emailService.sendSimpleMessage(destEmail, subject, htmlBody, session);
log.info("Mail sent successfully"); log.info("Mail sent successfully");
} }
return Result.OK(metaData); if(param.getType().equals(PRESHIPPING.getMethod())) {
ResponsesWithMsg<String> mabangResponses = platformOrderMabangService.editOrdersRemark(metaData.getInvoiceCode());
response.put("metaData", metaData);
response.put("mabangResponses", mabangResponses);
return Result.OK(response);
}
response.put("metaData", metaData);
return Result.OK(response);
} catch (UserException e) { } catch (UserException e) {
return Result.error(e.getMessage()); return Result.error(e.getMessage());
} catch (IOException e) { } catch (IOException e) {
@ -376,6 +396,7 @@ public class InvoiceController {
@PostMapping(value = "/makeManualComplete") @PostMapping(value = "/makeManualComplete")
public Result<?> makeManualCompleteInvoice(@RequestBody ShippingInvoiceOrderParam param) { public Result<?> makeManualCompleteInvoice(@RequestBody ShippingInvoiceOrderParam param) {
try { try {
JSONObject response = new JSONObject();
InvoiceMetaData metaData = shippingInvoiceService.makeCompleteInvoice(param); InvoiceMetaData metaData = shippingInvoiceService.makeCompleteInvoice(param);
String clientCategory = clientCategoryService.getClientCategoryByClientId(param.clientID()); String clientCategory = clientCategoryService.getClientCategoryByClientId(param.clientID());
if(clientCategory.equals(ClientCategory.CategoryName.CONFIRMED.getName()) || clientCategory.equals(ClientCategory.CategoryName.VIP.getName())) { if(clientCategory.equals(ClientCategory.CategoryName.CONFIRMED.getName()) || clientCategory.equals(ClientCategory.CategoryName.VIP.getName())) {
@ -402,7 +423,14 @@ public class InvoiceController {
emailService.sendSimpleMessage(destEmail, subject, htmlBody, session); emailService.sendSimpleMessage(destEmail, subject, htmlBody, session);
log.info("Mail sent successfully"); log.info("Mail sent successfully");
} }
return Result.OK(metaData); if(param.getType().equals(PRESHIPPING.getMethod())) {
ResponsesWithMsg<String> mabangResponses = platformOrderMabangService.editOrdersRemark(metaData.getInvoiceCode());
response.put("metaData", metaData);
response.put("mabangResponses", mabangResponses);
return Result.OK(response);
}
response.put("metaData", metaData);
return Result.OK(response);
} catch (UserException e) { } catch (UserException e) {
return Result.error(e.getMessage()); return Result.error(e.getMessage());
} catch (IOException | ParseException e) { } catch (IOException | ParseException e) {

View File

@ -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 + '\'' +
'}'; '}';
} }
} }

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") @JSONField(name = "isNewOrder")
private String isNewOrder; private String isNewOrder;
/**
*
*/
@JSONField(name = "remark")
private String remark;
/** /**
* 1 = * 1 =
* 2 = * 2 =

View File

@ -36,6 +36,7 @@ import java.util.stream.Collectors;
import static cn.hutool.core.date.DateTime.now; import static cn.hutool.core.date.DateTime.now;
import static java.util.stream.Collectors.*; import static java.util.stream.Collectors.*;
import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*;
import static org.jeecg.modules.business.entity.Invoice.InvoicingMethod.*;
@Slf4j @Slf4j
@Component @Component
@ -132,11 +133,11 @@ public class ShippingInvoiceFactory {
List<ExtraFeeResult> extraFees = extraFeeService.findNotInvoicedByShops(shopIds); List<ExtraFeeResult> extraFees = extraFeeService.findNotInvoicedByShops(shopIds);
log.info("Orders to be invoiced: {}", uninvoicedOrderToContent); log.info("Orders to be invoiced: {}", uninvoicedOrderToContent);
String subject; String subject;
if(type.equals("shipping")) if(type.equals(POSTSHIPPING.getMethod()))
subject = String.format("Shipping fees from %s to %s", start, end); subject = String.format("Shipping fees from %s to %s", start, end);
else if(type.equals("pre-shipping")) else if(type.equals(PRESHIPPING.getMethod()))
subject = String.format("Pre-Shipping fees, order time from %s to %s", start, end); subject = String.format("Pre-Shipping fees, order time from %s to %s", start, end);
else if(type.equals("all")) else if(type.equals(ALL.getMethod()))
subject = String.format("Shipping fees, order time from %s to %s", start, end); subject = String.format("Shipping fees, order time from %s to %s", start, end);
else else
throw new UserException("Couldn't create shipping invoice of unknown type."); throw new UserException("Couldn't create shipping invoice of unknown type.");
@ -180,11 +181,11 @@ public class ShippingInvoiceFactory {
String subject; String subject;
if(shippingMethod.equals("shipping")) if(shippingMethod.equals("shipping"))
subject = String.format("Purchase and Shipping fees from %s to %s", start, end); subject = String.format("Purchase and Shipping fees from %s to %s", start, end);
else if(shippingMethod.equals("post")) else if(shippingMethod.equals(POSTSHIPPING.getMethod()))
subject = String.format("Purchase and post-Shipping fees from %s to %s", start, end); subject = String.format("Purchase and post-Shipping fees from %s to %s", start, end);
else if (shippingMethod.equals("pre-shipping")) else if (shippingMethod.equals(PRESHIPPING.getMethod()))
subject = String.format("Purchase and pre-Shipping fees, order time from %s to %s", start, end); subject = String.format("Purchase and pre-Shipping fees, order time from %s to %s", start, end);
else if(shippingMethod.equals("all")) else if(shippingMethod.equals(ALL.getMethod()))
subject = String.format("Purchase and Shipping fees, order time from %s to %s", start, end); subject = String.format("Purchase and Shipping fees, order time from %s to %s", start, end);
else throw new UserException("Couldn't create complete invoice for unknown shipping method"); else throw new UserException("Couldn't create complete invoice for unknown shipping method");
if(balance != null) if(balance != null)

View File

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

View File

@ -684,6 +684,8 @@
</select> </select>
<select id="fetchUninvoicedOrdersByShopForClientFullSQL" resultType="org.jeecg.modules.business.vo.PlatformOrderFront"> <select id="fetchUninvoicedOrdersByShopForClientFullSQL" resultType="org.jeecg.modules.business.vo.PlatformOrderFront">
-- sku_stats counts the number of weights and prices for each sku
-- this is used to determine if an order is available for shipping or purchase invoicing
WITH sku_stats AS ( WITH sku_stats AS (
SELECT SELECT
sku.id AS sku_id, sku.id AS sku_id,
@ -769,7 +771,19 @@
</foreach> </foreach>
GROUP BY po.id, po.platform_order_number, po.product_available, po.virtual_product_available, po.purchase_invoice_number GROUP BY po.id, po.platform_order_number, po.product_available, po.virtual_product_available, po.purchase_invoice_number
) )
SELECT *, COUNT(*) OVER() AS total_count SELECT *,
COUNT(*) OVER() AS total_count,
CASE
WHEN EXISTS (
SELECT 1
FROM platform_order_content poc
JOIN sku s ON poc.sku_id = s.id
WHERE poc.platform_order_id = uninvoiced_orders.id
AND s.is_synced = 0
AND poc.erp_status &lt;&gt; 5
) THEN 1
ELSE 0
END as has_desynced_sku
FROM uninvoiced_orders FROM uninvoiced_orders
WHERE WHERE
product_available IN product_available IN
@ -962,6 +976,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} OR purchase_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
@ -1278,8 +1297,6 @@
<select id="countListByClientAndShops" resultType="java.lang.Integer"> <select id="countListByClientAndShops" resultType="java.lang.Integer">
SELECT count(po.id) SELECT count(po.id)
FROM platform_order po FROM platform_order po
JOIN platform_order_content poc ON po.id = poc.platform_order_id
JOIN sku s ON poc.sku_id = s.id
JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name
WHERE po.erp_status IN WHERE po.erp_status IN
<foreach collection="erpStatuses" separator="," open="(" close=")" index="index" item="erpStatus"> <foreach collection="erpStatuses" separator="," open="(" close=")" index="index" item="erpStatus">
@ -1303,6 +1320,7 @@
<if test="erpStatuses.size > 1"> <if test="erpStatuses.size > 1">
AND po.order_time BETWEEN #{start} AND #{end} AND po.order_time BETWEEN #{start} AND #{end}
</if> </if>
AND po.shipping_invoice_number IS NULL
</select> </select>
<select id="listByClientAndShops" resultType="org.jeecg.modules.business.vo.PlatformOrderFront"> <select id="listByClientAndShops" resultType="org.jeecg.modules.business.vo.PlatformOrderFront">
WITH orders AS ( WITH orders AS (

View File

@ -5,8 +5,11 @@ import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject; import org.codehaus.jettison.json.JSONObject;
import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order; 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.domain.api.mabang.orderUpdateOrderNewOrder.UpdateResult;
import org.jeecg.modules.business.vo.PlatformOrderOperation; import org.jeecg.modules.business.vo.PlatformOrderOperation;
import org.jeecg.modules.business.vo.Response;
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 +47,10 @@ 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);
ResponsesWithMsg<String> deleteOrderRemark(String invoiceNumber);
Response<List<UpdateResult>, List<UpdateResult>> updateOrderStatusToPreparing(List<String> platformOrderIds);
} }

View File

@ -263,6 +263,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);

View File

@ -1,10 +1,8 @@
package org.jeecg.modules.business.service; package org.jeecg.modules.business.service;
import com.baomidou.mybatisplus.extension.service.IService; 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.domain.api.mabang.purDoGetProvider.ProviderData;
import org.jeecg.modules.business.vo.InvoiceMetaData; import org.jeecg.modules.business.vo.InvoiceMetaData;
import org.jeecg.modules.business.vo.Response;
import org.jeecg.modules.business.vo.Responses; import org.jeecg.modules.business.vo.Responses;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -23,6 +21,4 @@ public interface IProviderMabangService extends IService<ProviderData> {
Responses addPurchaseOrderToMabang(Map<String, Integer> skuQuantities, InvoiceMetaData metaData, AtomicReference<Map<String, LocalDateTime>> providersHistory); Responses addPurchaseOrderToMabang(Map<String, Integer> skuQuantities, InvoiceMetaData metaData, AtomicReference<Map<String, LocalDateTime>> providersHistory);
Responses deletePurchaseOrderFromMabang(List<String> groupIds); Responses deletePurchaseOrderFromMabang(List<String> groupIds);
Response<List<UpdateResult>, List<UpdateResult>> updateOrderStatusToPreparing(List<String> platformOrderIds);
} }

View File

@ -47,4 +47,6 @@ public interface ISkuListMabangService extends IService<SkuData> {
List<SkuOrderPage> unpairedSkus(String shopId, Integer pageNo, Integer pageSize, String column, String order); List<SkuOrderPage> unpairedSkus(String shopId, Integer pageNo, Integer pageSize, String column, String order);
int countUnpairedSkus(String shopId); int countUnpairedSkus(String shopId);
void compareClientSkusWithMabang(Map<String, Sku> clientSkus);
} }

View File

@ -46,6 +46,7 @@ import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*;
import static org.jeecg.modules.business.entity.Invoice.InvoicingMethod.*;
@Service @Service
@Slf4j @Slf4j
@ -284,7 +285,7 @@ public class PlatformOrderShippingInvoiceService {
public InvoiceMetaData makeCompleteInvoicePostShipping(ShippingInvoiceParam param, String method, String ... user) throws UserException, ParseException, IOException, MessagingException { public InvoiceMetaData makeCompleteInvoicePostShipping(ShippingInvoiceParam param, String method, String ... user) throws UserException, ParseException, IOException, MessagingException {
String username = user.length > 0 ? user[0] : ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(); String username = user.length > 0 ? user[0] : ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername();
List<PlatformOrder> platformOrderList; List<PlatformOrder> platformOrderList;
if(method.equals("post")) { if(method.equals(POSTSHIPPING.getMethod())) {
//On récupère les commandes entre 2 dates d'expédition avec un status 3 //On récupère les commandes entre 2 dates d'expédition avec un status 3
platformOrderList = platformOrderMapper.fetchUninvoicedShippedOrderIDInShops(param.getStart(), param.getEnd(), param.shopIDs(), param.getWarehouses()); platformOrderList = platformOrderMapper.fetchUninvoicedShippedOrderIDInShops(param.getStart(), param.getEnd(), param.shopIDs(), param.getWarehouses());
} else { } else {
@ -644,7 +645,7 @@ public class PlatformOrderShippingInvoiceService {
balanceService.updateBalance(entry.getKey(), metaData.getInvoiceCode(), SHIPPING.name()); balanceService.updateBalance(entry.getKey(), metaData.getInvoiceCode(), SHIPPING.name());
} }
else { else {
metaData = makeCompleteInvoicePostShipping(param, "post"); metaData = makeCompleteInvoicePostShipping(param, POSTSHIPPING.getMethod());
if(client.getClientCategoryId().equals(clientCategoryService.getIdByCode(CategoryName.VIP.getName())) if(client.getClientCategoryId().equals(clientCategoryService.getIdByCode(CategoryName.VIP.getName()))
|| client.getClientCategoryId().equals(clientCategoryService.getIdByCode(CategoryName.CONFIRMED.getName()))) || client.getClientCategoryId().equals(clientCategoryService.getIdByCode(CategoryName.CONFIRMED.getName())))
balanceService.updateBalance(entry.getKey(), metaData.getInvoiceCode(), COMPLETE.name()); balanceService.updateBalance(entry.getKey(), metaData.getInvoiceCode(), COMPLETE.name());
@ -701,7 +702,7 @@ public class PlatformOrderShippingInvoiceService {
balanceService.updateBalance(clientId, metaData.getInvoiceCode(), SHIPPING.name()); balanceService.updateBalance(clientId, metaData.getInvoiceCode(), SHIPPING.name());
} }
else { else {
metaData = makeCompleteInvoicePostShipping(param, "pre-shipping", "system"); metaData = makeCompleteInvoicePostShipping(param, PRESHIPPING.getMethod(), "system");
balanceService.updateBalance(clientId, metaData.getInvoiceCode(), COMPLETE.name()); balanceService.updateBalance(clientId, metaData.getInvoiceCode(), COMPLETE.name());
} }
platformOrderMapper.updateErpStatusByCode(metaData.getInvoiceCode(), 2); platformOrderMapper.updateErpStatusByCode(metaData.getInvoiceCode(), 2);

View File

@ -31,6 +31,8 @@ public class InvoiceServiceImpl extends ServiceImpl<InvoiceMapper, Invoice> impl
@Autowired @Autowired
private IPlatformOrderContentService platformOrderContentService; private IPlatformOrderContentService platformOrderContentService;
@Autowired @Autowired
private IPlatformOrderMabangService platformOrderMabangService;
@Autowired
private IPlatformOrderService platformOrderService; private IPlatformOrderService platformOrderService;
@Autowired @Autowired
private IPurchaseOrderService purchaseOrderService; private IPurchaseOrderService purchaseOrderService;
@ -83,6 +85,7 @@ public class InvoiceServiceImpl extends ServiceImpl<InvoiceMapper, Invoice> impl
shippingInvoiceService.deleteAttachmentFile(po.getInventoryDocumentString()); shippingInvoiceService.deleteAttachmentFile(po.getInventoryDocumentString());
if (po.getPaymentDocumentString() != null && !po.getPaymentDocumentString().isEmpty()) if (po.getPaymentDocumentString() != null && !po.getPaymentDocumentString().isEmpty())
shippingInvoiceService.deleteAttachmentFile(po.getPaymentDocumentString()); shippingInvoiceService.deleteAttachmentFile(po.getPaymentDocumentString());
platformOrderMabangService.deleteOrderRemark(invoiceNumber);
platformOrderService.removePurchaseInvoiceNumber(invoiceNumber, clientId); platformOrderService.removePurchaseInvoiceNumber(invoiceNumber, clientId);
purchaseOrderService.cancelInvoice(id); purchaseOrderService.cancelInvoice(id);
} }
@ -119,6 +122,7 @@ public class InvoiceServiceImpl extends ServiceImpl<InvoiceMapper, Invoice> impl
if(purchase.getPaymentDocumentString() != null && !purchase.getPaymentDocumentString().isEmpty()) if(purchase.getPaymentDocumentString() != null && !purchase.getPaymentDocumentString().isEmpty())
shippingInvoiceService.deleteAttachmentFile(purchase.getPaymentDocumentString()); shippingInvoiceService.deleteAttachmentFile(purchase.getPaymentDocumentString());
platformOrderContentService.cancelInvoice(invoiceNumber, clientId); platformOrderContentService.cancelInvoice(invoiceNumber, clientId);
platformOrderMabangService.deleteOrderRemark(invoiceNumber);
platformOrderService.removePurchaseInvoiceNumber(invoiceNumber, clientId); platformOrderService.removePurchaseInvoiceNumber(invoiceNumber, clientId);
platformOrderService.cancelInvoice(invoiceNumber, clientId); platformOrderService.cancelInvoice(invoiceNumber, clientId);
purchaseOrderService.cancelInvoice(purchase.getId()); purchaseOrderService.cancelInvoice(purchase.getId());

View File

@ -3,23 +3,29 @@ package org.jeecg.modules.business.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpStatus;
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.*;
import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendRequest; 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.OrderSuspendRequestBody;
import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendResponse; import org.jeecg.modules.business.domain.api.mabang.orderDoOrderAbnormal.OrderSuspendResponse;
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.job.ThrottlingExecutorService; import org.jeecg.modules.business.domain.job.ThrottlingExecutorService;
import org.jeecg.modules.business.entity.PlatformOrder; import org.jeecg.modules.business.entity.PlatformOrder;
import org.jeecg.modules.business.mapper.PlatformOrderMabangMapper; import org.jeecg.modules.business.mapper.PlatformOrderMabangMapper;
import org.jeecg.modules.business.service.IPlatformOrderMabangService; 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.Response;
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 +37,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 +57,11 @@ 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;
@Override @Override
@Transactional @Transactional
public void saveOrderFromMabang(List<Order> orders) { public void saveOrderFromMabang(List<Order> orders) {
@ -379,4 +388,134 @@ 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);
log.info("Editing orders remark with invoice number {} for platform order ids {}", invoiceNumber, platformOrderIds);
ExecutorService executor = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS,
MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES);
List<OrderListRequestBody> OrderRequests = new ArrayList<>();
List<List<String>> orderIdsPartition = Lists.partition(platformOrderIds, 10);
for (List<String> platformOrderIdList : orderIdsPartition) {
OrderRequests.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList));
}
List<Order> ordersFromMabang = getOrdersFromMabang(OrderRequests, executor);
List<EditRemarkRequestBody> editRemarkRequests = new ArrayList<>();
for(Order order: ordersFromMabang) {
editRemarkRequests.add(new EditRemarkRequestBody(order.getPlatformOrderId(), order.getRemark()+ " " + invoiceNumber));
}
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;
}
@Override
public ResponsesWithMsg<String> deleteOrderRemark(String invoiceNumber) {
ResponsesWithMsg<String> responses = new ResponsesWithMsg<>();
List<String> orderIds = platformOrderService.getPlatformOrderIdsByInvoiceNumber(invoiceNumber);
log.info("Removing orders remark with invoice number {} for platform order ids {}", invoiceNumber, orderIds);
ExecutorService executor = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS,
MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES);
List<OrderListRequestBody> OrderRequests = new ArrayList<>();
List<List<String>> orderIdsPartition = Lists.partition(orderIds, 10);
for (List<String> platformOrderIdList : orderIdsPartition) {
OrderRequests.add(new OrderListRequestBody().setPlatformOrderIds(platformOrderIdList));
}
List<Order> ordersFromMabang = getOrdersFromMabang(OrderRequests, executor);
List<EditRemarkRequestBody> removeRemarkRequests = new ArrayList<>();
for(Order order: ordersFromMabang) {
Matcher invoiceRemarkMatcher = Pattern.compile("^(.*)("+ invoiceNumber +")(.*)$").matcher(order.getRemark());
if(invoiceRemarkMatcher.matches() && !invoiceRemarkMatcher.group(2).isEmpty()) {
log.info("Invoice number {} found in order remark {}", invoiceNumber, order.getPlatformOrderId());
String orderRemark1 = invoiceRemarkMatcher.group(1);
String orderRemark2 = invoiceRemarkMatcher.group(3);
removeRemarkRequests.add(new EditRemarkRequestBody(order.getPlatformOrderId(), orderRemark1.trim() + " " +orderRemark2.trim()));
} else {
log.info("Invoice number {} not found in order remark {}", invoiceNumber, order.getPlatformOrderId());
}
}
List<CompletableFuture<Boolean>> editRemarkFutures = removeRemarkRequests.stream()
.map(request -> CompletableFuture.supplyAsync(() -> {
boolean success = false;
try {
EditRemarkRequest removeRemarkRequest = new EditRemarkRequest(request);
ChangeOrderResponse response = removeRemarkRequest.send();
success = response.success();
if (success) {
responses.addSuccess(request.getPlatformOrderId());
} else {
responses.addFailure(request.getPlatformOrderId(), response.getMessage());
}
} catch (RuntimeException e) {
log.error("Error removing 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 removed successfully.", nbSuccesses, removeRemarkRequests.size());
return responses;
}
@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>> orderPartitions = Lists.partition(platformOrderIds, 50);
ExecutorService throttlingExecutorService = ThrottlingExecutorService.createExecutorService(DEFAULT_NUMBER_OF_THREADS,
MABANG_API_RATE_LIMIT_PER_MINUTE, TimeUnit.MINUTES);
List<CompletableFuture<Boolean>> updateOrderFutures = orderPartitions.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;
}
} }

View File

@ -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) {

View File

@ -1,16 +1,10 @@
package org.jeecg.modules.business.service.impl; package org.jeecg.modules.business.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpStatus;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.*; 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.AddPurchaseOrderRequest;
import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderRequestBody; import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderRequestBody;
import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderResponse; import org.jeecg.modules.business.domain.api.mabang.purDoAddPurchase.AddPurchaseOrderResponse;
@ -26,7 +20,6 @@ import org.jeecg.modules.business.service.IProviderMabangService;
import org.jeecg.modules.business.service.IProviderService; import org.jeecg.modules.business.service.IProviderService;
import org.jeecg.modules.business.service.IPurchaseOrderService; import org.jeecg.modules.business.service.IPurchaseOrderService;
import org.jeecg.modules.business.vo.InvoiceMetaData; import org.jeecg.modules.business.vo.InvoiceMetaData;
import org.jeecg.modules.business.vo.Response;
import org.jeecg.modules.business.vo.Responses; import org.jeecg.modules.business.vo.Responses;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -243,42 +236,4 @@ public class ProviderMabangServiceImpl extends ServiceImpl<ProviderMabangMapper,
log.info("{}/{} purchase orders deleted successfully from Mabang. GroupIds : {}", nbSuccesses, groupIds.size(), groupIds); log.info("{}/{} purchase orders deleted successfully from Mabang. GroupIds : {}", nbSuccesses, groupIds.size(), groupIds);
return groupIdsDeleteResult; 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;
}
} }

View File

@ -24,6 +24,7 @@ import org.jeecg.modules.business.domain.api.mabang.stockGetStockQuantity.SkuSto
import org.jeecg.modules.business.domain.job.ThrottlingExecutorService; import org.jeecg.modules.business.domain.job.ThrottlingExecutorService;
import org.jeecg.modules.business.entity.*; import org.jeecg.modules.business.entity.*;
import org.jeecg.modules.business.mapper.SkuListMabangMapper; import org.jeecg.modules.business.mapper.SkuListMabangMapper;
import org.jeecg.modules.business.model.SkuDocument;
import org.jeecg.modules.business.mongoService.SkuMongoService; import org.jeecg.modules.business.mongoService.SkuMongoService;
import org.jeecg.modules.business.service.*; import org.jeecg.modules.business.service.*;
import org.jeecg.modules.business.vo.ResponsesWithMsg; import org.jeecg.modules.business.vo.ResponsesWithMsg;
@ -40,6 +41,8 @@ import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import javax.mail.Authenticator; import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication; import javax.mail.PasswordAuthentication;
import javax.mail.Session; import javax.mail.Session;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
@ -889,4 +892,79 @@ public class SkuListMabangServiceImpl extends ServiceImpl<SkuListMabangMapper, S
public int countUnpairedSkus(String shopId) { public int countUnpairedSkus(String shopId) {
return skuService.countUnpairedSkus(shopId); return skuService.countUnpairedSkus(shopId);
} }
@Override
public void compareClientSkusWithMabang(Map<String, Sku> clientSkus) {
List<String> skuIds = new ArrayList<>(clientSkus.keySet());
List<SkuDocument> clientSkuDocs = new ArrayList<>();
for(String skuId: skuIds) {
List<SkuDocument> skus = skuMongoService.findBySkuId(skuId);
if(skus.isEmpty()) {
skuMongoService.migrateOneSku(clientSkus.get(skuId));
skus = skuMongoService.findBySkuId(skuId);
}
SkuDocument sku = skus.get(0);
clientSkuDocs.add(sku);
}
List<List<String>> erpCodePartition = Lists.partition(clientSkuDocs, 50)
.stream()
.map(skus -> skus.stream().map(SkuDocument::getErpCode).collect(Collectors.toList()))
.collect(Collectors.toList());
List<SkuData> skusFromMabang = new ArrayList<>();
for(List<String> partition : erpCodePartition) {
SkuListRequestBody body = new SkuListRequestBody();
body.setStockSkuList(String.join(",", partition));
SkuListRawStream rawStream = new SkuListRawStream(body);
SkuUpdateListStream stream = new SkuUpdateListStream(rawStream);
skusFromMabang.addAll(stream.all());
}
List<String> desyncedSkus = new ArrayList<>();
List<String> syncedSkus = new ArrayList<>();
for(SkuDocument sku : clientSkuDocs) {
SkuData skuData = skusFromMabang.stream().filter(s -> s.getErpCode().equals(sku.getErpCode()))
.findFirst().orElse(null);
if(skuData != null) {
boolean isDesynced = false;
BigDecimal mabangPrice = skuData.getSalePrice().setScale(2, RoundingMode.HALF_UP); // because price from mabang has 4 decimal places, so Objects.equals will always return false
int weightInRemark = -1;
Matcher saleRemarkMatcher = saleRemarkPattern.matcher(skuData.getSaleRemark());
if(saleRemarkMatcher.matches() && !saleRemarkMatcher.group(1).isEmpty()) {
String saleRemark = saleRemarkMatcher.group(1);
weightInRemark = (int) ceil(Double.parseDouble(saleRemark));
}
if(weightInRemark == -1 && sku.getLatestSkuWeight() != null) {
log.info("sku {} doesn't have a weight on Mabang but has one in Mongo", skuData.getErpCode());
isDesynced = true;
}
if (sku.getLatestSkuWeight() != null && !Objects.equals(weightInRemark, sku.getLatestSkuWeight().getWeight())) {
log.info("sku {} has a different weight on Mabang and in Mongo : mabang :{}; mongo :{}", skuData.getErpCode() ,weightInRemark, sku.getLatestSkuWeight().getWeight());
isDesynced = true;
}
if(skuData.getSalePrice() == null && sku.getLatestSkuPrice() != null) {
log.info("sku {} doesn't have a price on Mabang but has one in mongo", skuData.getErpCode());
isDesynced = true;
}
if(sku.getLatestSkuPrice() != null && !Objects.equals(mabangPrice, sku.getLatestSkuPrice().getPrice())) {
log.info("sku {} has a different price on Mabang and in Mongo : mabang :{}; mongo :{}", skuData.getErpCode() ,skuData.getSalePrice(), sku.getLatestSkuPrice().getPrice());
isDesynced = true;
}
if(isDesynced)
desyncedSkus.add(skuData.getErpCode());
else
syncedSkus.add(skuData.getErpCode());
} else {
desyncedSkus.add(sku.getErpCode());
}
}
if(!desyncedSkus.isEmpty()) {
log.info("Desynced skus : {}", desyncedSkus);
skuService.setIsSynced(desyncedSkus, false);
}
if(!syncedSkus.isEmpty()) {
log.info("Synced skus : {}", syncedSkus);
skuService.setIsSynced(syncedSkus, true);
}
}
} }