ludc
2023-11-07 e61a898fe563214cb13e97c08804534a61aad46b
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -2,6 +2,7 @@
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -13,6 +14,7 @@
import com.vci.ubcs.code.enumpack.FrameworkDataLCStatus;
import com.vci.ubcs.code.mapper.CodeClassifyMapper;
import com.vci.ubcs.code.mapper.CodeClassifyTemplateMapper;
import com.vci.ubcs.code.mapper.CommonsMapper;
import com.vci.ubcs.code.po.CodeClassifyPO;
import com.vci.ubcs.code.service.ICodeClassifyService;
import com.vci.ubcs.code.service.ICodeKeyAttrRepeatService;
@@ -36,13 +38,16 @@
import com.vci.ubcs.starter.revision.model.TreeWrapperOptions;
import com.vci.ubcs.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.starter.util.BladeTreeQueryObject;
import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil;
import com.vci.ubcs.starter.util.LocalFileUtil;
import com.vci.ubcs.starter.util.MdmBtmTypeConstant;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.starter.web.pagemodel.Tree;
import com.vci.ubcs.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.system.cache.NacosConfigCache;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -66,6 +71,7 @@
import java.util.stream.Stream;
import static com.vci.ubcs.code.constant.FrameWorkDefaultValueConstant.*;
import static com.vci.ubcs.starter.web.util.VciBaseUtil.getTableName;
@Service
public class CodeClassifyServiceImpl extends ServiceImpl<CodeClassifyMapper, CodeClassify> implements ICodeClassifyService {
@@ -82,8 +88,8 @@
   @Resource
   private IBtmTypeClient btmTypeClient;
   @Value("${user-info.tenant-id}")
   private String tenantId;
   @Resource
   private CommonsMapper commonsMapper;
   /**
    * 日志
@@ -124,14 +130,30 @@
   @Override
   public IPage<CodeClassifyVO> selectPlCodeClassifyPage(IPage<CodeClassifyVO> page, CodeClassifyVO plCodeClassify) {
      return page.setRecords(codeClassifyMapper.selectPlCodeClassifyPage(page, plCodeClassify));
      return page.setRecords(codeClassifyMapper.selectPlCodeClassifyPage(page, plCodeClassify,AuthUtil.getTenantId()
         .equals(
            NacosConfigCache
               .getAdminUserInfo()
               .getTenantId()
         ) ? null:AuthUtil.getTenantId()));
   }
   /**
    * 主题库定义表 新增
    * @param
    */
   @Override
   public R addSave(CodeClassify codeClassifyEntity) {
      try {
         VciBaseUtil.alertNotNull(codeClassifyEntity.getId(),"主题库编号不能为空!",codeClassifyEntity.getName(),"主题库名称不能为空!");
      }catch (VciBaseException e){
         return R.fail(e.getMessage());
      }
      if(StringUtils.isNotBlank(codeClassifyEntity.getParentCodeClassifyOid()) && StringUtils.isNotBlank(codeClassifyEntity.getBtmTypeId())){
         return R.fail("只有在顶层的主题库分类才能设置业务类型");
      }
      if(StringUtils.isEmpty(codeClassifyEntity.getParentCodeClassifyOid()) && StringUtils.isBlank(codeClassifyEntity.getBtmTypeId())){
         return R.fail("主题库关联的业务类型不能为空!");
      }
      QueryWrapper<CodeClassify> classifyQueryWrapper = new QueryWrapper<>();
      classifyQueryWrapper.eq("parentCodeClassifyOid",codeClassifyEntity.getParentCodeClassifyOid());
@@ -145,14 +167,8 @@
         codeClassifyEntity.setBtmTypeId(codeClassify.getBtmTypeId());
         codeClassifyEntity.setBtmTypeName(codeClassify.getBtmTypeName());
      }
      codeClassifyEntity.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));
      codeClassifyEntity.setCreateTime(new Date());
      codeClassifyEntity.setTs(new Date());
      codeClassifyEntity.setOwner(String.valueOf(AuthUtil.getUser().getUserId()));
      codeClassifyEntity.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
      codeClassifyEntity.setLastModifyTime(new Date());
      codeClassifyEntity.setRevisionSeq(1);
      codeClassifyEntity.setVersionSeq(1);
      DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeClassifyEntity, MdmBtmTypeConstant.CODE_CLASSIFY);
      codeClassifyEntity.setLcStatus(FRAMEWORK_DATA_ENABLED);
      int insertNumber = codeClassifyMapper.insert(codeClassifyEntity);
      return R.status(SqlHelper.retBool(insertNumber));
   }
