Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -10,17 +10,16 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.entity.CodeClassify;
import com.vci.ubcs.code.entity.CodeClassifyTemplate;
import com.vci.ubcs.code.entity.*;
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.mapper.*;
import com.vci.ubcs.code.po.CodeClassifyPO;
import com.vci.ubcs.code.service.ICodeClassifyService;
import com.vci.ubcs.code.service.ICodeKeyAttrRepeatService;
import com.vci.ubcs.code.service.ICodeRuleService;
import com.vci.ubcs.code.vo.pagemodel.CodeAllCodeVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeKeyAttrRepeatRuleVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
@@ -50,6 +49,7 @@
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import com.vci.ubcs.starter.web.util.VciBaseUtil;
import com.vci.ubcs.system.cache.NacosConfigCache;
import com.vci.ubcs.system.feign.ISysClient;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -62,6 +62,7 @@
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -92,7 +93,7 @@
   private IBtmTypeClient btmTypeClient;
   @Resource
   private CommonsMapper commonsMapper;
   private ISysClient sysClient;
   /**
    * 日志
@@ -106,6 +107,15 @@
   @Resource
   private ICodeKeyAttrRepeatService iCodeKeyattrrepeatService;
   @Resource
   private CodeAllCodeMapper codeAllCodeMapper;
   @Resource
   private CodeSerialValueMapper codeSerialValueMapper;
   @Resource
   private CodeBasicSecMapper codeBasicSecMapper;
   /**
    * 上级节点的属性名称
    */
