【feat】拆分工作流为单独模块_01

This commit is contained in:
Kris 2025-02-21 14:57:35 +08:00
parent e79f752687
commit 8b75cc85a2
15 changed files with 1287 additions and 0 deletions

View File

@ -0,0 +1,40 @@
package com.czsj.flow.adapter;
import com.czsj.common.core.domain.entity.SysRole;
import com.czsj.common.core.domain.entity.SysUser;
import org.dromara.warm.flow.core.enums.CooperateType;
import org.dromara.warm.flow.core.service.TaskService;
import org.dromara.warm.flow.core.utils.StreamUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public abstract class AbstractWarmFlowAdapter {
@Resource
protected TaskService taskService;
/**
* 获取权限
*
* @return 权限列表
*/
protected List<String> permissionList(SysUser sysUser, String userId) {
List<SysRole> roles = sysUser.getRoles();
List<String> permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId());
permissionList.add(userId);
permissionList.add("dept:" + sysUser.getDeptId());
return permissionList;
}
/**
* 根据类型获取描述
*
* @param type 流程类型
* @return value
*/
protected String type(Integer type) {
return CooperateType.getValueByKey(type);
}
}

View File

@ -0,0 +1,35 @@
package com.czsj.flow.adapter;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.common.utils.SecurityUtils;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.enums.CooperateType;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 加签适配器
*/
@Component
public class AddSignatureAdapter extends AbstractWarmFlowAdapter implements WarmFlowAdapter {
@Override
public boolean isAdapter(Integer warmFlowType) {
return Objects.equals(CooperateType.ADD_SIGNATURE.getKey(), warmFlowType);
}
@Override
public boolean adapter(WarmFlowInteractiveTypeVo obj) {
Long taskId = obj.getTaskId();
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
String userId = String.valueOf(sysUser.getUserId());
FlowParams flowParams = new FlowParams()
.handler(userId)
.permissionFlag(permissionList(sysUser, userId))
.addHandlers(obj.getAddHandlers())
.message(this.type(obj.getOperatorType()));
return super.taskService.addSignature(taskId, flowParams);
}
}

View File

@ -0,0 +1,35 @@
package com.czsj.flow.adapter;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.common.utils.SecurityUtils;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.enums.CooperateType;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 委派适配器
*/
@Component
public class DeputeAdapter extends AbstractWarmFlowAdapter implements WarmFlowAdapter {
@Override
public boolean isAdapter(Integer warmFlowType) {
return Objects.equals(CooperateType.DEPUTE.getKey(), warmFlowType);
}
@Override
public boolean adapter(WarmFlowInteractiveTypeVo obj) {
Long taskId = obj.getTaskId();
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
String userId = String.valueOf(sysUser.getUserId());
FlowParams flowParams = new FlowParams()
.handler(userId)
.permissionFlag(permissionList(sysUser, userId))
.addHandlers(obj.getAddHandlers())
.message(this.type(obj.getOperatorType()));
return super.taskService.depute(taskId, flowParams);
}
}

View File

@ -0,0 +1,35 @@
package com.czsj.flow.adapter;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.common.utils.SecurityUtils;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.enums.CooperateType;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 减签适配器
*/
@Component
public class ReductionSignatureAdapter extends AbstractWarmFlowAdapter implements WarmFlowAdapter {
@Override
public boolean isAdapter(Integer warmFlowType) {
return Objects.equals(CooperateType.REDUCTION_SIGNATURE.getKey(), warmFlowType);
}
@Override
public boolean adapter(WarmFlowInteractiveTypeVo obj) {
Long taskId = obj.getTaskId();
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
String userId = String.valueOf(sysUser.getUserId());
FlowParams flowParams = new FlowParams()
.handler(userId)
.permissionFlag(permissionList(sysUser, userId))
.reductionHandlers(obj.getAddHandlers())
.message(type(obj.getOperatorType()));
return super.taskService.reductionSignature(taskId, flowParams);
}
}

View File

@ -0,0 +1,35 @@
package com.czsj.flow.adapter;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.common.utils.SecurityUtils;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
import org.dromara.warm.flow.core.dto.FlowParams;
import org.dromara.warm.flow.core.enums.CooperateType;
import org.springframework.stereotype.Component;
import java.util.Objects;
/**
* 转办适配器
*/
@Component
public class TransferAdapter extends AbstractWarmFlowAdapter implements WarmFlowAdapter {
@Override
public boolean isAdapter(Integer warmFlowType) {
return Objects.equals(CooperateType.TRANSFER.getKey(), warmFlowType);
}
@Override
public boolean adapter(WarmFlowInteractiveTypeVo obj) {
Long taskId = obj.getTaskId();
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
String userId = String.valueOf(sysUser.getUserId());
FlowParams flowParams = new FlowParams()
.handler(userId)
.permissionFlag(permissionList(sysUser, userId))
.addHandlers(obj.getAddHandlers())
.message(this.type(obj.getOperatorType()));
return super.taskService.transfer(taskId, flowParams);
}
}

