From ac8e8998235f247365280d1a1632115c43b10037 Mon Sep 17 00:00:00 2001 From: ludc Date: 星期五, 17 十一月 2023 02:24:30 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java | 324 ++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 254 insertions(+), 70 deletions(-) diff --git a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java index 3f5e3d1..bc8b436 100644 --- a/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java +++ b/Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java @@ -1,5 +1,7 @@ package com.vci.ubcs.code.service.impl; +import com.vci.ubcs.code.algorithm.CustomSerialEnum; +import com.vci.ubcs.code.dto.CodeCustomSerialDTO; import com.alibaba.nacos.common.utils.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO; @@ -31,6 +33,8 @@ 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; @@ -38,7 +42,12 @@ 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; @@ -78,40 +87,43 @@ @Autowired private FormulaServiceImpl formulaService; + // 娉ㄥ叆浜嬪姟绠$悊鍣� +// @Autowired +// private TransactionTemplate transactionTemplate; + @Override - @Transactional(rollbackFor = VciBaseException.class) + @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)) - ){ + // && StringUtils.isNotBlank(cbo.getAttributeValue(CODE_SEC_LENGTH_FIELD)) + ){ //鏄巻鍙叉暟鎹鍏� //鍘嗗彶鏁版嵁鎵ц鐨勬椂鍊欙紝杩欎釜绯荤粺浼氬緢鍗� //涓昏鏄负浜嗗綍鍏ユ渶澶ф祦姘村彿鍜宎llcode -// SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo(); - List<CodeAllCode> allCodeDOList = new ArrayList<>(); - Map<String/**娴佹按渚濇嵁**/, Map<String/**鐮佹鐨勪富閿�**/,Double/**鏈�澶ф祦姘村彿**/>> maxSerialMap = new HashMap<>(); + //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo(); + List<CodeAllCode> allCodeDOList = new CopyOnWriteArrayList<>(); + Map<String/**娴佹按渚濇嵁**/, ConcurrentHashMap<String/**鐮佹鐨勪富閿�**/,String/**鏈�澶ф祦姘村彿**/>> maxSerialMap = new ConcurrentHashMap<>(); // TODO 澶氱嚎绋嬫祦寮曞彂鐨勯棶棰樺凡淇敼 dataCBOList.parallelStream().forEach(cbo->{ log.info("code:----->"+cbo.getId()); -// VciBaseUtil.setCurrentUserSessionInfo(sessionInfo); + //VciBaseUtil.setCurrentUserSessionInfo(sessionInfo); String code = cbo.getId(); - List<String> serialUnitList = new ArrayList<>(); + List<String> serialUnitList = new CopyOnWriteArrayList<>(); 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 = ruleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList()); + 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 = ""; @@ -126,39 +138,60 @@ 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); } } - String serialUnitString = serialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : serialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE)); 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); - Double serialDb = null; + 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(secValue)); + // serialDb = VciBaseUtil.getDouble(killUnNumberChar(subSecValue)); + //serialDb = killUnNumberChar(subSecValue); + serialDb=subSecValue; }else { //宸﹀彸濉厖鐨勶紝鎴戜滑闇�瑕� - serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(secValue,secVO.getCodeFillSeparator(), - OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType())))); + serialDb = killFillChar(subSecValue,secVO.getCodeFillSeparator(), + OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType())); } - Map<String, Double> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>()); - Double maxValue=serialDb; + Double newSerialDb= CustomSerialEnum.getDoubleCustomSerialValue(secValue,secVO.getCustomCodeSerialType()); + ConcurrentHashMap<String, String> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new ConcurrentHashMap<>()); + Double maxValue=newSerialDb; if(thisUnitMaxMap.containsKey(secOid)){ - maxValue= thisUnitMaxMap.getOrDefault(secOid,new Double(-1)); - if(maxValue<serialDb){ - maxValue=serialDb; + String newMaxValue= thisUnitMaxMap.getOrDefault(secOid,""); + maxValue=StringUtils.isBlank(newMaxValue)?-1:VciBaseUtil.getDouble(newMaxValue); + if(maxValue<newSerialDb){ + maxValue=newSerialDb; } } - thisUnitMaxMap.put(secOid,maxValue); + 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)); }); @@ -166,12 +199,12 @@ CodeAllCode allCodeDO = new CodeAllCode(); DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCodeDO, MdmBtmTypeConstant.CODE_ALL_CODE); allCodeDO.setCodeClassifyOid(classifyFullInfoBO.getCurrentClassifyVO().getOid()); - allCodeDO.setCodeRuleOid(ruleVO.getOid()); + allCodeDO.setCodeRuleOid(finalRuleVO.getOid()); allCodeDO.setId(cbo.getId()); allCodeDO.setCodeClassifyTemplateOid(templateVO.getOid()); allCodeDO.setCreateCodeBtm(cbo.getBtmname()); allCodeDO.setCreateCodeOid(cbo.getOid()); - allCodeDO.setSerialUnit(serialUnitString); + 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()); @@ -184,7 +217,7 @@ maxSerialMap.forEach((serialUnit,secOidMaxMap)->{ secOidMaxMap.forEach((secOid,maxSerial)->{ QueryWrapper<CodeSerialValue> queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("codeRuleOid", ruleVO.getOid()); + queryWrapper.eq("codeRuleOid", finalRuleVO.getOid()); queryWrapper.eq("serialUnit", serialUnit); //杩欎釜瀛楁鏄负浜嗚В鍐冲涓祦姘寸殑闂 queryWrapper.eq("codeSecOid", secOid); @@ -194,7 +227,7 @@ if (!CollectionUtils.isEmpty(serialValueDOS)) { CodeSerialValue serialValueDO = serialValueDOS.get(0); log.info("oldmaxSerial--->"+serialValueDO.getMaxSerial()+"---- newmaxSerial---->"+maxSerial); - if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<maxSerial){ + if(VciBaseUtil.getDouble(serialValueDO.getMaxSerial())<VciBaseUtil.getDouble(maxSerial)){ serialValueDO.setMaxSerial(String.valueOf(maxSerial)); DefaultAttrAssimtUtil.updateDefaultAttrAssimt(serialValueDO); editSerialValueList.add(serialValueDO); @@ -203,7 +236,7 @@ //娌℃湁 CodeSerialValue serialValueDO = new CodeSerialValue(); DefaultAttrAssimtUtil.addDefaultAttrAssimt(serialValueDO, MdmBtmTypeConstant.CODE_SERIAL_VALUE); - serialValueDO.setCodeRuleOid(ruleVO.getOid()); + serialValueDO.setCodeRuleOid(finalRuleVO.getOid()); serialValueDO.setSerialUnit(serialUnit); serialValueDO.setCodeSecOid(secOid); serialValueDO.setMaxSerial(maxSerial.toString()); @@ -226,8 +259,8 @@ // 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<>(); + List<CodeAllCode> addCodeDOs = new CopyOnWriteArrayList<>(); + List<CodeAllCode> editCodeDOs = new CopyOnWriteArrayList<>(); ruleGroup.forEach((ruleOid,allCodeDOS)->{ VciBaseUtil.switchCollectionForOracleIn(allCodeDOS).stream().forEach(codeDOs->{ QueryWrapper<CodeAllCode> allCodeWrapper = new QueryWrapper<>(); @@ -262,6 +295,10 @@ 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 -> { @@ -272,22 +309,52 @@ .collectingAndThen( Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CodeAllCode::getId))), ArrayList::new)); - if( distinctCodeAllCOdes.size() != addCodeDOs.size() ){ + 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())); - if(codeAllCodeService.count(wrapper)>0){ + 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()); + // TODO: 杩欏効鍏堟殏鏃舵敞閲婃帀锛屾病鐪嬫噦杩欏効涓轰粈涔堣杩欐牱鍋氾紝瀵艰嚧鎶ラ敊 + //iterator.remove(); + } + } + } + if(takeBack.size()>0){ + codeAllCodeService.updateBatchById(takeBack); + } + codeAllCodeService.saveBatch(addCodeDOs); } + +// try { mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList); + // 鎻愪氦浜嬪姟 + //transactionTemplate.getTransactionManager().commit(status); +// }catch (Exception e){ +// // 鍑虹幇寮傚父鏃跺洖婊氫簨鍔� +// transactionTemplate.getTransactionManager().rollback(status); +// } + } return codeList; }else { - List<CodeBasicSecVO> secVOList = ruleVO.getSecVOList().stream().sorted(((o1, o2) -> o1.getOrderNum().compareTo(o2.getOrderNum()))).collect(Collectors.toList()); + 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())); @@ -323,7 +390,7 @@ switchAttrSecValue(attrSecVOList, cbo, thisSecValueList, attrSevIsSerialDepend, thisSerialUnitList); String serialUnitString = thisSerialUnitList.size() == 0 ? EMPTY_SERIAL_UNIT : thisSerialUnitList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE)); - switchSerialSecValue(serialSecVOList, attrSevIsSerialDepend, ruleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0); + switchSerialSecValue(serialSecVOList, attrSevIsSerialDepend, finalRuleVO, serialUnitString, maxSerialValueMap, thisSecValueList, lastMaxSerialValueMap, i == 0); //缁勮缂栫爜鐨勫�� cbo.setId(thisSecValueList.stream().collect(Collectors.joining())); @@ -338,10 +405,10 @@ } } //瑕佸瓨鍌ㄦ渶鍚庣殑鍏ㄩ儴allcode - wrapperAllCode(classifyFullInfoBO, ruleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString()); + wrapperAllCode(classifyFullInfoBO, finalRuleVO, cbo, templateVO, allCodeDOList, serialUnitString, sb.toString()); } //澶勭悊鏈�澶ф祦姘� - saveSerialValue( ruleVO, lastMaxSerialValueMap, maxSerialValueMap); + saveSerialValue( finalRuleVO, lastMaxSerialValueMap, maxSerialValueMap); allCodeDOList.stream().forEach( allCode -> {DefaultAttrAssimtUtil.addDefaultAttrAssimt(allCode,"codeallcode");allCode.setLctid("codeAllCodeLC");} @@ -365,13 +432,32 @@ QueryWrapper<CodeAllCode> wrapper = new QueryWrapper<>(); wrapper.eq("CREATECODEBTM",allCodeDOList.get(0).getCreateCodeBtm()); wrapper.in("ID",allCodeDOList.stream().map(CodeAllCode::getId).collect(Collectors.toList())); - if(codeAllCodeService.count(wrapper)>0){ + 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); mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList); - // batchCBO.getCreateCbos().stream().filter(s -> StringUtils.equalsIgnoreCase("codeallcode",s.getBtmName())).forEach(s -> { // s.setLcStatus(statusMap.get(s.getOid())); // try { @@ -381,10 +467,11 @@ // } // }); } -// WebUtil.setPersistence(true); -// boService.persistenceBatch(batchCBO); + // WebUtil.setPersistence(true); + // boService.persistenceBatch(batchCBO); return codeList; } + /** * 杞崲灞炴�х爜娈电殑鍊� * @param attrSecVOList 灞炴�х爜娈电殑鏄剧ず瀵硅薄 @@ -413,7 +500,8 @@ for (int j = 0; j < thisSecValueList.size(); j++) { String secValue = thisSecValueList.get(j); if (secValue.equalsIgnoreCase("${attr_" + attrSevVO.getOid() + "}")) { - thisSecValueList.set(j, value); + // TODO: 灞炴�х爜娈电敓鎴愮爜鍊煎悗锛屾嫾鎺ュ墠鍚庣紑 + thisSecValueList.set(j, joinPreffixAndSuffix(attrSevVO,value)); } } if (attrSevIsSerialDepend) { @@ -421,14 +509,13 @@ for (int j = 0; j < serialUnitList.size(); j++) { String secValue = serialUnitList.get(j); if (secValue.equalsIgnoreCase("${attr_" + attrSevVO.getOid() + "}")) { - serialUnitList.set(j, value); + serialUnitList.set(j, joinPreffixAndSuffix(attrSevVO,value)); } } } }); } } - /** * 杞崲娴佹按鐮佹鐨勫�� @@ -446,8 +533,21 @@ Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/,CodeSerialValue>> maxSerialValueMap,List<String> thisSecValueList, Map<String/**鐮佹鐨勪富閿�**/,Map<String/**娴佹按渚濇嵁**/, Double>> 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<>(); @@ -456,8 +556,9 @@ // //杩欎釜瀛楁鏄负浜嗚В鍐冲涓祦姘寸殑闂 // conditionMap.put("codeSecOid", secVO.getOid()); QueryWrapper<CodeSerialValue> codeSerialWrapper = new QueryWrapper<>(); + codeSerialWrapper.eq("codeRuleOid", ruleVO.getOid()); - codeSerialWrapper.eq("serialUnit", serialUnitString); + codeSerialWrapper.eq("serialUnit", newSerialUnitString.get()); codeSerialWrapper.eq("codeSecOid", secVO.getOid()); List<CodeSerialValue> serialValueDOS = serialValueMapper.selectList(codeSerialWrapper); if (!CollectionUtils.isEmpty(serialValueDOS)) { @@ -467,25 +568,41 @@ maxSerialValueMap.put(secVO.getOid(), unitSerialMap); } } - Double startValue = null; - if(maxSerialValueMap.containsKey(secVO.getOid()) && maxSerialValueMap.get(secVO.getOid()).containsKey(serialUnitString)){ - startValue = VciBaseUtil.getDouble(maxSerialValueMap.get(secVO.getOid()).get(serialUnitString).getMaxSerial()); + 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(serialUnitString)){ + if (lastMaxSerialValueMap.containsKey(secVO.getOid()) && lastMaxSerialValueMap.get(secVO.getOid()).containsKey(newSerialUnitString.get())) { //璇存槑澶氫釜鐢宠锛屼箣鍓嶅凡缁忓姞浜嗘祦姘村彿浜� - startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(serialUnitString); + startValue = lastMaxSerialValueMap.get(secVO.getOid()).get(newSerialUnitString.get()); } - Double thisSerialValue = 0d; - if (startValue == null) { - //绗竴涓紪鐮� - thisSerialValue = VciBaseUtil.getDouble(secVO.getSerialStart()); - } else { - //娴佹按鍙疯偗瀹氭槸鏁板瓧 - thisSerialValue = startValue + (j + 1) * secVO.getSerialStep(); - } - //瑕佺湅鏄惁瓒呰繃鏈�澶х殑娴佹按鍊� - if (thisSerialValue >= secVO.getCodeFillLimit()) { - throw new VciBaseException("娴佹按鍙峰凡缁忚秴杩囧厑璁哥殑鏈�澶ф祦姘村�納0}",new String[]{secVO.getCodeFillLimit().toString()}); + 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()); @@ -495,17 +612,44 @@ } String serialString = String.valueOf(thisSerialValue.longValue()); 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() + "}")) { - thisSecValueList.set(z, serialString); + // TODO: 娴佹按鐢熸垚鐮佸�煎悗鎷兼帴鍓嶅悗缂� + thisSecValueList.set(z, joinPreffixAndSuffix(secVO, serialString)); } } - Map<String, Double> unitSerialMap = lastMaxSerialValueMap.getOrDefault(secVO.getOid(), new HashMap<>()); - unitSerialMap.put(serialUnitString, thisSerialValue); + 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; } /** @@ -526,18 +670,19 @@ String secValue = secValueMap.getOrDefault(secVO.getOid(), ""); switch (secType) { case CODE_FIXED_SEC: + secValue = joinPreffixAndSuffix(secVO, secValue); //鍥哄畾鐮佹鐨勶紝鐩存帴鐢ㄧ爜鍊�,涓嶈鐮佸�肩殑闀垮害鏄灏戯紝鍥犱负鍙彉闀垮害鍜屽浐瀹氶暱搴︽槸鎺у埗鍦ㄧ爜娈电鐞嗛噷闈㈢殑鐮佸�煎畾涔夌殑 break; case CODE_DATE_SEC: //鏃堕棿鐮佹锛岄渶瑕佸皢褰撳墠鏃堕棿渚濇嵁鏃堕棿鏍煎紡杩涜杞崲. //鏃堕棿鐮佹涓嶆秹鍙婂埌鏄惁琛ヤ綅 - secValue = VciDateUtil.date2Str(new Date(), secVO.getCodeDateFormatStr()); + secValue =joinPreffixAndSuffix(secVO, VciDateUtil.date2Str(new Date(), secVO.getCodeDateFormatStr())); break; case CODE_CLASSIFY_SEC: //鍒嗙被鐮佹鐨勶紝涔熸槸浠庡墠绔�夋嫨浜嗙爜鍊煎嵆鍙紝涓嶈鐮佸�肩殑闀垮害鏄灏� CodeClassifyValue codeClassifyValueDO= codeClassifyValueMapper.selectById(secValue); if(codeClassifyValueDO!=null) { - secValue = codeClassifyValueDO.getId(); + secValue = joinPreffixAndSuffix(secVO, codeClassifyValueDO.getId()); } break; case CODE_LEVEL_SEC: @@ -590,10 +735,12 @@ 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: //灞炴�т笌寮曠敤鐨勫尯鍒槸锛屽睘鎬ф槸褰撳墠鏁版嵁閲岀殑灞炴�э紝鑰屽紩鐢ㄥ彲鑳芥槸寮曠敤鍏朵粬鐨勫垎绫荤殑锛堜笟鍔$被鍨嬶級 @@ -608,6 +755,7 @@ } 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: //娴佹按鐮佹 @@ -620,6 +768,27 @@ 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(); } /** @@ -673,9 +842,6 @@ allCodeDOList.add(allCodeDO); } - - - /** * 淇濆瓨娴佹按鐨勪俊鎭� * @param ruleVO 瑙勫垯鐨勬樉绀哄璞� @@ -683,7 +849,7 @@ * @param maxSerialValueMap 渚濇嵁瀛樺偍鐨勬渶澶ф祦姘寸殑鍐呭 */ private void saveSerialValue(CodeRuleVO ruleVO, - Map<String/**鐮佹鐨勪富閿�**/,Map<String, Double>> lastMaxSerialValueMap, + Map<String/**鐮佹鐨勪富閿�**/,Map<String, String>> lastMaxSerialValueMap, Map<String/**鐮佹鐨勪富閿�**/,Map<String, CodeSerialValue>> maxSerialValueMap){ List<CodeSerialValue> editSerialValueDOList = new ArrayList<>(); List<CodeSerialValue> addSerialValueDOList = new ArrayList<>(); @@ -740,6 +906,23 @@ 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; } /** @@ -839,4 +1022,5 @@ // WebUtil.copyValueToMapFromCbos(cbo,dataMap); return formulaService.getValueByFormula(map,rule); } + } -- Gitblit v1.9.3