소스 검색

销售合同审批生成物料信息

yzc 1 년 전
부모
커밋
88c1895dce
29개의 변경된 파일651개의 추가작업 그리고 171개의 파일을 삭제
  1. 1 1
      hx-admin/src/main/resources/application-dev.yml
  2. 4 2
      hx-common/src/main/java/com/fjhx/common/controller/FileServiceController.java
  3. 22 0
      hx-common/src/main/java/com/fjhx/common/entity/InOutBo.java
  4. 19 0
      hx-common/src/main/java/com/fjhx/common/enums/InOutType.java
  5. 3 1
      hx-common/src/main/java/com/fjhx/common/service/file/FtpFileService.java
  6. 4 1
      hx-common/src/main/java/com/fjhx/common/service/file/impl/FtpFileServiceImpl.java
  7. 20 0
      hx-item/src/main/java/com/fjhx/item/controller/product/ProductAvailableRecordController.java
  8. 17 0
      hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductAvailableRecordDto.java
  9. 17 0
      hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductAvailableRecordSelectDto.java
  10. 48 0
      hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductAvailableRecord.java
  11. 6 1
      hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfo.java
  12. 17 0
      hx-item/src/main/java/com/fjhx/item/entity/product/vo/ProductAvailableRecordVo.java
  13. 26 0
      hx-item/src/main/java/com/fjhx/item/enums/ProductAvailableRecordType.java
  14. 17 0
      hx-item/src/main/java/com/fjhx/item/mapper/product/ProductAvailableRecordMapper.java
  15. 17 0
      hx-item/src/main/java/com/fjhx/item/service/product/ProductAvailableRecordService.java
  16. 7 0
      hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java
  17. 21 0
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductAvailableRecordServiceImpl.java
  18. 85 10
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java
  19. 4 0
      hx-item/src/main/resources/mapper/product/ProductAvailableRecordMapper.xml
  20. 3 1
      hx-item/src/main/resources/mapper/product/ProductInfoMapper.xml
  21. 14 1
      hx-purchase/src/main/java/com/fjhx/purchase/entity/subscribe/po/SubscribeDetail.java
  22. 4 3
      hx-purchase/src/main/java/com/fjhx/purchase/flow/SubscribeFlow.java
  23. 1 1
      hx-purchase/src/main/resources/mapper/subscribe/SubscribeDetailMapper.xml
  24. 105 9
      hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java
  25. 29 23
      hx-sale/src/main/java/com/fjhx/sale/flow/ContractUpdateFlow.java
  26. 73 110
      hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java
  27. 44 4
      hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java
  28. 1 1
      hx-wms/src/main/java/com/fjhx/wms/service/stock/StockService.java
  29. 22 2
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

+ 1 - 1
hx-admin/src/main/resources/application-dev.yml

@@ -45,7 +45,7 @@ mail:
 
 hx:
     httpUrl: http://36.134.91.96:10006/test-api/
-    fileServiceUrl: http://localhost:8080
+    fileServiceUrl: http://192.168.1.13:8090
 
 # token配置
 token:

+ 4 - 2
hx-common/src/main/java/com/fjhx/common/controller/FileServiceController.java

