1428594221
2023-06-14 931eb15f748f181fbf347508830f21830f09c863
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -2,28 +2,29 @@
import com.alibaba.nacos.common.utils.StringUtils;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
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.CodeOsbtmtypeEntity;
import com.vci.ubcs.code.entity.CodeOsbtmtypeattributeEntity;
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.CodeOsbtmtypeMapper;
import com.vci.ubcs.code.mapper.CodeOsbtmtypeattributeMapper;
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.CodeOsattributeVO;
import com.vci.ubcs.code.vo.CodeOsbtmtypeVO;
import com.vci.ubcs.code.vo.pagemodel.CodeClassifyVO;
import com.vci.ubcs.code.vo.pagemodel.CodeKeyAttrRepeatRuleVO;
import com.vci.ubcs.code.vo.pagemodel.CodeRuleVO;
import com.vci.ubcs.omd.cache.EnumCache;
import com.vci.ubcs.omd.enums.EnumEnum;
import com.vci.ubcs.omd.feign.IBtmTypeClient;
import com.vci.ubcs.omd.vo.BtmTypeAttributeVO;
import com.vci.ubcs.omd.feign.IBtmTypeClient;
import com.vci.ubcs.omd.vo.BtmTypeVO;
import com.vci.ubcs.starter.bo.WriteExcelData;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.poi.bo.ReadExcelOption;
@@ -33,6 +34,7 @@
import com.vci.ubcs.starter.revision.model.TreeQueryObject;
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.LocalFileUtil;
import com.vci.ubcs.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.starter.web.pagemodel.DataGrid;
@@ -44,18 +46,22 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springblade.core.cache.utils.CacheUtil;
import com.vci.ubcs.core.log.exception.ServiceException;
import org.springblade.core.launch.constant.AppConstant;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.awt.event.ItemEvent;
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.*;
@@ -72,11 +78,7 @@
   private ICodeRuleService codeRuleService;
   @Resource
   private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
   @Resource
   CodeOsbtmtypeattributeMapper codeOsbtmtypeattributeMapper;
   @Resource
   ICodeRuleService ICodeRuleService;
   private IBtmTypeClient btmTypeClient;
   /**
    * 日志
@@ -103,6 +105,20 @@
   public List<CodeClassify> selectByWrapper(Wrapper wrapper) {
      return codeClassifyMapper.selectList(wrapper);
   }
   /**
    * 查询
    * @param wrapper 查询封装器
    * @return
    */
   @Override
   public List<String> select1(Wrapper wrapper) {
      return codeClassifyMapper.selectObjs(wrapper);
   }
   @Override
   public IPage<CodeClassifyVO> selectPlCodeClassifyPage(IPage<CodeClassifyVO> page, CodeClassifyVO plCodeClassify) {
@@ -254,9 +270,8 @@
      if(StringUtils.isBlank(oid)){
         throw new ServiceException("oid不能为空!");
      }
      return !codeClassifyMapper.checkHasChild(oid.trim());
      return codeClassifyMapper.checkHasChild(oid.trim());
   }
   /**
    * 删除主题库分类
@@ -362,7 +377,6 @@
      return codeClassifyDO2VOs(codeClassifyDOList);
   }
   /**
    * 使用主键集合查询数据对象
    * @param oidCollections 主键的集合
@@ -381,7 +395,6 @@
      }
      return  codeClassifyList;
   }
   /**
    * 批量数据对象转换为显示对象
@@ -441,13 +454,43 @@
   }
   /**
    * 主键查询数据对象,关联查询
    * @param oid 主键
    * @return  数据对象
    */
   private CodeClassify selectByOidRel(String oid){
      List<CodeClassify> codeClassifyList = codeClassifyMapper.selectClassifyByKeyAndReseRel("'"+oid.trim()+"'");
//      CodeClassify codeClassifyEntity = (CodeClassify) codeClassifyList;
      if(codeClassifyList.size() == 0 ){
         throw new ServiceException("dataNotExist");//根据主键id未查到相关数据
      }
//      if(codeClassifyEntity == null || StringUtils.isBlank(codeClassifyEntity.getOid())){
//         throw new ServiceException("dataOidNotExist");//根据主键id未查到相关数据
//      }
      return codeClassifyList.get(0);
   }
   /**
    * 查询主题库分类 树
    * @param treeQueryObject 树查询对象
    * @return 主题库分类 显示树
    */
   @Override
   public List<Tree> treeCodeClassify(TreeQueryObject treeQueryObject) {
      List<CodeClassify> doList =codeClassifyMapper.selectCodeClassifyVOByTree(treeQueryObject.getParentOid());
      List<CodeClassify> doList = null;
      String id = null;
      String lcStatus = null;
      if(!Objects.isNull(treeQueryObject.getConditionMap())){
         id = treeQueryObject.getConditionMap().getOrDefault("id",null);
         lcStatus = treeQueryObject.getConditionMap().getOrDefault("lcStatus",null);
      }
      if(StringUtils.isNotBlank(id) || StringUtils.isNotBlank(lcStatus) ){
         doList = codeClassifyMapper
            .selectCodeClassifyDOByTree(treeQueryObject.getConditionMap().get("id"),treeQueryObject.getConditionMap().get("lcStatus"),treeQueryObject.getParentOid());
      }else{
         doList =codeClassifyMapper.selectCodeClassifyVOByTree(treeQueryObject.getParentOid());
      }
      List<CodeClassifyVO> voList = codeClassifyDO2VOs(doList);
      TreeWrapperOptions treeWrapperOptions = new TreeWrapperOptions(PARENT_FIELD_NAME.toLowerCase(Locale.ROOT));
      treeWrapperOptions.copyFromTreeQuery(treeQueryObject);
@@ -469,8 +512,45 @@
      return tree;
   }
   /**
    * 根据树形查询对象来查询数据对象
    *
    * @param treeQueryObject 树形查询对象
    * @return 查询结果,数据对象
    */
   @Override
   public List<CodeClassifyVO> selectCodeClassifyDOByTree(TreeQueryObject treeQueryObject) {
      List<CodeClassify> doList =codeClassifyMapper.selectCodeClassifyVOByTree(treeQueryObject.getParentOid());
      List<CodeClassifyVO> voList = codeClassifyDO2VOs(doList);
      return voList;
   }
   /**
    * 使用编号的路径获取对象
    *
    * @param fieldPath 编号的路径,一定要从最顶层节点开始,格式为xxx/yyy/zz 这样
    * @return 分类的显示对象
    */
   @Override
   public CodeClassifyVO getObjectByClsfNamePath(String fieldPath){
      CodeClassifyVO codeClassifyVO=new CodeClassifyVO();
      List<CodeClassify> classifyList = codeClassifyMapper.selectByFieldNamePath(fieldPath,"name");
      if(classifyList.size()>0){
         codeClassifyVO=codeClassifyDO2VO(classifyList.get(0));
      }
      return codeClassifyVO;
   }
   /***
    * 根据上级节点获取下级节点代号路径和名称路径
    * @param classifyId
    * @param enable
    * @return
    */
   @Override
   public List<CodeClassifyVO> getIdPathToNamePathByParentId(String classifyId, boolean enable) {
      return null;
   }
