whycxzp
2022-09-06 19f70fea0253924fc71d5097198d0807d955fb1a
src/main/java/com/whyc/service/ProductService.java
@@ -17,14 +17,13 @@
import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.FileCopyUtils;
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;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class ProductService {
@@ -37,6 +36,14 @@
    @Autowired
    private MaterialProductHistoryService mphService;
    @Autowired
    private ProductBomService pbService;
    @Autowired
    private ProductBomHistoryService pbhService;
    @Autowired
    private MaterialService mService;
    //查询出所有的产品信息(分页加模糊查询<产品的编码,型号,名字,定制表编号>
    public Response getAllProduct(String parentCode, String parentName, String parentModel, String customCode, int pageCurr, int pageSize) {
@@ -52,12 +59,16 @@
            wrapper.like("parent_model",parentModel);
        }
        if(customCode!=null){
            wrapper.like("custom_code",customCode);
            if(customCode.isEmpty()){
                wrapper.eq("custom_code",customCode);
            }else{
                wrapper.like("custom_code",customCode);
            }
        }
        wrapper.orderByAsc("id");
        List list=mapper.selectList(wrapper);
        PageInfo pageInfo=new PageInfo(list);
        return new Response().setII(1,list.size()>0?true:false,pageInfo,"返回产品信息");
        return new Response().setII(1,list.size()>0,pageInfo,"返回产品信息");
    }
    public Product getVersion(String parentCode, String customCode) {
@@ -96,9 +107,7 @@
        mapper.insert(product);
    }
    public Response zipParse(MultipartFile file) throws IOException, InvalidFormatException {
        List<ProductBom> list = new LinkedList<>();
    public Response zipParse(MultipartFile file, Product baseProduct) throws IOException, InvalidFormatException {
        Product product = new Product();
        List<ProductBom> bomList = new LinkedList<>();
        Response response = new Response();
@@ -252,7 +261,9 @@
                product.setBomList(bomList);
            }
        }
        return response.setII(1, true, product, filePath);
        //产品bom对比
        Map<String,List> compareMap = pbhService.parseCompare(baseProduct,product);
        return response.setIII(1, true, product,compareMap, filePath);
    }
@@ -262,7 +273,7 @@
            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")));
                dto.setHttpFileUrl(fileUrl.substring(fileUrl.lastIndexOf("doc_file" + File.separator + "product_submit")));
                list.add(dto);
            }
        });
