whycxzp
2023-03-01 93a16e3707b870856594e89b950174b64bb7d6cd
src/main/java/com/whyc/service/MaterialService.java
@@ -4,23 +4,27 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.FileDirPath;
import com.whyc.dto.Response;
import com.whyc.mapper.MaterialMapper;
import com.whyc.pojo.DocUser;
import com.whyc.pojo.Material;
import com.whyc.pojo.ProductBom;
import com.whyc.util.ActionUtil;
import com.whyc.util.CommonUtil;
import com.whyc.util.FileUtil;
import com.whyc.util.Zip4jUtil;
import com.whyc.util.DateUtil;
import com.whyc.util.*;
import org.apache.commons.codec.binary.Base64;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
@@ -270,15 +274,15 @@
                        cellValue = cell.getStringCellValue();
                        switch (m){
                            case 2:{material.setCategory(cellValue);}break;
                            //case 2:{material.setCategory(cellValue);}break;
                            case 3:{material.setSubCode(cellValue);}break;
                            case 4:{material.setSubName(cellValue);}break;
                            case 5:{material.setSubModel(cellValue);}break;
                            case 6:{material.setMaterial(cellValue);}break;
                            case 7:{material.setThickness(cellValue);}break;
                            //case 6:{material.setMaterial(cellValue);}break;
                            //case 7:{material.setThickness(cellValue);}break;
                            //case 8:{material.setProducer(cellValue);}break;
                            case 9:{material.setSurfaceDetail(cellValue);}break;
                            case 10:{material.setNotes(cellValue);}break;
                            //case 9:{material.setSurfaceDetail(cellValue);}break;
                            //case 10:{material.setNotes(cellValue);}break;
                            case 11:{
                                //图片从1开始,0是yc logo
                                PictureData pictureData = allPictures.get(l - 7);
@@ -306,4 +310,214 @@
        }
        return response.setII(1,true,list,filePath);
    }
    //根据物料id查询返回附件文件夹下所有的文件列表
    public Response getAttachByMaterialId(int materialId) {
        String fileDirName = FileDirPath.getFileDirName();
        Material material=mapper.getAttachByMaterialId(materialId);
        boolean flag=false;
        List list=new ArrayList();
        if(material.getFileUrl()!=null&&!material.getFileUrl().isEmpty()){
            File file = new File(fileDirName+File.separator+material.getFileUrl());
            if(!file.exists()) {
                flag=false;
            }else{
               String[] fileNames = file.list();//获取该文件夹下的所有文件以及目录的名字
                if(fileNames.length>0){
                    flag=true;
                    for (int i=0;i<fileNames.length;i++){
                        if(!fileNames[i].contains("-dwg.pdf")&&!fileNames[i].contains("-doc.pdf"))
                           list.add(material.getFileUrl()+File.separator+fileNames[i]);
                    }
                }
            }
        }
        return new Response().setII(1,flag,list,"文件列表返回");
    }
    //根据物料型号('-','_'之前的部分)查询物料的历史版本
    public Response getMaterialVersion(String subModel) {
        List list=mapper.getMaterialVersion(subModel);
        return new Response().setII(1,list.size()>0,list,"物料历史版本数据返回");
    }
    //根据物料id查询物料信息
    public Response getMaterialById(int materialId) {
        Material material=mapper.getMaterialById(materialId);
        String fileDirName = FileDirPath.getFileDirName();
        List list=new ArrayList();
        if(material.getFileUrl()!=null&&!material.getFileUrl().isEmpty()){
            File file = new File(fileDirName+File.separator+material.getFileUrl());
            if(file.exists()) {
                String[] fileNames = file.list();//获取该文件夹下的所有文件以及目录的名字
                if(fileNames.length>0){
                    for (int i=0;i<fileNames.length;i++){
                        if(!fileNames[i].contains("-dwg.pdf")&&!fileNames[i].contains("-doc.pdf"))
                            list.add(material.getFileUrl()+File.separator+fileNames[i]);
                    }
                }
            }
        }
        return new Response().setIII(1,material!=null,material,list,"物料历史版本数据返回");
    }
    /**
     * @param multipartFileList 被追加的附件,zip集合
     * @param material
     * @return 返回被追加文件的文件夹路径
     */
    @Transactional
    public Response addAttachment(List<MultipartFile> multipartFileList, Material material) throws IOException {
        List<String> currentFileList = new LinkedList<>();
        List<String> uploadingFileList = new LinkedList<>();
        String dirPathDB = "doc_file" + File.separator + "material" + File.separator + material.getId() + "-"+ material.getSubCode() + "-" + material.getSubModel();
        String dirPath = CommonUtil.getRootFile() + "material" + File.separator + material.getId() + "-"+ material.getSubCode() + "-" + material.getSubModel();
        File dirFile = new File(dirPath);
        Date now = new Date();
        //long timestamp = now.getTime();
        String formattedTimestamp = DateUtil.YYYY_MM_DD_HH_MM_SS_UNION.format(now);
        boolean dirFileExist = true;
        if(!dirFile.exists()){
            dirFile.mkdirs();
            dirFileExist = false;
        }
        for (int i = 0; i < multipartFileList.size(); i++) {
            MultipartFile multipartFile = multipartFileList.get(i);
            String originalFilename = multipartFile.getOriginalFilename();
            File zipFile = new File(dirPath + File.separator + originalFilename.substring(0,originalFilename.lastIndexOf(".")) + "_" + formattedTimestamp + originalFilename.substring(originalFilename.lastIndexOf(".")));
            multipartFile.transferTo(zipFile);
        }
        /*//解压文件夹,删除原zip文件
        String unPackageDir = dirPath + File.separator + timestamp;
        Zip4jUtil.unPackZip(zipFile, null, unPackageDir);
        File unPackageFile = new File(unPackageDir);
        File[] unPackageFileList = unPackageFile.listFiles();
        zipFile.delete();
        for (int i = 0; i < unPackageFileList.length; i++) {
            File tempFile = unPackageFileList[i];
            if(tempFile.isDirectory()){
                FileUtil.deleteFile(unPackageFile);
                if(!dirFileExist){
                    FileUtil.deleteFile(dirFile);
                }
                return new Response().set(1,false,"拒绝上传:上传的压缩包存在文件夹");
            }
        }*/
        if(!dirFileExist){
            //路径不存在,说明是首次上传,设置物料对应的fileUrl
            Material temp = new Material();
            temp.setId(material.getId());
            temp.setFileUrl(dirPathDB);
            mapper.updateById(temp);
        }/*else{
            //查询路径下现有的所有文件
            String[] fileArr = dirFile.list();
            currentFileList = Arrays.asList(fileArr);
        }*/
        /*//查询新上传的文件路径
        String[] unPackageFileArr = unPackageFile.list();
        uploadingFileList = Arrays.asList(unPackageFileArr);
        for (String uploadingFile : uploadingFileList){
            if(currentFileList.contains(uploadingFile)){
                new File(unPackageDir + File.separator + uploadingFile)
                        .renameTo(new File(unPackageDir + File.separator  + uploadingFile.substring(0,uploadingFile.lastIndexOf(".")) + "_" + formattedTimestamp + uploadingFile.substring(uploadingFile.lastIndexOf("."))));
            }
        }
        //上传的文件夹转移到正式路径
        org.aspectj.util.FileUtil.copyDir(unPackageFile,dirFile);
        FileUtil.deleteFile(unPackageFile);*/
        return new Response().set(1,true,"上传完成");
    }
    /**
     * @param multipartFile 更新的图纸或图片
     * @param material
     */
    @Transactional
    public Response updatePicOrDwg(MultipartFile multipartFile, Material material) throws IOException {
        List<String> currentFileList = new LinkedList<>();
        List<String> uploadingFileList = new LinkedList<>();
        String dirPathDB = "doc_file" + File.separator + "material" + File.separator + material.getId() + "-" + material.getSubCode() + "-" + material.getSubModel();
        String dirPath = CommonUtil.getRootFile() + "material" + File.separator + material.getId() + "-" + material.getSubCode() + "-" + material.getSubModel();
        File dirFile = new File(dirPath);
        Date now = new Date();
        //long timestamp = now.getTime();
        String formattedTimestamp = DateUtil.YYYY_MM_DD_HH_MM_SS_UNION.format(now);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        String originalFilename = multipartFile.getOriginalFilename();
        String fileSuffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        String fileFullName = File.separator + originalFilename.substring(0, originalFilename.lastIndexOf(".")) + "_" + formattedTimestamp + originalFilename.substring(originalFilename.lastIndexOf("."));
        File zipFile = new File(dirPath + fileFullName);
        multipartFile.transferTo(zipFile);
        //路径不存在,说明是首次上传,设置物料对应的fileUrl
        Material temp = new Material();
        temp.setId(material.getId());
        if(fileSuffix.equals("dwg")){
            temp.setDwgUrl(dirPathDB + fileFullName);
        }else {
            temp.setPictureUrl(dirPathDB + fileFullName);
        }
        mapper.updateById(temp);
        return new Response().set(1, true, "上传完成");
    }
    public Response dwgCompare(int materialId, int materialId2) throws IOException {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = servletRequestAttributes.getResponse();
        //获取各自物料的图纸
        String dwgUrl = mapper.selectById(materialId).getDwgUrl();
        String dwgUrl2 = mapper.selectById(materialId2).getDwgUrl();
        if(dwgUrl == null || dwgUrl2 == null){
            return new Response().set(1,false,"无法对比,所选物料至少有1个不存在图纸");
        }
        String dwgFileStr = CommonUtil.getProjectDir() + File.separator + dwgUrl;
        String dwgFileStr2 = CommonUtil.getProjectDir() + File.separator + dwgUrl2;
        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));
        }
        ByteArrayOutputStream stream = ImageDiff.compareImages(absoluteDwgPngPath, absoluteDwgPngPath2);
        return new Response().setII(1,true, Base64.encodeBase64String(stream.toByteArray()),null);
        //String fileName = "name.png";
        //OutputStream toClient = null;
        //try {
        //    response.setContentType("application/octet-stream");
        //    response.setHeader("Content-Disposition","attachment;filename=" + fileName);
        //    response.addHeader("Pragma", "no-cache");
        //    response.addHeader("Cache-Control", "no-cache");
        //    toClient = response.getOutputStream();
        //    stream.writeTo(toClient);
        //    //toClient.write(stream.toByteArray());
        //    toClient.flush();
        //    toClient.close();
        //} catch (IOException e) {
        //    e.printStackTrace();
        //}
        //
        //
        //return null;
    }
    public void updateDwgUrlAndPicUrl(List<Material> materialUpdateList) {
        mapper.updateDwgUrlAndPicUrl(materialUpdateList);
    }
}