Przeglądaj źródła

工单添加手动下发功能

yzc 1 rok temu
rodzic
commit
5af00b0c43

+ 18 - 0
hx-jxst/src/main/java/com/fjhx/jxst/flow/SalesContractFlow.java

@@ -13,11 +13,19 @@ import com.fjhx.mes.entity.work.dto.WorkOrderDto;
 import com.fjhx.mes.service.work.WorkOrderService;
 import com.fjhx.socket.core.PushTypeEnum;
 import com.fjhx.socket.core.WebSocketPush;
+import com.fjhx.wms.entity.stock.po.Stock;
+import com.fjhx.wms.entity.stock.po.StockWaitDetails;
+import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
+import com.fjhx.wms.service.stock.StockService;
+import com.fjhx.wms.service.stock.StockWaitDetailsService;
+import com.fjhx.wms.service.stock.StockWaitService;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.system.service.ISysUserService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -33,6 +41,8 @@ public class SalesContractFlow extends FlowDelegate {
     private WorkOrderService workOrderService;
     @Autowired
     private ISysUserService userService;
+    @Autowired
+    private StockService stockService;
     @Override
     public String getFlowKey() {
         return "jxst_sales_contract_flow";
@@ -58,6 +68,14 @@ public class SalesContractFlow extends FlowDelegate {
             workOrder.setProductId(salesContractDetails.getProductId());
             workOrder.setQuantity(salesContractDetails.getQuantity());
             workOrder.setIsCustomized(salesContractDetails.getIsCustomized());
+            workOrder.setProductionQuantity(workOrder.getQuantity());
+
+            //非定制工单查询库存如果存在库存需要人工干预是否需要生产
+            BigDecimal availableStockQuantity = stockService.getAvailableStockQuantity(salesContractDetails.getProductId());
+            if(Objects.equals(salesContractDetails.getIsCustomized(),0) && availableStockQuantity.compareTo(BigDecimal.ZERO)>0){
+                workOrder.setProductionQuantity(null);
+            }
+
             //添加工单
             workOrderService.add(workOrder);
         }

+ 8 - 0
hx-mes/src/main/java/com/fjhx/mes/controller/work/WorkOrderController.java

@@ -87,4 +87,12 @@ public class WorkOrderController {
         return workOrderService.getPageByJxst(dto);
     }
 
+    /**
+     * 下发需要人工干预的工单
+     */
+    @PostMapping("/distribute")
+    public void distribute(@RequestBody WorkOrderDto dto){
+        workOrderService.distribute(dto);
+    }
+
 }

+ 6 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/work/dto/WorkOrderDto.java

@@ -4,6 +4,8 @@ import com.fjhx.mes.entity.work.po.WorkOrder;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.math.BigDecimal;
+
 /**
  * 工单新增编辑入参实体
  *
@@ -14,4 +16,8 @@ import lombok.Setter;
 @Setter
 public class WorkOrderDto extends WorkOrder {
 
+    /**
+     * 待出库数量
+     */
+    private BigDecimal stockWaitQuantity;
 }

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/work/po/WorkOrder.java

@@ -72,4 +72,9 @@ public class WorkOrder extends BasePo {
      */
     private Integer technologyStatus;
 
+    /**
+     * 生产数量
+     */
+    private BigDecimal productionQuantity;
+
 }

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/work/vo/WorkOrderVo.java

@@ -64,4 +64,9 @@ public class WorkOrderVo extends WorkOrder {
      */
     private Date contractCreateTime;
 
+    /**
+     * 可用库存数量
+     */
+    private BigDecimal availableStockQuantity;
+
 }

+ 2 - 25
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionPlanServiceImpl.java

@@ -87,29 +87,6 @@ public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper,
         wrapper.gt(Objects.equals(dto.getIsRemaining(),1),"pp.remainingQuantity",0);
 
         Page<ProductionPlanVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
