package org.springblade.mdm.flow.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.mail.MessagingException; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.TaskService; import org.flowable.engine.task.Comment; import org.flowable.task.api.history.HistoricTaskInstance; import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.UrlUtil; import org.springblade.mdm.flow.service.*; import org.springblade.mdm.flow.vo.FlowVO; import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO; import org.springblade.mdm.flow.vo.TaskTraceVO; import org.springblade.system.feign.IUserClient; import org.springblade.system.pojo.entity.User; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; @Slf4j @RestController @RequestMapping("/flow/mgr") @Tag(name = "流程管理", description = "流程管理") public class FlowMgrController { @Autowired private TaskService taskService; @Autowired private FlowBusinessService businessService; @Autowired private FlowCommonService flowCommonService; @Autowired private HistoryService historyService; @Autowired private ProgramConfirmTableService programConfirmTableService; @Autowired private IUserClient userClient; @Autowired private WIthdrawService withdrawService; @GetMapping("overtime-list") @ApiOperationSupport(order = 3) @Operation(summary = "超时查询", description = "查询所有超时任务") public R> overtimeList(@Parameter(description = "任务到达时间开始") LocalDate createTimeBegin, @Parameter(description = "任务到达时间截止")LocalDate createTimeEnd, @Parameter(description = "执行人员") String assigneeName, @Parameter(description = "关键字") String keyword, Query query) { IPage pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword); return R.data(pages); } @GetMapping("overtime-export") @ApiOperationSupport(order = 3) @Operation(summary = "超时导出", description = "超时任务导出") public void overtimeExport(@Parameter(description = "任务到达时间开始") LocalDate createTimeBegin, @Parameter(description = "任务到达时间截止")LocalDate createTimeEnd, @Parameter(description = "执行人员") String assigneeName, @Parameter(description = "关键字") String keyword, Query query, HttpServletResponse response) { query.setCurrent(1); query.setSize(Integer.MAX_VALUE); IPage pages = businessService.selectOvertimePage(Condition.getPage(query), createTimeBegin,createTimeEnd,assigneeName,keyword); List list = new ArrayList<>(); pages.getRecords().forEach(data ->{ //data.get OvertimeTaskExcelVO excelVO = new OvertimeTaskExcelVO(); BeanUtils.copyProperties(data, excelVO); list.add(excelVO); }); ExcelUtil.export(response, "超时任务" + DateUtil.time(), "超时任务表", list, OvertimeTaskExcelVO.class); } @Operation(summary = "流程执行轨迹", description = "流程执行轨迹/审批记录") @GetMapping("process-trace") public R> processTrace(String processInstanceId){ /* List records = approveRecordService.lambdaQuery().eq(ApproveRecord::getProcessInstanceId,processInstanceId).orderByAsc(ApproveRecord::getCreateTime).list(); List result = new ArrayList<>(); for (ApproveRecord record : records) { TaskTraceVO vo = new TaskTraceVO(); vo.setComment(record.getComment()); vo.setCreateTime(record.getCreateTime()); vo.setAssigneeName(record.getUserNickname()); //vo.setEndTime(); }*/ List result = new ArrayList<>(); List hisTasks = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId).orderByTaskCreateTime().desc().list(); // 批注信息 List comments; for (HistoricTaskInstance hisTask : hisTasks) { TaskTraceVO vo = new TaskTraceVO(); BeanUtils.copyProperties(hisTask, vo); comments = taskService.getTaskComments(hisTask.getId()); if(!comments.isEmpty()) { vo.setComment(comments.get(0).getFullMessage()); } vo.setTaskName(hisTask.getName()); R assigneeObj = userClient.userInfoById(Func.toLong(hisTask.getAssignee())); if(assigneeObj.isSuccess()) { vo.setAssigneeName(assigneeObj.getData().getName()); } result.add(vo); } return R.data(result); } @GetMapping("search-list") @ApiOperationSupport(order = 3) @Operation(summary = "流程查询", description = "查询进行中的所有流程") public R> searchList(@Parameter(description = "流程名称")String myProcessName, @Parameter(description = "流程时间开始") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDate createTimeBegin, @Parameter(description = "流程创建时间截止")@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")LocalDate createTimeEnd, @Parameter(description = "关键字") String keyword, Query query) { IPage pages = businessService.selectSearchPage(Condition.getPage(query),myProcessName,keyword, createTimeBegin,createTimeEnd); return R.data(pages); } @GetMapping("finished-list") @ApiOperationSupport(order = 3) @Operation(summary = "历史流程查询", description = "查询已完结的所有流程") public R> finishedList(@Parameter(description = "流程名称")String myProcessName, @Parameter(description = "流程创建时间开始") LocalDateTime createTimeBegin, @Parameter(description = "流程创建时间截止") LocalDateTime createTimeEnd, @Parameter(description = "关键字") String keyword, Query query) { IPage pages = businessService.selectFinishedPage(Condition.getPage(query), myProcessName,keyword,createTimeBegin,createTimeEnd); return R.data(pages); } @GetMapping("exception-list") @ApiOperationSupport(order = 3) @Operation(summary = "异常流程查询", description = "查询已完结的,异常流程") public R> exceptionList(@Parameter(description = "流程名称")String myProcessName, @Parameter(description = "流程创建时间开始") LocalDateTime createTimeBegin, @Parameter(description = "流程创建时间截止") LocalDateTime createTimeEnd, @Parameter(description = "关键字") String keyword, Query query) { IPage pages = businessService.selectExceptionPage(Condition.getPage(query), myProcessName,keyword,createTimeBegin,createTimeEnd); return R.data(pages); } @PostMapping("delete-instance") @Operation(summary = "流程删除", description = "删除id指定的流程实例") public R deleteInstance(@Parameter(description = "任务到达时间开始") String processInstanceId) { try { businessService.deleteProcessInstance(processInstanceId); } catch (Exception e) { log.error("删除流程失败",e); return R.fail(e.getMessage()); } return R.success(); } @PostMapping("/export-confirm-table") @Operation(summary = "导出确认表", description = "导出数控程序确认表pdf") public void exportConfirmTable(String processInstanceId, HttpServletResponse response) { try { FlowProgramProperties props = flowCommonService.getProgramPropertiesFromHis(processInstanceId); String progName = props.getDrawingNo()+"-"+props.getProcessNo()+"-"+props.getProcessEdition(); String filename = UrlUtil.encode("数控程序确认表"+progName)+".pdf"; response.setHeader("Content-Disposition", "attachment; filename="+filename); response.setContentType("application/octet-stream"); programConfirmTableService.exportConfirmTable(props,response.getOutputStream()); } catch (Exception e) { log.error("导出数控程序确认表pdf异常", e); throw new RuntimeException(e); } } @GetMapping("/withdraw") @Operation(summary = "撤回任务", description = "从其他任务节点直接撤回编程员节点") public R withdraw(String processInstanceId) { try { withdrawService.withdraw(processInstanceId); return R.success(); }catch(Exception e) { log.error("", e); return R.fail(e.getMessage()); } } }