package com.iailab.module.bpm.convert.task; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.map.MapUtil; import com.iailab.framework.common.pojo.PageResult; import com.iailab.framework.common.util.collection.CollectionUtils; import com.iailab.framework.common.util.number.NumberUtils; import com.iailab.framework.common.util.object.BeanUtils; import com.iailab.module.bpm.controller.admin.base.user.UserSimpleBaseVO; import com.iailab.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; import com.iailab.module.bpm.dal.dataobject.definition.BpmFormDO; import com.iailab.module.bpm.enums.task.BpmTaskStatusEnum; import com.iailab.module.bpm.framework.flowable.core.util.FlowableUtils; import com.iailab.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO; import com.iailab.module.system.api.dept.dto.DeptRespDTO; import com.iailab.module.system.api.user.dto.AdminUserRespDTO; import org.flowable.engine.history.HistoricProcessInstance; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.flowable.task.service.impl.persistence.entity.TaskEntityImpl; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.Date; import java.util.List; import java.util.Map; import static com.iailab.framework.common.util.collection.CollectionUtils.convertList; import static com.iailab.framework.common.util.collection.MapUtils.findAndThen; /** * Bpm 任务 Convert * * @author 芋道源码 */ @Mapper public interface BpmTaskConvert { BpmTaskConvert INSTANCE = Mappers.getMapper(BpmTaskConvert.class); default PageResult buildTodoTaskPage(PageResult pageResult, Map processInstanceMap, Map userMap) { return BeanUtils.toBean(pageResult, BpmTaskRespVO.class, taskVO -> { ProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); if (processInstance == null) { return; } taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); }); } default PageResult buildTaskPage(PageResult pageResult, Map processInstanceMap, Map userMap, Map deptMap) { List taskVOList = convertList(pageResult.getList(), task -> { BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task)); // 用户信息 AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); if (assignUser != null) { taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class)); findAndThen(deptMap, assignUser.getDeptId(), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName())); } // 流程实例 HistoricProcessInstance processInstance = processInstanceMap.get(taskVO.getProcessInstanceId()); if (processInstance != null) { AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId())); taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class)); taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class)); } return taskVO; }); return new PageResult<>(taskVOList, pageResult.getTotal()); } default List buildTaskListByProcessInstanceId(List taskList, Map formMap, Map userMap, Map deptMap) { return convertList(taskList, task -> { // 特殊:已取消的任务,不返回 BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class); Integer taskStatus = FlowableUtils.getTaskStatus(task); if (BpmTaskStatusEnum.isCancelStatus(taskStatus)) { return null; } taskVO.setStatus(taskStatus).setReason(FlowableUtils.getTaskReason(task)); // 表单信息 BpmFormDO form = MapUtil.get(formMap, NumberUtils.parseLong(task.getFormKey()), BpmFormDO.class); if (form != null) { taskVO.setFormId(form.getId()).setFormName(form.getName()).setFormConf(form.getConf()) .setFormFields(form.getFields()).setFormVariables(FlowableUtils.getTaskFormVariable(task)); } // 用户信息 buildTaskAssignee(taskVO, task.getAssignee(), userMap, deptMap); buildTaskOwner(taskVO, task.getOwner(), userMap, deptMap); return taskVO; }); } default List buildTaskListByParentTaskId(List taskList, Map userMap, Map deptMap) { return convertList(taskList, task -> BeanUtils.toBean(task, BpmTaskRespVO.class, taskVO -> { AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee())); if (assignUser != null) { taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class)); DeptRespDTO dept = deptMap.get(assignUser.getDeptId()); if (dept != null) { taskVO.getAssigneeUser().setDeptName(dept.getName()); } } AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner())); if (ownerUser != null) { taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, UserSimpleBaseVO.class)); findAndThen(deptMap, ownerUser.getDeptId(), dept -> taskVO.getOwnerUser().setDeptName(dept.getName())); } })); } default BpmTaskRespVO buildTodoTask(Task todoTask, List childrenTasks, Map buttonsSetting) { return BeanUtils.toBean(todoTask, BpmTaskRespVO.class) .setStatus(FlowableUtils.getTaskStatus(todoTask)).setReason(FlowableUtils.getTaskReason(todoTask)) .setButtonsSetting(buttonsSetting) .setChildren(convertList(childrenTasks, childTask -> BeanUtils.toBean(childTask, BpmTaskRespVO.class) .setStatus(FlowableUtils.getTaskStatus(childTask)))); } default BpmMessageSendWhenTaskCreatedReqDTO convert(ProcessInstance processInstance, AdminUserRespDTO startUser, Task task) { BpmMessageSendWhenTaskCreatedReqDTO reqDTO = new BpmMessageSendWhenTaskCreatedReqDTO(); reqDTO.setProcessInstanceId(processInstance.getProcessInstanceId()) .setProcessInstanceName(processInstance.getName()).setStartUserId(startUser.getId()) .setStartUserNickname(startUser.getNickname()).setTaskId(task.getId()).setTaskName(task.getName()) .setAssigneeUserId(NumberUtils.parseLong(task.getAssignee())); return reqDTO; } default void buildTaskOwner(BpmTaskRespVO task, String taskOwner, Map userMap, Map deptMap) { AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(taskOwner)); if (ownerUser != null) { task.setOwnerUser(BeanUtils.toBean(ownerUser, UserSimpleBaseVO.class)); findAndThen(deptMap, ownerUser.getDeptId(), dept -> task.getOwnerUser().setDeptName(dept.getName())); } } default void buildTaskChildren(BpmTaskRespVO task, Map> childrenTaskMap, Map userMap, Map deptMap) { List childTasks = childrenTaskMap.get(task.getId()); if (CollUtil.isNotEmpty(childTasks)) { task.setChildren( convertList(childTasks, childTask -> { BpmTaskRespVO childTaskVO = BeanUtils.toBean(childTask, BpmTaskRespVO.class); childTaskVO.setStatus(FlowableUtils.getTaskStatus(childTask)); buildTaskOwner(childTaskVO, childTask.getOwner(), userMap, deptMap); buildTaskAssignee(childTaskVO, childTask.getAssignee(), userMap, deptMap); return childTaskVO; }) ); } } default void buildTaskAssignee(BpmTaskRespVO task, String taskAssignee, Map userMap, Map deptMap) { AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(taskAssignee)); if (assignUser != null) { task.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class)); findAndThen(deptMap, assignUser.getDeptId(), dept -> task.getAssigneeUser().setDeptName(dept.getName())); } } /** * 将父任务的属性,拷贝到子任务(加签任务) *

* 为什么不使用 mapstruct 映射?因为 TaskEntityImpl 还有很多其他属性,这里我们只设置我们需要的。 * 使用 mapstruct 会将里面嵌套的各个属性值都设置进去,会出现意想不到的问题。 * * @param parentTask 父任务 * @param childTask 加签任务 */ default void copyTo(TaskEntityImpl parentTask, TaskEntityImpl childTask) { childTask.setName(parentTask.getName()); childTask.setDescription(parentTask.getDescription()); childTask.setCategory(parentTask.getCategory()); childTask.setParentTaskId(parentTask.getId()); childTask.setProcessDefinitionId(parentTask.getProcessDefinitionId()); childTask.setProcessInstanceId(parentTask.getProcessInstanceId()); childTask.setTaskDefinitionKey(parentTask.getTaskDefinitionKey()); childTask.setTaskDefinitionId(parentTask.getTaskDefinitionId()); childTask.setPriority(parentTask.getPriority()); childTask.setCreateTime(new Date()); childTask.setTenantId(parentTask.getTenantId()); } }