Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

wxf 2 лет назад
Родитель
Сommit
ad16338560
26 измененных файлов с 468 добавлено и 92 удалено
  1. 16 0
      hx-mes/src/main/java/com/fjhx/mes/controller/bom/BomInfoController.java
  2. 8 5
      hx-mes/src/main/java/com/fjhx/mes/controller/technology/TechnologyController.java
  3. 6 0
      hx-mes/src/main/java/com/fjhx/mes/entity/bom/dto/BomInfoDto.java
  4. 8 4
      hx-mes/src/main/java/com/fjhx/mes/entity/technology/dto/TechnologyDto.java
  5. 10 0
      hx-mes/src/main/java/com/fjhx/mes/service/bom/BomInfoService.java
  6. 16 0
      hx-mes/src/main/java/com/fjhx/mes/service/bom/impl/BomInfoServiceImpl.java
  7. 3 0
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionPlanServiceImpl.java
  8. 78 18
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskServiceImpl.java
  9. 5 6
      hx-mes/src/main/java/com/fjhx/mes/service/technology/TechnologyService.java
  10. 37 36
      hx-mes/src/main/java/com/fjhx/mes/service/technology/impl/TechnologyServiceImpl.java
  11. 70 8
      hx-mes/src/main/java/com/fjhx/mes/service/work/impl/WorkOrderServiceImpl.java
  12. 19 0
      hx-wms/src/main/java/com/fjhx/wms/controller/stock/StockFrozenController.java
  13. 17 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenDto.java
  14. 17 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenSelectDto.java
  15. 2 1
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/JournalType.java
  16. 2 2
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/StockWaitType.java
  17. 16 5
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/Stock.java
  18. 33 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockFrozen.java
  19. 17 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/vo/StockFrozenVo.java
  20. 17 0
      hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockFrozenMapper.java
  21. 17 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/StockFrozenService.java
  22. 21 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockFrozenServiceImpl.java
  23. 10 0
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java
  24. 16 6
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java
  25. 4 0
      hx-wms/src/main/resources/mapper/stock/StockFrozenMapper.xml
  26. 3 1
      hx-wms/src/main/resources/mapper/stock/StockMapper.xml

+ 16 - 0
hx-mes/src/main/java/com/fjhx/mes/controller/bom/BomInfoController.java

@@ -80,4 +80,20 @@ public class BomInfoController {
         bomInfoService.editVersion(bomInfo);
     }
 
+    /**
+     * bom新增 嘉兴双拓
+     */
+    @PostMapping("/addByJxst")
+    public void addByJxst(@Validated @RequestBody BomInfoDto bomInfoDto) {
+        bomInfoService.addByJxst(bomInfoDto);
+    }
+
+    /**
+     * bom编辑 嘉兴双拓
+     */
+    @PostMapping("/editByJxst")
+    public void editByJxst(@RequestBody BomInfoDto bomInfoDto) {
+        bomInfoService.editByJxst(bomInfoDto);
+    }
+
 }

+ 8 - 5
hx-mes/src/main/java/com/fjhx/mes/controller/technology/TechnologyController.java

@@ -1,13 +1,16 @@
 package com.fjhx.mes.controller.technology;
 
-import org.springframework.web.bind.annotation.*;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mes.entity.technology.vo.TechnologyVo;
-import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
 import com.fjhx.mes.entity.technology.dto.TechnologyDto;
-import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
+import com.fjhx.mes.entity.technology.vo.TechnologyVo;
 import com.fjhx.mes.service.technology.TechnologyService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 
 /**
@@ -15,7 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  * 工艺 前端控制器
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-28
  */
 @RestController

+ 6 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/bom/dto/BomInfoDto.java

@@ -1,5 +1,6 @@
 package com.fjhx.mes.entity.bom.dto;
 
+import com.fjhx.file.entity.ObsFile;
 import com.fjhx.mes.entity.bom.po.BomDetail;
 import com.fjhx.mes.entity.bom.po.BomInfo;
 import lombok.Getter;
@@ -33,4 +34,9 @@ public class BomInfoDto extends BomInfo {
     @NotNull(message = "新增类型不能为空")
     private Integer addType;
 
+    /**
+     * 程序文件列表
+     */
+    private List<ObsFile> fileList;
+
 }

+ 8 - 4
hx-mes/src/main/java/com/fjhx/mes/entity/technology/dto/TechnologyDto.java

@@ -1,6 +1,6 @@
 package com.fjhx.mes.entity.technology.dto;
 
-import com.fjhx.item.entity.product.po.ProductInfo;
+import com.fjhx.file.entity.ObsFile;
 import com.fjhx.mes.entity.applicable.po.ApplicableProducts;
 import com.fjhx.mes.entity.technology.po.Technology;
 import lombok.Getter;
@@ -11,17 +11,21 @@ import java.util.List;
 /**
  * 工艺新增编辑入参实体
  *
- * @author 
+ * @author
  * @since 2023-03-28
  */
 @Getter
 @Setter
 public class TechnologyDto extends Technology {
 
-    /**适用产品列表*/
+    /**
+     * 适用产品列表
+     */
     private List<ApplicableProducts> productList;
 
-    /**工序列表*/
+    /**
+     * 工序列表
+     */
     private List<String> processRouteList;
 
 }

