待办,已办,抄送中添加标题
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled
yudao-ui-admin CI / build (14.x) (push) Has been cancelled
yudao-ui-admin CI / build (16.x) (push) Has been cancelled

This commit is contained in:
pch 2024-11-22 19:12:47 +08:00
parent fee01d624f
commit 29f38fc2e4
27 changed files with 687 additions and 69 deletions

View File

@ -44,13 +44,13 @@ import java.util.Map;
public class EsearchUtils {
// private static String ipStr = "192.168.1.28";
private static String ipStr;
private static int port = 9200;
private static int port;
private static String modeStr = "http";
private static RestHighLevelClient esClient;
public static void initialize(String ip) {
ipStr = ip;
// this.port = port;
// this.port = port;
// modeStr = mode;
esClient = new RestHighLevelClient(RestClient.builder(new HttpHost(ipStr,port,modeStr)));
}

View File

@ -97,4 +97,7 @@ public interface ErrorCodeConstants {
// ========== BPM 表单工作流对应 1_009_022_000 ==========
ErrorCode FORM_PROCESS_MAPPING_NOT_EXISTS = new ErrorCode(1_009_022_000, "BPM 表单工作流对应不存在");
ErrorCode PROCESS_KEY_NOT_PROVIDED = new ErrorCode(1_009_022_001, "工作流表单key没有提供");
// ========== BPM 流程实例信息 1_009_023_000 ==========
ErrorCode PROCESS_INSTANCE_TODO_NOT_EXISTS = new ErrorCode(1_009_023_000, "BPM 流程实例信息不存在");
}

View File

@ -99,4 +99,9 @@ public class FormProcessMappingController {
public CommonResult<String> getFormCreatePath(@RequestParam("processKey") String processKey) {
return success(formProcessMappingService.selectFormCreatePathByProcessKey(processKey));
}
@GetMapping("/get-process-key")
public CommonResult<String> selectProcessKey(@RequestParam("fullpath") String fullpath) {
return success(formProcessMappingService.selectProcessKey(fullpath));
}
}

View File

@ -34,4 +34,6 @@ public class FormProcessMappingPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "备注", example = "你说的对")
private String remark;
}

View File

@ -43,4 +43,7 @@ public class FormProcessMappingRespVO {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "备注", example = "你说的对")
@ExcelProperty("备注")
private String remark;
}

View File

@ -29,4 +29,6 @@ public class FormProcessMappingSaveReqVO {
@NotNull(message = "状态0正常 1停用不能为空")
private Integer status;
@Schema(description = "备注", example = "你说的对")
private String remark;
}

View File

