Ver código fonte

供应链 申购方法

home 2 anos atrás
pai
commit
8ca02c18d2

+ 5 - 0
hx-common/library-supply/src/main/java/com/fjhx/constants/LibrarySupplyLockConstant.java

@@ -15,4 +15,9 @@ public interface LibrarySupplyLockConstant {
      */
     String APPLY_PURCHASE_CODE_LOCK = PREFIX + "applyPurchaseCodeLock-";
 
+    /**
+     * 保证订单编码唯一
+     */
+    String ORDER_CODE_LOCK = PREFIX + "orderCodeLock-";
+
 }

+ 1 - 1
hx-common/library-supply/src/main/java/com/fjhx/entity/ApplyPurchase.java

@@ -84,7 +84,7 @@ public class ApplyPurchase extends BaseEntity {
     private Date planArrivalTime;
 
     /**
-     * 申购状态 1待发起 2审批中 3未通过 4已通过/待采购 5已采购 6部分到货 7全部到货/结束 8已作废
+     * 申购状态 1待发起 2审批中 3未通过 4已通过/待采购 5采购审批中 6已采购 7部分到货 8全部到货/结束 9已作废
      */
     private Integer status;
 

+ 2 - 8
hx-common/library-supply/src/main/java/com/fjhx/entity/Order.java

@@ -1,12 +1,6 @@
 package com.fjhx.entity;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.Version;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.fjhx.base.BaseEntity;
-import com.baomidou.mybatisplus.annotation.TableField;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -39,8 +33,8 @@ public class Order extends BaseEntity {
     private Integer accountPeriod;
 
     /**
-     * 是否完成 0未完成 1已完成
+     * 状态 1待审批 2不通过 3审批通过 4完成
      */
-    private Integer complete;
+    private Integer status;
 
 }

+ 41 - 0
hx-common/library-supply/src/main/java/com/fjhx/entity/OrderFlow.java

@@ -0,0 +1,41 @@
+package com.fjhx.entity;
+
+import com.fjhx.base.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 订单流程备份
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-25
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class OrderFlow extends BaseEntity {
+
+    /**
+     * 申购单id
+     */
+    private Long applyPurchaseId;
+
+    /**
+     * 订单id
+     */
+    private Long orderId;
+
+    /**
+     * 单价
+     */
+    private BigDecimal unitPrice;
+
+    /**
+     * 采购备注
+     */
+    private String remark;
+
+}

+ 5 - 4
hx-common/library-supply/src/main/java/com/fjhx/enums/ApplyPurchaseStatusEnum.java

@@ -11,10 +11,11 @@ public enum ApplyPurchaseStatusEnum {
     IN_APPROVAL(2), // 审批中
     NOT_PASS(3), // 未通过
     PASS(4), // 已通过/待采购
-    PURCHASED(5), // 已采购
-    PART_ARRIVAL(6), // 部分到货
-    ARRIVAL(7), // 全部到货
-    DISCARD(8), // 作废
+    PURCHASE_FLOW(5), // 采购审批中
+    PURCHASED(6), // 已采购
+    PART_ARRIVAL(7), // 部分到货
+    ARRIVAL(8), // 全部到货
+    DISCARD(9), // 作废
     ;
 
     ApplyPurchaseStatusEnum(Integer value) {

+ 38 - 0
hx-common/library-supply/src/main/java/com/fjhx/enums/OrderStatusEnum.java

@@ -0,0 +1,38 @@
+package com.fjhx.enums;
+
+import lombok.Getter;
+
+import java.util.HashMap;
+
+@Getter
+public enum OrderStatusEnum {
+
+    IN_APPROVAL(1), // 审批中
+    NOT_PASS(2), // 未通过
+    PASS(3), // 已通过/未完成
+    COMPLETED(4), // 已完成
+    ;
+
+    OrderStatusEnum(Integer value) {
+        this.value = value;
+    }
+
+    private final Integer value;
+
+    private static final HashMap<Integer, OrderStatusEnum> map = new HashMap<>();
+
+    static {
+        for (OrderStatusEnum value : OrderStatusEnum.values()) {
+            map.put(value.getValue(), value);
+        }
+    }
+
+    /**
+     * 根据value值获取枚举
+     */
+    public static OrderStatusEnum get(Integer value) {
+        return map.get(value);
+    }
+
+
+}

+ 16 - 0
hx-common/library-supply/src/main/java/com/fjhx/mapper/OrderFlowMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.mapper;
+
+import com.fjhx.entity.OrderFlow;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 订单流程备份 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-25
+ */
+public interface OrderFlowMapper extends BaseMapper<OrderFlow> {
+
+}

+ 5 - 0
hx-common/library-supply/src/main/java/com/fjhx/mapper/OrderFlowMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.mapper.OrderFlowMapper">
+
+</mapper>

+ 27 - 3
hx-common/library-supply/src/main/java/com/fjhx/service/ApplyPurchaseService.java

@@ -28,8 +28,18 @@ public interface ApplyPurchaseService extends BaseService<ApplyPurchase> {
      *
      * @param applyPurchaseList 申购列表
      * @param flowLinkNo        流程关联编号
+     * @param code              申购单号
      */
-    void initiateSubscription(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo);
+    void initiateSubscription(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo, String code);
+
+    /**
+     * 发起申购(自动生成申购单号)
+     *
+     * @param applyPurchaseList 申购列表
+     * @param flowLinkNo        流程关联编号
+     * @param codePrefix        编码前缀
+     */
+    void initiateSubscriptionAuto(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo, String codePrefix);
 
     /**
      * 审批通过
@@ -46,7 +56,7 @@ public interface ApplyPurchaseService extends BaseService<ApplyPurchase> {
     void flowNotPass(Long flowLinkNo);
 
     /**
-     * 申购绑定订单
+     * 发起采购订单审批
      *
      * @param applyPurchaseList 申购列表
      * @param orderId           订单id
@@ -54,7 +64,21 @@ public interface ApplyPurchaseService extends BaseService<ApplyPurchase> {
      * @param supplierId        供应商id
      * @param accountPeriod     供应商账期/天
      */
-    void bindingOrder(List<ApplyPurchase> applyPurchaseList, Long orderId, String orderCode, Long supplierId, Integer accountPeriod);
+    void flowOrder(List<ApplyPurchase> applyPurchaseList, Long orderId, String orderCode, Long supplierId, Integer accountPeriod);
+
+    /**
+     * 采购订单审批通过
+     *
+     * @param orderId 订单id
+     */
+    void flowOrderPass(Long orderId);
+
+    /**
+     * 采购订单审批未通过
+     *
+     * @param orderId 订单id
+     */
+    void flowOrderNotPass(Long orderId);
 
     /**
      * 到货

+ 16 - 0
hx-common/library-supply/src/main/java/com/fjhx/service/OrderFlowService.java

@@ -0,0 +1,16 @@
+package com.fjhx.service;
+
+import com.fjhx.base.BaseService;
+import com.fjhx.entity.OrderFlow;
+
+/**
+ * <p>
+ * 订单流程备份 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-25
+ */
+public interface OrderFlowService extends BaseService<OrderFlow> {
+
+}

+ 12 - 0
hx-common/library-supply/src/main/java/com/fjhx/service/OrderService.java

@@ -1,8 +1,11 @@
 package com.fjhx.service;
 
 import com.fjhx.base.BaseService;
+import com.fjhx.entity.ApplyPurchase;
 import com.fjhx.entity.Order;
 
+import java.util.List;
+
 /**
  * <p>
  * 订单 服务类
@@ -13,4 +16,13 @@ import com.fjhx.entity.Order;
  */
 public interface OrderService extends BaseService<Order> {
 
+    /**
+     * 创建订单
+     *
+     * @param supplierId
+     * @param applyPurchaseList
+     * @param codePrefix
+     */
+    void createOrder(Long supplierId, List<ApplyPurchase> applyPurchaseList, String codePrefix);
+
 }

+ 103 - 37
hx-common/library-supply/src/main/java/com/fjhx/service/impl/ApplyPurchaseServiceImpl.java

@@ -1,6 +1,5 @@
 package com.fjhx.service.impl;
 
-import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.base.BaseEntity;
@@ -8,16 +7,20 @@ import com.fjhx.constants.ErrorMsgConstant;
 import com.fjhx.constants.LibrarySupplyLockConstant;
 import com.fjhx.constants.StatusConstant;
 import com.fjhx.entity.ApplyPurchase;
+import com.fjhx.entity.OrderFlow;
 import com.fjhx.enums.ApplyPurchaseStatusEnum;
 import com.fjhx.mapper.ApplyPurchaseMapper;
 import com.fjhx.service.ApplyPurchaseService;
+import com.fjhx.service.OrderFlowService;
 import com.fjhx.utils.Assert;
 import org.springblade.core.redis.lock.RedisLockClient;
 import org.springblade.core.secure.utils.AuthUtil;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -35,39 +38,63 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
     @Resource
     private RedisLockClient redisLockClient;
 
+    @Autowired
+    private OrderFlowService orderFlowService;
+
     @Override
     public void add(ApplyPurchase applyPurchase) {
         Assert.notEmpty(applyPurchase.getGoodsId(), "物品id不能为空");
         Assert.notEmpty(applyPurchase.getQuantity(), "申购数量不能为空");
         Assert.notEmpty(applyPurchase.getPlanArrivalTime(), "到货时间不能为空");
 
+        // 到货数量
+        applyPurchase.setArrivalQuantity(BigDecimal.ZERO);
+
+        // 到货金额
+        applyPurchase.setArrivalPrice(BigDecimal.ZERO);
+
+        // 状态
         applyPurchase.setStatus(ApplyPurchaseStatusEnum.WAIT_START.getValue());
 
         save(applyPurchase);
     }
 
     @Override
-    public void initiateSubscription(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo) {
-
+    public void initiateSubscription(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo, String code) {
         String tenantId = AuthUtil.getTenantId();
 
         Boolean flag = redisLockClient.lockFair(LibrarySupplyLockConstant.APPLY_PURCHASE_CODE_LOCK + tenantId,
                 () -> {
-                    String applyPurchaseCode = createApplyPurchaseCode();
-                    applyPurchaseList.forEach(applyPurchase -> {
-                        // 赋值申购单号
-                        applyPurchase.setCode(applyPurchaseCode);
-                        // 状态改为审批中
-                        applyPurchase.setStatus(ApplyPurchaseStatusEnum.IN_APPROVAL.getValue());
-                        // 赋值流程id
-                        applyPurchase.setFlowLinkNo(flowLinkNo);
-                    });
-                    updateBatchById(applyPurchaseList);
+
+                    int count = count(Wrappers.<ApplyPurchase>lambdaQuery()
+                            .eq(ApplyPurchase::getCode, code)
+                            .eq(BaseEntity::getTenantId, tenantId));
+                    Assert.eqZero(count, "申购单号已存在");
+
+                    updateApplyPurchaseInApproval(applyPurchaseList, flowLinkNo, code);
+
                     return true;
                 });
 
         Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
+    }
+
+    @Override
+    public void initiateSubscriptionAuto(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo, String codePrefix) {
 
+        String tenantId = AuthUtil.getTenantId();
+
+        Boolean flag = redisLockClient.lockFair(LibrarySupplyLockConstant.APPLY_PURCHASE_CODE_LOCK + tenantId,
+                () -> {
+
+                    String code = createApplyPurchaseCode(codePrefix);
+
+                    updateApplyPurchaseInApproval(applyPurchaseList, flowLinkNo, code);
+
+                    return true;
+                });
+
+        Assert.eqTrue(flag, ErrorMsgConstant.SYSTEM_BUSY_ERROR);
     }
 
     @Override
@@ -81,7 +108,9 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
     }
 
     @Override
-    public void bindingOrder(List<ApplyPurchase> applyPurchaseList, Long orderId, String orderCode, Long supplierId, Integer accountPeriod) {
+    public void flowOrder(List<ApplyPurchase> applyPurchaseList, Long orderId, String orderCode, Long supplierId, Integer accountPeriod) {
+
+        List<OrderFlow> orderFlowList = new ArrayList<>();
 
         for (ApplyPurchase applyPurchase : applyPurchaseList) {
 
@@ -96,24 +125,56 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
             applyPurchase.setOrderCode(orderCode);
             applyPurchase.setSupplierId(supplierId);
             applyPurchase.setAccountPeriod(accountPeriod);
-            applyPurchase.setStatus(ApplyPurchaseStatusEnum.PURCHASED.getValue());
+            applyPurchase.setStatus(ApplyPurchaseStatusEnum.PURCHASE_FLOW.getValue());
 
             // 申购金额
             applyPurchase.setApplyPrice(unitPrice.multiply(applyPurchase.getQuantity()));
 
-            // 到货数量
-            applyPurchase.setArrivalQuantity(BigDecimal.ZERO);
-
-            // 到货金额
-            applyPurchase.setArrivalPrice(BigDecimal.ZERO);
-
+            OrderFlow orderFlow = new OrderFlow();
+            orderFlow.setOrderId(orderId);
+            orderFlow.setApplyPurchaseId(id);
+            orderFlow.setUnitPrice(applyPurchase.getUnitPrice());
+            orderFlow.setRemark(applyPurchase.getRemark());
+            orderFlowList.add(orderFlow);
         }
 
+        // 保留订单采购记录
+        orderFlowService.saveBatch(orderFlowList);
+
         updateBatchById(applyPurchaseList);
 
     }
 
     @Override
+    public void flowOrderPass(Long orderId) {
+        update(Wrappers.<ApplyPurchase>lambdaUpdate()
+                .eq(ApplyPurchase::getOrderId, orderId)
+                .set(ApplyPurchase::getStatus, ApplyPurchaseStatusEnum.PURCHASED.getValue())
+                .set(BaseEntity::getCreateTime, new Date())
+                .set(BaseEntity::getUpdateUser, AuthUtil.getUserId())
+        );
+    }
+
+    @Override
+    public void flowOrderNotPass(Long orderId) {
+        update(Wrappers.<ApplyPurchase>lambdaUpdate()
+                .eq(ApplyPurchase::getOrderId, orderId)
+                .set(ApplyPurchase::getStatus, ApplyPurchaseStatusEnum.PASS.getValue())
+                .set(ApplyPurchase::getOrderId, null)
+                .set(ApplyPurchase::getOrderCode, null)
+                .set(ApplyPurchase::getSupplierId, null)
+                .set(ApplyPurchase::getAccountPeriod, null)
+                .set(ApplyPurchase::getApplyPrice, null)
+                .set(ApplyPurchase::getUnitPrice, null)
+                .set(ApplyPurchase::getRemark, null)
+                .set(BaseEntity::getCreateTime, new Date())
+                .set(BaseEntity::getUpdateUser, AuthUtil.getUserId())
+        );
+
+
+    }
+
+    @Override
     public void arrival(Long applyPurchaseId, BigDecimal arrivalQuantity, Boolean autoComplete) {
 
         ApplyPurchase applyPurchase = getById(applyPurchaseId);
@@ -163,20 +224,16 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
                 .eq(ApplyPurchase::getId, applyPurchaseId)
                 .set(BaseEntity::getCreateTime, new Date())
                 .set(BaseEntity::getUpdateUser, AuthUtil.getUserId())
-                .set(ApplyPurchase::getStatus, ApplyPurchaseStatusEnum.DISCARD.getValue()));
+                .set(ApplyPurchase::getStatus, ApplyPurchaseStatusEnum.DISCARD.getValue())
+        );
     }
 
-
     /**
-     * 生成申购单号
+     * 自动生成申购单
      */
-    private String createApplyPurchaseCode() {
+    public String createApplyPurchaseCode(String codePrefix) {
         StringBuilder builder = new StringBuilder();
-        builder.append("PA");
-        builder.append(DateUtil.format(new Date(), "yyyyMM"));
-        builder.append("-");
-
-        String codePrefix = builder.toString();
+        builder.append(codePrefix);
 
         ApplyPurchase applyPurchase = getOne(Wrappers.<ApplyPurchase>lambdaQuery()
                 .select(ApplyPurchase::getCode)
@@ -192,17 +249,26 @@ public class ApplyPurchaseServiceImpl extends ServiceImpl<ApplyPurchaseMapper, A
 
         int codeNum = Integer.parseInt(applyPurchase.getCode().replace(codePrefix, ""));
 
-        if (codeNum < 9) {
-            builder.append("00");
-        } else if (codeNum < 99) {
-            builder.append("0");
-        }
+        return builder.append(codeNum < 9 ? "00" : codeNum < 99 ? "0" : "").append(codeNum + 1).toString();
+    }
 
-        return builder.append(codeNum + 1).toString();
+    /**
+     * 赋值申购单状态为审批中
+     */
+    private void updateApplyPurchaseInApproval(List<ApplyPurchase> applyPurchaseList, Long flowLinkNo, String code) {
+        applyPurchaseList.forEach(applyPurchase -> {
+            // 赋值申购单号
+            applyPurchase.setCode(code);
+            // 状态改为审批中
+            applyPurchase.setStatus(ApplyPurchaseStatusEnum.IN_APPROVAL.getValue());
+            // 赋值流程id
+            applyPurchase.setFlowLinkNo(flowLinkNo);
+        });
+        updateBatchById(applyPurchaseList);
     }
 
     /**
-     * 修改合同审批状态
+     * 修改申购单状态
      */
     private void updateFlowStatus(Long flowLinkNo, ApplyPurchaseStatusEnum applyPurchaseStatusEnum) {
         update(Wrappers.<ApplyPurchase>lambdaUpdate()

+ 21 - 0
hx-common/library-supply/src/main/java/com/fjhx/service/impl/OrderFlowServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.entity.OrderFlow;
+import com.fjhx.mapper.OrderFlowMapper;
+import com.fjhx.service.OrderFlowService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 订单流程备份 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-08-25
+ */
+@Service
+public class OrderFlowServiceImpl extends ServiceImpl<OrderFlowMapper, OrderFlow> implements OrderFlowService {
+
+
+}

+ 52 - 0
hx-common/library-supply/src/main/java/com/fjhx/service/impl/OrderServiceImpl.java

@@ -1,11 +1,20 @@
 package com.fjhx.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.base.BaseEntity;
+import com.fjhx.constants.LibrarySupplyLockConstant;
+import com.fjhx.entity.ApplyPurchase;
 import com.fjhx.entity.Order;
 import com.fjhx.mapper.OrderMapper;
 import com.fjhx.service.OrderService;
+import org.springblade.core.redis.lock.RedisLockClient;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.List;
+
 /**
  * <p>
  * 订单 服务实现类
@@ -17,4 +26,47 @@ import org.springframework.stereotype.Service;
 @Service
 public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
 
+    @Resource
+    private RedisLockClient redisLockClient;
+
+    @Override
+    public void createOrder(Long supplierId, List<ApplyPurchase> applyPurchaseList, String codePrefix) {
+
+        String tenantId = AuthUtil.getTenantId();
+
+        Boolean flag = redisLockClient.lockFair(LibrarySupplyLockConstant.ORDER_CODE_LOCK + tenantId,
+                () -> {
+
+                    String orderCode = createOrderCode(codePrefix);
+
+                    return true;
+                });
+
+
+    }
+
+    /**
+     * 自动生成申购单编号
+     */
+    public String createOrderCode(String codePrefix) {
+        StringBuilder builder = new StringBuilder();
+        builder.append(codePrefix);
+
+        Order order = getOne(Wrappers.<Order>lambdaQuery()
+                .select(Order::getCode)
+                .eq(BaseEntity::getTenantId, AuthUtil.getTenantId())
+                .likeRight(Order::getCode, codePrefix)
+                .orderByDesc(Order::getCode)
+                .last("limit 1")
+        );
+
+        if (order == null) {
+            return builder.append("001").toString();
+        }
+
+        int codeNum = Integer.parseInt(order.getCode().replace(codePrefix, ""));
+
+        return builder.append(codeNum < 9 ? "00" : codeNum < 99 ? "0" : "").append(codeNum + 1).toString();
+    }
+
 }

+ 2 - 0
hx-service/storage/src/main/java/com/fjhx/StorageApplication.java

@@ -1,11 +1,13 @@
 package com.fjhx;
 
+import org.springblade.core.cloud.feign.EnableBladeFeign;
 import org.springblade.core.launch.BladeApplication;
 import org.springframework.cloud.client.SpringCloudApplication;
 
 /**
  * 杰生模块启动器
  */
+@EnableBladeFeign
 @SpringCloudApplication
 public class StorageApplication {