-//        List<ProductionPlanVo> records = page.getRecords();
-
-        //获取工单信息
-//        List<Long> workOrderIds = records.stream().map(ProductionPlanVo::getWorkOrderId).collect(Collectors.toList());
-//        if(ObjectUtil.isNotEmpty(workOrderIds)) {
-//            List<WorkOrder> workOrderList = workOrderService.list(q -> q.in(WorkOrder::getId, workOrderIds));
-//            Map<Long, WorkOrder> workOrderMap = workOrderList.stream().collect(Collectors.groupingBy(WorkOrder::getId,
-//                    Collectors.collectingAndThen(Collectors.toList(), value -> value.get(0))));
-//            //获取产品信息
-//            List<Long> productIds = workOrderList.stream().map(WorkOrder::getProductId).collect(Collectors.toList());
-//            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))));
-//                for (ProductionPlanVo productionPlanVo : records) {
-//                    WorkOrder workOrder = workOrderMap.get(productionPlanVo.getWorkOrderId());
-//                    ProductInfo productInfo = productInfoMap.get(workOrder.getProductId());
-//                    if (ObjectUtil.isNotEmpty(productInfo)) {
-//                        productionPlanVo.setProductName(productInfo.getName());
-//                    }
-//                }
-//            }
-//        }
         return page;
     }
 