@ -0,0 +1,95 @@
package cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.validation.constraints.*;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo.*;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.module.bpm.service.processinstancetodo.ProcessInstanceTodoService;
@Tag(name = "管理后台 - BPM 流程实例信息")
@RestController
@RequestMapping("/bpm/process-instance-todo")
@Validated
public class ProcessInstanceTodoController {
@Resource
private ProcessInstanceTodoService processInstanceTodoService;
@PostMapping("/create")
@Operation(summary = "创建BPM 流程实例信息")
@PreAuthorize("@ss.hasPermission('bpm:process-instance-todo:create')")
public CommonResult<Long> createProcessInstanceTodo(@Valid @RequestBody ProcessInstanceTodoSaveReqVO createReqVO) {
return success(processInstanceTodoService.createProcessInstanceTodo(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新BPM 流程实例信息")
@PreAuthorize("@ss.hasPermission('bpm:process-instance-todo:update')")
public CommonResult<Boolean> updateProcessInstanceTodo(@Valid @RequestBody ProcessInstanceTodoSaveReqVO updateReqVO) {
processInstanceTodoService.updateProcessInstanceTodo(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除BPM 流程实例信息")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('bpm:process-instance-todo:delete')")
public CommonResult<Boolean> deleteProcessInstanceTodo(@RequestParam("id") Long id) {
processInstanceTodoService.deleteProcessInstanceTodo(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得BPM 流程实例信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('bpm:process-instance-todo:query')")
public CommonResult<ProcessInstanceTodoRespVO> getProcessInstanceTodo(@RequestParam("id") Long id) {
ProcessInstanceTodoDO processInstanceTodo = processInstanceTodoService.getProcessInstanceTodo(id);
return success(BeanUtils.toBean(processInstanceTodo, ProcessInstanceTodoRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得BPM 流程实例信息分页")
@PreAuthorize("@ss.hasPermission('bpm:process-instance-todo:query')")
public CommonResult<PageResult<ProcessInstanceTodoRespVO>> getProcessInstanceTodoPage(@Valid ProcessInstanceTodoPageReqVO pageReqVO) {
PageResult<ProcessInstanceTodoDO> pageResult = processInstanceTodoService.getProcessInstanceTodoPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, ProcessInstanceTodoRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出BPM 流程实例信息 Excel")
@PreAuthorize("@ss.hasPermission('bpm:process-instance-todo:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportProcessInstanceTodoExcel(@Valid ProcessInstanceTodoPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ProcessInstanceTodoDO> list = processInstanceTodoService.getProcessInstanceTodoPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "BPM 流程实例信息.xls", "数据", ProcessInstanceTodoRespVO.class,
BeanUtils.toBean(list, ProcessInstanceTodoRespVO.class));
}
}

View File

@ -0,0 +1,49 @@
package cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - BPM 流程实例信息分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ProcessInstanceTodoPageReqVO extends PageParam {
@Schema(description = "标题")
private String title;
@Schema(description = "流程信息")
private String processKey;
@Schema(description = "流程实例id", example = "15646")
private String processInstanceId;
@Schema(description = "表单的提交路径")
private String formCustomCreatePath;
@Schema(description = "备用字段1")
private String field1;
@Schema(description = "备用字段2")
private String field2;
@Schema(description = "备用字段3")
private String field3;
@Schema(description = "状态0正常 1停用", example = "2")
private Integer status;
@Schema(description = "备注", example = "随便")
private String remark;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,59 @@
package cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - BPM 流程实例信息 Response VO")
@Data
@ExcelIgnoreUnannotated
public class ProcessInstanceTodoRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "16933")
@ExcelProperty("编号")
private Long id;
@Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("标题")
private String title;
@Schema(description = "流程信息", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("流程信息")
private String processKey;
@Schema(description = "流程实例id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15646")
@ExcelProperty("流程实例id")
private String processInstanceId;
@Schema(description = "表单的提交路径", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("表单的提交路径")
private String formCustomCreatePath;
@Schema(description = "备用字段1")
@ExcelProperty("备用字段1")
private String field1;
@Schema(description = "备用字段2")
@ExcelProperty("备用字段2")
private String field2;
@Schema(description = "备用字段3")
@ExcelProperty("备用字段3")
private String field3;
@Schema(description = "状态0正常 1停用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@ExcelProperty("状态0正常 1停用")
private Integer status;
@Schema(description = "备注", example = "随便")
@ExcelProperty("备注")
private String remark;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,47 @@
package cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
@Schema(description = "管理后台 - BPM 流程实例信息新增/修改 Request VO")
@Data
public class ProcessInstanceTodoSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "16933")
private Long id;
@Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "标题不能为空")
private String title;
@Schema(description = "流程信息", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "流程信息不能为空")
private String processKey;
@Schema(description = "流程实例id", requiredMode = Schema.RequiredMode.REQUIRED, example = "15646")
@NotEmpty(message = "流程实例id不能为空")
private String processInstanceId;
@Schema(description = "表单的提交路径", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "表单的提交路径不能为空")
private String formCustomCreatePath;
@Schema(description = "备用字段1")
private String field1;
@Schema(description = "备用字段2")
private String field2;
@Schema(description = "备用字段3")
private String field3;
@Schema(description = "状态0正常 1停用", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotNull(message = "状态0正常 1停用不能为空")
private Integer status;
@Schema(description = "备注", example = "随便")
private String remark;
}

View File

@ -11,9 +11,11 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessI
import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.bpm.service.processinstancetodo.ProcessInstanceTodoService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@ -60,6 +62,9 @@ public class BpmProcessInstanceController {
@Resource
private DeptApi deptApi;
@Resource
private ProcessInstanceTodoService todoservice;
@GetMapping("/my-page")
@Operation(summary = "获得我的实例分页列表", description = "在【我的流程】菜单中,进行调用")
@PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
@ -78,8 +83,11 @@ public class BpmProcessInstanceController {
convertSet(pageResult.getList(), HistoricProcessInstance::getProcessDefinitionId));
Map<String, BpmCategoryDO> categoryMap = categoryService.getCategoryMap(
convertSet(processDefinitionMap.values(), ProcessDefinition::getCategory));
return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePage(pageResult,
processDefinitionMap, categoryMap, taskMap, null, null));
Map<String, ProcessInstanceTodoDO> todoMap = todoservice.getTitleMap(
convertSet(pageResult.getList(), HistoricProcessInstance::getId));
return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePageNew(pageResult,
processDefinitionMap, categoryMap, taskMap,todoMap, null, null));
}
@GetMapping("/manager-page")

View File

@ -8,7 +8,9 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.cc.BpmProcessInstanceCopyRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceCopyPageReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.task.BpmProcessInstanceCopyDO;
import cn.iocoder.yudao.module.bpm.service.processinstancetodo.ProcessInstanceTodoService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceCopyService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
@ -17,6 +19,7 @@ import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@ -49,6 +52,8 @@ public class BpmProcessInstanceCopyController {
@Resource
private AdminUserApi adminUserApi;
@Resource
private ProcessInstanceTodoService todoservice;
@GetMapping("/page")
@Operation(summary = "获得抄送流程分页列表")
@PreAuthorize("@ss.hasPermission('bpm:process-instance-cc:query')")
@ -65,12 +70,15 @@ public class BpmProcessInstanceCopyController {
convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getTaskId));
Map<String, HistoricProcessInstance> processInstanceMap = processInstanceService.getHistoricProcessInstanceMap(
convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));
Map<String, ProcessInstanceTodoDO> todoMap = todoservice.getTitleMap(
convertSet(pageResult.getList(), BpmProcessInstanceCopyDO::getProcessInstanceId));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(convertListByFlatMap(pageResult.getList(),
copy -> Stream.of(copy.getStartUserId(), Long.parseLong(copy.getCreator()))));
return success(BeanUtils.toBean(pageResult, BpmProcessInstanceCopyRespVO.class, copyVO -> {
MapUtils.findAndThen(userMap, Long.valueOf(copyVO.getCreator()), user -> copyVO.setCreatorName(user.getNickname()));
MapUtils.findAndThen(userMap, copyVO.getStartUserId(), user -> copyVO.setStartUserName(user.getNickname()));
MapUtils.findAndThen(taskNameMap, copyVO.getTaskId(), copyVO::setTaskName);
MapUtils.findAndThen(todoMap,copyVO.getProcessInstanceId(), todo -> copyVO.setTitle(todo.getTitle()));
MapUtils.findAndThen(processInstanceMap, copyVO.getProcessInstanceId(),
processInstance -> copyVO.setProcessInstanceStartTime(DateUtils.of(processInstance.getStartTime())));
}));

View File

@ -7,7 +7,9 @@ import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.module.bpm.service.definition.BpmFormService;
import cn.iocoder.yudao.module.bpm.service.processinstancetodo.ProcessInstanceTodoService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.module.system.api.dept.DeptApi;
@ -56,6 +58,9 @@ public class BpmTaskController {
@Resource
private DeptApi deptApi;
@Resource
private ProcessInstanceTodoService todoservice;
@GetMapping("todo-page")
@Operation(summary = "获取 Todo 待办任务分页")
@PreAuthorize("@ss.hasPermission('bpm:task:query')")
@ -70,7 +75,10 @@ public class BpmTaskController {
convertSet(pageResult.getList(), Task::getProcessInstanceId));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap));
Map<String, ProcessInstanceTodoDO> todoMap = todoservice.getTitleMap(
convertSet(pageResult.getList(), Task::getProcessInstanceId));
return success(BpmTaskConvert.INSTANCE.buildTodoTaskPageNew(pageResult, processInstanceMap, todoMap,userMap));
}
@GetMapping("done-page")
@ -87,7 +95,9 @@ public class BpmTaskController {
convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId));
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(
convertSet(processInstanceMap.values(), instance -> Long.valueOf(instance.getStartUserId())));
return success(BpmTaskConvert.INSTANCE.buildTaskPage(pageResult, processInstanceMap, userMap, null));
Map<String, ProcessInstanceTodoDO> todoMap = todoservice.getTitleMap(
convertSet(pageResult.getList(), HistoricTaskInstance::getProcessInstanceId));
return success(BpmTaskConvert.INSTANCE.buildTaskPageNew(pageResult, processInstanceMap,todoMap,userMap, null));
}
@GetMapping("manager-page")

View File

@ -29,6 +29,8 @@ public class BpmProcessInstanceCopyRespVO {
@Schema(description = "发起抄送的任务名称")
private String taskName;
@Schema(description = "流程实例的标题")
private String title;
@Schema(description = "抄送人")
private String creator;
@Schema(description = "抄送人昵称")

View File

@ -22,6 +22,8 @@ public class BpmProcessInstanceRespVO {
private String category;
@Schema(description = "流程分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "请假")
private String categoryName;
@Schema(description = "流程实例标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "关于....")
private String title;
@Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举

View File

@ -33,6 +33,8 @@ public class BpmTaskRespVO {
@Schema(description = "审批理由", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
private String reason;
@Schema(description = "流程实例标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "关于....")
private String title;
/**
* 负责人的用户信息
*/

View File

@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmPro
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
@ -61,7 +62,33 @@ public interface BpmProcessInstanceConvert {
}
return vpPageResult;
}
default PageResult<BpmProcessInstanceRespVO> buildProcessInstancePageNew(PageResult<HistoricProcessInstance> pageResult,
Map<String, ProcessDefinition> processDefinitionMap,
Map<String, BpmCategoryDO> categoryMap,
Map<String, List<Task>> taskMap,
Map<String, ProcessInstanceTodoDO> todoMap,
Map<Long, AdminUserRespDTO> userMap,
Map<Long, DeptRespDTO> deptMap) {
PageResult<BpmProcessInstanceRespVO> vpPageResult = BeanUtils.toBean(pageResult, BpmProcessInstanceRespVO.class);
for (int i = 0; i < pageResult.getList().size(); i++) {
BpmProcessInstanceRespVO respVO = vpPageResult.getList().get(i);
respVO.setStatus(FlowableUtils.getProcessInstanceStatus(pageResult.getList().get(i)));
MapUtils.findAndThen(processDefinitionMap, respVO.getProcessDefinitionId(),
processDefinition -> respVO.setCategory(processDefinition.getCategory()));
MapUtils.findAndThen(categoryMap, respVO.getCategory(), category -> respVO.setCategoryName(category.getName()));
MapUtils.findAndThen(todoMap,respVO.getId(),todo -> respVO.setTitle(todo.getTitle()));
respVO.setTasks(BeanUtils.toBean(taskMap.get(respVO.getId()), BpmProcessInstanceRespVO.Task.class));
// user
if (userMap != null) {
AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(pageResult.getList().get(i).getStartUserId()));
if (startUser != null) {
respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName()));
}
}
}
return vpPageResult;
}
default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
ProcessDefinition processDefinition,
BpmProcessDefinitionInfoDO processDefinitionExt,

View File

@ -4,11 +4,13 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenTaskCreatedReqDTO;
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
@ -51,6 +53,21 @@ public interface BpmTaskConvert {
taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
});
}
default PageResult<BpmTaskRespVO> buildTodoTaskPageNew(PageResult<Task> pageResult,
Map<String, ProcessInstance> processInstanceMap,
Map<String, ProcessInstanceTodoDO> todoMap,
Map<Long, AdminUserRespDTO> 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));
MapUtils.findAndThen(todoMap,taskVO.getProcessInstanceId(), todo -> taskVO.setTitle(todo.getTitle()));
AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
});
}
default PageResult<BpmTaskRespVO> buildTaskPage(PageResult<HistoricTaskInstance> pageResult,
Map<String, HistoricProcessInstance> processInstanceMap,
@ -77,6 +94,34 @@ public interface BpmTaskConvert {
return new PageResult<>(taskVOList, pageResult.getTotal());
}
default PageResult<BpmTaskRespVO> buildTaskPageNew(PageResult<HistoricTaskInstance> pageResult,
Map<String, HistoricProcessInstance> processInstanceMap,
Map<String, ProcessInstanceTodoDO> todoMap,
Map<Long, AdminUserRespDTO> userMap,
Map<Long, DeptRespDTO> deptMap) {
List<BpmTaskRespVO> taskVOList = CollectionUtils.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, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, assignUser.getDeptId(), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName()));
}
//流程实例待办
MapUtils.findAndThen(todoMap,taskVO.getProcessInstanceId(), todo -> taskVO.setTitle(todo.getTitle()));
// 流程实例
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, BpmProcessInstanceRespVO.User.class));
}
return taskVO;
});
return new PageResult<>(taskVOList, pageResult.getTotal());
}
default List<BpmTaskRespVO> buildTaskListByProcessInstanceId(List<HistoricTaskInstance> taskList,
HistoricProcessInstance processInstance,
Map<Long, BpmFormDO> formMap,

View File

@ -49,5 +49,8 @@ public class FormProcessMappingDO extends BaseDO {
* 枚举 {@link TODO common_status 对应的类}
*/
private Integer status;
/**
* 备注
*/
private String remark;
}

View File

@ -0,0 +1,67 @@
package cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* BPM 流程实例信息 DO
*
* @author 君风
*/
@TableName("bpm_process_instance_todo")
@KeySequence("bpm_process_instance_todo_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ProcessInstanceTodoDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 标题
*/
private String title;
/**
* 流程信息
*/
private String processKey;
/**
* 流程实例id
*/
private String processInstanceId;
/**
* 表单的提交路径
*/
private String formCustomCreatePath;
/**
* 备用字段1
*/
private String field1;
/**
* 备用字段2
*/
private String field2;
/**
* 备用字段3
*/
private String field3;
/**
* 状态0正常 1停用
*/
private Integer status;
/**
* 备注
*/
private String remark;
}

View File

@ -34,4 +34,7 @@ public interface FormProcessMappingMapper extends BaseMapperX<FormProcessMapping
@Select("SELECT form_custom_create_path FROM bpm_form_process_mapping WHERE process_key = #{processKey}")
String selectFormCreatePathByProcessKey(@Param("processKey") String processKey);
@Select("SELECT process_key FROM bpm_form_process_mapping WHERE form_custom_create_path = #{formCustomCreatePath}")
String selectProcessKey(@Param("formCustomCreatePath") String formCustomCreatePath);
}

