Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java
@@ -29,6 +29,9 @@
import com.vci.ubcs.starter.web.enumpck.OsCodeFillTypeEnum;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.web.util.VciDateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.secure.utils.AuthUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
@@ -42,6 +45,7 @@
import static com.vci.ubcs.code.constant.MdmEngineConstant.*;
@Service
@Slf4j
public class MdmProductCodeServiceImpl  implements MdmProductCodeService {
   /**
@@ -95,10 +99,13 @@
//         SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo();
         List<CodeAllCode> allCodeDOList = new ArrayList<>();
         Map<String/**流水依据**/, Map<String/**码段的主键**/,Double/**最大流水号**/>> maxSerialMap = new HashMap<>();
         // TODO 多线程流引发的问题已修改
         dataCBOList.parallelStream().forEach(cbo->{
            log.info("code:----->"+cbo.getId());
//            VciBaseUtil.setCurrentUserSessionInfo(sessionInfo);
            String code = cbo.getId();
            List<String> serialUnitList = new ArrayList<>();
            String seclenghStr=cbo.getData().get(CODE_SEC_LENGTH_FIELD);
            String[] secLengths = cbo.getData().get(CODE_SEC_LENGTH_FIELD).split("#");
            cbo.getData().remove(CODE_SEC_LENGTH_FIELD);//将此key除去
            cbo.getData().remove(IMPORT_ROW_INDEX);//将此key除去
@@ -109,18 +116,18 @@
            for (int i = 0; i < secLengths.length; i++) {
               CodeBasicSecVO secVO = secVOList.get(i);
               String thisSecValue  = "";
               if(i == 0){
                  thisSecValue = code.contains("#")?code.substring(0,code.indexOf("#")):code;
               /*if(i == 0){
                  thisSecValue = seclenghStr.contains("#")?code.substring(0,VciBaseUtil.getInt(secLengths[i])):code;
               } else if(i == secLengths.length-1){
                  //最后
                  thisSecValue =  code.contains("#")?code.substring(code.lastIndexOf("#")):code;
               }else {
                  thisSecValue =  seclenghStr.contains("#")?code.substring(VciBaseUtil.getInt(secLengths[i-1]),code.length()):code;
               }else {*/
                  int start = 0;
                  for (int j = 0; j < i; j++) {
                     start += VciBaseUtil.getInt(secLengths[j]) + 1;
                     start += VciBaseUtil.getInt(secLengths[j]);
                  }
                  thisSecValue = code.substring(start,start+VciBaseUtil.getInt(secLengths[1]));
               }
                  thisSecValue = code.substring(start,start+VciBaseUtil.getInt(secLengths[i]));
            //   }
               if(VciBaseUtil.getBoolean(secVO.getSerialDependFlag())){
                  serialUnitList.add(thisSecValue);
               }
@@ -145,7 +152,14 @@
                        OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()))));
                  }
                  Map<String, Double> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>());
                  thisUnitMaxMap.put(secOid,serialDb);
                  Double maxValue=serialDb;
                  if(thisUnitMaxMap.containsKey(secOid)){
                     maxValue=  thisUnitMaxMap.getOrDefault(secOid,new Double(-1));
                     if(maxValue<serialDb){
                        maxValue=serialDb;
                     }
                  }
                  thisUnitMaxMap.put(secOid,maxValue);
                  maxSerialMap.put(serialUnitString,thisUnitMaxMap);
                  serialUnFileStringList.add(String.valueOf(serialDb));
               });