+ 10 - 0
hx-mes/src/main/java/com/fjhx/mes/service/bom/BomInfoService.java

@@ -1,5 +1,6 @@
 package com.fjhx.mes.service.bom;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.mes.entity.bom.dto.BomInfoDto;
 import com.fjhx.mes.entity.bom.dto.BomInfoSelectDto;
@@ -50,4 +51,13 @@ public interface BomInfoService extends BaseService<BomInfo> {
      */
     void editVersion(BomInfo bomInfo);
 
+    /**
+     * BOM添加 嘉兴双拓
+     */
+    void addByJxst(BomInfoDto bomInfoDto);
+
+    /**
+     * BOM修改 嘉兴双拓
+     */
+    void editByJxst(BomInfoDto bomInfoDto);
 }

+ 16 - 0
hx-mes/src/main/java/com/fjhx/mes/service/bom/impl/BomInfoServiceImpl.java

@@ -3,8 +3,10 @@ package com.fjhx.mes.service.bom.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
+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.file.utils.ObsFileUtil;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.bom.dto.BomInfoDto;
@@ -217,4 +219,18 @@ public class BomInfoServiceImpl extends ServiceImpl<BomInfoMapper, BomInfo> impl
 
     }
 
+    @DSTransactional
+    @Override
+    public void addByJxst(BomInfoDto bomInfoDto) {
+        add(bomInfoDto);
+        ObsFileUtil.saveFile(bomInfoDto.getFileList(), bomInfoDto.getId());
+    }
+
+    @DSTransactional
+    @Override
+    public void editByJxst(BomInfoDto bomInfoDto) {
+        edit(bomInfoDto);
+        ObsFileUtil.editFile(bomInfoDto.getFileList(), bomInfoDto.getId());
+    }
+
 }

+ 3 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionPlanServiceImpl.java

@@ -84,6 +84,9 @@ public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper,
             }
         }
         //赋值待排程数量
