ludc
2023-05-18 9cacfb217b2dbf58c7efd1d96e818798a97d9382
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeClassifyServiceImpl.java
@@ -5,40 +5,41 @@
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.TreeWrapperOptions;
import com.vci.ubcs.code.bo.CodeClassifyFullInfoBO;
import com.vci.ubcs.code.entity.CodeClassify;
import com.vci.ubcs.code.entity.CodeClstemplateEntity;
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.CodeClstemplateMapper;
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.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.code.vo.pagemodel.TreeQueryObject;
import com.vci.ubcs.com.vci.starter.bo.WriteExcelData;
import com.vci.ubcs.com.vci.starter.exception.VciBaseException;
import com.vci.ubcs.com.vci.starter.poi.bo.ReadExcelOption;
import com.vci.ubcs.com.vci.starter.poi.bo.WriteExcelOption;
import com.vci.ubcs.com.vci.starter.poi.constant.ExcelLangCodeConstant;
import com.vci.ubcs.com.vci.starter.poi.util.ExcelUtil;
import com.vci.ubcs.com.vci.starter.revision.service.RevisionModelUtil;
import com.vci.ubcs.com.vci.starter.util.LocalFileUtil;
import com.vci.ubcs.com.vci.starter.web.pagemodel.BaseQueryObject;
import com.vci.ubcs.com.vci.starter.web.pagemodel.DataGrid;
import com.vci.ubcs.com.vci.starter.web.pagemodel.Tree;
import com.vci.ubcs.com.vci.starter.web.util.BeanUtilForVCI;
import com.vci.ubcs.com.vci.starter.web.util.LangBaseUtil;
import com.vci.ubcs.com.vci.starter.web.util.VciBaseUtil;
import com.vci.ubcs.starter.bo.WriteExcelData;
import com.vci.ubcs.starter.exception.VciBaseException;
import com.vci.ubcs.starter.poi.bo.ReadExcelOption;
import com.vci.ubcs.starter.poi.bo.WriteExcelOption;
import com.vci.ubcs.starter.poi.constant.ExcelLangCodeConstant;
import com.vci.ubcs.starter.poi.util.ExcelUtil;
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.LocalFileUtil;
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 org.apache.poi.hssf.util.HSSFColor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -65,16 +66,17 @@
   private CodeClassifyMapper codeClassifyMapper;
   @Resource
   private CodeClstemplateMapper codeClstemplateMapper;
   private CodeClassifyTemplateMapper codeClassifyTemplateMapper;
//   @Resource
//   private ICodeRuleService codeRuleService;
   @Resource
   private ICodeRuleService codeRuleService;
   @Resource
   private CodeOsbtmtypeMapper codeOsbtmtypeMapper;
   @Resource
   CodeOsbtmtypeattributeMapper codeOsbtmtypeattributeMapper;
   @Resource
   ICodeRuleService ICodeRuleService;
   /**
    * 日志
@@ -87,7 +89,7 @@
   private RevisionModelUtil revisionModelUtil;
   @Resource
   private ICodeKeyattrrepeatService iCodeKeyattrrepeatService;
   private ICodeKeyAttrRepeatService iCodeKeyattrrepeatService;
   /**
    * 上级节点的属性名称
    */
@@ -116,8 +118,11 @@
      codeClassifyEntity.setCreator(AuthUtil.getUser().getUserName());
      codeClassifyEntity.setCreateTime(new Date());
      codeClassifyEntity.setTs(new Date());
      codeClassifyEntity.setOwner(AuthUtil.getUser().getUserName());
      codeClassifyEntity.setLastModifier(AuthUtil.getUser().getUserName());
      codeClassifyEntity.setLastModifyTime(new Date());
      codeClassifyEntity.setRevisionSeq(1);
      codeClassifyEntity.setVersionSeq(1);
      int insertNumber = codeClassifyMapper.insert(codeClassifyEntity);
      return R.status(SqlHelper.retBool(insertNumber));
   }
@@ -168,7 +173,11 @@
      if(codeClassifyEntity == null || codeClassifyEntity.getOid() == null){
         return R.fail("传入数据不能为空!");
      }
      codeClassifyEntity = selectByOid(codeClassifyEntity.getOid());
      CodeClassify codeClassifyNew = selectByOid(codeClassifyEntity.getOid());
      if(codeClassifyNew == null){
         return R.fail("未查询到相关数据!");
      }
      codeClassifyNew.setTs(codeClassifyEntity.getTs());
      return checkIsCanDeleteForDO(codeClassifyEntity);
   }
