OrderServiceImpl.java 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 javax.annotation.Resource;
  22. import java.util.Date;
  23. import java.util.List;
  24. /**
  25. * <p>
  26. * 订单 服务实现类
  27. * </p>
  28. *
  29. * @author ${author}
  30. * @since 2022-08-25
  31. */
  32. @Service
  33. public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
  34. @Resource
  35. private RedisLockClient redisLockClient;
  36. @Autowired
  37. private SupplierService supplierService;
  38. @Autowired
  39. private ApplyPurchaseService applyPurchaseService;
  40. @Override
  41. public void createOrder(Long supplierId, List<ApplyPurchase> applyPurchaseList, String code) {
  42. createOrderFun(supplierId, applyPurchaseList, () -> {
  43. int count = count(Wrappers.<Order>lambdaQuery()
  44. .eq(Order::getCode, code)
  45. .eq(BaseEntity::getTenantId, AuthUtil.getTenantId()));
  46. Assert.eqZero(count, "订号已存在");
  47. return code;
  48. });
  49. }
  50. @Override
  51. public void createOrderAuth(Long supplierId, List<ApplyPurchase> applyPurchaseList, String codePrefix) {
  52. createOrderFun(supplierId, applyPurchaseList, () -> createOrderCode(codePrefix));
  53. }
  54. @Override
  55. public void createOrderAuth(Long supplierId, List<ApplyPurchase> applyPurchaseList) {
  56. String codePrefix = "PO" + DateUtil.format(new Date(), "yyMMdd-");
  57. createOrderFun(supplierId, applyPurchaseList, () -> createOrderCode(codePrefix));
  58. }
  59. /**
  60. * 生成订单
  61. *
  62. * @param supplierId 供应商id
  63. * @param applyPurchaseList 申购列表
  64. * @param fun 获取订单单号方法
  65. */
  66. private void createOrderFun(Long supplierId, List<ApplyPurchase> applyPurchaseList, java.util.function.Supplier<String> fun) {
  67. String tenantId = AuthUtil.getTenantId();
  68. // 获取供应商账期
  69. Supplier supplier = supplierService.getById(supplierId);
  70. Integer accountPeriod = supplier.getAccountPeriod();
  71. Order order = redisLockClient.lockFair(LibrarySupplyLockConstant.ORDER_CODE_LOCK + tenantId, () -> {
  72. String code = fun.get();
  73. Order orderTemp = new Order();
  74. orderTemp.setSupplierId(supplierId);
  75. orderTemp.setAccountPeriod(accountPeriod);
  76. orderTemp.setCode(code);
  77. orderTemp.setStatus(OrderStatusEnum.IN_APPROVAL.getValue());
  78. save(orderTemp);
  79. return orderTemp;
  80. });
  81. Assert.notEmpty(order, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
  82. // 赋值申购单属性
  83. applyPurchaseService.flowOrder(applyPurchaseList, order.getId(), order.getCode(), supplierId, accountPeriod);
  84. }
  85. /**
  86. * 自动生成申购单编号
  87. */
  88. public String createOrderCode(String codePrefix) {
  89. StringBuilder builder = new StringBuilder();
  90. builder.append(codePrefix);
  91. Order order = getOne(Wrappers.<Order>lambdaQuery().select(Order::getCode).eq(BaseEntity::getTenantId, AuthUtil.getTenantId()).likeRight(Order::getCode, codePrefix).orderByDesc(Order::getCode).last("limit 1"));
  92. if (order == null) {
  93. return builder.append("001").toString();
  94. }
  95. int codeNum = Integer.parseInt(order.getCode().replace(codePrefix, ""));
  96. return builder.append(codeNum < 9 ? "00" : codeNum < 99 ? "0" : "").append(codeNum + 1).toString();
  97. }
  98. }