package com.chinaztt.mes.quality.service.impl; import cn.hutool.core.collection.CollectionUtil; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.chinaztt.mes.quality.entity.TestStandard; import com.chinaztt.mes.quality.entity.TestStandardParam; import com.chinaztt.mes.quality.mapper.TestStandardMapper; import com.chinaztt.mes.quality.mapper.TestStandardParamMapper; import com.chinaztt.mes.quality.service.TestStandardParamService; import com.chinaztt.mes.quality.utils.AutoJudgmentUtils; import com.chinaztt.mes.quality.utils.FunctionConfig; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; /** * 检测标准参数 * * @author cxf * @date 2021-04-22 09:03:13 */ @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class TestStandardParamServiceImpl extends ServiceImpl implements TestStandardParamService { private TestStandardMapper testStandardMapper; @Override public boolean saveList(List testStandardParamList) { if (CollectionUtil.isNotEmpty(testStandardParamList)) { String oldCode = "";//旧检测编号 String newCode = "";//新检测编号 String oldCodeF = "";//旧检测编号(替换公式用) String newCodeF = "";//新检测编号(替换公式用) Map codeMap = new HashMap<>(); for(TestStandardParam testStandardParam : testStandardParamList){ if(testStandardParam.getWireCore() == null){ testStandardParam.setWireCore(""); } } //根据线芯进行分组 Set wireCodeGroup = testStandardParamList.stream().map(o -> o.getWireCore()).collect(Collectors.toSet()); for(String wireCode : wireCodeGroup){ Map codeMapIn = new HashMap<>(); for(TestStandardParam testStandardParam : testStandardParamList.stream().filter(o -> o.getWireCore().equals(wireCode)).collect(Collectors.toList())){ //根据线芯进行拼接生成新的“检测项编号” if(StringUtils.isNotBlank(testStandardParam.getWireCore()) && !testStandardParam.getCode().contains("_")){ //新增线芯 oldCode = testStandardParam.getCode(); oldCodeF = "[" + oldCode + "]"; testStandardParam.setCode(testStandardParam.getCode() + "_" + testStandardParam.getWireCore());//生成新的编号 newCode = testStandardParam.getCode(); newCodeF = "[" + newCode + "]"; codeMap.put(newCodeF,oldCodeF); codeMapIn.put(newCodeF,oldCodeF); if(false){ //name不替换 testStandardParam.setParameterItem(testStandardParam.getParameterItem() + "_" + testStandardParam.getWireCore());//生成新的检测项名称 } replaceFormulaParamPresentLine(testStandardParam,newCodeF,oldCodeF); //替换公式中的参数(原参数code没有后缀,替换成有后缀的) if(false){//逐行替换完之后再进行全局替换 AutoJudgmentUtils.replaceFormulaParam(testStandardParamList,newCodeF,oldCodeF); } //替换主表中的判定公式的参数code replaceFormulaParamMain(testStandardParam.getTestStandardId(),oldCodeF,newCodeF); }else if(StringUtils.isBlank(testStandardParam.getWireCore()) && testStandardParam.getCode().contains("_")){ //删除线芯 oldCode = testStandardParam.getCode(); oldCodeF = "[" + oldCode + "]"; testStandardParam.setCode(testStandardParam.getCode().split("_")[0]);//剔除编号后缀 newCode = testStandardParam.getCode(); newCodeF = "[" + newCode + "]"; codeMap.put(newCodeF,oldCodeF); codeMapIn.put(newCodeF,oldCodeF); if(false){ testStandardParam.setParameterItem(testStandardParam.getParameterItem().split("_")[0]);//剔除检测项名称后缀 } replaceFormulaParamPresentLine(testStandardParam,newCodeF,oldCodeF); //替换公式中的参数(原参数code有后缀,替换成没有后缀的) if(false){//逐行替换完之后再进行全局替换 AutoJudgmentUtils.replaceFormulaParam(testStandardParamList,newCodeF,oldCodeF); } //替换主表中的判定公式的参数code replaceFormulaParamMain(testStandardParam.getTestStandardId(),oldCodeF,newCodeF); }else if(StringUtils.isNotBlank(testStandardParam.getWireCore()) && testStandardParam.getCode().contains("_") && testStandardParam.getId() != null && testStandardParam.getId() != 0){ //验证是否是修改 TestStandardParam testStandardParam_tmp = baseMapper.selectById(testStandardParam.getId()); if(!testStandardParam_tmp.getWireCore().equals(testStandardParam.getWireCore())){ oldCode = testStandardParam_tmp.getCode(); oldCodeF = "[" + oldCode + "]"; newCode = oldCode.replace(testStandardParam_tmp.getWireCore(),testStandardParam.getWireCore()); newCodeF = "[" + newCode + "]"; codeMap.put(newCodeF,oldCodeF); codeMapIn.put(newCodeF,oldCodeF); testStandardParam.setCode(newCode); if(false){ testStandardParam.setParameterItem(testStandardParam.getParameterItem().replace(testStandardParam_tmp.getWireCore(),testStandardParam.getWireCore())); } replaceFormulaParamPresentLine(testStandardParam,newCodeF,oldCodeF); //替换公式中的参数 if(false){//逐行替换完之后再进行全局替换 AutoJudgmentUtils.replaceFormulaParam(testStandardParamList,newCodeF,oldCodeF); } //替换主表中的判定公式的参数code replaceFormulaParamMain(testStandardParam.getTestStandardId(),oldCodeF,newCodeF); } } } //分组中全局替换公式中的code for(Map.Entry vo : codeMapIn.entrySet()){ AutoJudgmentUtils.replaceFormulaParam(testStandardParamList.stream().filter(o -> o.getWireCore().equals(wireCode)).collect(Collectors.toList()),vo.getKey(),vo.getValue()); } } //校验编号是否重复 Set itemCode = testStandardParamList.stream().map(o -> o.getCode()).collect(Collectors.toSet());//自动去重 if(itemCode.size() != testStandardParamList.size()){ throw new RuntimeException("提交检测项参数列表 -> " + " 检测项编号重复"); } //全局替换公式中的code for(Map.Entry vo : codeMap.entrySet()){ AutoJudgmentUtils.replaceFormulaParam(testStandardParamList,vo.getKey(),vo.getValue()); } // 先删除 baseMapper.delete(Wrappers.lambdaQuery().eq(TestStandardParam::getTestStandardId, testStandardParamList.get(0).getTestStandardId())); // 后更新/新增 testStandardParamList.stream().forEach(testStandardParam -> { if (testStandardParam.getId() != null && testStandardParam.getId() != 0) { if (StringUtils.isNotBlank(testStandardParam.getParameterFormat())) { boolean matches = testStandardParam.getParameterFormat().matches(FunctionConfig.PATTEN_MIN_MATH_FORMAT.pattern()); if (!matches) { throw new RuntimeException("参数格式 = 【" + testStandardParam.getParameterFormat() + "】 -> 错误"); } } baseMapper.activeById(testStandardParam.getId()); baseMapper.updateById(testStandardParam); } else { if (StringUtils.isNotBlank(testStandardParam.getParameterFormat())) { boolean matches = testStandardParam.getParameterFormat().matches(FunctionConfig.PATTEN_MIN_MATH_FORMAT.pattern()); if (!matches) { throw new RuntimeException("参数格式 = 【" + testStandardParam.getParameterFormat() + "】 -> 错误"); } } baseMapper.insert(testStandardParam); } }); } return true; } /** * 替换主表判定公式中的参数code * @param id 检测标准主表id * @param oldCode 旧检测项编号 * @param newCode 新检测项编号 */ private void replaceFormulaParamMain(Long id,String oldCode,String newCode){ if(false){ //主表中公式的替换会出现相同的原始code对应不同的“线芯”,替换时无法识别 TestStandard testStandard = testStandardMapper.selectById(id); if(StringUtils.isNotBlank(testStandard.getJudgeFormula())){ testStandard.setJudgeFormula(testStandard.getJudgeFormula().replace(oldCode,newCode)); testStandardMapper.updateById(testStandard); } } } /** * 替换当前行公式中的code(公式中的code若与当前行的参数code相同,则只指代当前行的参code) * @param testStandardParam * @param newCode * @param oldCode */ private void replaceFormulaParamPresentLine(TestStandardParam testStandardParam, String newCode, String oldCode){ //如果公式字段中有值,则替换 if(StringUtils.isNotBlank(testStandardParam.getJudgeFormula())){ //判断公式 testStandardParam.setJudgeFormula(testStandardParam.getJudgeFormula().replace(oldCode,newCode)); } if(StringUtils.isNotBlank(testStandardParam.getValueFormula())){ //值计算公式 testStandardParam.setValueFormula(testStandardParam.getValueFormula().replace(oldCode,newCode)); } } }