View File

@ -0,0 +1,9 @@
package com.czsj.flow.adapter;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
public interface WarmFlowAdapter {
boolean isAdapter(Integer warmFlowType);
boolean adapter(WarmFlowInteractiveTypeVo obj);
}

View File

@ -0,0 +1,211 @@
package com.czsj.flow.controller;
import com.czsj.common.annotation.Log;
import com.czsj.common.constant.HttpStatus;
import com.czsj.common.core.controller.BaseController;
import com.czsj.common.core.domain.R;
import com.czsj.common.core.page.PageDomain;
import com.czsj.common.core.page.TableDataInfo;
import com.czsj.common.core.page.TableSupport;
import com.czsj.common.enums.BusinessType;
import org.dromara.warm.flow.core.entity.Definition;
import org.dromara.warm.flow.core.service.ChartService;
import org.dromara.warm.flow.core.service.DefService;
import org.dromara.warm.flow.core.utils.page.Page;
import org.dromara.warm.flow.orm.entity.FlowDefinition;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
/**
* 流程定义Controller
*
* @author hh
* @date 2023-04-11
*/
@Validated
@RestController
@RequestMapping("/flow/definition")
public class DefController extends BaseController {
@Resource
private DefService defService;
@Resource
private ChartService chartService;
/**
* 分页查询流程定义列表
*/
@GetMapping("/list")
public TableDataInfo list(FlowDefinition flowDefinition) {
// flow组件自带分页功能
PageDomain pageDomain = TableSupport.buildPageRequest();
Page<Definition> page = Page.pageOf(pageDomain.getPageNum(), pageDomain.getPageSize());
page = defService.orderByCreateTime().desc().page(flowDefinition, page);
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(page.getList());
rspData.setTotal(page.getTotal());
return rspData;
}
/**
* 获取流程定义详细信息
*/
@PreAuthorize("@ss.hasPermi('flow:definition:query')")
@GetMapping(value = "/{id}")
public R<Definition> getInfo(@PathVariable("id") Long id) {
return R.ok(defService.getById(id));
}
/**
* 新增流程定义
*/
@PreAuthorize("@ss.hasPermi('flow:definition:add')")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@PostMapping
@Transactional(rollbackFor = Exception.class)
public R<Boolean> add(@RequestBody FlowDefinition flowDefinition) {
return R.ok(defService.saveAndInitNode(flowDefinition));
}
/**
* 发布流程定义
*/
@PreAuthorize("@ss.hasPermi('flow:definition:publish')")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@GetMapping("/publish/{id}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> publish(@PathVariable("id") Long id) {
return R.ok(defService.publish(id));
}
/**
* 取消发布流程定义
*/
@PreAuthorize("@ss.hasPermi('flow:definition:publish')")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@GetMapping("/unPublish/{id}")
@Transactional(rollbackFor = Exception.class)
public R<Void> unPublish(@PathVariable("id") Long id) {
defService.unPublish(id);
return R.ok();
}
/**
* 修改流程定义
*/
@PreAuthorize("@ss.hasPermi('flow:definition:edit')")
@Log(title = "流程定义", businessType = BusinessType.UPDATE)
@PutMapping
@Transactional(rollbackFor = Exception.class)
public R<Boolean> edit(@RequestBody FlowDefinition flowDefinition) {
return R.ok(defService.updateById(flowDefinition));
}
/**
* 删除流程定义
*/
@PreAuthorize("@ss.hasPermi('flow:definition:remove')")
@Log(title = "流程定义", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> remove(@PathVariable List<Long> ids) {
return R.ok(defService.removeDef(ids));
}
/**
* 复制流程定义
*/
@PreAuthorize("@ss.hasPermi('flow:definition:publish')")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@GetMapping("/copyDef/{id}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> copyDef(@PathVariable("id") Long id) {
return R.ok(defService.copyDef(id));
}
@Log(title = "流程定义", businessType = BusinessType.IMPORT)
@PreAuthorize("@ss.hasPermi('flow:definition:importDefinition')")
@PostMapping("/importDefinition")
@Transactional(rollbackFor = Exception.class)
public R<Void> importDefinition(MultipartFile file) throws Exception {
defService.importIs(file.getInputStream());
return R.ok();
}
@Log(title = "流程定义", businessType = BusinessType.EXPORT)
@PreAuthorize("@ss.hasPermi('flow:definition:exportDefinition')")
@PostMapping("/exportDefinition/{id}")
public ResponseEntity<byte[]> exportDefinition(@PathVariable("id") Long id) {
// 要导出的字符串
String content = defService.exportJson(id);
// 设置响应头
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=exported_string.txt");
// 返回响应
return ResponseEntity.ok()
.headers(headers)
.contentType(MediaType.TEXT_PLAIN)
.body(content.getBytes(StandardCharsets.UTF_8));
}
/**
* 查询流程图
*
* @param definitionId
*
* @return
*/
@GetMapping("/chartDef/{definitionId}")
public R<String> chartDef(@PathVariable("definitionId") Long definitionId) {
return R.ok(chartService.chartDef(definitionId));
}
/**
* 查询流程图
*
* @param instanceId
* @return
*/
@GetMapping("/flowChart/{instanceId}")
public R<String> flowChart(@PathVariable("instanceId") Long instanceId) throws IOException {
return R.ok(chartService.chartIns(instanceId));
}
/**
* 激活流程
*
* @param definitionId
* @return
*/
@GetMapping("/active/{definitionId}")
public R<Boolean> active(@PathVariable("definitionId") Long definitionId) {
return R.ok(defService.active(definitionId));
}
/**
* 挂起流程
*
* @param definitionId
* @return
*/
@GetMapping("/unActive/{definitionId}")
public R<Boolean> unActive(@PathVariable("definitionId") Long definitionId) {
return R.ok(defService.unActive(definitionId));
}
}

View File

@ -0,0 +1,366 @@
package com.czsj.flow.controller;
import com.czsj.common.core.controller.BaseController;
import com.czsj.common.core.domain.R;
import com.czsj.common.core.domain.entity.SysDept;
import com.czsj.common.core.domain.entity.SysRole;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.common.core.page.TableDataInfo;
import com.czsj.common.utils.SecurityUtils;
import com.czsj.common.utils.StringUtils;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
import com.czsj.flow.service.ExecuteService;
import com.czsj.flow.service.HhDefService;
import com.czsj.flow.vo.FlowTaskVo;
import com.czsj.system.service.ISysDeptService;
import com.czsj.system.service.ISysRoleService;
import com.czsj.system.service.ISysUserService;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.entity.*;
import org.dromara.warm.flow.core.enums.CooperateType;
import org.dromara.warm.flow.core.enums.NodeType;
import org.dromara.warm.flow.core.enums.UserType;
import org.dromara.warm.flow.core.service.*;
import org.dromara.warm.flow.core.utils.StreamUtils;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.springframework.beans.BeanUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**load
* 流程实例Controller
*
* @author hh
* @date 2023-04-18
*/
@Validated
@RestController
@RequestMapping("/flow/execute")
public class ExecuteController extends BaseController {
@Resource
private ISysUserService userService;
@Resource
private ISysDeptService deptService;
@Resource
private ISysRoleService roleService;
@Resource
private HisTaskService hisTaskService;
@Resource
private TaskService taskService;
@Resource
private NodeService nodeService;
@Resource
private InsService insService;
@Resource
private UserService flowUserservice;
@Resource
private ExecuteService executeService;
@Resource
private HhDefService hhDefService;
/**
* 分页待办任务列表
*/
@PreAuthorize("@ss.hasPermi('flow:execute:toDoPage')")
@GetMapping("/toDoPage")
public TableDataInfo toDoPage(FlowTask flowTask) {
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
List<String> permissionList = permissionList(String.valueOf(sysUser.getUserId()), sysUser.getDeptId(), sysUser);
flowTask.setPermissionList(permissionList);
startPage();
List<FlowTaskVo> list = executeService.toDoPage(flowTask);
List<Long> taskIds = StreamUtils.toList(list, FlowTaskVo::getId);
List<User> userList = flowUserservice.getByAssociateds(taskIds);
Map<Long, List<User>> map = StreamUtils.groupByKey(userList, User::getAssociated);
for (FlowTaskVo taskVo : list) {
if (StringUtils.isNotNull(taskVo)) {
List<User> users = map.get(taskVo.getId());
if (CollectionUtils.isNotEmpty(users)) {
for (User user : users) {
if (UserType.APPROVAL.getKey().equals(user.getType())) {
if (StringUtils.isEmpty(taskVo.getApprover())) {
taskVo.setApprover("");
}
String name = getName(user.getProcessedBy());
if (StringUtils.isNotEmpty(name)) taskVo.setApprover(taskVo.getApprover().concat(name).concat(";"));
} else if (UserType.TRANSFER.getKey().equals(user.getType())) {
if (StringUtils.isEmpty(taskVo.getTransferredBy())) {
taskVo.setTransferredBy("");
}
String name = getName(user.getProcessedBy());
if (StringUtils.isNotEmpty(name)) taskVo.setTransferredBy(taskVo.getTransferredBy().concat(name).concat(";"));
} else if (UserType.DEPUTE.getKey().equals(user.getType())) {
if (StringUtils.isEmpty(taskVo.getDelegate())) {
taskVo.setDelegate("");
}
String name = getName(user.getProcessedBy());
if (StringUtils.isNotEmpty(name)) taskVo.setDelegate(taskVo.getDelegate().concat(name).concat(";"));
}
}
}
}
}
return getDataTable(list);
}
/**
* 分页抄送任务列表
* author暗影
*/
@PreAuthorize("@ss.hasPermi('flow:execute:copyPage')")
@GetMapping("/copyPage")
public TableDataInfo copyPage(FlowTask flowTask) {
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
List<String> permissionList = permissionList(String.valueOf(sysUser.getUserId()), sysUser.getDeptId(), sysUser);
flowTask.setPermissionList(permissionList);
startPage();
List<FlowHisTask> list = executeService.copyPage(flowTask);
return getDataTable(list);
}
/**
* 分页已办任务列表
*/
@PreAuthorize("@ss.hasPermi('flow:execute:donePage')")
@GetMapping("/donePage")
public TableDataInfo donePage(FlowHisTask flowHisTask) {
startPage();
SysUser sysUser = SecurityUtils.getLoginUser().getUser();
List<String> permissionList = permissionList(String.valueOf(sysUser.getUserId()), sysUser.getDeptId(), sysUser);
flowHisTask.setPermissionList(permissionList);
List<FlowHisTask> list = executeService.donePage(flowHisTask);
Map<Long, String> userMap = StreamUtils.toMap(userService.selectUserList(new SysUser())
, SysUser::getUserId, SysUser::getNickName);
if (CollectionUtils.isNotEmpty(list)) {
for (FlowHisTask hisTask : list) {
if (StringUtils.isNotEmpty(hisTask.getApprover())) {
String name = getName(hisTask.getApprover());
hisTask.setApprover(name);
}
if (StringUtils.isNotEmpty(hisTask.getCollaborator())) {
String[] split = hisTask.getCollaborator().split(",");
if (split.length > 1) {
List<String> names = new ArrayList<>();
for (String s : split) {
names.add(userMap.get(Long.valueOf(s)));
}
hisTask.setCollaborator(StringUtils.join(names, ","));
}
}
}
}
return getDataTable(list);
}
private String getName(String id) {
Map<Long, String> userMap = StreamUtils.toMap(userService.selectUserList(new SysUser())
, SysUser::getUserId, SysUser::getNickName);
Map<Long, String> deptMap = StreamUtils.toMap(deptService.selectDeptList(new SysDept())
, SysDept::getDeptId, SysDept::getDeptName);
Map<Long, String> roleMap = StreamUtils.toMap(roleService.selectRoleAll()
, SysRole::getRoleId, SysRole::getRoleName);
if (StringUtils.isNotNull(id)) {
if (id.contains("user:")) {
String name = userMap.get(Long.valueOf(id.replace("user:", "")));
if (StringUtils.isNotEmpty(name)) {
return "用户:" + name;
}
} else if (id.contains("dept:")) {
String name = deptMap.get(Long.valueOf(id.replace("dept:", "")));
if (StringUtils.isNotEmpty(name)) {
return "部门:" + name;
}
} else if (id.contains("role")) {
String name = roleMap.get(Long.valueOf(id.replace("role:", "")));
if (StringUtils.isNotEmpty(name)) {
return "角色:" + name;
}
} else {
try {
long parseLong = Long.parseLong(id);
String name = userMap.get(parseLong);
if (StringUtils.isNotEmpty(name)) {
return "用户:" + name;
}
} catch (NumberFormatException e) {
return id;
}
}
}
return "";
}
/**
* 查询已办任务历史记录
*/
@PreAuthorize("@ss.hasPermi('flow:execute:doneList')")
@GetMapping("/doneList/{instanceId}")
public R<List<FlowHisTask>> doneList(@PathVariable("instanceId") Long instanceId) {
List<HisTask> flowHisTasks = hisTaskService.orderById().desc().list(new FlowHisTask().setInstanceId(instanceId));
Map<Long, String> userMap = StreamUtils.toMap(userService.selectUserList(new SysUser())
, SysUser::getUserId, SysUser::getNickName);
List<FlowHisTask> flowHisTaskList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(flowHisTasks)) {
for (HisTask hisTask : flowHisTasks) {
if (StringUtils.isNotEmpty(hisTask.getApprover())) {
String name = getName(hisTask.getApprover());
hisTask.setApprover(name);
}
if (StringUtils.isNotEmpty(hisTask.getCollaborator())) {
String[] split = hisTask.getCollaborator().split(",");
if (split.length > 1) {
List<String> names = new ArrayList<>();
for (String s : split) {
names.add(userMap.get(Long.valueOf(s)));
}
hisTask.setCollaborator(StringUtils.join(names, ","));
}
}
FlowHisTask flowHisTask = new FlowHisTask();
BeanUtils.copyProperties(hisTask, flowHisTask);
flowHisTaskList.add(flowHisTask);
}
}
return R.ok(flowHisTaskList);
}
/**
* 根据taskId查询代表任务
*
* @param taskId
* @return
*/
@GetMapping("/getTaskById/{taskId}")
public R<Task> getTaskById(@PathVariable("taskId") Long taskId) {
return R.ok(taskService.getById(taskId));
}
/**
* 查询跳转任意节点列表
*/
@PreAuthorize("@ss.hasPermi('flow:execute:doneList')")
@GetMapping("/anyNodeList/{instanceId}")
public R<List<Node>> anyNodeList(@PathVariable("instanceId") Long instanceId) {
Instance instance = insService.getById(instanceId);
List<Node> nodeList = nodeService.list(FlowEngine.newNode().setDefinitionId(instance.getDefinitionId()));
nodeList.removeIf(node -> NodeType.isGateWay(node.getNodeType()));
return R.ok(nodeList);
}
/**
* 处理非办理的流程交互类型
*
* @param warmFlowInteractiveTypeVo 要转办用户
* @return 是否成功
*/
@PostMapping("/interactiveType")
public R<Boolean> interactiveType(WarmFlowInteractiveTypeVo warmFlowInteractiveTypeVo) {
return R.ok(hhDefService.interactiveType(warmFlowInteractiveTypeVo));
}
/**
* 交互类型可以选择的用户
*
* @param warmFlowInteractiveTypeVo 交互类型请求类
* @return 是否成功
*/
@GetMapping("/interactiveTypeSysUser")
public TableDataInfo interactiveTypeSysUser(WarmFlowInteractiveTypeVo warmFlowInteractiveTypeVo) {
startPage();
SysUser currentUser = SecurityUtils.getLoginUser().getUser();
Long userId = currentUser.getUserId();
Integer operatorType = warmFlowInteractiveTypeVo.getOperatorType();
List<SysUser> list;
Long taskId = warmFlowInteractiveTypeVo.getTaskId();
List<User> users = flowUserservice.listByAssociatedAndTypes(taskId);
if (!Objects.equals(CooperateType.REDUCTION_SIGNATURE.getKey(), operatorType)) {
List<String> userIds = StreamUtils.toList(users, User::getProcessedBy);
warmFlowInteractiveTypeVo.setUserIds(userIds);
list = userService.selectNotUserList(warmFlowInteractiveTypeVo);
} else {
List<String> userIds = StreamUtils.toList(users, User::getProcessedBy);
warmFlowInteractiveTypeVo.setUserIds(userIds);
list = userService.selectUserList(warmFlowInteractiveTypeVo);
list = StreamUtils.filter(list, sysUser -> !Objects.equals(userId, sysUser.getUserId()));
}
return getDataTable(list);
}
/**
* 激活流程
*
* @param instanceId
* @return
*/
@GetMapping("/active/{instanceId}")
public R<Boolean> active(@PathVariable("instanceId") Long instanceId) {
return R.ok(insService.active(instanceId));
}
/**
* 挂起流程
*
* @param instanceId
* @return
*/
@GetMapping("/unActive/{instanceId}")
public R<Boolean> unActive(@PathVariable("instanceId") Long instanceId) {
return R.ok(insService.unActive(instanceId));
}
/**
* 获取权限
*
* @param userId 用户编号
* @param deptId 部门编号
* @param sysUser 登陆用户
* @return 权限列表
*/
private List<String> permissionList(String userId, Long deptId, SysUser sysUser) {
List<SysRole> roles = sysUser.getRoles();
List<String> permissionList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(roles)) {
permissionList = StreamUtils.toList(roles, role -> "role:" + role.getRoleId());
}
permissionList.add(userId);
if (Objects.nonNull(deptId)) {
permissionList.add("dept:" + deptId);
}
logger.info("当前用户所有权限[{}]", permissionList);
return permissionList;
}
/**
* 根据ID反显姓名
*
* @param ids 需要反显姓名的用户ID
* @return {@link R< List<SysUser>>}
* @author liangli
* @date 2024/8/21 17:08
**/
@PreAuthorize("@ss.hasPermi('flow:definition:query')")
@GetMapping(value = "/idReverseDisplayName/{ids}")
public R<List<SysUser>> idReverseDisplayName(@PathVariable Long[] ids) {
return R.ok(executeService.idReverseDisplayName(ids));
}
}

