Bladeren bron

新增每日看板接口

fgd 1 jaar geleden
bovenliggende
commit
7e843ba0ea

+ 76 - 0
sd-business/src/main/java/com/sd/business/controller/board/DailyBoardController.java

@@ -0,0 +1,76 @@
+package com.sd.business.controller.board;
+
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.board.vo.*;
+import com.sd.business.service.board.DailyBoardService;
+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;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 每日看板 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-09-21
+ */
+@RestController
+@RequestMapping("/dailyBoard")
+public class DailyBoardController {
+    @Autowired
+    private DailyBoardService dailyBoardService;
+
+    /**
+     * 获取MES今日生产出库数据列表
+     * @return
+     */
+    @PostMapping("/getProductionOutStorageList")
+    public List<DailyBoardOutStorageBomVo> getProductionOutStorageList(@RequestBody BaseSelectDto dto) {
+       return dailyBoardService.getProductionOutStorageList(dto);
+    }
+
+    /**
+     * MES&万里牛今日订单和BOM差异 (不含自建订单)
+     * @return
+     */
+    @PostMapping("/getOrderBomDifferenceList")
+    public List<OrderBomDifferenceVo> getOrderBomDifferenceList(@RequestBody BaseSelectDto dto) {
+        return dailyBoardService.getOrderBomDifferenceList(dto);
+    }
+
+    /**
+     * 万里牛今日销售出库数据
+     * @return
+     */
+    @PostMapping("/getWlnSalesOutStorageInfo")
+    public WlnSalesOutStorageVo getWlnSalesOutStorageInfo(@RequestBody BaseSelectDto dto) {
+        return dailyBoardService.getWlnSalesOutStorageInfo(dto);
+    }
+
+    /**
+     * MES今日生产订单数据(不含自建订单)
+     * @return
+     */
+    @PostMapping("/getMesProductionOutStorageInfo")
+    public MesProductionOutStorageVo getMesProductionOutStorageInfo(@RequestBody BaseSelectDto dto) {
+        return dailyBoardService.getMesProductionOutStorageInfo(dto);
+    }
+
+
+    /**
+     * 自建订单数据
+     * @return
+     */
+    @PostMapping("/getSelfOrderOutStorageInfo")
+    public SelfOrderOutStorageVo getSelfOrderOutStorageInfo(@RequestBody BaseSelectDto dto) {
+        return dailyBoardService.getSelfOrderOutStorageInfo(dto);
+    }
+
+
+}

+ 36 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/DailyBoardOutStorageBomVo.java

@@ -0,0 +1,36 @@
+package com.sd.business.entity.board.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+
+/**
+ * 今日生产出库数据查询返回值实体
+ *
+ * @since 2023-09-22
+ */
+@Getter
+@Setter
+public class DailyBoardOutStorageBomVo {
+
+    /**
+     * 产品规格品号
+     */
+    private Long bomSpecId;
+
+    /**
+     * 产品规格品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * 产品规格品名
+     */
+    private String bomSpecName;
+
+    /**
+     * 数量
+     */
+    private BigDecimal quantity;
+}

+ 55 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/MesProductionOutStorageVo.java

@@ -0,0 +1,55 @@
+package com.sd.business.entity.board.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * MES今日生产订单数据(不含自建订单)查询返回值实体
+ *
+ * @since 2023-09-22
+ */
+@Getter
+@Setter
+public class MesProductionOutStorageVo {
+    /**
+     * 销售出库订单总数
+     */
+    private Integer sumOrderCount;
+    /**
+     * bom销售出库总数
+     */
+    private BigDecimal sumBomCount;
+    /**
+     * 出库bom列表
+     */
+    private List<DailyBoardOutStorageBomVo> outStorageBomList;
+
+    /**
+     * 佰卓销售出库订单总数
+     */
+    private Integer bzSumOrderCount;
+    /**
+     * 佰卓bom销售出库总数
+     */
+    private BigDecimal bzSumBomCount;
+    /**
+     * 佰卓出库bom列表
+     */
+    private List<DailyBoardOutStorageBomVo> bzOutStorageBomList;
+
+    /**
+     * 胜德实业销售出库订单总数
+     */
+    private Integer sySumOrderCount;
+    /**
+     * 胜德实业bom销售出库总数
+     */
+    private BigDecimal sySumBomCount;
+    /**
+     * 胜德实业出库bom列表
+     */
+    private List<DailyBoardOutStorageBomVo> syOutStorageBomList;
+}

