OrderServiceImpl.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. package com.fjhx.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.fjhx.base.BaseEntity;
  6. import com.fjhx.constants.ErrorMsgConstant;
  7. import com.fjhx.constants.LibrarySupplyLockConstant;
  8. import com.fjhx.entity.ApplyPurchase;
  9. import com.fjhx.entity.Order;
  10. import com.fjhx.entity.Supplier;
  11. import com.fjhx.enums.OrderStatusEnum;
  12. import com.fjhx.mapper.OrderMapper;
  13. import com.fjhx.service.ApplyPurchaseService;
  14. import com.fjhx.service.OrderService;
  15. import com.fjhx.service.SupplierService;
  16. import com.fjhx.utils.Assert;
  17. import org.springblade.core.redis.lock.RedisLockClient;
  18. import org.springblade.core.secure.utils.AuthUtil;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import javax.annotation.Resource;
  23. import java.math.BigDecimal;
  24. import java.util.Date;
  25. import java.util.List;
  26. /**
  27. * <p>
  28. * 订单 服务实现类
  29. * </p>
  30. *
  31. * @author ${author}
  32. * @since 2022-08-25
  33. */
  34. @Service
  35. public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
  36. @Resource
  37. private RedisLockClient redisLockClient;
  38. @Autowired
  39. private SupplierService supplierService;
  40. @Autowired
  41. private ApplyPurchaseService applyPurchaseService;
  42. @Override
  43. public void createOrder(Long supplierId, List<ApplyPurchase> applyPurchaseList, String code) {
  44. createOrderFun(supplierId, applyPurchaseList, () -> {
  45. int count = count(Wrappers.<Order>lambdaQuery()
  46. .eq(Order::getCode, code)
  47. .eq(BaseEntity::getTenantId, AuthUtil.getTenantId()));
  48. Assert.eqZero(count, "订号已存在");
  49. return code;
  50. });
  51. }
  52. @Override
  53. public void createOrderAuth(Long supplierId, List<ApplyPurchase> applyPurchaseList, String codePrefix) {
  54. createOrderFun(supplierId, applyPurchaseList, () -> createOrderCode(codePrefix));
  55. }
  56. @Override
  57. public void createOrderAuth(Long supplierId, List<ApplyPurchase> applyPurchaseList) {
  58. String codePrefix = "PO" + DateUtil.format(new Date(), "yyMMdd-");
  59. createOrderFun(supplierId, applyPurchaseList, () -> createOrderCode(codePrefix));
  60. }
  61. @Transactional(rollbackFor = Exception.class)
  62. @Override
  63. public void flowNotPass(Long orderId) {
  64. updateStatus(orderId, OrderStatusEnum.NOT_PASS);
  65. applyPurchaseService.flowOrderNotPass(orderId);
  66. }
  67. @Transactional(rollbackFor = Exception.class)
  68. @Override
  69. public void flowPass(Long orderId) {
  70. updateStatus(orderId, OrderStatusEnum.PASS);
  71. applyPurchaseService.flowOrderPass(orderId);
  72. }
  73. @Override
  74. public boolean orderComplete(Long orderId) {
  75. boolean b = applyPurchaseService.orderIsComplete(orderId);
  76. if (b) {
  77. updateStatus(orderId, OrderStatusEnum.COMPLETED);
  78. }
  79. return b;
  80. }
  81. /**
  82. * 生成订单
  83. *
  84. * @param supplierId 供应商id
  85. * @param applyPurchaseList 申购列表
  86. * @param fun 获取订单单号方法
  87. */
  88. private void createOrderFun(Long supplierId, List<ApplyPurchase> applyPurchaseList, java.util.function.Supplier<String> fun) {
  89. String tenantId = AuthUtil.getTenantId();
  90. // 获取供应商账期
  91. Supplier supplier = supplierService.getById(supplierId);
  92. Integer accountPeriod = supplier.getAccountPeriod();
  93. Order order = redisLockClient.lockFair(LibrarySupplyLockConstant.ORDER_CODE_LOCK + tenantId, () -> {
  94. String code = fun.get();
  95. BigDecimal price = applyPurchaseList.stream().map(ApplyPurchase::getApplyPrice)
  96. .reduce(BigDecimal.ZERO, BigDecimal::add);
  97. Order orderTemp = new Order();
  98. orderTemp.setPrice(price);
  99. orderTemp.setArrivalPrice(BigDecimal.ZERO);
  100. orderTemp.setPayPrice(BigDecimal.ZERO);
  101. orderTemp.setSupplierId(supplierId);
  102. orderTemp.setAccountPeriod(accountPeriod);
  103. orderTemp.setCode(code);
  104. orderTemp.setStatus(OrderStatusEnum.IN_APPROVAL.getValue());
  105. save(orderTemp);
  106. return orderTemp;
  107. });
  108. Assert.notEmpty(order, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
  109. // 赋值申购单属性
  110. applyPurchaseService.flowOrder(applyPurchaseList, order.getId(), order.getCode(), supplierId, accountPeriod);
  111. }
  112. /**
  113. * 自动生成申购单编号
  114. */
  115. public String createOrderCode(String codePrefix) {
  116. StringBuilder builder = new StringBuilder();
  117. builder.append(codePrefix);
  118. Order order = getOne(Wrappers.<Order>lambdaQuery()
  119. .select(Order::getCode)
  120. .eq(BaseEntity::getTenantId, AuthUtil.getTenantId())
  121. .likeRight(Order::getCode, codePrefix)
  122. .orderByDesc(Order::getCode)
  123. .last("limit 1"));
  124. if (order == null) {
  125. return builder.append("001").toString();
  126. }
  127. int codeNum = Integer.parseInt(order.getCode().replace(codePrefix, ""));
  128. return builder.append(codeNum < 9 ? "00" : codeNum < 99 ? "0" : "").append(codeNum + 1).toString();
  129. }
  130. /**
  131. * 修改订单状态
  132. */
  133. private void updateStatus(Long orderId, OrderStatusEnum orderStatusEnum) {
  134. update(Wrappers.<Order>lambdaUpdate()
  135. .eq(BaseEntity::getId, orderId)
  136. .set(Order::getStatus, orderStatusEnum.getValue())
  137. .set(BaseEntity::getUpdateUser, AuthUtil.getUserId())
  138. .set(BaseEntity::getUpdateTime, new Date())
  139. );
  140. }
  141. }