package com.vci.ubcs.code.dao.impl;
|
|
|
import com.vci.ubcs.code.constant.MdmBtmTypeConstant;
|
import com.vci.ubcs.code.dao.CodeClassifyDaoI;
|
import com.vci.ubcs.code.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.context.annotation.Lazy;
|
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
|
@Lazy
|
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<CodeClassifyDO> 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<CodeClassifyDO> selectByPrimaryKeys(String oids){
|
VciBaseUtil.alertNotNull(oids,"主键集合");
|
return boService.selectByOidCollection(VciBaseUtil.str2List(oids), CodeClassifyDO.class);
|
}
|
|
/**
|
* 根据主键批量查询对象
|
* @param oids 对象主键,使用逗号分隔,但是不能超过1000
|
* @return 业务对象
|
*/
|
@Override
|
public List<CodeClassifyDO> selectByPrimaryKeyCollection(Collection<String> oids){
|
VciBaseUtil.alertNotNull(oids,"主键集合");
|
return boService.selectByOidCollection(oids, CodeClassifyDO.class);
|
}
|
|
/**
|
* 查询所有分类
|
* @return 查询结果
|
*/
|
@Override
|
public List<CodeClassifyDO> 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<CodeClassifyDO> records){
|
VciBaseUtil.alertNotNull(records,"要修改的对象");
|
BatchCBO batchCBO = boService.batchEditSave(records);
|
return batchCBO;
|
}
|
|
/**
|
* 根据查询条件查询数据
|
* @param conditionMap 查询条件,
|
* @param pageHelper 包括分页,排序
|
* @return 数据对象列表
|
*/
|
@Override
|
public List<CodeClassifyDO> 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<CodeClassifyDO> 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<String,String> 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<Map> dataList = boService.queryBySqlForMap(sql,conditionMap);
|
Map<String,String> 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<CodeClassifyDO> 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<CodeClassifyDO> oidList = new ArrayList<CodeClassifyDO>();
|
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<CodeClassifyDO> 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<ClientBusinessObject> cbos = boService.queryBySql(sql, conditionMap);
|
Map<String,String> 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<CodeClassifyDO> 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<CodeClassifyDO> oidList = selectAllLevelParents(oid);
|
return oidList.size()==0?null:oidList.get(0);
|
}
|
|
/**
|
* 获取所有下级数据
|
* @param oid 数据主键
|
* @return 查询结果
|
*/
|
@Override
|
public List<CodeClassifyDO> selectAllLevelChild(String oid){
|
Map<String, String> oidLevelMap = selectAllLevelChildOid(oid);
|
if(CollectionUtils.isEmpty(oidLevelMap)){
|
return new ArrayList<>();
|
}
|
List<CodeClassifyDO> 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<CodeClassifyDO> 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<CodeClassifyDO> dataList =boService.queryByOnlySqlForObj(sql,CodeClassifyDO.class);
|
return dataList;
|
}
|
|
/**
|
*
|
* @param classifyId
|
* @param enable
|
* @return
|
*/
|
@Override
|
public List<CodeClassifyDO> 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<CodeClassifyDO> 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<Map> 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<CodeClassifyDO> 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<CodeClassifyDO> dataList =boService.queryByOnlySqlForObj(sql,CodeClassifyDO.class);
|
return dataList;
|
}
|
|
/**
|
* 查询这个分类的root节点oid
|
*/
|
@Override
|
public CodeClassifyDO getRootClassify(String codeClassifyOid){
|
List<CodeClassifyDO> 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<Map> 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<String> oids, String lcStatus){
|
List<ClientBusinessObject> 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<String> oids){
|
List<CodeClassifyDO> 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<String ,String > 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<CodeClassifyDO> dataList =boService.queryByOnlySqlForObj(sql,CodeClassifyDO.class);
|
return (!CollectionUtils.isEmpty(dataList))?selectByPrimaryKey(dataList.get(0).getOid()):null;
|
}
|
|
|
}
|