From bce082e11b3eca7e811e5130b6dd6b9ba23d07b7 Mon Sep 17 00:00:00 2001 From: zangzhipeng Date: Wed, 3 Jun 2026 15:38:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=96=E5=8D=8F=E8=AE=A2=E5=8D=95=E4=B8=8B?= =?UTF-8?q?=E8=BE=BE=E6=8E=A5=E6=94=B6=E6=96=B9=E6=B3=95=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../produce/service/IWorkOrderRunService.java | 6 + .../service/impl/WorkOrderRunServiceImpl.java | 135 ++++++++++++++++++ 2 files changed, 141 insertions(+) diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderRunService.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderRunService.java index d476e8ec5..a19a2edd2 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderRunService.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/IWorkOrderRunService.java @@ -79,4 +79,10 @@ public interface IWorkOrderRunService extends BaseService { * @param materialRequisitionQuery */ Map printOemMaterialRequisition(IPage page, MaterialRequisitionQuery materialRequisitionQuery); + + /** + * 外协订单下达ERP(定时任务调用) + * 扫描 oem_out=0 的车间订单,调ERP生成外协订单 + */ + R oemOrderOut(); } diff --git a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderRunServiceImpl.java b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderRunServiceImpl.java index 6cde46237..8d8ac0ce3 100644 --- a/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderRunServiceImpl.java +++ b/blade-service/blade-desk/src/main/java/org/springblade/desk/produce/service/impl/WorkOrderRunServiceImpl.java @@ -652,6 +652,141 @@ public class WorkOrderRunServiceImpl extends BaseServiceImpl workOrders = workOrderMapper.selectList(new LambdaQueryWrapper() + .eq(WorkOrder::getOemOut, "0") + .lt(WorkOrder::getRunStatus, WorkOrder.RUN_STATUS_COMPLETED) + .isNotNull(WorkOrder::getWorId)); + + List errors = new ArrayList<>(); + for (WorkOrder wo : workOrders) { + try { + // 运行记录 + WorkOrderRun workOrderRun = workOrderRunMapper.selectById(wo.getWorId()); + if (workOrderRun == null) { + continue; + } + // 运行记录中无外协商则跳过 + if (workOrderRun.getInCustomer() == null) { + continue; + } + // 生产订单 + YieldOrder yo = yieldOrderMapper.selectById(wo.getYoId()); + if (yo == null) { + continue; + } + // 当前工序 + WorkPlan wp = workPlanMapper.selectById(wo.getWpId()); + if (wp == null) { + continue; + } + // 首道工序 → 生产订单状态设为加工中 + if (wp.getFrontWpId() == null) { + yo.setStatus(5); + yieldOrderMapper.updateById(yo); + } + + Oem oem = oemMapper.selectById(workOrderRun.getInCustomer()); + User planner = UserCache.getUser(wo.getPlanner()); + String wxWoCode; + + if (workOrderRun.getCollaborate() != null && workOrderRun.getCollaborate().equalsIgnoreCase("1")) { + // 协作外协:组装工序名称 + List wpList = workPlanMapper.selectList(new LambdaQueryWrapper() + .eq(WorkPlan::getWoId, wo.getId())); + List processSets = processSetMapper.selectByIds( + wpList.stream().filter(workPlan -> oem.getId().equals(workPlan.getOcId())) + .map(WorkPlan::getPpsId).collect(Collectors.toList())); + String ppsName = processSets.stream().map(BsProcessSetEntity::getName).collect(Collectors.joining(",")); + // 最大计划结束时间 + LocalDateTime maxPlanEndTime = wpList.stream().map(WorkPlan::getPlanEndTime) + .max(LocalDateTime::compareTo).orElse(null); + if (maxPlanEndTime == null) { + maxPlanEndTime = LocalDateTime.now(); + } + wxWoCode = erpDataOemClient.fullOrderOutsourcing( + yo.getPartCode(), yo.getProductIdent(), wo.getBatchNo(), + oem != null ? oem.getCode() : "", ppsName, yo.getYoCode(), + planner != null ? planner.getName() : "", + maxPlanEndTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), + wo.getMakeQty(), "").getData(); + } else { + // 整体外协:获取B号C号 + User user = UserCache.getUser(workOrderRun.getCreateUser()); + User dispatcher = UserCache.getUser(wo.getDispatcher()); + String roamNo = null; + String craftNo = null; + Long craftId = yo.getCraftId(); + if (craftId != null && wo.getReworkCode() == null) { + Map craftInfo = baseMapper.selectRoamAndCraftNoByCraftId(craftId); + roamNo = craftInfo.get("ROAMNO"); + craftNo = craftInfo.get("CRAFTNO"); + if (roamNo == null) { + craftInfo = baseMapper.selectRoamAndCraftNoByPartCode(yo.getPartCode()); + roamNo = craftInfo.get("ROAMNO"); + craftNo = craftInfo.get("CRAFTNO"); + } + } else if (StringUtils.isNotBlank(wo.getReworkCode())) { + roamNo = wo.getReworkCode(); + craftNo = "返修"; + craftId = Long.valueOf(wo.getReworkNo()); + } + String demandDateStr = ""; + if (yo.getDemandDate() != null) { + demandDateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") + .withZone(ZoneId.systemDefault()).format(yo.getDemandDate().toInstant()); + } + wxWoCode = erpDataOemClient.collaborativeOutsourcing( + yo.getPartCode(), yo.getProductIdent(), demandDateStr, wo.getMakeQty(), + yo.getUseDeptCode(), yo.getUseDept(), wo.getBatchNo(), + oem != null ? oem.getCode() : "", yo.getPlate(), yo.getYpCode(), yo.getYoCode(), + user != null ? user.getName() : "", + planner != null ? planner.getName() : "", + dispatcher != null ? dispatcher.getName() : "", + roamNo, craftNo, craftId).getData(); + } + + // ERP返回成功,回写工序状态和车间订单 + if (StringUtils.isNotBlank(wxWoCode)) { + workOrderRun.setWoCode(wxWoCode); + workOrderRunMapper.updateById(workOrderRun); + updateWorkPlanAndOrderStatus(wo, wxWoCode); + workOrderMapper.updateById(wo); + + // 协作外协:生成镀前出库记录 +// if (wo.getOemType() != null && wo.getOemType() == WorkOrder.OEM_TYPE_SINGLE) { +// Long count = plateAroundMapper.selectCount(new LambdaQueryWrapper() +// .eq(PlateAround::getWpId, wo.getWpId()) +// .eq(PlateAround::getPaType, PlateAround.BEFORE_PLAT_IN)); +// if (count > 0) { +// WorkPlan nextPlan = workPlanMapper.selectOne(new LambdaQueryWrapper() +// .eq(WorkPlan::getId, wp.getNextWpId())); +// PlateAround plateAround = new PlateAround(); +// plateAround.setPaCode(generatePaCode()); +// plateAround.setWpId(wo.getWpId()); +// plateAround.setOcId(nextPlan != null ? nextPlan.getOcId() : null); +// plateAround.setPaType((short) 2); +// plateAround.setQuantity(wo.getMakeQty()); +// plateAround.setCurStatus((short) 2); +// plateAround.setCreateUser(wo.getDispatcher()); +// plateAround.setCreateTime(new Date()); +// plateAroundMapper.insert(plateAround); +// } +// } + } + } catch (Exception e) { + errors.add("车间订单" + wo.getWoCode() + "外协下达失败:" + e.getMessage()); + } + } + + if (!errors.isEmpty()) { + return R.fail(String.join(";", errors)); + } + return R.success("外协订单下达完成"); + } + @Transactional(rollbackFor = Exception.class) @Override public R changeOemManufacturer(Long worId, Long ocId) {