View File

@ -0,0 +1,209 @@
package com.czsj.flow.controller;
import com.czsj.common.annotation.Log;
import com.czsj.common.constant.HttpStatus;
import com.czsj.common.core.controller.BaseController;
import com.czsj.common.core.domain.R;
import com.czsj.common.core.page.PageDomain;
import com.czsj.common.core.page.TableDataInfo;
import com.czsj.common.core.page.TableSupport;
import com.czsj.common.enums.BusinessType;
import org.dromara.warm.flow.core.FlowEngine;
import org.dromara.warm.flow.core.entity.Form;
import org.dromara.warm.flow.core.service.FormService;
import org.dromara.warm.flow.core.utils.page.Page;
import org.dromara.warm.flow.orm.entity.FlowForm;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* 表单Controller
*
* @author liangli
* @date 2024-09-05
*/
@Validated
@RestController
@RequestMapping("/flow/form")
public class FormController extends BaseController {
@Resource
private FormService formService;
/**
* 表单列表
*
* @param form 携带的查询参数
* @return {@link TableDataInfo}
* @author liangli
* @date 2024/9/5 15:07
**/
@PreAuthorize("@ss.hasPermi('flow:form:list')")
@GetMapping(value = "/list")
public TableDataInfo list(FlowForm form) {
PageDomain pageDomain = TableSupport.buildPageRequest();
Page<Form> page = Page.pageOf(pageDomain.getPageNum(), pageDomain.getPageSize());
page = formService.orderByCreateTime().desc().page(form, page);
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(page.getList());
rspData.setTotal(page.getTotal());
return rspData;
}
/**
* 已发布表单列表
*
* @param form 携带的查询参数
* @return {@link TableDataInfo}
* @author vanlin
* @date 2024/11/11 15:07
**/
@GetMapping(value = "/publishedList")
public TableDataInfo publishedList(FlowForm form) {
PageDomain pageDomain = TableSupport.buildPageRequest();
Page<Form> page = Page.pageOf(pageDomain.getPageNum(), pageDomain.getPageSize());
form.setIsPublish(1); //已发布
page = formService.orderByCreateTime().desc().page(form, page);
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
rspData.setMsg("查询成功");
rspData.setRows(page.getList());
rspData.setTotal(page.getTotal());
return rspData;
}
/**
* 查询表单详情
*
* @param id 表单ID
* @return {@link R< Form>}
* @author liangli
* @date 2024/9/5 15:41
**/
@PreAuthorize("@ss.hasPermi('flow:form:query')")
@GetMapping(value = "/{id}")
public R<Form> getForm(@PathVariable("id") Long id) {
return R.ok(formService.getById(id));
}
/**
* 提交表单
*
* @param form 表单ID对应的表单内容
* @return {@link R<Boolean>}
* @author liangli
* @date 2024/9/5 15:07
**/
@PreAuthorize("@ss.hasPermi('flow:form:add')")
@Log(title = "提交表单", businessType = BusinessType.INSERT)
@PostMapping("/saveFormContent")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> saveFormContent(@RequestBody FlowForm form) {
return R.ok(formService.updateById(FlowEngine.newForm().setFormContent(form.getFormContent()).setId(form.getId())));
}
/**
* 提交表单
*
* @param form 携带的查询参数
* @return {@link R<Boolean>}
* @author liangli
* @date 2024/9/5 15:07
**/
@PreAuthorize("@ss.hasPermi('flow:form:add')")
@Log(title = "提交表单", businessType = BusinessType.INSERT)
@PostMapping("/add")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> add(@RequestBody FlowForm form) {
return R.ok(formService.save(form));
}
/**
* 发布表单
*
* @param id 表单ID
* @return {@link R<Boolean>}
* @author liangli
* @date 2024/9/5 15:26
**/
@PreAuthorize("@ss.hasPermi('flow:form:publish')")
@Log(title = "发布表单", businessType = BusinessType.INSERT)
@GetMapping("/publish/{id}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> publish(@PathVariable("id") Long id) {
return R.ok(formService.publish(id));
}
/**
* 取消表单
*
* @param id 表单ID
* @return {@link R<Boolean>}
* @author liangli
* @date 2024/9/5 15:26
**/
@PreAuthorize("@ss.hasPermi('flow:form:unPublish')")
@Log(title = "取消发布表单", businessType = BusinessType.INSERT)
@GetMapping("/unPublish/{id}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> unPublish(@PathVariable("id") Long id) {
return R.ok(formService.unPublish(id));
}
/**
* 修改表单
*
* @param form 表单
* @return {@link R<Boolean>}
* @author liangli
* @date 2024/9/5 15:26
**/
@PreAuthorize("@ss.hasPermi('flow:form:edit')")
@Log(title = "流程定义", businessType = BusinessType.UPDATE)
@PutMapping("/edit")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> edit(@RequestBody FlowForm form) {
return R.ok(formService.updateById(form));
}
/**
* 删除表单
*
* @param ids 表单ID
* @return {@link R<Boolean>}
* @author liangli
* @date 2024/9/5 16:19
**/
@PreAuthorize("@ss.hasPermi('flow:form:remove')")
@Log(title = "流程定义", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> remove(@PathVariable List<Long> ids) {
return R.ok(formService.removeByIds(ids));
}
/**
* 复制表单
*
* @param id 表单ID
* @return {@link R<Boolean>}
* @author liangli
* @date 2024/9/5 16:19
**/
@PreAuthorize("@ss.hasPermi('flow:form:add')")
@Log(title = "流程定义", businessType = BusinessType.INSERT)
@PostMapping("/copyForm/{id}")
@Transactional(rollbackFor = Exception.class)
public R<Boolean> copyForm(@PathVariable("id") Long id) {
return R.ok(formService.copyForm(id));
}
}

View File

@ -0,0 +1,52 @@
package com.czsj.flow.mapper;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.flow.vo.FlowTaskVo;
import org.dromara.warm.flow.core.entity.HisTask;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* warm-flow工作流Mapper接口
*
* @author czsj
* @date 2024-03-07
*/
public interface WarmFlowMapper {
/**
* 分页查询待办任务
*
* @param task 条件实体
*/
List<FlowTaskVo> toDoPage(@Param("task") Task task);
/**
* 获取最新的已办任务
*
* @param hisTask
* @return
*/
List<FlowHisTask> donePage(@Param("hisTask") HisTask hisTask);
/**
* 分页获取抄送任务
* @param flowTask
* @return
*/
List<FlowHisTask> copyPage(@Param("task") FlowTask flowTask);
/**
* 根据ID反显姓名
*
* @param ids 需要反显姓名的用户ID
* @return {@link List<SysUser>}
* @author liangli
* @date 2024/8/21 17:11
**/
List<SysUser> idReverseDisplayName(@Param("ids") Long[] ids);
}

View File

@ -0,0 +1,47 @@
package com.czsj.flow.service;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.flow.vo.FlowTaskVo;
import org.dromara.warm.flow.core.entity.HisTask;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowTask;
import java.util.List;
/**
* 流程执行service
*
* @author warm
* @since 2023/5/29 13:09
*/
public interface ExecuteService {
/**
* 分页查询待办任务
*
* @param task 条件实体
* @return
*/
List<FlowTaskVo> toDoPage(Task task);
/**
* 获取已办任务
*
* @param hisTask
* @return
*/
List<FlowHisTask> donePage(HisTask hisTask);
List<FlowHisTask> copyPage(FlowTask flowTask);
/**
* 根据ID反显姓名
*
* @param ids 需要反显姓名的用户ID
* @return {@link List<SysUser>}
* @author liangli
* @date 2024/8/21 17:11
**/
List<SysUser> idReverseDisplayName(Long[] ids);
}

View File

@ -0,0 +1,14 @@
package com.czsj.flow.service;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
/**
* 流程定义service
*
* @author warm
* @since 2023/5/29 13:09
*/
public interface HhDefService {
Boolean interactiveType(WarmFlowInteractiveTypeVo warmFlowInteractiveTypeVo);
}

View File

@ -0,0 +1,59 @@
package com.czsj.flow.service.impl;
import com.czsj.common.core.domain.entity.SysUser;
import com.czsj.flow.mapper.WarmFlowMapper;
import com.czsj.flow.service.ExecuteService;
import com.czsj.flow.vo.FlowTaskVo;
import org.dromara.warm.flow.core.entity.HisTask;
import org.dromara.warm.flow.core.entity.Task;
import org.dromara.warm.flow.orm.entity.FlowHisTask;
import org.dromara.warm.flow.orm.entity.FlowTask;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Objects;
/**
* 流程执行SERVICEIMPL
*
* @author WARM
* @since 2023/5/29 13:09
*/
@Service
public class ExecuteServiceImpl implements ExecuteService {
@Resource
private WarmFlowMapper flowMapper;
@Override
public List<FlowTaskVo> toDoPage(Task task) {
return flowMapper.toDoPage(task);
}
@Override
public List<FlowHisTask> donePage(HisTask hisTask) {
return flowMapper.donePage(hisTask);
}
@Override
public List<FlowHisTask> copyPage(FlowTask flowTask) {
return flowMapper.copyPage(flowTask);
}
/**
* 根据ID反显姓名
*
* @param ids 需要反显姓名的用户ID
* @return {@link List<SysUser>}
* @author liangli
* @date 2024/8/21 17:11
**/
@Override
public List<SysUser> idReverseDisplayName(Long[] ids) {
if (Objects.isNull(ids) || ids.length == 0) {
return null;
}
return flowMapper.idReverseDisplayName(ids);
}
}

View File

@ -0,0 +1,59 @@
package com.czsj.flow.service.impl;
import com.czsj.common.utils.spring.SpringUtils;
import com.czsj.flow.adapter.WarmFlowAdapter;
import com.czsj.flow.service.HhDefService;
import com.czsj.common.vo.WarmFlowInteractiveTypeVo;
import org.dromara.warm.flow.core.service.DefService;
import org.dromara.warm.flow.core.service.NodeService;
import org.dromara.warm.flow.core.service.SkipService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 流程定义serviceImpl
*
* @author warm
* @since 2023/5/29 13:09
*/
@Service
public class HhDefServiceImpl implements HhDefService {
@Resource
private DefService defService;
@Resource
private NodeService nodeService;
@Resource
private SkipService skipService;
private static final List<WarmFlowAdapter> WARM_FLOW_ADAPTERS = new ArrayList<>();
/**
* 初始化方法
*/
@PostConstruct
public void initMethod() {
Map<String, WarmFlowAdapter> beanNamesForType = SpringUtils.getBeanNamesForType(WarmFlowAdapter.class);
WARM_FLOW_ADAPTERS.addAll(beanNamesForType.values());
}
@Transactional(rollbackFor = Exception.class)
@Override
public Boolean interactiveType(WarmFlowInteractiveTypeVo warmFlowInteractiveTypeVo) {
Integer operatorType = warmFlowInteractiveTypeVo.getOperatorType();
for (WarmFlowAdapter warmFlowAdapter : WARM_FLOW_ADAPTERS) {
if (warmFlowAdapter.isAdapter(operatorType)) {
return warmFlowAdapter.adapter(warmFlowInteractiveTypeVo);
}
}
return false;
}
}

View File

@ -0,0 +1,81 @@
package com.czsj.flow.vo;
import org.dromara.warm.flow.orm.entity.FlowTask;
/**
* 待办任务vo
*
* @author warm
*/
public class FlowTaskVo extends FlowTask {
/**
* 计划审批人
*/
private String approver;
/**
* 转办人
*/
private String transferredBy;
/**
* 委派人
*/
private String delegate;
/**
* 委派人
*/
private String flowStatus;
/**
* 激活状态
*/
private Integer activityStatus;
public String getApprover() {
return approver;
}
public FlowTaskVo setApprover(String approver) {
this.approver = approver;
return this;
}
public String getTransferredBy() {
return transferredBy;
}
public FlowTaskVo setTransferredBy(String transferredBy) {
this.transferredBy = transferredBy;
return this;
}
public String getDelegate() {
return delegate;
}
public FlowTaskVo setDelegate(String delegate) {
this.delegate = delegate;
return this;
}
public String getFlowStatus() {
return flowStatus;
}
public FlowTaskVo setFlowStatus(String flowStatus) {
this.flowStatus = flowStatus;
return this;
}
public Integer getActivityStatus() {
return activityStatus;
}
public FlowTaskVo setActivityStatus(Integer activityStatus) {
this.activityStatus = activityStatus;
return this;
}
}