+ 36 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/OrderBomDifferenceVo.java

@@ -0,0 +1,36 @@
+package com.sd.business.entity.board.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * MES&万里牛今日订单和BOM差异数据查询返回值实体
+ *
+ * @since 2023-09-22
+ */
+@Getter
+@Setter
+public class OrderBomDifferenceVo {
+    /**
+     * 产品规格品号
+     */
+    private String bomSpecCode;
+
+    /**
+     * mes数量
+     */
+    private BigDecimal mesQuantity;
+
+    /**
+     * 万里牛数量
+     */
+    private BigDecimal wlnQuantity;
+
+    /**
+     * 差异订单号
+     */
+    private List<String> orderWlnCodes;
+}

+ 31 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/SelfOrderOutStorageVo.java

@@ -0,0 +1,31 @@
+package com.sd.business.entity.board.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 自建订单数据查询返回值实体
+ *
+ * @since 2023-09-22
+ */
+@Getter
+@Setter
+public class SelfOrderOutStorageVo {
+    /**
+     * 自建订单总数
+     */
+    private Integer sumOrderCount;
+
+    /**
+     * 自建订单BOM总数
+     */
+    private BigDecimal sumBomCount;
+
+    /**
+     * 出库bom列表
+     */
+    private List<DailyBoardOutStorageBomVo> outStorageBomList;
+}

+ 57 - 0
sd-business/src/main/java/com/sd/business/entity/board/vo/WlnSalesOutStorageVo.java

@@ -0,0 +1,57 @@
+package com.sd.business.entity.board.vo;
+
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 万里牛今日销售出库数据查询返回值实体
+ *
+ * @since 2023-09-22
+ */
+@Getter
+@Setter
+public class WlnSalesOutStorageVo {
+    /**
+     * 销售出库订单总数
+     */
+    private Integer sumOrderCount;
+    /**
+     * bom销售出库总数
+     */
+    private BigDecimal sumBomCount;
+    /**
+     * 出库bom列表
+     */
+    private List<DailyBoardOutStorageBomVo> outStorageBomList;
+
+    /**
+     * 佰卓销售出库订单总数
+     */
+    private Integer bzSumOrderCount;
+    /**
+     * 佰卓bom销售出库总数
+     */
+    private BigDecimal bzSumBomCount;
+    /**
+     * 佰卓出库bom列表
+     */
+    private List<DailyBoardOutStorageBomVo> bzOutStorageBomList;
+
+    /**
+     * 胜德实业销售出库订单总数
+     */
+    private Integer sySumOrderCount;
+    /**
+     * 胜德实业bom销售出库总数
+     */
+    private BigDecimal sySumBomCount;
+    /**
+     * 胜德实业出库bom列表
+     */
+    private List<DailyBoardOutStorageBomVo> syOutStorageBomList;
+
+}

+ 48 - 0
sd-business/src/main/java/com/sd/business/service/board/DailyBoardService.java

@@ -0,0 +1,48 @@
+package com.sd.business.service.board;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.board.vo.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 每日看板 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-09-21
+ */
+public interface DailyBoardService {
+    /**
+     * 获取MES今日生产出库数据列表
+     *
+     * @return
+     */
+    List<DailyBoardOutStorageBomVo> getProductionOutStorageList(BaseSelectDto dto);
+
+    /**
+     * MES&万里牛今日订单和BOM差异 (不含自建订单)
+     *
+     * @return
+     */
+    List<OrderBomDifferenceVo> getOrderBomDifferenceList(BaseSelectDto dto);
+
+    /**
+     * 获取万里牛今日销售出库数据
+     * @return
+     */
+    WlnSalesOutStorageVo getWlnSalesOutStorageInfo(BaseSelectDto dto);
+
+    /**
+     * MES今日生产订单数据(不含自建订单)
+     * @return
+     */
+    MesProductionOutStorageVo getMesProductionOutStorageInfo(BaseSelectDto dto);
+
+    /**
+     * 自建订单数据
+     * @return
+     */
+    SelfOrderOutStorageVo getSelfOrderOutStorageInfo(BaseSelectDto dto);
+}

