소스 검색

快捷出库列表

24282 1 년 전
부모
커밋
9a5016aec6

+ 9 - 0
sd-business/src/main/java/com/sd/business/controller/production/StockPreparationController.java

@@ -2,6 +2,7 @@ package com.sd.business.controller.production;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sd.business.entity.production.dto.StockPreparationDto;
+import com.sd.business.entity.production.vo.OutBomVo;
 import com.sd.business.entity.production.vo.PackageBomVo;
 import com.sd.business.entity.production.vo.StockPreparationVo;
 import com.sd.business.entity.production.vo.UncompletedVo;
@@ -58,4 +59,12 @@ public class StockPreparationController {
         return stockPreparationService.getPackageBomList(orderSkuIdList);
     }
 
+    /**
+     * 待出库列表
+     */
+    @PostMapping("/outBomList")
+    public List<OutBomVo> outBomList(@RequestBody StockPreparationDto dto) {
+        return stockPreparationService.outBomList(dto);
+    }
+
 }

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/bom/bo/BomSpecBo.java

@@ -20,6 +20,11 @@ public class BomSpecBo {
     private String bomSpecCode;
 
     /**
+     * bom规格名称
+     */
+    private String bomSpecName;
+
+    /**
      * 种类 字典:bom_species
      */
     private String bomSpecies;

+ 5 - 0
sd-business/src/main/java/com/sd/business/entity/production/dto/StockPreparationDto.java

@@ -44,6 +44,11 @@ public class StockPreparationDto extends BaseSelectDto {
     private Long departmentId;
 
     /**
+     * 出库事业部id
+     */
+    private Long outDepartmentId;
+
+    /**
      * 宽
      */
     private String width;

+ 47 - 0
sd-business/src/main/java/com/sd/business/entity/production/vo/OutBomVo.java

@@ -0,0 +1,47 @@
+package com.sd.business.entity.production.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+public class OutBomVo {
+
+    /**
+     * bom规格id
+     */
+    private Long bomSpecId;
+
+    /**
+     * bom品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * bom品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 仓库id
+     */
+    private Long warehouseId;
+
+    /**
+     * 仓库名称
+     */
+    private String warehouseName;
+
+    /**
+     * 库存数量
+     */
+    private BigDecimal inventoryQuantity;
+
+    /**
+     * 出库数量
+     */
+    private BigDecimal outQuantity;
+
+}

+ 6 - 0
sd-business/src/main/java/com/sd/business/service/production/StockPreparationService.java

@@ -2,6 +2,7 @@ package com.sd.business.service.production;
 
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sd.business.entity.production.dto.StockPreparationDto;
+import com.sd.business.entity.production.vo.OutBomVo;
 import com.sd.business.entity.production.vo.PackageBomVo;
 import com.sd.business.entity.production.vo.StockPreparationVo;
 import com.sd.business.entity.production.vo.UncompletedVo;
@@ -30,4 +31,9 @@ public interface StockPreparationService {
      */
     List<PackageBomVo> getPackageBomList(List<Long> orderSkuIdList);
 
+    /**
+     * 待出库列表
+     */
+    List<OutBomVo> outBomList(StockPreparationDto dto);
+
 }

+ 132 - 11
sd-business/src/main/java/com/sd/business/service/production/impl/StockPreparationServiceImpl.java

@@ -1,7 +1,6 @@
 package com.sd.business.service.production.impl;
 
 import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.constant.StatusConstant;
@@ -16,6 +15,7 @@ import com.sd.business.entity.in.dto.InOutStorageDto;
 import com.sd.business.entity.in.emums.InOutTypeEnum;
 import com.sd.business.entity.in.emums.OutDetailTypeEnum;
 import com.sd.business.entity.in.po.InOutStorageBom;
+import com.sd.business.entity.inventory.po.Inventory;
 import com.sd.business.entity.order.enums.OrderExceptionTypeEnum;
 import com.sd.business.entity.order.enums.OrderStatusEnum;
 import com.sd.business.entity.order.po.OrderInfo;
@@ -24,6 +24,7 @@ import com.sd.business.entity.order.po.OrderSkuBom;
 import com.sd.business.entity.production.dto.StockPreparationDto;
 import com.sd.business.entity.production.po.ProductionTask;
 import com.sd.business.entity.production.po.ProductionWorkOrder;
+import com.sd.business.entity.production.vo.OutBomVo;
 import com.sd.business.entity.production.vo.PackageBomVo;
 import com.sd.business.entity.production.vo.StockPreparationVo;
 import com.sd.business.entity.production.vo.UncompletedVo;
@@ -35,6 +36,7 @@ import com.sd.business.service.bom.BomClassifyService;
 import com.sd.business.service.bom.BomService;
 import com.sd.business.service.bom.BomSpecService;
 import com.sd.business.service.in.InOutStorageService;
+import com.sd.business.service.inventory.InventoryService;
 import com.sd.business.service.order.OrderService;
 import com.sd.business.service.order.OrderSkuBomService;
 import com.sd.business.service.order.OrderSkuService;
@@ -43,6 +45,7 @@ import com.sd.business.service.production.ProductionWorkOrderService;
 import com.sd.business.service.production.StockPreparationService;
 import com.sd.business.service.sku.SkuService;
 import com.sd.business.service.sku.SkuSpecService;
+import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -93,19 +96,13 @@ public class StockPreparationServiceImpl implements StockPreparationService {
     @Autowired
     private BomClassifyService bomClassifyService;
 
+    @Autowired
+    private InventoryService inventoryService;
+
     @Override
     public List<UncompletedVo> uncompletedList(StockPreparationDto dto) {
-        Assert.notNull(dto.getDepartmentId(), "事业部id不能为空");
 
-        IWrapper<StockPreparationVo> wrapper = IWrapper.getWrapper();
-        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.STOCK_PREPARATION.getKey());
-        wrapper.eq("oi", OrderInfo::getExceptionType, OrderExceptionTypeEnum.NORMAL.getKey().toString());
-        wrapper.eq("os", OrderSku::getStockPreparationStatus, StatusConstant.NO);
-        wrapper.eq("oi", OrderInfo::getDepartmentId, dto.getDepartmentId());
-        wrapper.eq("bs", BomSpec::getCode, dto.getBomSpecCode());
-        wrapper.eq("bs", BomSpec::getName, dto.getBomSpecName());
-        wrapper.eq("ss", SkuSpec::getCode, dto.getSkuSpecCode());
-        wrapper.eq("ss", SkuSpec::getName, dto.getSkuSpecName());
+        IWrapper<StockPreparationVo> wrapper = getWrapper(dto);
         List<StockPreparationVo> stockPreparationVoList = stockPreparationMapper.uncompletedList(wrapper);
 
         return new ArrayList<>(stockPreparationVoList.stream().collect(Collectors.toMap(
@@ -255,6 +252,130 @@ public class StockPreparationServiceImpl implements StockPreparationService {
         return result;
     }
 
+    @Override
+    public List<OutBomVo> outBomList(StockPreparationDto dto) {
+        Long outDepartmentId = dto.getOutDepartmentId();
+        Assert.notNull(outDepartmentId, "出库事业部id不能为空");
+
+        // 订单sku列表
+        IWrapper<StockPreparationVo> wrapper = getWrapper(dto);
+        List<StockPreparationVo> stockPreparationVoList = stockPreparationMapper.uncompletedList(wrapper);
+
+        // 订单sku包材列表
+        List<Long> orderSkuIdList = stockPreparationVoList.stream().map(StockPreparationVo::getOrderSkuId).collect(Collectors.toList());
+        List<OrderSkuBom> orderSkuBomList = orderSkuBomService.listByIds(orderSkuIdList);
+
+        // 合并列表
+        List<OutBomVo> outBomVoList = stockPreparationVoList.stream().map(item -> {
+            OutBomVo outBomVo = new OutBomVo();
+            outBomVo.setBomSpecId(item.getBomSpecId());
+            outBomVo.setOutQuantity(item.getQuantity());
+            return outBomVo;
+        }).collect(Collectors.toList());
+
+        for (OrderSkuBom orderSkuBom : orderSkuBomList) {
+            OutBomVo outBomVo = new OutBomVo();
+            outBomVo.setBomSpecId(orderSkuBom.getBomSpecId());
+            outBomVo.setOutQuantity(orderSkuBom.getQuantity());
+            outBomVoList.add(outBomVo);
+        }
+
+        // 合并数量
+        Map<Long, OutBomVo> map = outBomVoList.stream().collect(Collectors.toMap(
+                OutBomVo::getBomSpecId,
+                Function.identity(),
+                (v1, v2) -> {
+                    v1.setOutQuantity(v1.getOutQuantity().add(v2.getOutQuantity()));
+                    return v1;
+                }
+        ));
+        outBomVoList = new ArrayList<>(map.values());
+
+        // 区分半成品仓和包材仓库
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(map.keySet());
+
+        for (OutBomVo outBomVo : outBomVoList) {
+            Long bomSpecId = outBomVo.getBomSpecId();
+            BomSpecBo bomSpecBo = bomSpecBoMap.get(bomSpecId);
+            outBomVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
+            outBomVo.setBomSpecName(bomSpecBo.getBomSpecName());
+            // 主材
+            if (Objects.equals(bomSpecBo.getClassifyParentId(), 1L)) {
+                outBomVo.setWarehouseId(WarehouseConstant.SEMI_FINISHED_PRODUCT);
+                outBomVo.setWarehouseName("半成品仓");
+            }
+            // 包材
+            else {
+                outBomVo.setWarehouseId(WarehouseConstant.PACKAGING_MATERIAL);
+                outBomVo.setWarehouseName("包材仓");
+            }
+        }
+
+        // 主材库存
+        Map<Long, BigDecimal> semiFinishedProductInventoryMap = Collections.emptyMap();
+        List<Long> semiFinishedProductBomSpecIdList = outBomVoList.stream()
+                .filter(item -> WarehouseConstant.SEMI_FINISHED_PRODUCT.equals(item.getWarehouseId()))
+                .map(OutBomVo::getBomSpecId)
+                .collect(Collectors.toList());
+        if (semiFinishedProductBomSpecIdList.size() > 0) {
+            semiFinishedProductInventoryMap = inventoryService.mapKV(
+                    Inventory::getBomSpecId,
+                    Inventory::getQuantity,
+                    q -> q.eq(Inventory::getWarehouseId, WarehouseConstant.SEMI_FINISHED_PRODUCT)
+                            .eq(Inventory::getDepartmentId, outDepartmentId)
+                            .in(Inventory::getBomSpecId, semiFinishedProductBomSpecIdList)
+            );
+        }
+
+        // 包材库存
+        Map<Long, BigDecimal> packagingMaterialInventoryMap = Collections.emptyMap();
+        List<Long> packagingMaterialBomSpecIdList = outBomVoList.stream()
+                .filter(item -> WarehouseConstant.PACKAGING_MATERIAL.equals(item.getWarehouseId()))
+                .map(OutBomVo::getBomSpecId)
+                .collect(Collectors.toList());
+        if (packagingMaterialBomSpecIdList.size() > 0) {
+            packagingMaterialInventoryMap = inventoryService.mapKV(
+                    Inventory::getBomSpecId,
+                    Inventory::getQuantity,
+                    q -> q.eq(Inventory::getWarehouseId, WarehouseConstant.PACKAGING_MATERIAL)
+                            .eq(Inventory::getDepartmentId, outDepartmentId)
+                            .in(Inventory::getBomSpecId, semiFinishedProductBomSpecIdList)
+            );
+        }
+
+        // 赋值库存
+        for (OutBomVo outBomVo : outBomVoList) {
+            if (WarehouseConstant.SEMI_FINISHED_PRODUCT.equals(outBomVo.getWarehouseId())) {
+                outBomVo.setInventoryQuantity(semiFinishedProductInventoryMap.getOrDefault(outBomVo.getBomSpecId(), BigDecimal.ZERO));
+            } else {
+                outBomVo.setInventoryQuantity(packagingMaterialInventoryMap.getOrDefault(outBomVo.getBomSpecId(), BigDecimal.ZERO));
+            }
+        }
+
+        return outBomVoList.stream()
+                .sorted(Comparator.comparing(OutBomVo::getWarehouseId, Comparator.reverseOrder()).thenComparing(OutBomVo::getBomSpecCode))
+                .collect(Collectors.toList());
+
+    }
+
+    /**
+     * 获取wrapper
+     */
+    private IWrapper<StockPreparationVo> getWrapper(StockPreparationDto dto) {
+        Assert.notNull(dto.getDepartmentId(), "事业部id不能为空");
+
+        IWrapper<StockPreparationVo> wrapper = IWrapper.getWrapper();
+        wrapper.eq("oi", OrderInfo::getStatus, OrderStatusEnum.STOCK_PREPARATION.getKey());
+        wrapper.eq("oi", OrderInfo::getExceptionType, OrderExceptionTypeEnum.NORMAL.getKey().toString());
+        wrapper.eq("os", OrderSku::getStockPreparationStatus, StatusConstant.NO);
+        wrapper.eq("oi", OrderInfo::getDepartmentId, dto.getDepartmentId());
+        wrapper.eq("bs", BomSpec::getCode, dto.getBomSpecCode());
+        wrapper.eq("bs", BomSpec::getName, dto.getBomSpecName());
+        wrapper.eq("ss", SkuSpec::getCode, dto.getSkuSpecCode());
+        wrapper.eq("ss", SkuSpec::getName, dto.getSkuSpecName());
+        return wrapper;
+    }
+
     /**
      * 订单状态改为 生产中
      */

+ 2 - 2
sd-business/src/main/java/com/sd/business/service/sku/SkuSpecService.java

@@ -8,7 +8,7 @@ import com.sd.business.entity.sku.dto.SkuSpecSelectDto;
 import com.sd.business.entity.sku.po.SkuSpec;
 import com.sd.business.entity.sku.vo.SkuSpecVo;
 
-import java.util.List;
+import java.util.Collection;
 import java.util.Map;
 
 
@@ -50,6 +50,6 @@ public interface SkuSpecService extends BaseService<SkuSpec> {
     /**
      * 根据sku规格id获取bomId和bom规格id
      */
-    Map<Long, BomSpecBo> getBomSpecBoByIdList(List<Long> bomSpecIdList);
+    Map<Long, BomSpecBo> getBomSpecBoByIdList(Collection<Long> bomSpecIdList);
 
 }

+ 2 - 1
sd-business/src/main/java/com/sd/business/service/sku/impl/SkuSpecServiceImpl.java

@@ -15,6 +15,7 @@ import com.sd.business.mapper.sku.SkuSpecMapper;
 import com.sd.business.service.sku.SkuSpecService;
 import org.springframework.stereotype.Service;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -64,7 +65,7 @@ public class SkuSpecServiceImpl extends ServiceImpl<SkuSpecMapper, SkuSpec> impl
     }
 
     @Override
-    public Map<Long, BomSpecBo> getBomSpecBoByIdList(List<Long> bomSpecIdList) {
+    public Map<Long, BomSpecBo> getBomSpecBoByIdList(Collection<Long> bomSpecIdList) {
 
         if (ObjectUtil.isEmpty(bomSpecIdList)) {
             return Collections.emptyMap();

+ 1 - 1
sd-business/src/main/java/com/sd/business/service/statement/impl/StatementOfAccountMergeServiceImpl.java

@@ -4,7 +4,6 @@ import cn.hutool.core.convert.Convert;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Assert;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -24,6 +23,7 @@ import com.sd.business.service.order.OrderService;
 import com.sd.business.service.statement.StatementOfAccountExportService;
 import com.sd.business.service.statement.StatementOfAccountMergeService;
 import com.sd.business.service.statement.StatementOfAccountService;
+import com.sd.framework.util.Assert;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 

+ 2 - 1
sd-business/src/main/resources/mapper/production/StockPreparationMapper.xml

@@ -9,7 +9,8 @@
                ss.id   skuSpecId,
                ss.code skuSpecCode,
                ss.name skuSpecName,
-               os.quantity
+               os.quantity,
+               os.id   orderSkuId
         from order_info oi
                  inner join order_sku os on oi.id = os.order_id
                  inner join sku_spec ss on os.sku_spec_id = ss.id

+ 1 - 0
sd-business/src/main/resources/mapper/sku/SkuSpecMapper.xml

@@ -27,6 +27,7 @@
     <select id="getBomSpecBoList" resultType="com.sd.business.entity.bom.bo.BomSpecBo">
         SELECT bs.id                                     bomSpecId,
                bs.code                                   bomSpecCode,
+               bs.name                                   bomSpecName,
                b.species                                 bomSpecies,
                ifnull(bs.cost_price, '0.00')             costPrice,
                ifnull(bs.internal_selling_price, '0.00') internalSellingPrice,