/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package com.vci.ubcs.code.service.impl; import com.alibaba.nacos.common.utils.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.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.vci.ubcs.code.dto.CodeClassifyTemplateButtonDTO; import com.vci.ubcs.code.entity.*; import com.vci.ubcs.code.enumpack.CodeButtonUseEnum; import com.vci.ubcs.code.mapper.CodeClassifyTemplateButtonMapper; import com.vci.ubcs.code.service.ICodeButtonService; import com.vci.ubcs.code.service.ICodeClassifyTemplateButtonService; import com.vci.ubcs.code.vo.pagemodel.CodeButtonVO; import com.vci.ubcs.code.vo.pagemodel.CodeClassifyTemplateButtonVO; import com.vci.ubcs.code.wrapper.CodeTempbuttonWrapper; import com.vci.ubcs.starter.exception.VciBaseException; import com.vci.ubcs.starter.revision.service.RevisionModelUtil; import com.vci.ubcs.starter.util.DefaultAttrAssimtUtil; import com.vci.ubcs.starter.util.MdmBtmTypeConstant; import com.vci.ubcs.starter.util.UBCSCondition; import com.vci.ubcs.starter.web.pagemodel.PageHelper; import com.vci.ubcs.starter.web.util.BeanUtil; import com.vci.ubcs.starter.web.util.BeanUtilForVCI; 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.tool.api.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cglib.beans.BeanMap; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; import static com.vci.ubcs.code.constant.FrameWorkLangCodeConstant.*; /** * 编码库定义-模板按钮扩展 服务实现类 * * @author yuxc * @since 2023-04-20 */ @Service public class CodeClassifyTemplateButtonServiceImpl extends ServiceImpl implements ICodeClassifyTemplateButtonService { /** * 数据操作层 */ @Autowired private CodeClassifyTemplateButtonMapper codeClassifyTemplateButtonMapper; /** * 按钮的服务 */ @Autowired private ICodeButtonService buttonService; /** * 对象的操作 */ @Autowired private RevisionModelUtil revisionModelUtil; /** * 查询所有的主题库里模板包含的按钮 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 执行结果 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public IPage gridCodeClassifyTemplateButton(Map conditionMap, PageHelper pageHelper) throws VciBaseException { Query query = new Query(); if (pageHelper == null) { query.setSize(-1); }else { query.setSize(pageHelper.getLimit()); query.setCurrent(pageHelper.getPage()); } query.setDescs("createTime"); if(StringUtils.isBlank(conditionMap.getOrDefault("classifyTemplateOid",null))){ return new Page<>(); } IPage doList = codeClassifyTemplateButtonMapper.selectPage(Condition.getPage(query),getMPJLambdaWrapper(conditionMap)); IPage voList = new Page<>(); if (!CollectionUtils.isEmpty(doList.getRecords())) { voList = CodeTempbuttonWrapper.build().pageVO(doList); } return voList; } /** * 批量数据对象转换为显示对象 * @param codeClassifyTemplateButtonDOs 数据对象列表 * @return 显示对象 * @throws VciBaseException 参数为空或者不存在的时候会抛出异常 */ @Override public List codeClassifyTemplateButtonDO2VOs(Collection codeClassifyTemplateButtonDOs) throws VciBaseException{ return codeClassifyTemplateButtonDO2VOs(codeClassifyTemplateButtonDOs,false); } /** * 批量数据对象转换为显示对象 * @param codeClassifyTemplateButtonDOs 数据对象列表 * @param hasButtonVO 是否包含按钮的信息 * @return 显示对象 * @throws VciBaseException 参数为空或者不存在的时候会抛出异常 */ @Override public List codeClassifyTemplateButtonDO2VOs(Collection codeClassifyTemplateButtonDOs, boolean hasButtonVO) throws VciBaseException{ List voList = new ArrayList(); if(!CollectionUtils.isEmpty(codeClassifyTemplateButtonDOs)){ for(CodeClassifyTemplateButton s: codeClassifyTemplateButtonDOs){ CodeClassifyTemplateButtonVO vo = codeClassifyTemplateButtonDO2VO(s); if(vo != null){ voList.add(vo); } } } if(hasButtonVO && !CollectionUtils.isEmpty(voList)){ //获取按钮的显示对象 List buttonVOList = new ArrayList<>(); VciBaseUtil.switchCollectionForOracleIn(voList.stream().map(CodeClassifyTemplateButtonVO::getClassifyButtonOid).collect(Collectors.toList())).stream().forEach(buttonOids->{ buttonVOList.addAll(buttonService.listCodeButtonByOids(buttonOids)); }); Map buttonVOMap = Optional.ofNullable(buttonVOList).orElseGet(() -> new ArrayList<>()).stream().collect(Collectors.toMap(s -> s.getOid(), t -> t)); voList.stream().forEach(vo->{ vo.setButtonVO(buttonVOMap.getOrDefault(vo.getClassifyButtonOid(),null)); }); } return voList; } /** * 数据对象转换为显示对象 * @param codeClassifyTemplateButtonDO 数据对象 * @return 显示对象 * @throws VciBaseException 拷贝属性出错的时候会抛出异常 */ @Override public CodeClassifyTemplateButtonVO codeClassifyTemplateButtonDO2VO(CodeClassifyTemplateButton codeClassifyTemplateButtonDO) throws VciBaseException{ CodeClassifyTemplateButtonVO vo = new CodeClassifyTemplateButtonVO(); if(codeClassifyTemplateButtonDO != null){ BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateButtonDO,vo); //如果有lcstatus的类的话 vo.setButtonUseText(CodeButtonUseEnum.getTextByValue(codeClassifyTemplateButtonDO.getButtonUse())); } return vo; } @Override public IPage selectCodeTempbuttonPage(IPage page, CodeClassifyTemplateButtonVO CodeTempbutton) { return page.setRecords(baseMapper.selectCodeTempbuttonPage(page, CodeTempbutton)); } /** * 增加主题库里模板包含的按钮 * @param codeClassifyTemplateButtonDTO 主题库里模板包含的按钮数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override @Transactional(rollbackFor = Exception.class) public CodeClassifyTemplateButtonVO addSave(CodeClassifyTemplateButtonDTO codeClassifyTemplateButtonDTO) throws VciBaseException{ VciBaseUtil.alertNotNull(codeClassifyTemplateButtonDTO,"需要添加的数据对象",codeClassifyTemplateButtonDTO.getClassifyTemplateOid(),"模板的主键"); //将DTO转换为DO CodeClassifyTemplateButton codeClassifyTemplateButtonDO = new CodeClassifyTemplateButton(); BeanUtilForVCI.copyPropertiesIgnoreCase(codeClassifyTemplateButtonDTO,codeClassifyTemplateButtonDO); DefaultAttrAssimtUtil.addDefaultAttrAssimt(codeClassifyTemplateButtonDO, MdmBtmTypeConstant.CODE_TEMPLATE_BUTTON,null); if(codeClassifyTemplateButtonDO.getOrderNum()== null){ //查询全部 Long count = codeClassifyTemplateButtonMapper.selectCount(Wrappers.query() .lambda().eq(CodeClassifyTemplateButton::getClassifyTemplateOid,codeClassifyTemplateButtonDTO.getClassifyTemplateOid()) ); if(count == null){ count = 0L; } codeClassifyTemplateButtonDO.setOrderNum(Long.valueOf(count + 1L).intValue()); } boolean resInsertClsTempButton = codeClassifyTemplateButtonMapper.insert(codeClassifyTemplateButtonDO) > 0; return resInsertClsTempButton ? codeClassifyTemplateButtonDO2VO(codeClassifyTemplateButtonDO):null; } /** * 修改主题库里模板包含的按钮 * @param codeClassifyTemplateButtonDTO 主题库里模板包含的按钮数据传输对象 * @return 执行结果 * @throws VciBaseException 参数为空,唯一项,必输项不通过时会抛出异常 */ @Override @Transactional(rollbackFor = Exception.class) public CodeClassifyTemplateButtonVO editSave(CodeClassifyTemplateButtonDTO codeClassifyTemplateButtonDTO) throws VciBaseException{ VciBaseUtil.alertNotNull(codeClassifyTemplateButtonDTO,"数据对象",codeClassifyTemplateButtonDTO.getOid(),"主题库里模板包含的按钮主键"); //将DTO转换为DO CodeClassifyTemplateButton codeClassifyTemplateButtonDO = selectByOid(codeClassifyTemplateButtonDTO.getOid()); revisionModelUtil.copyFromDTOIgnore(codeClassifyTemplateButtonDTO,codeClassifyTemplateButtonDO); DefaultAttrAssimtUtil.updateDefaultAttrAssimt(codeClassifyTemplateButtonDO,null); boolean resUpdateClsTempButton = codeClassifyTemplateButtonMapper.updateById(codeClassifyTemplateButtonDO) > 0; return resUpdateClsTempButton ? codeClassifyTemplateButtonDO2VO(codeClassifyTemplateButtonDO):null; } /** * 删除主题库里模板包含的按钮 * @param codeClassifyTemplateButtonDTO 主题库里模板包含的按钮数据传输对象,oid和ts需要传输 * @return 删除结果反馈::success:成功,fail:失败 * @throws VciBaseException 参数为空,被引用时抛出异常 */ @Override @Transactional(rollbackFor = Exception.class) public R deleteCodeClassifyTemplateButton(CodeClassifyTemplateButtonDTO codeClassifyTemplateButtonDTO) throws VciBaseException{ VciBaseUtil.alertNotNull(codeClassifyTemplateButtonDTO,"主题库里模板包含的按钮数据对象",codeClassifyTemplateButtonDTO.getOid(),"主题库里模板包含的按钮的主键"); CodeClassifyTemplateButton codeClassifyTemplateButtonDO = selectByOid(codeClassifyTemplateButtonDTO.getOid()); R baseResult = checkIsCanDeleteForDO(codeClassifyTemplateButtonDTO,codeClassifyTemplateButtonDO); if(baseResult.isSuccess()) { }else{ return baseResult; } //执行删除操作 boolean b = codeClassifyTemplateButtonMapper.deleteById(codeClassifyTemplateButtonDO.getOid()) > 0; return R.status(b); } /** * 校验是否可以删除,如果存在下级,并且下级有数据引用则不能删除 * @param codeClassifyTemplateButtonDTO 数据传输对象 * @param codeClassifyTemplateButtonDO 数据库中的数据对象 * @return success为true为可以删除,false表示有数据引用,obj为true表示有下级 */ private R checkIsCanDeleteForDO(CodeClassifyTemplateButtonDTO codeClassifyTemplateButtonDTO, CodeClassifyTemplateButton codeClassifyTemplateButtonDO) { CodeClassifyTemplateButton tsDO = new CodeClassifyTemplateButton(); BeanUtil.convert(codeClassifyTemplateButtonDTO,tsDO); if (!checkTs(tsDO,codeClassifyTemplateButtonDO)) { return R.fail(TS_NOT_PROCESS); } if(!checkIsLinked(codeClassifyTemplateButtonDO.getOid())) { return R.success("success"); }else{ return R.fail(DATA_LINKED_NOT_DELETE); } } /** * 检查ts * @param tempDO * @param codeClassifyTemplateButtonDO * @return */ private boolean checkTs(CodeClassifyTemplateButton tempDO,CodeClassifyTemplateButton codeClassifyTemplateButtonDO){ Date dbTs = codeClassifyTemplateButtonDO.getTs(); Date currentTs = tempDO.getTs(); if(currentTs == null ? dbTs == null:currentTs.compareTo(dbTs)==0){ return true; } return false; } /** * 获取连表查询条件对象 * @param conditionMap * @return */ private MPJLambdaWrapper getMPJLambdaWrapper(Map conditionMap){ CodeClassifyTemplateButton codeClassifyTemplateButton = new CodeClassifyTemplateButton(); BeanMap beanMap = BeanMap.create(codeClassifyTemplateButton); beanMap.putAll(conditionMap); MPJLambdaWrapper mpjLambdaWrapper = UBCSCondition.getMPJLambdaWrapper(codeClassifyTemplateButton) .selectAll(CodeClassifyTemplateButton.class) .selectAs(CodeButton::getName, CodeClassifyTemplateButton::getClassifyButtonOidName) .selectAs(CodeButton::getId, CodeClassifyTemplateButton::getClassifyButtonId) .leftJoin(CodeButton.class, CodeButton::getOid, CodeClassifyTemplateButton::getClassifyButtonOid); return mpjLambdaWrapper; } /** * 主键获取主题库里模板包含的按钮 * @param oid 主键 * @return 主题库里模板包含的按钮显示对象 * @throws VciBaseException 参数为空,数据不存在时会抛出异常 */ @Override public CodeClassifyTemplateButtonVO getObjectByOid(String oid) throws VciBaseException{ return codeClassifyTemplateButtonDO2VO(selectByOid(oid)); } /** * 主键批量获取主题库里模板包含的按钮 * @param oidCollections 主键集合,但是受性能影响,建议一次查询不超过10000个 * @return 主题库里模板包含的按钮显示对象 * @throws VciBaseException 查询出现异常时会抛出 */ @Override public Collection listCodeClassifyTemplateButtonByOids(Collection oidCollections) throws VciBaseException{ VciBaseUtil.alertNotNull(oidCollections,"数据对象主键集合"); List codeClassifyTemplateButtonDOList = listCodeClassifyTemplateButtonDOByOidCollections(oidCollections); return codeClassifyTemplateButtonDO2VOs(codeClassifyTemplateButtonDOList); } /** * 参照主题库里模板包含的按钮列表 * @param conditionMap 查询条件 * @param pageHelper 分页和排序 * @return 主题库里模板包含的按钮显示对象列表,生效的内容 * @throws VciBaseException 查询条件和分页出错的时候会抛出异常 */ @Override public IPage refDataGridCodeClassifyTemplateButton(Map conditionMap, PageHelper pageHelper) throws VciBaseException{ if(conditionMap == null){ conditionMap = new HashMap(); } return gridCodeClassifyTemplateButton(conditionMap, pageHelper); } /** * 使用主键集合查询数据对象 * @param oidCollections 主键的集合 * @return 数据对象列表 */ private List listCodeClassifyTemplateButtonDOByOidCollections(Collection oidCollections){ List codeClassifyTemplateButtonDOList = new ArrayList(); if(!CollectionUtils.isEmpty(oidCollections)){ Collection> oidCollectionsList = VciBaseUtil.switchCollectionForOracleIn(oidCollections); for(Collection oids: oidCollectionsList){ List tempDOList = codeClassifyTemplateButtonMapper.selectBatchIds(oids); if(!CollectionUtils.isEmpty(tempDOList)){ codeClassifyTemplateButtonDOList.addAll(tempDOList); } } } return codeClassifyTemplateButtonDOList; } /** * 校验是否被引用 * @param oid 主键 * @throws VciBaseException 被引用的时候会抛出异常 */ private boolean checkIsLinked(String oid) throws VciBaseException{ //TODO 添加需要校验引用的地方 return false; } /** * 主键查询数据对象 * @param oid 主键 * @return 数据对象 * @throws VciBaseException 参数为空,并且数据不存在的时候会抛出异常 */ private CodeClassifyTemplateButton selectByOid(String oid) throws VciBaseException{ VciBaseUtil.alertNotNull(oid,"主键"); HashMap conditionMap = new HashMap<>(); conditionMap.put("oid",oid); MPJLambdaWrapper mpjLambdaWrapper = getMPJLambdaWrapper(conditionMap); CodeClassifyTemplateButton codeClassifyTemplateButtonDO = codeClassifyTemplateButtonMapper.selectOne(mpjLambdaWrapper); if(codeClassifyTemplateButtonDO == null || StringUtils.isBlank(codeClassifyTemplateButtonDO.getOid())){ throw new VciBaseException(DATA_OID_NOT_EXIST); } return codeClassifyTemplateButtonDO; } /** * 模板删除的时候触发 * * @param classifyTemplateOid 模板的主键 * @return 受影响的数据行 */ @Override public int codeTemplateDeleteTrigger(String classifyTemplateOid) { int updateCount = 0; if(StringUtils.isNotBlank(classifyTemplateOid)){ Map conditionMap = new HashMap<>(); conditionMap.put("classifyTemplateOid",classifyTemplateOid); List codeTempbuttonEntities = baseMapper.selectByMap(conditionMap); if(!CollectionUtils.isEmpty(codeTempbuttonEntities)){ updateCount += baseMapper.deleteBatchIds(codeTempbuttonEntities.stream() .map(CodeClassifyTemplateButton::getOid).collect(Collectors.toList())); } } return updateCount; } /** * 使用模板主键获取扩展的按钮 * * @param templateOid 模板的主键 * @param hasButtonVO 是否包含按钮的显示信息 * @return 按钮的相关的信息 */ @Override public List listButtonByTemplateOid(String templateOid, boolean hasButtonVO) { if(StringUtils.isBlank(templateOid)){ return new ArrayList<>(); } // Map conditionMap = new HashMap<>(); // conditionMap.put("classifyTemplateOid",templateOid); // PageHelper pageHelper = new PageHelper(-1); // pageHelper.addDefaultAsc("orderNum"); QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq("classifyTemplateOid",templateOid); wrapper.orderByAsc("orderNum"); List templateButtonDOS = codeClassifyTemplateButtonMapper.selectList(wrapper); return codeClassifyTemplateButtonDO2VOs(templateButtonDOS,hasButtonVO); } }