@@ -573,18 +583,67 @@
         return s.getId() + " " + s.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
            .getLcStatus()) ? (" 【停用】 ") : "");
      });
      Iterator var6 =  tree.listIterator();
      while(var6.hasNext()){
         Tree trees = (Tree) var6.next();
         boolean checkHasChild=codeClassifyMapper.checkHasChild(trees.getOid());
         if(checkHasChild){
            trees.setLeaf(false);
         }else{
            trees.setLeaf(true);
      //超管显示所有分类
      if(VciBaseUtil.checkAdminTenant()){
         Iterator var6 =  tree.listIterator();
         while(var6.hasNext()){
            Tree trees = (Tree) var6.next();
            boolean checkHasChild=codeClassifyMapper.checkHasChild(trees.getOid());
            if(checkHasChild){
               trees.setLeaf(false);
            }else{
               trees.setLeaf(true);
            }
         }
      }else {
         // 那些分类具备查看权限
         R<List<String>> viewClassByRoleIds = sysClient.getViewClassByRoleIds(Arrays.asList(AuthUtil.getUser().getRoleId().split(",")));
         // 请求失败或者请求得到的具备查看权限的分类id集合为空
         if(!viewClassByRoleIds.isSuccess() && !viewClassByRoleIds.getData().isEmpty()){
            return new ArrayList<>();
         }
         // 过滤
         filterTreeNodes(tree,viewClassByRoleIds.getData());
      }
      return tree;
   }
   /**
    * 分类授权过滤掉没有权限的分类
    * @param trees
    * @param classifyIds
    */
   private void filterTreeNodes(List<Tree> trees, List<String> classifyIds) {
      Iterator<Tree> iterator = trees.iterator();
      while (iterator.hasNext()) {
         Tree tree = iterator.next();
         Boolean checkHasChild = codeClassifyMapper.checkHasChild(tree.getOid());
         tree.setLeaf(!checkHasChild);
         if (classifyIds.contains(tree.getOid())) {
            // 如果顶层节点存在于 classifyIds 中,直接保留其子节点集合
            continue;
         }
         if (tree.getChildren() != null && !tree.getChildren().isEmpty()) {
            filterTreeNodes(tree.getChildren(), classifyIds);
         }
         if (!hasMatchingChild(tree, classifyIds)) {
            iterator.remove();
         }
      }
   }
   private boolean hasMatchingChild(Tree tree, List<String> classifyIds) {
      if (classifyIds.contains(tree.getOid())) {
         return true;
      }
      if (tree.getChildren() != null) {
         for (Tree child : tree.getChildren()) {
            if (hasMatchingChild(child, classifyIds)) {
               return true;
            }
         }
      }
      return false;
   }
   /**
@@ -661,7 +720,7 @@
    * @return
    */
   public List<CodeClassifyVO> selectAllClassifyByOid(String oid, String fieldInPath){
      List<CodeClassify>  codeClassifyList=codeClassifyMapper.selectAllClassifyByOid(oid,AuthUtil.getTenantId(),fieldInPath);
      List<CodeClassify>  codeClassifyList=codeClassifyMapper.selectAllClassifyByOid(oid,fieldInPath,AuthUtil.getTenantId());
      List<CodeClassifyVO> voList = codeClassifyDO2VOs(codeClassifyList);
      return voList;
@@ -679,8 +738,67 @@
      if(codeClassifies.isEmpty()){
         return "";
      }
      String oids = codeClassifies.stream().map(CodeClassify::getOid).collect(Collectors.joining(","));
      String oids = codeClassifies.stream()
         .map(CodeClassify::getOid)
         .map(s -> "'" + s + "'")
         .collect(Collectors.joining(","));;
      return oids;
   }
   /**
    * 流水依赖生成
    */
   @Override
   public R flowingDependencyGen(String classifyOid) {
      //查询此分类下面的所有分类
      List<CodeClassify>  codeClassifyList=codeClassifyMapper.selectAllClassifyByOid(classifyOid,AuthUtil.getTenantId(),null);
      //查询码值表,获取最大流水
      List<CodeAllCode> codeAllCodeVOS = codeAllCodeMapper.selectGroupByClassify("'" + codeClassifyList.stream()
         .map(classfiy -> classfiy.getOid()).collect(Collectors.joining("','")) + "'","'${sav}'");
      //往流水表里面加数据,有则更新,无则添加数据。
      for (CodeAllCode codeAllCodeVO : codeAllCodeVOS) {
         if(Func.isEmpty(codeAllCodeVO.getSerialUnit())){
            throw new ServiceException("编码为:" + codeAllCodeVO.getId() + "的码值数据流水依赖不能为空!");
         }
         try {
            CodeRuleVO codeRuleVO = codeRuleService.getObjectByOid(codeAllCodeVO.getCodeRuleOid());
            if(Func.isEmpty(codeRuleVO)){
               continue;
            }
         }catch (Exception e){
            continue;
         }
         QueryWrapper<CodeBasicSec> secWrapper = new QueryWrapper<>();
         secWrapper.eq("PKCODERULE",codeAllCodeVO.getCodeRuleOid());
         secWrapper.eq("SECTYPE","codeserialsec");
         List<CodeBasicSec> codeBasicSecs = codeBasicSecMapper.selectList(secWrapper);
         if(codeBasicSecs.size() == 0 ){
            throw new ServiceException("根据码值ID:" + codeAllCodeVO.getCodeRuleOid() + ",码段类型为流水码段(codeserialsec),在基础码段中未找到相关数据!");
         }
         QueryWrapper<CodeSerialValue> wrapper = new QueryWrapper<>();
         wrapper.eq("codeRuleOid",codeAllCodeVO.getCodeRuleOid());
         wrapper.eq("serialUnit",codeAllCodeVO.getSerialUnit());
         wrapper.eq("codeSecOid",codeBasicSecs.get(0).getOid());
         List<CodeSerialValue> codeSerialValues = codeSerialValueMapper.selectList(wrapper);
         if(codeSerialValues.size() == 0){
            CodeSerialValue newSerialValue = new CodeSerialValue();
            DefaultAttrAssimtUtil.addDefaultAttrAssimt(newSerialValue,"codeserialvalue");
            newSerialValue.setCodeRuleOid(codeAllCodeVO.getCodeRuleOid());
            newSerialValue.setCodeSecOid(codeBasicSecs.get(0).getOid());
            newSerialValue.setSerialUnit(codeAllCodeVO.getSerialUnit());
            newSerialValue.setMaxSerial(codeAllCodeVO.getUnFillSerial());
            newSerialValue.setLctid("defaultLC");
            newSerialValue.setLcStatus("Exist");
            codeSerialValueMapper.insert(newSerialValue);
         }else{
            codeSerialValues.get(0).setMaxSerial(codeAllCodeVO.getUnFillSerial());
            codeSerialValues.get(0).setLastModifyTime(new Date());
            codeSerialValues.get(0).setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
            codeSerialValues.get(0).setTs(new Date());
            codeSerialValueMapper.updateById(codeSerialValues.get(0));
         }
      }
      return R.success("操作成功!");
   }
   /***
@@ -1350,6 +1468,19 @@
   }
   /**
    * 查询所有上层父节点的oid
    * @param oid
    * @return
    */
   @Override
   public List<String> selectAllParentOid(String oid){
      if(Func.isBlank(oid)){
         return new ArrayList<>();
      }
      return this.codeClassifyMapper.selectAllParentOid(oid);
   }
   /**
    * 使用分类主键获取分类相关的所有信息
    *
    * @param codeClassifyOid 分类的主键