@@ -27,9 +27,11 @@ public class FileServiceController {
 
     /**
      * 将临时文件移动到永久文件夹
+     *
+     * @return
      */
     @PostMapping("/moveTempFolderToPermanent")
-    public void moveFolder(String sourceFolderPath, String targetFolderPath) {
-        ftpFileService.moveFolder(sourceFolderPath, targetFolderPath);
+    public JSONObject moveFolder(String sourceFolderPath, String targetFolderPath) {
+        return ftpFileService.moveFolder(sourceFolderPath, targetFolderPath);
     }
 }

+ 22 - 0
hx-common/src/main/java/com/fjhx/common/entity/InOutBo.java

@@ -0,0 +1,22 @@
+package com.fjhx.common.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class InOutBo {
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 出入库数量
+     */
+    private BigDecimal quantity;
+
+}

+ 19 - 0
hx-common/src/main/java/com/fjhx/common/enums/InOutType.java

@@ -0,0 +1,19 @@
+package com.fjhx.common.enums;
+
+public enum InOutType {
+
+    /**
+     * 入库
+     */
+    IN,
+
+    /**
+     * 出库
+     */
+    OUT,
+
+    /**
+     * 等于
+     */
+    EQ,
+}

+ 3 - 1
hx-common/src/main/java/com/fjhx/common/service/file/FtpFileService.java

@@ -11,6 +11,8 @@ public interface FtpFileService {
 
     /**
      * 将临时文件移动到永久文件夹
+     *
+     * @return
      */
-    void moveFolder(String sourceFolderPath, String targetFolderPath);
+    JSONObject moveFolder(String sourceFolderPath, String targetFolderPath);
 }

+ 4 - 1
hx-common/src/main/java/com/fjhx/common/service/file/impl/FtpFileServiceImpl.java

@@ -47,9 +47,11 @@ public class FtpFileServiceImpl implements FtpFileService {
 
     /**
      * 将临时文件移动到永久文件夹
+     *
+     * @return
      */
     @Override
-    public void moveFolder(String sourceFolderPath, String targetFolderPath) {
+    public JSONObject moveFolder(String sourceFolderPath, String targetFolderPath) {
         targetFolderPath = String.format("/permanent/%s", targetFolderPath);
 
         try {
@@ -70,6 +72,7 @@ public class FtpFileServiceImpl implements FtpFileService {
             if (responseJson.getInteger("code") != 200) {
                 throw new ServiceException(responseJson.getString("msg"));
             }
+            return responseJson.getJSONObject("data");
         } catch (IOException e) {
             throw new ServiceException("操作失败:" + e.getMessage());
         }

+ 20 - 0
hx-item/src/main/java/com/fjhx/item/controller/product/ProductAvailableRecordController.java

@@ -0,0 +1,20 @@
+package com.fjhx.item.controller.product;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 产品可用库存修改记录 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2024-01-09
+ */
+@RestController
+@RequestMapping("/productAvailableRecord")
+public class ProductAvailableRecordController {
+
+
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductAvailableRecordDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.entity.product.dto;
+
+import com.fjhx.item.entity.product.po.ProductAvailableRecord;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品可用库存修改记录新增编辑入参实体
+ *
+ * @author
+ * @since 2024-01-09
+ */
+@Getter
+@Setter
+public class ProductAvailableRecordDto extends ProductAvailableRecord {
+
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/dto/ProductAvailableRecordSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.entity.product.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品可用库存修改记录列表查询入参实体
+ *
+ * @author
+ * @since 2024-01-09
+ */
+@Getter
+@Setter
+public class ProductAvailableRecordSelectDto extends BaseSelectDto {
+
+}

+ 48 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductAvailableRecord.java

@@ -0,0 +1,48 @@
+package com.fjhx.item.entity.product.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 产品可用库存修改记录
+ * </p>
+ *
+ * @author
+ * @since 2024-01-09
+ */
+@Getter
+@Setter
+@TableName("product_available_record")
+public class ProductAvailableRecord extends BasePo {
+
+    /**
+     * 修改前
+     */
+    private BigDecimal beforeQuantity;
+
+    /**
+     * 修改后
+     */
+    private BigDecimal afterQuantity;
+
+    /**
+     * 修改数量
+     */
+    private BigDecimal editQuantity;
+
+    /**
+     * 业务id
+     */
+    private Long businessId;
+
+    /**
+     * 业务id
+     */
+    private Integer businessType;
+
+}

+ 6 - 1
hx-item/src/main/java/com/fjhx/item/entity/product/po/ProductInfo.java

@@ -136,7 +136,7 @@ public class ProductInfo extends BasePo {
     /**
      * 安全库存
      */
-    private String stockThreshold;
+    private BigDecimal stockThreshold;
     /**
      * 成本价
      */
@@ -147,6 +147,11 @@ public class ProductInfo extends BasePo {
      */
     private String costCurrency;
 
+    /**
+     * 可用库存
+     */
+    private BigDecimal availableQuantity;
+
 
     //---------------------------------------------------------------
     /**

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/entity/product/vo/ProductAvailableRecordVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.entity.product.vo;
+
+import com.fjhx.item.entity.product.po.ProductAvailableRecord;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 产品可用库存修改记录列表查询返回值实体
+ *
+ * @author
+ * @since 2024-01-09
+ */
+@Getter
+@Setter
+public class ProductAvailableRecordVo extends ProductAvailableRecord {
+
+}

+ 26 - 0
hx-item/src/main/java/com/fjhx/item/enums/ProductAvailableRecordType.java

@@ -0,0 +1,26 @@
+package com.fjhx.item.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+public enum ProductAvailableRecordType {
+
+    PURCHASE_PASS(1, "采购通过"),
+    PURCHASE_CANCEL(2, "采购作废"),
+    PURCHASE_UPDATE(3, "采购变更"),
+    SALE_PASS(4, "销售合同通过"),
+    HAND_IN(5, "手动入库"),
+    HAND_OUT(6, "手动出库");
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+
+    /**
+     * 详细类型
+     */
+    private final String detailType;
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/mapper/product/ProductAvailableRecordMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.mapper.product;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.fjhx.item.entity.product.po.ProductAvailableRecord;
+
+
+/**
+ * <p>
+ * 产品可用库存修改记录 Mapper 接口
+ * </p>
+ *
+ * @author
+ * @since 2024-01-09
+ */
+public interface ProductAvailableRecordMapper extends BaseMapper<ProductAvailableRecord> {
+
+}

+ 17 - 0
hx-item/src/main/java/com/fjhx/item/service/product/ProductAvailableRecordService.java

@@ -0,0 +1,17 @@
+package com.fjhx.item.service.product;
+
+import com.fjhx.item.entity.product.po.ProductAvailableRecord;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 产品可用库存修改记录 服务类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-09
+ */
+public interface ProductAvailableRecordService extends BaseService<ProductAvailableRecord> {
+
+}

+ 7 - 0
hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java

@@ -1,11 +1,15 @@
 package com.fjhx.item.service.product;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.InOutBo;
+import com.fjhx.common.enums.InOutType;
 import com.fjhx.item.entity.product.bo.ProductAnalysisBo;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.entity.product.vo.ProductInfoVo;
+import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.ruoyi.common.core.service.BaseService;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.web.multipart.MultipartFile;
@@ -61,6 +65,9 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
      */
     void add(ProductInfoDto productInfoDto);
 
+    @DSTransactional
+    void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType);
+
     /**
      * 产品库新增 尔泓扩展
      */

+ 21 - 0
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductAvailableRecordServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.item.service.product.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.item.entity.product.po.ProductAvailableRecord;
+import com.fjhx.item.mapper.product.ProductAvailableRecordMapper;
+import com.fjhx.item.service.product.ProductAvailableRecordService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 产品可用库存修改记录 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2024-01-09
+ */
+@Service
+public class ProductAvailableRecordServiceImpl extends ServiceImpl<ProductAvailableRecordMapper, ProductAvailableRecord> implements ProductAvailableRecordService {
+
+}

+ 85 - 10
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -3,6 +3,7 @@ package com.fjhx.item.service.product.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -10,17 +11,22 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
-import com.fjhx.common.controller.FileServiceController;
+import com.fjhx.common.entity.InOutBo;
+import com.fjhx.common.enums.InOutType;
+import com.fjhx.common.service.file.FtpFileService;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.item.entity.product.bo.ProductAnalysisBo;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
+import com.fjhx.item.entity.product.po.ProductAvailableRecord;
 import com.fjhx.item.entity.product.po.ProductClassify;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.entity.product.po.ProductInfoEhsdExcel;
 import com.fjhx.item.entity.product.vo.ProductInfoVo;
+import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.mapper.product.ProductInfoMapper;
+import com.fjhx.item.service.product.ProductAvailableRecordService;
 import com.fjhx.item.service.product.ProductClassifyService;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.item.util.CodeEnum;
@@ -30,7 +36,9 @@ import com.fjhx.tenant.entity.dict.po.DictTenantData;
 import com.fjhx.tenant.entity.dict.vo.DictTenantDataVo;
 import com.fjhx.tenant.service.dict.DictTenantDataService;
 import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
@@ -64,7 +72,9 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
     @Autowired
     private DictTenantDataService dictTenantDataService;
     @Autowired
-    private FileServiceController fileServiceController;
+    private FtpFileService ftpFileService;
+    @Autowired
+    private ProductAvailableRecordService productAvailableRecordService;
 
     @Override
     public Page<ProductInfoVo> getPage(ProductInfoSelectDto dto) {
@@ -220,25 +230,86 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         }
 
         //操作ftp文件
+        editFtpFile(productInfoDto);
+
+        this.save(productInfoDto);
+        ObsFileUtil.saveFile(productInfoDto.getFileList(), productInfoDto.getId());
+    }
+
+    /**
+     * 操作ftp文件
+     */
+    private void editFtpFile(ProductInfoDto productInfoDto) {
+        //操作ftp文件
         String prodImgTempPath = productInfoDto.getProdImgPath();
         String prodFileTempPath = productInfoDto.getProdFilePath();
         //生产图片
-        if (ObjectUtil.isNotEmpty(prodImgTempPath)) {
+        if (ObjectUtil.isNotEmpty(prodImgTempPath) && prodImgTempPath.startsWith("/temp")) {
             File prodImgTemp = new File(prodImgTempPath);
             String prodImgPath = String.format("/product/prodImg/%s/%s", productInfoDto.getCustomCode(), prodImgTemp.getName());
-//            fileServiceController.moveFolder(prodImgTempPath, prodImgPath);
-            productInfoDto.setProdImgPath(prodImgPath);
+            JSONObject prodImgJson = ftpFileService.moveFolder(prodImgTempPath, prodImgPath);
+            productInfoDto.setProdImgPath(prodImgJson.getString("path"));
         }
         //生产文件
-        if (ObjectUtil.isNotEmpty(prodFileTempPath)) {
+        if (ObjectUtil.isNotEmpty(prodFileTempPath) && prodFileTempPath.startsWith("/temp")) {
             File prodFileTemp = new File(prodFileTempPath);
             String prodFilePath = String.format("/product/prodFile/%s/%s", productInfoDto.getCustomCode(), prodFileTemp.getName());
-//            fileServiceController.moveFolder(prodFileTempPath, prodFilePath);
-            productInfoDto.setProdFilePath(prodFilePath);
+            JSONObject prodFileJson = ftpFileService.moveFolder(prodFileTempPath, prodFilePath);
+            productInfoDto.setProdFilePath(prodFileJson.getString("path"));
         }
+    }
 
-        this.save(productInfoDto);
-        ObsFileUtil.saveFile(productInfoDto.getFileList(), productInfoDto.getId());
+    /**
+     * 修改可用库存
+     *
+     * @param inOutList 产品列表
+     * @param inOutType 1添加 2减少
+     */
+    @DSTransactional
+    @Override
+    public synchronized void editAvailableQuantity(List<InOutBo> inOutList, InOutType inOutType, Long businessId, ProductAvailableRecordType businessType) {
+        List<Long> pIds = inOutList.stream().map(InOutBo::getProductId).collect(Collectors.toList());
+        Map<Long, ProductInfo> productInfoMap = this.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, pIds));
+
+        List<ProductAvailableRecord> availableRecordList = new ArrayList<>();
+        for (InOutBo inOutBo : inOutList) {
+            ProductInfo productInfo = productInfoMap.get(inOutBo.getProductId());
+
+            BigDecimal availableQuantityNew;
+            BigDecimal edQuantity = inOutBo.getQuantity();
+
+            BigDecimal availableQuantity = productInfo.getAvailableQuantity();
+
+            if (inOutType.equals(InOutType.IN)) {
+                availableQuantityNew = availableQuantity.add(inOutBo.getQuantity());
+            } else if (inOutType.equals(InOutType.OUT)) {
+                availableQuantityNew = availableQuantity.subtract(inOutBo.getQuantity());
+            } else if (inOutType.equals(InOutType.EQ)) {
+                availableQuantityNew = inOutBo.getQuantity();
+
+                edQuantity = availableQuantityNew.subtract(availableQuantity);
+            } else {
+                throw new ServiceException("未知类型");
+            }
+
+            this.update(q -> q
+                    .eq(ProductInfo::getId, productInfo.getId())
+                    .set(ProductInfo::getAvailableQuantity, availableQuantityNew)
+                    .set(BasePo::getUpdateTime, new Date())
+                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+            );
+
+            //保存操作记录
+            ProductAvailableRecord productAvailableRecord = new ProductAvailableRecord();
+            productAvailableRecord.setBeforeQuantity(productInfo.getAvailableQuantity());
+            productAvailableRecord.setAfterQuantity(availableQuantityNew);
+            productAvailableRecord.setEditQuantity(edQuantity);
+            productAvailableRecord.setBusinessId(businessId);
+            productAvailableRecord.setBusinessType(businessType.getType());
+
+            availableRecordList.add(productAvailableRecord);
+        }
+        productAvailableRecordService.saveBatch(availableRecordList);
     }
 
     @DSTransactional
@@ -362,6 +433,10 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
         if (count != 0) {
             throw new ServiceException("产品自定义编码重复");
         }
+
+        //操作ftp文件
+        editFtpFile(productInfoDto);
+
         this.updateById(productInfoDto);
         ObsFileUtil.editFile(productInfoDto.getFileList(), productInfoDto.getId());
     }

+ 4 - 0
hx-item/src/main/resources/mapper/product/ProductAvailableRecordMapper.xml

@@ -0,0 +1,4 @@
+<?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.item.mapper.product.ProductAvailableRecordMapper">
+</mapper>

+ 3 - 1
hx-item/src/main/resources/mapper/product/ProductInfoMapper.xml

@@ -36,7 +36,9 @@
                pi.currency,
                pi.cost_price,
                pi.cost_currency,
-               pi.raw_material_id
+               pi.raw_material_id,
+               pi.prod_img_path,
+               pi.prod_file_path
         FROM product_info pi
     </sql>
 

+ 14 - 1
hx-purchase/src/main/java/com/fjhx/purchase/entity/subscribe/po/SubscribeDetail.java

@@ -42,7 +42,7 @@ public class SubscribeDetail extends BasePo {
     private String content;
 
     /**
-     * 状态 10、审批中  20、已采购  30、部分到货  40、完成
+     * 状态 10、审批中 15待采购 20、已采购  30、部分到货  40、完成
      */
     private Integer status;
 
@@ -57,6 +57,19 @@ public class SubscribeDetail extends BasePo {
     private Integer delFlag;
 
     /**
+     * 合同id
+     */
+    private Long contractId;
+    /**
+     * 合同明细id
+     */
+    private Long contractDetailId;
+    /**
+     * 数据类型 0申购 1销售合同
+     */
+    private Integer dataType;
+
+    /**
      * 货品类型
      */
     @TableField(exist = false)

+ 4 - 3
hx-purchase/src/main/java/com/fjhx/purchase/flow/SubscribeFlow.java

@@ -1,10 +1,8 @@
 package com.fjhx.purchase.flow;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.fjhx.common.constant.SourceConstant;
 import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.enums.FlowStatusEnum1;
 import com.fjhx.common.service.coding.CodingRuleService;
@@ -65,7 +63,10 @@ public class SubscribeFlow extends FlowDelegate {
 
         List<SubscribeDetail> SubscribeDetails = subscribe.getSubscribeDetailList();
         if(CollectionUtils.isNotEmpty(SubscribeDetails)){
-            SubscribeDetails.forEach(item -> item.setSubscribeId(subscribe.getId()));
+            SubscribeDetails.forEach(item -> {
+                item.setSubscribeId(subscribe.getId());
+                item.setDataType(0);
+            });
             subscribeDetailService.saveBatch(SubscribeDetails);
         }
 

+ 1 - 1
hx-purchase/src/main/resources/mapper/subscribe/SubscribeDetailMapper.xml

@@ -15,7 +15,7 @@
                t2.corporation_id        AS corporationId
         FROM subscribe_detail t1
                  LEFT JOIN subscribe t2 ON t1.subscribe_id = t2.id
-                 left JOIN product_info pi on t1.bussiness_id = pi.id
+                 left JOIN product_info pi on t1.product_id = pi.id
             ${ew.customSqlSegment}
     </select>
 

+ 105 - 9
hx-sale/src/main/java/com/fjhx/sale/flow/ContractFlow.java

@@ -6,13 +6,22 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.fjhx.area.utils.CustomizeAreaUtil;
+import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.enums.FlowStatusEnum1;
+import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.service.coding.CodingRuleService;
 import com.fjhx.common.service.file.FtpFileService;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
+import com.fjhx.item.entity.product.po.ProductBomDetail;
+import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.enums.ProductAvailableRecordType;
+import com.fjhx.item.service.product.ProductBomDetailService;
+import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
+import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
@@ -20,7 +29,6 @@ import com.fjhx.sale.entity.contract.po.ContractProject;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.contract.ContractProjectService;
 import com.fjhx.sale.service.contract.ContractService;
-import com.fjhx.sale.service.contract.ContractShipmentService;
 import com.ruoyi.common.annotation.LogicIgnore;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.core.domain.entity.SysUser;
@@ -30,9 +38,9 @@ import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 外销合同流程
@@ -55,11 +63,14 @@ public class ContractFlow extends FlowDelegate {
 
     @Autowired
     private ContractProjectService contractProjectService;
-
-    @Autowired
-    private ContractShipmentService contractShipmentService;
     @Autowired
     private FtpFileService ftpFileService;
+    @Autowired
+    private ProductInfoService productInfoService;
+    @Autowired
+    private SubscribeDetailService subscribeDetailService;
+    @Autowired
+    private ProductBomDetailService productBomDetailService;
 
     @Override
     public String getFlowKey() {
@@ -115,6 +126,9 @@ public class ContractFlow extends FlowDelegate {
         contract.setStatus(FlowStatusEnum1.PASS.getKey());
         contract.setApprovedDate(new Date());
         contractService.updateById(contract);
+
+        //生成物料待采购数据
+        createMaterialWaitPurchase(contract);
     }
 
     public Long start(ContractDto contract) {
@@ -142,8 +156,8 @@ public class ContractFlow extends FlowDelegate {
             String prodFilePath = c.getProdFilePath();
             if (ObjectUtil.isNotEmpty(prodFilePath) && prodFilePath.startsWith("/temp")) {
                 String targetFolderPath = String.format("/contractProduct/%s", c.getId());
-                ftpFileService.moveFolder(prodFilePath, targetFolderPath);
-                c.setProdFilePath(targetFolderPath);
+                com.alibaba.fastjson2.JSONObject prodFile = ftpFileService.moveFolder(prodFilePath, targetFolderPath);
+                c.setProdFilePath(prodFile.getString("path"));
             }
         }
         contractProductService.editLinked(contractProductList, ContractProduct::getContractId, contract.getId());
@@ -206,4 +220,86 @@ public class ContractFlow extends FlowDelegate {
                 .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
         );
     }
+
+    /**
+     * 创建合同产品 物料待采购信息
+     */
+    private void createMaterialWaitPurchase(Contract contract) {
+        //生成物料待采购数据
+        List<ContractProduct> contractProductList = contractProductService.list(q -> q.eq(ContractProduct::getContractId, contract.getId()));
+        List<Long> productIds = contractProductList.stream().map(ContractProduct::getProductId).collect(Collectors.toList());
+        //获取产品列表
+        Map<Long, ProductInfo> productInfoMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, productIds));
+        //获取物料信息
+        Map<Long, List<ProductBomDetail>> productBomMap = productBomDetailService.mapKGroup(ProductBomDetail::getProductId, q -> q.eq(ProductBomDetail::getProductId, productIds));
+
+        //待采购列表
+        List<SubscribeDetail> subscribeDetailList = new ArrayList<>();
+
+        for (ContractProduct contractProduct : contractProductList) {
+            Long productId = contractProduct.getProductId();
+            ProductInfo productInfo = productInfoMap.get(productId);
+
+            //获取物料列表,以及原材料
+            List<ProductBomDetail> productBomDetails = productBomMap.get(productId);
+            ProductBomDetail rawMaterial = new ProductBomDetail();
+            //添加原材料
+            rawMaterial.setMaterialId(productInfo.getRawMaterialId());
+            rawMaterial.setProductId(productId);
+            rawMaterial.setQuantity(BigDecimal.ONE);
+
+            List<Long> materialIds = productBomDetails.stream().map(ProductBomDetail::getMaterialId).collect(Collectors.toList());
+            Map<Long, ProductInfo> materialMap = productInfoService.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
+
+            //遍历物料列表
+            for (ProductBomDetail productBomDetail : productBomDetails) {
+                Long materialId = productBomDetail.getMaterialId();
+                ProductInfo materialInfo = materialMap.get(materialId);
+
+                BigDecimal multiply = productBomDetail.getQuantity().multiply(contractProduct.getQuantity());
+
+                //获取产品安全库存
+                BigDecimal stockThreshold = materialInfo.getStockThreshold();
+                //获取可用库存
+                BigDecimal availableQuantity = materialInfo.getAvailableQuantity();
+                //计数需要采购的数量(需采购量 = 安全库存 - (可用库存 - 合同量)若 需采购量<0,则按0算不采购)
+                BigDecimal subtract = availableQuantity.subtract(contractProduct.getQuantity());
+                BigDecimal requiredQuantity = stockThreshold.subtract(subtract);
+
+                //计算可用库存
+                if (requiredQuantity.compareTo(BigDecimal.ZERO) >= 0) {
+                    //需要采购的数量>=0 可用库存 = 可用库存 - 合同量
+                    InOutBo inOutBo = new InOutBo();
+                    inOutBo.setProductId(materialId);
+                    inOutBo.setQuantity(multiply);
+                    productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.OUT, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS);
+                } else {
+                    //需要采购的数量<0 可用库存 = 安全库存
+                    InOutBo inOutBo = new InOutBo();
+                    inOutBo.setProductId(materialId);
+                    inOutBo.setQuantity(stockThreshold);
+                    productInfoService.editAvailableQuantity(Arrays.asList(inOutBo), InOutType.EQ, contractProduct.getId(), ProductAvailableRecordType.SALE_PASS);
+                }
+
+                //需要采购的数量大于0生成待采购数据
+                if (requiredQuantity.compareTo(BigDecimal.ZERO) > 0) {
+                    SubscribeDetail subscribeDetail = new SubscribeDetail();
+                    subscribeDetail.setProductId(contractProduct.getProductId());
+                    subscribeDetail.setCount(requiredQuantity);
+                    subscribeDetail.setStatus(15);//待采购
+                    subscribeDetail.setContractId(contract.getId());
+                    subscribeDetail.setContractDetailId(contractProduct.getId());
+                    subscribeDetail.setDataType(1);
+
+                    subscribeDetailList.add(subscribeDetail);
+                }
+
+            }
+        }
+
+        //保存待采购明细
+        subscribeDetailService.saveBatch(subscribeDetailList);
+    }
+
+
 }

+ 29 - 23
hx-sale/src/main/java/com/fjhx/sale/flow/ContractUpdateFlow.java

@@ -9,15 +9,15 @@ import com.fjhx.common.utils.Assert;
 import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
+import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.sale.entity.contract.dto.ContractDto;
 import com.fjhx.sale.entity.contract.po.Contract;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.contract.po.ContractProject;
-import com.fjhx.sale.entity.contract.po.ContractShipment;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.contract.ContractProjectService;
 import com.fjhx.sale.service.contract.ContractService;
-import com.fjhx.sale.service.contract.ContractShipmentService;
+import com.fjhx.sale.service.purchase.EhsdPurchaseProductService;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.exception.ServiceException;
@@ -50,8 +50,13 @@ public class ContractUpdateFlow extends FlowDelegate {
     @Autowired
     private ContractProjectService contractProjectService;
 
+//    @Autowired
+//    private ContractShipmentService contractShipmentService;
+
+    @Autowired
+    private EhsdPurchaseProductService purchaseProductService;
     @Autowired
-    private ContractShipmentService contractShipmentService;
+    private ProductInfoService productInfoService;
 
     @Override
     public String getFlowKey() {
@@ -168,6 +173,7 @@ public class ContractUpdateFlow extends FlowDelegate {
         if (oldContract == null) {
             throw new ServiceException("原合同不存在");
         }
+
         //替换新数据ID为临时ID
         long temNewId = IdWorker.getId();
         Contract temNewUpContract = new Contract();
@@ -185,13 +191,13 @@ public class ContractUpdateFlow extends FlowDelegate {
         //查询新数据产品、收费、出货
         List<Long> newContractProductIds = contractProductService.list(Wrappers.<ContractProduct>query().lambda().select(ContractProduct::getId).eq(ContractProduct::getContractId, businessId)).stream().map(ContractProduct::getId).collect(Collectors.toList());
         List<Long> newContractProjectIds = contractProjectService.list(Wrappers.<ContractProject>query().lambda().select(ContractProject::getId).eq(ContractProject::getContractId, businessId)).stream().map(ContractProject::getId).collect(Collectors.toList());
-        List<Long> newContractShipmentIds = contractShipmentService.list(Wrappers.<ContractShipment>query().lambda().select(ContractShipment::getId).eq(ContractShipment::getContractId, businessId)).stream().map(ContractShipment::getId).collect(Collectors.toList());
+//        List<Long> newContractShipmentIds = contractShipmentService.list(Wrappers.<ContractShipment>query().lambda().select(ContractShipment::getId).eq(ContractShipment::getContractId, businessId)).stream().map(ContractShipment::getId).collect(Collectors.toList());
 
 
         //查询旧数据产品、收费、出货
         List<Long> oldContractProductIds = contractProductService.list(Wrappers.<ContractProduct>query().lambda().select(ContractProduct::getId).eq(ContractProduct::getContractId, oldContractId)).stream().map(ContractProduct::getId).collect(Collectors.toList());
         List<Long> oldContractProjectIds = contractProjectService.list(Wrappers.<ContractProject>query().lambda().select(ContractProject::getId).eq(ContractProject::getContractId, oldContractId)).stream().map(ContractProject::getId).collect(Collectors.toList());
-        List<Long> oldContractShipmentIds = contractShipmentService.list(Wrappers.<ContractShipment>query().lambda().select(ContractShipment::getId).eq(ContractShipment::getContractId, oldContractId)).stream().map(ContractShipment::getId).collect(Collectors.toList());
+//        List<Long> oldContractShipmentIds = contractShipmentService.list(Wrappers.<ContractShipment>query().lambda().select(ContractShipment::getId).eq(ContractShipment::getContractId, oldContractId)).stream().map(ContractShipment::getId).collect(Collectors.toList());
 
 
         /**
@@ -212,10 +218,10 @@ public class ContractUpdateFlow extends FlowDelegate {
         if (CollectionUtils.isNotEmpty(newContractProjectIds)) {
             contractProjectService.update(Wrappers.<ContractProject>update().lambda().set(ContractProject::getContractId, oldContractId).in(ContractProject::getId, newContractProjectIds));
         }
-        //修改合同出货相关数据
-        if (CollectionUtils.isNotEmpty(newContractShipmentIds)) {
-            contractShipmentService.update(Wrappers.<ContractShipment>update().lambda().set(ContractShipment::getContractId, oldContractId).in(ContractShipment::getId, newContractShipmentIds));
-        }
+//        //修改合同出货相关数据
+//        if (CollectionUtils.isNotEmpty(newContractShipmentIds)) {
+//            contractShipmentService.update(Wrappers.<ContractShipment>update().lambda().set(ContractShipment::getContractId, oldContractId).in(ContractShipment::getId, newContractShipmentIds));
+//        }
 
         /**
          * 处理旧的合同---
@@ -235,11 +241,11 @@ public class ContractUpdateFlow extends FlowDelegate {
             //修改合同收费相关数据
             contractProjectService.update(Wrappers.<ContractProject>update().lambda().set(ContractProject::getContractId, businessId).in(ContractProject::getId, oldContractProjectIds));
         }
-        //修改合同出货相关数据
-        if (CollectionUtils.isNotEmpty(oldContractShipmentIds)) {
-            //修改合同出货相关数据
-            contractShipmentService.update(Wrappers.<ContractShipment>update().lambda().set(ContractShipment::getContractId, businessId).in(ContractShipment::getId, oldContractShipmentIds));
-        }
+//        //修改合同出货相关数据
+//        if (CollectionUtils.isNotEmpty(oldContractShipmentIds)) {
+//            //修改合同出货相关数据
+//            contractShipmentService.update(Wrappers.<ContractShipment>update().lambda().set(ContractShipment::getContractId, businessId).in(ContractShipment::getId, oldContractShipmentIds));
+//        }
         ObsFileUtil.exchangeBusinessId(oldContractId, businessId);
     }
 
@@ -282,15 +288,15 @@ public class ContractUpdateFlow extends FlowDelegate {
             contractProjectService.saveBatch(contractProjectList);
         }
 
-        // 保存自定义出货
-        List<ContractShipment> contractShipmentList = contract.getContractShipmentList();
-        if (CollectionUtils.isNotEmpty(contractShipmentList)) {
-            for (ContractShipment c : contractShipmentList) {
-                c.setId(IdWorker.getId());
-                c.setContractId(contract.getId());
-            }
-            contractShipmentService.saveBatch(contractShipmentList);
-        }
+//        // 保存自定义出货
+//        List<ContractShipment> contractShipmentList = contract.getContractShipmentList();
+//        if (CollectionUtils.isNotEmpty(contractShipmentList)) {
+//            for (ContractShipment c : contractShipmentList) {
+//                c.setId(IdWorker.getId());
+//                c.setContractId(contract.getId());
+//            }
+//            contractShipmentService.saveBatch(contractShipmentList);
+//        }
 
         // 交接单附件列表
         ObsFileUtil.copyFileAndSave(contract.getFileList(), contract.getId(), 1);

+ 73 - 110
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java

@@ -6,27 +6,34 @@ import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fjhx.area.utils.CustomizeAreaUtil;
+import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.enums.FlowStatusEnum1;
+import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.service.coding.CodingRuleService;
 import com.fjhx.common.utils.Assert;
-import com.fjhx.file.utils.ObsFileUtil;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
+import com.fjhx.item.enums.ProductAvailableRecordType;
+import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseStatusEnum;
 import com.fjhx.purchase.entity.subscribe.enums.SubscribeDetailStatusEnum;
 import com.fjhx.purchase.entity.subscribe.po.SubscribeDetail;
 import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
 import com.fjhx.sale.entity.contract.po.Contract;
-import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.purchase.dto.EhsdPurchaseDto;
-import com.fjhx.sale.entity.purchase.po.*;
+import com.fjhx.sale.entity.purchase.po.EhsdPurchase;
+import com.fjhx.sale.entity.purchase.po.EhsdPurchaseArrival;
+import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct;
+import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProject;
 import com.fjhx.sale.entity.sample.po.Sample;
 import com.fjhx.sale.entity.sample.po.SampleProduct;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.sale.service.contract.ContractService;
-import com.fjhx.sale.service.purchase.*;
+import com.fjhx.sale.service.purchase.EhsdPurchaseProductService;
+import com.fjhx.sale.service.purchase.EhsdPurchaseProjectService;
+import com.fjhx.sale.service.purchase.EhsdPurchaseService;
 import com.fjhx.sale.service.sample.SampleProductService;
 import com.fjhx.sale.service.sample.SampleService;
 import com.ruoyi.common.annotation.LogicIgnore;
@@ -41,6 +48,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -50,7 +58,6 @@ import java.util.stream.Collectors;
  * @DATE:2023/4/3 17:38
  */
 @Component
-//@DS(SourceConstant.SALE)
 public class EhsdPurchaseFlow extends FlowDelegate {
 
     @Autowired
@@ -62,11 +69,11 @@ public class EhsdPurchaseFlow extends FlowDelegate {
     @Autowired
     private EhsdPurchaseProjectService purchaseProjectService;
 
-    @Autowired
-    private EhsdPurchaseArrivalService purchaseArrivalService;
-
-    @Autowired
-    private EhsdPurchaseProductMountingsService purchaseProductMountingsService;
+//    @Autowired
+//    private EhsdPurchaseArrivalService purchaseArrivalService;
+//
+//    @Autowired
+//    private EhsdPurchaseProductMountingsService purchaseProductMountingsService;
 
     @Autowired
     private ContractProductService contractProductService;
@@ -82,6 +89,8 @@ public class EhsdPurchaseFlow extends FlowDelegate {
     private ContractService contractService;
     @Autowired
     private SampleService sampleService;
+    @Autowired
+    private ProductInfoService productInfoService;
 
     @Override
     public String getFlowKey() {
@@ -128,73 +137,6 @@ public class EhsdPurchaseFlow extends FlowDelegate {
 
 
     /**
-     * 公共代码块--变更
-     */
-    public EhsdPurchaseDto updateStart(EhsdPurchaseDto purchase) {
-        //赋值城市省份信息
-        CustomizeAreaUtil.setAreaId(purchase);
-        purchase.setSellCityId(purchase.getCityId());
-        purchase.setSellCountryId(purchase.getCountryId());
-        purchase.setSellProvinceId(purchase.getProvinceId());
-
-
-        purchase.setStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
-        String nickName = SecurityUtils.getLoginUser().getUser().getNickName();
-        purchase.setUserName(nickName);
-        purchaseService.save(purchase);
-        List<EhsdPurchaseProduct> purchaseProductList = purchase.getPurchaseProductList();
-        List<EhsdPurchaseProject> purchaseProjectList = purchase.getPurchaseProjectList();
-        List<EhsdPurchaseArrival> purchaseArrivalList = purchase.getPurchaseArrivalList();
-        List<EhsdPurchaseProductMountings> addMountingsList = new ArrayList<>();
-        if (CollectionUtils.isNotEmpty(purchaseProductList)) {
-            for (EhsdPurchaseProduct s : purchaseProductList) {//产品
-                long id = IdWorker.getId();
-                s.setId(id);
-                s.setPurchaseId(purchase.getId());
-                List<EhsdPurchaseProductMountings> purchaseProductMountingsList = s.getPurchaseProductMountingsList();
-                if (CollectionUtils.isNotEmpty(purchaseProductMountingsList)) {//产品配件
-                    purchaseProductMountingsList.forEach(obj -> obj.setPurchaseProductId(id));
-                    addMountingsList.addAll(purchaseProductMountingsList);
-                }
-                ObsFileUtil.saveAllFile(s.getFileList(), s.getId(), 0);
-
-                if ("0".equals(purchase.getDataResource())) {
-                    //计算采购数量是否大于申购数量
-                    List<EhsdPurchaseProduct> purchaseDetailList1 = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getSubscribeDetailId,
-                            s.getSubscribeDetailId()));
-                    //求和
-                    BigDecimal purchaseCount = purchaseDetailList1.stream()
-                            .map(EhsdPurchaseProduct::getQuantity)
-                            .reduce(BigDecimal.ZERO, BigDecimal::add);
-                    //计算历史采购数量+本次采购数量之和
-                    BigDecimal count = purchaseCount.add(s.getQuantity());
-                    //判断采购数量是否大于申购数量
-                    SubscribeDetail subscribeDetail = subscribeDetailService.getById(s.getSubscribeDetailId());
-                    if (count.compareTo(subscribeDetail.getCount()) > 0) {
-                        throw new ServiceException("采购数量不能大于申购数量");
-                    }
-                }
-            }
-            purchaseProductService.saveBatch(purchaseProductList);
-            purchaseProductMountingsService.saveBatch(addMountingsList);
-        }
-        if (CollectionUtils.isNotEmpty(purchaseProjectList)) {//到货
-            for (EhsdPurchaseProject s : purchaseProjectList) {
-                s.setPurchaseId(purchase.getId());
-            }
-            purchaseProjectService.saveBatch(purchaseProjectList);
-        }
-        if (CollectionUtils.isNotEmpty(purchaseArrivalList)) {//收费项目
-            for (EhsdPurchaseArrival s : purchaseArrivalList) {
-                s.setPurchaseId(purchase.getId());
-            }
-            purchaseArrivalService.saveBatch(purchaseArrivalList);
-        }
-        return purchase;
-    }
-
-
-    /**
      * 公共代码块--发起
      */
     public EhsdPurchaseDto connStart(EhsdPurchaseDto purchase) {
@@ -220,21 +162,15 @@ public class EhsdPurchaseFlow extends FlowDelegate {
 
         //产品(采购明细)
         for (EhsdPurchaseProduct s : purchaseProductList) {
-            long id;
-            if (ObjectUtils.isNotEmpty(s.getId())) {
-                id = s.getId();
-            } else {
-                id = IdWorker.getId();
-            }
-            s.setId(id);
+            s.setId(ObjectUtils.isNotEmpty(s.getId()) ? s.getId() : IdWorker.getId());
             s.setPurchaseId(purchase.getId());
-            List<EhsdPurchaseProductMountings> purchaseProductMountingsList = s.getPurchaseProductMountingsList();
-            if (CollectionUtils.isNotEmpty(purchaseProductMountingsList)) {//产品配件
-                purchaseProductMountingsList.forEach(obj -> obj.setPurchaseProductId(id));
-            }
-            //修改或删除数据
-            purchaseProductMountingsService.editLinked(purchaseProductMountingsList,
-                    EhsdPurchaseProductMountings::getPurchaseProductId, id);
+//            List<EhsdPurchaseProductMountings> purchaseProductMountingsList = s.getPurchaseProductMountingsList();
+//            if (CollectionUtils.isNotEmpty(purchaseProductMountingsList)) {//产品配件
+//                purchaseProductMountingsList.forEach(obj -> obj.setPurchaseProductId(id));
+//            }
+//            //修改或删除数据
+//            purchaseProductMountingsService.editLinked(purchaseProductMountingsList,
+//                    EhsdPurchaseProductMountings::getPurchaseProductId, id);
 
             if ("0".equals(purchase.getDataResource())) {
                 //计算采购数量是否大于申购数量
@@ -262,11 +198,11 @@ public class EhsdPurchaseFlow extends FlowDelegate {
         }
         purchaseProjectService.editLinked(purchaseProjectList, EhsdPurchaseProject::getPurchaseId, purchase.getId());
 
-        //到货
-        for (EhsdPurchaseArrival s : purchaseArrivalList) {
-            s.setPurchaseId(purchase.getId());
-        }
-        purchaseArrivalService.editLinked(purchaseArrivalList, EhsdPurchaseArrival::getPurchaseId, purchase.getId());
+//        //到货
+//        for (EhsdPurchaseArrival s : purchaseArrivalList) {
+//            s.setPurchaseId(purchase.getId());
+//        }
+//        purchaseArrivalService.editLinked(purchaseArrivalList, EhsdPurchaseArrival::getPurchaseId, purchase.getId());
 
         return purchase;
     }
@@ -287,33 +223,30 @@ public class EhsdPurchaseFlow extends FlowDelegate {
         }
         //查询采购产品
         List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(Wrappers.<EhsdPurchaseProduct>query().lambda().eq(EhsdPurchaseProduct::getPurchaseId, businessId));
-        List<ContractProduct> upContractProduct = new ArrayList<>();
+//        List<ContractProduct> upContractProduct = new ArrayList<>();
         List<SampleProduct> upSampleProduct = new ArrayList<>();
         for (EhsdPurchaseProduct p : purchaseProductList) {
-            if (ObjectUtils.isNotEmpty(p.getDataResourceId()) &&
-                    p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_1.getKey()) {//如果采购的是外销合同
-                ContractProduct contractProduct = contractProductService.getById(p.getDataResourceId());
-                BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(p.getQuantity());
+//            if (ObjectUtils.isNotEmpty(p.getDataResourceId()) &&
+//                    p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_1.getKey()) {//如果采购的是外销合同
+//                ContractProduct contractProduct = contractProductService.getById(p.getDataResourceId());
+//                BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(p.getQuantity());
 //                if (expendQuantity.compareTo(BigDecimal.ZERO) < 0) {//小于0不让继续执行
 //                    throw new ServiceException("采购数量不得大于合同剩余采购数量,请驳回审批修改");
 //                }
-                contractProduct.setExpendQuantity(expendQuantity);
-                upContractProduct.add(contractProduct);
-            }
+//                contractProduct.setExpendQuantity(expendQuantity);
+//                upContractProduct.add(contractProduct);
+//            }
             if (ObjectUtils.isNotEmpty(p.getDataResourceId()) &&
                     p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_2.getKey()) {//如果采购的是样品单
                 SampleProduct sampleProduct = sampleProductService.getById(p.getDataResourceId());
                 BigDecimal expendQuantity = sampleProduct.getExpendQuantity().subtract(p.getQuantity());
-                if (expendQuantity.compareTo(BigDecimal.ZERO) < 0) {//小于0不让继续执行
-//                    throw new ServiceException("采购数量不得大于合同剩余采购数量,请驳回审批修改");
-                }
                 sampleProduct.setExpendQuantity(expendQuantity);
                 upSampleProduct.add(sampleProduct);
             }
         }
-        if (CollectionUtils.isNotEmpty(upContractProduct)) {//扣减销售合同数量
-            contractProductService.updateBatchById(upContractProduct);
-        }
+//        if (CollectionUtils.isNotEmpty(upContractProduct)) {//扣减销售合同数量
+//            contractProductService.updateBatchById(upContractProduct);
+//        }
         if (CollectionUtils.isNotEmpty(upSampleProduct)) {//扣减样品单数量
             sampleProductService.updateBatchById(upSampleProduct);
         }
@@ -344,6 +277,19 @@ public class EhsdPurchaseFlow extends FlowDelegate {
             }
             subscribeDetailService.updateBatchById(subscribeDetails);
         }
+
+
+        List<InOutBo> inOutBoList = new ArrayList<>();
+        for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
+            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
+            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(purchaseProduct.getProductId());
+                inOutBo.setQuantity(purchaseProduct.getQuantity());
+                inOutBoList.add(inOutBo);
+            }
+        }
+        productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_PASS);
     }
 
     /**
@@ -384,6 +330,9 @@ public class EhsdPurchaseFlow extends FlowDelegate {
         );
     }
 
+    /**
+     * 作废
+     */
     @Override
     public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
         super.cancellation(flowId, businessId, flowStatus);
@@ -393,5 +342,19 @@ public class EhsdPurchaseFlow extends FlowDelegate {
                 .set(BasePo::getUpdateTime, new Date())
                 .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
         );
+
+        //修改可用库存
+        List<InOutBo> inOutBoList = new ArrayList<>();
+        List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId));
+        for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
+            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
+            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(purchaseProduct.getProductId());
+                inOutBo.setQuantity(purchaseProduct.getQuantity());
+                inOutBoList.add(inOutBo);
+            }
+        }
+        productInfoService.editAvailableQuantity(inOutBoList, InOutType.OUT, businessId, ProductAvailableRecordType.PURCHASE_CANCEL);
     }
 }

+ 44 - 4
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java

@@ -1,14 +1,16 @@
 package com.fjhx.sale.flow;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.enums.FlowStatusEnum1;
+import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.flow.core.FlowDelegate;
 import com.fjhx.flow.enums.FlowStatusEnum;
+import com.fjhx.item.enums.ProductAvailableRecordType;
+import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.purchase.entity.purchase.enums.PurchaseDataResourceEnum;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.entity.purchase.dto.EhsdPurchaseDto;
@@ -31,8 +33,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -56,6 +60,8 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
     private ContractProductService contractProductService;
     @Autowired
     private SampleProductService sampleProductService;
+    @Autowired
+    private ProductInfoService productInfoService;
 
     @Override
     public String getFlowKey() {
@@ -117,7 +123,7 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
         purchaseArrivalList.forEach(item -> item.setId(null));
 
         //调用采购发起公共代码块
-        purchase = ehsdPurchaseFlow.updateStart(purchase);
+        purchase = ehsdPurchaseFlow.connStart(purchase);
 
         return purchase.getId();
     }
@@ -214,6 +220,40 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
             }
         }
 
+        //---------------------------------------
+
+        //修改可用库存
+        //回滚旧合同数据
+        List<InOutBo> oldInOutBoList = new ArrayList<>();
+        for (EhsdPurchaseProduct purchaseProduct : oldPurchaseProductList) {
+            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 - 采购明细数量)
+            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(purchaseProduct.getProductId());
+                inOutBo.setQuantity(purchaseProduct.getQuantity());
+                oldInOutBoList.add(inOutBo);
+            }
+        }
+        productInfoService.editAvailableQuantity(oldInOutBoList, InOutType.OUT, purchase.getOldPurchaseId(), ProductAvailableRecordType.PURCHASE_UPDATE);
+
+
+        //将可用库存改为新合同数据
+        List<InOutBo> inOutBoList = new ArrayList<>();
+        List<EhsdPurchaseProduct> purchaseProductList = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId));
+        for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
+            //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
+            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
+                InOutBo inOutBo = new InOutBo();
+                inOutBo.setProductId(purchaseProduct.getProductId());
+                inOutBo.setQuantity(purchaseProduct.getQuantity());
+                inOutBoList.add(inOutBo);
+            }
+        }
+        productInfoService.editAvailableQuantity(inOutBoList, InOutType.IN, businessId, ProductAvailableRecordType.PURCHASE_UPDATE);
+
+
+        //-----------------------------
+
 
         //调用采购发起流程的结束方法
         ehsdPurchaseFlow.end(flowId, businessId, submitData);
