package com.vci.web.service.impl; import com.vci.client.common.providers.ServiceProvider; import com.vci.corba.common.PLException; import com.vci.corba.framework.data.PvolumeInfo; import com.vci.file.dto.VciFileVolumeDTO; import com.vci.file.enumpck.VciFileServiceOsTypeEnum; import com.vci.file.enumpck.VciFileTransProtocolEnum; import com.vci.file.pagemodel.VciFileVolumeVO; import com.vci.frameworkcore.constant.FrameWorkLangCodeConstant; 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.PageHelper; import com.vci.starter.web.util.BeanUtil; import com.vci.starter.web.util.VciBaseUtil; import com.vci.starter.web.wrapper.VciQueryWrapperForDO; import com.vci.web.dao.VciFileVolumeDaoI; import com.vci.web.model.VciFileVolumeDO; import com.vci.web.service.VciFileVolumeServiceI; import com.vci.web.util.PlatformClientUtil; 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 static com.vci.frameworkcore.constant.FrameWorkDefaultValueConstant.FRAMEWORK_DATA_ENABLED; import static com.vci.frameworkcore.constant.FrameWorkLangCodeConstant.*; /** * 文仓管理服务 * * @author weidy * @date 2020-08-04 */ @Service @VciChangeDocument(btmType = "fileVolume") public class VciFileVolumeServiceImpl implements VciFileVolumeServiceI { /** * 日志 */ private Logger logger = LoggerFactory.getLogger(getClass()); /** * 数据操作层 */ @Resource private VciFileVolumeDaoI vciFileVolumeMapper; /** * 平台调用的 */ @Autowired private PlatformClientUtil platformClientUtil; /** * 查询所有的文仓管理 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 执行结果 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public DataGrid gridVciFileVolume(Map conditionMap, PageHelper pageHelper) throws VciBaseException { if (pageHelper == null) { pageHelper = new PageHelper(-1); } VciQueryWrapperForDO queryWrapper = new VciQueryWrapperForDO(conditionMap,VciFileVolumeDO.class,pageHelper); List doList = vciFileVolumeMapper.selectByWrapper(queryWrapper); DataGrid dataGrid=new DataGrid<>(); if (!CollectionUtils.isEmpty(doList)) { dataGrid.setData(vciFileVolumeDO2VOs(doList)); queryWrapper.clearPage(); dataGrid.setTotal(vciFileVolumeMapper.countByWrapper(queryWrapper)); } return dataGrid; } /** * 批量数据对象转换为显示对象 * @param vciFileVolumeDOs 数据对象列表 * @return 显示对象 * @throws VciBaseException 参数为空或者不存在的时候会抛出异常 */ @Override public List vciFileVolumeDO2VOs(Collection vciFileVolumeDOs) throws VciBaseException { List voList = new ArrayList<>(); if(!CollectionUtils.isEmpty(vciFileVolumeDOs)){ vciFileVolumeDOs.stream().forEach(s ->{ VciFileVolumeVO vo = vciFileVolumeDO2VO(s); if(vo != null){ voList.add(vo); } }); } return voList; } /** * 数据对象转换为显示对象 * @param vciFileVolumeDO 数据对象 * @return 显示对象 * @throws VciBaseException 拷贝属性出错的时候会抛出异常 */ @Override public VciFileVolumeVO vciFileVolumeDO2VO(VciFileVolumeDO vciFileVolumeDO) throws VciBaseException { VciFileVolumeVO vo = new VciFileVolumeVO(); if(vciFileVolumeDO != null){ BeanUtil.convert(vciFileVolumeDO,vo); //还需要处理枚举等其他的内容 vo.setServiceOsTypeText(VciFileServiceOsTypeEnum.getTextByValue(vo.getServiceOsType())); vo.setTransProtocolText(VciFileTransProtocolEnum.getTextByValue(vo.getTransProtocol())); } return vo; } /** * 增加文仓管理 * @param vciFileVolumeDTO 文仓管理数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.ADD) public VciFileVolumeVO addSave(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException { VciBaseUtil.alertNotNull(vciFileVolumeDTO,"需要添加的数据对象"); //将DTO转换为DO VciFileVolumeDO vciFileVolumeDO = new VciFileVolumeDO(); BeanUtil.convert(vciFileVolumeDTO,vciFileVolumeDO); vciFileVolumeDO.setCurrentVolume("0"); int insert = vciFileVolumeMapper.insert(vciFileVolumeDO); if(insert>0){ return vciFileVolumeDO2VO(vciFileVolumeDO); }else{ throw new VciBaseException(FrameWorkLangCodeConstant.ADD_FAIL); } } /** * 修改文仓管理 * @param vciFileVolumeDTO 文仓管理数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.EDIT) public VciFileVolumeVO editSave(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException { VciBaseUtil.alertNotNull(vciFileVolumeDTO,"数据对象",vciFileVolumeDTO.getOid(),"文仓管理主键"); //将DTO转换为DO VciFileVolumeDO vciFileVolumeDO = selectByOid(vciFileVolumeDTO.getOid()); BeanUtil.convert(vciFileVolumeDTO,vciFileVolumeDO); int update = vciFileVolumeMapper.updateByPrimaryKey(vciFileVolumeDO); if(update>0){ return vciFileVolumeDO2VO(vciFileVolumeDO); }else{ throw new VciBaseException(EDIT_FAIL); } } /** * 校验是否可以删除,如果存在下级,并且下级有数据引用则不能删除 * @param vciFileVolumeDTO 数据传输对象 * @param vciFileVolumeDO 数据库中的数据对象 * @return success为true为可以删除,false表示有数据引用,obj为true表示有下级 */ private BaseResult checkIsCanDeleteForDO(VciFileVolumeDTO vciFileVolumeDTO, VciFileVolumeDO vciFileVolumeDO) { if(!checkIsLinked(vciFileVolumeDO.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 vciFileVolumeDTO 文仓管理数据传输对象,oid和ts需要传输 * @return 删除结果反馈::success:成功,fail:失败 * @throws VciBaseException 参数为空,被引用时抛出异常 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.DELETE) public BaseResult deleteVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException { VciBaseUtil.alertNotNull(vciFileVolumeDTO,"文仓管理数据对象",vciFileVolumeDTO.getOid(),"文仓管理的主键"); VciFileVolumeDO vciFileVolumeDO = selectByOid(vciFileVolumeDTO.getOid()); BaseResult baseResult = checkIsCanDeleteForDO(vciFileVolumeDTO,vciFileVolumeDO); if(baseResult.isSuccess()) { }else{ return baseResult; } //执行删除操作 return (vciFileVolumeMapper.deleteByPrimaryKey(vciFileVolumeDO.getOid()) > 0)? BaseResult.successMsg(DELETE_SUCCESS): BaseResult.fail(DELETE_FAIL); } /** * 主键获取文仓管理 * @param oid 主键 * @return 文仓管理显示对象 * @throws VciBaseException 参数为空,数据不存在时会抛出异常 */ @Override public VciFileVolumeVO getObjectByOid(String oid) throws VciBaseException { return vciFileVolumeDO2VO(selectByOid(oid)); } /** * 编号获取文仓管理 * * @param id 编号 * @return 文仓管理显示对象 * @throws VciBaseException 参数为空,数据不存在时会抛出异常 */ @Override public VciFileVolumeVO getObjectById(String id) throws VciBaseException { return vciFileVolumeDO2VO(selectById(id)); } /** * 编号查询数据对象 * @param id 编号 * @return 数据对象 * @throws VciBaseException 参数为空,并且数据不存在的时候会抛出异常 */ private VciFileVolumeDO selectById(String id) throws VciBaseException { VciBaseUtil.alertNotNull(id,"主键"); VciQueryWrapperForDO queryWrapperForDO = new VciQueryWrapperForDO(null,VciFileVolumeDO.class); queryWrapperForDO.eq("plname",id); List vciFileVolumeDOs = vciFileVolumeMapper.selectByWrapper(queryWrapperForDO); if(CollectionUtils.isEmpty(vciFileVolumeDOs)){ throw new VciBaseException(DATA_ID_NOT_EXIST); } return vciFileVolumeDOs.get(0); } /** * 主键查询数据对象 * @param oid 主键 * @return 数据对象 * @throws VciBaseException 参数为空,并且数据不存在的时候会抛出异常 */ private VciFileVolumeDO selectByOid(String oid) throws VciBaseException { VciBaseUtil.alertNotNull(oid,"主键"); VciFileVolumeDO vciFileVolumeDO = vciFileVolumeMapper.selectByPrimaryKey(oid.trim()); if(vciFileVolumeDO == null || StringUtils.isBlank(vciFileVolumeDO.getOid())){ throw new VciBaseException(DATA_OID_NOT_EXIST); } return vciFileVolumeDO; } /** * 主键批量获取文仓管理 * @param oidCollections 主键集合,但是受性能影响,建议一次查询不超过10000个 * @return 文仓管理显示对象 * @throws VciBaseException 查询出现异常时会抛出 */ @Override public Collection listVciFileVolumeByOids(Collection oidCollections) throws VciBaseException { VciBaseUtil.alertCollectionNotNull("数据对象主键集合",oidCollections); List vciFileVolumeDOList = listVciFileVolumeDOByOidCollections(oidCollections); return vciFileVolumeDO2VOs(vciFileVolumeDOList); } /** * 使用主键集合查询数据对象 * @param oidCollections 主键的集合 * @return 数据对象列表 */ private List listVciFileVolumeDOByOidCollections(Collection oidCollections){ List vciFileVolumeDOList = new ArrayList<>(); if(!CollectionUtils.isEmpty(oidCollections)){ Collection> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections); oidCollectionsList.stream().forEach(oids ->{ List tempDOList = vciFileVolumeMapper.selectByPrimaryKeyCollection(oids); if(!CollectionUtils.isEmpty(tempDOList)){ vciFileVolumeDOList.addAll(tempDOList); } }); } return vciFileVolumeDOList; } /** * 启用文仓管理 * @param vciFileVolumeDTO 文仓管理数据传输对象,oid和ts需要传输 * @return 启用结果反馈::success:成功,fail:失败 * @throws VciBaseException 执行出现异常时会抛出 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.LCSTATUS) public BaseResult enableVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException { return changeLcStatus(vciFileVolumeDTO,false); } /** * 停用{comments} * @param vciFileVolumeDTO 文仓管理数据传输对象,oid和ts需要传输 * @return 停用结果反馈::success:成功,fail:失败 * @throws VciBaseException 执行出现异常时会抛出 */ @Override @VciChangeDocument(changeType = VciChangeDocumentTypeEnum.LCSTATUS) public BaseResult disableVciFileVolume(VciFileVolumeDTO vciFileVolumeDTO) throws VciBaseException { return changeLcStatus(vciFileVolumeDTO,true); } /** * 修改生命周期的状态,如停用和启用 * @param vciFileVolumeDTO 文仓管理数据传输对象,必须要有oid和ts * @param disable 是否为停用 * @return 执行的结果 */ private BaseResult changeLcStatus(VciFileVolumeDTO vciFileVolumeDTO, boolean disable){ VciBaseUtil.alertNotNull(vciFileVolumeDTO,"数据对象",vciFileVolumeDTO.getOid(),"主键"); VciFileVolumeDO vciFileVolumeDO = selectByOid(vciFileVolumeDTO.getOid()); //老的项目的状态值不一样 return BaseResult.success(); } /** * 参照文仓管理列表 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 文仓管理显示对象列表,生效的内容 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public DataGrid refDataGridVciFileVolume(Map conditionMap, PageHelper pageHelper) throws VciBaseException { if(conditionMap == null){ conditionMap = new HashMap<>(); } conditionMap.put("lcStatus", FRAMEWORK_DATA_ENABLED); return gridVciFileVolume(conditionMap,pageHelper); } /** * 查询全部 * * @return 文仓 * @throws VciBaseException 查询会抛出异常 */ @Override public List selectAll() throws VciBaseException { return vciFileVolumeMapper.selectAll(); } /** * 更新卷的使用容量 * * @param oid 主键 * @param usedVolume 使用容量 * @return 受影响的行数 */ @Override public synchronized int updateUsedVolume(String oid, long usedVolume) { VciBaseUtil.alertNotNull(oid,"主键"); return vciFileVolumeMapper.updateUsedVolume(oid,String.valueOf(usedVolume)); } /** * 获取上传的默认卷 * @return 卷对象 */ @Override public VciFileVolumeDO getUploadVolume(){ try { PvolumeInfo volumeInfo = ServiceProvider.getFrameService().getDefaultVolume(); VciFileVolumeDO fileVolumeDO = new VciFileVolumeDO(); fileVolumeDO.setOid(volumeInfo.id); fileVolumeDO.setId(volumeInfo.name); fileVolumeDO.setName(volumeInfo.service); fileVolumeDO.setServiceUrl(volumeInfo.host); fileVolumeDO.setVolumePath(volumeInfo.path); fileVolumeDO.setServiceOsType(volumeInfo.type+""); return fileVolumeDO; } catch (PLException e) { throw new RuntimeException(e); } } }