View File

@ -0,0 +1,42 @@
package cn.iocoder.yudao.module.bpm.dal.mysql.processinstancetodo;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo.*;
import org.apache.ibatis.annotations.Select;
import org.springframework.data.repository.query.Param;
/**
* BPM 流程实例信息 Mapper
*
* @author 君风
*/
@Mapper
public interface ProcessInstanceTodoMapper extends BaseMapperX<ProcessInstanceTodoDO> {
default PageResult<ProcessInstanceTodoDO> selectPage(ProcessInstanceTodoPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProcessInstanceTodoDO>()
.eqIfPresent(ProcessInstanceTodoDO::getTitle, reqVO.getTitle())
.eqIfPresent(ProcessInstanceTodoDO::getProcessKey, reqVO.getProcessKey())
.eqIfPresent(ProcessInstanceTodoDO::getProcessInstanceId, reqVO.getProcessInstanceId())
.eqIfPresent(ProcessInstanceTodoDO::getFormCustomCreatePath, reqVO.getFormCustomCreatePath())
.eqIfPresent(ProcessInstanceTodoDO::getField1, reqVO.getField1())
.eqIfPresent(ProcessInstanceTodoDO::getField2, reqVO.getField2())
.eqIfPresent(ProcessInstanceTodoDO::getField3, reqVO.getField3())
.eqIfPresent(ProcessInstanceTodoDO::getStatus, reqVO.getStatus())
.eqIfPresent(ProcessInstanceTodoDO::getRemark, reqVO.getRemark())
.betweenIfPresent(ProcessInstanceTodoDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(ProcessInstanceTodoDO::getId));
}
default List<ProcessInstanceTodoDO> selectListByProcessinstandid(Collection<String> proccessinstandids) {
return selectList(ProcessInstanceTodoDO::getProcessInstanceId, proccessinstandids);
}
}

