ludc
2023-09-11 53d628adb1082d7df51dc1a2151505f17b1de9a2
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
@@ -52,6 +52,7 @@
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.rmi.ServerException;
import java.util.*;
import java.util.stream.Collectors;
@@ -114,7 +115,7 @@
   /**
    * 上层分类码段的属性名称
    */
   private static  final String PARENT_FIELD_NAME = "parentclassifysecoid";
   private static  final String PARENT_FIELD_NAME = "parentClassifySecOid";
   /**
    * 上级分类码值的属性名称
@@ -170,10 +171,10 @@
         // 将要作为删除条件的值放在一个集合里面
         Set<String> fixedSecOidSet = fixedSecList.stream().map(CodeBasicSec::getOid).collect(Collectors.toSet());
         // 通过外键进行查询
         List<CodeFixedValue> fixedValueS = fixedValueMapper.selectList(Wrappers.<CodeFixedValue>query().lambda().in(CodeFixedValue::getCodeFixedSecOid,fixedSecOidSet));
         if(!fixedValueS.isEmpty()){
         List<CodeFixedValue> fixedValues = fixedValueMapper.selectList(Wrappers.<CodeFixedValue>query().lambda().in(CodeFixedValue::getCodeFixedSecOid,fixedSecOidSet));
         if(!fixedValues.isEmpty()){
            // 根据查询出来的id执行固定码段执行删除
            deletFlag = fixedValueMapper.deleteBatchIds(fixedValueS.stream().map(CodeFixedValue::getOid).collect(Collectors.toSet()))>0;
            deletFlag = fixedValueMapper.deleteBatchIds(fixedValues.stream().map(CodeFixedValue::getOid).collect(Collectors.toSet()))>0;
         }
      }
      // 4、再删除分类码段
@@ -184,10 +185,10 @@
         // 将要作为删除条件的值放在一个集合里面
         Set<String> classifySecOidSet = classifySecList.stream().map(CodeBasicSec::getOid).collect(Collectors.toSet());
         // 通过外键进行查询
         List<CodeClassifyValue> fixedValueS = codeClassifyValueMapper.selectList(Wrappers.<CodeClassifyValue>query().lambda().in(CodeClassifyValue::getCodeClassifySecOid,classifySecOidSet));
         if(!fixedValueS.isEmpty()){
         List<CodeClassifyValue> codeClassifyValues = codeClassifyValueMapper.selectList(Wrappers.<CodeClassifyValue>query().lambda().in(CodeClassifyValue::getCodeClassifySecOid,classifySecOidSet));
         if(!codeClassifyValues.isEmpty()){
            // 根据查询出来的主键id执行固定码段执行删除
            deletFlag = fixedValueMapper.deleteBatchIds(fixedValueS.stream().map(CodeClassifyValue::getOid).collect(Collectors.toSet()))>0;
            deletFlag = codeClassifyValueMapper.deleteBatchIds(codeClassifyValues.stream().map(CodeClassifyValue::getOid).collect(Collectors.toSet()))>0;
         }
      }
      return deletFlag;
@@ -574,7 +575,7 @@
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) throws ServiceException {
   public R cloneCodeBasicSec(List<String> oidList, String pkCodeRule) throws ServiceException, ServerException {
      boolean isLinked = checkIsLinked(pkCodeRule,null);
      if (isLinked) {
         return R.fail("编码规则已被引用,不允许编辑或删除");
@@ -584,20 +585,96 @@
      if(basicSecDOS.isEmpty()){
         return R.fail("克隆的码段信息不存在!");
      }
      basicSecDOS.forEach(sec -> {
      List<CodeBasicSec> codeClassifySec = new ArrayList<>();
      Map<String,List<CodeFixedValue>> codeFixedValueMaps = new HashMap<>();
      for (CodeBasicSec sec : basicSecDOS) {
         CodeBasicSec newSecDO = new CodeBasicSec();
         BeanUtilForVCI.copyPropertiesIgnoreCase(sec,newSecDO);
         newSecDO.setOid(VciBaseUtil.getPk());
         newSecDO.setNameOid(VciBaseUtil.getPk());
         newSecDO.setRevisionOid(VciBaseUtil.getPk());
         newSecDO.setId(newSecDO.getId() + "_copy");
         newSecDO.setName(newSecDO.getName() + "_copy");
         String oldBasicOid = newSecDO.getOid();
         newSecDO.setId(newSecDO.getId());
         newSecDO.setName(newSecDO.getName());
         newSecDO.setPkCodeRule(pkCodeRule);
         // 判断是否是分类码段,业务逻辑稍微复杂一点所以需要先提出来单独处理
         if(newSecDO.getSecType().equals(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue())){
            // 存储旧的码段oid和新的码段的oid的关联关系
            codeClassifySec.add(newSecDO);
            continue;
         }
         // 更改创建时间,修改时间等默认值
         DefaultAttrAssimtUtil.addDefaultAttrAssimt(newSecDO,MdmBtmTypeConstant.CODE_BASIC_SEC);
         //固定码段
         if(newSecDO.getSecType().equals(CodeSecTypeEnum.CODE_FIXED_SEC.getValue())){
            // 固定码段存储好oid和码值的关联关系
            codeFixedValueMaps.put(newSecDO.getOid(),fixedValueService.list(Wrappers.<CodeFixedValue>query()
               .lambda().eq(CodeFixedValue::getCodeFixedSecOid, oldBasicOid)
            ));
         }
         createList.add(newSecDO);
      });
      }
      // 处理分类码段的oid,因为oid关联parentClassifyOid,与码值codeClassifyOid,码值又需要通过旧的码段oid来查询,所以不能直接改变oid
      boolean resChangeAssn = changeParentOidAssnOid(codeClassifySec);
      // 将处理过的分类码段也添加进要做新增处理的码段集合中
      createList.addAll(codeClassifySec);
      boolean resBoolean = saveBatch(createList);
      //codeBasicSecMapper.insertBatch(createList);
      return resBoolean ? R.data(resBoolean,"克隆码段信息成功"):R.fail("克隆码段信息失败!");
      // 最终要存入码值表中的,码值对象
      List<CodeFixedValue> codeFixedDOValues = new ArrayList<>();
      // 构造码值对象,与码段主键关联关系,以及改变固定码值的oid
      codeFixedValueMaps.forEach((key, value) -> {
         value.stream().forEach(item -> {
            item.setOid("");
            item.setCodeFixedSecOid(key);
            DefaultAttrAssimtUtil.updateDefaultAttrAssimt(item);
            codeFixedDOValues.add(item);
         });
      });
      // 克隆固定码值
      boolean resFixed = fixedValueService.saveBatch(codeFixedDOValues);
      return (resBoolean&&resFixed&&resChangeAssn) ? R.data(resBoolean,"克隆码段信息成功"):R.fail("克隆码段信息失败!");
   }
   /**
    * 改变码段中父分类码段和子分类码段之间的关联oid为新的oid,并且不破坏分类码值的关联关系
    * @param basicSecs
    * @return
    * @throws ServerException
    */
   @Override
   public boolean changeParentOidAssnOid(List<CodeBasicSec> basicSecs) throws ServerException {
      Map<String, List<CodeClassifyValue>> codeClassValues = new HashMap<>();
      List<CodeClassifyValue> codeClassifyDOValues = new ArrayList<>();
      HashMap<String, String> oidMap = new HashMap<>();
      boolean resClone = false;
      try {
         // 遍历对象数组,为每个对象生成新的oid,并将原始oid和新oid的映射关系存储到Map中
         for (CodeBasicSec obj : basicSecs) {
            String originalOid = obj.getOid();
            String newOid = VciBaseUtil.getPk();
            oidMap.put(originalOid, newOid);
         }
         // 遍历对象数组,更新每个对象的oid和codeClassifySecOid属性值
         for (CodeBasicSec obj : basicSecs) {
            String originalOid = obj.getOid();
            String newOid = oidMap.get(originalOid);
            // 新的oid关联要克隆码值
            codeClassValues.put(newOid,codeClassifyValueService.list(Wrappers.<CodeClassifyValue>query()
               .lambda().eq(CodeClassifyValue::getCodeClassifySecOid, originalOid)));
            obj.setOid(newOid);
            String originalParentClassifyValueOid = obj.getParentClassifySecOid();
            String newParentClassifyValueOid = oidMap.get(originalParentClassifyValueOid);
            obj.setParentClassifySecOid(newParentClassifyValueOid);
         }
         codeClassValues.forEach((key, value) -> {
            value.stream().forEach(item -> {
               DefaultAttrAssimtUtil.updateDefaultAttrAssimt(item);
               item.setCodeClassifySecOid(key);
               codeClassifyDOValues.add(item);
            });
         });
         resClone = codeClassifyValueService.cloneCodeClassifyVaue(codeClassifyDOValues);
      }catch (Exception e){
         throw new ServerException("父分类码段和子分类码段clone转换oid时出错:"+e.getCause());
      }
      return resClone;
   }
   /**