@@ -176,7 +192,8 @@
      if(StringUtils.isNotBlank(codeClassifyEntity.getParentCodeClassifyOid()) && StringUtils.isNotBlank(codeClassifyEntity.getBtmTypeId())){
         return R.fail("只有在顶层的主题库分类才能设置业务类型");
      }
      codeClassifyEntity.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
      // codeClassifyEntity.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
      codeClassifyEntity.setLastModifier(String.valueOf(AuthUtil.getUser().getAccount()));
      codeClassifyEntity.setLastModifyTime(new Date());
      codeClassifyEntity.setTs(new Date());
      int insertNumber = codeClassifyMapper.updateById(codeClassifyEntity);
@@ -363,11 +380,12 @@
      List<CodeClassify> classifyList = codeClassifyMapper.selectStartWithCurrentOid(oid);
      Date now = new Date();
      String userId = String.valueOf(AuthUtil.getUserId());
      // String userId = String.valueOf(AuthUtil.getUserId());
      String account = AuthUtil.getUserAccount();
      classifyList = classifyList.stream().map(s -> {
         s.setLcStatus(lcStatus);
         s.setTs(now);
         s.setLastModifier(userId);
         s.setLastModifier(account);
         s.setLastModifyTime(now);
         return s;
      }).collect(Collectors.toList());