+        for (ProductionPlanVo productionPlanVo : records) {
+            productionPlanVo.setRemainingQuantity(productionPlanVo.getQuantity());
+        }
         List<Long> productionPlanIds = records.stream().map(ProductionPlan::getId).collect(Collectors.toList());
         if (ObjectUtil.isNotEmpty(productionPlanIds)) {
             List<ProductionTask> productionTaskList = productionTaskService.list(q -> q.in(ProductionTask::getProductionPlanId, productionPlanIds));

+ 78 - 18
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskServiceImpl.java

@@ -1,26 +1,40 @@
 package com.fjhx.mes.service.production.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.mes.entity.bom.po.BomDetail;
+import com.fjhx.mes.entity.bom.po.BomInfo;
 import com.fjhx.mes.entity.production.dto.ProductionTaskDto;
 import com.fjhx.mes.entity.production.dto.ProductionTaskSelectDto;
 import com.fjhx.mes.entity.production.po.ProductionPlan;
 import com.fjhx.mes.entity.production.po.ProductionTask;
 import com.fjhx.mes.entity.production.vo.ProductionTaskVo;
+import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.mapper.production.ProductionTaskMapper;
+import com.fjhx.mes.service.bom.BomDetailService;
+import com.fjhx.mes.service.bom.BomInfoService;
 import com.fjhx.mes.service.production.ProductionPlanService;
 import com.fjhx.mes.service.production.ProductionTaskService;
+import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.mes.utils.code.CodeEnum;
+import com.fjhx.wms.entity.stock.emums.StockWaitType;
+import com.fjhx.wms.entity.stock.po.StockWait;
+import com.fjhx.wms.entity.stock.po.StockWaitDetails;
+import com.fjhx.wms.service.stock.StockWaitDetailsService;
+import com.fjhx.wms.service.stock.StockWaitService;
+import com.obs.services.internal.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.utils.UserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -32,30 +46,40 @@ import java.util.stream.Collectors;
  * 生产任务 服务实现类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-30
  */
 @Service
 public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper, ProductionTask> implements ProductionTaskService {
     @Autowired
-    ProductInfoService productInfoService;
+    private ProductInfoService productInfoService;
     @Autowired
-    ProductionPlanService productionPlanService;
+    private ProductionPlanService productionPlanService;
+    @Autowired
+    private WorkOrderService workOrderService;
+    @Autowired
+    private BomInfoService bomInfoService;
+    @Autowired
+    private BomDetailService bomDetailService;
+    @Autowired
+    private StockWaitService stockWaitService;
+    @Autowired
+    private StockWaitDetailsService stockWaitDetailsService;
 
     @Override
     public Page<ProductionTaskVo> getPage(ProductionTaskSelectDto dto) {
         IWrapper<ProductionTask> wrapper = getWrapper();
         wrapper.orderByDesc("pt", ProductionTask::getId);
-        if(ObjectUtil.isNotEmpty(dto.getKeyword())) {
-            wrapper.and(q->q.like("pt",ProductionTaskVo::getCode, dto.getKeyword())
-                    .or().like("pt",ProductionTaskVo::getQuantity, dto.getKeyword())
-                    .or().like("pt",ProductionTaskVo::getDueDate, dto.getKeyword()));
+        if (ObjectUtil.isNotEmpty(dto.getKeyword())) {
+            wrapper.and(q -> q.like("pt", ProductionTaskVo::getCode, dto.getKeyword())
+                    .or().like("pt", ProductionTaskVo::getQuantity, dto.getKeyword())
+                    .or().like("pt", ProductionTaskVo::getDueDate, dto.getKeyword()));
         }
         Page<ProductionTaskVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
         List<ProductionTaskVo> records = page.getRecords();
         //赋值产品名称
         List<Long> productIds = records.stream().map(ProductionTaskVo::getProductId).collect(Collectors.toList());
-        if(ObjectUtil.isNotEmpty(productIds)) {
+        if (ObjectUtil.isNotEmpty(productIds)) {
             List<ProductInfo> productInfos = productInfoService.listByIds(productIds);
             Map<Long, ProductInfo> productInfoMap = productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getId,
                     Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
@@ -71,7 +95,7 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
         }
 
         //赋值负责人名字
-        UserUtil.assignmentNickName(records,ProductionTask::getPersonLiableId,ProductionTaskVo::setPersonLiableName);
+        UserUtil.assignmentNickName(records, ProductionTask::getPersonLiableId, ProductionTaskVo::setPersonLiableName);
         return page;
     }
 
@@ -79,26 +103,62 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
     public ProductionTaskVo detail(Long id) {
         ProductionTaskVo productionTaskVo = baseMapper.detail(id);
         ProductInfo productInfo = productInfoService.getById(productionTaskVo.getProductId());
-        if(ObjectUtil.isNotEmpty(productInfo)) {
+        if (ObjectUtil.isNotEmpty(productInfo)) {
             productionTaskVo.setProductName(productInfo.getName());
         }
         Map<Long, String> nickNameMapByIds = UserUtil.getNickNameMapByIds(Arrays.asList(productionTaskVo.getPersonLiableId()));
-        if(ObjectUtil.isNotEmpty(nickNameMapByIds)) {
+        if (ObjectUtil.isNotEmpty(nickNameMapByIds)) {
             productionTaskVo.setPersonLiableName(nickNameMapByIds.get(productionTaskVo.getPersonLiableId()));
         }
         return productionTaskVo;
     }
 
-    @Transactional(rollbackFor = Exception.class)
+    @DSTransactional
     @Override
     public void add(ProductionTaskDto productionTaskDto) {
         productionTaskDto.setCode(CodeEnum.PRODUCTION_TASK.getCode());
         this.save(productionTaskDto);
         Long productionPlanId = productionTaskDto.getProductionPlanId();
         //更新生产计划状态为进行中
-        ProductionPlan byId = productionPlanService.getById(productionPlanId);
-        byId.setStatus(1);
-        productionPlanService.updateById(byId);
+        ProductionPlan productionPlan = productionPlanService.getById(productionPlanId);
+        productionPlan.setStatus(1);
+        productionPlanService.updateById(productionPlan);
+        //添加待出库数据
+        //查询工单中的产品信息
+        WorkOrder workOrder = workOrderService.getById(productionPlan.getWorkOrderId());
+        if (ObjectUtil.isEmpty(workOrder)) {
+            throw new ServiceException("查询不到该任务的工单信息");
+        }
+        //查询BOM信息
+        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrder.getProductId()));
+        if (ObjectUtil.isEmpty(bomInfo)) {
+            throw new ServiceException("查询不到产品的BOM信息");
+        }
+        List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
+        if (ObjectUtil.isEmpty(bomDetailList)) {
+            throw new ServiceException("查询不到BOM明细");
+        }
+        //创建待出库信息
+        StockWait stockWait = new StockWait();
+        stockWait.setBusinessId(productionTaskDto.getId());
+        stockWait.setType(2);//出库
+        stockWait.setStatus(0);//待出库
+        stockWait.setBusinessType(StockWaitType.PRODUCTION_TASK_OUT.getDetailType());//生产任务出库
+        stockWaitService.save(stockWait);
+        //创建待出库明细
+        List<StockWaitDetails> stockWaitDetailsList = new ArrayList<>();
+        for (BomDetail bomDetail : bomDetailList) {
+            //计算数量
+            BigDecimal multiply = bomDetail.getQuantity().multiply(productionTaskDto.getQuantity());
+            //创建待出库明细
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(stockWait.getId());
+            stockWaitDetails.setProductId(bomDetail.getProductId());
+            stockWaitDetails.setQuantity(multiply);
+            stockWaitDetails.setReceiptQuantity(BigDecimal.ZERO);
+            stockWaitDetailsList.add(stockWaitDetails);
+        }
+        stockWaitDetailsService.saveBatch(stockWaitDetailsList);
     }
 
     @Override
@@ -112,9 +172,9 @@ public class ProductionTaskServiceImpl extends ServiceImpl<ProductionTaskMapper,
     }
 
     @Override
-    public List<ProductionTaskVo> myListByIds(List<Long> ids){
+    public List<ProductionTaskVo> myListByIds(List<Long> ids) {
         QueryWrapper queryWrapper = new QueryWrapper();
-        queryWrapper.in("pt.id",ids);
+        queryWrapper.in("pt.id", ids);
         return baseMapper.myListByIds(queryWrapper);
     }
 

+ 5 - 6
hx-mes/src/main/java/com/fjhx/mes/service/technology/TechnologyService.java

@@ -1,11 +1,11 @@
 package com.fjhx.mes.service.technology;
 
-import com.fjhx.mes.entity.technology.po.Technology;
-import com.ruoyi.common.core.service.BaseService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mes.entity.technology.vo.TechnologyVo;
-import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
 import com.fjhx.mes.entity.technology.dto.TechnologyDto;
+import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
+import com.fjhx.mes.entity.technology.po.Technology;
+import com.fjhx.mes.entity.technology.vo.TechnologyVo;
+import com.ruoyi.common.core.service.BaseService;
 
 
 /**
@@ -13,7 +13,7 @@ import com.fjhx.mes.entity.technology.dto.TechnologyDto;
  * 工艺 服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-28
  */
 public interface TechnologyService extends BaseService<Technology> {
@@ -42,5 +42,4 @@ public interface TechnologyService extends BaseService<Technology> {
      * 工艺删除
      */
     void delete(Long id);
-
 }

+ 37 - 36
hx-mes/src/main/java/com/fjhx/mes/service/technology/impl/TechnologyServiceImpl.java

@@ -1,26 +1,26 @@
 package com.fjhx.mes.service.technology.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.dynamic.datasource.annotation.DS;
+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.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.applicable.po.ApplicableProducts;
 import com.fjhx.mes.entity.production.po.ProductionProcesses;
+import com.fjhx.mes.entity.technology.dto.TechnologyDto;
+import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
 import com.fjhx.mes.entity.technology.po.Technology;
+import com.fjhx.mes.entity.technology.vo.TechnologyVo;
 import com.fjhx.mes.mapper.technology.TechnologyMapper;
 import com.fjhx.mes.service.applicable.ApplicableProductsService;
 import com.fjhx.mes.service.production.ProductionProcessesService;
 import com.fjhx.mes.service.technology.TechnologyService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mes.entity.technology.vo.TechnologyVo;
-import com.fjhx.mes.entity.technology.dto.TechnologySelectDto;
-import com.ruoyi.common.utils.wrapper.IWrapper;
-import com.fjhx.mes.entity.technology.dto.TechnologyDto;
-import cn.hutool.core.bean.BeanUtil;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
@@ -28,7 +28,6 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 
 /**
@@ -60,52 +59,54 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         List<TechnologyVo> records = page.getRecords();
         //获取所有适用商品列表
         List<Long> technologyIds = records.stream().map(TechnologyVo::getId).collect(Collectors.toList());
-        if(ObjectUtil.isNotEmpty(technologyIds)) {
+        if (ObjectUtil.isNotEmpty(technologyIds)) {
             List<ApplicableProducts> applicableProductsList = applicableProductsService.list(q -> q.in(ApplicableProducts::getTechnologyId, technologyIds));
             List<Long> productsIds = applicableProductsList.stream().map(ApplicableProducts::getProductId).collect(Collectors.toList());
-            List<ProductInfo> productInfos = productInfoService.listByIds(productsIds);
-            Map<Long, ProductInfo> productInfoMap = productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getId, Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0))));
-            Map<Long, List<ApplicableProducts>> applicableProductsMap = applicableProductsList.stream().collect(Collectors.groupingBy(ApplicableProducts::getTechnologyId));
-            for (TechnologyVo technologyVo : records) {
-                //处理适用产品列表
-                List<String> productNameList = new ArrayList<>();
-                List<ApplicableProducts> applicableProductsList1 = applicableProductsMap.get(technologyVo.getId());
-                for (ApplicableProducts applicableProducts : applicableProductsList1) {
-                    ProductInfo productInfo = productInfoMap.get(applicableProducts.getProductId());
-                    if(ObjectUtil.isNotEmpty(productInfo)) {
-                        productNameList.add(productInfo.getName());
-                    }else{
-                        productNameList.add("未知商品:"+applicableProducts.getProductId());
+            if (ObjectUtil.isNotEmpty(productsIds)) {
+                List<ProductInfo> productInfos = productInfoService.listByIds(productsIds);
+                Map<Long, ProductInfo> productInfoMap = productInfos.stream().collect(Collectors.groupingBy(ProductInfo::getId, Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0))));
+                Map<Long, List<ApplicableProducts>> applicableProductsMap = applicableProductsList.stream().collect(Collectors.groupingBy(ApplicableProducts::getTechnologyId));
+                for (TechnologyVo technologyVo : records) {
+                    //处理适用产品列表
+                    List<String> productNameList = new ArrayList<>();
+                    List<ApplicableProducts> applicableProductsList1 = applicableProductsMap.get(technologyVo.getId());
+                    for (ApplicableProducts applicableProducts : applicableProductsList1) {
+                        ProductInfo productInfo = productInfoMap.get(applicableProducts.getProductId());
+                        if (ObjectUtil.isNotEmpty(productInfo)) {
+                            productNameList.add(productInfo.getName());
+                        } else {
+                            productNameList.add("未知商品:" + applicableProducts.getProductId());
+                        }
                     }
+                    technologyVo.setApplicableProductsNameList(productNameList);
                 }
-                technologyVo.setApplicableProductsNameList(productNameList);
             }
         }
 
         //获取所有的工艺线路
         List<String> processRouteIdList = new ArrayList<>();
         List<String> processRoutes = records.stream().map(TechnologyVo::getProcessRoute).collect(Collectors.toList());
-        for (String processRoute : processRoutes){
-            if(ObjectUtil.isNotEmpty(processRoute)) {
+        for (String processRoute : processRoutes) {
+            if (ObjectUtil.isNotEmpty(processRoute)) {
                 List<String> processRouteIds = Arrays.asList(processRoute.split(","));
                 processRouteIdList.addAll(processRouteIds);
             }
         }
-        if(ObjectUtil.isNotEmpty(processRouteIdList)) {
+        if (ObjectUtil.isNotEmpty(processRouteIdList)) {
             //查出所有工序信息
             List<ProductionProcesses> productionProcessesList = productionProcessesService.listByIds(processRouteIdList);
             //根据工序id分组
             Map<Long, ProductionProcesses> productionProcessesMap = productionProcessesList.stream().distinct().collect(Collectors.groupingBy(ProductionProcesses::getId, Collectors.collectingAndThen(Collectors.toList(), item -> item.get(0))));
             for (TechnologyVo technologyVo : records) {
-                if(ObjectUtil.isNotEmpty(technologyVo.getProcessRoute())) {
+                if (ObjectUtil.isNotEmpty(technologyVo.getProcessRoute())) {
                     List<String> arr = new ArrayList<>();
                     List<String> processRouteIds = Arrays.asList(technologyVo.getProcessRoute().split(","));
                     for (String processRouteId : processRouteIds) {
                         ProductionProcesses productionProcesses = productionProcessesMap.get(Long.parseLong(processRouteId));
-                        if(ObjectUtil.isNotEmpty(productionProcesses)) {
+                        if (ObjectUtil.isNotEmpty(productionProcesses)) {
                             arr.add(productionProcesses.getName());
-                        }else{
-                            arr.add("未知工序:"+processRouteId);
+                        } else {
+                            arr.add("未知工序:" + processRouteId);
                         }
                     }
                     technologyVo.setProcessRouteNameList(arr);
@@ -129,10 +130,10 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         List<ProductionProcesses> productionProcessesList = productionProcessesService.listByIds(processRouteIds);
         Map<Long, ProductionProcesses> productionProcessesMap = productionProcessesList.stream()
                 .collect(Collectors.groupingBy(ProductionProcesses::getId,
-                Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
+                        Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
         //对工艺线路排序必须按照前端提交的顺序排序
         List<ProductionProcesses> newProductionProcessesList = new ArrayList<>();
-        for (String processRouteId : processRouteIds){
+        for (String processRouteId : processRouteIds) {
             newProductionProcessesList.add(productionProcessesMap.get(Long.parseLong(processRouteId)));
         }
         result.setProcessRouteList(newProductionProcessesList);
@@ -146,7 +147,7 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         technologyDto.setProcessRoute(join);
         this.save(technologyDto);
         List<ApplicableProducts> productList = technologyDto.getProductList();
-        for (ApplicableProducts applicableProducts : productList){
+        for (ApplicableProducts applicableProducts : productList) {
             applicableProducts.setTechnologyId(technologyDto.getId());
         }
         applicableProductsService.saveBatch(productList);
@@ -159,8 +160,8 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
         technologyDto.setProcessRoute(join);
         this.updateById(technologyDto);
         List<ApplicableProducts> productList = technologyDto.getProductList();
-        applicableProductsService.remove(q->q.eq(ApplicableProducts::getTechnologyId,technologyDto.getId()));
-        for (ApplicableProducts applicableProducts : productList){
+        applicableProductsService.remove(q -> q.eq(ApplicableProducts::getTechnologyId, technologyDto.getId()));
+        for (ApplicableProducts applicableProducts : productList) {
             applicableProducts.setTechnologyId(technologyDto.getId());
         }
         applicableProductsService.saveBatch(productList);
@@ -170,7 +171,7 @@ public class TechnologyServiceImpl extends ServiceImpl<TechnologyMapper, Technol
     @Override
     public void delete(Long id) {
         this.removeById(id);
-        applicableProductsService.remove(q->q.eq(ApplicableProducts::getTechnologyId,id));
+        applicableProductsService.remove(q -> q.eq(ApplicableProducts::getTechnologyId, id));
     }
 
 }

+ 70 - 8
hx-mes/src/main/java/com/fjhx/mes/service/work/impl/WorkOrderServiceImpl.java

@@ -8,17 +8,25 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.mes.entity.bom.po.BomDetail;
+import com.fjhx.mes.entity.bom.po.BomInfo;
 import com.fjhx.mes.entity.production.po.ProductionPlan;
 import com.fjhx.mes.entity.work.dto.WorkOrderDto;
 import com.fjhx.mes.entity.work.dto.WorkOrderSelectDto;
 import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.entity.work.vo.WorkOrderVo;
 import com.fjhx.mes.mapper.work.WorkOrderMapper;
+import com.fjhx.mes.service.bom.BomDetailService;
+import com.fjhx.mes.service.bom.BomInfoService;
 import com.fjhx.mes.service.production.ProductionPlanService;
 import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.mes.utils.code.CodeEnum;
 import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.service.contract.ContractProductService;
+import com.fjhx.wms.entity.stock.po.Stock;
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.fjhx.wms.service.stock.StockFrozenService;
+import com.fjhx.wms.service.stock.StockService;
 import com.obs.services.internal.ServiceException;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,12 +51,20 @@ import java.util.stream.Collectors;
 public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder> implements WorkOrderService {
 
     @Autowired
-    ProductInfoService productInfoService;
+    private ProductInfoService productInfoService;
     @Autowired
-    ProductionPlanService productionPlanService;
+    private ProductionPlanService productionPlanService;
 
     @Autowired
     private ContractProductService contractProductService;
+    @Autowired
+    private BomInfoService bomInfoService;
+    @Autowired
+    private BomDetailService bomDetailService;
+    @Autowired
+    private StockService stockService;
+    @Autowired
+    private StockFrozenService stockFrozenService;
 
     @Override
     public Page<WorkOrderVo> getPage(WorkOrderSelectDto dto) {
@@ -68,6 +84,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             });
         }
         //赋值待排程数量
+        for (WorkOrderVo workOrder : records) {
+            workOrder.setRemainingQuantity(workOrder.getQuantity());
+        }
         List<Long> workOrderIds = records.stream().map(WorkOrder::getId).collect(Collectors.toList());
         if (ObjectUtil.isNotEmpty(workOrderIds)) {
             List<ProductionPlan> productionPlanList = productionPlanService.list(q -> q.in(ProductionPlan::getWorkOrderId, workOrderIds));
@@ -101,36 +120,79 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
         return result;
     }
 
+    @DSTransactional
     @Override
     public void add(WorkOrderDto workOrderDto) {
         //生成工单编号,以及设置默认状态
         workOrderDto.setCode(CodeEnum.WORK_ORDER.getCode());
         workOrderDto.setStatus(0);
         this.save(workOrderDto);
+        //搜索BOM明细并到冻结库存
+        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrderDto.getProductId()));
+        if (ObjectUtil.isEmpty(bomInfo)) {
+            throw new ServiceException("查询不到产品的BOM信息");
+        }
+        List<BomDetail> bomDetailList = bomDetailService.list(q -> q.eq(BomDetail::getBomInfoId, bomInfo.getId()));
+        if (ObjectUtil.isEmpty(bomDetailList)) {
+            throw new ServiceException("查询不到BOM明细");
+        }
+        List<Long> productIds = bomDetailList.stream().map(BomDetail::getProductId).collect(Collectors.toList());
+        Map<Long, List<Stock>> productMap = stockService.mapKGroup(Stock::getProductId, q -> q.in(Stock::getProductId, productIds));
+        List<StockFrozen> stockFrozenList = new ArrayList<>();
+        for (BomDetail bomDetail : bomDetailList) {
+            Long productId = bomDetail.getProductId();
+            //计算总数量 需要的物料数量*工单数量
+            BigDecimal multiply = bomDetail.getQuantity().multiply(workOrderDto.getQuantity());
+            //添加冻结库存
+            List<Stock> stocks = productMap.get(productId);
+            if (ObjectUtil.isEmpty(stocks)) {
+                throw new ServiceException("物料库存不存在");
+            }
+            //计算库存是否充足(可用库存 - 冻结库存 - 所需的数量)是否大等于0
+            BigDecimal quantity = stocks.stream().map(Stock::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+            Map<Long, StockFrozen> stockFrozenMap = stockFrozenService.mapKEntity(StockFrozen::getProductId, q -> q.in(StockFrozen::getProductId, productIds));
+            StockFrozen stockFrozen = stockFrozenMap.get(bomDetail.getProductId());
+            if(ObjectUtil.isEmpty(stockFrozen)){
+                stockFrozen = new StockFrozen();
+                stockFrozen.setProductId(bomDetail.getProductId());
+                stockFrozen.setFrozenQuantity(BigDecimal.ZERO);
+            }
+            BigDecimal subtract = quantity.subtract(stockFrozen.getFrozenQuantity()).subtract(multiply);
+            if (subtract.compareTo(BigDecimal.ZERO) < 0) {
+                throw new ServiceException("物料库存不足");
+            }
+            //存在库存
+            BigDecimal add = stockFrozen.getFrozenQuantity().add(multiply);
+            stockFrozen.setFrozenQuantity(add);
+
+            stockFrozenList.add(stockFrozen);
+        }
+        stockFrozenService.saveOrUpdateBatch(stockFrozenList);
     }
 
     /**
      * 批量新增
+     *
      * @param workOrder
      */
     @Override
     @DSTransactional
     public void addBatch(List<WorkOrder> workOrder) {
-        if(CollectionUtils.isEmpty(workOrder)){
+        if (CollectionUtils.isEmpty(workOrder)) {
             throw new ServiceException("提交不能为空");
         }
         List<ContractProduct> upContractProduct = new ArrayList<>();
-        for(WorkOrder w:workOrder){
+        for (WorkOrder w : workOrder) {
             //生成工单编号,以及设置默认状态
             w.setCode(CodeEnum.WORK_ORDER.getCode());
             w.setStatus(0);
-            if(ObjectUtil.isNotEmpty(w.getSourceId())&&w.getSource()==1){//外销合同生产数据
+            if (ObjectUtil.isNotEmpty(w.getSourceId()) && w.getSource() == 1) {//外销合同生产数据
                 ContractProduct contractProduct = contractProductService.getById(w.getSourceId());
-                if(ObjectUtil.isNotEmpty(contractProduct)){
+                if (ObjectUtil.isNotEmpty(contractProduct)) {
                     throw new ServiceException("该合同产品不存在,请检查");
                 }
                 BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(w.getQuantity());
-                if(expendQuantity.compareTo(BigDecimal.ZERO)< 1){//小于0不让继续执行
+                if (expendQuantity.compareTo(BigDecimal.ZERO) < 1) {//小于0不让继续执行
                     throw new ServiceException("生产数量不得大于销售合同数量");
                 }
                 contractProduct.setExpendQuantity(expendQuantity);
@@ -138,7 +200,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             }
         }
         this.saveBatch(workOrder);
-        if(CollectionUtils.isNotEmpty(upContractProduct)){//扣减销售合同数量
+        if (CollectionUtils.isNotEmpty(upContractProduct)) {//扣减销售合同数量
             contractProductService.updateBatchById(upContractProduct);
         }
     }

+ 19 - 0
hx-wms/src/main/java/com/fjhx/wms/controller/stock/StockFrozenController.java

@@ -0,0 +1,19 @@
+package com.fjhx.wms.controller.stock;
+
+import org.springframework.web.bind.annotation.*;
+
+
+/**
+ * <p>
+ * 冻结库存 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@RestController
+@RequestMapping("/stockFrozen")
+public class StockFrozenController {
+
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.entity.stock.dto;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 冻结库存新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class StockFrozenDto extends StockFrozen {
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockFrozenSelectDto.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.entity.stock.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 冻结库存列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class StockFrozenSelectDto extends BaseSelectDto {
+
+}

+ 2 - 1
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/JournalType.java

@@ -26,7 +26,8 @@ public enum JournalType {
     BORDER_OF_LINE_IN(InOutType.IN, 16, "待入库 线边回仓", ""),
     COMPLETION_IN(InOutType.IN, 17, "待入库 完工入库", ""),
     PURCHASE_ARRIVAL_IN(InOutType.IN, 18, "待入库 采购到货", ""),
-    ARRIVAL_QUALITY(InOutType.IN, 19, "到货质检", "quality_info")
+    ARRIVAL_QUALITY(InOutType.IN, 19, "到货质检", "quality_info"),
+    PRODUCTION_TASK_OUT(InOutType.OUT, 20, "生产任务待出库出库", "production_task")
     ;
 
 

+ 2 - 2
hx-wms/src/main/java/com/fjhx/wms/entity/stock/emums/StockWaitType.java

@@ -12,8 +12,8 @@ public enum StockWaitType {
     PURCHASE_ARRIVAL_IN(InOutType.IN, 3, "采购到货", ""),
     BACK_OUT(InOutType.OUT, 4, "退货出库", ""),
     JD_ORDER_OUT(InOutType.OUT, 5, "京东订单出库", "jd_order"),
-    SALE_ORDER_OUT(InOutType.OUT, 6, "销售订单出库", "order_info")
-    ;
+    SALE_ORDER_OUT(InOutType.OUT, 6, "销售订单出库", "order_info"),
+    PRODUCTION_TASK_OUT(InOutType.OUT, 7, "生产任务待出库", "production_task");
 
 
     /**

+ 16 - 5
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/Stock.java

@@ -2,18 +2,17 @@ package com.fjhx.wms.entity.stock.po;
 
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.ruoyi.common.core.domain.BasePo;
-
-import java.math.BigDecimal;
-import java.util.Date;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * <p>
  * 库存
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-20
  */
 @Getter
@@ -36,7 +35,19 @@ public class Stock extends BasePo {
      */
     private BigDecimal quantity;
 
-    /**维多利亚扩展*/
+    /**
+     * 维多利亚扩展
+     */
     private String victoriatouristJson;
 
+    /**
+     * 冻结库存
+     */
+    private BigDecimal frozenQuantity;
+
+    /**
+     * 结存单价
+     */
+    private BigDecimal unitPrice;
+
 }

+ 33 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/po/StockFrozen.java

@@ -0,0 +1,33 @@
+package com.fjhx.wms.entity.stock.po;
+
+import com.ruoyi.common.core.domain.BasePo;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.math.BigDecimal;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 冻结库存
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+@TableName("stock_frozen")
+public class StockFrozen extends BasePo {
+
+    /**
+     * 产品id
+     */
+    private Long productId;
+
+    /**
+     * 冻结库存
+     */
+    private BigDecimal frozenQuantity;
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/vo/StockFrozenVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.entity.stock.vo;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 冻结库存列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Getter
+@Setter
+public class StockFrozenVo extends StockFrozen {
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockFrozenMapper.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.mapper.stock;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * <p>
+ * 冻结库存 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface StockFrozenMapper extends BaseMapper<StockFrozen> {
+
+}

+ 17 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/StockFrozenService.java

@@ -0,0 +1,17 @@
+package com.fjhx.wms.service.stock;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 冻结库存 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+public interface StockFrozenService extends BaseService<StockFrozen> {
+
+}

+ 21 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockFrozenServiceImpl.java

@@ -0,0 +1,21 @@
+package com.fjhx.wms.service.stock.impl;
+
+import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.fjhx.wms.mapper.stock.StockFrozenMapper;
+import com.fjhx.wms.service.stock.StockFrozenService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 冻结库存 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-16
+ */
+@Service
+public class StockFrozenServiceImpl extends ServiceImpl<StockFrozenMapper, StockFrozen> implements StockFrozenService {
+
+}

+ 10 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockServiceImpl.java

@@ -358,6 +358,10 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 //判断传操作的库存是否为空 空赋值0
                 stock.setQuantity(BigDecimal.ZERO);
             }
+            if (ObjectUtil.isEmpty(stock.getFrozenQuantity())) {
+                //判断传操作的冻结库存是否为空 空赋值0
+                stock.setFrozenQuantity(BigDecimal.ZERO);
+            }
             newStocks.setQuantity(stock.getQuantity());
 
             //合并库存数量
@@ -365,6 +369,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
             //用来存储操作数据
             if (ObjectUtil.isNotEmpty(oldStocks)) {
                 BigDecimal quantity = oldStocks.getQuantity();
+                BigDecimal oldFrozenQuantity = oldStocks.getFrozenQuantity();
                 if (type == 1) {
                     //入库库存相加
                     quantity = quantity.add(stock.getQuantity());
@@ -374,6 +379,10 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                     if (quantity.compareTo(BigDecimal.ZERO) < 0) {
                         throw new ServiceException("库存不足无法出库");
                     }
+                    oldFrozenQuantity = oldFrozenQuantity.subtract(stock.getFrozenQuantity());
+                    if (oldFrozenQuantity.compareTo(BigDecimal.ZERO) < 0) {
+                        throw new ServiceException("冻结库存不足无法出库");
+                    }
                 } else if (type == 3) {
                     //维多利亚入库增加冻结库存
                     String victoriatouristJson = oldStocks.getVictoriatouristJson();
@@ -388,6 +397,7 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
                 }
                 newStocks.setId(oldStocks.getId());
                 newStocks.setQuantity(quantity);
+                newStocks.setFrozenQuantity(oldFrozenQuantity);
             } else if (type == 2) {
                 ProductInfo productInfo = productInfoService.getById(stock.getProductId());
                 if (productInfo == null) {

+ 16 - 6
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java

@@ -39,17 +39,19 @@ import java.util.List;
 @Service
 public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMapper, StockWaitDetails> implements StockWaitDetailsService {
     @Autowired
-    ProductInfoService productInfoService;
+    private ProductInfoService productInfoService;
     @Autowired
-    StockWaitService stockWaitService;
+    private StockWaitService stockWaitService;
     @Autowired
-    StockJournalService stockJournalService;
+    private StockJournalService stockJournalService;
     @Autowired
-    StockJournalDetailsService stockJournalDetailsService;
+    private StockJournalDetailsService stockJournalDetailsService;
     @Autowired
-    StockService stockService;
+    private StockService stockService;
     @Autowired
-    WmsService wmsService;
+    private WmsService wmsService;
+    @Autowired
+    private StockFrozenService stockFrozenService;
 
     @Override
     public Page<StockWaitDetailsVo> getPage(StockWaitDetailsSelectDto dto) {
@@ -148,6 +150,14 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
             //销售订单出库
             stockJournal.setType(JournalType.SALES_OUT.getDetailType());
             wmsService.outbound(stockWaitDetailsDto);
+        }else if (StockWaitType.PRODUCTION_TASK_OUT.getDetailType().equals(businessType)) {
+            //生产任务待出库
+            stockJournal.setType(JournalType.PRODUCTION_TASK_OUT.getDetailType());
+            //减少冻结库存
+            StockFrozen stockFrozen = stockFrozenService.getOne(q -> q.eq(StockFrozen::getProductId, stockWaitDetails.getProductId()));
+            BigDecimal subtract = stockFrozen.getFrozenQuantity().subtract(stockWaitDetailsDto.getQuantity());
+            stockFrozen.setFrozenQuantity(subtract);
+            stockFrozenService.updateById(stockFrozen);
         } else {
             throw new ServiceException("未知待出入库业务类型");
         }

+ 4 - 0
hx-wms/src/main/resources/mapper/stock/StockFrozenMapper.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.wms.mapper.stock.StockFrozenMapper">
+</mapper>

+ 3 - 1
hx-wms/src/main/resources/mapper/stock/StockMapper.xml

@@ -12,7 +12,9 @@
             s.create_time,
             s.update_user,
             s.update_time,
-            s.victoriatourist_json
+            s.victoriatourist_json,
+            s.unit_price,
+            s.frozen_quantity
         FROM
             stock s
                 LEFT JOIN bytesailing_item.product_info pi ON s.product_id = pi.id