ludc
2024-05-17 58e1c4e2bdc8e4f8b647d7c2b9e5e5656a00b445
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -4,6 +4,7 @@
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.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -48,6 +49,8 @@
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.dto.ClassifyAuthDTO;
import com.vci.ubcs.system.feign.ISysClient;
import org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -70,10 +73,8 @@
import java.io.File;
import java.util.*;
import java.util.stream.Collectors;
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 {
@@ -91,7 +92,7 @@
   private IBtmTypeClient btmTypeClient;
   @Resource
   private CommonsMapper commonsMapper;
   private ISysClient sysClient;
   /**
    * 日志
@@ -114,10 +115,12 @@
   @Resource
   private CodeBasicSecMapper codeBasicSecMapper;
   /**
    * 上级节点的属性名称
    */
   public static  final String PARENT_FIELD_NAME = "parentCodeClassifyOid";
   /**
    * 使用查询封装器来查询
    * @param wrapper 查询封装器
@@ -154,6 +157,7 @@
    * @param
    */
   @Override
   @Transactional(rollbackFor = Exception.class)
   public R addSave(CodeClassify codeClassifyEntity) {
      try {
         VciBaseUtil.alertNotNull(codeClassifyEntity.getId(),"主题库编号不能为空!",codeClassifyEntity.getName(),"主题库名称不能为空!");
@@ -180,8 +184,19 @@
      }
      DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeClassifyEntity, MdmBtmTypeConstant.CODE_CLASSIFY);
      codeClassifyEntity.setLcStatus(FRAMEWORK_DATA_ENABLED);
      int insertNumber = codeClassifyMapper.insert(codeClassifyEntity);
      return R.status(SqlHelper.retBool(insertNumber));
      boolean resBoolean = SqlHelper.retBool(codeClassifyMapper.insert(codeClassifyEntity));
      if (!resBoolean) {
         return R.status(resBoolean);
      }
      // 分类添加成功,给系统管理员和当前角色增加分类权限和数据权限
      ClassifyAuthDTO classifyAuthDTO = new ClassifyAuthDTO();
      classifyAuthDTO.setClassifyId(codeClassifyEntity.getOid());
//      classifyAuthDTO.setClassId(codeClassifyEntity.getId());
      R r = sysClient.saveAddClassifyDefaultAuth(classifyAuthDTO);
      if (!r.isSuccess()) {
         throw new ServiceException("给角色授予默认权限时出现错误,原因:"+r.getMsg());
      }
      return R.status(resBoolean);
   }
   /**
@@ -216,12 +231,16 @@
      // 不为空就需要该当前分类下所有子分类的isParticipateCheck
      if(!codeClassifies.isEmpty()){
         List<String> oids = codeClassifies.stream().map(CodeClassify::getOid).collect(Collectors.toList());
         updateAttr = codeClassifyMapper.update(
            null,
            Wrappers.<CodeClassify>update()
               .lambda().in(CodeClassify::getOid, oids)
               .set(CodeClassify::getIsParticipateCheck, codeClassifyEntity.getIsParticipateCheck())
         );
         LambdaUpdateWrapper<CodeClassify> updateWrapper = Wrappers.<CodeClassify>update()
            .lambda().in(CodeClassify::getOid, oids)
            .set(CodeClassify::getIsParticipateCheck, codeClassifyEntity.getIsParticipateCheck());
         // 父分类的业务类型做了更改,所有子分类的都得进行更改
         if(!codeClassifyEntity.getBtmTypeId().equals(detail.getBtmTypeId())){
            updateWrapper.set(CodeClassify::getBtmTypeId,codeClassifyEntity.getBtmTypeId())
               .set(CodeClassify::getBtmTypeName,codeClassifyEntity.getBtmTypeName());
         }
         updateAttr = codeClassifyMapper.update(null,updateWrapper);
      }
//         //处理数据集成逻辑,成功后执行集成第一步,分类数据特殊处理。只有启用状态的分类才推送
@@ -504,7 +523,7 @@
    * @return 主题库分类显示树
    */
   @Override
   public List<Tree> referTree(TreeQueryObject treeQueryObject) {
   public List<Tree> referTree(TreeQueryObject treeQueryObject) throws ServiceException{
      if(treeQueryObject == null){
         treeQueryObject = new TreeQueryObject();
      }
@@ -514,7 +533,7 @@
      if(treeQueryObject.getConditionMap().containsKey(LC_STATUS)) {
         treeQueryObject.getConditionMap().remove(LC_STATUS);
      }
      if(treeQueryObject.getExtandParamsMap() ==null || !treeQueryObject.getExtandParamsMap().containsKey(REFER_SHOW_DISABLED_QUERY_KEY)) {
      if(treeQueryObject.getExtandParamsMap() == null || !treeQueryObject.getExtandParamsMap().containsKey(REFER_SHOW_DISABLED_QUERY_KEY)) {
      }
      treeQueryObject.getConditionMap().put(LC_STATUS, FRAMEWORK_DATA_ENABLED);
      return treeCodeClassify(treeQueryObject);
@@ -544,7 +563,7 @@
    * @return 主题库分类 显示树
    */
   @Override
   public List<Tree> treeCodeClassify(TreeQueryObject treeQueryObject) {
   public List<Tree> treeCodeClassify(TreeQueryObject treeQueryObject) throws ServiceException{
      List<CodeClassify> doList = null;
      String id = null;
      String lcStatus = null;
@@ -554,6 +573,7 @@
      }
      if(StringUtils.isNotBlank(id) || StringUtils.isNotBlank(lcStatus) ){
         //String tableName = this.getTableName(treeQueryObject.getConditionMap().get("btmTypeId"),treeQueryObject.getConditionMap().get("id"), treeQueryObject.getConditionMap().get("lcStatus"));
         // TODO: 2024-1-24 23:25我去掉了懒加载,因为会影响数据授权过滤和分类搜索功能,而且这儿感觉没必要做懒加载
         doList = codeClassifyMapper
            .selectCodeClassifyDOByTree(
               treeQueryObject.getConditionMap().get("id"),
@@ -572,23 +592,71 @@
      List<CodeClassifyVO> voList = codeClassifyDO2VOs(doList);
      TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(PARENT_FIELD_NAME);
      treeWrapperOptions.copyFromTreeQuery(treeQueryObject);
      List<Tree> tree= revisionModelUtil.doList2Trees(voList,treeWrapperOptions,(CodeClassifyVO s) ->{
      List<Tree> tree = revisionModelUtil.doList2Trees(voList,treeWrapperOptions,(CodeClassifyVO s) ->{
         //可以在这里处理树节点的显示
         return s.getId() + " " + s.getName() + (FrameworkDataLCStatus.DISABLED.getValue().equalsIgnoreCase(s
            .getLcStatus()) ? (" 【停用】 ") : "");
      });
      // 非超管过滤未授权的分类
      if(!VciBaseUtil.checkAdminTenant()){
         // 那些分类具备查看权限
         R<List<String>> viewClassByRoleIds = sysClient.getViewClassByRoleIds(
            Arrays.asList(AuthUtil.getUser().getRoleId().split(",")),
            treeQueryObject.getConditionMap().getOrDefault("authType","classify_auth"),
            treeQueryObject.getConditionMap().getOrDefault("buttonCode","classify_view"),
            treeQueryObject.getConditionMap().getOrDefault("menuCode","classifyTree")
         );
         // 请求失败或者请求得到的具备查看权限的分类id集合为空
         if(!viewClassByRoleIds.isSuccess() && viewClassByRoleIds.getData().isEmpty()){
            throw new ServiceException("主数据查看权限未配置,或配置有误!");
         }
         // 过滤
         filterTreeNodes(tree,viewClassByRoleIds.getData());
      }
      // 加载分类是否具有子分类
      tree.parallelStream().forEach(item -> {
         boolean checkHasChild = checkHasChild(item.getOid());
         item.setLeaf(!checkHasChild);
      });
      return tree;
   }
      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);
   /**
    * 分类授权过滤掉没有权限的分类
    * @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 = 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();
         }
      }
      return tree;
   }
   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;
   }
   /**
@@ -665,7 +733,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;
@@ -683,7 +751,28 @@
      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;
   }
   /**
    *  根据顶层节点oid查询所有叶子节点分类oid
    * @param pid
    * @return
    */
   @Override
   public String selectLeafByPid(String pid) {
      List<CodeClassify> codeClassifies = codeClassifyMapper.selectLeafByPid(pid);
      if(codeClassifies.isEmpty()){
         return "";
      }
      String oids = codeClassifies.stream()
         .map(CodeClassify::getOid)
         .map(s ->s)
         .collect(Collectors.joining(","));;
      return oids;
   }
@@ -692,7 +781,6 @@
    */
   @Override
   public R flowingDependencyGen(String classifyOid) {
      //查询此分类下面的所有分类
      List<CodeClassify>  codeClassifyList=codeClassifyMapper.selectAllClassifyByOid(classifyOid,AuthUtil.getTenantId(),null);
      //查询码值表,获取最大流水
@@ -700,31 +788,45 @@
         .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");
         CodeBasicSec codeBasicSec = codeBasicSecMapper.selectOne(secWrapper);
         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",codeBasicSec.getOid());
         CodeSerialValue codeSerialValue = codeSerialValueMapper.selectOne(wrapper);
         if(codeSerialValue == null){
         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(codeBasicSec.getOid());
            newSerialValue.setCodeSecOid(codeBasicSecs.get(0).getOid());
            newSerialValue.setSerialUnit(codeAllCodeVO.getSerialUnit());
            newSerialValue.setMaxSerial(codeAllCodeVO.getUnFillSerial());
            newSerialValue.setLctid("defaultLC");
            newSerialValue.setLcStatus("Exist");
            codeSerialValueMapper.insert(newSerialValue);
         }else{
            codeSerialValue.setMaxSerial(codeAllCodeVO.getUnFillSerial());
            codeSerialValue.setLastModifyTime(new Date());
            codeSerialValue.setLastModifier(String.valueOf(AuthUtil.getUser().getUserId()));
            codeSerialValue.setTs(new Date());
            codeSerialValueMapper.updateById(codeSerialValue);
            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("操作成功!");
@@ -1385,15 +1487,28 @@
      if(!CollectionUtils.isEmpty(dataList)){
         for(Map data:dataList){
            CodeClassify codeClassifyDO = new CodeClassify();
            codeClassifyDO.setOid(VciBaseUtil.getStringValueFromObject(data.get("OID")));
            codeClassifyDO.setId(VciBaseUtil.getStringValueFromObject(data.get("ID")));
            codeClassifyDO.setName(VciBaseUtil.getStringValueFromObject(data.get("NAME")));
            codeClassifyDO.setBtmTypeId(VciBaseUtil.getStringValueFromObject(data.get("BTMTYPEID")));
            codeClassifyDO.setBtmTypeName(VciBaseUtil.getStringValueFromObject(data.get("BTMTYPENAME")));
            codeClassifyDO.setOid(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getMapValueIgnoreCase(data,"OID")));
            codeClassifyDO.setId(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getMapValueIgnoreCase(data,"ID")));
            codeClassifyDO.setName(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getMapValueIgnoreCase(data,"NAME")));
            codeClassifyDO.setBtmTypeId(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getMapValueIgnoreCase(data,"BTMTYPEID")));
            codeClassifyDO.setBtmTypeName(VciBaseUtil.getStringValueFromObject(VciBaseUtil.getMapValueIgnoreCase(data,"BTMTYPENAME")));
            oidList.add(codeClassifyDO);
         }
      }
      return oidList;
   }
   /**
    * 查询所有上层父节点的oid
    * @param oid
    * @return
    */
   @Override
   public List<String> selectAllParentOid(String oid){
      if(Func.isBlank(oid)){
         return new ArrayList<>();
      }
      return this.codeClassifyMapper.selectAllParentOid(oid);
   }
   /**
@@ -1440,7 +1555,5 @@
      wrapper.eq("parentCodeClassifyOid",codeClassifyOid);
      return codeClassifyMapper.selectCount(wrapper).intValue();
   }
}