whycxzp
2022-08-31 3ee1e956019390abd433dc53bc26176fff0cf87c
产品bom新增,zip解析
4个文件已修改
222 ■■■■■ 已修改文件
src/main/java/com/whyc/controller/ProductController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/Product.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/pojo/ProductBom.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/ProductService.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/ProductController.java
@@ -4,14 +4,14 @@
import com.whyc.service.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Api(tags = "产品管理")
@RestController
@@ -70,4 +70,10 @@
    public void downloadProductHistory(HttpServletRequest req, HttpServletResponse resp, @RequestParam int productId, @RequestParam int version){
        bomHistoryService.downloadProductHistory(req,resp,productId,version);
    }
    @PostMapping("zipParse")
    @ApiOperation("zip解析")
    public Response zipParse(@RequestParam("file") MultipartFile file) throws IOException, InvalidFormatException {
        return service.zipParse(file);
    }
}
src/main/java/com/whyc/pojo/Product.java
@@ -1,12 +1,13 @@
package com.whyc.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
@@ -49,4 +50,6 @@
    @TableField(exist = false)
    private List materialIds;
    private List<ProductBom> bomList;
}
src/main/java/com/whyc/pojo/ProductBom.java
@@ -62,6 +62,9 @@
    private String dwgUrl;
    @TableField(exist = false)
    private Integer dwgExist;
    @TableField(exist = false)
    @ApiModelProperty(value = "关联的物料集合")
    private List<Material> materials;