@@ -194,11 +203,11 @@
   private R checkIsCanDeleteForDO(CodeClassify codeClassifyEntity) {
      //检查ts
      Map<String,Object> condition = new HashMap<>(2);
      condition.put("oid",codeClassifyEntity.getOid());
      condition.put("ts",codeClassifyEntity.getTs());
      CodeClassify detail = codeClassifyMapper
         .selectOne(Condition.getQueryWrapper(condition,CodeClassify.class));
//      Map<String,Object> condition = new HashMap<>(2);
//      condition.put("oid",codeClassifyEntity.getOid());
//      condition.put("ts",codeClassifyEntity.getTs());
      CodeClassify detail = codeClassifyMapper.selectOne(Condition.getQueryWrapper(codeClassifyEntity));
//         .selectOne(Condition.getQueryWrapper(condition,CodeClassify.class));
      if(detail == null){//不是最新的不让改
         throw new ServiceException("当前数据不是最新,请刷新后再修改!");
//         return R.fail("当前数据不是最新,请刷新后再修改!");
@@ -245,7 +254,7 @@
      if(StringUtils.isBlank(oid)){
         throw new ServiceException("oid不能为空!");
      }
      return codeClassifyMapper.checkHasChild(oid.trim());
      return !codeClassifyMapper.checkHasChild(oid.trim());
   }
@@ -267,7 +276,7 @@
      //先简称是否有关联模板,有模板要先删除
      Map<String,Object> condition = new HashMap<>(2);
      condition.put("codeClassifyOid",codeClassify.getOid());
      List<CodeClstemplateEntity> codeClstemplateEntities = codeClstemplateMapper.selectByMap(condition);
      List<CodeClassifyTemplate> codeClstemplateEntities = codeClassifyTemplateMapper.selectByMap(condition);
//      VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(CodeClassifyTemplateDO.class);
//      queryWrapper.addQueryMap("codeClassifyOid",codeClassifyDTO.getOid());
//      List<CodeClassifyTemplateDO> codeClassifyTemplateDOListHaveTemplate =  codeClassifyTemplateMapper.selectByWrapper(queryWrapper);
@@ -291,7 +300,8 @@
               //2、查询要删除的子类数据
               List<CodeClassify>  codeClassifyDOList = codeClassifyMapper.selectBatchIds(s);
               deletes.addAll(codeClassifyDOList);
               codeClassifyMapper.deleteBatchIds(s);
//               codeClassifyMapper.deleteBatchIds(s);
               baseMapper.deleteBatchIds(s);
            }
         }
@@ -327,6 +337,9 @@
      //查询修改前ts
      CodeClassify codeClassify = codeClassifyMapper.selectById(oid);//主要是为了查询ts
      codeClassify.setLcStatus(lcStatus);
      codeClassify.setTs(new Date());
      codeClassify.setLastModifyTime(new Date());
      codeClassify.setLastModifier(AuthUtil.getUser().getUserName());
      //启用、停用
//      int u = codeClassifyMapper.updateLcStatus(oid,lcStatus);
      int count = codeClassifyMapper.updateById(codeClassify);
@@ -454,6 +467,44 @@
         }
      }
      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;
   }
@@ -667,19 +718,24 @@
         });
         throw new VciBaseException("路径有重复,{0}",new String[]{rowIndexList.stream().collect(Collectors.joining(","))});
      }
      //编号获取业务类型服务还未完成,所以等业务类型完成后进行后续的完成
//      Map<String, CodeRuleVO> ruleVOMap = Optional.ofNullable(codeRuleService.listCodeRuleByIds(
//         poList.stream().filter(s->StringUtils.isNotBlank(s.getCodeRuleId())).map(CodeClassifyPO::getCodeRuleId).collect(Collectors.toList()))
//      ).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t,(o1,o2)->o2));
      Map<String, CodeRuleVO> ruleVOMap = null;
      Map<String,CodeKeyAttrRepeatRuleVO> keyRuleVOMap =Optional.ofNullable(iCodeKeyattrrepeatService.listCodeKeyAttrRepeatRuleByOids(
         poList.stream().filter(s->StringUtils.isNotBlank(s.getKeyRepeatRuleId())).map(CodeClassifyPO::getKeyRepeatRuleId).collect(Collectors.toList()))
      //编号获取业务类型服务
      List<String> ruleOids = poList.stream().filter(
            s -> StringUtils.isNotBlank(s.getCodeRuleId()))
         .map(CodeClassifyPO::getCodeRuleId)
         .collect(Collectors.toList());
      Map<String, CodeRuleVO> ruleVOMap = Optional.ofNullable(ruleOids.size()==0 ? null:codeRuleService.listCodeRuleByOids(ruleOids)
      ).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t,(o1,o2)->o2));
//      codeOsbtmtypeMapper.selectList((Wrapper<CodeOsbtmtypeEntity>) poList);
//      Map<String, CodeOsbtmtypeVO> btmVOMap = Optional.ofNullable(
//         codeOsbtmtypeMapper.selectList((Wrapper<CodeOsbtmtypeEntity>) poList)
//      ).orElse(new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getId().toLowerCase(Locale.ROOT), t -> t,(o1,o2)->o2));
      Map<String, CodeOsbtmtypeVO> btmVOMap = null;
      List<String> keyOids = poList.stream().filter(s -> StringUtils.isNotBlank(s.getKeyRepeatRuleId()))
         .map(CodeClassifyPO::getKeyRepeatRuleId).collect(Collectors.toList());
      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()))
         .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/**路径**/,String/**主键**/> oidPathMap = new HashMap<>();
      //我们需要查询所有已经存在的分类,主要是路径,用来判断分类的数据