@@ -159,13 +173,15 @@
            allCodeDO.setCreateCodeBtm(cbo.getBtmname());
            allCodeDO.setCreateCodeOid(cbo.getOid());
            allCodeDO.setSerialUnit(serialUnitString);
            allCodeDO.setUnFillSerial(serialUnFileStringList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE)));
            String unFillSerial =serialUnFileStringList.size()==1?serialUnFileStringList.get(0)+ SERIAL_VALUE_SPACE:serialUnFileStringList.stream().collect(Collectors.joining(SERIAL_VALUE_SPACE));
            allCodeDO.setUnFillSerial(unFillSerial);
            allCodeDO.setLcStatus(cbo.getLcStatus());
            allCodeDOList.add(allCodeDO);
         });
         //处理最大的流水号
         List<CodeSerialValue> addSerialValueList = new ArrayList<>();
         List<CodeSerialValue> editSerialValueList = new ArrayList<>();
         log.info("maxSerialMap:----->"+maxSerialMap.size());
         maxSerialMap.forEach((serialUnit,secOidMaxMap)->{
            secOidMaxMap.forEach((secOid,maxSerial)->{
               QueryWrapper<CodeSerialValue> queryWrapper = new QueryWrapper<>();
@@ -175,15 +191,19 @@
               queryWrapper.eq("codeSecOid", secOid);
               List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(queryWrapper);
               log.info("serialValueDOS--->"+serialValueDOS.size());
               if (!CollectionUtils.isEmpty(serialValueDOS)) {
                  CodeSerialValue serialValueDO = serialValueDOS.get(0);
                  log.info("oldmaxSerial--->"+serialValueDO.getMaxSerial()+"---- newmaxSerial---->"+maxSerial);
                  if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<maxSerial){
                     serialValueDO.setMaxSerial(String.valueOf(maxSerial));
                     DefaultAttrAssimtUtil.updateDefaultAttrAssimt(serialValueDO);
                     editSerialValueList.add(serialValueDO);
                  }
               }else{
                  //没有
                  CodeSerialValue serialValueDO = new CodeSerialValue();
                  DefaultAttrAssimtUtil.addDefaultAttrAssimt(serialValueDO, MdmBtmTypeConstant.CODE_SERIAL_VALUE);
                  serialValueDO.setCodeRuleOid(ruleVO.getOid());
                  serialValueDO.setSerialUnit(serialUnit);
                  serialValueDO.setCodeSecOid(secOid);
@@ -204,6 +224,7 @@
         }
         //处理allCode
         if(!CollectionUtils.isEmpty(allCodeDOList)){
            // TODO 历史数据导入的时候这儿偶尔会触发空指针异常
            Map<String,List<CodeAllCode>> ruleGroup = allCodeDOList.stream().collect(Collectors.groupingBy(s -> s.getCodeRuleOid()));
            Map<String, CodeAllCode> codeDOMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getCodeRuleOid() + "${SEP}" + s.getId(), t -> t));
            List<CodeAllCode> addCodeDOs = new ArrayList<>();
@@ -254,6 +275,31 @@
                     ArrayList::new));
               if( distinctCodeAllCOdes.size() != addCodeDOs.size() ){
                  throw new VciBaseException("编码数据重复,无法保存,请注意!");
               }
               QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
               wrapper.eq("CREATECODEBTM",addCodeDOs.get(0).getCreateCodeBtm());
               wrapper.in("ID",addCodeDOs.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
               List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
               List<CodeAllCode> takeBack = codeAllCodes.stream().filter(e -> e.getLcStatus().equals("TakeBack")).collect(Collectors.toList());
               if(codeAllCodes.size()>takeBack.size()){
                  throw new ServiceException("生成编码数据ID已有历史记录,请确认如下生成的ID数据:"+ addCodeDOs.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
               }
               for (CodeAllCode codeAllCode : takeBack) {
                  codeAllCode.setTs(new Date());
                  codeAllCode.setLastModifyTime(new Date());
                  codeAllCode.setLastModifier(AuthUtil.getUserId().toString());
                  Iterator<CodeAllCode> iterator = addCodeDOs.iterator();
                  while (iterator.hasNext()){
                     CodeAllCode next = iterator.next();
                     if(codeAllCode.getId().equals(next.getId())){
                        codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
                        codeAllCode.setLcStatus(next.getLcStatus());
                        iterator.remove();
                     }
                  }
               }
               if(takeBack.size()>0){
                  codeAllCodeService.updateBatchById(takeBack);
               }
               codeAllCodeService.saveBatch(addCodeDOs);
            }
@@ -314,6 +360,7 @@
            //要存储最后的全部allcode
            wrapperAllCode(classifyFullInfoBO, ruleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString());
         }
         //处理最大流水
         saveSerialValue( ruleVO, lastMaxSerialValueMap, maxSerialValueMap);
         allCodeDOList.stream().forEach(
@@ -333,7 +380,33 @@
               Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))),
               ArrayList::new));
         if( distinctCodeAllCOdes.size() != allCodeDOList.size() ){
            throw new VciBaseException("编码数据重复,无法保存,请注意!");
            throw new ServiceException("编码数据重复,无法保存,请注意!");
         }
         QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>();
         wrapper.eq("CREATECODEBTM",allCodeDOList.get(0).getCreateCodeBtm());
         wrapper.in("ID",allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
         List<CodeAllCode> codeAllCodes = codeAllCodeService.selectByWrapper(wrapper);
         List<CodeAllCode> takeBack = codeAllCodes.stream().filter(e -> e.getLcStatus().equals("TakeBack")).collect(Collectors.toList());
         if(codeAllCodes.size()>takeBack.size()){
            throw new ServiceException("生成编码数据ID已有历史记录,请确认如下生成的ID数据:"+ allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList()));
         }
         for (CodeAllCode codeAllCode : takeBack) {
            codeAllCode.setTs(new Date());
            codeAllCode.setLastModifyTime(new Date());
            codeAllCode.setLastModifier(AuthUtil.getUserId().toString());
            Iterator<CodeAllCode> iterator = allCodeDOList.iterator();
            while (iterator.hasNext()){
               CodeAllCode next = iterator.next();
               if(codeAllCode.getId().equals(next.getId())){
                  codeAllCode.setCreateCodeOid(next.getCreateCodeOid());
                  codeAllCode.setLcStatus(next.getLcStatus());
                  iterator.remove();
               }
            }
         }
         if(takeBack.size()>0){
            codeAllCodeService.updateBatchById(takeBack);
         }
         codeAllCodeService.saveBatch(allCodeDOList);
