package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.whyc.constant.UserOperation; import com.whyc.dto.FIleSilkLock; import com.whyc.dto.FileDirPath; import com.whyc.dto.Response; import com.whyc.dto.ZipUtils; import com.whyc.mapper.AttachLockMapper; import com.whyc.mapper.MaterialMapper; import com.whyc.mapper.ProductBomHistoryMapper; import com.whyc.mapper.ProductHistoryMapper; import com.whyc.pojo.*; import com.whyc.util.ActionUtil; import com.whyc.util.CommonUtil; import com.whyc.util.ImageDiff; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.IndexedColors; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.*; import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; @Service public class ProductBomHistoryService { @Autowired(required = false) private ProductBomHistoryMapper mapper; @Autowired(required = false) private ProductHistoryMapper pHistoryMapper; @Autowired(required = false) private MaterialMapper cponentMapper; @Autowired private DocLogService logService; @Autowired private ProductBomService bomService; @Autowired @Lazy private ProductService productService; @Autowired(required = false) private AttachLockMapper attachLockMapper; @Autowired private MaterialService materialService; //根据子件名称和母料型号查询历史版本记录 public Response getBomHistoryByPModelAndSName(String pmodel, String sname) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("parent_model",pmodel); wrapper.eq("sub_name",sname); wrapper.orderByAsc("s_version"); List list=mapper.selectList(wrapper); return new Response().setII(1,list.size()>0,list,"返回数据"); } /**指定版本的产品bom*/ public List getListByParentModel(String parentModel, Integer version) { QueryWrapper query = Wrappers.query(); query.eq("parent_model",parentModel).ge("e_version",version).le("s_version",version); return mapper.selectList(query); } public void addBatch(List newHistoryList) { mapper.insertBatchSomeColumn(newHistoryList); } public void updateVersionBatch(List newVersionCurrentHistoryList) { mapper.updateVersionBatch(newVersionCurrentHistoryList); } /* //查询具体某一版本产品信息 public Response getBoomByVersion(String parentModel, int version) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("parent_model",parentModel); wrapper.le("s_version",version); wrapper.ge("e_version",version); List list=mapper.selectList(wrapper); //查询出存在替换关系得散装件 List replaceBomHis=cponentMapper.getReplaceHisMaterial(parentModel,version); //两个集合合并才是最终的BOM if(list!=null&&list.size()>0){ if(replaceBomHis!=null&&replaceBomHis.size()>0){ replaceBomHis.stream().forEach(replaceBom->{ replaceBom.setReplaceStatus(1); list.add(replaceBom); }); } } return new Response().setII(1,list.size()>0,list,""); }*/ //历史产品信息查看(根据历史产品产品id和版本查询子件及其关联的物料信息) public Response getBomHistoryAndMaterial(int productId, int version) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("id",productId); wrapper.eq("version",version); wrapper.last("limit 1"); ProductHistory pHistory=pHistoryMapper.selectOne(wrapper); List list=mapper.getBomHistoryAndMaterial(productId,pHistory.getSubVersionMax()); if(list!=null&&list.size()>0){ list.stream().forEach(bomH -> { if(bomH.getDwgUrl()!=null){ QueryWrapper qwrapper=new QueryWrapper(); qwrapper.eq("material_id",bomH.getMaterialId()); qwrapper.eq("attach_name",bomH.getDwgUrl().substring(bomH.getDwgUrl().lastIndexOf("\\")+1)); qwrapper.eq("lock_flag",1); qwrapper.last("limit 1"); AttachLock attachLock=attachLockMapper.selectOne(qwrapper); if(attachLock!=null){ bomH.setDwgUrl(""); } } }); } //查询产品的软件 List listsoft=mapper.selectSoftware(pHistory.getParentCode()); //将没有管理BOM的dwg文件 String withOutDwg="doc_file/product"+File.separator+pHistory.getParentModel(); if(pHistory.getCustomCode()!=null&&!pHistory.getCustomCode().isEmpty()){ withOutDwg+=File.separator+pHistory.getCustomCode()+File.separator+version; }else{ withOutDwg+=File.separator+"standard"+File.separator+version; } String fileDirName = FileDirPath.getFileDirName(); //将没有管理BOM的dwg文件(丝印)拷贝下载 fileDirName=fileDirName+File.separator+withOutDwg; File start = new File(fileDirName); FIleSilkLock fIleSilkLock=new FIleSilkLock(); String[] files =new String[]{}; if(start.exists()) { files= start.list();//获取该文件夹下的所有文件名字 if(files.length>=0){ for(int i=0;i attachLocks=mapper.selectInAttachLock(productId); fIleSilkLock.setAttachLocks(attachLocks); return new Response().setIIII(1,list.size()>0,list,listsoft,fIleSilkLock,"返回物料信息及关联物料"); } //历史产品信息查看(产品中有0120开头的物料其实是产品,查看产品信息) public Response getBomHistoryAndMaterial_0120(String parentCode, String parentName, String parentModel) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("parent_code",parentCode); wrapper.eq("parent_name",parentName); wrapper.eq("parent_model",parentModel); wrapper.eq("enabled",1); wrapper.last("limit 1"); ProductHistory pHistory=pHistoryMapper.selectOne(wrapper); int productId =pHistory.getId(); int version = pHistory.getVersion(); List list=mapper.getBomHistoryAndMaterial(productId,pHistory.getSubVersionMax()); if(list!=null&&list.size()>0){ list.stream().forEach(bomH -> { if(bomH.getDwgUrl()!=null){ QueryWrapper qwrapper=new QueryWrapper(); qwrapper.eq("material_id",bomH.getMaterialId()); qwrapper.eq("attach_name",bomH.getDwgUrl().substring(bomH.getDwgUrl().lastIndexOf("\\")+1)); qwrapper.eq("lock_flag",1); qwrapper.last("limit 1"); AttachLock attachLock=attachLockMapper.selectOne(qwrapper); if(attachLock!=null){ bomH.setDwgUrl(""); } } }); } //查询产品的软件 List listsoft=mapper.selectSoftware(pHistory.getParentCode()); //将没有管理BOM的dwg文件 String withOutDwg="doc_file/product"+File.separator+pHistory.getParentModel(); if(pHistory.getCustomCode()!=null&&!pHistory.getCustomCode().isEmpty()){ withOutDwg+=File.separator+pHistory.getCustomCode()+File.separator+version; }else{ withOutDwg+=File.separator+"standard"+File.separator+version; } String fileDirName = FileDirPath.getFileDirName(); //将没有管理BOM的dwg文件(丝印)拷贝下载 fileDirName=fileDirName+File.separator+withOutDwg; File start = new File(fileDirName); FIleSilkLock fIleSilkLock=new FIleSilkLock(); String[] files =new String[]{}; if(start.exists()) { files= start.list();//获取该文件夹下的所有文件名字 if(files.length>=0){ for(int i=0;i attachLocks=mapper.selectInAttachLock(productId); fIleSilkLock.setAttachLocks(attachLocks); return new Response().setIIII(1,list.size()>0,list,listsoft,fIleSilkLock,"返回物料信息及关联物料"); } //历史产品下载(产品id和版本<下载的版本>) public void downloadProductHistory(HttpServletRequest req, HttpServletResponse resp, int productId, int version , String oprateReason, String oprateInfo) { //读取产品信息 QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("id",productId); wrapper.eq("version",version); wrapper.last("limit 1"); ProductHistory pHistory=pHistoryMapper.selectOne(wrapper); //读取指定版本产品的子件和关联的物料信息 List list=mapper.getBomHistoryAndMaterial(productId,pHistory.getSubVersionMax()); //处理存在关联关系的物料 List endList=new ArrayList<>(); list.stream().forEach(bomHistory -> { if(bomHistory.getDwgUrl()!=null){ QueryWrapper qwrapper=new QueryWrapper(); qwrapper.eq("material_id",bomHistory.getMaterialId()); qwrapper.eq("attach_name",bomHistory.getDwgUrl().substring(bomHistory.getDwgUrl().lastIndexOf("\\")+1)); qwrapper.eq("lock_flag",1); qwrapper.last("limit 1"); AttachLock attachLock=attachLockMapper.selectOne(qwrapper); if(attachLock!=null){ bomHistory.setDwgUrl(""); } } bomHistory.setConnFlag(0); endList.add(bomHistory); if(bomHistory.getMaterials()!=null&&bomHistory.getMaterials().size()>0){ for (Material m:bomHistory.getMaterials()) { //将物料存放为一个bom为下载做准备 ProductBomHistory copyBomHis=copyMaterialToBomHis(m); endList.add(copyBomHis); } } }); String withOutDwg="doc_file/product"+File.separator+pHistory.getParentModel(); if(pHistory.getCustomCode()!=null&&!pHistory.getCustomCode().isEmpty()){ withOutDwg+=File.separator+pHistory.getCustomCode()+File.separator+version; }else{ withOutDwg+=File.separator+"standard"+File.separator+version; } //生成excel并将dwg文件放在同一报下压缩 creatBomHsitoryExcel(req,resp,pHistory,endList,withOutDwg,oprateReason,oprateInfo,ActionUtil.sdfwithALL.format(pHistory.getVersionTime())); } //根据产品信息创建excel表格并存放在指定目录 public void creatBomHsitoryExcel(HttpServletRequest req, HttpServletResponse resp,ProductHistory pHistory,List list,String withOutDwg , String oprateReason, String oprateInfo,String oprateVersion){ String fileDirName = FileDirPath.getFileDirName(); String rootFace=""; String excelName=""; String[] titleNames=new String[]{"序列","母物料编码","母物料名称","母物料型号","类别","子件编码","子件名称","子件型号" ,"基本单位","子件数量","生产商","封装类型/材质","元件编号/料厚","表面处理/物料详情","备注","图片"}; //创建单个sheet HSSFWorkbook wb = new HSSFWorkbook(); //字体格式-加粗 HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setFillForegroundColor(IndexedColors.GOLD.getIndex());//添加前景色,内容看的清楚 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //font.setColor(HSSFFont.COLOR_RED); cellStyle.setFont(font); HSSFSheet sheet = wb.createSheet("bom_"+pHistory.getVersion()+"信息"); sheet.setColumnWidth(1,5000); sheet.setColumnWidth(2,5000); sheet.setColumnWidth(3,5000); sheet.setColumnWidth(4,5000); sheet.setColumnWidth(6,5000); sheet.setColumnWidth(7,5000); sheet.setColumnWidth(8,5000); sheet.setColumnWidth(16,6000); sheet.setDefaultRowHeight((short)(1000)); //图片元素 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); int rownum = 1; HSSFRow row=sheet.createRow(rownum); HSSFCell cell=row.createCell(0); if(titleNames.length>0){ for (int i=0;i0){ for (int i=0;i0){ out.write(buffer,0,len); } in.close(); out.close(); file.delete(); ZipUtils.delDir(rootFace); } catch (FileNotFoundException | UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //记录日志 logService.recordOperationLogDownLoad(ActionUtil.getUser().getId(),ActionUtil.getUser().getName(), UserOperation.TYPE_DOWNLOAD_PRODUCT.getType(),new Date(),req.getRemoteAddr() ,excelName+".zip",rootFace+".zip",oprateReason,oprateInfo,oprateVersion); } //将物料存放为一个bomHistory为下载做准备 private ProductBomHistory copyMaterialToBomHis(Material m) { ProductBomHistory bomHis=new ProductBomHistory(); bomHis.setType(m.getType()); //bomHis.setCategory(m.getCategory()); bomHis.setSubCode(m.getSubCode()); bomHis.setSubName(m.getSubName()); bomHis.setSubModel(m.getSubModel()); bomHis.setUnit(m.getUnit()); //bomHis.setProducer(m.getProducer()); //bomHis.setMaterial(m.getMaterial()); //bomHis.setThickness(m.getThickness()); //bomHis.setSurfaceDetail(m.getSurfaceDetail()); //bomHis.setNotes(m.getNotes()); bomHis.setPictureUrl(m.getPictureUrl()); bomHis.setDwgUrl(m.getDwgUrl()); bomHis.setFileUrl(m.getFileUrl()); bomHis.setCreateDate(m.getCreateDate()); bomHis.setConnFlag(1); return bomHis; } public void insertBatch(List bomHistoryList) { mapper.insertBatchSomeColumn(bomHistoryList); } /** * 对比 * @param preProductId 旧的版本,作为基准 * @param productId 新的产品版本 * @return */ public Response compare(int preProductId, int productId) { //查询两个版本对应的bom最新小版本 List baseBomHistoryList = getLatestBomListByProductId(preProductId); List bomHistoryList = getLatestBomListByProductId(productId); List diffList = new LinkedList<>(); List addList = new LinkedList<>(); List deleteList = new LinkedList<>(); //物料id,对比字段:数量 String separator = "&&&&&"; baseBomHistoryList.forEach(baseBom->{ bomHistoryList.forEach(bom->{ StringBuilder diffStr = new StringBuilder(); if(bom.getMaterialId().equals(baseBom.getMaterialId())){ if(!bom.getQuantity().equals(baseBom.getQuantity())){ String diffQuantity = separator+"原数量:"+baseBom.getQuantity()+"/新数量:"+bom.getQuantity(); diffStr.append(diffQuantity); } if(!bom.getProducer().equals(baseBom.getProducer())){ String diffProducer = separator+"原生产商:"+baseBom.getProducer()+"/新生产商:"+bom.getProducer(); diffStr.append(diffProducer); } if(!bom.getMaterial().equals(baseBom.getMaterial())){ String diffMaterial = separator+"原封装类型|材质:"+baseBom.getMaterial()+"/新封装类型|材质:"+bom.getMaterial(); diffStr.append(diffMaterial); } if(!bom.getThickness().equals(baseBom.getThickness())){ String diffThickness = separator+"原元件编号|料厚:"+baseBom.getThickness()+"/新元件编号|料厚:"+bom.getThickness(); diffStr.append(diffThickness); } if(!bom.getSurfaceDetail().equals(baseBom.getSurfaceDetail())){ String diffSurfaceDetail = separator+"原表面处理|物料详情:"+baseBom.getSurfaceDetail()+"/新表面处理|物料详情:"+bom.getSurfaceDetail(); diffStr.append(diffSurfaceDetail); } if(!bom.getNotes().equals(baseBom.getNotes())){ String diffNotes = separator+"原备注:"+baseBom.getNotes()+"/新备注:"+bom.getNotes(); diffStr.append(diffNotes); } String diff = diffStr.toString(); if(!diff.equals("")) { ProductBomHistory history = new ProductBomHistory(); history.setNotes(diff.substring(5)); history.setMaterialObj(bom.getMaterialObj()); diffList.add(history); } } }); }); List baseCodeList = baseBomHistoryList.stream().map(ProductBomHistory::getMaterialId).collect(Collectors.toList()); List codeList = bomHistoryList.stream().map(ProductBomHistory::getMaterialId).collect(Collectors.toList()); bomHistoryList.forEach(bom->{ if(!baseCodeList.contains(bom.getMaterialId())){ addList.add(bom); } }); baseBomHistoryList.forEach(baseBom->{ if(!codeList.contains(baseBom.getMaterialId())){ deleteList.add(baseBom); } }); return new Response().setIII(1,diffList,addList,deleteList,"对比完成"); } /** * @param baseProduct 基准产品为null,则直接找上传产品的最新标准版本 * @param product 上传产品 * @return */ public Map parseCompare(Product baseProduct, Product product) { List bomList = product.getBomList(); List baseProductBomList = null; Map compareMap = new HashMap<>(); List diffList = new LinkedList<>(); List addList = new LinkedList<>(); List deleteList = new LinkedList<>(); //新增差异对比-图纸差异 List diffDwgList = new LinkedList<>(); //查找到基准产品 if(baseProduct == null){ //查找上传的现有产品表内未锁定的版本 baseProductBomList = bomService.getEnabledBomListByParentCodeAndCustomCode(product.getParentCode(),""); }else{ //根据baseProduct的code和custom_code baseProductBomList = bomService.getEnabledBomListByParentCodeAndCustomCode(baseProduct.getParentCode(),baseProduct.getCustomCode()); } //对比:根据code+model定位,比较数量 List baseCodeModelList = baseProductBomList.stream().map(bom -> bom.getMaterialObj().getSubCode() + "/" + bom.getMaterialObj().getSubModel()).collect(Collectors.toList()); Map> groupedBaseBomList = baseProductBomList.stream().collect(Collectors.groupingBy(bom -> bom.getMaterialObj().getSubCode() + "/" + bom.getMaterialObj().getSubModel())); List codeModelList = bomList.stream().map(bom -> bom.getSubCode() + "/" + bom.getSubModel()).collect(Collectors.toList()); String separator = "&&&&&"; bomList.forEach(bom->{ String codeModel = bom.getSubCode() + "/" + bom.getSubModel(); if(!baseCodeModelList.contains(codeModel)){ addList.add(bom); }else{ ProductBom baseBom = groupedBaseBomList.get(codeModel).get(0); /*if(bom.getQuantity().intValue()!=baseBom.getQuantity()){ ProductBom diffBom = new ProductBom(); String diffQuantity = "原数量:"+baseBom.getQuantity()+"/新数量:"+bom.getQuantity(); diffBom.setNotes(diffQuantity); diffBom.setMaterialObj(baseBom.getMaterialObj()); diffList.add(diffBom); }*/ StringBuilder diffStr = new StringBuilder(); if(!bom.getQuantity().equals(baseBom.getQuantity())){ String diffQuantity = separator+"原数量:"+baseBom.getQuantity()+"/新数量:"+bom.getQuantity(); diffStr.append(diffQuantity); } if(!bom.getProducer().equals(baseBom.getProducer())){ String diffProducer = separator+"原生产商:"+baseBom.getProducer()+"/新生产商:"+bom.getProducer(); diffStr.append(diffProducer); } if(!bom.getMaterial().equals(baseBom.getMaterial())){ String diffMaterial = separator+"原封装类型|材质:"+baseBom.getMaterial()+"/新封装类型|材质:"+bom.getMaterial(); diffStr.append(diffMaterial); } if(!bom.getThickness().equals(baseBom.getThickness())){ String diffThickness = separator+"原元件编号|料厚:"+baseBom.getThickness()+"/新元件编号|料厚:"+bom.getThickness(); diffStr.append(diffThickness); } if(!bom.getSurfaceDetail().equals(baseBom.getSurfaceDetail())){ String diffSurfaceDetail = separator+"原表面处理|物料详情:"+baseBom.getSurfaceDetail()+"/新表面处理|物料详情:"+bom.getSurfaceDetail(); diffStr.append(diffSurfaceDetail); } if(!bom.getNotes().equals(baseBom.getNotes())){ String diffNotes = separator+"原备注:"+baseBom.getNotes()+"/新备注:"+bom.getNotes(); diffStr.append(diffNotes); } String diff = diffStr.toString(); if(!diff.equals("")) { ProductBom diffBom = new ProductBom(); diffBom.setNotes(diff.substring(5)); diffBom.setMaterialObj(baseBom.getMaterialObj()); diffList.add(diffBom); } } }); baseProductBomList.forEach(bom->{ String codeModel = bom.getMaterialObj().getSubCode() + "/" + bom.getMaterialObj().getSubModel(); if(!codeModelList.contains(codeModel)){ deleteList.add(bom); } }); //图纸差异对比逻辑 //1.先找出所有需要对比的图纸 List bomListWithDwg = bomList.stream().filter(bom -> !StringUtils.isEmpty(bom.getDwgUrl())).collect(Collectors.toList()); //2.从数据库中找到物料对应的图纸 if(bomListWithDwg.size()!=0) { List materialListInDB = materialService.getListByCodeAndModelList3(bomListWithDwg); if (materialListInDB.size() != 0) { //对比图纸 for (int i = 0; i < materialListInDB.size(); i++) { Material materialInDB = materialListInDB.get(i); String materialStrInDB = materialInDB.getSubCode() + "/" + materialInDB.getSubModel(); for (int j = 0; j < bomListWithDwg.size(); j++) { ProductBom material = bomListWithDwg.get(j); String materialStr = material.getSubCode() + "/" + material.getSubModel(); if (materialStrInDB.equals(materialStr)) { //如果物料一致,则进行对比 String dwgUrlInDB = materialInDB.getDwgUrl(); String dwgUrl = material.getDwgUrl(); //物料图纸转化为png图片进行对比(弃用) String dwgFileStr = CommonUtil.getProjectDir() + File.separator + dwgUrlInDB; String dwgFileStr2 = CommonUtil.getProjectDir() + File.separator + dwgUrl; /*String absoluteDwgPngPath = dwgFileStr.substring(0, dwgFileStr.lastIndexOf(".")) + "-dwg.png"; String absoluteDwgPngPath2 = dwgFileStr2.substring(0, dwgFileStr2.lastIndexOf(".")) + "-dwg.png"; if (!new File(absoluteDwgPngPath).exists()) { DwgToPngUtil.dwg2png(new File(dwgFileStr)); } if (!new File(absoluteDwgPngPath2).exists()) { DwgToPngUtil.dwg2png(new File(dwgFileStr2)); }*/ boolean sameImage = ImageDiff.compareImagesCheck(dwgFileStr, dwgFileStr2); if (!sameImage) { //图纸不同 //material.setNotes(absoluteDwgPngPath.replace(CommonUtil.getProjectDir()+ File.separator, "") + separator + absoluteDwgPngPath2.replace(CommonUtil.getProjectDir()+ File.separator, "")); //克隆一个新的对象material ProductBom materialDiff = new ProductBom(); BeanUtils.copyProperties(material, materialDiff); materialDiff.setNotes(dwgUrlInDB); diffDwgList.add(materialDiff); } } } } } } compareMap.put("diffList",diffList); compareMap.put("addList",addList); compareMap.put("deleteList",deleteList); compareMap.put("diffDwgList",diffDwgList); return compareMap; } /**关联查询到具体的bom内物料信息*/ private List getLatestBomListByProductId(int productId) { QueryWrapper query = Wrappers.query(); query.select("max(sub_e_version) as sub_e_version").eq("product_id",productId); Integer latestSubVersion = mapper.selectOne(query).getSubEVersion(); //QueryWrapper query2 = Wrappers.query(); //query2.eq("product_id",productId).le("sub_s_version",latestSubVersion).ge("sub_e_version",latestSubVersion); return mapper.getBomListByProductIdAndSubVersion(productId,latestSubVersion); } public void updateMaterialField2BomHistory() { List bomHistoryList = mapper.selectListWithMaterialField(); mapper.updateMaterialField2BomHistoryBatch(bomHistoryList); } //根据产品母料型号,定制单号,版本下载原始压缩包文件 public Response getOriginalZip(String parentCode,String parentModel, String customCode, int version) { String fileDirName = FileDirPath.getFileDirName(); String withOutDwg=fileDirName+File.separator+"doc_file"+File.separator+"product"+File.separator+parentModel; if(customCode!=null&&!customCode.isEmpty()){ withOutDwg+=File.separator+customCode+File.separator+version; }else{ withOutDwg+=File.separator+"standard"+File.separator+version; } boolean bl=false; File file = new File(withOutDwg); if(!file.exists()) { return new Response().setII(1,bl,withOutDwg.replace(fileDirName,""),"原始文件相对路径"); } String[] filePath = file.list();//获取该文件夹下的所有文件以及目录的名字 if(filePath!=null&&filePath.length>0){ for (String tmp:filePath) { if((tmp.contains(parentCode)||tmp.contains(parentModel))&&tmp.contains(".zip")){ bl=true; withOutDwg=withOutDwg+File.separator+tmp; break; } } } return new Response().setII(1,bl,withOutDwg.replace(fileDirName,""),"原始文件相对路径"); } public void getFixItem() { List bomHistoryList = mapper.selectList(null); Map> productMap = bomHistoryList.stream().collect(Collectors.groupingBy(ProductBomHistory::getProductId)); Set productIdSet = productMap.keySet(); List needToDealWith = new LinkedList<>(); for (Integer productId : productIdSet) { List bomList = productMap.get(productId); Map> materialIdMap = bomList.stream().collect(Collectors.groupingBy(ProductBomHistory::getMaterialId)); Set materialIdSet = materialIdMap.keySet(); for (Integer materialId : materialIdSet) { List temp = materialIdMap.get(materialId); if(temp.size()!=1){ System.err.println("需要手动处理的productBomHistory和productBom:"+productId+",物料id:"+materialId); needToDealWith.add(temp.get(0)); } } } System.err.println("可能需要处理的条数为:"+needToDealWith.size()); } }