@@ -222,7 +262,7 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
 
         //先将当前合同id 以及 当前合同关联数据的合同id 改为临时id
         long tempId = IdWorker.getId();
-        ehsdPurchaseService.updatePurchaseId(businessId,tempId,SecurityUtils.getUserId(),null);
+        ehsdPurchaseService.updatePurchaseId(businessId, tempId, SecurityUtils.getUserId(), null);
         ehsdPurchaseProductService.update(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId).set(EhsdPurchaseProduct::getPurchaseId, tempId));
         ehsdPurchaseProjectService.update(q -> q.eq(EhsdPurchaseProject::getPurchaseId, businessId).set(EhsdPurchaseProject::getPurchaseId, tempId));
         ehsdPurchaseArrivalService.update(q -> q.eq(EhsdPurchaseArrival::getPurchaseId, businessId).set(EhsdPurchaseArrival::getPurchaseId, tempId));

+ 1 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/StockService.java

@@ -1,7 +1,7 @@
 package com.fjhx.wms.service.stock;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.wms.entity.stock.bo.InOutBo;
+import com.fjhx.common.entity.InOutBo;
 import com.fjhx.wms.entity.stock.dto.StockDto;
 import com.fjhx.wms.entity.stock.dto.StockSelectDto;
 import com.fjhx.wms.entity.stock.emums.JournalType;

