Explorar o código

采购合同变更

yzc hai 1 ano
pai
achega
a116824b09
Modificáronse 20 ficheiros con 263 adicións e 71 borrados
  1. 32 0
      hx-common/src/main/java/com/fjhx/common/entity/AvailableStockBo.java
  2. 1 2
      hx-item/src/main/java/com/fjhx/item/enums/ProductAvailableRecordType.java
  3. 2 2
      hx-item/src/main/java/com/fjhx/item/service/product/ProductInfoService.java
  4. 61 4
      hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java
  5. 6 6
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java
  6. 1 2
      hx-purchase/src/main/java/com/fjhx/purchase/controller/subscribe/SubscribeController.java
  7. 1 1
      hx-purchase/src/main/java/com/fjhx/purchase/flow/SubscribeFlow.java
  8. 1 1
      hx-purchase/src/main/java/com/fjhx/purchase/mapper/subscribe/SubscribeDetailMapper.java
  9. 1 1
      hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/SubscribeService.java
  10. 6 3
      hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java
  11. 2 2
      hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeServiceImpl.java
  12. 1 1
      hx-purchase/src/main/resources/mapper/subscribe/SubscribeDetailMapper.xml
  13. 5 0
      hx-sale/src/main/java/com/fjhx/sale/entity/purchase/po/EhsdPurchaseProduct.java
  14. 6 4
      hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java
  15. 101 35
      hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java
  16. 3 3
      hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java
  17. 3 3
      hx-sale/src/main/java/com/fjhx/sale/service/purchase/impl/EhsdPurchaseServiceImpl.java
  18. 1 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/StockWaitService.java
  19. 3 1
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java
  20. 26 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java

+ 32 - 0
hx-common/src/main/java/com/fjhx/common/entity/AvailableStockBo.java

@@ -0,0 +1,32 @@
+package com.fjhx.common.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class AvailableStockBo {
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+
+    /**
+     * 数量
+     */
+    private BigDecimal newQuantity;
+
+    /**
+     * 数量
+     */
+    private BigDecimal inStockQuantity;
+
+}

+ 1 - 2
hx-item/src/main/java/com/fjhx/item/enums/ProductAvailableRecordType.java