View File

@ -52,17 +52,24 @@ public interface FormProcessMappingService {
*/
PageResult<FormProcessMappingDO> getFormProcessMappingPage(FormProcessMappingPageReqVO pageReqVO);
/**
* 通过 processKey 查询 formViewPath
* 通过 processKey 查询 formCustomViewPath
*
* @param processKey 流程信息的键
* @return formCustomViewPath 表单的提交路径
* @return formCustomViewPath 表单的查看路径
*/
String selectFormViewPathByProcessKey(String processKey);
/**
* 通过 processKey 查询 formViewPath
* 通过 processKey 查询 formCustomCreatePath
*
* @param processKey 流程信息的键
* @return formCustomCreatePath 表单的提交路径
*/
String selectFormCreatePathByProcessKey(String processKey);
/**
* 通过 formCustomCreatePath 查询 processKey
*
* @param formCustomCreatePath 表单的提交路径
* @return ProcessKey 流程信息的键
*/
String selectProcessKey(String formCustomCreatePath);
}

View File

@ -92,4 +92,16 @@ public class FormProcessMappingServiceImpl implements FormProcessMappingService
}
return formCustomViewPath;
}
@Override
public String selectProcessKey(String formCustomCreatePath) {
if (StringUtils.isBlank(formCustomCreatePath)) {
throw exception(PROCESS_KEY_NOT_PROVIDED); // 可自定义异常
}
String processKey= formProcessMappingMapper.selectProcessKey(formCustomCreatePath);
if (processKey == null) {
throw exception(FORM_PROCESS_MAPPING_NOT_EXISTS); // 如果不存在对应记录
}
return processKey;
}
}

