package org.springblade.code.dao.impl; import com.vci.mdm.constant.MdmBtmTypeConstant; import com.vci.mdm.dao.CodeClassifyDaoI; import com.vci.mdm.model.CodeClassifyDO; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.PageHelper; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.wrapper.VciQueryWrapperForDO; import com.vci.web.pageModel.BatchCBO; import com.vci.web.service.OsLifeCycleServiceI; import com.vci.web.service.WebBoServiceI; import com.vci.web.util.PlatformClientUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; import org.springframework.util.CollectionUtils; import plm.bs.bom.clientobject.ClientBusinessObject; import java.util.*; import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_OID_NOT_EXIST; /** * 主题库分类数据操作层实现类 * * @author weidy * @date 2022-01-20 */ @Repository public class CodeClassifyDaoImpl implements CodeClassifyDaoI{ /** * 业务类型操作的服务 */ @Autowired private WebBoServiceI boService; /** * 生命周期的服务 */ @Autowired private OsLifeCycleServiceI lifeCycleService; /** * 平台的客户端 */ @Autowired private PlatformClientUtil platformClientUtil; /** * 使用主键删除 * @param oid 数据主键 * @return 执行结果 */ @Override public BatchCBO deleteByPrimaryKey(String oid){ VciBaseUtil.alertNotNull(oid,"主键"); CodeClassifyDO codeClassifyDO = selectByPrimaryKey(oid); return boService.delete(codeClassifyDO); } /** * 添加数据 * @param record 主题库分类数据对象 * @return 执行结果 */ @Override public BatchCBO insert(CodeClassifyDO record){ VciBaseUtil.alertNotNull(record,"要添加的数据"); return boService.addSave(record); } /** * 批量添加数据 * @param records 主题库分类数据对象集合 * @return 执行结果数 */ @Override public BatchCBO batchInsert(List records){ VciBaseUtil.alertNotNull(records,"要添加的数据"); BatchCBO batchCBO = boService.batchAddSave(records); return batchCBO; } /** * 根据主键查询 * @param oid 数据主键 * @return 数据对象 */ @Override public CodeClassifyDO selectByPrimaryKey(String oid){ VciBaseUtil.alertNotNull(oid,"主键"); CodeClassifyDO record = boService.selectByOid(oid, CodeClassifyDO.class); if(record == null || StringUtils.isBlank(record.getOid())){ throw new VciBaseException(DATA_OID_NOT_EXIST); } return record; } /** * 根据主键批量获取对象 * @param oids 主键,包含单引号,但是不能超过1000 * @return 数据对象列表 */ @Override public List selectByPrimaryKeys(String oids){ VciBaseUtil.alertNotNull(oids,"主键集合"); return boService.selectByOidCollection(VciBaseUtil.str2List(oids), CodeClassifyDO.class); } /** * 根据主键批量查询对象 * @param oids 对象主键,使用逗号分隔,但是不能超过1000 * @return 业务对象 */ @Override public List selectByPrimaryKeyCollection(Collection oids){ VciBaseUtil.alertNotNull(oids,"主键集合"); return boService.selectByOidCollection(oids, CodeClassifyDO.class); } /** * 查询所有分类 * @return 查询结果 */ @Override public List selectAll(){ return boService.queryObject(CodeClassifyDO.class,null); } /** * 更新对象 * @param record 主题库分类数据对象 * @return 执行结果 */ @Override public BatchCBO updateByPrimaryKey(CodeClassifyDO record){ VciBaseUtil.alertNotNull(record,"要修改的对象",record.getOid(),"主键"); return boService.editSave(record); } /** * 批量更新 * @param records 主题库分类数据对象集合 * @return 执行结果行数 */ @Override public BatchCBO batchUpdate(List records){ VciBaseUtil.alertNotNull(records,"要修改的对象"); BatchCBO batchCBO = boService.batchEditSave(records); return batchCBO; } /** * 根据查询条件查询数据 * @param conditionMap 查询条件, * @param pageHelper 包括分页,排序 * @return 数据对象列表 */ @Override public List selectByCondition(Map< String,String> conditionMap, PageHelper pageHelper){ return boService.queryObject(CodeClassifyDO.class,conditionMap,pageHelper); } /** * 根据查询条件来查询总数 * @param conditionMap 查询条件 * @return 总数 */ @Override public Long countByCondition(Map< String,String> conditionMap){ return VciBaseUtil.getLong(String.valueOf(boService.queryCount(CodeClassifyDO.class,conditionMap))); } /** * 使用查询封装器来查询 * * @param queryWrapper 查询封装器 * @return 数据对象 */ @Override public List selectByWrapper(VciQueryWrapperForDO queryWrapper) { return boService.selectByQueryWrapper(queryWrapper,CodeClassifyDO.class); } /** * 使用查询封装器查询总数 * * @param queryWrapper 查询封装器 * @return 总数 */ @Override public Long countByWrapper(VciQueryWrapperForDO queryWrapper) { return VciBaseUtil.getLong(String.valueOf(boService.countByQueryWrapper(queryWrapper,CodeClassifyDO.class))); } /** * 根据主键获取名称 * @param oid 主键 * @return 中文名称 */ @Override public String selectNameByOid(String oid){ return selectByPrimaryKey(oid).getName(); } /** * 获取所有层级下级的主键 * @param oid 数据主键 * @return 查询结果,key是主键,value是本次查询的层级 */ @Override public Map selectAllLevelChildOid(String oid){ String sql = "select oid,level from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY) + " START WITH parentCodeClassifyOid = :oid CONNECT BY PRIOR OID = parentCodeClassifyOid"; Map< String,String> conditionMap = new HashMap< String,String>(); conditionMap.put("oid",oid); List dataList = boService.queryBySqlForMap(sql,conditionMap); Map oidLevelMap = new HashMap<>(); if(!CollectionUtils.isEmpty(dataList)){ for(Map data:dataList){ oidLevelMap.put(VciBaseUtil.getStringValueFromObject(data.get("oid")),VciBaseUtil.getStringValueFromObject(data.get("level"))); } } return oidLevelMap; } /** * 获取所有层级上级关联业务类型数据 * @param oid 当前分类的oid * @return oid,id,name,btmtypeid,btmtypename */ @Override public List 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 dataList = boService.queryBySqlForMap(sql,conditionMap); List oidList = new ArrayList(); if(!CollectionUtils.isEmpty(dataList)){ for(Map data:dataList){ CodeClassifyDO codeClassifyDO = new CodeClassifyDO(); 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 oid 主键 * @return 所有的上级 */ @Override public List 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); List cbos = boService.queryBySql(sql, conditionMap); Map oidLevelMap = new HashMap<>(); Optional.ofNullable(cbos).orElseGet(()->new ArrayList<>()).stream().forEach(cbo->{ oidLevelMap.put(cbo.getOid(),cbo.getAttributeValue("level")); }); if(CollectionUtils.isEmpty(oidLevelMap)){ return new ArrayList<>(); } //使用主键查询一下 List classifyDOS = selectByPrimaryKeyCollection(oidLevelMap.keySet()); if(!CollectionUtils.isEmpty(classifyDOS)){ classifyDOS.stream().forEach(classifyDO->{ classifyDO.setDataLevel(VciBaseUtil.getInt(oidLevelMap.getOrDefault(classifyDO.getOid(),"0"))); }); } return classifyDOS; } /** * 获取这个分类下的业务类型,当前没有就获取上级的第一个业务类型 * @param oid 当前分类的oid * @return oid,id,name,btmtypeid,btmtypename,没有就返回null */ @Override public CodeClassifyDO selectBtmOrParentBtm(String oid){ List oidList = selectAllLevelParents(oid); return oidList.size()==0?null:oidList.get(0); } /** * 获取所有下级数据 * @param oid 数据主键 * @return 查询结果 */ @Override public List selectAllLevelChild(String oid){ Map oidLevelMap = selectAllLevelChildOid(oid); if(CollectionUtils.isEmpty(oidLevelMap)){ return new ArrayList<>(); } List classifyDOS = boService.selectByOidCollection(oidLevelMap.keySet(), CodeClassifyDO.class); if(!CollectionUtils.isEmpty(classifyDOS)){ classifyDOS.stream().forEach(classifyDO->{ classifyDO.setDataLevel(VciBaseUtil.getInt(oidLevelMap.getOrDefault(classifyDO.getOid(),"0"))); }); } return classifyDOS; } /** * 查询所有的下级,并包含层级的路径 * @param oid 上级的主键 * @param fieldInPath 字段在路径中的内容 * @param enable 是否只查询启用的 * @return 分类的数据内容 */ @Override public List selectAllLevelChildHasPath(String oid, String fieldInPath, boolean enable){ VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(new HashMap<>(),CodeClassifyDO.class); if(StringUtils.isBlank(fieldInPath)){ fieldInPath = VciQueryWrapperForDO.ID_FIELD; } //coderuleoid.name as codeRuleOidName String selectField = queryWrapperForDO.getSelectFieldSql().replace(", path","").replace(", dataLevel","") + ",level as datalevel ,SYS_CONNECT_BY_PATH (" + queryWrapperForDO.getTableNick() + "." + fieldInPath + ", '#') as path "; String sql = selectField + " from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY) + " " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() + (enable?" where " + queryWrapperForDO.getTableNick() + ".lcstatus ='Enabled' " :"") + " START WITH " + queryWrapperForDO.getTableNick() + ".parentCodeClassifyOid " + (StringUtils.isBlank(oid)?" is null " : " = '" + oid + "' " ) + " CONNECT BY PRIOR " + queryWrapperForDO.getTableNick() + ".OID = " + queryWrapperForDO.getTableNick() + ".parentCodeClassifyOid"; List dataList =boService.queryByOnlySqlForObj(sql,CodeClassifyDO.class); return dataList; } /** * * @param classifyId * @param enable * @return */ @Override public List getIdPathToNamePathByParentId(String classifyId,boolean enable) { VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(new HashMap<>(), CodeClassifyDO.class); //coderuleoid.name as codeRuleOidName String selectField = queryWrapperForDO.getSelectFieldSql().replace(", path","").replace(", dataLevel","") +",level as datalevel ,SYS_CONNECT_BY_PATH (" + queryWrapperForDO.getTableNick() + ".name, '#') as namePath,SYS_CONNECT_BY_PATH (" + queryWrapperForDO.getTableNick() + ".id, '#') as idPath ,SYS_CONNECT_BY_PATH (" + queryWrapperForDO.getTableNick() + ".id, '#') as path "; String sql = selectField + " from " + VciBaseUtil.getTableName(MdmBtmTypeConstant.CODE_CLASSIFY) + " " + queryWrapperForDO.getTableNick() + queryWrapperForDO.getLinkTableSql() + (enable?" where " + queryWrapperForDO.getTableNick() + ".lcstatus ='Enabled' " :"") + " START WITH " + queryWrapperForDO.getTableNick() + ".parentCodeClassifyOid " + (StringUtils.isBlank(classifyId)?" is null " : " = '" + classifyId + "' " ) + " CONNECT BY PRIOR " + queryWrapperForDO.getTableNick() + ".OID = " + queryWrapperForDO.getTableNick() + ".parentCodeClassifyOid"; List dataList =boService.queryByOnlySqlForObj(sql,CodeClassifyDO.class); return dataList; } /** * 查询某个节点的所有层级下级的个数 * @param oid 主键 * @return 总数 */ @Override public long countAllLevelChildOid(String oid){ String sql = "select count(OID) as countsize from platformbtm_codeclassify START WITH parentCodeClassifyOid = :oid CONNECT BY PRIOR OID= parentCodeClassifyOid"; Map< String,String> conditionMap = new HashMap< String,String>(); conditionMap.put("oid",oid); List dataList = boService.queryBySqlForMap(sql,conditionMap); return !CollectionUtils.isEmpty(dataList)?VciBaseUtil.getInt(VciBaseUtil.getStringValueFromObject(dataList.get(0).get("countsize"))):0; } /** * 反向从子级获取父级的主题库分类 * * @param codeClassifyOid 分类的主键 * @return 分类的显示对象 */ @Override public List listParentClassify(String codeClassifyOid){ String sql = "select\n" + "*\n" + "from\n" + "PLATFORMBTM_CODECLASSIFY\n" + "where lcstatus='Enabled'" + "start with \n" + "oid='"+codeClassifyOid+"'\n" + "connect by \n" + "prior parentcodeclassifyoid=oid"; List dataList =boService.queryByOnlySqlForObj(sql,CodeClassifyDO.class); return dataList; } /** * 查询这个分类的root节点oid */ @Override public CodeClassifyDO getRootClassify(String codeClassifyOid){ List dataList = listParentClassify(codeClassifyOid); return dataList.size()>0?dataList.get(dataList.size()-1):null; } /** * 判断这个分类是否属于wupin分类树 * @param oid * @return */ @Override public boolean isWupin(String oid){ boolean u = false; String sql = " select count(1) iswupin from \n" + " (\n" + " select\n" + " oid\n" + " from\n" + " PLATFORMBTM_CODECLASSIFY\n" + " where lcstatus='Enabled'\n" + " start with\n" + " oid=\n" + " (\n" + " select oid from PLATFORMBTM_CODECLASSIFY where id='wupin'\n" + " )\n" + " connect by\n" + " parentcodeclassifyoid=prior oid\n" + " ) t\n" + " where oid = '"+oid+"'"; try { List dataList = boService.queryByOnlySqlForMap(sql); String iswupin = dataList.get(0).getOrDefault("ISWUPIN","0").toString(); int count = Integer.parseInt(iswupin); u=count>0?true:false; }catch (Exception e){ e.printStackTrace(); } return u; } /** * 批量修改生命周期的状态 * @param oids 主键集合,不能大于1000 * @param lcStatus 生命周期的值 * @return 执行的结果 */ @Override public long batchUpdateLcStatus(Collection oids, String lcStatus){ List cbos = boService.selectCBOByOidCollection(oids, "codeclassify"); if(CollectionUtils.isEmpty(cbos)){ return 0; } lifeCycleService.transCboStatus(cbos,lcStatus); return cbos.size(); } /** * 根据主键更新状态 * @param oid 主键 * @param lcStatus 生命周期状态 * @return 受影响的行数 */ @Override public int updateLcStatus( String oid, String lcStatus){ ClientBusinessObject cbo = boService.selectCBOByOid(oid, "codeclassify"); if(cbo == null || StringUtils.isBlank(cbo.getOid())){ return 0; } lifeCycleService.transStatus(cbo.getBusinessObject(),lcStatus); return 1; } /** * 批量删除对象 * @param oids 对象的主键集合 * @return 受影响的行数 */ @Override public BatchCBO batchDeleteByOids(Collection oids){ List dos = boService.selectByOidCollection(oids, CodeClassifyDO.class); BatchCBO batchCBO = boService.batchDelete(dos); return batchCBO; } /** * 校验是否包含子节点 * * @param oid 分类的主键 * @return true 表示包含 */ @Override public boolean checkHasChild(String oid) { if(StringUtils.isBlank(oid)){ return false; } Map conditionMap = new HashMap<>(); conditionMap.put("parentCodeClassifyOid",oid); return boService.queryCount(CodeClassifyDO.class,conditionMap) > 0; } /** * 使用字段的路径,查询对象 * * @param fieldPath 字段的路径,必须从顶层节点开始 xxx/yyy/zz的格式 * @param field 字段的英文名称 * @return 分类的对象 */ @Override public CodeClassifyDO selectByFieldPath(String fieldPath, String field) { if(StringUtils.isBlank(field)){ field = VciQueryWrapperForDO.ID_FIELD; } VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(new HashMap<>(),CodeClassifyDO.class); String sql = "select * from (select oid , SYS_CONNECT_BY_PATH(" + field + ",'/') as paths from " + queryWrapperForDO.getTableName() + " START WITH parentCodeClassifyOid is null CONNECT BY PRIOR OID= parentCodeClassifyOid ) a where a.paths = '/" + fieldPath + "' "; List dataList =boService.queryByOnlySqlForObj(sql,CodeClassifyDO.class); return (!CollectionUtils.isEmpty(dataList))?selectByPrimaryKey(dataList.get(0).getOid()):null; } }