@@ -272,6 +283,10 @@
    public Response add(Product product) {
        String parentCode = product.getParentCode();
        String customCode = product.getCustomCode();
        String parentModel = product.getParentModel();
        List<ProductBom> bomList = product.getBomList();
        String fileUrl = product.getFileUrl();
        Date date = new Date();
        //查询产品最新的版本号
        ProductHistory latestProduct = phService.getLatestVersion(parentCode, customCode);
        ProductHistory enabledProduct = phService.getEnabledByParentCodeAndCustomCode(parentCode, customCode);
@@ -298,9 +313,216 @@
        }
        //将产品文件复制至正式路径
        //文件转移,未跟子件挂钩的所有图纸图片转移到产品版本下:doc_file/product/{产品型号}/standard或者{customCode}}/{version}/
        //跟子件挂钩的转移到子件图纸下:doc_file/material/
        File file = new File(fileUrl);
        List<String> fileUrlList = new LinkedList<>();
        List<String> dwgUrlList = null;
        List<String> picUrlList = null;
        //存于物料下,bom内有对应
        List<String> materialUrlList = new LinkedList<>();
        //存于产品下,bom内没对应
        List<String> productUrlList = new LinkedList<>();
        //物料表中不存在的,则添加到物料表中去(包含product这个物料)
        //List<Material> materialDwgUrlNameList = new LinkedList<>();
        return null;
        fileUrlList = FileUtil.getStaticFilePath(file,fileUrlList);
        //图纸dwg 子件/产品
        dwgUrlList = fileUrlList.stream().filter(url->url.contains(".dwg")).collect(Collectors.toList());
        picUrlList = fileUrlList.stream().filter(url->url.contains(".png") || url.contains(".jpeg")).collect(Collectors.toList());
        dwgUrlList.forEach(dwgUrl->{
            boolean existFlag = false;
            for (ProductBom bom :bomList){
                String filename = dwgUrl.substring(dwgUrl.lastIndexOf(File.separator) + 1, dwgUrl.length() - 4);
                String fileFullName = dwgUrl.substring(dwgUrl.lastIndexOf(File.separator) + 1);
                if(bom.getSubModel().toUpperCase().equals(filename.toUpperCase())){
                    materialUrlList.add(dwgUrl);
                    existFlag = true;
                    bom.setDwgUrl("doc_file" + File.separator + "material"
                            + File.separator + fileFullName);
                    break;
                }
            }
            if(!existFlag) {
                productUrlList.add(dwgUrl);
            }
        });
        //一定是有对应物料的,从bom内剥离的
        picUrlList.forEach(picUrl->{
            for (ProductBom bom :bomList){
                String filename = picUrl.substring(picUrl.lastIndexOf(File.separator) + 1,picUrl.lastIndexOf("."));
                String fileFullName = picUrl.substring(picUrl.lastIndexOf(File.separator) + 1);
                if(bom.getSubModel().toUpperCase().equals(filename.toUpperCase())){
                    bom.setPictureUrl("doc_file" + File.separator + "material"
                            + File.separator + fileFullName);
                    break;
                }
            }
        });
        //转移路径
        String projectDir = CommonUtil.getProjectDir();
        //doc_file/product/{产品型号}/standard或者{customCode}}/{version}/
        //跟子件挂钩的转移到子件图纸下:doc_file/material/
        String customCodeString = null;
        if(customCode!=null && !customCode.equals("")) {
            customCodeString = customCode;
        }else{
            customCodeString = "standard";
        }
        String productDir = projectDir + File.separator + "doc_file" + File.separator + "product" + File.separator + parentModel
                + File.separator + customCodeString + File.separator +nextVersion;
        String materialDir = projectDir + File.separator + "doc_file" + File.separator + "material";
        File productDirFile = new File(productDir);
        File materialFile = new File(materialDir);
        if(!productDirFile.exists()){
            productDirFile.mkdirs();
        }
        if(!materialFile.exists()){
            materialFile.mkdirs();
        }
        productUrlList.forEach(productUrl->{
            String dwgName = productUrl.substring(productUrl.lastIndexOf(File.separator) + 1, productUrl.length() - 4);
            try {
                FileCopyUtils.copy(new File(productUrl),new File(productDir+File.separator+dwgName+".dwg"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        materialUrlList.forEach(materialUrl->{
            String dwgName = materialUrl.substring(materialUrl.lastIndexOf(File.separator) + 1, materialUrl.length() - 4);
            try {
                FileCopyUtils.copy(new File(materialUrl),new File(materialDir+File.separator+dwgName+".dwg"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        picUrlList.forEach(picUrl->{
            String picFullName = picUrl.substring(picUrl.lastIndexOf(File.separator) + 1);
            try {
                FileCopyUtils.copy(new File(picUrl),new File(materialDir+File.separator+picFullName));
            } catch (IOException e) {
                e.printStackTrace();
            }
        });
        //物料表中不存在的(依据:物料编码+物料型号),则添加到物料表中去(包含product这个物料)
        List<Material> materialExistList = mService.getListByCodeAndModelList2(bomList);
        List<String> subCodeList = materialExistList.stream().map(Material::getSubCode).collect(Collectors.toList());
        List<Material> materialList = new LinkedList<>();
        bomList.forEach(bom->{
            if(!subCodeList.contains(bom.getSubCode())){
                Material material = new Material();
                material.setCategory(bom.getCategory());
                material.setCreateDate(bom.getCreateDate());
                material.setDwgUrl(bom.getDwgUrl());
                material.setFileUrl(bom.getFileUrl());
                material.setMaterial(bom.getMaterial());
                material.setNotes(bom.getNotes());
                material.setPictureUrl(bom.getPictureUrl());
                material.setProducer(bom.getProducer());
                // TODO 是否要更新同物料编码的老物料状态为0?
                material.setStatus(1);
                material.setSubCode(bom.getSubCode());
                material.setSubModel(bom.getSubModel());
                material.setSubName(bom.getSubName());
                material.setSurfaceDetail(bom.getSurfaceDetail());
                material.setThickness(bom.getThickness());
                material.setType(bom.getType());
                material.setUnit(bom.getUnit());
                materialList.add(material);
            }
        });
        //母料是否存在
        Material materialDB = mService.getByCodeAndModel(product.getParentCode(),product.getParentModel());
        if(materialDB==null) {
            Material material = new Material();
            material.setSubCode(product.getParentCode());
            material.setSubName(product.getParentName());
            material.setSubModel(product.getParentModel());
            materialList.add(material);
        }
        mService.insertBatch(materialList);
        //更新product_history/product_bom_history/product/product_bom,
        // product的主键沿用对应product_history的
        //根据编码和型号确定物料id并对应quantity,存入数据库.
        //List<Material> bomMaterialList = mService.getListByCodeAndModelList2(bomList);
        List<ProductBom> bomMaterialList = pbService.getListByCodeAndModelList2(bomList);
        // -> product_history
        ProductHistory productHistory = new ProductHistory();
        productHistory.setParentCode(product.getParentCode());
        productHistory.setParentName(product.getParentName());
        productHistory.setParentModel(product.getParentModel());
        productHistory.setNotes(product.getNotes());
        productHistory.setCustomCode(product.getCustomCode());
        productHistory.setCreateTime(date);
        productHistory.setVersionTime(product.getVersionTime());
        productHistory.setVersion(nextVersion);
        //版本新增,初始bom子件版本为1
        productHistory.setSubVersionMax(1);
        productHistory.setEnabled(1);
        phService.insertAndUpdateEnabled(productHistory);
        // -> product
        product.setId(productHistory.getId());
        product.setCreateTime(date);
        product.setVersion(nextVersion);
        deleteAndInsert(product);
        // -> product_bom
        List<ProductBom> productBomList = new LinkedList<>();
        bomMaterialList.forEach(bomMaterial->{
            ProductBom bom = new ProductBom();
            bom.setProductId(product.getId());
            bom.setMaterialId(bomMaterial.getId());
            bom.setQuantity(bomMaterial.getQuantity());
            bom.setSubVersion(1);
            bom.setCreateDate(date);
            productBomList.add(bom);
        });
        pbService.insertBatch(productBomList);
        // -> product_bom_history
        List<ProductBomHistory> bomHistoryList = new LinkedList<>();
        bomMaterialList.forEach(bomMaterial->{
            ProductBomHistory bomHistory = new ProductBomHistory();
            bomHistory.setProductId(productHistory.getId());
            bomHistory.setMaterialId(bomMaterial.getId());
            bomHistory.setQuantity(bomMaterial.getQuantity());
            bomHistory.setSubSVersion(1);
            bomHistory.setSubEVersion(1);
            bomHistory.setCreateDate(date);
            bomHistoryList.add(bomHistory);
        });
        pbhService.insertBatch(bomHistoryList);
        return new Response().setII(1,"新增完成");
    }
    private void deleteAndInsert(Product product) {
        Product productDB = getByProductCodeAndCustomCode(product.getParentCode(), product.getCustomCode());
        mapper.deleteById(productDB.getId());
        pbService.deleteByProductId(productDB.getId());
        mapper.insert(product);
    }
    private Product getByProductCodeAndCustomCode(String parentCode, String customCode) {
        QueryWrapper<Product> query = Wrappers.query();
        query.eq("parent_code",parentCode).eq("custom_code",customCode).last(" limit 1");
        return mapper.selectOne(query);
    }
    //查询出所有的产品无参不分页(产品上传的是用)
    public Response getUpBomUseProduct() {
        List list=mapper.selectList(null);
        return new Response().setII(1,list.size()>0,list,"");
    }
}