@@ -145,8 +122,8 @@ public class ProductionPlanServiceImpl extends ServiceImpl<ProductionPlanMapper,
         //检查待排程数量防止并发
         List<ProductionPlan> productionPlanList = this.list(q -> q.eq(ProductionPlan::getWorkOrderId, productionPlanDto.getWorkOrderId()));
         BigDecimal planCount = productionPlanList.stream().map(ProductionPlan::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
-        if(planCount.add(productionPlanDto.getQuantity()).compareTo(workOrder.getQuantity())>0){
-            throw new ServiceException("计划数量大于工单数量,请检查!");
+        if(planCount.add(productionPlanDto.getQuantity()).compareTo(workOrder.getProductionQuantity())>0){
+            throw new ServiceException("计划数量大于工单生产数量,请检查!");
         }
 
         productionPlanDto.setStatus(0);

+ 7 - 1
hx-mes/src/main/java/com/fjhx/mes/service/work/WorkOrderService.java

@@ -1,5 +1,6 @@
 package com.fjhx.mes.service.work;
 
+import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.fjhx.mes.entity.work.po.WorkOrder;
 import com.fjhx.mes.entity.work.po.WorkOrderProductionProcesses;
 import com.ruoyi.common.core.service.BaseService;
@@ -16,7 +17,7 @@ import java.util.List;
  * 工单 服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-29
  */
 public interface WorkOrderService extends BaseService<WorkOrder> {
@@ -65,4 +66,9 @@ public interface WorkOrderService extends BaseService<WorkOrder> {
      * 给下发生产计划的人发消息
      */
     void sendPlanInfo();
+
+    /**
+     * 下发需要人工干预的工单
+     */
+    void distribute(WorkOrderDto dto);
 }

+ 76 - 43
hx-mes/src/main/java/com/fjhx/mes/service/work/impl/WorkOrderServiceImpl.java

@@ -9,6 +9,7 @@ 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.enums.PushBusinessTypeEnum;
+import com.fjhx.common.utils.Assert;
 import com.fjhx.item.entity.product.po.ProductInfo;
 import com.fjhx.item.service.product.ProductInfoService;
 import com.fjhx.mes.entity.bom.po.BomDetail;
@@ -36,11 +37,18 @@ import com.fjhx.sale.entity.contract.po.ContractProduct;
 import com.fjhx.sale.service.contract.ContractProductService;
 import com.fjhx.socket.core.PushTypeEnum;
 import com.fjhx.socket.core.WebSocketPush;
+import com.fjhx.wms.entity.stock.emums.StockWaitType;
 import com.fjhx.wms.entity.stock.po.Stock;
 import com.fjhx.wms.entity.stock.po.StockFrozen;
+import com.fjhx.wms.entity.stock.po.StockWait;
+import com.fjhx.wms.entity.stock.po.StockWaitDetails;
 import com.fjhx.wms.service.stock.StockFrozenService;
 import com.fjhx.wms.service.stock.StockService;
+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 com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import com.ruoyi.system.service.ISysUserService;
@@ -49,10 +57,7 @@ import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -92,35 +97,41 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
     private WorkOrderProductionProcessesService workOrderProductionProcessesService;
     @Autowired
     private ISysUserService userService;
+    @Autowired
+    private StockWaitService stockWaitService;
+    @Autowired
+    private StockWaitDetailsService stockWaitDetailsService;
 
     @Override
     public Page<WorkOrderVo> getPage(WorkOrderSelectDto dto) {
         IWrapper<WorkOrder> wrapper = getWrapper();
-        if(ObjectUtil.isNotEmpty(dto.getKeyword())){
+        if (ObjectUtil.isNotEmpty(dto.getKeyword())) {
             wrapper.keyword(dto.getKeyword(),
                     new SqlField("wo", WorkOrder::getCode),
                     new SqlField("wo", WorkOrder::getQuantity),
                     new SqlField("wo.contractCode")
             );
         }
-        wrapper.eq("wo",WorkOrder::getSource,dto.getSource());
+        wrapper.eq("wo", WorkOrder::getSource, dto.getSource());
 
         //过滤待排程(待创建计划的工单)
-        if(Objects.equals(dto.getIsRemaining(),1)) {
-            wrapper.gt( "wo.remainingQuantity", 0);
+        if (Objects.equals(dto.getIsRemaining(), 1)) {
+            wrapper.gt("wo.remainingQuantity", 0);
             //过滤非定制/定制但已经重新配置了bom和工艺的工单
-            wrapper.and(q->q
-                    .and(q1->q1
-                        .eq("wo",WorkOrder::getIsCustomized,1)
-                        .eq("wo",WorkOrder::getBomStatus,1)
-                        .eq("wo",WorkOrder::getTechnologyStatus,1)
+            wrapper.and(q -> q
+                    .and(q1 -> q1
+                            .eq("wo", WorkOrder::getIsCustomized, 1)
+                            .eq("wo", WorkOrder::getBomStatus, 1)
+                            .eq("wo", WorkOrder::getTechnologyStatus, 1)
                     ).or()
-                    .eq("wo",WorkOrder::getIsCustomized,0)
+                    .eq("wo", WorkOrder::getIsCustomized, 0)
             );
+            //过滤调需要人工干预生产数量的工单
+            wrapper.isNotNull("wo.productionQuantity");
         }
 
         //是否定制
-        wrapper.eq("wo",WorkOrder::getIsCustomized,dto.getIsCustomized());
+        wrapper.eq("wo", WorkOrder::getIsCustomized, dto.getIsCustomized());
 
         wrapper.orderByDesc("wo", WorkOrder::getId);
         Page<WorkOrderVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
@@ -133,40 +144,23 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
                 item.setProductName(productInfo.getName());
             });
         }
-//        //赋值待排程数量
-//        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));
-//            if (ObjectUtil.isNotEmpty(productionPlanList)) {
-//                //根据工单id分组
-//                Map<Long, List<ProductionPlan>> productionPlanMap = productionPlanList.stream().collect(Collectors.groupingBy(ProductionPlan::getWorkOrderId));
-//                for (WorkOrderVo workOrder : records) {
-//                    List<ProductionPlan> productionPlanList1 = productionPlanMap.get(workOrder.getId());
-//                    BigDecimal count = BigDecimal.ZERO;
-//                    if (ObjectUtil.isNotEmpty(productionPlanList1)) {
-//                        count = productionPlanList1.stream().map(ProductionPlan::getQuantity)
-//                                .reduce(BigDecimal.ZERO, BigDecimal::add);
-//                    }
-//                    workOrder.setRemainingQuantity(workOrder.getQuantity().subtract(count));
-//                }
-//            }
-//        }
         return page;
     }
 
     @Override
     public WorkOrderVo detail(Long id) {
-        WorkOrder WorkOrder = this.getById(id);
-        WorkOrderVo result = BeanUtil.toBean(WorkOrder, WorkOrderVo.class);
+        WorkOrder workOrder = this.getById(id);
+        WorkOrderVo result = BeanUtil.toBean(workOrder, WorkOrderVo.class);
         List<ProductionPlan> list = productionPlanService.list(q -> q.eq(ProductionPlan::getWorkOrderId, id));
         result.setProductionPlans(list);
         ProductInfo productInfo = productInfoService.getById(result.getProductId());
         if (ObjectUtil.isNotEmpty(productInfo)) {
             result.setProductName(productInfo.getName());
         }
+        //赋值产品可用库存
+        BigDecimal availableStockQuantity = stockService.getAvailableStockQuantity(workOrder.getProductId());
+        result.setAvailableStockQuantity(availableStockQuantity);
+
         return result;
     }
 
@@ -183,7 +177,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             throw new ServiceException("查询不到产品信息 产品id->" + workOrderDto.getProductId());
         }
         //搜索BOM明细并到冻结库存
-        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrderDto.getProductId()).eq(BomInfo::getCurrentVersion,1));
+        BomInfo bomInfo = bomInfoService.getOne(q -> q.eq(BomInfo::getProductId, workOrderDto.getProductId()).eq(BomInfo::getCurrentVersion, 1));
         if (ObjectUtil.isEmpty(bomInfo)) {
             throw new ServiceException("查询不到产品的BOM信息 产品名称->" + productInfo.getName());
         }
@@ -279,7 +273,7 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
             //赋值已计划数量
             workOrderVo.setArrangedQuantity(workOrderVo.getQuantity().subtract(workOrderVo.getRemainingQuantity()));
             //赋值完成率
-            long count =0;
+            long count = 0;
             //获取工单下的所有计划
             List<Long> productionPlanIds = productionPlanService.listObject(ProductionPlan::getId,
                     q -> q.eq(ProductionPlan::getWorkOrderId, workOrderVo.getId()));
@@ -330,9 +324,9 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
      * 检查定制工单BOM 工艺配置状态 如果配置完成则发送消息
      */
     @Override
-    public void checkCustomizedInfo(Long workOrderId){
+    public void checkCustomizedInfo(Long workOrderId) {
         WorkOrder workOrder1 = this.getById(workOrderId);
-        if(Objects.equals(workOrder1.getBomStatus(),1)&&Objects.equals(workOrder1.getTechnologyStatus(),1)){
+        if (Objects.equals(workOrder1.getBomStatus(), 1) && Objects.equals(workOrder1.getTechnologyStatus(), 1)) {
             //推送消息给生产计划下发的负责人
             sendPlanInfo();
         }
@@ -342,11 +336,50 @@ public class WorkOrderServiceImpl extends ServiceImpl<WorkOrderMapper, WorkOrder
      * 给下发生产计划的人发消息
      */
     @Override
-    public void sendPlanInfo(){
+    public void sendPlanInfo() {
         DynamicDataSourceContextHolder.push(SourceConstant.BASE);
         List<Long> userIds = userService.getUserIdsByRoleKey("admin");
         DynamicDataSourceContextHolder.poll();
         WebSocketPush.byUsers(PushTypeEnum.MESSAGE, userIds, "您有新的工单待下发!", PushBusinessTypeEnum.NEW_WORK_ORDER.getType());
     }
 
+    /**
+     * 下发需要人工干预的工单
+     */
+    @Override
+    @DSTransactional
+    public void distribute(WorkOrderDto dto) {
+        Assert.notEmpty(dto.getId(),"工单Id不能为空");
+        Assert.notEmpty(dto.getProductionQuantity(),"待生产数量不能为空");
+        Assert.notEmpty(dto.getStockWaitQuantity(),"待出库数量不能为空");
+
+        WorkOrder workOrder = this.getById(dto.getId());
+        Assert.notEmpty(workOrder, "查询不到该工单的信息");
+        boolean update = this.update(q -> q
+                .eq(WorkOrder::getId, dto.getId())
+                .set(WorkOrder::getProductionQuantity, dto.getProductionQuantity())
+                .set(BasePo::getUpdateTime, new Date())
+                .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
+        );
+        if (!update) {
+            throw new ServiceException("操作失败");
+        }
+        //创建待出库数据
+        if (ObjectUtil.isNotEmpty(dto.getStockWaitQuantity()) && dto.getStockWaitQuantity().compareTo(BigDecimal.ZERO) > 0) {
+            StockWait stockWait = new StockWait();
+            stockWait.setType(2);
+            stockWait.setBusinessType(StockWaitType.WORD_ORDER_OUT.getDetailType());
+            stockWait.setBusinessCode(workOrder.getCode());
+            stockWait.setStatus(0);
+            stockWaitService.save(stockWait);
+            StockWaitDetails stockWaitDetails = new StockWaitDetails();
+            stockWaitDetails.setStockWaitId(stockWait.getId());
+            stockWaitDetails.setProductId(workOrder.getProductId());
+            stockWaitDetails.setQuantity(dto.getStockWaitQuantity());
+            stockWaitDetails.setReceiptQuantity(BigDecimal.ZERO);
+            stockWaitDetails.setStatus(0);
+            stockWaitDetailsService.save(stockWaitDetails);
+        }
+    }
+
 }

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

@@ -16,7 +16,8 @@ public enum StockWaitType {
     PRODUCTION_TASK_OUT(InOutType.OUT, 7, "生产任务待出库", "production_task"),
     SALES_RETURN_IN(InOutType.IN, 8, "售后退货入库", "after_sales"),
     SALES_REPLACE_IN(InOutType.IN, 9, "售后换货入库", "after_sales"),
-    SALES_REPLACE_OUT(InOutType.OUT, 10, "售后换货出库", "after_sales");
+    SALES_REPLACE_OUT(InOutType.OUT, 10, "售后换货出库", "after_sales"),
+    WORD_ORDER_OUT(InOutType.OUT, 11, "工单直接出库出库", "work_order");
 
 
     /**

+ 4 - 0
hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockWaitDetailsMapper.java

@@ -7,6 +7,8 @@ import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -23,4 +25,6 @@ public interface StockWaitDetailsMapper extends BaseMapper<StockWaitDetails> {
      */
     Page<StockWaitDetailsVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<StockWaitDetails> wrapper);
 
+    List<StockWaitDetailsVo> getList( @Param("ew") IWrapper<StockWaitDetails> wrapper);
+
 }

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

@@ -9,6 +9,7 @@ import com.fjhx.wms.entity.stock.po.Stock;
 import com.fjhx.wms.entity.stock.vo.StockVo;
 import com.ruoyi.common.core.service.BaseService;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 
@@ -88,4 +89,8 @@ public interface StockService extends BaseService<Stock> {
      */
     void inOut(List<? extends InOutBo> list, Long warehouseId, JournalType journalType, Long businessId);
 
+    /**
+     * 获取可用库存
+     */
+    BigDecimal getAvailableStockQuantity(Long productId);
 }

+ 7 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/StockWaitDetailsService.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
 import com.fjhx.wms.entity.stock.dto.StockWaitDetailsSelectDto;
 import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+
+import java.util.List;
 
 
 /**
@@ -46,4 +49,8 @@ public interface StockWaitDetailsService extends BaseService<StockWaitDetails> {
      */
     void delete(Long id);
 
+    /**
+     * 待出入库列表
+     */
+    List<StockWaitDetailsVo> getList(IWrapper<StockWaitDetails> wrapper);
 }

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

@@ -21,12 +21,15 @@ import com.fjhx.wms.entity.stock.emums.JournalType;
 import com.fjhx.wms.entity.stock.po.Stock;
 import com.fjhx.wms.entity.stock.po.StockJournal;
 import com.fjhx.wms.entity.stock.po.StockJournalDetails;
+import com.fjhx.wms.entity.stock.po.StockWaitDetails;
 import com.fjhx.wms.entity.stock.vo.StockVo;
+import com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo;
 import com.fjhx.wms.entity.warehouse.po.Warehouse;
 import com.fjhx.wms.mapper.stock.StockMapper;
 import com.fjhx.wms.service.stock.StockJournalDetailsService;
 import com.fjhx.wms.service.stock.StockJournalService;
 import com.fjhx.wms.service.stock.StockService;
+import com.fjhx.wms.service.stock.StockWaitDetailsService;
 import com.fjhx.wms.service.warehouse.WarehouseService;
 import com.fjhx.wms.utils.CodeEnum;
 import com.ruoyi.common.core.domain.BaseIdPo;
@@ -64,6 +67,9 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
     @Autowired
     WarehouseService warehouseService;
 
+    @Autowired
+    private StockWaitDetailsService stockWaitDetailsService;
+
     @Override
     public Page<StockVo> getPage(StockSelectDto dto) {
         IWrapper<Stock> wrapper = getWrapper();
@@ -636,4 +642,26 @@ public class StockServiceImpl extends ServiceImpl<StockMapper, Stock> implements
         stockJournalDetailsService.saveBatch(journalDetailsList);
     }
 
+    /**
+     * 获取可用库存
+     */
+    @Override
+    public BigDecimal getAvailableStockQuantity(Long productId){
+        //查询库存
+        List<Stock> stockList = this.list(q -> q.eq(Stock::getProductId, productId));
+        BigDecimal stockQuantityCount = stockList.stream().map(Stock::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+        //查询待出库库存
+        List<StockWaitDetailsVo> stockWaitDetailsVos = stockWaitDetailsService.getList(IWrapper.<StockWaitDetails>getWrapper()
+                .eq(StockWaitDetails::getProductId, productId)
+                .eq("sw.type", 2)
+        );
+        BigDecimal stockWaitQuantityCount = stockWaitDetailsVos.stream().map(StockWaitDetails::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal receiptQuantityCount = stockWaitDetailsVos.stream().map(StockWaitDetails::getReceiptQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
+        //计算待出库数量
+        BigDecimal waitQuantity = stockWaitQuantityCount.subtract(receiptQuantityCount);
+        //计算可用库存
+        BigDecimal availableQuantity = stockQuantityCount.subtract(waitQuantity);
+        return availableQuantity;
+    }
+
 }

+ 5 - 0
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java

@@ -168,4 +168,9 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
         this.removeById(id);
     }
 
+    @Override
+    public List<StockWaitDetailsVo> getList(IWrapper<StockWaitDetails> wrapper){
+        return baseMapper.getList(wrapper);
+    }
+
 }

+ 8 - 0
hx-wms/src/main/resources/mapper/stock/StockWaitDetailsMapper.xml

@@ -22,5 +22,13 @@
                 JOIN stock_wait sw ON swd.stock_wait_id = sw.id
             ${ew.customSqlSegment}
     </select>
+    <select id="getList" resultType="com.fjhx.wms.entity.stock.vo.StockWaitDetailsVo">
+        SELECT
+            swd.*
+        FROM
+            stock_wait_details swd
+                LEFT JOIN stock_wait sw ON swd.stock_wait_id = sw.id
+            ${ew.customSqlSegment}
+    </select>
 
 </mapper>