diff --git a/czsj-admin/pom.xml b/czsj-admin/pom.xml
index f657078..bb8b7d4 100644
--- a/czsj-admin/pom.xml
+++ b/czsj-admin/pom.xml
@@ -55,6 +55,16 @@
czsj-quartz
+
+
+ org.dromara.warm
+ warm-flow-mybatis-sb-starter
+
+
+ org.dromara.warm
+ warm-flow-plugin-ui-sb-web
+
+
com.czsj
diff --git a/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/DefController.java b/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/DefController.java
new file mode 100644
index 0000000..7f82be1
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/DefController.java
@@ -0,0 +1,211 @@
+package com.czsj.web.controller.workFlow;
+
+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 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 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 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 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 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 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 remove(@PathVariable List 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 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 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 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 chartDef(@PathVariable("definitionId") Long definitionId) {
+ return R.ok(chartService.chartDef(definitionId));
+ }
+
+ /**
+ * 查询流程图
+ *
+ * @param instanceId
+ * @return
+ */
+ @GetMapping("/flowChart/{instanceId}")
+ public R flowChart(@PathVariable("instanceId") Long instanceId) throws IOException {
+ return R.ok(chartService.chartIns(instanceId));
+ }
+
+ /**
+ * 激活流程
+ *
+ * @param definitionId
+ * @return
+ */
+ @GetMapping("/active/{definitionId}")
+ public R active(@PathVariable("definitionId") Long definitionId) {
+ return R.ok(defService.active(definitionId));
+ }
+
+ /**
+ * 挂起流程
+ *
+ * @param definitionId
+ * @return
+ */
+ @GetMapping("/unActive/{definitionId}")
+ public R unActive(@PathVariable("definitionId") Long definitionId) {
+ return R.ok(defService.unActive(definitionId));
+ }
+}
diff --git a/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/ExecuteController.java b/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/ExecuteController.java
new file mode 100644
index 0000000..0d23c55
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/ExecuteController.java
@@ -0,0 +1,367 @@
+package com.czsj.web.controller.workFlow;
+
+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.system.service.ISysDeptService;
+import com.czsj.system.service.ISysRoleService;
+import com.czsj.system.service.ISysUserService;
+import com.czsj.workFlow.service.ExecuteService;
+import com.czsj.workFlow.service.HhDefService;
+import com.czsj.workFlow.vo.FlowTaskVo;
+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 permissionList = permissionList(String.valueOf(sysUser.getUserId()), sysUser.getDeptId(), sysUser);
+ flowTask.setPermissionList(permissionList);
+ startPage();
+ List list = executeService.toDoPage(flowTask);
+ List taskIds = StreamUtils.toList(list, FlowTaskVo::getId);
+ List userList = flowUserservice.getByAssociateds(taskIds);
+ Map> map = StreamUtils.groupByKey(userList, User::getAssociated);
+ for (FlowTaskVo taskVo : list) {
+ if (StringUtils.isNotNull(taskVo)) {
+ List 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 permissionList = permissionList(String.valueOf(sysUser.getUserId()), sysUser.getDeptId(), sysUser);
+ flowTask.setPermissionList(permissionList);
+ startPage();
+ List 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 permissionList = permissionList(String.valueOf(sysUser.getUserId()), sysUser.getDeptId(), sysUser);
+ flowHisTask.setPermissionList(permissionList);
+ List list = executeService.donePage(flowHisTask);
+ Map 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 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 userMap = StreamUtils.toMap(userService.selectUserList(new SysUser())
+ , SysUser::getUserId, SysUser::getNickName);
+ Map deptMap = StreamUtils.toMap(deptService.selectDeptList(new SysDept())
+ , SysDept::getDeptId, SysDept::getDeptName);
+ Map 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> doneList(@PathVariable("instanceId") Long instanceId) {
+ List flowHisTasks = hisTaskService.orderById().desc().list(new FlowHisTask().setInstanceId(instanceId));
+ Map userMap = StreamUtils.toMap(userService.selectUserList(new SysUser())
+ , SysUser::getUserId, SysUser::getNickName);
+ List 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 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 getTaskById(@PathVariable("taskId") Long taskId) {
+ return R.ok(taskService.getById(taskId));
+ }
+
+ /**
+ * 查询跳转任意节点列表
+ */
+ @PreAuthorize("@ss.hasPermi('flow:execute:doneList')")
+ @GetMapping("/anyNodeList/{instanceId}")
+ public R> anyNodeList(@PathVariable("instanceId") Long instanceId) {
+ Instance instance = insService.getById(instanceId);
+ List 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 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 list;
+ Long taskId = warmFlowInteractiveTypeVo.getTaskId();
+ List users = flowUserservice.listByAssociatedAndTypes(taskId);
+ if (!Objects.equals(CooperateType.REDUCTION_SIGNATURE.getKey(), operatorType)) {
+ List userIds = StreamUtils.toList(users, User::getProcessedBy);
+ warmFlowInteractiveTypeVo.setUserIds(userIds);
+ list = userService.selectNotUserList(warmFlowInteractiveTypeVo);
+ } else {
+ List 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 active(@PathVariable("instanceId") Long instanceId) {
+ return R.ok(insService.active(instanceId));
+ }
+
+ /**
+ * 挂起流程
+ *
+ * @param instanceId
+ * @return
+ */
+ @GetMapping("/unActive/{instanceId}")
+ public R unActive(@PathVariable("instanceId") Long instanceId) {
+ return R.ok(insService.unActive(instanceId));
+ }
+
+ /**
+ * 获取权限
+ *
+ * @param userId 用户编号
+ * @param deptId 部门编号
+ * @param sysUser 登陆用户
+ * @return 权限列表
+ */
+ private List permissionList(String userId, Long deptId, SysUser sysUser) {
+ List roles = sysUser.getRoles();
+ List 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>}
+ * @author liangli
+ * @date 2024/8/21 17:08
+ **/
+ @PreAuthorize("@ss.hasPermi('flow:definition:query')")
+ @GetMapping(value = "/idReverseDisplayName/{ids}")
+ public R> idReverseDisplayName(@PathVariable Long[] ids) {
+ return R.ok(executeService.idReverseDisplayName(ids));
+ }
+
+}
diff --git a/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/FormController.java b/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/FormController.java
new file mode 100644
index 0000000..d9e7091
--- /dev/null
+++ b/czsj-admin/src/main/java/com/czsj/web/controller/workFlow/FormController.java
@@ -0,0 +1,209 @@
+package com.czsj.web.controller.workFlow;
+
+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