//         iCodeWupinService.saveBatch(dataCBOList);
@@ -516,7 +589,7 @@
                  secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
               } else {
                  //我们需要从顶层开始找到当前分类为止
                  secValue = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
                  secValue = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId();
               }
            } else {
               //指定层,我们需要通过上级的来获取
@@ -525,7 +598,7 @@
                  secValue = classifyFullInfoBO.getCurrentClassifyVO().getId();
               } else {
                  //这个我们需要看看,层级是不是大于了最大层级的数
                  List<CodeClassifyVO> parentClassifyVOList = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))).collect(Collectors.toList());
                  List<CodeClassifyVO> parentClassifyVOList = classifyFullInfoBO.getParentClassifyVOs().stream().sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).collect(Collectors.toList());
                  if (secVO.getCodeLevelValue() > (parentClassifyVOList.size() + 1)) {
                     //指定的层级比当前的层级还大了,所以只能获取当前层级了
                     if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType())) {
@@ -542,7 +615,7 @@
                        }
                     } else {
                        //小于等于的全部拿出来
                        secValue = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() <= secVO.getCodeLevelValue().intValue()).sorted(((o1, o2) -> o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining());
                        secValue = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() <= secVO.getCodeLevelValue().intValue()).sorted(((o1, o2) -> -o1.getDataLevel().compareTo(o2.getDataLevel()))).map(CodeClassifyVO::getId).collect(Collectors.joining());
                     }
                  }
               }
@@ -627,6 +700,7 @@
                                BaseModel cbo, CodeClassifyTemplateVO templateVO,
                                List<CodeAllCode> allCodeDOList, String serialUnitString, String serialValueString){
      CodeAllCode allCodeDO = new CodeAllCode();
      DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCodeDO, MdmBtmTypeConstant.CODE_ALL_CODE);
      allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid());
      allCodeDO.setCodeRuleOid(ruleVO.getOid());
      allCodeDO.setId(cbo.getId());
@@ -661,9 +735,11 @@
               //说明有
               serialValueDO = maxSerialValueMap.get(secOid).get(unit);
               serialValueDO.setMaxSerial(maxSerial.toString());
               DefaultAttrAssimtUtil.updateDefaultAttrAssimt(serialValueDO);
               editSerialValueDOList.add(serialValueDO);
            }else{
               serialValueDO = new CodeSerialValue();
               DefaultAttrAssimtUtil.addDefaultAttrAssimt(serialValueDO, MdmBtmTypeConstant.CODE_SERIAL_VALUE);
               serialValueDO.setCodeRuleOid(ruleVO.getOid());
               serialValueDO.setSerialUnit(unit);
               serialValueDO.setCodeSecOid(secOid);
@@ -716,12 +792,14 @@
   private String killFillChar(String s, String fillString,boolean left){
      Integer index = 0;
      String value = s;
      if(left){
         for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if((new String(new char[]{c})).equalsIgnoreCase(fillString)){
               index = i;
            if(!(new String(new char[]{c})).equalsIgnoreCase(fillString)){
               break;
            }
            index = i;
         }
         if(index >0){
            value = value.substring(index);
@@ -730,9 +808,10 @@
         //从右往左找
         for (int i = s.length()-1; i >=0; i++) {
            char c = s.charAt(i);
            if((new String(new char[]{c})).equalsIgnoreCase(fillString)){
               index = i;
            if(!(new String(new char[]{c})).equalsIgnoreCase(fillString)){
               break;
            }
            index = i;
         }
         if(index >0){
            value = value.substring(0,index);