src/main/java/com/whyc/controller/ProductController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/mapper/MaterialMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/MaterialService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/ProductBomHistoryService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/ProductService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/util/DwgToPngUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/util/ImageDiff.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/mapper/MaterialMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/whyc/controller/ProductController.java
@@ -108,7 +108,7 @@ return historyService.setpHistoryEnable(parentCode, customCode, version, enabled,reason,versionTime); } @PostMapping("zipParse") @ApiOperation(value = "zip解析",notes = "返回结果中,追加data3为对比结果,为key-value集合,key为diffList,addList,deleteList") @ApiOperation(value = "zip解析",notes = "返回结果中,追加data3为对比结果,为key-value集合,key为diffList,addList,deleteList,diffDwgList") public Response zipParse(@RequestParam("file") MultipartFile file,@RequestParam(required = false) String baseStr) throws IOException, InvalidFormatException { //要做对比的产品,传入了物料(parent_code)和定制表单号(custom_code) Product baseProduct = (baseStr==null?null:ActionUtil.getGson().fromJson(baseStr, Product.class)); src/main/java/com/whyc/mapper/MaterialMapper.java
@@ -27,6 +27,7 @@ void disableStatus(List<Material> materialList); List<Material> getListByCodeAndModelList2(List<ProductBom> bomList); List<Material> getListByCodeAndModelList3(List<ProductBom> bomList); //根据物料id查询返回附件文件夹下所有的文件列表 Material getAttachByMaterialId(int materialId); ////根据物料型号('-','_'之前的部分)查询物料的历史版本 src/main/java/com/whyc/service/MaterialService.java
@@ -264,6 +264,10 @@ return mapper.getListByCodeAndModelList2(bomList); } public List<Material> getListByCodeAndModelList3(List<ProductBom> bomList) { return mapper.getListByCodeAndModelList3(bomList); } /** * * @param subCode 物料编码 src/main/java/com/whyc/service/ProductBomHistoryService.java
@@ -1,6 +1,7 @@ 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; @@ -13,13 +14,15 @@ import com.whyc.mapper.ProductHistoryMapper; import com.whyc.pojo.*; import com.whyc.util.ActionUtil; import com.whyc.util.CommonUtil; import com.whyc.util.DwgToPngUtil; 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.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestParam; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; @@ -53,6 +56,9 @@ @Autowired(required = false) private AttachLockMapper attachLockMapper; @Autowired private MaterialService materialService; //根据子件名称和母料型号查询历史版本记录 public Response getBomHistoryByPModelAndSName(String pmodel, String sname) { @@ -579,6 +585,8 @@ List<ProductBom> diffList = new LinkedList<>(); List<ProductBom> addList = new LinkedList<>(); List<ProductBom> deleteList = new LinkedList<>(); //新增差异对比-图纸差异 List<ProductBom> diffDwgList = new LinkedList<>(); //查找到基准产品 if(baseProduct == null){ //查找上传的现有产品表内未锁定的版本 @@ -646,9 +654,54 @@ deleteList.add(bom); } }); //图纸差异对比逻辑 //1.先找出所有需要对比的图纸 List<ProductBom> bomListWithDwg = bomList.stream().filter(bom -> !StringUtils.isEmpty(bom.getDwgUrl())).collect(Collectors.toList()); //2.从数据库中找到物料对应的图纸 if(bomListWithDwg.size()!=0) { List<Material> 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(absoluteDwgPngPath, absoluteDwgPngPath2); if (!sameImage) { //图纸不同 material.setNotes(absoluteDwgPngPath.replace(CommonUtil.getProjectDir()+ File.separator, "") + separator + absoluteDwgPngPath2.replace(CommonUtil.getProjectDir()+ File.separator, "")); diffDwgList.add(material); } } } } } } compareMap.put("diffList",diffList); compareMap.put("addList",addList); compareMap.put("deleteList",deleteList); compareMap.put("diffDwgList",diffDwgList); return compareMap; } src/main/java/com/whyc/service/ProductService.java
@@ -898,7 +898,7 @@ List<MaterialHistory> materialHistoryList = new LinkedList<>(); //新物料 List<Material> newMaterialList = new LinkedList<>(); //已经存在的物料 //判断物料是否已经存在于物料表中 List<Material> materialUpdateList = new LinkedList<>(); for (ProductBom bom : bomList) { if (!subCodeList.contains(bom.getSubCode() + "/" + bom.getSubModel())) { src/main/java/com/whyc/util/DwgToPngUtil.java
@@ -10,15 +10,20 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; @Slf4j public class DwgToPngUtil { public static String dwg2png(File dwgFile) throws IOException { public static String dwg2png(File dwgFile){ FileInputStream fileInputStream; //将dwg文件转换成InputStream输入流 try { fileInputStream = new FileInputStream(dwgFile); } catch (FileNotFoundException e) { throw new RuntimeException(e); } Image objImage = Image.load(fileInputStream); @@ -53,7 +58,11 @@ e.printStackTrace(); log.error("dwg转pdf失败{}",dwgFile.getName()); } finally { try { fileInputStream.close(); } catch (IOException e) { throw new RuntimeException(e); } } //log.info("文件转换成功{}",dwgFile.getName()); return outputFile.getAbsolutePath(); src/main/java/com/whyc/util/ImageDiff.java
@@ -1,11 +1,15 @@ package com.whyc.util; import javax.imageio.ImageIO; import javax.xml.bind.DatatypeConverter; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class ImageDiff { @@ -167,8 +171,71 @@ } } public static boolean compareImagesCheck(String srcImgPath, String targetImgPath) { String hash1 = calculateMD5(srcImgPath); String hash2 = calculateMD5(targetImgPath); // 比较两个哈希值是否相同 return hash1 != null && hash2 != null && hash1.equals(hash2); /*boolean sameImage = true; try { BufferedImage srcImg = ImageIO.read(new File(srcImgPath)); BufferedImage targetImg = ImageIO.read(new File(targetImgPath)); int srcHeight = srcImg.getHeight(); int srcWidth = srcImg.getWidth(); //修改待比较图片的尺寸以适应源图片的尺寸 targetImg = changeImageSize(targetImg, srcHeight, srcWidth); int srcRgb; int targetRgb; for (int h = 0; h < srcHeight; h++) { for (int w = 0; w < srcWidth; w++) { srcRgb = srcImg.getRGB(w, h); targetRgb = targetImg.getRGB(w, h); *//*if (Math.abs(getRed(srcRgb) - getRed(targetRgb)) > DIFF_ALLOW_RANGE || Math.abs(getGreen(srcRgb) - getGreen(targetRgb)) > DIFF_ALLOW_RANGE || Math.abs(getBlue(srcRgb) - getBlue(targetRgb)) > DIFF_ALLOW_RANGE) { diffImg.setRGB(w, h, RGB_RED); diffPointCount++; } }*//* if (Math.abs(targetRgb - srcRgb) > DIFF_ALLOW_RANGE) { //像素点不同,判断为不同图片 return false; } } } }catch (Exception ex){ ex.printStackTrace(); } return sameImage;*/ } public static String calculateMD5(String filePath) { try (FileInputStream fis = new FileInputStream(filePath)) { // 获取MD5摘要算法的 MessageDigest 实例 MessageDigest md = MessageDigest.getInstance("MD5"); // 读取文件内容并更新摘要 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = fis.read(buffer)) != -1) { md.update(buffer, 0, bytesRead); } // 计算哈希值并转换为十六进制字符串 byte[] digest = md.digest(); return DatatypeConverter.printHexBinary(digest).toUpperCase(); } catch (NoSuchAlgorithmException | IOException e) { e.printStackTrace(); return null; } } public static void main(String[] args) throws IOException { compareImages("C:\\\\Users\\\\29550\\\\Desktop\\\\当前项目\\\\202207图纸管理\\\\图纸升级\\\\fbo-60010nt-t-j-002_a11-dwg.png", src/main/resources/mapper/MaterialMapper.xml
@@ -252,6 +252,11 @@ select id,sub_code,sub_model from tb_material where sub_code = #{item.subCode} and sub_model = #{item.subModel} </foreach> </select> <select id="getListByCodeAndModelList3" resultType="com.whyc.pojo.Material"> <foreach collection="list" item="item" separator=" union "> select id,sub_code,sub_model,dwg_url from tb_material where sub_code = #{item.subCode} and sub_model = #{item.subModel} and dwg_url is not null and dwg_url!="" </foreach> </select> <select id="getAttachByMaterialId" resultType="com.whyc.pojo.Material"> select * from tb_material WHERE id = #{materialId} limit 1 </select>