diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java index 9f8bd3508..94a354836 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java @@ -28,6 +28,7 @@ import org.jeecg.modules.quartz.service.IQuartzJobService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; +import org.springframework.dao.CannotAcquireLockException; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; @@ -267,7 +268,7 @@ public class InvoiceController { } catch (IOException | ParseException e) { log.error(e.getMessage()); return Result.error("Sorry, server error, please try later"); - } catch (MessagingException e) { + } catch (MessagingException | InterruptedException e) { throw new RuntimeException(e); } } @@ -436,7 +437,7 @@ public class InvoiceController { } catch (IOException | ParseException e) { log.error(e.getMessage()); return Result.error("Sorry, server error, please try later"); - } catch (MessagingException | TemplateException e) { + } catch (MessagingException | TemplateException | InterruptedException e) { throw new RuntimeException(e); } } @@ -1325,4 +1326,20 @@ public class InvoiceController { throw new RuntimeException(e); } } + @PostMapping("/editOrderTest") + public Result editOrderTest(@RequestBody Map params) { + System.out.println("Edit Order Test : " + params.get("orderId")); + String orderId = params.get("orderId"); + try { + PlatformOrder orderToEdit = platformOrderService.selectForUpdateSkipLock(orderId); + 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"); + } + throw new RuntimeException(e); + } + } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java index cfb07dd3e..b37915747 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java @@ -123,7 +123,7 @@ public class ShippingInvoiceFactory { public ShippingInvoice createShippingInvoice(String customerId, List orderIds, String type, String start, String end) throws UserException { log.info("Creating an invoice with arguments:\n client ID: {}, order IDs: {}]", customerId, orderIds); // find orders and their contents of the invoice - Map> uninvoicedOrderToContent = platformOrderService.fetchOrderData(orderIds); + Map> uninvoicedOrderToContent = platformOrderService.fetchOrderDataForUpdate(orderIds); Set platformOrders = uninvoicedOrderToContent.keySet(); List savRefunds = savRefundWithDetailService.findUnprocessedRefundsByClient(customerId); List shopIds = platformOrders.stream() @@ -166,10 +166,12 @@ public class ShippingInvoiceFactory { * channel price, this exception will be thrown. */ @Transactional - public CompleteInvoice createCompleteShippingInvoice(String username, String customerId, BigDecimal balance, List orderIds, String shippingMethod, String start, String end) throws UserException, MessagingException { + public CompleteInvoice createCompleteShippingInvoice(String username, String customerId, BigDecimal balance, List orderIds, String shippingMethod, String start, String end) throws UserException, MessagingException, InterruptedException { log.info("Creating a complete invoice for \n client ID: {}, order IDs: {}]", customerId, orderIds); // find orders and their contents of the invoice - Map> uninvoicedOrderToContent = platformOrderService.fetchOrderData(orderIds); + Map> uninvoicedOrderToContent = platformOrderService.fetchOrderDataForUpdate(orderIds); + System.out.println("Sleeping for 1 minute for testing"); + Thread.sleep(60000); Set platformOrders = uninvoicedOrderToContent.keySet(); List savRefunds = savRefundWithDetailService.findUnprocessedRefundsByClient(customerId); List shopIds = platformOrders.stream() diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java index a87d0113f..82a1714f3 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderContentMapper.java @@ -46,7 +46,9 @@ public interface PlatformOrderContentMapper extends BaseMapper fetchOrderContent(List orderIds); + List fetchOrderContentForUpdate(List orderIds); List searchSkuDetail(List skuIDs); @@ -84,4 +86,5 @@ public interface PlatformOrderContentMapper extends BaseMapper searchShoumanOrderContent(); List searchShoumanOrderContentByPlatformOrderId(@Param("platformOrderId") String platformOrderId); + } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java index 9be8a94ae..7cfaf48bc 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java @@ -1,6 +1,7 @@ package org.jeecg.modules.business.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.MapKey; import org.apache.ibatis.annotations.Param; import org.jeecg.modules.business.domain.api.mabang.getorderlist.Order; import org.jeecg.modules.business.domain.api.yd.YDTrackingNumberData; @@ -255,4 +256,8 @@ public interface PlatformOrderMapper extends BaseMapper { @Param("start") String startDate, @Param("end") String endDate, @Param("order") String order, @Param("column") String column, @Param("offset") Integer offset, @Param("size") Integer pageSize); + @MapKey("id") + Map selectBatchIdsForUpdate(@Param("ids") List orderIds); + + PlatformOrder selectForUpdateSkipLock(@Param("id") String orderId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml index 6e4f96b9c..4f5dff595 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderContentMapper.xml @@ -76,6 +76,14 @@ WHERE erp_status <> 5 AND platform_order_id IN #{item} + + SELECT * FROM platform_order + WHERE id IN + + #{id} + + FOR UPDATE; + + diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java index 8273ce7cf..b92f7e562 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/IPlatformOrderService.java @@ -108,6 +108,8 @@ public interface IPlatformOrderService extends IService { */ Map> fetchOrderData(List orderIds); + Map> fetchOrderDataForUpdate(List orderIds); + Map> fetchOrderDataByInvoiceCode(String invoiceCode); @@ -293,4 +295,6 @@ public interface IPlatformOrderService extends IService { List listByClientAndShops(String clientId, List shopIds, String startDate, String endDate, String invoicingMethod, Integer pageNo, Integer pageSize, List warehouses, String order, String column); int countListByClientAndShops(String clientId, List shopIDs, String start, String end, String invoicingMethod, List warehouses); + + PlatformOrder selectForUpdateSkipLock(String orderId); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java index 00eb5ad39..40a412162 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/PlatformOrderShippingInvoiceService.java @@ -265,7 +265,7 @@ public class PlatformOrderShippingInvoiceService { * @throws IOException exception related to invoice file IO. */ @Transactional - public InvoiceMetaData makeCompleteInvoice(ShippingInvoiceOrderParam param) throws UserException, ParseException, IOException, MessagingException { + public InvoiceMetaData makeCompleteInvoice(ShippingInvoiceOrderParam param) throws UserException, ParseException, IOException, MessagingException, InterruptedException { String username = ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(); // Creates invoice by factory CompleteInvoice invoice = factory.createCompleteShippingInvoice(username, param.clientID(), null, param.orderIds(), param.getType(), param.getStart(), param.getEnd()); @@ -282,7 +282,7 @@ public class PlatformOrderShippingInvoiceService { * @throws IOException */ @Transactional - 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, InterruptedException { String username = user.length > 0 ? user[0] : ((LoginUser) SecurityUtils.getSubject().getPrincipal()).getUsername(); List platformOrderList; if(method.equals(POSTSHIPPING.getMethod())) { @@ -711,6 +711,8 @@ public class PlatformOrderShippingInvoiceService { String internalCode = entry.getKey().getClient().getInternalCode(); invoiceList.add(new InvoiceMetaData("", "error", internalCode, clientId, e.getMessage())); log.error(e.getMessage()); + } catch (InterruptedException e) { + throw new RuntimeException(e); } System.gc(); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java index ad130bb6e..aeeca392c 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/service/impl/PlatformOrderServiceImpl.java @@ -37,7 +37,6 @@ import java.util.function.Predicate; import java.util.stream.Collectors; import static java.util.stream.Collectors.*; -import static org.jeecg.modules.business.entity.Invoice.InvoicingMethod.*; /** * @Description: 平台订单表 @@ -276,7 +275,7 @@ public class PlatformOrderServiceImpl extends ServiceImpl> findUninvoicedOrders(List shopIds, Date begin, Date end, List warehouses) { List orderList = platformOrderMap.findUninvoicedOrders(shopIds, begin, end, warehouses); @@ -307,6 +306,7 @@ public class PlatformOrderServiceImpl extends ServiceImpl orderMap.get(platformOrderContent.getPlatformOrderId()))); } + // TODO: maybe duplicate this for non invoicing usage @Override public Map> fetchOrderData(List orderIds) { List orderList = platformOrderMap.selectBatchIds(orderIds); @@ -315,6 +315,12 @@ public class PlatformOrderServiceImpl extends ServiceImpl orderMap.get(platformOrderContent.getPlatformOrderId()))); } @Override + public Map> fetchOrderDataForUpdate(List orderIds) { + Map ordersMapById = platformOrderMap.selectBatchIdsForUpdate(orderIds); + List orderContents = platformOrderContentMap.fetchOrderContentForUpdate(orderIds); + return orderContents.stream().collect(groupingBy(platformOrderContent -> ordersMapById.get(platformOrderContent.getPlatformOrderId()))); + } + @Override public Map> fetchOrderDataByInvoiceCode(String invoiceCode) { List orderList = platformOrderMap.getPlatformOrdersByInvoiceNumber(invoiceCode); List orderIds = orderList.stream().map(PlatformOrder::getId).collect(toList()); @@ -600,4 +606,9 @@ public class PlatformOrderServiceImpl extends ServiceImpl