package cn.iocoder.yudao.module.bpm.service.definition; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerImportExcelVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerImportReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerImportRespVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerPageReqVO; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.listener.BpmProcessListenerSaveReqVO; import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessListenerDO; import cn.iocoder.yudao.module.bpm.dal.mysql.definition.BpmProcessListenerMapper; import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerTypeEnum; import cn.iocoder.yudao.module.bpm.enums.definition.BpmProcessListenerValueTypeEnum; import jakarta.annotation.Resource; import org.flowable.engine.delegate.JavaDelegate; import org.flowable.engine.delegate.TaskListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*; /** * BPM 流程监听器 Service 实现类 * * @author 超级管理员 */ @Service @Validated public class BpmProcessListenerServiceImpl implements BpmProcessListenerService { @Resource private BpmProcessListenerMapper processListenerMapper; @Override public Long createProcessListener(BpmProcessListenerSaveReqVO createReqVO) { // 校验 validateCreateProcessListenerValue(createReqVO); // 插入 BpmProcessListenerDO processListener = BeanUtils.toBean(createReqVO, BpmProcessListenerDO.class); processListenerMapper.insert(processListener); return processListener.getId(); } @Override public void updateProcessListener(BpmProcessListenerSaveReqVO updateReqVO) { // 校验存在 validateProcessListenerExists(updateReqVO.getId()); validateCreateProcessListenerValue(updateReqVO); // 更新 BpmProcessListenerDO updateObj = BeanUtils.toBean(updateReqVO, BpmProcessListenerDO.class); processListenerMapper.updateById(updateObj); } private void validateCreateProcessListenerValue(BpmProcessListenerSaveReqVO createReqVO) { // class 类型 if (createReqVO.getValueType().equals(BpmProcessListenerValueTypeEnum.CLASS.getType())) { try { Class clazz = Class.forName(createReqVO.getValue()); if (createReqVO.getType().equals(BpmProcessListenerTypeEnum.EXECUTION.getType()) && !JavaDelegate.class.isAssignableFrom(clazz)) { throw exception(PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR, createReqVO.getValue(), JavaDelegate.class.getName()); } else if (createReqVO.getType().equals(BpmProcessListenerTypeEnum.TASK.getType()) && !TaskListener.class.isAssignableFrom(clazz)) { throw exception(PROCESS_LISTENER_CLASS_IMPLEMENTS_ERROR, createReqVO.getValue(), TaskListener.class.getName()); } } catch (ClassNotFoundException e) { throw exception(PROCESS_LISTENER_CLASS_NOT_FOUND, createReqVO.getValue()); } return; } // 表达式 if (!StrUtil.startWith(createReqVO.getValue(), "${") || !StrUtil.endWith(createReqVO.getValue(), "}")) { throw exception(PROCESS_LISTENER_EXPRESSION_INVALID, createReqVO.getValue()); } } @Override public void deleteProcessListener(Long id) { // 校验存在 validateProcessListenerExists(id); // 删除 processListenerMapper.deleteById(id); } private void validateProcessListenerExists(Long id) { if (processListenerMapper.selectById(id) == null) { throw exception(PROCESS_LISTENER_NOT_EXISTS); } } @Override public BpmProcessListenerDO getProcessListener(Long id) { return processListenerMapper.selectById(id); } @Override public PageResult getProcessListenerPage(BpmProcessListenerPageReqVO pageReqVO) { return processListenerMapper.selectPage(pageReqVO); } @Override @Transactional(rollbackFor = Exception.class) public BpmProcessListenerImportRespVO importListenerList(List importListeners, BpmProcessListenerImportReqVO importReqVO) { // 1. 校验非空 importListeners = filterList(importListeners, item -> StrUtil.isNotBlank(item.getName())); if (CollUtil.isEmpty(importListeners)) { throw exception(PROCESS_LISTENER_IMPORT_LIST_IS_EMPTY); } // 2. 逐条处理 BpmProcessListenerImportRespVO respVO = BpmProcessListenerImportRespVO.builder() .createListenerNames(new ArrayList<>()) .updateListenerNames(new ArrayList<>()) .failureListenerNames(new LinkedHashMap<>()) .build(); importListeners.forEach(importListener -> { try { // 2.1 按名字匹配已存在记录 BpmProcessListenerDO existListener = processListenerMapper.selectOne( BpmProcessListenerDO::getName, importListener.getName()); if (existListener == null) { BpmProcessListenerDO listener = BeanUtils.toBean(importListener, BpmProcessListenerDO.class); processListenerMapper.insert(listener); respVO.getCreateListenerNames().add(importListener.getName()); return; } // 2.2 已存在,判断是否允许更新 if (!importReqVO.getUpdateSupport()) { respVO.getFailureListenerNames().put(importListener.getName(), StrUtil.format(PROCESS_LISTENER_IMPORT_EXISTS.getMsg(), importListener.getName())); return; } BpmProcessListenerDO updateListener = BeanUtils.toBean(importListener, BpmProcessListenerDO.class) .setId(existListener.getId()); processListenerMapper.updateById(updateListener); respVO.getUpdateListenerNames().add(importListener.getName()); } catch (ServiceException ex) { respVO.getFailureListenerNames().put(importListener.getName(), ex.getMessage()); } }); return respVO; } }