mirror of https://github.com/jeecgboot/jeecg-boot
(WIP) Row locking when invoicing and job updating orders with skip locked or skip wait
parent
001e527bae
commit
ef42e80004
|
@ -1332,12 +1332,16 @@ public class InvoiceController {
|
|||
String orderId = params.get("orderId");
|
||||
try {
|
||||
PlatformOrder orderToEdit = platformOrderService.selectForUpdateSkipLock(orderId);
|
||||
|
||||
if(orderToEdit == null) {
|
||||
return Result.error(404,"Order not found.");
|
||||
}
|
||||
orderToEdit.setCanSend("2");
|
||||
boolean edited = platformOrderService.updateById(orderToEdit);
|
||||
return Result.OK(edited);
|
||||
} catch (Exception e) {
|
||||
if(e instanceof CannotAcquireLockException) {
|
||||
return Result.error("Order is already being edited by another user");
|
||||
return Result.error(409,"Order is already being edited by another user.");
|
||||
}
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
|
|
|
@ -170,8 +170,6 @@ public class ShippingInvoiceFactory {
|
|||
log.info("Creating a complete invoice for \n client ID: {}, order IDs: {}]", customerId, orderIds);
|
||||
// find orders and their contents of the invoice
|
||||
Map<PlatformOrder, List<PlatformOrderContent>> uninvoicedOrderToContent = platformOrderService.fetchOrderDataForUpdate(orderIds);
|
||||
System.out.println("Sleeping for 1 minute for testing");
|
||||
Thread.sleep(60000);
|
||||
Set<PlatformOrder> platformOrders = uninvoicedOrderToContent.keySet();
|
||||
List<SavRefundWithDetail> savRefunds = savRefundWithDetailService.findUnprocessedRefundsByClient(customerId);
|
||||
List<String> shopIds = platformOrders.stream()
|
||||
|
|
|
@ -172,12 +172,12 @@ public interface PlatformOrderMapper extends BaseMapper<PlatformOrder> {
|
|||
List<PlatformOrderShopSync> fetchOrderInShopsWithoutShopifyNote(@Param("shops") List<String> shopCodes);
|
||||
List<PlatformOrder> fetchOrderInShopsReadyForAbnNumberJob(@Param("shops") List<String> shopCodes);
|
||||
|
||||
List<PlatformOrder> fetchUninvoicedShippedOrderIDInShops(@Param("startDate") String startDate,
|
||||
List<String> fetchUninvoicedShippedOrderIDInShops(@Param("startDate") String startDate,
|
||||
@Param("endDate") String endDate,
|
||||
@Param("shops") List<String> shops,
|
||||
@Param("warehouses") List<String> warehouses);
|
||||
|
||||
List<PlatformOrder> fetchUninvoicedOrderIDInShopsAndOrderTime(@Param("startDate") String startDate,
|
||||
List<String> fetchUninvoicedOrderIDInShopsAndOrderTime(@Param("startDate") String startDate,
|
||||
@Param("endDate") String endDate,
|
||||
@Param("shops") List<String> shops,
|
||||
@Param("erpStatuses") List<Integer> erpStatuses,
|
||||
|
|
|
@ -82,7 +82,7 @@
|
|||
FROM platform_order_content
|
||||
WHERE erp_status <> 5
|
||||
AND platform_order_id IN <foreach collection="list" index="i" item="item" open="(" separator="," close=")">#{item}</foreach>
|
||||
FOR UPDATE;
|
||||
FOR UPDATE NOWAIT;
|
||||
</select>
|
||||
|
||||
<select id="searchSkuDetail"
|
||||
|
@ -166,6 +166,7 @@
|
|||
separator=",">
|
||||
#{erpStatus}
|
||||
</foreach>
|
||||
FOR UPDATE NOWAIT;
|
||||
</select>
|
||||
|
||||
<select id="findUninvoicedShippedOrderContents" resultType="org.jeecg.modules.business.entity.PlatformOrderContent">
|
||||
|
|
|
@ -163,7 +163,8 @@
|
|||
AND shipping_time >= #{begin}
|
||||
AND #{end} >= shipping_time
|
||||
AND shipping_invoice_number IS NULL
|
||||
AND erp_status = 3;
|
||||
AND erp_status = 3
|
||||
FOR UPDATE;
|
||||
</select>
|
||||
<select id="findUninvoicedOrdersForShopsAndStatus" resultType="org.jeecg.modules.business.entity.PlatformOrder">
|
||||
SELECT *
|
||||
|
@ -193,6 +194,7 @@
|
|||
>
|
||||
#{erpStatus}
|
||||
</foreach>
|
||||
FOR UPDATE
|
||||
;
|
||||
</select>
|
||||
<select id="findUninvoicedShippedOrders" resultType="org.jeecg.modules.business.entity.PlatformOrder">
|
||||
|
@ -508,7 +510,7 @@
|
|||
ORDER BY order_time;
|
||||
</select>
|
||||
|
||||
<select id="fetchUninvoicedShippedOrderIDInShops" resultType="org.jeecg.modules.business.entity.PlatformOrder">
|
||||
<select id="fetchUninvoicedShippedOrderIDInShops" resultType="java.lang.String">
|
||||
SELECT po.id
|
||||
FROM platform_order po
|
||||
JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name
|
||||
|
@ -538,7 +540,7 @@
|
|||
AND po.shipping_time between #{startDate} AND #{endDate}
|
||||
AND po.erp_status = 3;
|
||||
</select>
|
||||
<select id="fetchUninvoicedOrderIDInShopsAndOrderTime" resultType="org.jeecg.modules.business.entity.PlatformOrder">
|
||||
<select id="fetchUninvoicedOrderIDInShopsAndOrderTime" resultType="java.lang.String">
|
||||
SELECT po.id
|
||||
FROM platform_order po
|
||||
JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name
|
||||
|
@ -576,7 +578,8 @@
|
|||
item="erpStatus"
|
||||
>
|
||||
#{erpStatus}
|
||||
</foreach>;
|
||||
</foreach>
|
||||
FOR UPDATE;
|
||||
</select>
|
||||
<select id="fetchOrdersToArchiveBetweenDate" resultType="org.jeecg.modules.business.entity.PlatformOrder">
|
||||
SELECT *
|
||||
|
@ -1391,6 +1394,6 @@
|
|||
<select id="selectForUpdateSkipLock" resultType="org.jeecg.modules.business.entity.PlatformOrder">
|
||||
SELECT * FROM platform_order
|
||||
WHERE id = #{id}
|
||||
FOR UPDATE SKIP LOCKED; -- todo : NO WAIT is recognized but not SKIP LOCKED
|
||||
FOR UPDATE;
|
||||
</select>
|
||||
</mapper>
|
||||
|
|
|
@ -152,8 +152,6 @@ public interface IPlatformOrderService extends IService<PlatformOrder> {
|
|||
|
||||
List<PlatformOrder> fetchOrderInShopsReadyForAbnNumberJob(List<String> shopCodes);
|
||||
|
||||
List<PlatformOrder> fetchUninvoicedShippedOrderIDInShops(String startDate, String endDate, List<String> shops, List<String> warehouses);
|
||||
|
||||
/**
|
||||
* Fetch all platform orders between 2 dates and of status erp_status 4 or 5
|
||||
* this list will then be archived
|
||||
|
|
|
@ -207,8 +207,7 @@ public class PlatformOrderShippingInvoiceService {
|
|||
return new Period(beginZoned, endZoned, "");
|
||||
}
|
||||
public List<String> getShippingOrderIdBetweenDate(List<String> shops, String start, String end, List<String> wareHouses) {
|
||||
List<PlatformOrder> orders = platformOrderMapper.fetchUninvoicedShippedOrderIDInShops( start, end, shops, wareHouses);
|
||||
return orders.stream().map(PlatformOrder::getId).collect(Collectors.toList());
|
||||
return platformOrderMapper.fetchUninvoicedShippedOrderIDInShops( start, end, shops, wareHouses);
|
||||
}
|
||||
/**
|
||||
* Make an invoice based on parameters.
|
||||
|
@ -284,16 +283,14 @@ public class PlatformOrderShippingInvoiceService {
|
|||
@Transactional
|
||||
public InvoiceMetaData makeCompleteInvoicePostShipping(ShippingInvoiceParam param, String method, String ... user) throws UserException, ParseException, IOException, MessagingException, InterruptedException {
|
||||
String username = user.length > 0 ? user[0] : ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername();
|
||||
List<PlatformOrder> platformOrderList;
|
||||
List<String> orderIds;
|
||||
if(method.equals(POSTSHIPPING.getMethod())) {
|
||||
//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());
|
||||
orderIds = platformOrderMapper.fetchUninvoicedShippedOrderIDInShops(param.getStart(), param.getEnd(), param.shopIDs(), param.getWarehouses());
|
||||
} else {
|
||||
// On récupère les commandes entre 2 dates de commandes avec un status (1,2) ou (1,2,3)
|
||||
platformOrderList = platformOrderMapper.fetchUninvoicedOrderIDInShopsAndOrderTime(param.getStart(), param.getEnd(), param.shopIDs(), param.getErpStatuses(), param.getWarehouses());
|
||||
orderIds = platformOrderMapper.fetchUninvoicedOrderIDInShopsAndOrderTime(param.getStart(), param.getEnd(), param.shopIDs(), param.getErpStatuses(), param.getWarehouses());
|
||||
}
|
||||
// on récupère seulement les ID des commandes
|
||||
List<String> orderIds = platformOrderList.stream().map(PlatformOrder::getId).collect(Collectors.toList());
|
||||
// Creates invoice by factory
|
||||
CompleteInvoice invoice = factory.createCompleteShippingInvoice(username, param.clientID(), param.getBalance() ,orderIds, method, param.getStart(), param.getEnd());
|
||||
return getInvoiceMetaDataAndInsert(username, invoice);
|
||||
|
|
|
@ -155,11 +155,13 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl<PlatformOrderMab
|
|||
try {
|
||||
if (!oldOrders.isEmpty()) {
|
||||
log.info("{} orders to be inserted/updated.", oldOrders.size());
|
||||
platformOrderService.fetchOrderDataForUpdate(oldOrders.stream().map(Order::getId).collect(toList()));
|
||||
platformOrderMabangMapper.batchUpdateById(oldOrders);
|
||||
platformOrderMabangMapper.batchDeleteByMainID(oldOrders.stream().map(Order::getId).collect(toList()));
|
||||
}
|
||||
if (!ordersFromShippedToCompleted.isEmpty()) {
|
||||
log.info("{} orders to be updated from Shipped to Completed.", ordersFromShippedToCompleted.size());
|
||||
platformOrderService.fetchOrderDataForUpdate(ordersFromShippedToCompleted.stream().map(Order::getId).collect(toList()));
|
||||
platformOrderMabangMapper.batchUpdateById(ordersFromShippedToCompleted);
|
||||
log.info("Contents of {} orders to be updated from Shipped to Completed.", ordersFromShippedToCompleted.size());
|
||||
platformOrderMabangMapper.batchUpdateErpStatusByMainId(
|
||||
|
@ -168,6 +170,7 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl<PlatformOrderMab
|
|||
}
|
||||
if (!invoicedShippedOrders.isEmpty()) {
|
||||
log.info("{} orders to be updated from Pending/Preparing to Shipped.", invoicedShippedOrders.size());
|
||||
platformOrderService.fetchOrderDataForUpdate(invoicedShippedOrders.stream().map(Order::getId).collect(toList()));
|
||||
platformOrderMabangMapper.batchUpdateById(invoicedShippedOrders);
|
||||
log.info("Contents of {} orders to be updated from Pending/Preparing to Shipped.", invoicedShippedOrders.size());
|
||||
platformOrderMabangMapper.batchUpdateErpStatusByMainId(
|
||||
|
@ -176,6 +179,7 @@ public class PlatformOrderMabangServiceImpl extends ServiceImpl<PlatformOrderMab
|
|||
}
|
||||
if (!obsoleteOrders.isEmpty()) {
|
||||
log.info("{} orders to become obsolete.", obsoleteOrders.size());
|
||||
platformOrderService.fetchOrderDataForUpdate(obsoleteOrders.stream().map(Order::getId).collect(toList()));
|
||||
platformOrderMabangMapper.batchUpdateById(obsoleteOrders);
|
||||
log.info("Contents of {} orders to be updated to Obsolete.", obsoleteOrders.size());
|
||||
platformOrderMabangMapper.batchUpdateErpStatusByMainId(
|
||||
|
|
|
@ -279,7 +279,7 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
|
|||
@Override
|
||||
public Map<PlatformOrder, List<PlatformOrderContent>> findUninvoicedOrders(List<String> shopIds, Date begin, Date end, List<String> warehouses) {
|
||||
List<PlatformOrder> orderList = platformOrderMap.findUninvoicedOrders(shopIds, begin, end, warehouses);
|
||||
List<PlatformOrderContent> orderContents = platformOrderContentMap.fetchOrderContent(orderList.stream().map(PlatformOrder::getId).collect(toList()));
|
||||
List<PlatformOrderContent> orderContents = platformOrderContentMap.fetchOrderContentForUpdate(orderList.stream().map(PlatformOrder::getId).collect(toList()));
|
||||
Map<String, PlatformOrder> orderMap = orderList.stream().collect(toMap(PlatformOrder::getId, Function.identity()));
|
||||
return orderContents.stream().collect(groupingBy(platformOrderContent -> orderMap.get(platformOrderContent.getPlatformOrderId())));
|
||||
}
|
||||
|
@ -306,7 +306,7 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
|
|||
return orderContents.stream().collect(groupingBy(platformOrderContent -> orderMap.get(platformOrderContent.getPlatformOrderId())));
|
||||
}
|
||||
|
||||
// TODO: maybe duplicate this for non invoicing usage
|
||||
// TODO: maybe duplicate this for non invoicing usage !
|
||||
@Override
|
||||
public Map<PlatformOrder, List<PlatformOrderContent>> fetchOrderData(List<String> orderIds) {
|
||||
List<PlatformOrder> orderList = platformOrderMap.selectBatchIds(orderIds);
|
||||
|
@ -400,10 +400,6 @@ public class PlatformOrderServiceImpl extends ServiceImpl<PlatformOrderMapper, P
|
|||
return platformOrderMap.fetchOrderInShopsReadyForAbnNumberJob(shopCodes);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<PlatformOrder> fetchUninvoicedShippedOrderIDInShops(String startDate, String endDate, List<String> shops, List<String> warehouses) {
|
||||
return platformOrderMap.fetchUninvoicedShippedOrderIDInShops(startDate, endDate, shops, warehouses);
|
||||
}
|
||||
@Override
|
||||
public List<PlatformOrder> fetchOrdersToArchiveBetweenDate(String startDate, String endDate) {
|
||||
return platformOrderMap.fetchOrdersToArchiveBetweenDate(startDate, endDate);
|
||||
|
|
Loading…
Reference in New Issue