@@ -709,7 +765,7 @@
         classify.setDescription(po.getDescription());
         oidPathMap.put(po.getPath(),classify.getOid());
         if(StringUtils.isNotBlank(po.getBtmTypeId())){
            CodeOsbtmtypeVO typeVO = btmVOMap.get(po.getBtmTypeId().toLowerCase(Locale.ROOT));
            CodeOsbtmtypeVO typeVO = (CodeOsbtmtypeVO)btmVOMap.get(po.getBtmTypeId().toLowerCase(Locale.ROOT));
            classify.setBtmTypeId(typeVO.getId());
            classify.setBtmTypeName(typeVO.getName());
         }
@@ -801,7 +857,7 @@
               classifyDO.setTs(new Date());
               classifyDO.setBtmname("codeclassify");
               classifyDO.setLcStatus("Enabled");
               classifyDO.setId("0");
               classifyDO.setOwner(AuthUtil.getUser().getUserName());
               classifyDO.setCreator(AuthUtil.getUser().getUserName());
               classifyDO.setLastModifier(AuthUtil.getUser().getUserName());
               classifyDO.setLastModifyTime(new Date());
@@ -913,14 +969,14 @@
    */
   @Override
   public List<CodeClassify> selectAllLevelParentByOid(String oid){
//      String sql = "select oid,level from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY) + " start with oid= :oid connect by prior PARENTCODECLASSIFYOID = oid ";
//      Map< String,String> conditionMap = new HashMap< String,String>();
//      conditionMap.put("oid",oid);
      // String sql = "select oid,level from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY) + " start with oid= :oid connect by prior PARENTCODECLASSIFYOID = oid ";
      // Map< String,String> conditionMap = new HashMap< String,String>();
      // conditionMap.put("oid",oid);
      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());
         oidLevelMap.put(cbo.get("OID").toString(),cbo.get("LEVEL").toString());
      });
      if(CollectionUtils.isEmpty(oidLevelMap)){
         return new ArrayList<>();
@@ -934,6 +990,17 @@
         });
      }
      return classifyDOS;
   }
   /**
    * 主键获取主题库分类
    * @param oid 主键
    * @return 主题库分类显示对象
    * @throws VciBaseException 参数为空,数据不存在时会抛出异常
    */
   @Override
   public  CodeClassifyVO getObjectByOid(String oid) throws VciBaseException{
      return codeClassifyDO2VO(selectByOid(oid));
   }
   /**
@@ -952,7 +1019,6 @@
      return codeClassifyDO2VO(classifyDO);
   }
   /**
    * 主题库的树
    *
@@ -970,4 +1036,70 @@
      treeQueryObject.getConditionMap().put(PARENT_FIELD_NAME, "=null");
      return treeCodeClassify(treeQueryObject);
   }
   /**
    * 获取这个分类下的业务类型,当前没有就获取上级的第一个业务类型
    * @param oid 当前分类的oid
    * @return oid,id,name,btmtypeid,btmtypename,没有就返回null
    */
   @Override
   public CodeClassify selectBtmOrParentBtm(String oid){
      List<CodeClassify> oidList = selectAllLevelParents(oid);
      return oidList.size()==0?null:oidList.get(0);
   }
   /**
    * 获取所有层级上级关联业务类型数据
    * @param oid 当前分类的oid
    * @return oid,id,name,btmtypeid,btmtypename
    */
   @Override
   public List<CodeClassify> selectAllLevelParents(String oid){
//      String sql = "select oid,id,name,btmtypeid,btmtypename from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY) + " where btmtypeid is not null start with oid= :oid connect by prior PARENTCODECLASSIFYOID=oid ";
//      Map< String,String> conditionMap = new HashMap< String,String>();
//      conditionMap.put("oid",oid);
//      List<Map> dataList = boService.queryBySqlForMap(sql,conditionMap);
      List<Map<String, Object>> dataList = codeClassifyMapper.selectAllLevelParents(oid);
      List<CodeClassify> oidList = new ArrayList<CodeClassify>();
      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")));
            oidList.add(codeClassifyDO);
         }
      }
      return oidList;
   }
   /**
    * 使用分类主键获取分类相关的所有信息
    *
    * @param codeClassifyOid 分类的主键
    * @return 分类上级,下级的信息
    */
   @Override
   public CodeClassifyFullInfoBO getClassifyFullInfo(String codeClassifyOid) {
      VciBaseUtil.alertNotNull(codeClassifyOid,"分类的主键");
      CodeClassifyFullInfoBO fullInfo = new CodeClassifyFullInfoBO();
      CodeClassify classifyDO = selectByOid(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);
      }
      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;
   }
}