//   /**
   //   /**
//    * 根据树形查询对象来查询数据对象
//    *
//    * @param treeQueryObject 树形查询对象
@@ -630,7 +710,6 @@
      return excelName;
   }
   /**
    * 导入分类
    *
@@ -695,9 +774,10 @@
      List<String> btmOids = poList.stream().filter(s -> StringUtils.isNotBlank(s.getKeyRepeatRuleId()))
         .map(CodeClassifyPO::getBtmTypeId).collect(Collectors.toList());
      Map<String, CodeOsbtmtypeEntity> btmVOMap = Optional.ofNullable(btmOids.size()==0 ? null: codeOsbtmtypeMapper.selectBatchIds(btmOids)
      ).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t,(o1,o2)->o2));
//      Map<String, CodeOsbtmtypeVO> btmVOMap = null;
      Map<String, BtmTypeVO> btmVOMap = Optional
         .ofNullable(btmOids.size()==0 ? null: btmTypeClient.selectByIdCollection(btmOids).getData())
         .orElse(new ArrayList<BtmTypeVO>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t,(o1,o2)->o2));
      //      Map<String, CodeOsbtmtypeVO> btmVOMap = null;
      Map<String/**路径**/,String/**主键**/> oidPathMap = new HashMap<>();
      //我们需要查询所有已经存在的分类,主要是路径,用来判断分类的数据