View File

@ -4,6 +4,9 @@ import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.util.elasticsearch.KmsSearchDto;
import cn.iocoder.yudao.module.bpm.api.task.BpmProcessInstanceApi;
import cn.iocoder.yudao.module.bpm.api.task.dto.BpmProcessInstanceCreateReqDTO;
import cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo.ProcessInstanceTodoSaveReqVO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.module.bpm.dal.mysql.processinstancetodo.ProcessInstanceTodoMapper;
import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
import cn.iocoder.yudao.module.infra.service.config.ConfigService;
@ -56,12 +59,15 @@ public class KnowledgeServiceImpl implements KnowledgeService {
@Resource
private BpmProcessInstanceApi processInstanceApi;
private boolean isEsFlag = true;
private boolean isEsFlag = false;
private String indexName = "knows_index";
@Resource
private ConfigService configService;
@Resource
private ProcessInstanceTodoMapper processInstanceTodoMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Long createKnowledge(Long userId,KnowledgeSaveReqVO createReqVO){
@ -82,6 +88,14 @@ public class KnowledgeServiceImpl implements KnowledgeService {
// 将工作流的编号更新到 OA 请假单中
knowledgeMapper.updateById(new KnowledgeDO().setId(knowledge.getId()).setProcessInstanceId(processInstanceId));
//同步更新流程待办库
ProcessInstanceTodoDO todo = new ProcessInstanceTodoDO();
todo.setTitle( createReqVO.getKnowTitle() );
todo.setProcessKey( PROCESS_KEY );
todo.setProcessInstanceId( processInstanceId );
todo.setStatus( 0 );
processInstanceTodoMapper.insert(todo);
try {
if (isEsFlag){
EsearchUtils.initialize(configService.getConfigByKey("esearch.ip").getValue() );
@ -103,6 +117,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
// 更新
KnowledgeDO updateObj = BeanUtils.toBean(updateReqVO, KnowledgeDO.class);
knowledgeMapper.updateById(updateObj);
if (isEsFlag){
EsearchUtils.initialize(configService.getConfigByKey("esearch.ip").getValue() );
EsearchUtils.updateIndex(updateReqVO.getId(),updateReqVO,indexName);
@ -198,61 +213,4 @@ public class KnowledgeServiceImpl implements KnowledgeService {
knowledgeMapper.updateById(new KnowledgeDO().setId(id).setFlowStatus(status));
}
// public List<KnowledgeDO> selectForEs(KmsSearchDto kmsSearchDto) {
// kmsSearchDto.setSearchKey("knowTitle");
// // 1.创建并设置SearchSourceBuilder对象
// SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
// // 2.创建BoolQueryBuilder对象
// BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
// // 3.设置boolQueryBuilder条件
// //MatchPhraseQueryBuilder matchPhraseQueryBuilder = QueryBuilders.matchPhraseQuery(kmsSearchDto.getSearchKey(), kmsSearchDto.getSearchValue());
// // 4.添加查询条件到boolQueryBuilder中
// //boolQueryBuilder.must(matchPhraseQueryBuilder);
// if("1".equals(kmsSearchDto.getSearchBy())) {
// boolQueryBuilder.should(QueryBuilders.termsQuery(kmsSearchDto.getSearchKey(), kmsSearchDto.getSearchValue()));
// }
// else if("2".equals(kmsSearchDto.getSearchBy())) {
// boolQueryBuilder.should(QueryBuilders.wildcardQuery(kmsSearchDto.getSearchKey(), "*" + kmsSearchDto.getSearchValue() + "*"));
// }
// // 查询条件--->生成DSL查询语句
// searchSourceBuilder.query(boolQueryBuilder);
// Integer pageNum = 1;
// Integer pageSize = kmsSearchDto.getPageSize();
// // 第几页
// searchSourceBuilder.from((pageNum - 1) * pageSize);
// // 每页多少条数据
// searchSourceBuilder.size(pageSize);
// // 设置排序规则
// String sortBy = kmsSearchDto.getSortBy();
// SortOrder sortType = kmsSearchDto.getSortType().equals("1") ? SortOrder.DESC : SortOrder.ASC;
// //searchSourceBuilder.sort(sortBy, sortType);
// System.out.println("sortBy="+sortBy);
// System.out.println(sortType);
//// searchSourceBuilder.sort(
//// SortBuilders.fieldSort("createTime")
//// .unmappedType("date")
//// .order(SortOrder.DESC)
//// );
//
// SearchRequest searchRequest = new SearchRequest("knows_index");
// searchRequest.source(searchSourceBuilder);
// //返回信息
// List<KnowledgeDO> rsList = Lists.newArrayList();
// try {
// SearchResponse response = esClient.search(searchRequest, RequestOptions.DEFAULT);
// //解析搜索结果
// for (SearchHit sh : response.getHits()) {
// Map<String, Object> sourceAsMap = sh.getSourceAsMap();
// /*for (Map.Entry<String, Object> stringObjectEntry : sourceAsMap.entrySet()) {
// System.out.println(sourceAsMap.get(stringObjectEntry.getKey()));
// }*/
// System.out.println("111111");
// KnowledgeDO main = JSON.parseObject(JSON.toJSONString(sourceAsMap), KnowledgeDO.class);
// rsList.add(main);
// }
// } catch (IOException e) {
// e.printStackTrace();
// }
// return rsList;
// }
}

View File

@ -0,0 +1,73 @@
package cn.iocoder.yudao.module.bpm.service.processinstancetodo;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo.*;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
/**
* BPM 流程实例信息 Service 接口
*
* @author 君风
*/
public interface ProcessInstanceTodoService {
/**
* 创建BPM 流程实例信息
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createProcessInstanceTodo(@Valid ProcessInstanceTodoSaveReqVO createReqVO);
/**
* 更新BPM 流程实例信息
*
* @param updateReqVO 更新信息
*/
void updateProcessInstanceTodo(@Valid ProcessInstanceTodoSaveReqVO updateReqVO);
/**
* 删除BPM 流程实例信息
*
* @param id 编号
*/
void deleteProcessInstanceTodo(Long id);
/**
* 获得流程实体标题 Map基于指定流程实例id
*
* @param ids 编号数组
* @return 流程分类 Map
*/
default Map<String, ProcessInstanceTodoDO> getTitleMap(Collection<String> ids) {
return convertMap(getTitleListByProcessinstandid(ids), ProcessInstanceTodoDO::getProcessInstanceId);
}
/**
* 获得流程实例标题基于指定流程实例id
*
* @return 流程分类列表
*/
public List<ProcessInstanceTodoDO> getTitleListByProcessinstandid(Collection<String> ids);
/**
* 获得BPM 流程实例信息
*
* @param id 编号
* @return BPM 流程实例信息
*/
ProcessInstanceTodoDO getProcessInstanceTodo(Long id);
/**
* 获得BPM 流程实例信息分页
*
* @param pageReqVO 分页查询
* @return BPM 流程实例信息分页
*/
PageResult<ProcessInstanceTodoDO> getProcessInstanceTodoPage(ProcessInstanceTodoPageReqVO pageReqVO);
}

View File

@ -0,0 +1,84 @@
package cn.iocoder.yudao.module.bpm.service.processinstancetodo;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import cn.iocoder.yudao.module.bpm.controller.admin.processinstancetodo.vo.*;
import cn.iocoder.yudao.module.bpm.dal.dataobject.processinstancetodo.ProcessInstanceTodoDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.bpm.dal.mysql.processinstancetodo.ProcessInstanceTodoMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
/**
* BPM 流程实例信息 Service 实现类
*
* @author 君风
*/
@Service
@Validated
public class ProcessInstanceTodoServiceImpl implements ProcessInstanceTodoService {
@Resource
private ProcessInstanceTodoMapper processInstanceTodoMapper;
@Override
public Long createProcessInstanceTodo(ProcessInstanceTodoSaveReqVO createReqVO) {
// 插入
ProcessInstanceTodoDO processInstanceTodo = BeanUtils.toBean(createReqVO, ProcessInstanceTodoDO.class);
processInstanceTodoMapper.insert(processInstanceTodo);
// 返回
return processInstanceTodo.getId();
}
@Override
public void updateProcessInstanceTodo(ProcessInstanceTodoSaveReqVO updateReqVO) {
// 校验存在
validateProcessInstanceTodoExists(updateReqVO.getId());
// 更新
ProcessInstanceTodoDO updateObj = BeanUtils.toBean(updateReqVO, ProcessInstanceTodoDO.class);
processInstanceTodoMapper.updateById(updateObj);
}
@Override
public void deleteProcessInstanceTodo(Long id) {
// 校验存在
validateProcessInstanceTodoExists(id);
// 删除
processInstanceTodoMapper.deleteById(id);
}
private void validateProcessInstanceTodoExists(Long id) {
if (processInstanceTodoMapper.selectById(id) == null) {
throw exception(PROCESS_INSTANCE_TODO_NOT_EXISTS);
}
}
@Override
public ProcessInstanceTodoDO getProcessInstanceTodo(Long id) {
return processInstanceTodoMapper.selectById(id);
}
@Override
public PageResult<ProcessInstanceTodoDO> getProcessInstanceTodoPage(ProcessInstanceTodoPageReqVO pageReqVO) {
return processInstanceTodoMapper.selectPage(pageReqVO);
}
@Override
public List<ProcessInstanceTodoDO> getTitleListByProcessinstandid(Collection<String> ids) {
if (CollUtil.isEmpty(ids)) {
return Collections.emptyList();
}
return processInstanceTodoMapper.selectListByProcessinstandid(ids);
}
}