|  |  | 
 |  |  | import com.dy.pmsGlobal.pojoPr.PrProductionNode; | 
 |  |  | import com.dy.pmsGlobal.pojoPr.PrWorkingInstruction; | 
 |  |  | import com.dy.pmsGlobal.pojoSta.*; | 
 |  |  | import com.dy.pmsGlobal.util.DeviceResult; | 
 |  |  | import com.dy.pmsGlobal.util.DeviceStatus; | 
 |  |  | import com.dy.pmsGlobal.util.QrCodeConstant; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | 
 |  |  | import org.springframework.stereotype.Service; | 
 |  |  | import org.springframework.transaction.annotation.Transactional; | 
 |  |  |  | 
 |  |  | import java.math.BigInteger; | 
 |  |  | import java.util.*; | 
 |  |  | import java.util.stream.Collectors; | 
 |  |  |  | 
 |  |  | @Slf4j | 
 |  |  | @Service | 
 |  |  | 
 |  |  |     private OthFileMapper othFileMapper; | 
 |  |  |     @Value("${dy.webFile.fmUrl}") | 
 |  |  |     private String fmUrl; | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setDeviceLastDao(StaDeviceLastMapper deviceLastDao) { | 
 |  |  |         this.deviceLastDao = deviceLastDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setDeviceLifeDao(StaDeviceLifeMapper deviceLifeDao) { | 
 |  |  |         this.deviceLifeDao = deviceLifeDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setWipSnExDao(StaWipSnExMapper wipSnExDao) { | 
 |  |  |         this.wipSnExDao = wipSnExDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setDeviceProductionLogDao(StaDeviceProductionLogMapper deviceProductionLogDao) { | 
 |  |  |         this.deviceProductionLogDao = deviceProductionLogDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setAssemblyWorkLastDao(StaAssemblyWorkLastMapper assemblyWorkLastDao) { | 
 |  |  |         this.assemblyWorkLastDao = assemblyWorkLastDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setAssemblyPlanDao(PrAssemblyPlanMapper assemblyPlanDao) { | 
 |  |  |         this.assemblyPlanDao = assemblyPlanDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setNodeDao(PrProductionNodeMapper nodeDao) { | 
 |  |  |         this.nodeDao = nodeDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setRepairInfoDao(StaRepairInfoMapper repairInfoDao) { | 
 |  |  |         this.repairInfoDao = repairInfoDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setQualityItemsDao(PltProductQualityInspectionItemsMapper qualityItemsDao) { | 
 |  |  |         this.qualityItemsDao = qualityItemsDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setTestItemsDao(PltProductTestInspectionItemsMapper testItemsDao) { | 
 |  |  |         this.testItemsDao = testItemsDao; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setProductDao(PltProductMapper productDao) { | 
 |  |  |         this.productDao = productDao; | 
 |  |  | 
 |  |  |     public void setOthFileMapper(OthFileMapper othFileMapper) { | 
 |  |  |         this.othFileMapper = othFileMapper; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     public void setDeviceLifeLastDao(StaDeviceLifeLastMapper deviceLifeLastDao) { | 
 |  |  |         this.deviceLifeLastDao = deviceLifeLastDao; | 
 |  |  | 
 |  |  |         Set<String> deviceSet = new HashSet<>(Arrays.asList(params.deviceNo)); | 
 |  |  |         // 分类设备号和物料号 | 
 |  |  |         List<String> deviceList = new ArrayList<>(); | 
 |  |  |         List<String> materialList = new ArrayList<>(); | 
 |  |  |         List<Map<String, String>> materialList = new ArrayList<>(); | 
 |  |  |         List<PltProduct> productList = productDao.selectAll(null); | 
 |  |  |         deviceSet.forEach(device -> { | 
 |  |  |             if (device.contains(plan.batchNo)) { | 
 |  |  |                 deviceList.add(device); | 
 |  |  |             } else if(isOurProduct(device,productList)){ | 
 |  |  |                 materialList.add(device); | 
 |  |  |         deviceSet.forEach(deviceNo -> { | 
 |  |  |             if (deviceNo.contains(plan.batchNo)) { | 
 |  |  |                 deviceList.add(deviceNo); | 
 |  |  |             } else { | 
 |  |  |                 //判断是不是是本厂物料,如果是,则添加物料到ex表中 | 
 |  |  |                 Map<String, String> result = queryByDeviceNo(deviceNo, productList); | 
 |  |  |                 if (StringUtils.isNotBlank(result.get("proName"))) { | 
 |  |  |                     materialList.add(result); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         }); | 
 |  |  |  | 
 |  |  | 
 |  |  |             throw new RuntimeException("设备号(" + Arrays.toString(params.deviceNo) + ")均不属于当前任务计划"); | 
 |  |  |         } | 
 |  |  |         if (deviceList.size() > 1) { | 
 |  |  |             throw new RuntimeException("设备号有且只能有一个属于当前任务计划"); | 
 |  |  |             throw new RuntimeException("在产设备(" + deviceList.stream().collect(Collectors.joining(",")) + ")有且只能有一个属于当前任务计划"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         StaDeviceLast deviceLast = buildDeviceLast(params, workLast, deviceList.get(0)); | 
 |  |  | 
 |  |  |             saveDeviceLife(deviceLast); | 
 |  |  |         } | 
 |  |  |         if (CollectionUtils.isNotEmpty(materialList)) { | 
 |  |  |             saveSnEx(workLast, deviceList, materialList, plan); | 
 |  |  |             saveSnEx(workLast, deviceList, materialList); | 
 |  |  |         } | 
 |  |  |         return count; | 
 |  |  |     } | 
 |  |  | 
 |  |  |         BeanUtils.copyProperties(deviceLast, lastLife); | 
 |  |  |         lastLife.setId(null); | 
 |  |  |         int count = deviceLifeLastDao.updateByDeviceNo(lastLife); | 
 |  |  |         if (count == 0){ | 
 |  |  |         if (count == 0) { | 
 |  |  |             deviceLifeLastDao.insertSelective(lastLife); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private StaDeviceLast buildDeviceLast(QueryVo params, StaAssemblyWorkLast workLast,String deviceNo) { | 
 |  |  |     private StaDeviceLast buildDeviceLast(QueryVo params, StaAssemblyWorkLast workLast, String deviceNo) { | 
 |  |  |         //组装数据 | 
 |  |  |         StaDeviceLast record = new StaDeviceLast(); | 
 |  |  |         //pr_assembly_plan input_number +1  投入数加1 | 
 |  |  |         PrAssemblyPlan assemblyPlan = assemblyPlanDao.selectByPrimaryKey(workLast.planId); | 
 |  |  |         //pr_assembly_plan input_number +1  投入数加1   根据deviceNo 找到对应任务 | 
 |  |  |         PrAssemblyPlan assemblyPlan = queryPlanByDeviceNo(deviceNo); //PrAssemblyPlan assemblyPlan = assemblyPlanDao.selectByPrimaryKey(workLast.planId); | 
 |  |  |         StaDeviceLast preRecord = deviceLastDao.selectByDeviceNo(deviceNo); | 
 |  |  |         if (preRecord != null) { | 
 |  |  |             record.id = preRecord.id; | 
 |  |  |             record.inTime = preRecord.outTime; | 
 |  |  |             record.outLineTime = preRecord.outLineTime; | 
 |  |  |         }else{ | 
 |  |  |             record.outLineTime = preRecord.outLineTime;//下边判断是否结束会用到 得留着 | 
 |  |  |         } else { | 
 |  |  |             record.inTime = new Date(); | 
 |  |  |             record.inLineTime = new Date(); | 
 |  |  |             assemblyPlan.setInputNumber(assemblyPlan.getInputNumber() + 1); | 
 |  |  | 
 |  |  |         record.assistants = workLast.assistants; | 
 |  |  |         record.errorMsg = params.errorMsg; | 
 |  |  |  | 
 |  |  |         Boolean isEnd = false;//是否经历过结束节点 | 
 |  |  |         PrProductionNode node = nodeDao.selectByPrimaryKey(workLast.nodeId); | 
 |  |  |         record.nodeContent = node.content; | 
 |  |  |         if (node.isRecord) { | 
 |  |  |             record.deviceCycleContent = node.deviceCycleContent; | 
 |  |  |         } | 
 |  |  |         if(node.getIsEnd() && record.outLineTime == null){ | 
 |  |  |         if (node.getIsEnd() && record.outLineTime == null) { | 
 |  |  |             record.outLineTime = new Date(); | 
 |  |  |             assemblyPlan.setOutputNumber(assemblyPlan.getOutputNumber() + 1); | 
 |  |  |             isEnd = true; | 
 |  |  |         }else if(record.outLineTime != null){ | 
 |  |  |             isEnd = true; | 
 |  |  |         } | 
 |  |  |         assemblyPlanDao.updateByPrimaryKeySelective(assemblyPlan); | 
 |  |  |         record.status = getStatus(params.status, node.isEnd,workLast.workType.toString()); | 
 |  |  |         if(record.status == null){ | 
 |  |  |             record.status = preRecord.status; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         record.status = getStatus(params.status, isEnd, workLast.workType.toString()); | 
 |  |  |         record.result = getResult(params.status, workLast.workType.toString()); | 
 |  |  |         return record; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void saveSnEx(StaAssemblyWorkLast workLast, List<String> deviceList, List<String> materialList, PrAssemblyPlan plan) { | 
 |  |  |         for (String material : materialList) { | 
 |  |  |     private void saveSnEx(StaAssemblyWorkLast workLast, List<String> deviceList, List<Map<String, String>> materialList) { | 
 |  |  |         for (Map<String, String> material : materialList) { | 
 |  |  |             StaWipSnEx snEx = new StaWipSnEx(); | 
 |  |  |             snEx.deviceNo = deviceList.get(0); | 
 |  |  |             snEx.productId = plan.process.proId; | 
 |  |  |             snEx.productNo = material; | 
 |  |  |             snEx.productNo = material.get("deviceNo"); | 
 |  |  |             snEx.productName = material.get("proName"); | 
 |  |  |             snEx.productId = Long.parseLong(material.get("proId")); | 
 |  |  |             snEx.createTime = workLast.startTime; | 
 |  |  |             snEx.createBy = workLast.userId; | 
 |  |  |             snEx.productName = plan.proName; | 
 |  |  |  | 
 |  |  |             wipSnExDao.insertSelective(snEx); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 状态: 0:待生产,1:组装中,2:完成,3:维修,4:报废,5:测试不通过,6:品检不通过 | 
 |  |  |      * | 
 |  |  |      * 原状态: 0:待生产,1:组装中,2:完成,3:维修,4:报废,5:测试不通过,6:品检不通过 | 
 |  |  |      *20240717当前状态  状态: 1, 组装中,2:完成,3:维修,4:报废 | 
 |  |  |      * @param status    状态 | 
 |  |  |      * @param isEndNode 是否结束节点 | 
 |  |  |      * @param isEnd 是否经历过结束节点 | 
 |  |  |      * @return 状态 | 
 |  |  |      */ | 
 |  |  |     private Integer getStatus(String status, boolean isEndNode,String workType) { | 
 |  |  |         //组装,维修 | 
 |  |  |         if (WORK_TYPE_ASSEMBLY.equals(workType)||WORK_TYPE_REPAIR.equals(workType)) { | 
 |  |  |     private Integer getStatus(String status, boolean isEnd, String workType) { | 
 |  |  |         //组装   2024/07/17 目前组装workType 1 只有MarkOk     //测试    //品检 | 
 |  |  |         if (WORK_TYPE_ASSEMBLY.equals(workType) || WORK_TYPE_TEST.equals(workType) || WORK_TYPE_INSPECTION.equals(workType) || WORK_TYPE_REPAIR.equals(workType)) { | 
 |  |  |             return switch (status) { | 
 |  |  |                 case QrCodeConstant.MarkOk -> isEndNode? DeviceStatus.COMPLETED.getCode(): DeviceStatus.ASSEMBLING.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkUnqualified, QrCodeConstant.MarkPreUnqualified -> DeviceStatus.REPAIR.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkOk -> isEnd ? DeviceStatus.COMPLETED.getCode() : DeviceStatus.ASSEMBLING.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkQualified -> isEnd ? DeviceStatus.COMPLETED.getCode() : DeviceStatus.ASSEMBLING.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkUnqualified -> DeviceStatus.REPAIR.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkWaste -> DeviceStatus.WASTE.getCode(); | 
 |  |  |                 default -> throw new RuntimeException("状态错误"); | 
 |  |  |             }; | 
 |  |  |         //品检,测试 | 
 |  |  |         }else if(WORK_TYPE_INSPECTION.equals(workType)||WORK_TYPE_TEST.equals(workType)){ | 
 |  |  |         } | 
 |  |  |         //维修 | 
 |  |  |         throw new RuntimeException("状态错误,无效的节点类型: " + workType); | 
 |  |  |     } | 
 |  |  |     /** | 
 |  |  |      * 结果: 1:通过,2:测试通过,3:品检通过,4:维修通过,5:测试不通过,6:品检不通过,7:报废 | 
 |  |  |      * @param status    前端出来的状态 | 
 |  |  |      * @return 结果 | 
 |  |  |      */ | 
 |  |  |     private Integer getResult(String status, String workType) { | 
 |  |  |         //组装 | 
 |  |  |         if (WORK_TYPE_ASSEMBLY.equals(workType)) { | 
 |  |  |             return switch (status) { | 
 |  |  |                 case QrCodeConstant.MarkOk -> null;//DeviceStatus.COMPLETED.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkUnqualified -> DeviceStatus.TEST_FAILED.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkWaste -> DeviceStatus.WASTE.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkOk -> DeviceResult.PASS.getCode(); | 
 |  |  |                 default -> throw new RuntimeException("状态错误"); | 
 |  |  |             }; | 
 |  |  |             //测试 | 
 |  |  |         }else if (WORK_TYPE_TEST.equals(workType)) { | 
 |  |  |             return switch (status) { | 
 |  |  |                 case QrCodeConstant.MarkQualified  -> DeviceResult.TEST_PASS.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkUnqualified -> DeviceResult.TEST_FAIL.getCode(); | 
 |  |  |                 default -> throw new RuntimeException("状态错误"); | 
 |  |  |             }; | 
 |  |  |             //品检 | 
 |  |  |         }else if (WORK_TYPE_INSPECTION.equals(workType)) { | 
 |  |  |             return switch (status) { | 
 |  |  |                 case QrCodeConstant.MarkQualified -> DeviceResult.INSPECTION_PASS.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkUnqualified -> DeviceResult.INSPECTION_FAIL.getCode(); | 
 |  |  |                 default -> throw new RuntimeException("状态错误"); | 
 |  |  |             }; | 
 |  |  |             //维修 | 
 |  |  |         }else if (WORK_TYPE_REPAIR.equals(workType)) { | 
 |  |  |             return switch (status) { | 
 |  |  |                 case QrCodeConstant.MarkOk -> DeviceResult.REPAIR_PASS.getCode(); | 
 |  |  |                 case QrCodeConstant.MarkWaste -> DeviceResult.WASTE.getCode(); | 
 |  |  |                 default -> throw new RuntimeException("状态错误"); | 
 |  |  |             }; | 
 |  |  |         } | 
 |  |  |         throw new RuntimeException("状态错误,无效的节点类型: " + workType); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Transactional | 
 |  |  |     public int repair(QueryVo vo) { | 
 |  |  |         long workId = Long.parseLong(vo.workId); | 
 |  |  |         StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(workId); | 
 |  |  | 
 |  |  |         return count; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Transactional | 
 |  |  |     public int testing(QueryVo vo) { | 
 |  |  |         long workId = Long.parseLong(vo.workId); | 
 |  |  |         StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(workId); | 
 |  |  |         if (workLast == null) { | 
 |  |  |             throw new RuntimeException("系统中没有该条登录信息"); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         StaDeviceLast deviceLast = buildDeviceLast(vo, workLast, vo.deviceNo[0]); | 
 |  |  |         int count = deviceLast.id == null ? deviceLastDao.insertSelective(deviceLast) : | 
 |  |  |                 deviceLastDao.updateByPrimaryKeySelective(deviceLast); | 
 |  |  |         saveDeviceProductionLog(deviceLast); | 
 |  |  |         PrProductionNode node = nodeDao.selectByPrimaryKey(workLast.nodeId); | 
 |  |  |         if (node.isRecord) { | 
 |  |  |             saveDeviceLife(deviceLast); | 
 |  |  |         } | 
 |  |  |         return count; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Transactional | 
 |  |  |     public int inspectQuality(QueryVo vo) { | 
 |  |  |         long workId = Long.parseLong(vo.workId); | 
 |  |  |         StaAssemblyWorkLast workLast = assemblyWorkLastDao.selectByPrimaryKey(workId); | 
 |  |  |         if (workLast == null) { | 
 |  |  |             throw new RuntimeException("系统中没有该条登录信息"); | 
 |  |  |         } | 
 |  |  |         StaDeviceLast deviceLast = buildDeviceLast(vo, workLast, vo.deviceNo[0]); | 
 |  |  |         int count = deviceLast.id == null ? deviceLastDao.insertSelective(deviceLast) : | 
 |  |  |                 deviceLastDao.updateByPrimaryKeySelective(deviceLast); | 
 |  |  |         saveDeviceProductionLog(deviceLast); | 
 |  |  |         PrProductionNode node = nodeDao.selectByPrimaryKey(workLast.nodeId); | 
 |  |  |         if (node.isRecord) { | 
 |  |  |             saveDeviceLife(deviceLast); | 
 |  |  |         } | 
 |  |  |         return count; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //根据节点查出节点作业指导书 | 
 |  |  |     public PrProductionNode getSopByNodeId(String nodeId) { | 
 |  |  |         if(com.alibaba.excel.util.StringUtils.isBlank(nodeId)){ | 
 |  |  |         if (com.alibaba.excel.util.StringUtils.isBlank(nodeId)) { | 
 |  |  |             throw new RuntimeException("节点ID不能为空"); | 
 |  |  |         } | 
 |  |  |         PrProductionNode node = nodeDao.selectByPrimaryKey(Long.parseLong(nodeId)); | 
 |  |  |         if(node == null){ | 
 |  |  |         if (node == null) { | 
 |  |  |             throw new RuntimeException("节点ID不存在,请检查"); | 
 |  |  |         } | 
 |  |  |         if(node.instruction != null){ | 
 |  |  |         if (node.instruction != null) { | 
 |  |  |             addUrl(node.instruction); | 
 |  |  |         } | 
 |  |  |         return  node; | 
 |  |  |         return node; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //主要技术参数    俩个方法同 platform-->product-->productSv | 
 |  |  |     public List<PltProductParams> getParamsByProId(String proId) { | 
 |  |  |         if(StringUtils.isBlank(proId)){ | 
 |  |  |         if (StringUtils.isBlank(proId)) { | 
 |  |  |             throw new RuntimeException("产品ID不能为空"); | 
 |  |  |         } | 
 |  |  |         List<PltProductParams> proParams = paramsDao.selectParams(Long.parseLong(proId)); | 
 |  |  |         return  proParams; | 
 |  |  |         return proParams; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     // 根据产品查出产品文件 | 
 |  |  |     public List<PltProductFile> getFileByProId(String proId) { | 
 |  |  |         if(StringUtils.isBlank(proId)){ | 
 |  |  |         if (StringUtils.isBlank(proId)) { | 
 |  |  |             throw new RuntimeException("产品ID不能为空"); | 
 |  |  |         } | 
 |  |  |         List<PltProductFile> proFiles = productFileDao.selectDocuments(Long.parseLong(proId)); | 
 |  |  | 
 |  |  |             doc.orgName = file.orgName; | 
 |  |  |             doc.extName = file.extName; | 
 |  |  |         }); | 
 |  |  |         return  proFiles; | 
 |  |  |         return proFiles; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public List<PltProductQualityInspectionItems> getQualityItems(String proId) { | 
 |  |  | 
 |  |  |         return testItemsDao.selectSome(params); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private boolean isOurProduct(String deviceNo, List<PltProduct> products){ | 
 |  |  |         if(StringUtils.isNotEmpty(deviceNo) && deviceNo.length() ==22 ){ | 
 |  |  |             for(PltProduct product:products){ | 
 |  |  |                 if(deviceNo.startsWith(QrCodeConstant.TypeProduct + product.getCode())){ | 
 |  |  |     private boolean isOurProduct(String deviceNo, List<PltProduct> products) { | 
 |  |  |         if (StringUtils.isNotEmpty(deviceNo) && deviceNo.length() == 22) { | 
 |  |  |             for (PltProduct product : products) { | 
 |  |  |                 if (deviceNo.startsWith(QrCodeConstant.TypeProduct + product.getCode())) { | 
 |  |  |                     return true; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         return false; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void addUrl(PrWorkingInstruction ins) { | 
 |  |  |         if (ins == null || ins.fileId == null) { | 
 |  |  |             return; | 
 |  |  | 
 |  |  |         ins.orgName = file.orgName; | 
 |  |  |         ins.extName = file.extName; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private PltProduct addWebUrl(PltProduct pro) { | 
 |  |  |         if (pro != null) { | 
 |  |  |             if (pro.image != null) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |         return pro; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private String getFilePathWithWebUrl(Long fileId) { | 
 |  |  |         OthFile file = othFileMapper.selectByPrimaryKey(fileId); | 
 |  |  |         FileRestVo fileRestVo = fileOperate.parseHashcode(fmUrl, file.hash); | 
 |  |  |         return fileRestVo.fileWebUrl + file.filePath; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public Map<String,String> queryByDeviceNo(String deviceNo) { | 
 |  |  |         Map<String,String> map = new HashMap<>(); | 
 |  |  |     public Map<String, String> queryByDeviceNo(String deviceNo,List<PltProduct> productList) { | 
 |  |  |         Map<String, String> map = new HashMap<>(); | 
 |  |  |         map.put("deviceNo", deviceNo); | 
 |  |  |         map.put("proName", ""); | 
 |  |  |         map.put("proType", ""); | 
 |  |  |  | 
 |  |  |         PltProduct product = productDao.selectByCode(deviceNo.substring(3,6)); | 
 |  |  |         if(product != null){ | 
 |  |  |         map.put("proId", ""); | 
 |  |  |         map.put("proCode", ""); | 
 |  |  |         //判断是不是是本厂物料 | 
 |  |  |         if(CollectionUtils.isEmpty(productList)){ | 
 |  |  |             productList = productDao.selectAll(null); | 
 |  |  |         } | 
 |  |  |         PltProduct product = null; | 
 |  |  |         if (StringUtils.isNotEmpty(deviceNo) && deviceNo.length() == 22) { | 
 |  |  |             product = productList.stream().filter(p -> deviceNo.startsWith(QrCodeConstant.TypeProduct + p.getCode())).findFirst().orElse(null); | 
 |  |  |         } | 
 |  |  |         if (product != null) { | 
 |  |  |             map.put("deviceNo", deviceNo); | 
 |  |  |             map.put("proName", product.getName()); | 
 |  |  |             map.put("proType", product.getType()); | 
 |  |  |             BigInteger proId = BigInteger.valueOf(product.getId()); | 
 |  |  |             map.put("proId", proId.toString()); | 
 |  |  |             map.put("proCode",product.getCode()); | 
 |  |  |         } | 
 |  |  |         /*else{ | 
 |  |  |             throw new RuntimeException("该编码("+deviceNo +")不是主要物料(系统中管控的其他设备)"); | 
 |  |  |         }*/ | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //查询产品所在的任务 | 
 |  |  |     public PrAssemblyPlan queryPlanByDeviceNo(String deviceNo) { | 
 |  |  |         String proCode = ""; | 
 |  |  |         String lotCode = ""; | 
 |  |  |         if (StringUtils.isNotEmpty(deviceNo) && deviceNo.length() == 22) { | 
 |  |  |             proCode = deviceNo.substring(3,6); | 
 |  |  |             lotCode = deviceNo.substring(6,15); | 
 |  |  |         } | 
 |  |  |         PrAssemblyPlan plan = assemblyPlanDao.selectByDeviceNo(proCode,lotCode); | 
 |  |  |         if(plan != null){ | 
 |  |  |             plan.setBatchNo(lotCode); | 
 |  |  |         } | 
 |  |  |         return plan; | 
 |  |  |     } | 
 |  |  |     public List<StaDeviceLife> queryLifeByDeviceNo(String deviceNo) { | 
 |  |  |         return deviceLifeDao.selectByDeviceNo(deviceNo); | 
 |  |  |     } | 
 |  |  | 
 |  |  |     public List<StaDeviceProductionLog> queryLogByDeviceNo(String devoiceNo) { | 
 |  |  |         return deviceProductionLogDao.selectByDeviceNo(devoiceNo); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  | } |