package com.vci.web.dao.impl; import com.vci.dto.VciFileDocClassifyDTO; import com.vci.dto.VciFileDocClassifyDTOList; import com.vci.model.VciFileDocClassifyDO; import com.vci.pagemodel.VciFileDocClassifyVO; import com.vci.starter.revision.service.RevisionModelUtil; import com.vci.starter.web.annotation.bus.VciChangeDocument; import com.vci.starter.web.enumpck.VciChangeDocumentTypeEnum; import com.vci.starter.web.exception.VciBaseException; import com.vci.starter.web.pagemodel.BaseResult; import com.vci.starter.web.pagemodel.DataGrid; import com.vci.starter.web.pagemodel.KeyValue; import com.vci.starter.web.pagemodel.PageHelper; import com.vci.starter.web.util.BeanUtilForVCI; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.wrapper.VciQueryWrapperForDO; import com.vci.web.dao.VciFileDocClassifyDaoI; import com.vci.web.service.VciFileDocClassifyServiceI; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; import static com.vci.constant.FrameWorkLangCodeConstant.*; /** * 文档的类型服务 * * @author weidy * @date 2020-08-04 */ @Service @VciChangeDocument(btmType = "fileDocClassify") public class VciFileDocClassifyServiceImpl implements VciFileDocClassifyServiceI { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 数据操作层 */ @Resource private VciFileDocClassifyDaoI vciFileDocClassifyMapper; /** * 版本和数据对象工具类 */ @Autowired private RevisionModelUtil revisionModelUtil; /** * 查询所有的文档的类型 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 执行结果 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public DataGrid gridVciFileDocClassify(Map conditionMap, PageHelper pageHelper) throws VciBaseException { if (pageHelper == null) { pageHelper = new PageHelper(-1); } VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,VciFileDocClassifyDO.class,pageHelper); List doList = vciFileDocClassifyMapper.selectByWrapper(queryWrapper); DataGrid dataGrid=new DataGrid<>(); if (!CollectionUtils.isEmpty(doList)) { dataGrid.setData(vciFileDocClassifyDO2VOs(doList)); queryWrapper.clearPage(); dataGrid.setTotal(vciFileDocClassifyMapper.countByWrapper(queryWrapper)); } return dataGrid; } /** * 批量数据对象转换为显示对象 * @param vciFileDocClassifyDOs 数据对象列表 * @return 显示对象 * @throws VciBaseException 参数为空或者不存在的时候会抛出异常 */ @Override public List vciFileDocClassifyDO2VOs(Collection vciFileDocClassifyDOs) throws VciBaseException { List voList = new ArrayList<>(); if(!CollectionUtils.isEmpty(vciFileDocClassifyDOs)){ vciFileDocClassifyDOs.stream().forEach(s ->{ VciFileDocClassifyVO vo = vciFileDocClassifyDO2VO(s); if(vo != null){ voList.add(vo); } }); } return voList; } /** * 数据对象转换为显示对象 * @param vciFileDocClassifyDO 数据对象 * @return 显示对象 * @throws VciBaseException 拷贝属性出错的时候会抛出异常 */ @Override public VciFileDocClassifyVO vciFileDocClassifyDO2VO(VciFileDocClassifyDO vciFileDocClassifyDO) throws VciBaseException { VciFileDocClassifyVO vo = new VciFileDocClassifyVO(); if(vciFileDocClassifyDO != null){ BeanUtilForVCI.convert(vciFileDocClassifyDO,vo); //还需要处理枚举等其他的内容 } return vo; } /** * 增加文档的类型 * @param vciFileDocClassifyDTO 文档的类型数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.ADD) public VciFileDocClassifyVO addSave(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException { VciBaseUtil.alertNotNull(vciFileDocClassifyDTO,"需要添加的数据对象"); //将DTO转换为DO VciFileDocClassifyDO vciFileDocClassifyDO = new VciFileDocClassifyDO(); BeanUtilForVCI.convert(vciFileDocClassifyDTO,vciFileDocClassifyDO); revisionModelUtil.wrapperForAdd(vciFileDocClassifyDO); int insert = vciFileDocClassifyMapper.insert(vciFileDocClassifyDO); if(insert>0){ return vciFileDocClassifyDO2VO(vciFileDocClassifyDO); }else{ throw new VciBaseException(ADD_FAIL); } } /** * 修改文档的类型 * @param vciFileDocClassifyDTO 文档的类型数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.EDIT) public VciFileDocClassifyVO editSave(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException { VciBaseUtil.alertNotNull(vciFileDocClassifyDTO,"数据对象",vciFileDocClassifyDTO.getOid(),"文档的类型主键"); //将DTO转换为DO VciFileDocClassifyDO vciFileDocClassifyDO = selectByOid(vciFileDocClassifyDTO.getOid()); revisionModelUtil.copyFromDTO(vciFileDocClassifyDTO,vciFileDocClassifyDO); revisionModelUtil.wrapperForEdit(vciFileDocClassifyDO); int update = vciFileDocClassifyMapper.updateByPrimaryKey(vciFileDocClassifyDO); if(update>0){ return vciFileDocClassifyDO2VO(vciFileDocClassifyDO); }else{ throw new VciBaseException(EDIT_FAIL); } } /** * 校验是否可以删除,如果存在下级,并且下级有数据引用则不能删除 * @param vciFileDocClassifyDTO 数据传输对象 * @param vciFileDocClassifyDO 数据库中的数据对象 * @return success为true为可以删除,false表示有数据引用,obj为true表示有下级 */ private BaseResult checkIsCanDeleteForDO(VciFileDocClassifyDTO vciFileDocClassifyDTO, VciFileDocClassifyDO vciFileDocClassifyDO) { revisionModelUtil.checkTs(vciFileDocClassifyDTO.getTs(),vciFileDocClassifyDO.getTs()); if(!checkIsLinked(vciFileDocClassifyDO.getOid())) { return BaseResult.success(); }else{ return BaseResult.fail(DATA_LINKED_NOT_DELETE,new String[]{""}); } } /** * 校验是否被引用 * @param oid 主键 * @throws VciBaseException 被引用的时候会抛出异常 */ private boolean checkIsLinked(String oid) throws VciBaseException { //TODO 添加需要校验引用的地方 return false; } /** * 删除文档的类型 * @param vciFileDocClassifyDTO 文档的类型数据传输对象,oid和ts需要传输 * @return 删除结果反馈::success:成功,fail:失败 * @throws VciBaseException 参数为空,被引用时抛出异常 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.DELETE) public BaseResult deleteVciFileDocClassify(VciFileDocClassifyDTO vciFileDocClassifyDTO) throws VciBaseException { VciBaseUtil.alertNotNull(vciFileDocClassifyDTO,"文档的类型数据对象",vciFileDocClassifyDTO.getOid(),"文档的类型的主键"); VciFileDocClassifyDO vciFileDocClassifyDO = selectByOid(vciFileDocClassifyDTO.getOid()); BaseResult baseResult = checkIsCanDeleteForDO(vciFileDocClassifyDTO,vciFileDocClassifyDO); if(baseResult.isSuccess()) { }else{ return baseResult; } //执行删除操作 return (vciFileDocClassifyMapper.deleteByPrimaryKey(vciFileDocClassifyDO.getOid()) > 0)? BaseResult.successMsg(DELETE_SUCCESS): BaseResult.fail(DELETE_FAIL); } /** * 主键获取文档的类型 * @param oid 主键 * @return 文档的类型显示对象 * @throws VciBaseException 参数为空,数据不存在时会抛出异常 */ @Override public VciFileDocClassifyVO getObjectByOid(String oid) throws VciBaseException { return vciFileDocClassifyDO2VO(selectByOid(oid)); } /** * 主键查询数据对象 * @param oid 主键 * @return 数据对象 * @throws VciBaseException 参数为空,并且数据不存在的时候会抛出异常 */ private VciFileDocClassifyDO selectByOid(String oid) throws VciBaseException { VciBaseUtil.alertNotNull(oid,"主键"); VciFileDocClassifyDO vciFileDocClassifyDO = vciFileDocClassifyMapper.selectByPrimaryKey(oid.trim()); if(vciFileDocClassifyDO == null || StringUtils.isBlank(vciFileDocClassifyDO.getOid())){ throw new VciBaseException(DATA_OID_NOT_EXIST); } return vciFileDocClassifyDO; } /** * 主键批量获取文档的类型 * @param oidCollections 主键集合,但是受性能影响,建议一次查询不超过10000个 * @return 文档的类型显示对象 * @throws VciBaseException 查询出现异常时会抛出 */ @Override public Collection listVciFileDocClassifyByOids(Collection oidCollections) throws VciBaseException { VciBaseUtil.alertCollectionNotNull("数据对象主键集合",oidCollections); List vciFileDocClassifyDOList = listVciFileDocClassifyDOByOidCollections(oidCollections); return vciFileDocClassifyDO2VOs(vciFileDocClassifyDOList); } /** * 使用主键集合查询数据对象 * @param oidCollections 主键的集合 * @return 数据对象列表 */ private List listVciFileDocClassifyDOByOidCollections(Collection oidCollections){ List vciFileDocClassifyDOList = new ArrayList<>(); if(!CollectionUtils.isEmpty(oidCollections)){ Collection> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections); oidCollectionsList.stream().forEach(oids ->{ List tempDOList = vciFileDocClassifyMapper.selectByPrimaryKeyCollection(oids); if(!CollectionUtils.isEmpty(tempDOList)){ vciFileDocClassifyDOList.addAll(tempDOList); } }); } return vciFileDocClassifyDOList; } /** * 参照文档的类型列表 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 文档的类型显示对象列表,生效的内容 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public DataGrid refDataGridVciFileDocClassify(Map conditionMap, PageHelper pageHelper) throws VciBaseException { if(conditionMap == null){ conditionMap = new HashMap<>(); } return gridVciFileDocClassify(conditionMap,pageHelper); } /** * 校验编号是否存在 * * @param idCollections 编号的集合 * @return success为true表示存在,否则在data中获取不存在的内容 */ @Override public BaseResult checkClassifyIdsExist(Collection idCollections) { VciBaseUtil.alertCollectionNotNull("文档类型编号",idCollections); Collection> idCollectionss = VciBaseUtil.switchCollectionForOracleIn(idCollections); Set existIdsSet = new HashSet<>(); idCollectionss.stream().forEach(ids-> { List fileDocClassifyDOS = vciFileDocClassifyMapper.selectByIdCollection(ids); if(!CollectionUtils.isEmpty(fileDocClassifyDOS)){ existIdsSet.addAll(fileDocClassifyDOS.stream().map(VciFileDocClassifyDO::getId).collect(Collectors.toSet())); } }); if(existIdsSet.size() ==0){ BaseResult baseResult = BaseResult.fail(DATA_ID_NOT_EXIST); baseResult.setData(idCollections); return baseResult; } Set unExistIdSet = new HashSet<>(); idCollections.stream().forEach(id ->{ if(!existIdsSet.contains(id)){ unExistIdSet.add(id); } }); if(!CollectionUtils.isEmpty(unExistIdSet)){ BaseResult baseResult = BaseResult.fail(DATA_ID_NOT_EXIST); baseResult.setData(unExistIdSet); return baseResult; } return BaseResult.success(); } /** * 批量添加分类 * * @param fileDocClassifyDTOList 分类的数据传输对象 * @return success为true表示执行成功 */ @Override public BaseResult batchAddSave(VciFileDocClassifyDTOList fileDocClassifyDTOList) { VciBaseUtil.alertNotNull(fileDocClassifyDTOList,"文件类型的数据传输对象"); List doList = new ArrayList<>(); List dtoList = fileDocClassifyDTOList.getDocClassifyDTOList(); VciBaseUtil.alertCollectionNotNull("文件类型的数据传输对象",dtoList); //循环处理 dtoList.stream().forEach(dto->{ VciFileDocClassifyDO classifyDO = new VciFileDocClassifyDO(); BeanUtilForVCI.convert(dto,classifyDO); VciBaseUtil.alertNotNull(classifyDO.getId(),"文件类型编号",classifyDO.getName(),"文件类型名称"); doList.add(classifyDO); }); revisionModelUtil.wrapperForBatchAdd(doList); doList.stream().forEach(classifyDO->{ vciFileDocClassifyMapper.insert(classifyDO); }); return BaseResult.success(ADD_SUCCESS); } /** * 使用编号查询对象 * @param id 编号 * @return 文档类型对象 * @throws VciBaseException 参数为空和不存在的时候会抛出异常 */ private VciFileDocClassifyDO selectById(String id) throws VciBaseException { VciBaseUtil.alertNotNull(id,"文档类型编号"); VciFileDocClassifyDO classifyDO = vciFileDocClassifyMapper.selectById(id.trim()); if(classifyDO == null || StringUtils.isBlank(classifyDO.getOid())){ throw new VciBaseException(DATA_ID_NOT_EXIST,new String[]{id}); } return classifyDO; } /** * 使用编号获取对象 * * @param id 编号 * @return 显示对象 * @throws VciBaseException 参数为空或者执行出错的时候会抛出异常 */ @Override public VciFileDocClassifyVO getObjectById(String id) throws VciBaseException { return vciFileDocClassifyDO2VO(selectById(id)); } /** * 使用编号批量获取类型对象 * * @param idCollection 编号集合 * @return 显示对象 * @throws VciBaseException 参数为空或者执行出错的时候会抛出异常 */ @Override public List listVciFileDocClassifyByIds(Collection idCollection) throws VciBaseException { List classifyDOList = new ArrayList<>(); VciBaseUtil.alertCollectionNotNull("编号集合",idCollection); Collection> idCollections = VciBaseUtil.switchCollectionForOracleIn(idCollection); idCollections.stream().forEach(ids->{ List classifyDOs = vciFileDocClassifyMapper.selectByIdCollection(ids); if(!CollectionUtils.isEmpty(classifyDOs)){ classifyDOList.addAll(classifyDOs); } }); return vciFileDocClassifyDO2VOs(classifyDOList); } /** * 文件类型的下拉菜单 * * @return 下拉菜单的值 */ @Override public List comboFileDocClassify() { VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(new HashMap<>(),VciFileDocClassifyDO.class); queryWrapper.neq("creator","sysAdmin"); List doList = vciFileDocClassifyMapper.selectByWrapper(queryWrapper); List keyValues = new ArrayList<>(); if(!CollectionUtils.isEmpty(doList)){ doList.stream().forEach(doc->{ KeyValue keyValue = new KeyValue(); keyValue.setKey(doc.getId()); keyValue.setValue(doc.getName()); keyValues.add(keyValue); }); } return keyValues; } }