From 91560799c8088421983a6168c95b84a5d617df05 Mon Sep 17 00:00:00 2001 From: ludc Date: 星期五, 17 十一月 2023 02:00:44 +0800 Subject: [PATCH] 历史数据导入、批量申请、申请编码接口代码逻辑中关键属性校验增加过滤条件 --- Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/MdmProductCodeServiceImpl.java | 73 ++++++++++++++++++++++++++---------- 1 files changed, 52 insertions(+), 21 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 a0cc22d..ea0a767 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 @@ -36,11 +36,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.DefaultTransactionDefinition; +import org.springframework.transaction.support.TransactionTemplate; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -80,12 +84,16 @@ @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; /***** * 淇濊瘉骞跺彂鐨勬椂鍊欙紝鏈�澶ф祦姘村彿閮藉鐨勶紝浣嗘槸杩欑鍔犻攣鏈夊紛绔� */ @@ -96,20 +104,20 @@ //鍘嗗彶鏁版嵁鎵ц鐨勬椂鍊欙紝杩欎釜绯荤粺浼氬緢鍗� //涓昏鏄负浜嗗綍鍏ユ渶澶ф祦姘村彿鍜宎llcode //SessionInfo sessionInfo = VciBaseUtil.getCurrentUserSessionInfo(); - List<CodeAllCode> allCodeDOList = new ArrayList<>(); + List<CodeAllCode> allCodeDOList = new CopyOnWriteArrayList<>(); 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<>(); + 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)); for (int i = 0; i < secLengths.length; i++) { @@ -141,13 +149,15 @@ //瑕佺湅鏄笉鏄ˉ浣嶇殑 CodeBasicSecVO secVO = secVOMap.get(secOid); Double serialDb = null; + // 鎴彇鎺夊墠鍚庣紑涔嬪悗鐨勭爜娈� + 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)); }else { //宸﹀彸濉厖鐨勶紝鎴戜滑闇�瑕� - serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(secValue,secVO.getCodeFillSeparator(), + serialDb = VciBaseUtil.getDouble(killUnNumberChar(killFillChar(subSecValue,secVO.getCodeFillSeparator(), OsCodeFillTypeEnum.LEFT.getValue().equalsIgnoreCase(secVO.getCodeFillType())))); } Map<String, Double> thisUnitMaxMap = maxSerialMap.getOrDefault(serialUnitString, new HashMap<>()); @@ -166,7 +176,7 @@ 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()); @@ -184,7 +194,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); @@ -203,7 +213,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 +236,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 +272,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,7 +286,7 @@ .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<>(); @@ -293,20 +307,22 @@ if(codeAllCode.getId().equals(next.getId())){ codeAllCode.setCreateCodeOid(next.getCreateCodeOid()); codeAllCode.setLcStatus(next.getLcStatus()); - iterator.remove(); + // TODO: 杩欏効鍏堟殏鏃舵敞閲婃帀锛屾病鐪嬫噦杩欏効涓轰粈涔堣杩欐牱鍋氾紝瀵艰嚧鎶ラ敊 + //iterator.remove(); } } } if(takeBack.size()>0){ codeAllCodeService.updateBatchById(takeBack); } + codeAllCodeService.saveBatch(addCodeDOs); } mdmEngineService.insertBatchByType(dataCBOList.get(0).getBtmname(),dataCBOList); } 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())); @@ -342,7 +358,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())); @@ -357,21 +373,19 @@ } } //瑕佸瓨鍌ㄦ渶鍚庣殑鍏ㄩ儴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");} ); - 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 @@ -461,7 +475,7 @@ 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)); } } } @@ -805,6 +819,23 @@ } /** + * 鍘绘帀鍓嶅悗缂� + * @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 琛ヤ綅瀛楃 -- Gitblit v1.9.3