@@ -727,7 +807,7 @@
         classify.setDescription(po.getDescription());
         oidPathMap.put(po.getPath(),classify.getOid());
         if(StringUtils.isNotBlank(po.getBtmTypeId())){
            CodeOsbtmtypeVO typeVO = (CodeOsbtmtypeVO)btmVOMap.get(po.getBtmTypeId().toLowerCase(Locale.ROOT));
            BtmTypeVO typeVO = (BtmTypeVO)btmVOMap.get(po.getBtmTypeId().toLowerCase(Locale.ROOT));
            classify.setBtmTypeId(typeVO.getId());
            classify.setBtmTypeName(typeVO.getName());
         }
@@ -838,7 +918,7 @@
    * @return 属性的信息,包含默认的属性
    */
   @Override
   public DataGrid<CodeOsattributeVO> listClassifyLinkAttr(BaseQueryObject baseQueryObject) {
   public DataGrid<BtmTypeAttributeVO> listClassifyLinkAttr(BaseQueryObject baseQueryObject) throws ServiceException{
      if(baseQueryObject == null){
         baseQueryObject = new BaseQueryObject();
      }
@@ -846,9 +926,13 @@
         baseQueryObject.setConditionMap(new HashMap<>());
      }
      String classifyOid = baseQueryObject.getConditionMap().getOrDefault("codeClassifyOid","");
      String btmTypeOid = baseQueryObject.getConditionMap().getOrDefault("btmTypeOid","");
      String id = baseQueryObject.getConditionMap().getOrDefault("id","");
      String name = baseQueryObject.getConditionMap().getOrDefault("name","");
      if(StringUtils.isBlank(classifyOid)){
         return new DataGrid<>();
      }
      if(StringUtils.isBlank(btmTypeOid)){
         return new DataGrid<>();
      }
      CodeClassifyVO topClassifyVO = getTopClassifyVO(classifyOid);
@@ -858,23 +942,28 @@
      Map<String,Object> condition = new HashMap<>(1);
      condition.put("pkbtmtype",topClassifyVO.getBtmtypeid());
      List<CodeOsbtmtypeattributeEntity> unDefaultAttributes = codeOsbtmtypeattributeMapper.selectByMap(condition);
//      List<OsBtmTypeAttributeVO> unDefaultAttributes = btmService. (topClassifyVO.getBtmtypeid());
      List<CodeOsattributeVO> attributeVOS = new ArrayList<>();
      R<BtmTypeVO> btmTypeDetail = btmTypeClient.getDetail(btmTypeOid);
      if(btmTypeDetail.getCode() != 200){
         throw new ServiceException("业务类型feign接口调用出错");
      }
      List<BtmTypeAttributeVO> unDefaultAttributes = btmTypeDetail.getData().getAttributes();
      // List<CodeOsbtmtypeattributeEntity> unDefaultAttributes = codeOsbtmtypeattributeMapper.selectByMap(condition);
      // List<OsBtmTypeAttributeVO> unDefaultAttributes = btmService. (topClassifyVO.getBtmtypeid());
      List<BtmTypeAttributeVO> attributeVOS = new ArrayList<>();
      if(!CollectionUtils.isEmpty(unDefaultAttributes)){
         unDefaultAttributes.stream().forEach(attr->{
            CodeOsattributeVO attributeVO = new CodeOsattributeVO();
            BtmTypeAttributeVO attributeVO = new BtmTypeAttributeVO();
            BeanUtils.copyProperties(attr,attributeVO);
            attributeVO.setAttributedatatype(attr.getAttrdatatype());
            attributeVO.setAttrlength(Short.valueOf(attr.getAttributelength()));
            attributeVO.setBtmtypeid(attr.getReferbtmtypeid());
            attributeVO.setBtmtypename(attr.getReferbtmtypename());
            attributeVO.setAttrDataType(attr.getAttrDataType());
            attributeVO.setAttributeLength(attr.getAttributeLength());
            attributeVO.setBtmTypeId(btmTypeDetail.getData().getId());
            attributeVO.setBtmname(btmTypeDetail.getData().getName());
            attributeVO.setAttrDataTypeText(EnumCache.getValue(EnumEnum.VCI_FIELD_TYPE,attr.getAttrDataType()));
            boolean add = true;
            if(StringUtils.isNotBlank(id) && !attributeVO.getId().contains(id.replace("*",""))){
               add = false;
            }
            if(StringUtils.isNotBlank(name) && !attributeVO.getId().contains(name.replace("*",""))){
            if(StringUtils.isNotBlank(name) && !attributeVO.getName().contains(name.replace("*",""))){
               add = false;
            }
            if(add){
@@ -882,21 +971,37 @@
            }
         });
      }
//      if(!CollectionUtils.isEmpty(attributeService.getDefaultAttributeVOs())){
//         attributeService.getDefaultAttributeVOs().stream().forEach(attr->{
//            boolean add = true;
//            if(StringUtils.isNotBlank(id) && !attr.getId().contains(id.replace("*",""))){
//               add = false;
//            }
//            if(StringUtils.isNotBlank(name) && !attr.getId().contains(name.replace("*",""))){
//               add = false;
//            }
//            if(add){
//               attributeVOS.add(attr);
//            }
//         });
//      }
      DataGrid<CodeOsattributeVO> dataGrid = new DataGrid<>();
      R<BtmTypeVO> btmTypeVOR = btmTypeClient.getDefaultAttrByBtmId(topClassifyVO.getBtmtypeid());
      if(btmTypeVOR.getCode() != 200){
         throw new ServiceException("业务类型feign接口调用出错");
      }
      List<BtmTypeAttributeVO> defaultAttrVOS = btmTypeVOR.getData().getAttributes();
      // 取两个集合差集
      List<String> ids = unDefaultAttributes.stream().map(BtmTypeAttributeVO::getId).collect(Collectors.toList());
      defaultAttrVOS.forEach(item->{
         if(!ids.contains(item.getId())){
            BtmTypeAttributeVO attributeVO = new BtmTypeAttributeVO();
            BeanUtils.copyProperties(item,attributeVO);
            attributeVO.setAttrDataType(item.getAttrDataType());
            attributeVO.setAttributeLength(item.getAttributeLength());
            attributeVO.setBtmTypeId(btmTypeDetail.getData().getId());
            attributeVO.setBtmname(btmTypeDetail.getData().getName());
            attributeVO.setAttrDataTypeText(EnumCache.getValue(EnumEnum.VCI_FIELD_TYPE,item.getAttrDataType()));
            boolean add = true;
            if(StringUtils.isNotBlank(id) && !item.getId().contains(id.replace("*",""))){
               add = false;
            }
            if(StringUtils.isNotBlank(name) && !item.getName().contains(name.replace("*",""))){
               add = false;
            }
            if(add){
               attributeVOS.add(attributeVO);
            }
         }
      });
      DataGrid<BtmTypeAttributeVO> dataGrid = new DataGrid<>();
      dataGrid.setData(attributeVOS);
      dataGrid.setTotal(attributeVOS.size());
      return dataGrid;
@@ -945,10 +1050,15 @@
      }
      //使用主键查询一下
      List<CodeClassify> classifyDOS = codeClassifyMapper.selectBatchIds(oidLevelMap.keySet());
      String oids = "";
      for (String s : oidLevelMap.keySet()) {
         oids += "'"+s+"',";
      }
      List<CodeClassify> classifyDOS = codeClassifyMapper.selectClassifyByKeyAndReseRel(oids.substring(0,oids.length()-1));
      if(!CollectionUtils.isEmpty(classifyDOS)){
         classifyDOS.stream().forEach(classifyDO->{
            classifyDO.setDataLevel(VciBaseUtil.getInt(oidLevelMap.getOrDefault(classifyDO.getOid(),"0")));
            classifyDO.setLcStatusText(EnumCache.getValue("codeLcstatus",classifyDO.getLcStatus()));
         });
      }
      return classifyDOS;
@@ -961,7 +1071,7 @@
    * @throws VciBaseException 参数为空,数据不存在时会抛出异常
    */
   @Override
   public  CodeClassifyVO getObjectByOid(String oid) throws VciBaseException{
   public CodeClassifyVO getObjectByOid(String oid) throws VciBaseException{
      return codeClassifyDO2VO(selectByOid(oid));
   }
@@ -982,8 +1092,7 @@
   }
   /**
    * 主题库的树
    *
    * 主题库的树,已联调业务类型查询feign
    * @param treeQueryObject 树形查询对象
    * @return 主题库显示树
    */
@@ -993,10 +1102,26 @@
         treeQueryObject = new TreeQueryObject();
      }
      if(treeQueryObject.getConditionMap() == null){
         treeQueryObject.setConditionMap(new HashMap<>());
         treeQueryObject.setConditionMap(new HashMap<String,String>());
      }
      treeQueryObject.getConditionMap().put(PARENT_FIELD_NAME, "=null");
      return treeCodeClassify(treeQueryObject);
      List<Tree> trees = treeCodeClassify(treeQueryObject);
      treeQueryObject.getConditionMap().put("domain", AppConstant.APPLICATION_NAME_CODE);
      BaseQueryObject baseQueryObject = new BaseQueryObject();
      baseQueryObject.setConditionMap(treeQueryObject.getConditionMap());
      List<BtmTypeVO> btmTypeVOS = btmTypeClient.getRef(baseQueryObject).getData();
      if(Func.isEmpty(btmTypeVOS) || Func.isEmpty(trees)){
         return null;
      }
      List<Tree> treeList = trees.stream().filter(tree -> !CollectionUtils.isEmpty(btmTypeVOS.stream().filter(btmType -> {
               if(Objects.equals(tree.getAttributes().get("id"), btmType.getId())){
                  tree.getAttributes().put("btmTypeOid",btmType.getOid());
                  return true;
               }
               return false;
            }).collect(Collectors.toList())))
         .collect(Collectors.toList());
      return treeList;
   }
   /**
@@ -1047,21 +1172,39 @@
   public CodeClassifyFullInfoBO getClassifyFullInfo(String codeClassifyOid) {
      VciBaseUtil.alertNotNull(codeClassifyOid,"分类的主键");
      CodeClassifyFullInfoBO fullInfo = new CodeClassifyFullInfoBO();
      CodeClassify classifyDO = selectByOid(codeClassifyOid);
      CodeClassify classifyDO = selectByOidRel(codeClassifyOid);
      //查询上级
      fullInfo.setCurrentClassifyVO(codeClassifyDO2VO(classifyDO));
      List<Map<String, Object>> maps = codeClassifyMapper.selectAllLevelParentByOid(codeClassifyOid);
      List<CodeClassify> codeClassifyList = new ArrayList<>();
      for (Map<String, Object> map : maps) {
         CodeClassify codeClassify = new CodeClassify();
         codeClassify.setOid(String.valueOf(map.get("OID")));
         codeClassify.setOid(String.valueOf(map.get("LEVEL")));
         codeClassifyList.add(codeClassify);
      }
//      List<Map<String, Object>> maps = codeClassifyMapper.selectAllLevelParentByOid(codeClassifyOid);
//      List<Map<String, Object>> maps = selectAllLevelParentByOid(codeClassifyOid);
      List<CodeClassify> codeClassifyList = selectAllLevelParentByOid(codeClassifyOid);
//      for (Map<String, Object> map : maps) {
//         CodeClassify codeClassify = new CodeClassify();
//         codeClassify.setOid(String.valueOf(map.get("OID")));
//         codeClassify.setDataLevel((Integer) map.get("LEVEL"));
//         codeClassifyList.add(codeClassify);
//      }
      fullInfo.setParentClassifyVOs(codeClassifyDO2VOs(codeClassifyList));
      if(!CollectionUtils.isEmpty(fullInfo.getParentClassifyVOs())){
         fullInfo.setTopClassifyVO(fullInfo.getParentClassifyVOs().stream().filter(s->StringUtils.isBlank(s.getParentcodeclassifyoid())).findFirst().orElseGet(()->null));
      }
      return fullInfo;
   }
   /**
    * 统计子节点的个数
    *
    * @param codeClassifyOid 分类的主键
    * @return 个数
    */
   @Override
   public int countChildrenByClassifyOid(String codeClassifyOid) {
//      Map<String,String> conditionMap = new HashMap<>();
//      conditionMap.put("parentCodeClassifyOid",codeClassifyOid);
      QueryWrapper<CodeClassify> wrapper = new QueryWrapper<>();
      wrapper.eq("parentCodeClassifyOid",codeClassifyOid);
      return codeClassifyMapper.selectCount(wrapper).intValue();
   }
}