whycxzp
2024-11-07 d3113b2a1c4c7a6c44cb0eeaf728c302cb899792
解压
8个文件已修改
147 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/ProductController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/mapper/MaterialMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/MaterialService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/ProductBomHistoryService.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/ProductService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/DwgToPngUtil.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/util/ImageDiff.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/MaterialMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | 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>