cuilei
2025-06-05 18eb8ad4c66fd8515706e2a910ad50ac8f06ba22
lxzn-module-tms/src/main/java/org/jeecg/modules/tms/service/impl/OutboundOrderServiceImpl.java
@@ -30,10 +30,8 @@
import org.jeecg.modules.tms.entity.dto.OutBoundOrderFlowDto;
import org.jeecg.modules.tms.entity.dto.OutBoundRequestDto;
import org.jeecg.modules.tms.entity.dto.OutboundOrderAndDetailDto;
import org.jeecg.modules.tms.enums.OutBillStatus;
import org.jeecg.modules.tms.enums.OutBoundStatusEnum;
import org.jeecg.modules.tms.enums.OutStorehouseType;
import org.jeecg.modules.tms.enums.ToolCirculationStatus;
import org.jeecg.modules.tms.entity.vo.SelectOutboundToolVo;
import org.jeecg.modules.tms.enums.*;
import org.jeecg.modules.tms.mapper.OutboundDetailMapper;
import org.jeecg.modules.tms.convert.OutboundOrderConvert;
import org.jeecg.modules.tms.mapper.OutboundOrderMapper;
@@ -67,6 +65,8 @@
   private IOutStoreDetailService outStoreDetailService;
   @Autowired
   private IBaseToolsService baseToolsService;
   @Autowired
   private IToolsSharpeningService toolsSharpeningService;
   @Autowired
   private ISysBusinessCodeRuleService businessCodeRuleService;
   @Autowired
