package com.vci.ubcs.omd.service.impl; import com.alibaba.cloud.commons.lang.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vci.ubcs.omd.constant.BtmTypeConstant; import com.vci.ubcs.omd.entity.LifeCycleRule; import com.vci.ubcs.omd.entity.Status; import com.vci.ubcs.omd.mapper.StatusMapper; import com.vci.ubcs.omd.service.IStatusService; import com.vci.ubcs.omd.vo.StatusVO; import com.vci.ubcs.omd.wrapper.StatusWrapper; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.web.util.BeanUtil; import com.vci.ubcs.starter.web.util.VciBaseUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.Func; import org.springframework.cglib.beans.BeanMap; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.regex.Pattern; import java.util.stream.Collectors; /** * Description: 状态池的实现类 * * @author LiHang * @date 2023/5/23 */ @Service public class StatusServiceImpl extends ServiceImpl implements IStatusService { private final String REGEXP = "^[A-Za-z]+$"; /** * 获取状态列表 * * @param conditionMap 查询条件 * @param pageHelper 分页信息和排序信息,默认使用id排序 * @return 状态对象列表 * @throws VciBaseException 查询出错时会抛出异常 */ @Override public IPage listStatus(Map conditionMap, Query pageHelper) throws VciBaseException { return StatusWrapper.build().pageVO(baseMapper.selectPage(Condition.getPage(pageHelper), Condition.getQueryWrapper(conditionMap,Status.class).lambda().orderByAsc(Status::getId))); } /** * 获取状态列表 * * @param conditionMap 查询条件 * @return 状态对象列表 * @throws VciBaseException 查询出错时会抛出异常 */ @Override public List listStatusNoPage(Map conditionMap) throws VciBaseException { Status queryVO = new Status(); BeanMap.create(queryVO).putAll(conditionMap); return StatusWrapper.build().listEntityVO(baseMapper.selectList(Condition.getQueryWrapper(queryVO).lambda().orderByAsc(Status::getId))); } /** * 根据主键获取状态 * * @param pkStatus 状态主键 * @return 状态,如果不存在会返回null * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public StatusVO getStatusByOid(String pkStatus) throws VciBaseException { List statusVOList = listStatusByOids(pkStatus); if (!CollectionUtils.isEmpty(statusVOList)){ return statusVOList.get(0); } return null; } /** * 根据主键批量获取状态 * * @param primaryKeys 状态主键,用逗号分隔 * @return 状态列表,如果有不存在的不会返回,全部不存在的则返回空列表 * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public List listStatusByOids(String primaryKeys) throws VciBaseException { VciBaseUtil.alertNotNull(primaryKeys,"状态的主键"); List pkList = Func.toStrList(",", primaryKeys); return listStatusByOidCollection(pkList); } /** * 批量根据主键获取状态 * * @param pkStatusCollection 状态主键集合 * @return 状态列表,如果有不存在的不会返回,全部不存在的则返回空列表 * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public List listStatusByOidCollection(Collection pkStatusCollection) throws VciBaseException { if(!CollectionUtils.isEmpty(pkStatusCollection)){ List statusDOList = listStatusByOidCollectionDO(pkStatusCollection); if(!CollectionUtils.isEmpty(statusDOList)) { return StatusWrapper.build().listEntityVO(statusDOList); } } return null; } /** * 根据主键集合获取数据对象 * @param oidCollection 主键集合 * @return 查询出来的数据对象 * @throws VciBaseException mybatis执行出错时会抛出异常 */ private List listStatusByOidCollectionDO(Collection oidCollection) throws VciBaseException{ if(!CollectionUtils.isEmpty(oidCollection)){ List statusDOList = new ArrayList<>(); Collection> pksCollections = VciBaseUtil.switchCollectionForOracleIn(oidCollection); if(!CollectionUtils.isEmpty(pksCollections)) { pksCollections.forEach(s -> { List queryResult = baseMapper.selectList(Wrappers.query().lambda().in(Status::getOid,s)); if(!CollectionUtils.isEmpty(queryResult)){ statusDOList.addAll(queryResult); } }); } return statusDOList; } return null; } /** * 根据英文名称获取状态 * * @param id 英文名称 * @return 状态,如果不存在会返回null * @throws VciBaseException 查询出错抛出异常 */ @Override public StatusVO getStatusById(String id) throws VciBaseException { List statusVOList = listStatusByIds(id); if(!CollectionUtils.isEmpty(statusVOList)){ return statusVOList.get(0); } return null; } /** * 根据英文名称批量获取状态 * * @param ids 英文名称,使用逗号分隔 * @return 状态列表,如果有不存在的不会返回,全部不存在的则返回空列表 * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public List listStatusByIds(String ids) throws VciBaseException { VciBaseUtil.alertNotNull(ids,"状态的英文名称"); List idList = Func.toStrList(",", ids); return listStatusByIdCollection(idList); } /** * 根据英文名称集合批量获取状态 * * @param idCollection 英文名称集合 * @return 状态列表,如果有不存在的不会返回,全部不存在的则返回空列表 * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public List listStatusByIdCollection(Collection idCollection) throws VciBaseException { if(!CollectionUtils.isEmpty(idCollection)){ List statusDOList = listStatusByIdCollectionDO(idCollection); if(!CollectionUtils.isEmpty(statusDOList)) { return StatusWrapper.build().listEntityVO(statusDOList); } } return null; } /** * 根据英文名称集合获取数据对象 * @param idCollection 英文名称集合 * @return 数据对象列表,如果有不存在的不会返回,全部不存在的则返回空列表 * @throws VciBaseException mybatis查询出错的时候会抛出异常 */ private List listStatusByIdCollectionDO(Collection idCollection) throws VciBaseException { if(CollectionUtils.isEmpty(idCollection)) { return null; } List statusDOList = new ArrayList<>(); Collection> idCollections = VciBaseUtil.switchCollectionForOracleIn(idCollection); if(!CollectionUtils.isEmpty(idCollections)) { idCollections.forEach(s -> { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.in("id",s); List queryResult = baseMapper.selectList(wrapper); if(!CollectionUtils.isEmpty(queryResult)){ statusDOList.addAll(queryResult); } }); } return statusDOList; } /** * 根据状态主键获取中文名称 * * @param oid 状态主键,多个使用逗号分隔 * @return 中文名称,如果不存在会返回null * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public String getNameByOid(String oid) throws VciBaseException { VciBaseUtil.alertNotNull(oid,"状态对象主键"); return Optional.ofNullable(getStatusByOid(oid)).orElseGet(StatusVO::new).getName(); } /** * 根据状态英文名称获取中文名称 * * @param id 状态英文名称 * @return 中文名称,如果不存在会返回null * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public String getNameById(String id) throws VciBaseException { VciBaseUtil.alertNotNull(id,"状态对象主键"); return Optional.ofNullable(getStatusById(id)).orElseGet(StatusVO::new).getName(); } /** * 添加状态 * * @param statusVO 状态显示对象(和DTO共用) * @return 添加后的状态 * @throws VciBaseException 添加出错的时候会抛出异常 */ @Override public StatusVO addSave(StatusVO statusVO) throws VciBaseException { VciBaseUtil.alertNotNull(statusVO,"要添加的状态",statusVO.getId(),"状态英文名称",statusVO.getName(),"状态中文名称"); List statusVOS = new ArrayList<>(); statusVOS.add(statusVO); List statusVOList = batchAddSave(statusVOS); if(CollectionUtils.isEmpty(statusVOList)){ return null; } return statusVOList.get(0); } /** * 批量添加状态 * * @param statusVOList 状态显示对象列表(和DTO共用) * @return 批量添加后的状态 * @throws VciBaseException 添加出错的时候会抛出异常 */ @Override public List batchAddSave(List statusVOList) throws VciBaseException { if(CollectionUtils.isEmpty(statusVOList)){ throw new VciBaseException("要添加的状态对象不能为空"); } //1. 判断各个属性是否必输项都输入了 //2. 判断英文名称是否重复 Set idSet = new HashSet<>(); String creator = AuthUtil.getUserAccount(); Date now = new Date(); Pattern pattern = Pattern.compile(REGEXP); statusVOList.forEach(s -> { if (!pattern.matcher(s.getId()).matches()){ throw new VciBaseException("英文名称{0}只能是英文字母",new Object[]{s.getId()}); } VciBaseUtil.alertNotNull(s.getId(),"状态英文名称",s.getName(),"状态中文名称"); if(idSet.contains(s.getId().toLowerCase().trim())){ throw new VciBaseException("英文名称为{0}的状态已经存在(不区分大小写)",new Object[]{s.getId()}); }else{ idSet.add(s.getId().toLowerCase().trim()); } if(StringUtils.isBlank(s.getOid())){ s.setOid(VciBaseUtil.getPk()); } s.setBtmName(BtmTypeConstant.STATUS); s.setOwner(creator); s.setCreator(creator); s.setCreateTime(now); s.setLastModifier(creator); s.setLastModifyTime(now); s.setTs(now); }); //判断是否存在 List checkExistStatusDOList = listStatusByIdCollectionDO(idSet); if(!CollectionUtils.isEmpty(checkExistStatusDOList)){ String existIds = checkExistStatusDOList.stream().map(Status::getId).collect(Collectors.joining(",")); throw new VciBaseException("英文名称为{0}的状态的已经在系统中存在(不区分大小写),不能添加",new Object[]{existIds}); } List statusDOList = StatusWrapper.build().batchCopyVO2DO(statusVOList); VciBaseUtil.switchCollectionForOracleIn(statusDOList,1000).forEach(this::saveBatch); return statusVOList; } /** * 修改状态 * * @param statusVO 状态显示对象(和DTO共用) * @return 修改后的状态 * @throws VciBaseException 修改出错的时候会抛出异常 */ @Override public StatusVO editSave(StatusVO statusVO) throws VciBaseException { VciBaseUtil.alertNotNull(statusVO,"要修改的状态对象",statusVO.getOid(),"要修改的状态对象的主键"); List needEditVOList = new ArrayList<>(); needEditVOList.add(statusVO); List statusVOList = batchEditSave(needEditVOList); if(!CollectionUtils.isEmpty(statusVOList)){ return statusVOList.get(0); } return null; } /** * 批量修改状态 * * @param statusVOList 状态显示对象列表(和DTO共用) * @return 批量修改后的状态 * @throws VciBaseException 修改出错的时候会抛出异常 */ @Override public List batchEditSave(List statusVOList) throws VciBaseException { if(CollectionUtils.isEmpty(statusVOList)){ throw new VciBaseException("要修改的状态对象不能为空"); } //1. 判断各个属性是否必输项都输入了 //2. 判断状态的英文名称是否重复 Set idSet = new HashSet<>(); Map oidObjectMap = new HashMap<>(); String creator = AuthUtil.getUserAccount(); Date now = new Date(); statusVOList.forEach(s -> { //判断为空 VciBaseUtil.alertNotNull(s.getOid(),"状态主键",s.getId(),"状态英文名称",s.getName(),"状态中文名称"); //判断本次是否存在 if(idSet.contains(s.getId().toLowerCase().trim())){ throw new VciBaseException("英文名称为{0}的状态已经存在(不区分大小写)",new Object[]{s.getId()}); }else{ idSet.add(s.getId().toLowerCase().trim()); } oidObjectMap.put(s.getOid(),s); s.setLastModifier(creator); s.setLastModifyTime(now); s.setTs(now); }); //判断是否存在 List statusDOList = listStatusByOidCollectionDO(oidObjectMap.keySet()); if(CollectionUtils.isEmpty(statusDOList)){ throw new VciBaseException("这些状态在系统中均不存在",new Object[]{}); } //判断属性名称是否修改 Set oidInDbSet = new HashSet<>(); statusDOList.forEach(s -> { StatusVO statusVO = oidObjectMap.get(s.getOid()); if(!statusVO.getId().equalsIgnoreCase(s.getId())){ throw new VciBaseException("状态[{0}]的英文名称不允许修改,原名称{1},新名称{2}",new Object[]{s.getName(),s.getId(),statusVO.getId()}); } BeanUtil.convert(statusVO,s); oidInDbSet.add(s.getOid()); }); oidObjectMap.forEach( (k,v) ->{ if(!oidInDbSet.contains(k)){ throw new VciBaseException("状态{0}[{1}]在系统中不存在",new Object[]{v.getId(),v.getName()}); } }); //看看是否有不在系统中存在的 VciBaseUtil.switchCollectionForOracleIn(statusDOList).forEach(this::saveOrUpdateBatch); return statusVOList; } /** * 删除状态 * * @param statusVO 状态显示对象 * @throws VciBaseException 如果状态被引用,或者删除出错时会抛出异常 */ @Override public void delete(StatusVO statusVO) throws VciBaseException { VciBaseUtil.alertNotNull(statusVO,"要删除的状态对象",statusVO.getOid(),"要删除的状态对象的主键"); List needDeleteVOList = new ArrayList<>(); needDeleteVOList.add(statusVO); batchDelete(needDeleteVOList); } /** * 批量删除状态 * * @param statusVOList 要删除的状态显示对象列表 * @throws VciBaseException 如果状态被引用,或者删除出错时会抛出异常 */ @Override public void batchDelete(List statusVOList) throws VciBaseException { if(CollectionUtils.isEmpty(statusVOList)){ throw new VciBaseException("要删除的状态对象不能为空"); } Set oidSet= new HashSet<>(); statusVOList.stream().forEach( s -> { VciBaseUtil.alertNotNull(s.getOid(),"要删除的状态对象的主键"); oidSet.add(s.getOid()); }); //查询 List statusDOList = listStatusByOidCollectionDO(oidSet); if(CollectionUtils.isEmpty(statusDOList)){ throw new VciBaseException("要删除的状态在系统中不存在,可能您需要刷新后再试"); } Set oidInDbSet = statusDOList.stream().map(Status::getOid).collect(Collectors.toSet()); oidSet.forEach( s -> { if(!oidInDbSet.contains(s)){ throw new VciBaseException("要删除的状态在系统中不存在,可能您需要刷新后再试"); } }); //检查属性是否被引用 if(checkStatusUseds(oidSet)){ throw new VciBaseException("要删除的状态在生命周期对象中被使用,无法删除"); } Collection> oidCollections = VciBaseUtil.switchCollectionForOracleIn(oidInDbSet); for(Collection oidCollection : oidCollections){ baseMapper.delete(Wrappers.query().lambda().in(Status::getOid,oidCollection)); } } /** * 批量校验状态是否被使用 * * @param oidCollection 主键集合 * @return true表示被引用 */ @Override public boolean checkStatusUseds(Collection oidCollection) { return false; } /** * 校验状态是否被引用 * * @param pkStatus 状态的主键 * @return true表示被引用, false表示没有被引用 * @throws VciBaseException 参数为空或者查询出错时会抛出错误 */ @Override public boolean checkStatusUsed(String pkStatus) throws VciBaseException { return false; } }