+ 22 - 2
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -8,15 +8,16 @@ import com.alibaba.fastjson2.JSONWriter;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.entity.InOutBo;
+import com.fjhx.common.enums.InOutType;
 import com.fjhx.item.entity.product.po.ProductClassify;
 import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.item.enums.ProductAvailableRecordType;
 import com.fjhx.item.service.product.ProductClassifyService;
 import com.fjhx.item.service.product.ProductInfoService;
-import com.fjhx.wms.entity.stock.bo.InOutBo;
 import com.fjhx.wms.entity.stock.dto.StockDto;
 import com.fjhx.wms.entity.stock.dto.StockJournalDetailsDto;
 import com.fjhx.wms.entity.stock.dto.StockSelectDto;
-import com.fjhx.wms.entity.stock.emums.InOutType;
 import com.fjhx.wms.entity.stock.emums.JournalType;
 import com.fjhx.wms.entity.stock.po.Stock;
 import com.fjhx.wms.entity.stock.po.StockJournal;
@@ -39,6 +40,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -358,8 +360,26 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
         }
         //操作库存
         ModifyInventory(1, stockDto.getList(), stockDto.getWarehouseId());
+
+
+//        changeStock(stockDto.getList());
+
         //保存出入库明细
         stockJournalDetailsService.saveBatch(stockJournalDetailsList);
+
+        //修改可用库存
+        List<InOutBo> inOutBoList = new ArrayList<>();
+        InOutType inOutType = Objects.equals(stockDto.getType(), 1) ? InOutType.IN : InOutType.OUT;
+        ProductAvailableRecordType productAvailableRecordType = inOutType.equals(InOutType.IN) ? ProductAvailableRecordType.HAND_IN : ProductAvailableRecordType.HAND_OUT;
+
+        for (Stock stock : list) {
+            InOutBo inOutBo = new InOutBo();
+            inOutBo.setProductId(stock.getProductId());
+            inOutBo.setQuantity(stock.getQuantity());
+            inOutBoList.add(inOutBo);
+        }
+
+        productInfoService.editAvailableQuantity(inOutBoList, inOutType, null, productAvailableRecordType);
     }
 
     @Override