@@ -206,13 +206,13 @@
         String toolCode = detail.getToolCode();
         List<ToolLedgerDetail> ledgerDetailList = toolLedgerDetailList.stream().filter(item -> Objects.equals(item.getToolCode(), toolCode)
               && Objects.equals(item.getToolId(), detail.getToolId())).collect(Collectors.toList());
         BaseTools tools = baseToolsService.getById(toolCode);
         if (CollectionUtil.isEmpty(ledgerDetailList)) {
            BaseTools tools = baseToolsService.getById(toolCode);
            throw new JeecgBootException("编码为【" + tools.getToolCode() + "】的工具,库存不足!");
         } else {
            ToolLedgerDetail toolLedgerDetail = ledgerDetailList.get(0);
            if (toolLedgerDetail.getQuantity().compareTo(detail.getOutboundQuantity()) < 0) {
               throw new JeecgBootException("编码为【" + toolLedgerDetail.getToolCode() + "】的工具,库存不足!");
               throw new JeecgBootException("编码为【" + tools.getToolCode() + "】的工具,库存不足!");
            } else {
               //扣减台账明细中的库存,执行锁库
               if (StrUtil.isBlank(detail.getToolId())) {
@@ -386,22 +386,32 @@
      Map<String, ToolLedger> toolLedgerMap = toolLedgerService.list(new LambdaQueryWrapper<ToolLedger>().in(ToolLedger::getToolId, toolIdList)).stream()
            .collect(Collectors.toMap(ToolLedger::getToolId, item -> item, (k1, k2) -> k1));
      LambdaQueryWrapper<ToolLedgerDetail> queryWrapper = new LambdaQueryWrapper<>();
      LambdaQueryWrapper<ToolLedgerDetail> ledgerDetailQueryWrapper = new LambdaQueryWrapper<>();
      LambdaQueryWrapper<ToolSharpening> toolSharpenQueryWrapper = new LambdaQueryWrapper<>();
      for (int i = 0; i < outboundDetailList.size(); i++) {
         if (i > 0) {
            queryWrapper.or();
            ledgerDetailQueryWrapper.or();
            toolSharpenQueryWrapper.or();
         }
         OutboundDetail detail = outboundDetailList.get(i);
         queryWrapper.or(wrapper ->
         ledgerDetailQueryWrapper.or(wrapper ->
               wrapper.eq(ToolLedgerDetail::getToolCode, detail.getToolCode())
                     .eq(ToolLedgerDetail::getToolId, detail.getToolId()) //如果不管到把,该字段为空
         );
         toolSharpenQueryWrapper.or(wrapper ->
               wrapper.eq(ToolSharpening::getToolCode, detail.getToolCode())
                     .eq(ToolSharpening::getToolId, detail.getToolId())
                     .eq(ToolSharpening::getSharpeningStatus, SharpenStatus.PENDING.getValue())
         );
      }
      List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(queryWrapper);
      List<ToolLedgerDetail> toolLedgerDetailList = toolLedgerDetailService.list(ledgerDetailQueryWrapper);
      List<ToolSharpening> toolSharpeningList = toolsSharpeningService.list(toolSharpenQueryWrapper);
      List<ToolLedger> toolLedgerUpdateList = CollectionUtil.newArrayList();
      List<ToolLedgerDetail> toolLedgerDetailUpdateList = CollectionUtil.newArrayList();
      List<OutStoreDetail> outStoreAddList = CollectionUtil.newArrayList();
      List<OutboundDetail> outboundDetailUpdateList = CollectionUtil.newArrayList();
      List<ToolSharpening> toolSharpeningUpdateList = CollectionUtil.newArrayList();
      for (OutboundDetail detail : outboundDetailList) {
         //更新库存台账
@@ -448,6 +458,15 @@
                  toolLedgerDetailUpdateList.add(item);
               });
         if (outStorehouseType == OutStorehouseType.GRINDING_OUTBOUND) {
            //更新刃磨单状态
            toolSharpeningList.stream().filter(item -> item.getToolCode().equals(detail.getToolCode()) && item.getToolId().equals(detail.getToolId()))
                  .findFirst().ifPresent(item -> {
                     item.setSharpeningStatus(SharpenStatus.IN_PROGRESS.getValue());
                     toolSharpeningUpdateList.add(item);
                  });
         }
         //记录出库流水
         OutStoreDetail outStoreDetail = new OutStoreDetail()
               .setToolCode(detail.getToolCode())
@@ -473,6 +492,7 @@
      toolLedgerDetailService.updateBatchById(toolLedgerDetailUpdateList);
      outStoreDetailService.saveBatch(outStoreAddList);
      outboundDetailService.updateBatchById(outboundDetailUpdateList);
      toolsSharpeningService.updateBatchById(toolSharpeningUpdateList);
      //更新申请单
      boolean allMatch = outboundDetailService.list(new LambdaQueryWrapper<OutboundDetail>()
@@ -534,7 +554,10 @@
            .toMap(OutBoundAddDto::getToolLedgerDetailId, item -> item, (k1, k2) -> k1));
      Map<String, ToolLedgerDetail> toolLedgerDetailMap = toolLedgerDetailService.listByIds(boundAddDtoMap.keySet()).stream()
            .collect(Collectors.toMap(ToolLedgerDetail::getId, item -> item, (k1, k2) -> k1));
      List<ToolSharpening> toolSharpeningList = toolsSharpeningService.list(new LambdaQueryWrapper<ToolSharpening>()
            .in(ToolSharpening::getToolCode, toolBoundQuantityMap.keySet()).eq(ToolSharpening::getSharpeningStatus, SharpenStatus.PENDING.getValue()));
      List<ToolLedgerDetail> toolLedgerDetailUpdateList = CollectionUtil.newArrayList();
      List<ToolSharpening> toolSharpeningUpdateList = CollectionUtil.newArrayList();
      for (String toolLedgerDetailId : boundAddDtoMap.keySet()) {
         OutBoundAddDto outBoundAddDto = boundAddDtoMap.get(toolLedgerDetailId);
         BigDecimal outboundQuantity = outBoundAddDto.getOutboundQuantity();
@@ -563,6 +586,12 @@
                     break;
                  case GRINDING_OUTBOUND:
                     toolLedgerDetail.setStatus(ToolCirculationStatus.GRINDING.getValue());
                     //同时更新刃磨单状态
                     toolSharpeningList.stream().filter(item -> item.getToolCode().equals(outBoundAddDto.getToolCode())
                           && item.getToolId().equals(outBoundAddDto.getToolId())).findFirst().ifPresent(item -> {
                        item.setSharpeningStatus(SharpenStatus.IN_PROGRESS.getValue());
                        toolSharpeningUpdateList.add(item);
                     });
                     break;
                  default:
                     throw new JeecgBootException("未知的出库类型!");
@@ -573,6 +602,7 @@
      }
      toolLedgerService.updateBatchById(toolLedgerUpdateList);
      toolLedgerDetailService.updateBatchById(toolLedgerDetailUpdateList);
      toolsSharpeningService.updateBatchById(toolSharpeningUpdateList);
      //记录出库流水
      List<OutStoreDetail> outStoreAddList = CollectionUtil.newArrayList();
      for (OutBoundAddDto outBoundAddDto : boundAddList) {
@@ -588,6 +618,53 @@
      outStoreDetailService.saveBatch(outStoreAddList);
   }
   @Override
   public IPage<SelectOutboundToolVo> querySharpenOutboundToolPageList(Page<SelectOutboundToolVo> page, Map<String, String[]> parameterMap) {
      QueryWrapper<SelectOutboundToolVo> queryWrapper = Wrappers.query();
      String[] toolCodes = parameterMap.get("toolCode");
      if (toolCodes != null && toolCodes.length > 0) {
         queryWrapper.like("t3.tool_code", toolCodes[0]);
      }
      String[] classifyIds = parameterMap.get("classifyId");
      if (classifyIds != null && classifyIds.length > 0) {
         queryWrapper.eq("t3.classify_id", classifyIds[0]);
      }
      String[] excludeIds = parameterMap.get("excludeIds");
      if (excludeIds != null && excludeIds.length > 0) {
         String[] idArray = excludeIds[0].split(",");
         queryWrapper.notIn("t1.id", idArray);
      }
      queryWrapper.eq("t1.sharpening_status", SharpenStatus.PENDING.getValue());
      return this.baseMapper.querySharpenOutboundToolPageList(page, queryWrapper);
   }
   @Override
   public IPage<SelectOutboundToolVo> queryBorrowOutboundToolPageList(Page<SelectOutboundToolVo> page, Map<String, String[]> parameterMap) {
      QueryWrapper<SelectOutboundToolVo> queryWrapper = Wrappers.query();
      String[] toolCodes = parameterMap.get("toolCode");
      if (toolCodes != null && toolCodes.length > 0) {
         queryWrapper.like("p.tool_code", toolCodes[0]);
      }
      String[] statuses = parameterMap.get("status");
      if (statuses != null && statuses.length > 0) {
         queryWrapper.eq("t.status", statuses[0]);
      }
      String[] quantities = parameterMap.get("quantity");
      if (quantities != null && quantities.length > 0) {
         queryWrapper.gt("t.quantity", quantities[0]);
      }
      String[] classifyIds = parameterMap.get("classifyId");
      if (classifyIds != null && classifyIds.length > 0) {
         queryWrapper.eq("p.classify_id", classifyIds[0]);
      }
      String[] excludeIds = parameterMap.get("excludeIds");
      if (excludeIds != null && excludeIds.length > 0) {
         String[] idArray = excludeIds[0].split(",");
         queryWrapper.notIn("t.id", idArray);
      }
      return this.baseMapper.queryBorrowOutboundToolPageList(page, queryWrapper);
   }
   private boolean fromOneApply(List<OutBoundRequestDto> outBoundRequestList) {
      long count = outBoundRequestList.stream().map(OutBoundRequestDto::getOutBoundOrderId).distinct().count();