¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.vci.ubcs.code.service.impl; |
| | | |
| | | import com.alibaba.nacos.common.utils.StringUtils; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.vci.ubcs.code.algorithm.CustomSerialEnum; |
| | | import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO; |
| | | import com.vci.ubcs.code.dto.CodeCustomSerialDTO; |
| | | import com.vci.ubcs.code.dto.CodeOrderSecDTO; |
| | | import com.vci.ubcs.code.entity.CodeAllCode; |
| | | import com.vci.ubcs.code.entity.CodeClassifyValue; |
| | | import com.vci.ubcs.code.entity.CodeSerialValue; |
| | | import com.vci.ubcs.code.enumpack.CodeCutTypeEnum; |
| | | import com.vci.ubcs.code.enumpack.CodeGetValueTypeEnum; |
| | | import com.vci.ubcs.code.enumpack.CodeLevelTypeEnum; |
| | | import com.vci.ubcs.code.enumpack.CodeSecTypeEnum; |
| | | import com.vci.ubcs.code.lifecycle.CodeAllCodeLC; |
| | | import com.vci.ubcs.code.mapper.CodeClassifyValueMapper; |
| | | import com.vci.ubcs.code.mapper.CodeSerialValueMapper; |
| | | import com.vci.ubcs.code.service.MdmEngineService; |
| | | import com.vci.ubcs.code.service.MdmProductCodeService; |
| | | import com.vci.ubcs.code.vo.pagemodel.CodeBasicSecVO; |
| | | import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateVO; |
| | | import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO; |
| | | import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO; |
| | | import com.vci.ubcs.starter.exception.VciBaseException; |
| | | import com.vci.ubcs.starter.revision.model.BaseModel; |
| | | import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil; |
| | | import com.vci.ubcs.starter.util.MdmBtmTypeConstant; |
| | | import com.vci.ubcs.starter.web.constant.QueryOptionConstant; |
| | | import com.vci.ubcs.starter.web.constant.RegExpConstant; |
| | | 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.springblade.core.tool.utils.Func; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.lang.reflect.InvocationTargetException; |
| | | import java.lang.reflect.Method; |
| | | import java.util.*; |
| | | import java.util.concurrent.ConcurrentHashMap; |
| | | import java.util.concurrent.CopyOnWriteArrayList; |
| | | import java.util.concurrent.atomic.AtomicInteger; |
| | | import java.util.concurrent.atomic.AtomicReference; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static com.vci.ubcs.code.constant.MdmEngineConstant.*; |
| | | @Service |
| | | @Slf4j |
| | | public class MdmProductCodeServiceImpl implements MdmProductCodeService { |
| | | |
| | | /** |
| | | * æµæ°´å·çç¸å
³çä¿¡æ¯ |
| | | */ |
| | | @Resource |
| | | private CodeSerialValueMapper serialValueMapper; |
| | | |
| | | /** |
| | | * æµæ°´å·çç¸å
³çä¿¡æ¯ |
| | | */ |
| | | @Resource |
| | | private CodeClassifyValueMapper codeClassifyValueMapper; |
| | | |
| | | /** |
| | | * ææçç¼ç çå
容 |
| | | */ |
| | | @Resource |
| | | private CodeAllCodeServiceImpl codeAllCodeService; |
| | | |
| | | /** |
| | | * ææçç¼ç çå
容 |
| | | */ |
| | | @Resource |
| | | @Lazy |
| | | private MdmEngineService mdmEngineService; |
| | | |
| | | /** |
| | | * å
¬å¼çæå¡ |
| | | */ |
| | | @Autowired |
| | | private FormulaServiceImpl formulaService; |
| | | |
| | | // 注å
¥äºå¡ç®¡çå¨ |
| | | // @Autowired |
| | | // private TransactionTemplate transactionTemplate; |
| | | |
| | | @Override |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public List<String> productCodeAndSaveData(CodeClassifyFullInfoBO classifyFullInfoBO, CodeClassifyTemplateVO templateVO, CodeRuleVO ruleVO, List<CodeOrderSecDTO> secDTOList, List<BaseModel> dataCBOList) throws Exception { |
| | | dataCBOList = dataCBOList.stream().sorted(((o1, o2) -> o1.getCreateTime().compareTo(o2.getCreateTime()))).collect(Collectors.toList()); |
| | | List<String> codeList = new ArrayList<>(); |
| | | final CodeRuleVO finalRuleVO = ruleVO; |
| | | /***** |
| | | * ä¿è¯å¹¶åçæ¶åï¼æå¤§æµæ°´å·é½å¯¹çï¼ä½æ¯è¿ç§å éæå¼ç«¯ |
| | | */ |
| | | if(dataCBOList.stream().anyMatch(cbo-> StringUtils.isNotBlank(cbo.getId())) |
| | | // && StringUtils.isNotBlank(cbo.getAttributeValue(CODE_SEC_LENGTH_FIELD)) |
| | | ){ |
| | | //æ¯å岿°æ®å¯¼å
¥ |
| | | //å岿°æ®æ§è¡çæ¶åï¼è¿ä¸ªç³»ç»ä¼å¾å¡ |
| | | //ä¸»è¦æ¯ä¸ºäºå½å
¥æå¤§æµæ°´å·åallcode |
| | | //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo(); |
| | | List<CodeAllCode> allCodeDOList = new CopyOnWriteArrayList<>(); |
| | | Map<String/**æµæ°´ä¾æ®**/, HashMap<String/**ç æ®µç主é®**/,String/**æå¤§æµæ°´å·**/>> 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é¤å» |
| | | cbo.getData().remove("codeclassifyid");//å°æ¤keyé¤å» |
| | | List<CodeBasicSecVO> secVOList = finalRuleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList()); |
| | | Map<String/**ç æ®µç主é®**/,String/**ç æ®µçå¼**/> serialValueMap = new HashMap<>(); |
| | | Map<String, CodeBasicSecVO> secVOMap = secVOList.stream().collect(Collectors.toMap(s -> s.getOid(), t -> t)); |
| | | Map<String,Integer> serialSecOidIndexMap=new HashMap<>(); |
| | | for (int i = 0; i < secLengths.length; i++) { |
| | | CodeBasicSecVO secVO = secVOList.get(i); |
| | | String thisSecValue = ""; |
| | | /*if(i == 0){ |
| | | thisSecValue = seclenghStr.contains("#")?code.substring(0,VciBaseUtil.getInt(secLengths[i])):code; |
| | | } else if(i == secLengths.length-1){ |
| | | //æå |
| | | 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]); |
| | | } |
| | | thisSecValue = code.substring(start,start+VciBaseUtil.getInt(secLengths[i])); |
| | | // } |
| | | if(VciBaseUtil.getBoolean(secVO.getSerialDependFlag())){ |
| | | serialUnitList.add(thisSecValue); |
| | | serialSecOidIndexMap.put(secVO.getOid(),i); |
| | | } |
| | | if(CodeSecTypeEnum.CODE_SERIAL_SEC.getValue().equalsIgnoreCase(secVO.getSecType())){ |
| | | serialValueMap.put(secVO.getOid(),thisSecValue); |
| | | } |
| | | } |
| | | List<String> serialUnFileStringList = new ArrayList<>(); |
| | | AtomicReference<String> newSerialUnitString = new AtomicReference<>(""); |
| | | if(!CollectionUtils.isEmpty(serialValueMap)){ |
| | | AtomicInteger index= new AtomicInteger(); |
| | | serialValueMap.forEach((secOid,secValue)->{ |
| | | //è¦çæ¯ä¸æ¯è¡¥ä½ç |
| | | CodeBasicSecVO secVO = secVOMap.get(secOid); |
| | | List<String >newSerialUnitList=new ArrayList<>(); |
| | | newSerialUnitList.addAll(serialUnitList); |
| | | if(index.get() ==0){ |
| | | if(serialSecOidIndexMap.containsKey(secOid)) { |
| | | int num = serialSecOidIndexMap.get(secOid); |
| | | newSerialUnitList.set(num, ""); |
| | | } |
| | | } |
| | | String serialUnitString = newSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : newSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE)); |
| | | newSerialUnitString.set(serialUnitString); |
| | | index.getAndIncrement(); |
| | | String serialDb = ""; |
| | | // æªåæååç¼ä¹åçç æ®µ |
| | | String subSecValue = killPriffixSuffix(secValue, secVO.getPrefixCode(), secVO.getSuffixCode()); |
| | | if(OsCodeFillTypeEnum.NONE.getValue().equalsIgnoreCase(secVO.getCodeFillType())){ |
| | | //ä¸è¡¥ç |
| | | //æææä¸æ¯æ°åç廿ï¼å 为å¯è½ä¼æ¯èæ°æ®ï¼æ°è§å |
| | | // serialDb = VciBaseUtil.getDouble(killUnNumberChar(subSecValue)); |
| | | //serialDb = killUnNumberChar(subSecValue); |
| | | serialDb=subSecValue; |
| | | }else { |
| | | //å·¦å³å¡«å
çï¼æä»¬éè¦ |
| | | /*serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(subSecValue,secVO.getCodeFillSeparator(), |
| | | OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType()))));*/ |
| | | serialDb = killFillChar(subSecValue,secVO.getCodeFillSeparator(), |
| | | OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType())); |
| | | } |
| | | Double newSerialDb= CustomSerialEnum.getDoubleCustomSerialValue(secValue,secVO.getCustomCodeSerialType()); |
| | | HashMap<String, String> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>()); |
| | | Double maxValue=newSerialDb; |
| | | if(thisUnitMaxMap.containsKey(secOid)){ |
| | | String newMaxValue= thisUnitMaxMap.getOrDefault(secOid,""); |
| | | maxValue=StringUtils.isBlank(newMaxValue)?-1:VciBaseUtil.getDouble(newMaxValue); |
| | | if(maxValue<newSerialDb){ |
| | | maxValue=newSerialDb; |
| | | } |
| | | } |
| | | String newMaxValue=CustomSerialEnum.getStringCustomSerialValue(maxValue,secVO.getCustomCodeSerialType()); |
| | | serialDb=CustomSerialEnum.getStringCustomSerialValue(newSerialDb,secVO.getCustomCodeSerialType()); |
| | | thisUnitMaxMap.put(secOid,newMaxValue); |
| | | maxSerialMap.put(serialUnitString,thisUnitMaxMap); |
| | | serialUnFileStringList.add(String.valueOf(serialDb)); |
| | | }); |
| | | } |
| | | CodeAllCode allCodeDO = new CodeAllCode(); |
| | | DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCodeDO, MdmBtmTypeConstant.CODE_ALL_CODE); |
| | | allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid()); |
| | | allCodeDO.setCodeRuleOid(finalRuleVO.getOid()); |
| | | allCodeDO.setId(cbo.getId()); |
| | | allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid()); |
| | | allCodeDO.setCreateCodeBtm(cbo.getBtmname()); |
| | | allCodeDO.setCreateCodeOid(cbo.getOid()); |
| | | allCodeDO.setSerialUnit(newSerialUnitString.get()); |
| | | 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<>(); |
| | | queryWrapper.eq("codeRuleOid", finalRuleVO.getOid()); |
| | | queryWrapper.eq("serialUnit", serialUnit); |
| | | //è¿ä¸ªå段æ¯ä¸ºäºè§£å³å¤ä¸ªæµæ°´çé®é¢ |
| | | 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())<VciBaseUtil.getDouble(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(finalRuleVO.getOid()); |
| | | serialValueDO.setSerialUnit(serialUnit); |
| | | serialValueDO.setCodeSecOid(secOid); |
| | | serialValueDO.setMaxSerial(maxSerial.toString()); |
| | | addSerialValueList.add(serialValueDO); |
| | | } |
| | | }); |
| | | }); |
| | | if(!CollectionUtils.isEmpty(addSerialValueList)){ |
| | | for (CodeSerialValue codeSerialValue : addSerialValueList) { |
| | | serialValueMapper.insert(codeSerialValue); |
| | | } |
| | | } |
| | | if(!CollectionUtils.isEmpty(editSerialValueList)){ |
| | | for (CodeSerialValue codeSerialValue : editSerialValueList) { |
| | | serialValueMapper.updateById(codeSerialValue); |
| | | } |
| | | } |
| | | //å¤ç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<>(); |
| | | List<CodeAllCode> editCodeDOs = new ArrayList<>(); |
| | | ruleGroup.forEach((ruleOid,allCodeDOS)->{ |
| | | VciBaseUtil.switchCollectionForOracleIn(allCodeDOS).stream().forEach(codeDOs->{ |
| | | QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>(); |
| | | allCodeWrapper.eq("coderuleoid",ruleOid); |
| | | allCodeWrapper.in("id", QueryOptionConstant.IN + "(" + |
| | | VciBaseUtil.toInSql(codeDOs.stream().map(s->s.getId()).collect(Collectors.toList()).toArray(new String[0])) + ")"); |
| | | List<CodeAllCode> existCodes = codeAllCodeService.selectByWrapper(allCodeWrapper); |
| | | |
| | | |
| | | if(!CollectionUtils.isEmpty(existCodes)){ |
| | | existCodes.stream().forEach(existCode->{ |
| | | String rule_id = existCode.getCodeRuleOid() + "${SEP}" + existCode.getId(); |
| | | if(codeDOMap.containsKey(rule_id)){ |
| | | CodeAllCode newCodeDO = codeDOMap.get(rule_id); |
| | | existCode.setCreateCodeOid(newCodeDO.getOid()); |
| | | existCode.setCreateCodeBtm(newCodeDO.getCreateCodeBtm()); |
| | | existCode.setCodeClassifyTemplateOid(newCodeDO.getCodeClassifyTemplateOid()); |
| | | existCode.setCodeClassifyOid(newCodeDO.getCodeClassifyOid()); |
| | | existCode.setLcStatus(newCodeDO.getLcStatus()); |
| | | editCodeDOs.add(existCode); |
| | | } |
| | | }); |
| | | } |
| | | }); |
| | | }); |
| | | if(!CollectionUtils.isEmpty(editCodeDOs)){ |
| | | Set<String> exitIds = editCodeDOs.stream().map(s -> s.getCodeRuleOid() + "${SEP}" + s.getId()).collect(Collectors.toSet()); |
| | | addCodeDOs = allCodeDOList.stream().filter(s -> !exitIds.contains(s.getCodeRuleOid() + "${SEP}" + s.getId())).collect(Collectors.toList()); |
| | | }else{ |
| | | addCodeDOs = allCodeDOList; |
| | | } |
| | | if(!CollectionUtils.isEmpty(editCodeDOs)){ |
| | | codeAllCodeService.updateBatchById(editCodeDOs); |
| | | } |
| | | // è·åäºå¡å®ä¹ |
| | | //DefaultTransactionDefinition def = new DefaultTransactionDefinition(); |
| | | // å¼å§äºå¡ |
| | | //TransactionStatus status = transactionTemplate.getTransactionManager().getTransaction(def); |
| | | if(!CollectionUtils.isEmpty(addCodeDOs)){ |
| | | Map<String, String> statusMap = addCodeDOs.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus())); |
| | | addCodeDOs.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> { |
| | | s.setLcStatus(statusMap.get(s.getOid())); |
| | | }); |
| | | //éè¿IDæ¥è¿è¡å»é |
| | | List<CodeAllCode> distinctCodeAllCOdes = addCodeDOs.stream().collect(Collectors |
| | | .collectingAndThen( |
| | | Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))), |
| | | 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æ°æ®ï¼"+ codeAllCodes.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); |
| | | } |
| | | |
| | | // try { |
| | | mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList); |
| | | } |
| | | return codeList; |
| | | }else { |
| | | List<CodeBasicSecVO> secVOList = finalRuleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList()); |
| | | List<String> serialUnitList = new LinkedList<>(); |
| | | List<String> secValueList = new ArrayList<>(); |
| | | Map<String, String> secValueMap = secDTOList.stream().collect(Collectors.toMap(s -> s.getSecOid(), s -> s.getSecValue()==null?"":s.getSecValue())); |
| | | List<CodeBasicSecVO> serialSecVOList = new ArrayList<>(); |
| | | List<CodeBasicSecVO> attrSecVOList = new ArrayList<>(); |
| | | for (int i = 0; i < secVOList.size(); i++) { |
| | | CodeBasicSecVO secVO = secVOList.get(i); |
| | | switchSecValue(secVO, secValueMap, classifyFullInfoBO, serialSecVOList, attrSecVOList, serialUnitList, secValueList); |
| | | } |
| | | //å¤ç屿§ç æ®µåæµæ°´ç æ®µ |
| | | Map<String/**æµæ°´ç 段ç主é®**/, Map<String/**æµæ°´ä¾æ®**/, String>> lastMaxSerialValueMap = new HashMap<>(); |
| | | List<CodeAllCode> allCodeDOList = new ArrayList<>(); |
| | | |
| | | //å·²ç»åå¨çæå¤§æµæ°´å·çå
容 |
| | | Map<String/**ç æ®µç主é®**/, Map<String, CodeSerialValue>> maxSerialValueMap = new HashMap<>(); |
| | | |
| | | for (int i = 0; i < dataCBOList.size(); i++) { |
| | | BaseModel cbo = dataCBOList.get(i); |
| | | cbo.getData().remove(CODE_SEC_LENGTH_FIELD);//å°æ¤keyé¤å» |
| | | cbo.getData().remove(IMPORT_ROW_INDEX);//å°æ¤keyé¤å» |
| | | cbo.getData().remove("codeclassifyid");//å°æ¤keyé¤å» |
| | | List<String> thisSecValueList = new LinkedList<>(); |
| | | for (int j = 0; j < secValueList.size(); j++) { |
| | | thisSecValueList.add(secValueList.get(j)); |
| | | } |
| | | List<String> thisSerialUnitList = new LinkedList<>(); |
| | | //å ä¸ºæµæ°´ä¾æ®æ¯æ¬¡å¯è½ä¸ä¸æ ·ï¼æä»¥æ¯æ¬¡é½æ·è´ä¸ä»½ |
| | | for (int j = 0; j < serialUnitList.size(); j++) { |
| | | thisSerialUnitList.add(serialUnitList.get(j)); |
| | | } |
| | | //å
ççææ²¡æå±æ§çç æ®µ |
| | | boolean attrSevIsSerialDepend = CollectionUtils.isEmpty(attrSecVOList) ? false : (attrSecVOList.stream().anyMatch(s -> VciBaseUtil.getBoolean(s.getSerialDependFlag()))); |
| | | switchAttrSecValue(attrSecVOList, cbo, thisSecValueList, attrSevIsSerialDepend, thisSerialUnitList); |
| | | |
| | | String serialUnitString = thisSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : thisSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE)); |
| | | switchSerialSecValue(cbo,serialSecVOList, attrSevIsSerialDepend, finalRuleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0); |
| | | |
| | | //ç»è£
ç¼ç çå¼ |
| | | cbo.setId(thisSecValueList.stream().collect(Collectors.joining())); |
| | | codeList.add(cbo.getId()); |
| | | StringBuilder sb = new StringBuilder(); |
| | | //æç 段éé¢é½æ¾ä¸ä¸æµæ°´å· |
| | | for (int j = 0; j < serialSecVOList.size(); j++) { |
| | | CodeBasicSecVO secVO = serialSecVOList.get(j); |
| | | String serialValue = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()).getOrDefault(serialUnitString, ""); |
| | | if (serialValue != null) { |
| | | sb.append(serialValue).append(SERIAL_VALUE_SPACE); |
| | | } |
| | | } |
| | | //è¦å卿åçå
¨é¨allcode |
| | | wrapperAllCode(classifyFullInfoBO, finalRuleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString()); |
| | | } |
| | | //å¤çæå¤§æµæ°´ |
| | | saveSerialValue( finalRuleVO, lastMaxSerialValueMap, maxSerialValueMap); |
| | | |
| | | allCodeDOList.stream().forEach( |
| | | allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode");allCode.setLctid("codeAllCodeLC");} |
| | | ); |
| | | Map<String, String> statusMap = allCodeDOList.stream().collect(Collectors.toMap(s -> s.getOid(), s -> s.getLcStatus())); |
| | | allCodeDOList.stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmname())).forEach(s -> { |
| | | s.setLcStatus(statusMap.get(s.getOid())); |
| | | }); |
| | | //éè¿IDæ¥è¿è¡å»é |
| | | List<CodeAllCode> distinctCodeAllCOdes = allCodeDOList.stream().collect(Collectors |
| | | .collectingAndThen( |
| | | Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))), |
| | | ArrayList::new)); |
| | | if( distinctCodeAllCOdes.size() != allCodeDOList.size() ){ |
| | | 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æ°æ®ï¼"+ codeAllCodes.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(); |
| | | } |
| | | } |
| | | } |
| | | mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(), dataCBOList); |
| | | if(takeBack.size()>0){ |
| | | codeAllCodeService.updateBatchById(takeBack); |
| | | } |
| | | codeAllCodeService.saveBatch(allCodeDOList); |
| | | // iCodeWupinService.saveBatch(dataCBOList); |
| | | // æäº¤äºå¡ |
| | | // transactionTemplate.getTransactionManager().commit(status); |
| | | //}catch (Exception e){ |
| | | // åºç°å¼å¸¸æ¶åæ»äºå¡ |
| | | // transactionTemplate.getTransactionManager().rollback(status); |
| | | // throw e; |
| | | //} |
| | | // batchCBO.getCreateCbos().stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmName())).forEach(s -> { |
| | | // s.setLcStatus(statusMap.get(s.getOid())); |
| | | // try { |
| | | // s.setAttributeValue("lcstatus",statusMap.get(s.getOid())); |
| | | // } catch (VCIError e) { |
| | | // e.printStackTrace(); |
| | | // } |
| | | // }); |
| | | } |
| | | // WebUtil.setPersistence(true); |
| | | // boService.persistenceBatch(batchCBO); |
| | | return codeList; |
| | | } |
| | | |
| | | /** |
| | | * 转æ¢å±æ§ç 段çå¼ |
| | | * @param attrSecVOList 屿§ç æ®µçæ¾ç¤ºå¯¹è±¡ |
| | | * @param cbo ä¸å¡æ°æ®ï¼ç¨äºè·åç æ®µçå¼ |
| | | * @param thisSecValueList ç å¼çå表 |
| | | * @param attrSevIsSerialDepend æ¯å¦æä½ä¸ºæµæ°´ä¾æ® |
| | | * @param serialUnitList æµæ°´ä¾æ®çå
容 |
| | | * è¿éè¦åç»çä¸ä¸ªç§»æ¤å°ä¼æ¶åå°å
¶ä»çæå¡ |
| | | */ |
| | | private void switchAttrSecValue(List<CodeBasicSecVO> attrSecVOList, BaseModel cbo, |
| | | List<String> thisSecValueList, boolean attrSevIsSerialDepend, |
| | | List<String> serialUnitList){ |
| | | if (!CollectionUtils.isEmpty(attrSecVOList)) { |
| | | attrSecVOList.stream().forEach(attrSevVO -> { |
| | | String value = ""; |
| | | if (StringUtils.isNotBlank(attrSevVO.getGetValueClass())) { |
| | | //使ç¨ç»åè§åæ¥å¤çç |
| | | value = getValueByFormulaForCBO(cbo, attrSevVO.getGetValueClass()); |
| | | } else { |
| | | value = cbo.getData().get(attrSevVO.getReferAttributeId()); |
| | | } |
| | | if (value == null) { |
| | | value = ""; |
| | | } |
| | | //æ¿æ¢secValueListéé¢çå
容 |
| | | for (int j = 0; j < thisSecValueList.size(); j++) { |
| | | String secValue = thisSecValueList.get(j); |
| | | if (secValue.equalsIgnoreCase("${attr_" + attrSevVO.getOid() + "}")) { |
| | | // TODO: 屿§ç 段çæç å¼åï¼æ¼æ¥ååç¼ |
| | | thisSecValueList.set(j, joinPreffixAndSuffix(attrSevVO,value)); |
| | | } |
| | | } |
| | | if (attrSevIsSerialDepend) { |
| | | //æ¯æµæ°´ä¾èµçè¯ï¼éè¦å»æ¿æ¢ä¸ä¸ |
| | | for (int j = 0; j < serialUnitList.size(); j++) { |
| | | String secValue = serialUnitList.get(j); |
| | | if (secValue.equalsIgnoreCase("${attr_" + attrSevVO.getOid() + "}")) { |
| | | serialUnitList.set(j, joinPreffixAndSuffix(attrSevVO,value)); |
| | | } |
| | | } |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * è½¬æ¢æµæ°´ç 段çå¼ |
| | | * @param serialSecVOList æµæ°´ç 段 |
| | | * @param attrSevIsSerialDepend æ¯å¦æå±æ§ç 段å䏿µæ°´ |
| | | * @param ruleVO è§åçå
容 |
| | | * @param serialUnitString æµæ°´ä¾æ® |
| | | * @param maxSerialValueMap æå¤§çæµæ°´å· |
| | | * @param thisSecValueList æ¬æ¬¡çç å¼ |
| | | * @param lastMaxSerialValueMap å°è£
å |
| | | * @param firstData æ¯å¦ä¸ºç¬¬ä¸æ¡æ°æ® |
| | | */ |
| | | private void switchSerialSecValue(BaseModel cbo, List<CodeBasicSecVO> serialSecVOList,boolean attrSevIsSerialDepend, |
| | | CodeRuleVO ruleVO,String serialUnitString, |
| | | Map<String/**ç æ®µç主é®**/,Map<String/**æµæ°´ä¾æ®**/,CodeSerialValue>> maxSerialValueMap,List<String> thisSecValueList, |
| | | Map<String/**ç æ®µç主é®**/,Map<String/**æµæ°´ä¾æ®**/, String>> lastMaxSerialValueMap,boolean firstData){ |
| | | |
| | | if (!CollectionUtils.isEmpty(serialSecVOList)) { |
| | | Map<String,String> secIdserialValueMap=new LinkedHashMap<>(); |
| | | for (int j = 0; j < serialSecVOList.size(); j++) { |
| | | CodeBasicSecVO secVO = serialSecVOList.get(j); |
| | | String secVOValue=""; |
| | | AtomicReference<String> newSerialUnitString= new AtomicReference<>(serialUnitString); |
| | | if(j==0){ |
| | | secVOValue=""; |
| | | newSerialUnitString.set(serialUnitString.replace("${" + secVO.getOid() + "}", secVOValue)); |
| | | }else{ |
| | | CodeBasicSecVO upSecVO =serialSecVOList.get(j-1); |
| | | secIdserialValueMap.forEach((key,vaule)->{ |
| | | newSerialUnitString.set(serialUnitString.replace("${"+key+"}", vaule)); |
| | | }); |
| | | } |
| | | |
| | | if (attrSevIsSerialDepend || firstData) { |
| | | //妿屿§ç æ®µä¹æ¯ä¾èµï¼åæ¯æ¬¡é½è¦æ¥è¯¢ï¼å¦æå±æ§ç æ®µä¸æ¯ä¾èµï¼ååªæ¥è¯¢ä¸æ¬¡ |
| | | // Map<String, String> conditionMap = new HashMap<>(); |
| | | // conditionMap.put("codeRuleOid", ruleVO.getOid()); |
| | | // conditionMap.put("serialUnit", serialUnitString); |
| | | // //è¿ä¸ªå段æ¯ä¸ºäºè§£å³å¤ä¸ªæµæ°´çé®é¢ |
| | | // conditionMap.put("codeSecOid", secVO.getOid()); |
| | | QueryWrapper<CodeSerialValue> codeSerialWrapper = new QueryWrapper<>(); |
| | | |
| | | codeSerialWrapper.eq("codeRuleOid", ruleVO.getOid()); |
| | | codeSerialWrapper.eq("serialUnit", newSerialUnitString.get()); |
| | | codeSerialWrapper.eq("codeSecOid", secVO.getOid()); |
| | | List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(codeSerialWrapper); |
| | | if (!CollectionUtils.isEmpty(serialValueDOS)) { |
| | | Map<String, CodeSerialValue> unitSerialMap = maxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()); |
| | | CodeSerialValue serialValueDO = serialValueDOS.get(0); |
| | | unitSerialMap.put(serialValueDO.getSerialUnit(),serialValueDO); |
| | | maxSerialValueMap.put(secVO.getOid(), unitSerialMap); |
| | | } |
| | | } |
| | | String serialString=""; |
| | | String thisSerialValue = ""; |
| | | String startValue = null; |
| | | if (maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(newSerialUnitString.get())) { |
| | | startValue = maxSerialValueMap.get(secVO.getOid()).get(newSerialUnitString.get()).getMaxSerial(); |
| | | } |
| | | if (lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(newSerialUnitString.get())) { |
| | | //说æå¤ä¸ªç³è¯·ï¼ä¹åå·²ç»å äºæµæ°´å·äº |
| | | startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(newSerialUnitString.get()); |
| | | } |
| | | if(StringUtils.isNotBlank(secVO.getCustomCodeSerialClass())){//èªå®ä¹æµæ°´å¤ç |
| | | String currentFlowValue=startValue; |
| | | CodeCustomSerialDTO codeCustomSerialDTO=new CodeCustomSerialDTO(); |
| | | codeCustomSerialDTO.setSerialUnitString(newSerialUnitString.get()); |
| | | codeCustomSerialDTO.setSerialCodeCodeBasicSec(secVO); |
| | | codeCustomSerialDTO.setCurrentFlowValue(startValue); |
| | | codeCustomSerialDTO.setCodeBasicSecVOList(ruleVO.getSecVOList()); |
| | | codeCustomSerialDTO.setCodeRuleOid(ruleVO.getOid()); |
| | | codeCustomSerialDTO.setBaseModel(cbo); |
| | | thisSerialValue=customCodeSerial(secVO.getCustomCodeSerialClass(),codeCustomSerialDTO); |
| | | log.info(secVO.getCustomCodeSerialClassText()+"---->"+thisSerialValue); |
| | | }else { |
| | | Double newThisSerialValue = 0d; |
| | | if (startValue == null) { |
| | | //第ä¸ä¸ªç¼ç |
| | | newThisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart()); |
| | | } else { |
| | | //æµæ°´å·è¯å®æ¯æ°å |
| | | newThisSerialValue = Double.parseDouble(startValue) + (j + 1) * secVO.getSerialStep(); |
| | | } |
| | | //è¦çæ¯å¦è¶
è¿æå¤§çæµæ°´å¼ |
| | | if (newThisSerialValue >= secVO.getCodeFillLimit()) { |
| | | throw new VciBaseException("æµæ°´å·å·²ç»è¶
è¿å
许çæå¤§æµæ°´å¼{0}", new String[]{secVO.getCodeFillLimit().toString()}); |
| | | } |
| | | thisSerialValue=String.valueOf(newThisSerialValue.intValue()); |
| | | } |
| | | //è¦çè¡¥ä½çå
容 |
| | | Integer fillLength = VciBaseUtil.getInt(secVO.getCodeFillLength()); |
| | | if (fillLength == 0 || fillLength > VciBaseUtil.getInt(secVO.getCodeSecLength())) { |
| | | //鲿¢å¨æ·»å çå°æ¹æ²¡ææ§å¶æ£ç¡® |
| | | fillLength = VciBaseUtil.getInt(secVO.getCodeSecLength()); |
| | | } |
| | | serialString = thisSerialValue; |
| | | serialString = fillString(fillLength, OsCodeFillTypeEnum.forValue(secVO.getCodeFillType()), serialString, secVO.getCodeFillSeparator()); |
| | | |
| | | for (int z = 0; z < thisSecValueList.size(); z++) { |
| | | String secValue = thisSecValueList.get(z); |
| | | if (secValue.equalsIgnoreCase("${" + secVO.getOid() + "}")) { |
| | | // TODO: æµæ°´çæç å¼åæ¼æ¥ååç¼ |
| | | thisSecValueList.set(z, joinPreffixAndSuffix(secVO, serialString)); |
| | | } |
| | | } |
| | | secIdserialValueMap.put(secVO.getOid(),thisSerialValue);//è®°å½æµæ°´ç 段å½åçå¼ |
| | | Map<String, String> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()); |
| | | unitSerialMap.put(newSerialUnitString.get(), String.valueOf(thisSerialValue)); |
| | | lastMaxSerialValueMap.put(secVO.getOid(),unitSerialMap); |
| | | } |
| | | } |
| | | } |
| | | private String customCodeSerial(String className, CodeCustomSerialDTO codeCustomSerialDTO){ |
| | | String result = ""; |
| | | try { |
| | | Class classInstance=Class.forName(className); |
| | | Object obj =classInstance.newInstance(); |
| | | Method method= classInstance.getMethod("serialGenerate",CodeCustomSerialDTO.class); |
| | | method.setAccessible(Boolean.TRUE); |
| | | //method.invoke(obj); |
| | | Object o= method.invoke(obj,codeCustomSerialDTO); |
| | | result= Func.isEmpty(o) ?"":o.toString(); |
| | | } catch (ClassNotFoundException e) { |
| | | throw new VciBaseException("æªæ¾å°èªå®ä¹æµæ°´ç®æ³ç±»æä»¶"); |
| | | } catch (InvocationTargetException e) { |
| | | throw new VciBaseException("æ§è¡èªå®ä¹æµæ°´ç®æ³å¤çæ¹æ³åºç°å¼å¸¸"); |
| | | } catch (NoSuchMethodException e) { |
| | | throw new VciBaseException("æªæ¾å°èªå®ä¹æµæ°´ç®æ³å¤çæ¹æ³"); |
| | | } catch (IllegalAccessException e) { |
| | | throw new VciBaseException("æ§è¡èªå®ä¹æµæ°´ç®æ³å¤çæ¹æ³åºç°å¼å¸¸"); |
| | | } catch (InstantiationException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return result; |
| | | } |
| | | /** |
| | | * 转æ¢ç å¼çå
容 |
| | | * @param secVO ç æ®µçå
容 |
| | | * @param secValueMap ç å¼çå
容ï¼keyæ¯ç 段ç主é®ï¼valueæ¯ç å¼ |
| | | * @param classifyFullInfoBO åç±»çå
¨é¨ä¿¡æ¯ |
| | | * @param serialSecVOList æµæ°´ç 段 |
| | | * @param attrSecVOList 屿§ç 段 |
| | | * @param serialUnitList æµæ°´ä¾æ® |
| | | * @param secValueList ç å¼å表 |
| | | */ |
| | | private void switchSecValue(CodeBasicSecVO secVO,Map<String,String> secValueMap, |
| | | CodeClassifyFullInfoBO classifyFullInfoBO,List<CodeBasicSecVO> serialSecVOList, |
| | | List<CodeBasicSecVO> attrSecVOList, List<String> serialUnitList, |
| | | List<String> secValueList ){ |
| | | CodeSecTypeEnum secType = CodeSecTypeEnum.forValue(secVO.getSecType()); |
| | | String secValue = secValueMap.getOrDefault(secVO.getOid(), ""); |
| | | switch (secType) { |
| | | case CODE_FIXED_SEC: |
| | | secValue = joinPreffixAndSuffix(secVO, secValue); |
| | | //åºå®ç 段çï¼ç´æ¥ç¨ç å¼,ä¸è®ºç å¼çé¿åº¦æ¯å¤å°ï¼å 为å¯åé¿åº¦ååºå®é¿åº¦æ¯æ§å¶å¨ç 段管çéé¢çç å¼å®ä¹ç |
| | | break; |
| | | case CODE_DATE_SEC: |
| | | //æ¶é´ç 段ï¼éè¦å°å½åæ¶é´ä¾æ®æ¶é´æ ¼å¼è¿è¡è½¬æ¢. |
| | | //æ¶é´ç æ®µä¸æ¶åå°æ¯å¦è¡¥ä½ |
| | | secValue =joinPreffixAndSuffix(secVO, VciDateUtil.date2Str(new Date(), secVO.getCodeDateFormatStr())); |
| | | break; |
| | | case CODE_CLASSIFY_SEC: |
| | | //åç±»ç æ®µçï¼ä¹æ¯ä»åç«¯éæ©äºç å¼å³å¯ï¼ä¸è®ºç å¼çé¿åº¦æ¯å¤å° |
| | | CodeClassifyValue codeClassifyValueDO= codeClassifyValueMapper.selectById(secValue); |
| | | if(codeClassifyValueDO!=null) { |
| | | secValue = joinPreffixAndSuffix(secVO, codeClassifyValueDO.getId()); |
| | | } |
| | | break; |
| | | case CODE_LEVEL_SEC: |
| | | //å±çº§ç 段ï¼éè¦ä»åç±»ä¸è·åç¸åºçä¿¡æ¯ |
| | | if (CodeLevelTypeEnum.MIN.getValue().equalsIgnoreCase(secVO.getCodeLevelType())) { |
| | | //æå°å±ï¼å 为æä»¬åªè½å¨å¶åèç¹ä¸ç³è¯·ç¼ç ï¼æä»¥è¿ä¸ªå°±æ¯å½ååç±»ç |
| | | if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType()) || CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) { |
| | | //å°±æ¯å½ååç±»ç |
| | | 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(); |
| | | } |
| | | } else { |
| | | //æå®å±ï¼æä»¬éè¦éè¿ä¸çº§çæ¥è·å |
| | | if (CollectionUtils.isEmpty(classifyFullInfoBO.getParentClassifyVOs())) { |
| | | //说æå½åå·²ç»æ¯æé«çäº |
| | | secValue = classifyFullInfoBO.getCurrentClassifyVO().getId(); |
| | | } else { |
| | | //è¿ä¸ªæä»¬éè¦çç,å±çº§æ¯ä¸æ¯å¤§äºäºæå¤§å±çº§çæ° |
| | | 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())) { |
| | | secValue = classifyFullInfoBO.getCurrentClassifyVO().getId(); |
| | | } else { |
| | | secValue = parentClassifyVOList.stream().map(CodeClassifyVO::getId).collect(Collectors.joining()) + classifyFullInfoBO.getCurrentClassifyVO().getId(); |
| | | } |
| | | } else { |
| | | //æä»¬è·åå
¶ä¸æå®å±çå
容 |
| | | if (CodeGetValueTypeEnum.CURRENT.getValue().equalsIgnoreCase(secVO.getCodeGetValueType())) { |
| | | CodeClassifyVO classifyVO = parentClassifyVOList.stream().filter(s -> s.getDataLevel().intValue() == secVO.getCodeLevelValue().intValue()).findFirst().orElseGet(() -> null); |
| | | if (classifyVO != null) { |
| | | secValue = classifyVO.getId(); |
| | | } |
| | | } 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()); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | //ççé¿åº¦æ¯å¦éè¦æªæ |
| | | if (!CodeCutTypeEnum.NONE.getValue().equalsIgnoreCase(secVO.getValueCutType()) && |
| | | secVO.getValueCutLength() != null && secVO.getValueCutLength() > 0 && secValue.length() > secVO.getValueCutLength()) { |
| | | if (CodeCutTypeEnum.RIGHT.getValue().equalsIgnoreCase(secVO.getValueCutType())) { |
| | | //å·¦æªåæ¯ä»å·¦è¾¹åªæï¼å³æªåæ¯ä»å³è¾¹åªæ--ä¿ç左边 |
| | | secValue = secValue.substring(0, secVO.getValueCutLength()); |
| | | } else { |
| | | secValue = secValue.substring(secValue.length() - secVO.getValueCutLength()); |
| | | } |
| | | } |
| | | secValue = joinPreffixAndSuffix(secVO,secValue); |
| | | break; |
| | | case CODE_REFER_SEC: |
| | | //å¼ç¨çå¨é¡µé¢ä¸å·²ç»éæ©äºï¼æä»¥ç´æ¥ä½¿ç¨å端ä¸ä¼ éçå¼ |
| | | //å¼ç¨å°±æ¯åç
§ï¼å¯è½æ¯å
¶ä»çåç±»ï¼ä¸å¡ç±»åï¼ä¸çæ°æ®ï¼æä»¥åªå¨é¡µé¢ä¸éæ© |
| | | secValue = joinPreffixAndSuffix(secVO,secValue); |
| | | break; |
| | | case CODE_ATTR_SEC: |
| | | //屿§ä¸å¼ç¨çåºå«æ¯ï¼å±æ§æ¯å½åæ°æ®éç屿§ï¼èå¼ç¨å¯è½æ¯å¼ç¨å
¶ä»çåç±»çï¼ä¸å¡ç±»åï¼ |
| | | //å 为å¯è½æ¯æ¹éçæ°æ®çæä½ï¼æä»¥æä»¬è¿éä¸è½ç´æ¥å¤ç屿§ï¼éè¦åè¾¹ä¸è¾¹å¤ç |
| | | secValue = "${attr_" + secVO.getOid() + "}"; |
| | | attrSecVOList.add(secVO); |
| | | break; |
| | | case CODE_VARIABLE_SEC: |
| | | //å¯åç æ®µï¼æ¯å¨é¡µé¢ä¸è¾å
¥å
容 |
| | | if (secValue.length() > VciBaseUtil.getInt(secVO.getCodeSecLength())) { |
| | | throw new VciBaseException("ã{0}ãè¿ä¸ªç 段æ¯å¯åç æ®µï¼ä½æ¯ç°å¨è¾å
¥çç å¼çé¿åº¦({1})è¶
è¿äºè§å®çé¿åº¦{2}", new String[]{secVO.getName(), String.valueOf(secValue.length()), secVO.getCodeSecLength()}); |
| | | } |
| | | OsCodeFillTypeEnum fillTypeEnum = OsCodeFillTypeEnum.forValue(secVO.getCodeFillType()); |
| | | secValue = fillString(VciBaseUtil.getInt(secVO.getCodeSecLength()), fillTypeEnum, secValue, secVO.getCodeFillSeparator()); |
| | | secValue = joinPreffixAndSuffix(secVO,secValue); |
| | | break; |
| | | case CODE_SERIAL_SEC: |
| | | //æµæ°´ç 段 |
| | | serialSecVOList.add(secVO); |
| | | secValue = "${" + secVO.getOid() + "}"; |
| | | default: |
| | | break; |
| | | } |
| | | if (VciBaseUtil.getBoolean(secVO.getSerialDependFlag())) { |
| | | serialUnitList.add(secValue); |
| | | } |
| | | secValueList.add(secValue); |
| | | } |
| | | |
| | | /** |
| | | * æ¼æ¥ååç¼ |
| | | * @param secVO |
| | | * @param secValue |
| | | * @return |
| | | */ |
| | | private String joinPreffixAndSuffix(CodeBasicSecVO secVO, String secValue){ |
| | | StringBuilder joinSecValue = new StringBuilder(); |
| | | // æ¼æ¥åç¼ |
| | | if (Func.isNotEmpty(secVO.getPrefixCode())) { |
| | | joinSecValue = joinSecValue.append(secVO.getPrefixCode()); |
| | | } |
| | | // å¨ä¸é´æ¼æ¥å¼ |
| | | joinSecValue.append(secValue); |
| | | // æ¼æ¥åç¼ |
| | | if(Func.isNotEmpty(secVO.getSuffixCode())){ |
| | | joinSecValue = joinSecValue.append(secVO.getSuffixCode()); |
| | | } |
| | | return joinSecValue.toString(); |
| | | } |
| | | |
| | | /** |
| | | * è¡¥ä½ |
| | | * @param totalLength æ»é¿åº¦ |
| | | * @param fillTypeEnum è¡¥ä½æ¹å¼ |
| | | * @param text å½åçå
容 |
| | | * @param fillChar è¡¥ä½çå符 |
| | | * @return ä¸å¡«å
ä½ç½®åé¿åº¦å·²ç»è¾¾å°/è¶
è¿çæ¶åä¸ä¼å¡«å
|
| | | */ |
| | | private String fillString(int totalLength,OsCodeFillTypeEnum fillTypeEnum,String text,String fillChar){ |
| | | if(text.length() >= totalLength || OsCodeFillTypeEnum.NONE.equals(fillTypeEnum)){ |
| | | //ä¸ç¨è¡¥ä½äº |
| | | return text; |
| | | } |
| | | int balance = totalLength - text.length(); |
| | | StringBuilder sb = new StringBuilder(); |
| | | for (int i = 0; i < balance; i++) { |
| | | sb.append(fillChar); |
| | | } |
| | | if(OsCodeFillTypeEnum.LEFT.equals(fillTypeEnum)) { |
| | | text = sb.toString() + text; |
| | | }else { |
| | | text = text + sb.toString(); |
| | | } |
| | | return text; |
| | | } |
| | | |
| | | /** |
| | | * å°è£
åå¨ç å¼ç对象 |
| | | * @param classifyFullInfoBO åç±»å
¨é¨çä¿¡æ¯ |
| | | * @param ruleVO è§åçå
容 |
| | | * @param cbo ä¸å¡æ°æ® |
| | | * @param templateVO 模æ¿çä¿¡æ¯ |
| | | * @param allCodeDOList ææçç å¼ç对象å表 |
| | | */ |
| | | private void wrapperAllCode(CodeClassifyFullInfoBO classifyFullInfoBO, CodeRuleVO ruleVO, |
| | | 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()); |
| | | allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid()); |
| | | allCodeDO.setCreateCodeBtm(cbo.getBtmname()); |
| | | allCodeDO.setCreateCodeOid(cbo.getOid()); |
| | | allCodeDO.setSerialUnit(serialUnitString); |
| | | allCodeDO.setUnFillSerial(serialValueString); |
| | | allCodeDO.setLcStatus(cbo.getLcStatus()); |
| | | allCodeDOList.add(allCodeDO); |
| | | } |
| | | |
| | | /** |
| | | * ä¿åæµæ°´çä¿¡æ¯ |
| | | * @param ruleVO è§åçæ¾ç¤ºå¯¹è±¡ |
| | | * @param lastMaxSerialValueMap æå¤§çæµæ°´å¼æ å° |
| | | * @param maxSerialValueMap 便®åå¨çæå¤§æµæ°´çå
容 |
| | | */ |
| | | private void saveSerialValue(CodeRuleVO ruleVO, |
| | | Map<String/**ç æ®µç主é®**/,Map<String, String>> lastMaxSerialValueMap, |
| | | Map<String/**ç æ®µç主é®**/,Map<String, CodeSerialValue>> maxSerialValueMap){ |
| | | List<CodeSerialValue> editSerialValueDOList = new ArrayList<>(); |
| | | List<CodeSerialValue> addSerialValueDOList = new ArrayList<>(); |
| | | //åå¨æå¤§æµæ°´å· |
| | | lastMaxSerialValueMap.forEach((secOid,maxSerialMap)->{ |
| | | maxSerialMap.forEach((unit,maxSerial)->{ |
| | | CodeSerialValue serialValueDO = null; |
| | | if(maxSerialValueMap.containsKey(secOid) && maxSerialValueMap.get(secOid).containsKey(unit)){ |
| | | //è¯´ææ |
| | | 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); |
| | | serialValueDO.setMaxSerial(maxSerial.toString()); |
| | | addSerialValueDOList.add(serialValueDO); |
| | | } |
| | | }); |
| | | }); |
| | | if(!CollectionUtils.isEmpty(editSerialValueDOList)){ |
| | | // batchCBO.copyFromOther(serialValueMapper.batchUpdate(editSerialValueDOList)); |
| | | for (CodeSerialValue codeSerialValue : editSerialValueDOList) { |
| | | serialValueMapper.updateById(codeSerialValue); |
| | | } |
| | | } |
| | | if(!CollectionUtils.isEmpty(addSerialValueDOList)){ |
| | | for (CodeSerialValue codeSerialValue : addSerialValueDOList) { |
| | | serialValueMapper.insert(codeSerialValue); |
| | | } |
| | | // batchCBO.copyFromOther(serialValueMapper.batchInsert(addSerialValueDOList)); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 廿䏿¯æ°åçå符 |
| | | * @param s å符 |
| | | * @return æ¿æ¢åçå¼ |
| | | */ |
| | | private String killUnNumberChar(String s){ |
| | | Integer lastUnNumberIndex = 0; |
| | | for (int i = 0; i < s.length(); i++) { |
| | | char c = s.charAt(i); |
| | | if(!(new String(new char[]{c})).matches(RegExpConstant.NUMBER)){ |
| | | lastUnNumberIndex = i; |
| | | } |
| | | } |
| | | String value = s; |
| | | if(lastUnNumberIndex >0){ |
| | | value = value.substring(lastUnNumberIndex); |
| | | } |
| | | return value; |
| | | } |
| | | |
| | | /** |
| | | * 廿ååç¼ |
| | | * @param secValue å符 |
| | | * @param priffix åç¼ |
| | | * @param suffix åç¼ |
| | | * @return æ¿æ¢åçå¼ |
| | | */ |
| | | private String killPriffixSuffix(String secValue, String priffix,String suffix){ |
| | | if (priffix != null && secValue.startsWith(priffix)) { |
| | | secValue = secValue.substring(priffix.length()); |
| | | } |
| | | if (suffix != null && secValue.endsWith(suffix)) { |
| | | secValue = secValue.substring(0, secValue.length() - suffix.length()); |
| | | } |
| | | return secValue; |
| | | } |
| | | |
| | | /** |
| | | * å»é¤è¡¥ä½å符 |
| | | * @param s å符 |
| | | * @param fillString è¡¥ä½å符 |
| | | * @param left æ¯å¦å·¦è¡¥ä½ |
| | | * @return æ¿æ¢åçå¼ |
| | | */ |
| | | 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)){ |
| | | break; |
| | | } |
| | | index = i; |
| | | } |
| | | if(index >0){ |
| | | value = value.substring(index); |
| | | } |
| | | }else{ |
| | | //ä»å³å¾å·¦æ¾ |
| | | for (int i = s.length()-1; i >=0; i++) { |
| | | char c = s.charAt(i); |
| | | if(!(new String(new char[]{c})).equalsIgnoreCase(fillString)){ |
| | | break; |
| | | } |
| | | index = i; |
| | | } |
| | | if(index >0){ |
| | | value = value.substring(0,index); |
| | | } |
| | | } |
| | | return value; |
| | | |
| | | } |
| | | |
| | | /** |
| | | * åæ¶ç å¼ |
| | | * |
| | | * @param btmId ä¸å¡æ°æ®çä¸å¡ç±»å |
| | | * @param businessOidCollection ä¸å¡æ°æ®çä¸»é® |
| | | * @return æ¯å¦æ´æ°æå |
| | | */ |
| | | @Override |
| | | public Boolean recycleCode(String btmId, Collection<String> businessOidCollection) { |
| | | // boolean oldPersistence = WebUtil.isPersistence(); |
| | | // WebUtil.setPersistence(false); |
| | | // BatchCBO batchCBO = new BatchCBO(); |
| | | AtomicReference<Boolean> updateFlag = new AtomicReference<>(false); |
| | | VciBaseUtil.switchCollectionForOracleIn(businessOidCollection).stream().forEach(oids-> { |
| | | // Map<String, String> conditionMap = new HashMap<>(); |
| | | // //ç¼ç è¦è®°å½ä¸ºåæ¶çç¶æ |
| | | // conditionMap.put("createcodeoid", QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")"); |
| | | // conditionMap.put("createcodebtm", btmId); |
| | | |
| | | QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>(); |
| | | wrapper.in("createcodeoid",QueryOptionConstant.IN + "(" + VciBaseUtil.toInSql(oids.toArray(new String[0])) + ")"); |
| | | wrapper.eq("createcodebtm", btmId); |
| | | |
| | | |
| | | List<CodeAllCode> allCodeDOS = codeAllCodeService.selectByWrapper(wrapper); |
| | | // allCodeMapper.selectByCondition(conditionMap, new PageHelper(-1)); |
| | | if (!CollectionUtils.isEmpty(allCodeDOS)) { |
| | | allCodeDOS.stream().forEach(codeDO->{ |
| | | codeDO.setLcStatus(CodeAllCodeLC.TASK_BACK.getValue()); |
| | | }); |
| | | updateFlag.set(codeAllCodeService.updateBatchById(allCodeDOS)); |
| | | // batchCBO.copyFromOther(allCodeMapper.batchUpdate(allCodeDOS)); |
| | | } |
| | | }); |
| | | // WebUtil.setPersistence(oldPersistence); |
| | | return updateFlag.get(); |
| | | } |
| | | |
| | | /** |
| | | * 使ç¨CBOå¤çç»åè§åçå
容 |
| | | * @param cbo æ°æ®çå
容 |
| | | * @param rule è§åçå
容 |
| | | * @return 转æ¢åç |
| | | */ |
| | | private String getValueByFormulaForCBO(BaseModel cbo,String rule) { |
| | | Map<String, Object> dataMap = null; |
| | | try{ |
| | | dataMap = VciBaseUtil.convertBean2Map(cbo,null); |
| | | }catch(Exception e){ |
| | | throw new VciBaseException("mapToBeanError:"+e); |
| | | } |
| | | Map<String, String> map = new HashMap<String, String>(); |
| | | for (String i : dataMap.keySet()) { |
| | | map.put(i, String.valueOf(dataMap.get(i))); |
| | | } |
| | | // WebUtil.copyValueToMapFromCbos(cbo,dataMap); |
| | | return formulaService.getValueByFormula(map,rule); |
| | | } |
| | | |
| | | } |