@@ -264,4 +267,12 @@
    public void setCustomCode(String customCode) {
        this.customCode = customCode;
    }
    public Integer getDwgExist() {
        return dwgExist;
    }
    public void setDwgExist(Integer dwgExist) {
        this.dwgExist = dwgExist;
    }
}
src/main/java/com/whyc/service/ProductService.java
@@ -5,12 +5,27 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.whyc.dto.FileUrlDTO;
import com.whyc.dto.Response;
import com.whyc.mapper.ProductMapper;
import com.whyc.pojo.DocUser;
import com.whyc.pojo.Product;
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 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.web.multipart.MultipartFile;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@Service
@@ -75,4 +90,177 @@
    public void insert(Product product) {
        mapper.insert(product);
    }
    public Response zipParse(MultipartFile file) throws IOException, InvalidFormatException {
        List<ProductBom> list = new LinkedList<>();
        Product product = new Product();
        List<ProductBom> bomList = new LinkedList<>();
        Response response = new Response();
        //检查是否为zip
        boolean isZip = Zip4jUtil.checkZipFileParam(file);
        if (!isZip) {
            return response.set(1, false, "上传的文件格式不是zip");
        }
        //zip存储路径:doc_file/product_submit/${username}/{dateFormat}/${timeStamp}
        String rootFile = CommonUtil.getRootFile();
        DocUser user = ActionUtil.getUser();
        String dateFormat = new SimpleDateFormat("YYYY-MM").format(new Date());
        long timeStamp = System.currentTimeMillis();
        String filePath = rootFile + File.separator + "product_submit" + File.separator + user.getName() + File.separator + dateFormat + File.separator + timeStamp;
        File parentFile = new File(filePath);
        String originalFilename = file.getOriginalFilename();
        File zipFile = new File(filePath + File.separator + originalFilename);
        if (!zipFile.exists()) {
            zipFile.mkdirs();
        }
        file.transferTo(zipFile);
        //解压文件夹
        Zip4jUtil.unPackZip(zipFile, null, filePath);
        //遍历解压后的文件夹路径,解析excel
        System.out.println(filePath);
        List<String> fileList = new ArrayList<>();
        //图纸筛选
        fileList = FileUtil.getStaticFilePath(parentFile, fileList);
        List<FileUrlDTO> dwgExistsList = getDwgList(fileList);
        for (int i = 0; i < fileList.size(); i++) {
            String fileTempUrl = fileList.get(i);
            //查询需上传的bom数据
            if (fileTempUrl.contains(".xls") && fileTempUrl.contains("(BOM)")) {
                Workbook workbook = null;
                InputStream inputStream = new FileInputStream(new File(fileTempUrl));
                workbook = WorkbookFactory.create(inputStream);
                inputStream.close();
                List<? extends PictureData> allPictures = workbook.getAllPictures();
                //取第一个sheet表
                Sheet sheet = workbook.getSheetAt(0);
                int lastRowNum = sheet.getLastRowNum();
                //取第三行,并以第三行开始
                Row row2 = sheet.getRow(1);
                short lastCellNum = row2.getLastCellNum();
                for (int k = 2; k < lastRowNum + 1; k++) {
                    if(k==2){
                        product.setParentCode(sheet.getRow(2).getCell(1).getStringCellValue());
                        product.setParentName(sheet.getRow(2).getCell(2).getStringCellValue());
                        product.setParentModel(sheet.getRow(2).getCell(3).getStringCellValue());
                    }
                    ProductBom bom = new ProductBom();
                    for (int j = 0; j < lastCellNum; j++) {
                        Row row = sheet.getRow(k);
                        Cell cell = row.getCell(j);
                        String cellValue = null;
                        Double cellValueInt = 0d;
                        if (j == 9 || j == 0) {
                            cellValueInt = cell.getNumericCellValue();
                        } else if (j != 15) {
                            cellValue = cell.getStringCellValue();
                        }
                        switch (j) {
                            case 0: {
                                bom.setId(cellValueInt.intValue());
                            }
                            break;
                            case 4: {
                                bom.setCategory(cellValue);
                            }
                            break;
                            case 5: {
                                bom.setSubCode(cellValue);
                            }
                            break;
                            case 6: {
                                bom.setSubName(cellValue);
                            }
                            break;
                            case 7: {
                                bom.setSubModel(cellValue);
                                //判断图纸查看是否存在
                                bom.setDwgExist(0);
                                String dwgFileName = cellValue + ".dwg";
                                for (int n = 0; n < dwgExistsList.size(); n++) {
                                    FileUrlDTO fileUrlDTO = dwgExistsList.get(n);
                                    if (dwgFileName.toUpperCase().equals(fileUrlDTO.getFileName().toUpperCase())) {
                                        //存在
                                        bom.setDwgExist(1);
                                        bom.setDwgUrl(fileUrlDTO.getHttpFileUrl());
                                        break;
                                    }
                                }
                            }
                            break;
                            case 8: {
                                bom.setUnit(cellValue);
                            }
                            break;
                            case 9: {
                                bom.setQuantity(cellValueInt.intValue());
                            }
                            break;
                            case 10: {
                                bom.setProducer(cellValue);
                            }
                            break;
                            case 11: {
                                bom.setMaterial(cellValue);
                            }
                            break;
                            case 12: {
                                bom.setThickness(cellValue);
                            }
                            break;
                            case 13: {
                                bom.setSurfaceDetail(cellValue);
                            }
                            break;
                            case 14: {
                                bom.setNotes(cellValue);
                            }
                            break;
                            case 15: {
                                //图片,从0开始,到图片size为止
                                int m = k - 2;
                                if (m < allPictures.size()) {
                                    PictureData pictureData = allPictures.get(m);
                                    //图片存储 product_submit/username/2022-07/
                                    String approvingPath = rootFile + File.separator + "product_submit" + File.separator + user.getName() + File.separator + dateFormat + File.separator + timeStamp;
                                    File provingFile = new File(approvingPath);
                                    if (!provingFile.exists()) {
                                        provingFile.mkdirs();
                                    }
                                    String suffix = pictureData.suggestFileExtension();
                                    String picturePath = approvingPath + File.separator + bom.getSubModel() + "." + suffix;
                                    String picturePathFront = "doc_file" + File.separator + "product_submit" + File.separator + user.getName() + File.separator + dateFormat + File.separator + timeStamp + File.separator + bom.getSubModel() + "." + suffix;
                                    byte[] data = pictureData.getData();
                                    FileOutputStream fileOutputStream = null;
                                    File pictureFile = new File(picturePath);
                                    fileOutputStream = new FileOutputStream(pictureFile);
                                    fileOutputStream.write(data);
                                    bom.setPictureUrl(picturePathFront);
                                }
                            }
                            break;
                        }
                    }
                    bomList.add(bom);
                }
                product.setBomList(bomList);
            }
        }
        return response.setII(1, true, product, filePath);
    }
    private List<FileUrlDTO> getDwgList(List<String> fileList) {
        List<FileUrlDTO> list = new LinkedList<>();
        fileList.forEach(fileUrl->{
            if(fileUrl.substring(fileUrl.lastIndexOf(".")+1).equals("dwg")) {
                FileUrlDTO dto = new FileUrlDTO();
                dto.setFileName(fileUrl.substring(fileUrl.lastIndexOf(File.separator) + 1));
                dto.setHttpFileUrl(fileUrl.substring(fileUrl.lastIndexOf("doc_file" + File.separator + "product_approving")));
                list.add(dto);
            }
        });
        return list;
    }
}