@@ -430,7 +448,7 @@
      List<CodeClassifyVO> voList = new ArrayList<CodeClassifyVO>();
      if(!CollectionUtils.isEmpty(codeClassifys)){
         for(CodeClassify s: codeClassifys){
            CodeClassifyVO vo =  codeClassifyDO2VO(s);
            CodeClassifyVO vo = codeClassifyDO2VO(s);
            if(vo != null){
               voList.add(vo);
            }
@@ -510,10 +528,21 @@
         lcStatus = treeQueryObject.getConditionMap().getOrDefault("lcStatus",null);
      }
      if(StringUtils.isNotBlank(id) || StringUtils.isNotBlank(lcStatus) ){
         String tableName = this.getTableName(treeQueryObject.getParentOid(),treeQueryObject.getConditionMap().get("id"), treeQueryObject.getConditionMap().get("lcStatus"));
         doList = codeClassifyMapper
            .selectCodeClassifyDOByTree(treeQueryObject.getConditionMap().get("id"),treeQueryObject.getConditionMap().get("lcStatus"),treeQueryObject.getParentOid(), AuthUtil.getTenantId().equals(this.tenantId) ? "":AuthUtil.getTenantId());
            .selectCodeClassifyDOByTree(
               treeQueryObject.getConditionMap().get("id"),
               treeQueryObject.getConditionMap().get("lcStatus"),
               treeQueryObject.getParentOid(),
               VciBaseUtil.checkAdminTenant() ? null:AuthUtil.getTenantId(),
               tableName
            );
      }else{
         doList =codeClassifyMapper.selectCodeClassifyVOByTree(treeQueryObject.getParentOid(), AuthUtil.getTenantId().equals(this.tenantId) ? "":AuthUtil.getTenantId());
         // 只要前端会传参数过来就不会出现走这句的情况,所以查询总数没在这儿添加
         doList =codeClassifyMapper.selectCodeClassifyVOByTree(
            treeQueryObject.getParentOid(),
            VciBaseUtil.checkAdminTenant() ? null:AuthUtil.getTenantId()
         );
      }
      List<CodeClassifyVO> voList = codeClassifyDO2VOs(doList);
      TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(PARENT_FIELD_NAME);
@@ -523,6 +552,7 @@
         return s.getId() + " " + s.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
            .getLcStatus()) ? (" 【停用】 ") : "");
      });
      Iterator var6 =  tree.listIterator();
      while(var6.hasNext()){
         Tree trees = (Tree) var6.next();
@@ -534,6 +564,28 @@
         }
      }
      return tree;
   }
   /**
    * 分类加载时获取业务类型id,拼接业务类型表名
    * @return
    */
   private String getTableName(String parentCodeClassifyOid,String id,String lcStatus){
      LambdaQueryWrapper<CodeClassify> wrapper = Wrappers.<CodeClassify>query()
         .lambda().select(CodeClassify::getBtmTypeId)
         .eq(CodeClassify::getLcStatus, lcStatus)
         .isNotNull(CodeClassify::getBtmTypeId)
         .last("limit 1");
      if(Func.isNotBlank(id)){
         wrapper.eq(CodeClassify::getId,id).isNull(CodeClassify::getParentCodeClassifyOid);
      }else{
         wrapper.eq(CodeClassify::getParentCodeClassifyOid,parentCodeClassifyOid);
      }
      CodeClassify codeClassify = codeClassifyMapper.selectOne(wrapper);
      if(Func.isEmpty(codeClassify) || Func.isEmpty(codeClassify.getBtmTypeId())){
         throw new ServiceException("查询主数据总数时,未获取业务类型ID!");
      }
      return VciBaseUtil.getTableName(codeClassify.getBtmTypeId(),true);
   }
   /**
@@ -572,11 +624,27 @@
      if(StringUtils.isNotBlank(libName)){
         libNameList=VciBaseUtil.str2List(libName);
      }
      List<CodeClassify> doList =codeClassifyMapper.getRMLibByName(libNameList,"Enabled",AuthUtil.getTenantId());
      List<CodeClassify> doList =codeClassifyMapper.getRMLibByName(libNameList,"Enabled",AuthUtil.getTenantId()
         .equals(
            NacosConfigCache
               .getAdminUserInfo()
               .getTenantId()
         ) ? null:AuthUtil.getTenantId());
      List<CodeClassifyVO> voList = codeClassifyDO2VOs(doList);
      return voList;
   }
   /***
    * 根据oid获取下面所有的分类信息
    * @param oid
    * @return
    */
   public List<CodeClassifyVO> selectAllClassifyByOid(String oid){
      List<CodeClassify>  codeClassifyList=codeClassifyMapper.selectAllClassifyByOid(oid,AuthUtil.getTenantId());
      List<CodeClassifyVO> voList = codeClassifyDO2VOs(codeClassifyList);
      return voList;
   }
   /***
    * 根据分类描述备注和库节点查询分类信息
    * @param desc
@@ -672,8 +740,8 @@
      Map<String, CodeRuleVO> ruleVOMap = new HashMap<>();
      if(!CollectionUtils.isEmpty(codeRuleOids)){
         VciBaseUtil.switchCollectionForOracleIn(codeRuleOids).stream().forEach(ruleOids->{
//            Collection<CodeRuleVO> ruleVOS = codeRuleService.listCodeRuleByOids(ruleOids);
            Collection<CodeRuleVO> ruleVOS = null;
            Collection<CodeRuleVO> ruleVOS = codeRuleService.listCodeRuleByOids(ruleOids);
            // Collection<CodeRuleVO> ruleVOS = null;
            ruleVOMap.putAll( Optional.ofNullable(ruleVOS).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getOid(),t->t)));
         });
      }
@@ -706,6 +774,7 @@
      excelDataList.add(new WriteExcelData(0,9,"状态"));
      excelDataList.add(new WriteExcelData(0,10,"分类层级"));
      excelDataList.add(new WriteExcelData(0,11,"描述"));
      codeClassifyVOS = codeClassifyVOS.stream().sorted(Comparator.comparing(CodeClassifyVO::getDataLevel)).collect(Collectors.toList());
      for (int i = 0; i < codeClassifyVOS.size(); i++) {
         CodeClassifyVO vo = codeClassifyVOS.get(i);
         excelDataList.add(new WriteExcelData(i+1,0,vo.getId()));
@@ -740,7 +809,8 @@
      if(allLevel){
         List<CodeClassify> classifyDOS = codeClassifyMapper.selectAllLevelChildHasPath(codeClassifyOid,fieldInPath);
         if(!CollectionUtils.isEmpty(classifyDOS)){
            classifyDOS = classifyDOS.stream().filter(s->FRAMEWORK_DATA_ENABLED.equalsIgnoreCase(s.getLcStatus())).collect(Collectors.toList());
            // 这儿用stream有点慢
            classifyDOS = classifyDOS.parallelStream().filter(s->FRAMEWORK_DATA_ENABLED.equalsIgnoreCase(s.getLcStatus())).collect(Collectors.toList());
         }
         return codeClassifyDO2VOs(classifyDOS);
      }else{
@@ -841,7 +911,7 @@
            s -> StringUtils.isNotBlank(s.getCodeRuleId()))
         .map(CodeClassifyPO::getCodeRuleId)
         .collect(Collectors.toList());
      Map<String, CodeRuleVO> ruleVOMap = Optional.ofNullable(ruleOids.size()==0 ? null:codeRuleService.listCodeRuleByOids(ruleOids)
      Map<String, CodeRuleVO> ruleVOMap = Optional.ofNullable(ruleOids.size()==0 ? null:codeRuleService.listCodeRuleByIds(ruleOids,true)
      ).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t,(o1,o2)->o2));
      List<String> keyOids = poList.stream().filter(s -> StringUtils.isNotBlank(s.getKeyRepeatRuleId()))
@@ -849,7 +919,7 @@
      Map<String,CodeKeyAttrRepeatRuleVO> keyRuleVOMap =Optional.ofNullable(keyOids.size()==0 ? null: iCodeKeyattrrepeatService.listCodeKeyAttrRepeatRuleByOids(keyOids)
      ).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t,(o1,o2)->o2));
      List<String> btmOids = poList.stream().filter(s -> StringUtils.isNotBlank(s.getKeyRepeatRuleId()))
      List<String> btmOids = poList.stream().filter(s -> StringUtils.isNotBlank(s.getBtmTypeId()))
         .map(CodeClassifyPO::getBtmTypeId).collect(Collectors.toList());
      Map<String, BtmTypeVO> btmVOMap = Optional
         .ofNullable(btmOids.size()==0 ? null: btmTypeClient.selectByIdCollection(btmOids).getData())
@@ -977,8 +1047,10 @@
               classifyDO.setBtmname("codeclassify");
               classifyDO.setLcStatus("Enabled");
               classifyDO.setOwner(String.valueOf(AuthUtil.getUser().getUserId()));
               classifyDO.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));
               classifyDO.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
               // classifyDO.setCreator(String.valueOf(AuthUtil.getUser().getUserId()));
               // classifyDO.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
               classifyDO.setCreator(String.valueOf(AuthUtil.getUser().getAccount()));
               classifyDO.setLastModifier(String.valueOf(AuthUtil.getUser().getAccount()));
               classifyDO.setLastModifyTime(new Date());
               codeClassifyMapper.insert(classifyDO);
            }
@@ -1120,7 +1192,8 @@
      List<Map<String,Object>> cbos = codeClassifyMapper.selectAllLevelParentByOid(oid);
      Map<String,String> oidLevelMap = new HashMap<>();
      Optional.ofNullable(cbos).orElseGet(()->new ArrayList<>()).stream().forEach(cbo->{
         oidLevelMap.put(cbo.get("OID").toString(),cbo.get("LEVEL").toString());
         // 用key取map值并且不区分大小写
         oidLevelMap.put(cbo.getOrDefault("OID",cbo.get("oid")).toString(),cbo.get("LEVEL").toString());
      });
      if(CollectionUtils.isEmpty(oidLevelMap)){
         return new ArrayList<>();
@@ -1191,7 +1264,7 @@
         return null;
      }
      List<Tree> treeList = trees.stream().filter(tree -> !CollectionUtils.isEmpty(btmTypeVOS.stream().filter(btmType -> {
               if(Objects.equals(tree.getAttributes().get("id"), btmType.getId())){
               if(Objects.equals(tree.getAttributes().get("btmTypeId"), btmType.getId())){
                  tree.getAttributes().put("btmTypeOid",btmType.getOid());
                  return true;
               }