@@ -9,8 +9,7 @@ public enum ProductAvailableRecordType {
 
     PURCHASE_PASS(1, "采购通过"),
     PURCHASE_CANCEL(2, "采购作废"),
-    PURCHASE_UPDATE_IN(3, "采购变更"),
-    PURCHASE_UPDATE_OUT(3, "采购变更"),
+    PURCHASE_UPDATE(3, "采购变更"),
     SALE_PASS(4, "销售合同通过"),
     HAND_IN(5, "手动入库"),
     HAND_OUT(6, "手动出库"),

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

@@ -1,7 +1,7 @@
 package com.fjhx.item.service.product;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.common.entity.InOutBo;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.item.entity.product.bo.ProductAnalysisBo;
 import com.fjhx.item.entity.product.dto.ProductInfoDto;
 import com.fjhx.item.entity.product.dto.ProductInfoSelectDto;
@@ -52,7 +52,7 @@ public interface ProductInfoService extends BaseService<ProductInfo> {
     void delete(Long id);
 
 
-    void editAvailableQuantity(List<InOutBo> inOutList, Long businessId, ProductAvailableRecordType businessType, Long companyId);
+    void editAvailableQuantity(List<AvailableStockBo> inOutList, Long businessId, ProductAvailableRecordType businessType, Long companyId);
 
     /**
      * 根据产品IDS获取产品

+ 61 - 4
hx-item/src/main/java/com/fjhx/item/service/product/impl/ProductInfoServiceImpl.java

@@ -8,11 +8,12 @@ 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;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 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.entity.InOutBo;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.service.file.FtpFileService;
 import com.fjhx.common.service.file.impl.FtpFileServiceImpl;
 import com.fjhx.file.entity.FileInfoVo;
@@ -343,12 +344,16 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
      */
     @DSTransactional
     @Override
-    public synchronized void editAvailableQuantity(List<InOutBo> inOutList, Long businessId, ProductAvailableRecordType businessType, Long companyId) {
+    public synchronized void editAvailableQuantity(List<AvailableStockBo> inOutList, Long businessId, ProductAvailableRecordType businessType, Long companyId) {
 
-        List<Long> materialIds = inOutList.stream().map(InOutBo::getProductId).collect(Collectors.toList());
+        if (ObjectUtil.isEmpty(inOutList)) {
+            return;
+        }
+
+        List<Long> materialIds = inOutList.stream().map(AvailableStockBo::getProductId).collect(Collectors.toList());
         Map<Long, ProductInfo> materialMap = this.mapKEntity(ProductInfo::getId, q -> q.in(ProductInfo::getId, materialIds));
 
-        for (InOutBo inOutBo : inOutList) {
+        for (AvailableStockBo inOutBo : inOutList) {
             Long materialId = inOutBo.getProductId();
             BigDecimal quantity = inOutBo.getQuantity();
 
@@ -421,6 +426,58 @@ public class ProductInfoServiceImpl extends ServiceImpl<ProductInfoMapper, Produ
                         .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
                 );
             }
+            //采购变更
+            else if (ProductAvailableRecordType.PURCHASE_UPDATE.equals(businessType)) {
+                BigDecimal newQuantity = inOutBo.getNewQuantity();
+
+                if (ObjectUtils.isEmpty(quantity)) {
+                    //新数据直接添加
+                    productStockInfoService.update(q -> q
+                            .eq(ProductStockInfo::getId, productStockInfoId)
+                            .setSql("available_quantity = available_quantity + " + newQuantity)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                } else if (ObjectUtils.isEmpty(newQuantity)) {
+                    //原数据被删,已入库数量大于0
+                    if (inOutBo.getInStockQuantity().compareTo(BigDecimal.ZERO) > 0) {
+                        throw new ServiceException("该采购存在已入库数据禁止变更!");
+                    }
+                    //直接回滚
+                    productStockInfoService.update(q -> q
+                            .eq(ProductStockInfo::getId, productStockInfoId)
+                            .setSql("available_quantity = available_quantity - " + quantity)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                } else if (quantity.compareTo(newQuantity) < 0) {
+                    //新数量比原数量多直接添加 差额
+                    BigDecimal subtract = newQuantity.subtract(quantity);
+                    productStockInfoService.update(q -> q
+                            .eq(ProductStockInfo::getId, productStockInfoId)
+                            .setSql("available_quantity = available_quantity + " + subtract)
+                            .set(BasePo::getUpdateTime, new Date())
+                            .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                    );
+                } else if (quantity.compareTo(newQuantity) > 0) {
+                    //新数量比原数量少检查已入库数量,如果比新数量大直接报错
+                    if (newQuantity.compareTo(inOutBo.getInStockQuantity()) >= 0) {
+                        BigDecimal subtract = quantity.subtract(newQuantity);
+                        //新数量大等于已入库数量
+                        productStockInfoService.update(q -> q
+                                .eq(ProductStockInfo::getId, productStockInfoId)
+                                .setSql("available_quantity = available_quantity - " + subtract)
+                                .set(BasePo::getUpdateTime, new Date())
+                                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+                        );
+                    } else {
+                        //新数量<已入库数量
+                        throw new ServiceException("新采购量小于已入库数据,禁止变更!");
+                    }
+                }
+            } else {
+                throw new ServiceException("未知操作类型,请联系管理员!");
+            }
 
         }
 

+ 6 - 6
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProduceOrderServiceImpl.java

@@ -7,7 +7,7 @@ import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 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.entity.InOutBo;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.enums.PushBusinessTypeEnum;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
@@ -321,16 +321,16 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         List<ContractProductBom> cpBList = contractProductBomService.list(q -> q.in(ContractProductBom::getContractProductId, cpIds));
 
         //合并所有相同物料
-        Map<Long, InOutBo> inOutBoMap = new ConcurrentHashMap<>();
+        Map<Long, AvailableStockBo> inOutBoMap = new ConcurrentHashMap<>();
         for (ContractProductBom bom : cpBList) {
             Long materialId = bom.getMaterialId();
             ContractProduct contractProduct = productMap.get(bom.getContractProductId());
             BigDecimal multiply = bom.getQuantity().multiply(contractProduct.getQuantity());
 
             //合并相同物料
-            InOutBo inOutBo = inOutBoMap.get(materialId);
+            AvailableStockBo inOutBo = inOutBoMap.get(materialId);
             if (ObjectUtil.isEmpty(inOutBo)) {
-                inOutBo = new InOutBo();
+                inOutBo = new AvailableStockBo();
                 inOutBo.setProductId(materialId);
                 inOutBo.setQuantity(BigDecimal.ZERO);
             }
@@ -345,10 +345,10 @@ public class ProduceOrderServiceImpl extends ServiceImpl<ProduceOrderMapper, Pro
         List<SubscribeDetail> subscribeDetailList = new ArrayList<>();
 
         //获取待采购物料列表
-        List<InOutBo> collect = inOutBoMap.values().stream().collect(Collectors.toList());
+        List<AvailableStockBo> collect = inOutBoMap.values().stream().collect(Collectors.toList());
         //操作可用库存计数需要采购量
         productInfoService.editAvailableQuantity(collect, contractId, ProductAvailableRecordType.SALE_PASS, companyId);
-        for (InOutBo inOutBo : collect) {
+        for (AvailableStockBo inOutBo : collect) {
             Long materialId = inOutBo.getProductId();
             BigDecimal requiredQuantity = inOutBo.getQuantity();
 

+ 1 - 2
hx-purchase/src/main/java/com/fjhx/purchase/controller/subscribe/SubscribeController.java

@@ -5,7 +5,6 @@ import com.fjhx.purchase.entity.subscribe.dto.DecisionAidDto;
 import com.fjhx.purchase.entity.subscribe.dto.SubscribeDetailSelectDto;
 import com.fjhx.purchase.entity.subscribe.dto.SubscribeDto;
 import com.fjhx.purchase.entity.subscribe.dto.SubscribeSelectDto;
-import com.fjhx.purchase.entity.subscribe.po.Subscribe;
 import com.fjhx.purchase.entity.subscribe.vo.DecisionAidVo;
 import com.fjhx.purchase.entity.subscribe.vo.SubscribeVo;
 import com.fjhx.purchase.service.subscribe.SubscribeService;
@@ -48,7 +47,7 @@ public class SubscribeController {
      * 申购单明细
      */
     @PostMapping("/detail")
-    public Subscribe detail(@RequestBody BaseSelectDto dto) {
+    public SubscribeVo detail(@RequestBody BaseSelectDto dto) {
         return subscribeService.detail(dto.getId());
     }
 

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

@@ -71,7 +71,7 @@ public class SubscribeFlow extends FlowDelegate {
             subscribeDetails.forEach(item -> {
                 item.setSubscribeId(subscribe.getId());
                 item.setDataType(0);
-                item.setContractId(subscribe.getCompanyId());
+                item.setCompanyId(subscribe.getCompanyId());
             });
             subscribeDetailService.saveBatch(subscribeDetails);
         }

+ 1 - 1
hx-purchase/src/main/java/com/fjhx/purchase/mapper/subscribe/SubscribeDetailMapper.java

@@ -43,5 +43,5 @@ public interface SubscribeDetailMapper extends BaseMapper<SubscribeDetail> {
      */
     List<SubscribeDetail> getPurchaseCountByIds(List<Long> ids);
 
-    List<SubscribeDetail> getContractCountByContractIds(List<Long> ids);
+    List<SubscribeDetailVo> getContractCountByContractIds(List<Long> ids);
 }

+ 1 - 1
hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/SubscribeService.java

@@ -32,7 +32,7 @@ public interface SubscribeService extends BaseService<Subscribe> {
     /**
      * 申购单明细
      */
-    Subscribe detail(Long id);
+    SubscribeVo detail(Long id);
 
     /**
      * 申购单新增

+ 6 - 3
hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java

@@ -131,8 +131,11 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
         //获取合同物料数量
         List<Long> contractIds = records.stream().
                 filter(item -> Objects.equals(item.getDataType(), 1)).map(SubscribeDetail::getContractId).collect(Collectors.toList());
-        List<SubscribeDetail> contractCount = baseMapper.getContractCountByContractIds(contractIds);
-        Map<Long, List<SubscribeDetail>> contractCountMap = contractCount.stream().collect(Collectors.groupingBy(SubscribeDetail::getContractId));
+        List<SubscribeDetailVo> contractCount = new ArrayList<>();
+        if (ObjectUtil.isNotEmpty(contractIds)) {
+            contractCount = baseMapper.getContractCountByContractIds(contractIds);
+        }
+        Map<Long, List<SubscribeDetailVo>> contractCountMap = contractCount.stream().collect(Collectors.groupingBy(SubscribeDetail::getContractId));
 
         //获取生产公司信息
         List<Long> companyIds = records.stream().map(SubscribeDetail::getCompanyId).collect(Collectors.toList());
@@ -160,7 +163,7 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
             record.setCompanyName(companyNameMap.get(record.getCompanyId()));
 
             //赋值生产需求量
-            List<SubscribeDetail> subscribeDetailList = contractCountMap.get(record.getContractId());
+            List<SubscribeDetailVo> subscribeDetailList = contractCountMap.get(record.getContractId());
             if (ObjectUtil.isNotEmpty(subscribeDetailList)) {
                 Map<Long, BigDecimal> collect = subscribeDetailList.stream().collect(Collectors.toMap(SubscribeDetail::getProductId, SubscribeDetail::getCount));
                 BigDecimal bigDecimal = collect.get(record.getProductId());

+ 2 - 2
hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeServiceImpl.java

@@ -102,7 +102,7 @@ public class SubscribeServiceImpl extends ServiceImpl<SubscribeMapper, Subscribe
      * @return
      */
     @Override
-    public Subscribe detail(Long id) {
+    public SubscribeVo detail(Long id) {
         if (ObjectUtils.isEmpty(id)) {
             throw new ServiceException("参数异常");
         }
@@ -139,7 +139,7 @@ public class SubscribeServiceImpl extends ServiceImpl<SubscribeMapper, Subscribe
             }
         }
         subscribeVo.setSubscribeDetailList(subscribeDetailVos);
-        return subscribe;
+        return subscribeVo;
     }
 
 //    @Override

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

@@ -80,7 +80,7 @@
         pp.subscribe_detail_id
     </select>
     <select id="getContractCountByContractIds"
-            resultType="com.fjhx.purchase.entity.subscribe.po.SubscribeDetail">
+            resultType="com.fjhx.purchase.entity.subscribe.vo.SubscribeDetailVo">
         SELECT
         cpb.contract_id,
         cpb.material_id AS productId,

+ 5 - 0
hx-sale/src/main/java/com/fjhx/sale/entity/purchase/po/EhsdPurchaseProduct.java

@@ -94,4 +94,9 @@ public class EhsdPurchaseProduct extends BasePo {
      */
     @TableField(exist = false)
     private List<ObsFile> fileList;
+
+    /**
+     * 原采购产品id
+     */
+    private Long oldPurchaseProductId;
 }

+ 6 - 4
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseFlow.java

@@ -7,7 +7,7 @@ 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.entity.AvailableStockBo;
 import com.fjhx.common.enums.CodingRuleEnum;
 import com.fjhx.common.enums.FlowStatusEnum1;
 import com.fjhx.common.service.coding.CodingRuleService;
@@ -211,11 +211,11 @@ public class EhsdPurchaseFlow extends FlowDelegate {
         //修改申购明细状态
         purchaseService.updateSubscribeStatus(businessId);
 
-        List<InOutBo> inOutBoList = new ArrayList<>();
+        List<AvailableStockBo> inOutBoList = new ArrayList<>();
         for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
             //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 + 采购明细数量)
-            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
-                InOutBo inOutBo = new InOutBo();
+            if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0.getKey())) {
+                AvailableStockBo inOutBo = new AvailableStockBo();
                 inOutBo.setProductId(purchaseProduct.getProductId());
                 inOutBo.setQuantity(purchaseProduct.getQuantity());
                 inOutBoList.add(inOutBo);
@@ -247,6 +247,8 @@ public class EhsdPurchaseFlow extends FlowDelegate {
             stockWaitDetailsList.add(stockWaitDetails);
         }
         stockWaitDetailsService.saveBatch(stockWaitDetailsList);
+
+
     }
 
     /**

+ 101 - 35
hx-sale/src/main/java/com/fjhx/sale/flow/EhsdPurchaseUpdateFlow.java

@@ -3,7 +3,7 @@ package com.fjhx.sale.flow;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
-import com.fjhx.common.entity.InOutBo;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.enums.FlowStatusEnum1;
 import com.fjhx.common.utils.Assert;
 import com.fjhx.common.utils.Utils;
@@ -11,7 +11,7 @@ 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.sale.entity.purchase.dto.EhsdPurchaseDto;
 import com.fjhx.sale.entity.purchase.po.EhsdPurchase;
 import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProduct;
@@ -19,16 +19,20 @@ import com.fjhx.sale.entity.purchase.po.EhsdPurchaseProject;
 import com.fjhx.sale.service.purchase.EhsdPurchaseProductService;
 import com.fjhx.sale.service.purchase.EhsdPurchaseProjectService;
 import com.fjhx.sale.service.purchase.EhsdPurchaseService;
+import com.fjhx.wms.entity.stock.po.StockWaitDetails;
+import com.fjhx.wms.service.stock.StockWaitDetailsService;
+import com.fjhx.wms.service.stock.StockWaitService;
 import com.ruoyi.common.core.domain.BasePo;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Objects;
+import java.util.Map;
 
 /**
  * 采购变更流程
@@ -45,6 +49,10 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
     private EhsdPurchaseProjectService ehsdPurchaseProjectService;
     @Autowired
     private ProductInfoService productInfoService;
+    @Autowired
+    private StockWaitDetailsService stockWaitDetailsService;
+    @Autowired
+    private StockWaitService stockWaitService;
 
     @Override
     public String getFlowKey() {
@@ -57,15 +65,16 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
     @Override
     public Long start(Long flowId, JSONObject submitData) {
         EhsdPurchaseDto purchase = submitData.toJavaObject(EhsdPurchaseDto.class);
-
-        //清理Id防止前端误传
+        Assert.notEmpty(purchase.getId(), "原采购订单id不能为空");
+        //赋值原采购id 并 清空id
+        purchase.setOldPurchaseId(purchase.getId());
         purchase.setId(null);
 
         //赋值流程id
         purchase.setFlowId(flowId);
 
+        //获取原采购id
         Long oldPurchaseId = purchase.getOldPurchaseId();
-        Assert.notEmpty(oldPurchaseId, "原采购订单id不能为空");
 
         //判断合同是否在变更中,防止用户缓存导致重复变更
         EhsdPurchase oldPurchase = ehsdPurchaseService.getById(oldPurchaseId);
@@ -83,8 +92,11 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
         //获取明细信息
         List<EhsdPurchaseProduct> purchaseProductList = purchase.getPurchaseProductList();
         List<EhsdPurchaseProject> purchaseProjectList = purchase.getPurchaseProjectList();
-        //清空物料,收费项目id 防止前端误传
-        purchaseProductList.forEach(item -> item.setId(null));
+        //赋值原id 清除id字段
+        for (EhsdPurchaseProduct ehsdPurchaseProduct : purchaseProductList) {
+            ehsdPurchaseProduct.setOldPurchaseProductId(ehsdPurchaseProduct.getId());
+            ehsdPurchaseProduct.setId(null);
+        }
         purchaseProjectList.forEach(item -> item.setId(null));
 
         //调用采购发起公共代码块
@@ -102,44 +114,98 @@ public class EhsdPurchaseUpdateFlow extends FlowDelegate {
         EhsdPurchase purchase = ehsdPurchaseService.getById(businessId);
         Assert.notEmpty(purchase, "采购单不存在,或已被删除");
 
+        //修改采购状态为审批通过
+        purchase.setStatus(PurchaseStatusEnum.PASS.getKey());
+        purchase.setApprovedDate(new Date());
+        ehsdPurchaseService.updateById(purchase);
+
         //原合同改为 已变更
         EhsdPurchase oldEhsdPurchase = ehsdPurchaseService.getById(purchase.getOldPurchaseId());
         oldEhsdPurchase.setStatus(FlowStatusEnum1.UPDATE.getKey());
         ehsdPurchaseService.updateById(oldEhsdPurchase);
 
-        //修改可用库存
-        //回滚旧合同数据
-        List<InOutBo> oldInOutBoList = new ArrayList<>();
+
+        //---------------------------------------------
+        //获取新采购明细数据
+        Map<Long, BigDecimal> newQuantityMap = ehsdPurchaseProductService.mapKV(
+                EhsdPurchaseProduct::getOldPurchaseProductId, EhsdPurchaseProduct::getQuantity,
+                q -> q.eq(EhsdPurchaseProduct::getPurchaseId, businessId)
+        );
+
         List<EhsdPurchaseProduct> oldPurchaseProductList = ehsdPurchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, purchase.getOldPurchaseId()));
-        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);
+
+        List<AvailableStockBo> availableStockBoList = new ArrayList<>();
+
+        //旧数据处理
+        Long stockWaitId = null;
+        for (EhsdPurchaseProduct oldPurchaseProduct : oldPurchaseProductList) {
+            //新数量
+            BigDecimal newQuantity = newQuantityMap.get(oldPurchaseProduct.getId());
+            //已入库数量
+            StockWaitDetails stockWaitDetails = stockWaitDetailsService.getOne(q -> q.eq(StockWaitDetails::getBusinessDetailsId, oldPurchaseProduct.getId()));
+            stockWaitId = stockWaitDetails.getStockWaitId();
+
+            //生成操作可用库存的实体
+            AvailableStockBo availableStockBo = new AvailableStockBo();
+            availableStockBo.setProductId(oldPurchaseProduct.getProductId());
+            availableStockBo.setQuantity(oldPurchaseProduct.getQuantity());
+            availableStockBo.setNewQuantity(newQuantity);
+            availableStockBo.setInStockQuantity(stockWaitDetails.getReceiptQuantity());
+
+            availableStockBoList.add(availableStockBo);
+
+
+            //操作待入库数据
+            if (ObjectUtils.isEmpty(newQuantity)) {
+                //原数据被删,检查已入库数量,>0禁止变更
+                stockWaitDetailsService.removeById(stockWaitDetails);
+            } else {
+                stockWaitDetails.setQuantity(newQuantity);
+                //计算状态
+                int status = stockWaitDetails.getReceiptQuantity().compareTo(stockWaitDetails.getQuantity()) >= 0 ? 2 : 1;
+                if (stockWaitDetails.getReceiptQuantity().compareTo(BigDecimal.ZERO) == 0) {
+                    status = 0;
+                }
+                stockWaitDetails.setStatus(status);
+                stockWaitDetailsService.updateById(stockWaitDetails);
+
+                stockWaitService.updateStatus(stockWaitDetails.getStockWaitId());
             }
         }
-        productInfoService.editAvailableQuantity(oldInOutBoList, purchase.getOldPurchaseId(), ProductAvailableRecordType.PURCHASE_UPDATE_OUT, purchase.getCompanyId());
-
-
-        //将可用库存改为新合同数据
-        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);
-            }
+
+        //新添加的数据处理
+        List<EhsdPurchaseProduct> newPurchaseProductInfo = ehsdPurchaseProductService.list(q -> q
+                .eq(EhsdPurchaseProduct::getPurchaseId, businessId)
+                .isNull(EhsdPurchaseProduct::getOldPurchaseProductId)
+        );
+        for (EhsdPurchaseProduct newPurchaseProduct : newPurchaseProductInfo) {
+            //生成操作可用库存的实体
+            AvailableStockBo availableStockBo = new AvailableStockBo();
+            availableStockBo.setProductId(newPurchaseProduct.getProductId());
+            availableStockBo.setQuantity(null);
+            availableStockBo.setNewQuantity(newPurchaseProduct.getQuantity());
+            availableStockBo.setInStockQuantity(null);
+            availableStockBoList.add(availableStockBo);
+
+            //生成待入库
+            Assert.notEmpty(stockWaitId, "查询不到待入库信息!");
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(stockWaitId);
+            stockWaitDetails.setBusinessDetailsId(newPurchaseProduct.getId());
+            stockWaitDetails.setPurchaseDetailId(newPurchaseProduct.getId());
+
+            stockWaitDetails.setProductId(newPurchaseProduct.getProductId());
+            stockWaitDetails.setQuantity(newPurchaseProduct.getQuantity());
+            stockWaitDetails.setStatus(0);
+            stockWaitDetailsService.save(stockWaitDetails);
+
+            stockWaitService.updateStatus(stockWaitDetails.getStockWaitId());
         }
-        productInfoService.editAvailableQuantity(inOutBoList, businessId, ProductAvailableRecordType.PURCHASE_UPDATE_IN, purchase.getCompanyId());
 
 
-        //调用采购发起流程的结束方法
-        ehsdPurchaseFlow.end(flowId, businessId, submitData);
+        //修改可用库存
+        productInfoService.editAvailableQuantity(availableStockBoList, businessId, ProductAvailableRecordType.PURCHASE_UPDATE, purchase.getCompanyId());
+
 
         Long oldPurchaseId = purchase.getOldPurchaseId();
 

+ 3 - 3
hx-sale/src/main/java/com/fjhx/sale/service/contract/impl/ContractServiceImpl.java

@@ -23,7 +23,7 @@ import com.fjhx.account.service.tax.TaxRefundDetailsService;
 import com.fjhx.area.service.SetCustomizeAreaId;
 import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.common.constant.SourceConstant;
-import com.fjhx.common.entity.InOutBo;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.entity.contract.po.ContractTemplate;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.entity.documentary.bo.DocumentaryData;
@@ -1312,7 +1312,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
         }
         Map<Long, BigDecimal> purchaseCountMap = purchaseCountByIds.stream().collect(Collectors.toMap(SubscribeDetail::getId, SubscribeDetail::getCount));
 
-        List<InOutBo> inOutBoList = new ArrayList<>();
+        List<AvailableStockBo> inOutBoList = new ArrayList<>();
 
         //获取产品BOM列表
         List<ContractProductBomVo> contractProductBomList = contractProductBomMapper.getContractProductBomQuantitySum(businessId);
@@ -1331,7 +1331,7 @@ public class ContractServiceImpl extends ServiceImpl<ContractMapper, Contract>
             BigDecimal subtract = subscribeDetailCount.subtract(purchaseCount);
             BigDecimal subtract1 = subtract.subtract(contractProductBom.getQuantity());
 
-            InOutBo inOutBo = new InOutBo();
+            AvailableStockBo inOutBo = new AvailableStockBo();
             inOutBo.setProductId(materialId);
             inOutBo.setQuantity(subtract1);
             inOutBoList.add(inOutBo);

+ 3 - 3
hx-sale/src/main/java/com/fjhx/sale/service/purchase/impl/EhsdPurchaseServiceImpl.java

@@ -13,7 +13,7 @@ import com.fjhx.account.entity.account.po.AccountManagement;
 import com.fjhx.account.service.account.AccountManagementService;
 import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.common.constant.SourceConstant;
-import com.fjhx.common.entity.InOutBo;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.entity.corporation.po.Corporation;
 import com.fjhx.common.entity.documentary.bo.DocumentaryData;
 import com.fjhx.common.enums.FlowStatusEnum1;
@@ -464,12 +464,12 @@ public class EhsdPurchaseServiceImpl extends ServiceImpl<EhsdPurchaseMapper, Ehs
         );
 
         //修改可用库存
-        List<InOutBo> inOutBoList = new ArrayList<>();
+        List<AvailableStockBo> inOutBoList = new ArrayList<>();
         List<EhsdPurchaseProduct> purchaseProductList = purchaseProductService.list(q -> q.eq(EhsdPurchaseProduct::getPurchaseId, id));
         for (EhsdPurchaseProduct purchaseProduct : purchaseProductList) {
             //如果数据来源是申购 操作可用库存(可用库存 = 当前可用库存 - 采购明细数量)
             if (Objects.equals(purchaseProduct.getDataResource(), PurchaseDataResourceEnum.DATA_RESOURCE_0)) {
-                InOutBo inOutBo = new InOutBo();
+                AvailableStockBo inOutBo = new AvailableStockBo();
                 inOutBo.setProductId(purchaseProduct.getProductId());
                 inOutBo.setQuantity(purchaseProduct.getQuantity());
                 inOutBoList.add(inOutBo);

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

@@ -59,4 +59,5 @@ public interface StockWaitService extends BaseService<StockWait> {
      */
     void delete(Long id);
 
+    void updateStatus(Long id);
 }

+ 3 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -7,6 +7,7 @@ import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.entity.AvailableStockBo;
 import com.fjhx.common.entity.InOutBo;
 import com.fjhx.common.enums.InOutType;
 import com.fjhx.common.utils.Assert;
@@ -197,8 +198,9 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
         stockJournalDetailsService.saveBatch(stockJournalDetailsList);
 
         //修改可用库存
+        List<AvailableStockBo> AvailableStockBoList = BeanUtil.copyToList(list, AvailableStockBo.class);
         ProductAvailableRecordType productAvailableRecordType = inOutType.equals(InOutType.IN) ? ProductAvailableRecordType.HAND_IN : ProductAvailableRecordType.HAND_OUT;
-        productInfoService.editAvailableQuantity(inOutBoList, null, productAvailableRecordType, SecurityUtils.getCompanyId());
+        productInfoService.editAvailableQuantity(AvailableStockBoList, null, productAvailableRecordType, SecurityUtils.getCompanyId());
     }
 
     /**

+ 26 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java

@@ -244,4 +244,30 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         this.removeById(id);
     }
 
+    @Override
+    public void updateStatus(Long id) {
+        StockWait stockWait = this.getById(id);
+        Assert.notEmpty(stockWait, "查询不到待出入库信息");
+
+        long count = stockWaitDetailsService.count(q -> q
+                .eq(StockWaitDetails::getStockWaitId, id)
+                .ne(StockWaitDetails::getStatus, 2)
+        );
+
+        //存在非完成数据 部分完成
+        if (count > 0) {
+            stockWait.setStatus(1);
+            long count1 = stockWaitDetailsService.count(q -> q
+                    .eq(StockWaitDetails::getStockWaitId, id)
+                    .eq(StockWaitDetails::getStatus, 1)
+            );
+            //不存在部分完成数据 未开始
+            if (count1 == 0) {
+                stockWait.setStatus(0);
+            }
+        }
+
+        this.updateById(stockWait);
+    }
+
 }