whycxzp
2023-06-21 b0cf8fb827157f3bfc31d5ae155fdb786d0a9e24
src/main/java/com/whyc/service/ProductService.java
@@ -8,11 +8,8 @@
import com.whyc.dto.Response;
import com.whyc.mapper.ProductMapper;
import com.whyc.pojo.*;
import com.whyc.util.ActionUtil;
import com.whyc.util.CommonUtil;
import com.whyc.util.DateUtil;
import com.whyc.util.FileUtil;
import com.whyc.util.Zip4jUtil;
import com.whyc.util.*;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Autowired;
@@ -24,6 +21,9 @@
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@Service
@@ -288,6 +288,19 @@
                    }
                    bomList.add(bom);
                }
                //追加物料规范校验 暂时去除这个功能
                /*List<MaterialCheckDTO> checkList = bomList.stream().map(bom->{
                    MaterialCheckDTO dto = new MaterialCheckDTO();
                    dto.setNum(bom.getId());
                    dto.setSubCode(bom.getSubCode());
                    dto.setSubName(bom.getSubName());
                    dto.setSubModel(bom.getSubModel());
                    return dto;
                }).collect(Collectors.toList());
                List<MaterialCheckDTO> irregularList = CommonUtil.checkFormat(checkList);
                if(irregularList.size()>0){
                    return response.setII(1,false,irregularList,"名称或型号命名不规范");
                }*/
                product.setBomList(bomList);
            }
        }
@@ -311,6 +324,13 @@
        return list;
    }
    /**
     * 这个接口是进行产品新增,产品bom新增的接口.
     * 新增方式有很多,有直接从zip解析新增产品,也可以基于原有产品复制进行定制等.需要注意兼容!
     * @param product 产品新增,bom新增,产品版本更新
     * @return
     * @throws IOException
     */
    @Transactional
    public Response add(Product product) throws IOException {
        String parentCode = product.getParentCode();
@@ -318,7 +338,6 @@
        String parentModel = product.getParentModel();
        List<ProductBom> bomList = product.getBomList();
        String zipFilePath = product.getFileUrl();
        String fileUrl = zipFilePath.substring(0,zipFilePath.lastIndexOf(File.separator));
        Date date = new Date();
        boolean isCopyCustom = false;
        Product relatedProduct = null;
@@ -330,6 +349,11 @@
            if(product.getId() != null){ //关联关系从产品id继承
                relatedProduct = getById(product.getId());
            }
        }
        //不是基于产品复制,则必定存在zip包,必然存在路径
        String fileUrl = null;
        if(!isCopyCustom) {
            fileUrl = zipFilePath.substring(0, zipFilePath.lastIndexOf(File.separator));
        }
        //查询新增产品最新的版本号
        ProductHistory latestProduct = phService.getLatestVersion(parentCode, customCode);
@@ -604,8 +628,8 @@
            List<String> subCodeList = materialExistList.stream().map(material -> material.getSubCode()+"/"+material.getSubModel()).collect(Collectors.toList());
            List<Material> materialList = new LinkedList<>();
            List<Material> materialUpdateList = new LinkedList<>();
            bomList.forEach(bom -> {
                if (!subCodeList.contains(bom.getSubCode()+"/"+bom.getSubModel())) {
            for (ProductBom bom : bomList) {
                if (!subCodeList.contains(bom.getSubCode() + "/" + bom.getSubModel())) {
                    Material material = new Material();
                    material.setCreateDate(date);
                    material.setDwgUrl(bom.getDwgUrl());
@@ -620,7 +644,7 @@
                    material.setUnit(bom.getUnit());
                    materialList.add(material);
                }else{ //物料已经存在的
                } else { //物料已经存在的
                    Material material = new Material();
                    if (bom.getPictureUrl() != null) {
                        material.setPictureUrl(bom.getPictureUrl());
@@ -628,13 +652,16 @@
                    if (bom.getDwgUrl() != null) {
                        material.setDwgUrl(bom.getDwgUrl());
                    }
                    if(material.getPictureUrl()!=null || material.getDwgUrl()!=null){
                    if (material.getPictureUrl() != null || material.getDwgUrl() != null) {
                        material.setSubCode(bom.getSubCode());
                        material.setSubModel(bom.getSubModel());
                        materialUpdateList.add(material);
                    }
                }
            });
            }
            //对新增到物料表中的物料,根据 物料编码+物料型号 进行去重处理
            materialList = materialList.stream().filter(distinctByKey(m->m.getSubCode()+"/"+m.getSubModel())).collect(Collectors.toList());
            //母料是否存在
            Material materialDB = mService.getByCodeAndModel(product.getParentCode(), product.getParentModel());
            if (materialDB == null) {
@@ -657,7 +684,20 @@
            // product的主键沿用对应product_history的
            //根据编码和型号确定物料id并对应quantity,存入数据库.
            //List<Material> bomMaterialList = mService.getListByCodeAndModelList2(bomList);
            List<ProductBom> bomMaterialList = pbService.getListByCodeAndModelList2(bomList);
            //List<ProductBom> bomMaterialList = pbService.getListByCodeAndModelList2(bomList);
            List<Material> existMaterialListWithSameSubCodeAndModel = mService.getSameSubCodeAndModel(bomList);
            List<ProductBom> bomMaterialList;
            bomList.forEach(bom->{
                String codeModelUnionStr = bom.getSubCode() + "/" + bom.getSubModel();
                for (int i = 0; i < existMaterialListWithSameSubCodeAndModel.size(); i++) {
                    Material materialExists = existMaterialListWithSameSubCodeAndModel.get(i);
                    if(codeModelUnionStr.equals(materialExists.getSubCode() + "/" + materialExists.getSubModel())){
                        bom.setId(materialExists.getId());
                        break;
                    }
                }
            });
            bomMaterialList = bomList;
            // -> product_history
            ProductHistory productHistory = new ProductHistory();
            productHistory.setParentCode(product.getParentCode());
@@ -773,4 +813,9 @@
        List list=mapper.selectList(null);
        return new Response().setII(1,list.size()>0,list,"产品对比下拉选中-查询当前使用的所有的产品");
    }
    public static <T> Predicate<T> distinctByKey(Function<? super T, Object> keyExtractor) {
        Map<Object, Boolean> seen = new ConcurrentHashMap<>();
        return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE) == null;
    }
}