+ 470 - 0
sd-business/src/main/java/com/sd/business/service/board/impl/DailyBoardServiceImpl.java

@@ -0,0 +1,470 @@
+package com.sd.business.service.board.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.core.domain.BaseIdPo;
+import com.ruoyi.common.core.domain.BasePo;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import com.sd.business.entity.board.vo.*;
+import com.sd.business.entity.bom.bo.BomSpecBo;
+import com.sd.business.entity.bom.po.BomSpec;
+import com.sd.business.entity.department.po.Department;
+import com.sd.business.entity.in.emums.InOutTypeEnum;
+import com.sd.business.entity.in.emums.OutDetailTypeEnum;
+import com.sd.business.entity.in.po.InOutStorage;
+import com.sd.business.entity.in.po.InOutStorageBom;
+import com.sd.business.entity.order.po.OrderInfo;
+import com.sd.business.entity.order.po.OrderSku;
+import com.sd.business.entity.outbound.po.OutboundOrder;
+import com.sd.business.entity.production.po.ProductionTask;
+import com.sd.business.entity.sku.po.SkuSpec;
+import com.sd.business.service.board.DailyBoardService;
+import com.sd.business.service.bom.BomSpecService;
+import com.sd.business.service.department.DepartmentService;
+import com.sd.business.service.in.InOutStorageBomService;
+import com.sd.business.service.in.InOutStorageService;
+import com.sd.business.service.order.OrderService;
+import com.sd.business.service.order.OrderSkuService;
+import com.sd.business.service.outbound.OutboundOrderService;
+import com.sd.business.service.production.ProductionTaskService;
+import com.sd.business.service.sku.SkuSpecService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.util.Comparator.comparing;
+
+@Service
+public class DailyBoardServiceImpl implements DailyBoardService {
+    @Autowired
+    private InOutStorageService inOutStorageService;
+
+    @Autowired
+    private InOutStorageBomService inOutStorageBomService;
+
+    @Autowired
+    private SkuSpecService skuSpecService;
+
+    @Autowired
+    private OrderService orderService;
+
+    @Autowired
+    private ProductionTaskService productionTaskService;
+
+    @Autowired
+    private OutboundOrderService outboundOrderService;
+
+    @Autowired
+    private OrderSkuService orderSkuService;
+
+    @Autowired
+    private BomSpecService bomSpecService;
+
+    @Autowired
+    private DepartmentService departmentService;
+
+
+    @Override
+    public List<DailyBoardOutStorageBomVo> getProductionOutStorageList(BaseSelectDto dto) {
+        Date date = dto.getBeginTime();
+        if (date == null) {
+            date = new Date();
+        }
+        Date beginDate = DateUtil.beginOfDay(date);
+        Date endDate = DateUtil.endOfDay(date);
+        List<InOutStorage> inOutStorageList = inOutStorageService.list(q -> q
+                .eq(InOutStorage::getType, InOutTypeEnum.OUT.getKey())
+                .eq(InOutStorage::getDetailType, OutDetailTypeEnum.PRODUCTION.getKey())
+                .between(BasePo::getCreateTime, beginDate, endDate));
+        if (ObjectUtil.isEmpty(inOutStorageList)) {
+            return Collections.emptyList();
+        }
+        List<Long> inOutStorageIds = inOutStorageList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        // 查询今日出库bom数据
+        List<InOutStorageBom> outStorageBomList = inOutStorageBomService.list(q -> q.in(InOutStorageBom::getInOutStorageId, inOutStorageIds));
+        Map<Long, InOutStorageBom> map = outStorageBomList.stream()
+                .sorted(comparing(InOutStorageBom::getBomSpecId))
+                .collect(Collectors.toMap(
+                        InOutStorageBom::getBomSpecId,
+                        Function.identity(),
+                        (v1, v2) -> {
+                            v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                            return v1;
+                        }
+                ));
+
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(map.keySet());
+        // 筛选出主材主库信息
+        List<DailyBoardOutStorageBomVo> list = map.values().stream()
+                .filter(item -> {
+                    BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
+                    return bomSpecBo != null && ObjectUtil.equals(bomSpecBo.getClassifyParentId(), 1L);
+                })
+                .map(item -> {
+                    BomSpecBo bomSpecBo = bomSpecBoMap.get(item.getBomSpecId());
+                    DailyBoardOutStorageBomVo outStorageVo = new DailyBoardOutStorageBomVo();
+                    outStorageVo.setBomSpecName(bomSpecBo.getBomSpecName());
+                    outStorageVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
+                    outStorageVo.setQuantity(item.getQuantity());
+                    return outStorageVo;
+                }).collect(Collectors.toList());
+        return list;
+    }
+
+    @Override
+    public List<OrderBomDifferenceVo> getOrderBomDifferenceList(BaseSelectDto dto) {
+        Date date = dto.getBeginTime();
+        if (date == null) {
+            date = new Date();
+        }
+        Date beginDate = DateUtil.beginOfDay(date);
+        Date endDate = DateUtil.endOfDay(date);
+        // 查询今日订单
+        List<OrderInfo> orderInfoList = orderService.list(q -> q.eq(OrderInfo::getSource, 2)
+                .between(OrderInfo::getWlnCreateTime, beginDate, endDate));
+        // 查询今日生成完成任务
+        Map<Long, List<ProductionTask>> taskMap = productionTaskService.mapKGroup(ProductionTask::getOrderId, q -> q.between(ProductionTask::getCompleteTime, beginDate, endDate));
+        // 查询今日出库单出库数据
+        Map<String, List<OutboundOrder>> outboundOrderMap = outboundOrderService.mapKGroup(OutboundOrder::getOrderWlnCode, q -> q.between(OutboundOrder::getOutboundTime, beginDate, endDate));
+
+        // 获取今日订单sku列表
+        List<Long> orderIds = orderInfoList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIds));
+        Map<Long, List<OrderSku>> map = orderSkuList.stream().collect(Collectors.groupingBy(OrderSku::getOrderId));
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        Map<String, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getCode, q -> q.in(SkuSpec::getId, skuSpecIds));
+        // 获取今日订单bom列表
+        List<Long> bomSpecIds = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpec> bomSpecMap = bomSpecService.mapKEntity(BaseIdPo::getId, q -> q.in(BaseIdPo::getId, bomSpecIds));
+
+        Map<Long, OrderBomDifferenceVo> differenceMap = new HashMap<>();
+
+        for (OrderInfo orderInfo : orderInfoList) {
+            // 获取当前订单sku
+            List<OrderSku> orderSkus = map.get(orderInfo.getId());
+            List<ProductionTask> productionTaskList = taskMap.getOrDefault(orderInfo.getId(), Collections.emptyList());
+            List<OutboundOrder> outboundOrderList = outboundOrderMap.getOrDefault(orderInfo.getWlnCode(), Collections.emptyList());
+            if (productionTaskList.isEmpty() && outboundOrderList.isEmpty()) {
+                continue;
+            }
+            for (OrderSku orderSku : orderSkus) {
+                Long orderSkuId = orderSku.getSkuSpecId();
+                BomSpec bomSpec = bomSpecMap.get(orderSku.getBomSpecId());
+                OrderBomDifferenceVo bomDifferenceVo = differenceMap.computeIfAbsent(orderSku.getBomSpecId(), item -> {
+                    OrderBomDifferenceVo tempOrderBomDifferenceVo = new OrderBomDifferenceVo();
+                    tempOrderBomDifferenceVo.setBomSpecCode(bomSpec.getCode());
+                    tempOrderBomDifferenceVo.setMesQuantity(BigDecimal.ZERO);
+                    tempOrderBomDifferenceVo.setWlnQuantity(BigDecimal.ZERO);
+                    tempOrderBomDifferenceVo.setOrderWlnCodes(new ArrayList<>());
+                    return tempOrderBomDifferenceVo;
+                });
+                // mes数量
+                BigDecimal mesCount = productionTaskList.stream()
+                        .filter(item -> Objects.equals(item.getSkuSpecId(), orderSkuId))
+                        .map(ProductionTask::getCompleteQuantity)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                // 万里牛数量
+                BigDecimal wlnCount = outboundOrderList.stream()
+                        .filter(item -> Objects.equals(skuSpecMap.get(item.getSkuSpecCode()).getId(), orderSkuId))
+                        .map(OutboundOrder::getQuantity)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                bomDifferenceVo.setMesQuantity(bomDifferenceVo.getMesQuantity().add(mesCount));
+                bomDifferenceVo.setWlnQuantity(bomDifferenceVo.getWlnQuantity().add(wlnCount));
+                if (!Objects.equals(mesCount, wlnCount)) {
+                    // 新增差异订单号
+                    bomDifferenceVo.getOrderWlnCodes().add(orderInfo.getWlnCode());
+                }
+                differenceMap.put(orderSku.getBomSpecId(), bomDifferenceVo);
+            }
+        }
+        // 筛选出有差异的bom数据
+        List<OrderBomDifferenceVo> differenceVoList = differenceMap.values().stream().filter(item -> !item.getOrderWlnCodes().isEmpty()).collect(Collectors.toList());
+        return differenceVoList;
+    }
+
+    @Override
+    public WlnSalesOutStorageVo getWlnSalesOutStorageInfo(BaseSelectDto dto) {
+        WlnSalesOutStorageVo vo = new WlnSalesOutStorageVo();
+        vo.setSumBomCount(BigDecimal.ZERO);
+        vo.setSumOrderCount(0);
+        vo.setBzSumBomCount(BigDecimal.ZERO);
+        vo.setBzSumOrderCount(0);
+        vo.setSySumBomCount(BigDecimal.ZERO);
+        vo.setSySumOrderCount(0);
+        Date date = dto.getBeginTime();
+        if (date == null) {
+            date = new Date();
+        }
+        Date beginDate = DateUtil.beginOfDay(date);
+        Date endDate = DateUtil.endOfDay(date);
+        Department department = departmentService.getOne(q -> q.eq(Department::getName, "佰卓"));
+        // 查询今日出库单出库数据
+        Map<String, List<OutboundOrder>> outboundOrderMap = outboundOrderService.mapKGroup(OutboundOrder::getOrderWlnCode, q -> q.between(OutboundOrder::getOutboundTime, beginDate, endDate));
+        if (ObjectUtil.isEmpty(outboundOrderMap)) {
+            return vo;
+        }
+        Set<String> wlnCodeList = outboundOrderMap.keySet();
+        // 出库单相关的订单数据
+        List<OrderInfo> orderList = orderService.list(q -> q.in(OrderInfo::getWlnCode, wlnCodeList));
+        if (ObjectUtil.isEmpty(orderList)) {
+            return vo;
+        }
+        vo.setSumOrderCount(orderList.size());
+        // 获取订单sku列表
+        List<Long> orderIds = orderList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIds));
+        List<Long> skuSpecIds = orderSkuList.stream().map(OrderSku::getSkuSpecId).collect(Collectors.toList());
+        Map<String, SkuSpec> skuSpecMap = skuSpecService.mapKEntity(SkuSpec::getCode, q -> q.in(SkuSpec::getId, skuSpecIds));
+        // 获取今日订单bom列表
+        List<Long> bomSpecIds = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
+
+        Map<Long, DailyBoardOutStorageBomVo> outStorageBomMap = new HashMap<>();
+        Map<Long, DailyBoardOutStorageBomVo> bzOutStorageBomMap = new HashMap<>();
+        Map<Long, DailyBoardOutStorageBomVo> syOutStorageBomMap = new HashMap<>();
+        int bzCount = 0;
+        int syCount = 0;
+        for (OrderInfo orderInfo : orderList) {
+            BigDecimal quantity = BigDecimal.ZERO;
+            // 当前订单出库数据
+            List<OutboundOrder> outboundOrderList = outboundOrderMap.get(orderInfo.getWlnCode());
+            // 出库单中主材bom
+            List<DailyBoardOutStorageBomVo> outStorageBomVoList = new ArrayList<>();
+            for (OutboundOrder outboundOrder : outboundOrderList) {
+                SkuSpec skuSpec = skuSpecMap.get(outboundOrder.getSkuSpecCode());
+                BomSpecBo bomSpecBo = bomSpecBoMap.get(skuSpec.getBomSpecId());
+                if (Objects.equals(bomSpecBo.getClassifyParentId(), 1L)) {
+                    DailyBoardOutStorageBomVo bomVo = new DailyBoardOutStorageBomVo();
+                    bomVo.setBomSpecId(bomSpecBo.getBomSpecId());
+                    bomVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
+                    bomVo.setBomSpecName(bomSpecBo.getBomSpecName());
+                    bomVo.setQuantity(outboundOrder.getQuantity());
+                    outStorageBomVoList.add(bomVo);
+                    quantity = quantity.add(outboundOrder.getQuantity());
+                }
+            }
+            // 保存bom数量
+            vo.setSumBomCount(vo.getSumBomCount().add(quantity));
+
+            outStorageBomMap = Stream.concat(outStorageBomMap.values().stream(), outStorageBomVoList.stream())
+                    .collect(Collectors.toMap(
+                            DailyBoardOutStorageBomVo::getBomSpecId,
+                            Function.identity(),
+                            (v1, v2) -> {
+                                v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                return v1;
+                            }
+                    ));
+            // 佰卓订单
+            if (ObjectUtil.equals(orderInfo.getDepartmentId(), department.getId())) {
+                bzCount++;
+                vo.setBzSumOrderCount(bzCount);
+                bzOutStorageBomMap = Stream.concat(bzOutStorageBomMap.values().stream(), outStorageBomVoList.stream())
+                        .collect(Collectors.toMap(
+                                DailyBoardOutStorageBomVo::getBomSpecId,
+                                Function.identity(),
+                                (v1, v2) -> {
+                                    v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                    return v1;
+                                }
+                        ));
+                vo.setBzSumBomCount(vo.getBzSumBomCount().add(quantity));
+            } else {
+                syCount++;
+                vo.setSySumOrderCount(syCount);
+                syOutStorageBomMap = Stream.concat(syOutStorageBomMap.values().stream(), outStorageBomVoList.stream())
+                        .collect(Collectors.toMap(
+                                DailyBoardOutStorageBomVo::getBomSpecId,
+                                Function.identity(),
+                                (v1, v2) -> {
+                                    v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                    return v1;
+                                }
+                        ));
+                vo.setSySumBomCount(vo.getSySumBomCount().add(quantity));
+            }
+        }
+        vo.setOutStorageBomList(new ArrayList<>(outStorageBomMap.values()));
+        vo.setBzOutStorageBomList(new ArrayList<>(bzOutStorageBomMap.values()));
+        vo.setSyOutStorageBomList(new ArrayList<>(syOutStorageBomMap.values()));
+        return vo;
+    }
+
+    @Override
+    public MesProductionOutStorageVo getMesProductionOutStorageInfo(BaseSelectDto dto) {
+        MesProductionOutStorageVo vo = new MesProductionOutStorageVo();
+        vo.setSumBomCount(BigDecimal.ZERO);
+        vo.setSumOrderCount(0);
+        vo.setBzSumBomCount(BigDecimal.ZERO);
+        vo.setBzSumOrderCount(0);
+        vo.setSySumBomCount(BigDecimal.ZERO);
+        vo.setSySumOrderCount(0);
+        Date date = dto.getBeginTime();
+        if (date == null) {
+            date = new Date();
+        }
+        Date beginDate = DateUtil.beginOfDay(date);
+        Date endDate = DateUtil.endOfDay(date);
+        Department department = departmentService.getOne(q -> q.eq(Department::getName, "佰卓"));
+        // 查询今日出库单出库数据
+        Map<Long, List<ProductionTask>> taskMap = productionTaskService.mapKGroup(ProductionTask::getOrderId, q -> q.between(ProductionTask::getCompleteTime, beginDate, endDate));
+        if (ObjectUtil.isEmpty(taskMap)) {
+            return vo;
+        }
+        // 出库单相关的订单数据
+        List<OrderInfo> orderList = orderService.list(q -> q
+                .eq(OrderInfo::getSource, 2)
+                .in(OrderInfo::getId, taskMap.keySet()));
+        vo.setSumOrderCount(orderList.size());
+        if (ObjectUtil.isEmpty(orderList)) {
+            return vo;
+        }
+        // 获取订单sku列表
+        List<Long> orderIds = orderList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIds));
+        // 获取今日订单bom列表
+        List<Long> bomSpecIds = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
+
+        Map<Long, DailyBoardOutStorageBomVo> outStorageBomMap = new HashMap<>();
+        Map<Long, DailyBoardOutStorageBomVo> bzOutStorageBomMap = new HashMap<>();
+        Map<Long, DailyBoardOutStorageBomVo> syOutStorageBomMap = new HashMap<>();
+        int bzCount = 0;
+        int syCount = 0;
+        for (OrderInfo orderInfo : orderList) {
+            BigDecimal quantity = BigDecimal.ZERO;
+            // 当前订单出库数据
+            List<ProductionTask> productionTaskList = taskMap.get(orderInfo.getId());
+            // 出库单中主材bom
+            List<DailyBoardOutStorageBomVo> outStorageBomVoList = new ArrayList<>();
+            for (ProductionTask productionTask : productionTaskList) {
+                BomSpecBo bomSpecBo = bomSpecBoMap.get(productionTask.getBomSpecId());
+                if (Objects.equals(bomSpecBo.getClassifyParentId(), 1L)) {
+                    DailyBoardOutStorageBomVo bomVo = new DailyBoardOutStorageBomVo();
+                    bomVo.setBomSpecId(bomSpecBo.getBomSpecId());
+                    bomVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
+                    bomVo.setBomSpecName(bomSpecBo.getBomSpecName());
+                    bomVo.setQuantity(productionTask.getCompleteQuantity());
+                    outStorageBomVoList.add(bomVo);
+                    quantity = quantity.add(productionTask.getCompleteQuantity());
+                }
+            }
+            // 保存bom数量
+            vo.setSumBomCount(vo.getSumBomCount().add(quantity));
+
+            outStorageBomMap = Stream.concat(outStorageBomMap.values().stream(), outStorageBomVoList.stream())
+                    .collect(Collectors.toMap(
+                            DailyBoardOutStorageBomVo::getBomSpecId,
+                            Function.identity(),
+                            (v1, v2) -> {
+                                v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                return v1;
+                            }
+                    ));
+            // 佰卓订单
+            if (ObjectUtil.equals(orderInfo.getDepartmentId(), department.getId())) {
+                bzCount++;
+                vo.setBzSumOrderCount(bzCount);
+                bzOutStorageBomMap = Stream.concat(bzOutStorageBomMap.values().stream(), outStorageBomVoList.stream())
+                        .collect(Collectors.toMap(
+                                DailyBoardOutStorageBomVo::getBomSpecId,
+                                Function.identity(),
+                                (v1, v2) -> {
+                                    v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                    return v1;
+                                }
+                        ));
+                vo.setBzSumBomCount(vo.getBzSumBomCount().add(quantity));
+            } else {
+                syCount++;
+                vo.setSySumOrderCount(syCount);
+                syOutStorageBomMap = Stream.concat(syOutStorageBomMap.values().stream(), outStorageBomVoList.stream())
+                        .collect(Collectors.toMap(
+                                DailyBoardOutStorageBomVo::getBomSpecId,
+                                Function.identity(),
+                                (v1, v2) -> {
+                                    v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                    return v1;
+                                }
+                        ));
+                vo.setSySumBomCount(vo.getSySumBomCount().add(quantity));
+            }
+        }
+        vo.setOutStorageBomList(new ArrayList<>(outStorageBomMap.values()));
+        vo.setBzOutStorageBomList(new ArrayList<>(bzOutStorageBomMap.values()));
+        vo.setSyOutStorageBomList(new ArrayList<>(syOutStorageBomMap.values()));
+        return vo;
+    }
+
+    @Override
+    public SelfOrderOutStorageVo getSelfOrderOutStorageInfo(BaseSelectDto dto) {
+        SelfOrderOutStorageVo vo = new SelfOrderOutStorageVo();
+        vo.setSumBomCount(BigDecimal.ZERO);
+        vo.setSumOrderCount(0);
+        Date date = dto.getBeginTime();
+        if (date == null) {
+            date = new Date();
+        }
+        Date beginDate = DateUtil.beginOfDay(date);
+        Date endDate = DateUtil.endOfDay(date);
+        // 查询今日出库单出库数据
+        Map<Long, List<ProductionTask>> taskMap = productionTaskService.mapKGroup(ProductionTask::getOrderId, q -> q.between(ProductionTask::getCompleteTime, beginDate, endDate));
+        if (ObjectUtil.isEmpty(taskMap)) {
+            return vo;
+        }
+        // 出库单相关的订单数据
+        List<OrderInfo> orderList = orderService.list(q -> q
+                .eq(OrderInfo::getSource, 1)
+                .eq(OrderInfo::getType, 1)
+                .in(OrderInfo::getId, taskMap.keySet()));
+        if (ObjectUtil.isEmpty(orderList)) {
+            return vo;
+        }
+        vo.setSumOrderCount(orderList.size());
+        // 获取订单sku列表
+        List<Long> orderIds = orderList.stream().map(BaseIdPo::getId).collect(Collectors.toList());
+        List<OrderSku> orderSkuList = orderSkuService.list(q -> q.in(OrderSku::getOrderId, orderIds));
+        // 获取今日订单bom列表
+        List<Long> bomSpecIds = orderSkuList.stream().map(OrderSku::getBomSpecId).collect(Collectors.toList());
+        Map<Long, BomSpecBo> bomSpecBoMap = skuSpecService.getBomSpecBoByIdList(bomSpecIds);
+
+        Map<Long, DailyBoardOutStorageBomVo> outStorageBomMap = new HashMap<>();
+        for (OrderInfo orderInfo : orderList) {
+            BigDecimal quantity = BigDecimal.ZERO;
+            // 当前订单出库数据
+            List<ProductionTask> productionTaskList = taskMap.get(orderInfo.getId());
+            // 出库单中主材bom
+            List<DailyBoardOutStorageBomVo> outStorageBomVoList = new ArrayList<>();
+            for (ProductionTask productionTask : productionTaskList) {
+                BomSpecBo bomSpecBo = bomSpecBoMap.get(productionTask.getBomSpecId());
+                if (Objects.equals(bomSpecBo.getClassifyParentId(), 1L)) {
+                    DailyBoardOutStorageBomVo bomVo = new DailyBoardOutStorageBomVo();
+                    bomVo.setBomSpecId(bomSpecBo.getBomSpecId());
+                    bomVo.setBomSpecCode(bomSpecBo.getBomSpecCode());
+                    bomVo.setBomSpecName(bomSpecBo.getBomSpecName());
+                    bomVo.setQuantity(productionTask.getCompleteQuantity());
+                    outStorageBomVoList.add(bomVo);
+                    quantity = quantity.add(productionTask.getCompleteQuantity());
+                }
+            }
+            // 保存bom数量
+            vo.setSumBomCount(vo.getSumBomCount().add(quantity));
+            outStorageBomMap = Stream.concat(outStorageBomMap.values().stream(), outStorageBomVoList.stream())
+                    .collect(Collectors.toMap(
+                            DailyBoardOutStorageBomVo::getBomSpecId,
+                            Function.identity(),
+                            (v1, v2) -> {
+                                v1.setQuantity(v1.getQuantity().add(v2.getQuantity()));
+                                return v1;
+                            }
+                    ));
+        }
+        vo.setOutStorageBomList(new ArrayList<>(outStorageBomMap.values()));
+        return vo;
+    }
+}