瀏覽代碼

新增标准流程消息体

wangliang 2 年之前
父節點
當前提交
d0f170d730
共有 39 個文件被更改,包括 1152 次插入97 次删除
  1. 50 7
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/listener/ProcessEventListener.java
  2. 73 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/BaseFlowData.java
  3. 59 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/FlowMsgDto.java
  4. 47 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/HandleMessageDto.java
  5. 139 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowData.java
  6. 18 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowDoneMsg.java
  7. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowViewMsg.java
  8. 16 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowWorkMsg.java
  9. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowTaskResult.java
  10. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowViewResult.java
  11. 12 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TFFlowLogResult.java
  12. 2 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TFFlowViewLogResult.java
  13. 2 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/WorkResult.java
  14. 18 3
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowLog.java
  15. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java
  16. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFCustomFlowMapper.java
  17. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFFlowLogMapper.java
  18. 52 1
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java
  19. 1 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskDetailService.java
  20. 15 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java
  21. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFCustomFlowService.java
  22. 9 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFFlowLogService.java
  23. 183 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java
  24. 10 2
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java
  25. 51 22
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java
  26. 6 0
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFCustomFlowServiceImpl.java
  27. 12 10
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFFlowLogServiceImpl.java
  28. 61 0
      distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml
  29. 12 0
      distributed-print-business/src/main/resources/mapper/TFCustomFlowMapper.xml
  30. 52 0
      distributed-print-business/src/main/resources/mapper/TFFlowLogMapper.xml
  31. 55 11
      distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java
  32. 22 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/SysAdminSetController.java
  33. 5 2
      distributed-print/src/main/java/com/qmth/distributed/print/api/TFCustomFlowController.java
  34. 10 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  35. 25 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowMsgTypeEnum.java
  36. 5 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/MqTagEnum.java
  37. 4 4
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TFCustomTypeEnum.java
  38. 6 4
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisListenerConfig.java
  39. 54 12
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisMessageListener.java

+ 50 - 7
distributed-print-business/src/main/java/com/qmth/distributed/print/business/activiti/custom/listener/ProcessEventListener.java

@@ -4,9 +4,9 @@ import com.google.gson.Gson;
 import com.qmth.distributed.print.business.bean.flow.CustomFlowVarDto;
 import com.qmth.distributed.print.business.bean.result.FlowTaskResult;
 import com.qmth.distributed.print.business.entity.ExamTask;
+import com.qmth.distributed.print.business.entity.TFFlowApprove;
 import com.qmth.distributed.print.business.entity.TFFlowLog;
 import com.qmth.distributed.print.business.enums.CustomFlowMultipleUserApproveTypeEnum;
-import com.qmth.teachcloud.common.enums.MessageEnum;
 import com.qmth.distributed.print.business.service.ActivitiService;
 import com.qmth.distributed.print.business.service.BasicMessageService;
 import com.qmth.distributed.print.business.service.PrintCommonService;
@@ -16,8 +16,10 @@ import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import com.qmth.teachcloud.common.enums.MessageEnum;
 import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
 import com.qmth.teachcloud.common.service.SysUserService;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import org.activiti.engine.HistoryService;
 import org.activiti.engine.TaskService;
 import org.activiti.engine.delegate.event.ActivitiEvent;
@@ -47,13 +49,16 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
 
     @Override
     public void onEvent(ActivitiEvent event) {
+        TFFlowLog tfFlowLog = null;
+        TFFlowApprove tfFlowApprove = null;
         switch (event.getType()) {
             case PROCESS_STARTED:
                 // 流程启动
-//                log.info("流程启动_PROCESS_STARTED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                log.info("流程启动_PROCESS_STARTED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
                 BasicMessageService basicMessageService = SpringContextHolder.getBean(BasicMessageService.class);
                 ActivitiProcessStartedEvent activitiProcessStartedEvent = (ActivitiProcessStartedEvent) event;
                 Map<String, Object> map = activitiProcessStartedEvent.getVariables();
+
                 Long objectId = (Long) map.get(SystemConstant.OBJECT_ID);
                 TFCustomTypeEnum flowType = (TFCustomTypeEnum) map.get(SystemConstant.FLOW_TYPE);
                 Object o = map.get(SystemConstant.OBJECT_DATA);
@@ -67,19 +72,27 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
                 break;
             case PROCESS_COMPLETED:
                 // 流程结束
-//                log.info("流程结束_PROCESS_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                log.info("流程结束_PROCESS_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
                 HistoryService historyService = SpringContextHolder.getBean(HistoryService.class);
                 SysUserService sysUserService = SpringContextHolder.getBean(SysUserService.class);
+                ActivitiService activitiService = SpringContextHolder.getBean(ActivitiService.class);
                 PrintCommonService printCommonService = SpringContextHolder.getBean(PrintCommonService.class);
 
                 List<HistoricVariableInstance> historicVariableInstanceList = historyService.createHistoricVariableInstanceQuery().processInstanceId(event.getProcessInstanceId()).list();
                 if (Objects.nonNull(historicVariableInstanceList) && historicVariableInstanceList.size() > 0) {
-                    TFFlowLog tfFlowLog = null;
+                    tfFlowLog = null;
+                    tfFlowApprove = null;
                     Object object = null;
                     for (HistoricVariableInstance h : historicVariableInstanceList) {
+                        if (Objects.equals(h.getVariableName(), SystemConstant.APPROVE_TF_FLOW_APPROVE)) {
+                            tfFlowApprove = (TFFlowApprove) h.getValue();
+                            Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程流转记录为空"));
+                            log.info("tfFlowApprove.getStatus():{}", tfFlowApprove.getStatus());
+                        }
                         if (Objects.equals(h.getVariableName(), SystemConstant.APPROVE_TF_FLOW_LOG)) {
                             tfFlowLog = (TFFlowLog) h.getValue();
                             Optional.ofNullable(tfFlowLog).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批日志为空"));
+                            log.info("tfFlowLog.getApproveOperation():{}", tfFlowLog.getApproveOperation());
                         } else if (Objects.equals(h.getVariableName(), SystemConstant.OBJECT_DATA)) {
                             object = h.getValue();
                             Optional.ofNullable(object).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("实体数据为空"));
@@ -103,16 +116,23 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
                 break;
             case TASK_COMPLETED:
                 // 任务被完成了。它会在ENTITY_DELETE事件之前触发。当任务是流程一部分时,事件会在流程继续运行之前, 后续事件将是ACTIVITY_COMPLETE,对应着完成任务的节点。
-//                log.info("流程任务完成_TASK_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                log.info("流程任务完成_TASK_COMPLETED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
                 TaskService taskService = SpringContextHolder.getBean(TaskService.class);
                 sysUserService = SpringContextHolder.getBean(SysUserService.class);
                 basicMessageService = SpringContextHolder.getBean(BasicMessageService.class);
-                ActivitiService activitiService = SpringContextHolder.getBean(ActivitiService.class);
+                activitiService = SpringContextHolder.getBean(ActivitiService.class);
+                RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
 
                 Task task = taskService.createTaskQuery().executionId(event.getExecutionId()).singleResult();
                 if (Objects.nonNull(task)) {
-                    TFFlowLog tfFlowLog = (TFFlowLog) taskService.getVariable(task.getId(), SystemConstant.APPROVE_TF_FLOW_LOG);
+                    tfFlowLog = (TFFlowLog) taskService.getVariable(task.getId(), SystemConstant.APPROVE_TF_FLOW_LOG);
                     Optional.ofNullable(tfFlowLog).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批日志为空"));
+
+                    tfFlowApprove = (TFFlowApprove) taskService.getVariable(task.getId(), SystemConstant.APPROVE_TF_FLOW_APPROVE);
+                    Optional.ofNullable(tfFlowApprove).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程流转记录为空"));
+
+                    log.info("tfFlowLog.getApproveOperation():{}", tfFlowLog.getApproveOperation());
+                    log.info("tfFlowApprove.getStatus():{}", tfFlowApprove.getStatus());
                     o = taskService.getVariable(task.getId(), SystemConstant.OBJECT_DATA);
                     Optional.ofNullable(o).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("实体数据为空"));
                     Map<String, CustomFlowVarDto> agginessMap = (Map<String, CustomFlowVarDto>) taskService.getVariable(task.getId(), SystemConstant.AGGINESS_MAP);
@@ -179,6 +199,29 @@ public class ProcessEventListener implements ActivitiEventListener, Serializable
                     }
                 }
                 break;
+            case TASK_ASSIGNED:
+                log.info("流程分配人员_TASK_ASSIGNED:ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
+                taskService = SpringContextHolder.getBean(TaskService.class);
+                activitiService = SpringContextHolder.getBean(ActivitiService.class);
+                redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+
+                Task taskAssigen = taskService.createTaskQuery().executionId(event.getExecutionId()).singleResult();
+                if (Objects.nonNull(taskAssigen)) {
+                    tfFlowLog = (TFFlowLog) taskService.getVariable(taskAssigen.getId(), SystemConstant.APPROVE_TF_FLOW_LOG);
+                    Optional.ofNullable(tfFlowLog).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("流程审批日志为空"));
+                    log.info("tfFlowLog.getApproveOperation():{}", tfFlowLog.getApproveOperation());
+//                    if (tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.EXCHANGE) {
+//                        FlowMsgDto flowMsgDto = activitiService.getFlowMsgData(tfFlowLog.getSchoolId());
+//                        if (Objects.nonNull(flowMsgDto.getOpenFlowMsgPush()) && flowMsgDto.getOpenFlowMsgPush()) {
+//                            Map<String, Object> mapVar = new HashMap<>();
+//                            mapVar.put(SystemConstant.SCHOOL_ID, tfFlowLog.getSchoolId());
+//                            mapVar.put(SystemConstant.APPROVE_OPERATION, tfFlowLog.getApproveOperation());
+//                            MqDto mqDto = new MqDto(MqTagEnum.FLOW_MQ_WORK.getCode(), tfFlowLog.getSchoolId(), String.valueOf(tfFlowLog.getFlowId()));
+//                            redisUtil.sendMessage(mqDto.getTopic(), mqDto);
+//                        }
+//                    }
+                }
+                break;
             default:
 //                log.info("default->type:{},ProcessInstanceId:{},ExecutionId:{},ProcessDefinitionId:{}", event.getType(), event.getProcessInstanceId(), event.getExecutionId(), event.getProcessDefinitionId());
                 break;

+ 73 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/BaseFlowData.java

@@ -0,0 +1,73 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import com.qmth.teachcloud.common.enums.FlowMsgTypeEnum;
+import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 基础流程信息
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+public class BaseFlowData implements Serializable {
+
+    @ApiModelProperty(value = "流程类型")
+    TFCustomTypeEnum flowType;
+
+    @ApiModelProperty(value = "流程操作")
+    FlowApproveOperationEnum flowOperation;
+
+    @ApiModelProperty(value = "消息类型")
+    FlowMsgTypeEnum messageType;
+
+    @ApiModelProperty(value = "待办链接")
+    String url;
+
+    @ApiModelProperty(value = "移动待办链接")
+    String mobileUrl;
+
+    public FlowMsgTypeEnum getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(FlowMsgTypeEnum messageType) {
+        this.messageType = messageType;
+    }
+
+    public TFCustomTypeEnum getFlowType() {
+        return flowType;
+    }
+
+    public void setFlowType(TFCustomTypeEnum flowType) {
+        this.flowType = flowType;
+    }
+
+    public FlowApproveOperationEnum getFlowOperation() {
+        return flowOperation;
+    }
+
+    public void setFlowOperation(FlowApproveOperationEnum flowOperation) {
+        this.flowOperation = flowOperation;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getMobileUrl() {
+        return mobileUrl;
+    }
+
+    public void setMobileUrl(String mobileUrl) {
+        this.mobileUrl = mobileUrl;
+    }
+}

+ 59 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/FlowMsgDto.java

@@ -0,0 +1,59 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.qmth.teachcloud.common.enums.FlowMsgTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 流程消息dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+public class FlowMsgDto implements Serializable {
+
+    @ApiModelProperty(value = "是否开启消息推送")
+    Boolean openFlowMsgPush;
+
+    @ApiModelProperty(value = "消息类型")
+    FlowMsgTypeEnum flowMsgType;
+
+    @ApiModelProperty(value = "消息中心地址")
+    String mqHostUrl;
+
+    public FlowMsgDto() {
+
+    }
+
+    public FlowMsgDto(Boolean openFlowMsgPush, FlowMsgTypeEnum flowMsgType, String mqHostUrl) {
+        this.openFlowMsgPush = openFlowMsgPush;
+        this.flowMsgType = flowMsgType;
+        this.mqHostUrl = mqHostUrl;
+    }
+
+    public Boolean getOpenFlowMsgPush() {
+        return openFlowMsgPush;
+    }
+
+    public void setOpenFlowMsgPush(Boolean openFlowMsgPush) {
+        this.openFlowMsgPush = openFlowMsgPush;
+    }
+
+    public FlowMsgTypeEnum getFlowMsgType() {
+        return flowMsgType;
+    }
+
+    public void setFlowMsgType(FlowMsgTypeEnum flowMsgType) {
+        this.flowMsgType = flowMsgType;
+    }
+
+    public String getMqHostUrl() {
+        return mqHostUrl;
+    }
+
+    public void setMqHostUrl(String mqHostUrl) {
+        this.mqHostUrl = mqHostUrl;
+    }
+}

+ 47 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/HandleMessageDto.java

@@ -0,0 +1,47 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @Description: 流程消息dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+public class HandleMessageDto implements Serializable {
+
+    @ApiModelProperty(value = "待办消息")
+    List<StandardFlowWorkMsg> standardFlowWorkMsgList;
+
+    @ApiModelProperty(value = "消息详情")
+    StandardFlowViewMsg standardFlowViewMsg;
+
+    public HandleMessageDto() {
+
+    }
+
+    public HandleMessageDto(List<StandardFlowWorkMsg> standardFlowWorkMsgList, StandardFlowViewMsg standardFlowViewMsg) {
+        this.standardFlowWorkMsgList = standardFlowWorkMsgList;
+        this.standardFlowViewMsg = standardFlowViewMsg;
+    }
+
+    public List<StandardFlowWorkMsg> getStandardFlowWorkMsgList() {
+        return standardFlowWorkMsgList;
+    }
+
+    public void setStandardFlowWorkMsgList(List<StandardFlowWorkMsg> standardFlowWorkMsgList) {
+        this.standardFlowWorkMsgList = standardFlowWorkMsgList;
+    }
+
+    public StandardFlowViewMsg getStandardFlowViewMsg() {
+        return standardFlowViewMsg;
+    }
+
+    public void setStandardFlowViewMsg(StandardFlowViewMsg standardFlowViewMsg) {
+        this.standardFlowViewMsg = standardFlowViewMsg;
+    }
+}

+ 139 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowData.java

@@ -0,0 +1,139 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.base.BaseEntity;
+import com.qmth.teachcloud.common.enums.TFCustomModelTypeEnum;
+import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 流程基础消息dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StandardFlowData extends BaseEntity implements Serializable {
+
+    @ApiModelProperty(value = "学校id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long schoolId;
+
+    @ApiModelProperty(value = "机构id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    @TableField(value = "org_id", updateStrategy = FieldStrategy.IGNORED)
+    private Long orgId;
+
+    @ApiModelProperty(value = "流程名称")
+    private String name;
+
+    @ApiModelProperty(value = "模式类型,USER_FIXED:指定人员,APPROVE_SET:发起人指定")
+    private TFCustomModelTypeEnum modelType;
+
+    @ApiModelProperty(value = "流程类型,ELECTRON_FLOW:电子交卷审核,QUESTION_ELECTRON_FLOW:题库试题提交审核,PAPER_ELECTRON_FLOW:题库试卷审核")
+    private TFCustomTypeEnum type;
+
+    @ApiModelProperty(value = "是否启用,0:停用,1:启用")
+    @TableField(value = "enable", updateStrategy = FieldStrategy.IGNORED)
+    private Boolean enable;
+
+    @ApiModelProperty(value = "是否发布,0:否,1:是")
+    @TableField(value = "publish", updateStrategy = FieldStrategy.IGNORED)
+    private Boolean publish;
+
+    @ApiModelProperty(value = "自定义流程源数据")
+    private String objectData;
+
+    @ApiModelProperty(value = "版本号")
+    private Integer version;
+
+    @ApiModelProperty(value = "最后更新人")
+    private String updateName;
+
+    public String getUpdateName() {
+        return updateName;
+    }
+
+    public void setUpdateName(String updateName) {
+        this.updateName = updateName;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getOrgId() {
+        return orgId;
+    }
+
+    public void setOrgId(Long orgId) {
+        this.orgId = orgId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public TFCustomModelTypeEnum getModelType() {
+        return modelType;
+    }
+
+    public void setModelType(TFCustomModelTypeEnum modelType) {
+        this.modelType = modelType;
+    }
+
+    public TFCustomTypeEnum getType() {
+        return type;
+    }
+
+    public void setType(TFCustomTypeEnum type) {
+        this.type = type;
+    }
+
+    public Boolean getEnable() {
+        return enable;
+    }
+
+    public void setEnable(Boolean enable) {
+        this.enable = enable;
+    }
+
+    public Boolean getPublish() {
+        return publish;
+    }
+
+    public void setPublish(Boolean publish) {
+        this.publish = publish;
+    }
+
+    public String getObjectData() {
+        return objectData;
+    }
+
+    public void setObjectData(String objectData) {
+        this.objectData = objectData;
+    }
+
+    public Integer getVersion() {
+        return version;
+    }
+
+    public void setVersion(Integer version) {
+        this.version = version;
+    }
+}

+ 18 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowDoneMsg.java

@@ -0,0 +1,18 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.qmth.distributed.print.business.bean.result.TFFlowViewLogResult;
+
+import java.io.Serializable;
+
+/**
+ * @Description: 流程已办消息dto
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StandardFlowDoneMsg extends TFFlowViewLogResult implements Serializable {
+
+}

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowViewMsg.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.qmth.distributed.print.business.bean.result.FlowViewResult;
+
+/**
+ * @Description: 标准流程详情消息
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StandardFlowViewMsg extends FlowViewResult {
+
+}

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/flow/dto/StandardFlowWorkMsg.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.bean.flow.dto;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.qmth.distributed.print.business.bean.result.WorkResult;
+
+/**
+ * @Description: 标准流程工作台消息
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class StandardFlowWorkMsg extends WorkResult {
+
+}

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowTaskResult.java

@@ -58,6 +58,18 @@ public class FlowTaskResult implements Serializable {
     @ApiModelProperty(value = "自定义流程发起人指定审批角色列表")
     List<CustomFlowApproveRoleDto> approveUserSelectRoles;
 
+    @JsonSerialize(using = ToStringSerializer.class)
+    @ApiModelProperty(value = "任务节点id")
+    List<Long> taskIdList;
+
+    public List<Long> getTaskIdList() {
+        return taskIdList;
+    }
+
+    public void setTaskIdList(List<Long> taskIdList) {
+        this.taskIdList = taskIdList;
+    }
+
     public FlowTaskResult() {
 
     }

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/FlowViewResult.java

@@ -1,5 +1,6 @@
 package com.qmth.distributed.print.business.bean.result;
 
+import com.qmth.distributed.print.business.bean.flow.dto.BaseFlowData;
 import com.qmth.distributed.print.business.enums.CustomFlowMultipleUserApproveTypeEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -13,7 +14,7 @@ import java.util.List;
  * @Author: wangliang
  * @Date: 2021/8/6
  */
-public class FlowViewResult implements Serializable {
+public class FlowViewResult extends BaseFlowData implements Serializable {
 
     @ApiModelProperty(value = "自定义流程审核类型")
     private CustomFlowMultipleUserApproveTypeEnum multipleUserApproveType;

+ 12 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TFFlowLogResult.java

@@ -53,6 +53,18 @@ public class TFFlowLogResult extends ApproveUserResult implements Serializable {
     @ApiModelProperty(value = "已审核人")
     private String approveUserName;
 
+    @ApiModelProperty(value = "流程节点id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long taskId;
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
     public String getPendApproveUserName() {
         return pendApproveUserName;
     }

+ 2 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/TFFlowViewLogResult.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.bean.result;
 
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.distributed.print.business.bean.flow.dto.BaseFlowData;
 import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -14,7 +15,7 @@ import java.io.Serializable;
  * @Author: wangliang
  * @Date: 2021/11/22
  */
-public class TFFlowViewLogResult implements Serializable {
+public class TFFlowViewLogResult extends BaseFlowData implements Serializable {
 
     @ApiModelProperty(value = "流程id")
     @JsonSerialize(using = ToStringSerializer.class)

+ 2 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/bean/result/WorkResult.java

@@ -3,7 +3,7 @@ package com.qmth.distributed.print.business.bean.result;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
-import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.distributed.print.business.bean.flow.dto.BaseFlowData;
 import com.qmth.teachcloud.common.enums.FlowStatusEnum;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -18,7 +18,7 @@ import java.util.Objects;
  * @Date: 2021/4/8
  */
 @JsonInclude(JsonInclude.Include.NON_NULL)
-public class WorkResult implements Serializable {
+public class WorkResult extends BaseFlowData implements Serializable {
 
     @JsonSerialize(using = ToStringSerializer.class)
     @ApiModelProperty(value = "主键")

+ 18 - 3
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TFFlowLog.java

@@ -77,11 +77,23 @@ public class TFFlowLog extends BaseEntity implements Serializable {
     @TableField(value = "approve_user_approve_type", updateStrategy = FieldStrategy.IGNORED)
     private CustomFlowMultipleUserApproveTypeEnum approveUserApproveType;
 
+    @ApiModelProperty(value = "流程节点id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long taskId;
+
+    public Long getTaskId() {
+        return taskId;
+    }
+
+    public void setTaskId(Long taskId) {
+        this.taskId = taskId;
+    }
+
     public TFFlowLog() {
 
     }
 
-    public TFFlowLog(Long schoolId, Long orgId, Long flowId, Long objectId, Long approveId, Long userId, String approveRemark, String objectTable) {
+    public TFFlowLog(Long schoolId, Long orgId, Long flowId, Long objectId, Long approveId, Long userId, String approveRemark, String objectTable, Long taskId) {
         this.schoolId = schoolId;
         this.orgId = orgId;
         this.flowId = flowId;
@@ -89,10 +101,11 @@ public class TFFlowLog extends BaseEntity implements Serializable {
         this.objectId = objectId;
         this.approveRemark = approveRemark;
         this.objectTable = objectTable;
+        this.taskId = taskId;
         insertInfo(userId);
     }
 
-    public TFFlowLog(Long schoolId, Long orgId, Long flowId, Long objectId, Long approveId, Long userId, String approveRemark, String pendApproveId, FlowApproveOperationEnum approveOperation, String objectTable) {
+    public TFFlowLog(Long schoolId, Long orgId, Long flowId, Long objectId, Long approveId, Long userId, String approveRemark, String pendApproveId, FlowApproveOperationEnum approveOperation, String objectTable, Long taskId) {
         this.schoolId = schoolId;
         this.orgId = orgId;
         this.flowId = flowId;
@@ -102,10 +115,11 @@ public class TFFlowLog extends BaseEntity implements Serializable {
         this.pendApproveId = pendApproveId;
         this.approveOperation = approveOperation;
         this.objectTable = objectTable;
+        this.taskId = taskId;
         insertInfo(userId);
     }
 
-    public TFFlowLog(Long schoolId, Long orgId, Long flowId, Long objectId, Long userId, String approveRemark, FlowApproveOperationEnum approveOperation, Long approveId, String pendApproveId, String objectTable) {
+    public TFFlowLog(Long schoolId, Long orgId, Long flowId, Long objectId, Long userId, String approveRemark, FlowApproveOperationEnum approveOperation, Long approveId, String pendApproveId, String objectTable, Long taskId) {
         setId(SystemConstant.getDbUuid());
         this.schoolId = schoolId;
         this.orgId = orgId;
@@ -116,6 +130,7 @@ public class TFFlowLog extends BaseEntity implements Serializable {
         this.approveId = approveId;
         this.pendApproveId = pendApproveId;
         this.objectTable = objectTable;
+        this.taskId = taskId;
         insertInfo(userId);
     }
 

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskMapper.java

@@ -108,4 +108,13 @@ public interface ExamTaskMapper extends BaseMapper<ExamTask> {
      * @return 命题任务试卷信息
      */
     List<ExamTaskDetailDto> listExamTaskDetailDownloadByQuery(@Param("semesterId") Long semesterId, @Param("examId") Long examId, @Param("courseName") String courseName, @Param("orgIds") Set<Long> orgIds, @Param("idSet") Set<Long> idSet);
+
+    /**
+     * 根据流程id和任务节点id获取待办
+     *
+     * @param flowId
+     * @param taskId
+     * @return
+     */
+    public WorkResult getFlowInfo(@Param("flowId") Long flowId, @Param("taskId") Long taskId);
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFCustomFlowMapper.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.qmth.distributed.print.business.bean.flow.dto.StandardFlowData;
 import com.qmth.distributed.print.business.entity.TFCustomFlow;
 import org.apache.ibatis.annotations.Param;
 
@@ -45,4 +46,12 @@ public interface TFCustomFlowMapper extends BaseMapper<TFCustomFlow> {
      * @return
      */
     public String findActIdByFlowKey(@Param("flowKey") String flowKey);
+
+    /**
+     * 查找流程信息
+     *
+     * @param flowId
+     * @return
+     */
+    public StandardFlowData findByFlowId(@Param("flowId") Long flowId);
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TFFlowLogMapper.java

@@ -42,4 +42,13 @@ public interface TFFlowLogMapper extends BaseMapper<TFFlowLog> {
      * @return 审批表
      */
     List<ApprovalInfo> findApprovalInfoByFlowId(@Param("flowId") Long flowId);
+
+    /**
+     * 根据流程id和流程节点id查询
+     *
+     * @param flowId
+     * @param taskId
+     * @return
+     */
+    List<TFFlowLogResult> findByFlowIdAndTaskId(@Param("flowId") Long flowId, @Param("taskId") Long taskId);
 }

+ 52 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ActivitiService.java

@@ -2,10 +2,14 @@ package com.qmth.distributed.print.business.service;
 
 import com.google.gson.Gson;
 import com.qmth.distributed.print.business.bean.flow.CustomFlowSaveDto;
+import com.qmth.distributed.print.business.bean.flow.dto.FlowMsgDto;
+import com.qmth.distributed.print.business.bean.flow.dto.HandleMessageDto;
+import com.qmth.distributed.print.business.bean.flow.dto.StandardFlowData;
 import com.qmth.distributed.print.business.bean.result.FlowInfoResult;
 import com.qmth.distributed.print.business.bean.result.FlowTaskResult;
 import com.qmth.distributed.print.business.bean.result.FlowViewResult;
 import com.qmth.distributed.print.business.bean.result.TaskInfoResult;
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
 import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
 import org.activiti.engine.runtime.ProcessInstance;
 
@@ -58,7 +62,7 @@ public interface ActivitiService {
      * @param taskId
      * @return
      */
-    public boolean taskApproverExchange(String userId, String taskId);
+    public Map<String, Object> taskApproverExchange(String userId, String taskId);
 
     /**
      * 动态创建流程图
@@ -116,4 +120,51 @@ public interface ActivitiService {
                                                 Gson gson,
                                                 int currSetup,
                                                 FlowTaskResult nextFlowTaskResult);
+
+    /**
+     * 处理流程消息
+     *
+     * @param schoolId
+     * @param flowId
+     * @param flowApproveOperationEnum
+     * @return
+     */
+    public HandleMessageDto handleMessage(Long schoolId, Long flowId, FlowApproveOperationEnum flowApproveOperationEnum);
+
+    /**
+     * 获取流程消息信息
+     *
+     * @param schoolId
+     * @return
+     */
+    public FlowMsgDto getFlowMsgData(Long schoolId);
+
+    /**
+     * 发送流程审批消息
+     *
+     * @param map
+     */
+    public void sendFlowTaskApproveMsg(Map<String, Object> map);
+
+    /**
+     * 发送流程转审消息
+     *
+     * @param map
+     */
+    public void sendFlowTaskExchangeMsg(Map<String, Object> map);
+
+    /**
+     * 发送流程启动消息
+     *
+     * @param flowId
+     */
+    public void sendFlowStartMsg(Long flowId);
+
+    /**
+     * 获取流程信息
+     *
+     * @param flowId
+     * @return
+     */
+    public StandardFlowData getFlowInfo(Long flowId);
 }

+ 1 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskDetailService.java

@@ -1,6 +1,5 @@
 package com.qmth.distributed.print.business.service;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.distributed.print.business.bean.dto.ExamTaskDetailDto;
 import com.qmth.distributed.print.business.bean.dto.ExamTaskDetailPdfDownloadDto;
@@ -37,7 +36,7 @@ public interface ExamTaskDetailService extends IService<ExamTaskDetail> {
 
     List<Map<String, String>> getPaperUrl(Long schoolId, Long printPlanId, Long examTaskId);
 
-    boolean paperUpdate(ExamTaskDetail examTaskDetail);
+    Map<String, Object> paperUpdate(ExamTaskDetail examTaskDetail);
 
     ExamTaskDetail getByExamTaskId(Long examTaskId);
 

+ 15 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -45,7 +45,7 @@ public interface ExamTaskService extends IService<ExamTask> {
 
     List<BlurryUserDto> listUser(String param);
 
-    Boolean assignUser(ExamTask examTask);
+    ExamTask assignUser(ExamTask examTask);
 
     boolean enable(ExamTask examTask);
 
@@ -73,9 +73,9 @@ public interface ExamTaskService extends IService<ExamTask> {
 
     List<RelatePaperDto> listPaperTypes(Long examTaskId, Long printPlanId, String courseCode);
 
-    boolean saveExamTaskDetail(ExamTaskDetail examTaskDetail) throws IOException;
+    Map<String, Object> saveExamTaskDetail(ExamTaskDetail examTaskDetail) throws IOException;
 
-    boolean status(ExamTask examTask);
+    Map<String, Object> status(ExamTask examTask);
 
     ExamTaskDetailCardDto applyGetOne(Long examTaskId, String source);
 
@@ -139,6 +139,15 @@ public interface ExamTaskService extends IService<ExamTask> {
      */
     public IPage<WorkResult> getFlowTaskReadyList(IPage<Map> iPage, Long schoolId, Long orgId, Long userId);
 
+    /**
+     * 根据流程id和任务节点id获取待办
+     *
+     * @param flowId
+     * @param taskId
+     * @return
+     */
+    public WorkResult getFlowInfo(Long flowId, Long taskId);
+
     void switchCard(Long examTaskId);
 
     /**
@@ -155,7 +164,7 @@ public interface ExamTaskService extends IService<ExamTask> {
 
     void removeByExamTaskId(Long examTaskId);
 
-    ExamTask saveExamTaskAndExamTaskDetail(ExamTaskApplyParam examTaskApplyParam);
+    Map<String, Object> saveExamTaskAndExamTaskDetail(ExamTaskApplyParam examTaskApplyParam);
 
     /**
      * 查找题卡规则标题
@@ -171,7 +180,7 @@ public interface ExamTaskService extends IService<ExamTask> {
      * @param examTaskApplyTemp
      * @return
      */
-    ExamTask submitTaskApply(ExamTaskApplyTemp examTaskApplyTemp);
+    Map<String, Object> submitTaskApply(ExamTaskApplyTemp examTaskApplyTemp);
 
     /**
      * 查找命题任务审核表
@@ -205,7 +214,7 @@ public interface ExamTaskService extends IService<ExamTask> {
      *
      * @param map
      */
-    void applyResave(ExamTaskReApplyParam map);
+    Map<String, Object> applyResave(ExamTaskReApplyParam map);
 
     ExamTaskDto getByExamTaskId(Long examTaskId);
 

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFCustomFlowService.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.distributed.print.business.bean.flow.dto.StandardFlowData;
 import com.qmth.distributed.print.business.entity.TFCustomFlow;
 import com.qmth.teachcloud.common.enums.TFCustomTypeEnum;
 
@@ -45,4 +46,12 @@ public interface TFCustomFlowService extends IService<TFCustomFlow> {
      * @return
      */
     public String findActIdByFlowKey(String flowKey);
+
+    /**
+     * 查找流程信息
+     *
+     * @param flowId
+     * @return
+     */
+    public StandardFlowData findByFlowId(Long flowId);
 }

+ 9 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TFFlowLogService.java

@@ -41,4 +41,13 @@ public interface TFFlowLogService extends IService<TFFlowLog> {
      * @return 审批表
      */
     List<ApprovalInfo> findApprovalInfoByFlowId(Long flowId);
+
+    /**
+     * 根据流程id和流程节点id查询
+     *
+     * @param flowId
+     * @param taskId
+     * @return
+     */
+    List<TFFlowLogResult> findByFlowIdAndTaskId(Long flowId, Long taskId);
 }

+ 183 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ActivitiServiceImpl.java

@@ -9,18 +9,22 @@ import com.qmth.boot.api.exception.ApiException;
 import com.qmth.distributed.print.business.activiti.custom.service.DefaultInstanceConvertToMultiInstance;
 import com.qmth.distributed.print.business.activiti.custom.service.MultiWorkFlow;
 import com.qmth.distributed.print.business.bean.flow.*;
+import com.qmth.distributed.print.business.bean.flow.dto.*;
 import com.qmth.distributed.print.business.bean.flow.link.FlowTaskLink;
 import com.qmth.distributed.print.business.bean.flow.link.FlowTaskNode;
 import com.qmth.distributed.print.business.bean.result.*;
 import com.qmth.distributed.print.business.entity.*;
 import com.qmth.distributed.print.business.enums.*;
 import com.qmth.distributed.print.business.service.*;
+import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.params.ApproveUserResult;
 import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberMatch;
 import com.qmth.teachcloud.common.bean.params.SysRoleGroupMemberMatchParams;
 import com.qmth.teachcloud.common.bean.result.SysRoleGroupMemberMatchResult;
 import com.qmth.teachcloud.common.config.DictionaryConfig;
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.BasicSchool;
+import com.qmth.teachcloud.common.entity.SysConfig;
 import com.qmth.teachcloud.common.entity.SysOrg;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.*;
@@ -47,6 +51,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.LinkedMultiValueMap;
 
 import javax.annotation.Resource;
@@ -346,7 +351,8 @@ public class ActivitiServiceImpl implements ActivitiService {
             tfFlowApproveService.saveOrUpdate(tfFlowApprove);
 
             //流程流水日志
-            TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), tfFlowJoin.getFlowId(), tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getId(), FlowApproveSetupEnum.END.getTitle(), tfFlowJoin.getObjectTable());
+            Task task = taskService.createTaskQuery().processInstanceId(String.valueOf(tfFlowJoin.getFlowId())).singleResult();
+            TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), tfFlowJoin.getFlowId(), tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getId(), FlowApproveSetupEnum.END.getTitle(), tfFlowJoin.getObjectTable(), Objects.nonNull(task) ? Long.parseLong(task.getId()) : null);
             tfFlowLog.setApproveOperation(FlowApproveOperationEnum.END);
             tfFlowLog.setApproveSetup(FlowApproveSetupEnum.END.getSetup());
             tfFlowLogService.save(tfFlowLog);
@@ -417,7 +423,8 @@ public class ActivitiServiceImpl implements ActivitiService {
 //        tfFlowJoinList.get(0).setFlowId(SystemConstant.convertIdToLong(flowId));
 //        tfFlowJoinList.get(0).setObjectTable(flowType.getTable());
 //        tfFlowJoinService.updateById(tfFlowJoinList.get(0));
-        tfFlowLogService.save(new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), SystemConstant.convertIdToLong(flowId), objectId, sysUser.getId(), sysUser.getId(), "提交流程", approveId, FlowApproveOperationEnum.SUBMIT, flowType.getTable()));
+        Task task = taskService.createTaskQuery().processInstanceId(flowId).singleResult();
+        tfFlowLogService.save(new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), SystemConstant.convertIdToLong(flowId), objectId, sysUser.getId(), sysUser.getId(), "提交流程", approveId, FlowApproveOperationEnum.SUBMIT, flowType.getTable(), Objects.nonNull(task) ? Long.parseLong(task.getId()) : null));
     }
 
     /**
@@ -487,7 +494,7 @@ public class ActivitiServiceImpl implements ActivitiService {
                 }
                 remark = Objects.nonNull(map.get(SystemConstant.APPROVE_REMARK)) ? map.get(SystemConstant.APPROVE_REMARK).toString() : null;
                 //流程流水日志
-                tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), flowId, tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getId(), remark, tfFlowJoin.getObjectTable());
+                tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), flowId, tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getId(), remark, tfFlowJoin.getObjectTable(), Long.parseLong(task.getId()));
                 //判断流程审批是通过还是驳回
                 approvePass = (FlowApprovePassEnum) map.get(SystemConstant.APPROVE_OPERATION);
                 Map<String, FlowTaskResult> setupMap = (Map<String, FlowTaskResult>) flowProcessVarMap.get(SystemConstant.SETUP_MAP);
@@ -678,6 +685,7 @@ public class ActivitiServiceImpl implements ActivitiService {
             tfFlowLog.setApproveUserApproveType(customFlowVarDto.getMultipleUserApproveType());
         }
         map.put(SystemConstant.APPROVE_TF_FLOW_LOG, tfFlowLog);
+        map.put(SystemConstant.APPROVE_TF_FLOW_APPROVE, tfFlowApprove);
         map.put(SystemConstant.AGGINESS_MAP, agginessMap);
         tfFlowApproveService.saveOrUpdate(tfFlowApprove);
         tfFlowLogService.save(tfFlowLog);
@@ -1013,7 +1021,8 @@ public class ActivitiServiceImpl implements ActivitiService {
      */
     @Override
     @Transactional
-    public boolean taskApproverExchange(String userId, String taskId) {
+    public Map<String, Object> taskApproverExchange(String userId, String taskId) {
+        Map<String, Object> map = new HashMap<>();
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         SysOrg sysOrg = commonCacheService.orgCache(sysUser.getOrgId());
         if (Objects.equals(String.valueOf(sysUser.getId()), userId)) {
@@ -1077,7 +1086,7 @@ public class ActivitiServiceImpl implements ActivitiService {
         String remark = Objects.nonNull(sysOrg) ? sysOrg.getName() : "无机构";
         String exchangeRemark = Objects.nonNull(exchangeSysOrg) ? exchangeSysOrg.getName() : "无机构";
         //流程流水日志
-        TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), tfFlowJoin.getFlowId(), tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getRealName() + "(" + remark + ")转" + exchangeUser.getRealName() + "(" + exchangeRemark + ")审批", FlowApproveOperationEnum.EXCHANGE, sysUser.getId(), String.valueOf(exchangeUser.getId()), tfFlowJoin.getObjectTable());
+        TFFlowLog tfFlowLog = new TFFlowLog(sysUser.getSchoolId(), sysUser.getOrgId(), tfFlowJoin.getFlowId(), tfFlowJoin.getObjectId(), sysUser.getId(), sysUser.getRealName() + "(" + remark + ")转" + exchangeUser.getRealName() + "(" + exchangeRemark + ")审批", FlowApproveOperationEnum.EXCHANGE, sysUser.getId(), String.valueOf(exchangeUser.getId()), tfFlowJoin.getObjectTable(), Long.parseLong(taskId));
         CustomFlowVarDto customFlowVarDto = gson.fromJson(gson.toJson(agginessMap.get(userTask.getId())), CustomFlowVarDto.class);
         if (customFlowVarDto.getApproveIds().size() == 1) {
             customFlowVarDto.setApproveIds(new ArrayList<>(Arrays.asList(userId)));
@@ -1123,6 +1132,8 @@ public class ActivitiServiceImpl implements ActivitiService {
         tfFlowLog.setApproveUserApproveType(customFlowVarDto.getMultipleUserApproveType());
         tfFlowLogService.save(tfFlowLog);
 
+        taskService.setVariable(task.getId(), SystemConstant.APPROVE_TF_FLOW_LOG, tfFlowLog);
+        taskService.setVariable(task.getId(), SystemConstant.APPROVE_TF_FLOW_APPROVE, tfFlowApprove);
         if (!multiInstance) {
             if (Objects.equals(currActivityId, CustomFlowTypeEnum.USER_TASK.getId() + DefaultInstanceConvertToMultiInstance.DEFAULT_USER_TASK)) {
                 taskService.setAssignee(taskId, userId);
@@ -1137,7 +1148,9 @@ public class ActivitiServiceImpl implements ActivitiService {
         if (Objects.nonNull(o) && o instanceof ExamTask) {
             basicMessageService.sendNoticeTaskAuditFlow((ExamTask) o, Arrays.asList(approveUserResultExchange), MessageEnum.NOTICE_OF_AUDIT_CREATED);
         }
-        return true;
+        map.put(SystemConstant.SUCCESS, true);
+        map.put(SystemConstant.APPROVE_TF_FLOW_LOG, tfFlowLog);
+        return map;
     }
 
     /**
@@ -1719,6 +1732,10 @@ public class ActivitiServiceImpl implements ActivitiService {
             if (Objects.nonNull(tfFlowApprove.getSetup()) && flowTaskResult.getSetup().intValue() == tfFlowApprove.getSetup().intValue()) {
                 currFlowTaskResult = flowTaskResult;
                 currFlowTaskResult.setFlowId(flowId);
+                List<Task> taskList = taskService.createTaskQuery().processInstanceId(String.valueOf(flowId)).list();
+                if (!CollectionUtils.isEmpty(taskList)) {
+                    currFlowTaskResult.setTaskIdList(taskList.stream().map(s -> Long.parseLong(s.getId())).collect(Collectors.toList()));
+                }
                 break;
             }
         }
@@ -1963,4 +1980,164 @@ public class ActivitiServiceImpl implements ActivitiService {
         }
         return flow;
     }
+
+    /**
+     * 处理流程消息
+     *
+     * @param schoolId
+     * @param flowId
+     * @param flowApproveOperationEnum
+     * @return
+     */
+    @Override
+    public HandleMessageDto handleMessage(Long schoolId, Long flowId, FlowApproveOperationEnum flowApproveOperationEnum) {
+        SysConfig sysConfigFlowMsgType = commonCacheService.addSysConfigCache(schoolId, SystemConstant.FLOW_MESSAGE_TYPE);
+        List<Task> taskList = taskService.createTaskQuery().processInstanceId(String.valueOf(flowId)).list();
+        List<StandardFlowWorkMsg> standardFlowWorkMsgList = new LinkedList<>();
+        if (!CollectionUtils.isEmpty(taskList)) {
+            for (Task t : taskList) {
+                //待办消息
+                WorkResult workResult = examTaskService.getFlowInfo(flowId, Long.parseLong(t.getId()));
+                StandardFlowWorkMsg standardFlowWorkMsg = Objects.nonNull(workResult) ? GsonUtil.fromJson(GsonUtil.toJson(workResult), StandardFlowWorkMsg.class) : null;
+                if (Objects.nonNull(standardFlowWorkMsg)) {
+                    standardFlowWorkMsg.setFlowType(TFCustomTypeEnum.ELECTRON_FLOW);
+                    standardFlowWorkMsg.setFlowOperation(flowApproveOperationEnum);
+                    standardFlowWorkMsg.setMessageType(FlowMsgTypeEnum.valueOf(sysConfigFlowMsgType.getConfigValue()));
+                    standardFlowWorkMsgList.add(standardFlowWorkMsg);
+                }
+            }
+        } else {
+            //待办消息
+            WorkResult workResult = examTaskService.getFlowInfo(flowId, null);
+            StandardFlowWorkMsg standardFlowWorkMsg = Objects.nonNull(workResult) ? GsonUtil.fromJson(GsonUtil.toJson(workResult), StandardFlowWorkMsg.class) : null;
+            if (Objects.nonNull(standardFlowWorkMsg)) {
+                standardFlowWorkMsg.setFlowType(TFCustomTypeEnum.ELECTRON_FLOW);
+                standardFlowWorkMsg.setFlowOperation(flowApproveOperationEnum);
+                standardFlowWorkMsg.setMessageType(FlowMsgTypeEnum.valueOf(sysConfigFlowMsgType.getConfigValue()));
+                standardFlowWorkMsgList.add(standardFlowWorkMsg);
+            }
+        }
+        //流程详情
+        FlowViewResult flowViewResult = this.getFlowView(flowId);
+        StandardFlowViewMsg standardFlowViewMsg = Objects.nonNull(flowViewResult) ? GsonUtil.fromJson(GsonUtil.toJson(flowViewResult), StandardFlowViewMsg.class) : null;
+        if (Objects.nonNull(standardFlowViewMsg)) {
+            standardFlowViewMsg.setFlowType(TFCustomTypeEnum.ELECTRON_FLOW);
+            standardFlowViewMsg.setFlowOperation(flowApproveOperationEnum);
+            standardFlowViewMsg.setMessageType(FlowMsgTypeEnum.valueOf(sysConfigFlowMsgType.getConfigValue()));
+        }
+        return new HandleMessageDto(standardFlowWorkMsgList, standardFlowViewMsg);
+    }
+
+    /**
+     * 获取流程消息信息
+     *
+     * @param schoolId
+     * @return
+     */
+    @Override
+    public FlowMsgDto getFlowMsgData(Long schoolId) {
+        FlowMsgDto flowMsgDto = new FlowMsgDto();
+        if (Objects.nonNull(schoolId)) {
+            BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
+            if (Objects.nonNull(basicSchool)) {
+                SysConfig sysConfigOpenFlowMsgPush = commonCacheService.addSysConfigCache(schoolId, SystemConstant.OPEN_FLOW_MESSAGE_PUSH);
+                SysConfig sysConfigFlowMsgType = commonCacheService.addSysConfigCache(schoolId, SystemConstant.FLOW_MESSAGE_TYPE);
+                SysConfig sysConfigMqHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.MQ_HOST_URL);
+
+                if (Objects.nonNull(sysConfigOpenFlowMsgPush)) {
+                    flowMsgDto.setOpenFlowMsgPush(Boolean.valueOf(sysConfigOpenFlowMsgPush.getConfigValue()));
+                }
+                if (Objects.nonNull(sysConfigFlowMsgType)) {
+                    flowMsgDto.setFlowMsgType(FlowMsgTypeEnum.valueOf(sysConfigFlowMsgType.getConfigValue()));
+                }
+                if (Objects.nonNull(sysConfigMqHostUrl)) {
+                    flowMsgDto.setMqHostUrl(sysConfigMqHostUrl.getConfigValue());
+                }
+            }
+        }
+        return flowMsgDto;
+    }
+
+    /**
+     * 发送流程审批消息
+     *
+     * @param map
+     */
+    @Override
+    public void sendFlowTaskApproveMsg(Map<String, Object> map) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        FlowMsgDto flowMsgDto = this.getFlowMsgData(sysUser.getSchoolId());
+        TFFlowLog tfFlowLog = (TFFlowLog) map.get(SystemConstant.APPROVE_TF_FLOW_LOG);
+        TFFlowApprove tfFlowApprove = (TFFlowApprove) map.get(SystemConstant.APPROVE_TF_FLOW_APPROVE);
+        if (Objects.nonNull(flowMsgDto.getOpenFlowMsgPush()) && flowMsgDto.getOpenFlowMsgPush()) {
+            Map<String, Object> mapVar = new HashMap<>();
+            mapVar.put(SystemConstant.FLOW_TASK_ID, tfFlowLog.getTaskId());
+            mapVar.put(SystemConstant.SCHOOL_ID, sysUser.getSchoolId());
+            MqDto mqDto = new MqDto(MqTagEnum.FLOW_MQ_DONE.getCode(), mapVar, String.valueOf(tfFlowLog.getFlowId()));
+            redisUtil.sendMessage(mqDto.getTopic(), mqDto);
+
+            if (tfFlowApprove.getStatus() != FlowStatusEnum.FINISH || tfFlowApprove.getStatus() != FlowStatusEnum.END) {
+                Map<String, Object> mapWorkVar = new HashMap<>();
+                mapWorkVar.put(SystemConstant.SCHOOL_ID, tfFlowLog.getSchoolId());
+                mapWorkVar.put(SystemConstant.APPROVE_OPERATION, tfFlowLog.getApproveOperation());
+                MqDto mqWorkDto = new MqDto(MqTagEnum.FLOW_MQ_WORK.getCode(), mapWorkVar, String.valueOf(tfFlowLog.getFlowId()));
+                redisUtil.sendMessage(mqWorkDto.getTopic(), mqWorkDto);
+            }
+        }
+    }
+
+    /**
+     * 发送流程转审消息
+     *
+     * @param map
+     */
+    @Override
+    public void sendFlowTaskExchangeMsg(Map<String, Object> map) {
+        TFFlowLog tfFlowLog = (TFFlowLog) map.get(SystemConstant.APPROVE_TF_FLOW_LOG);
+        if (tfFlowLog.getApproveOperation() == FlowApproveOperationEnum.EXCHANGE) {
+            FlowMsgDto flowMsgDto = this.getFlowMsgData(tfFlowLog.getSchoolId());
+            if (Objects.nonNull(flowMsgDto.getOpenFlowMsgPush()) && flowMsgDto.getOpenFlowMsgPush()) {
+                Map<String, Object> mapVar = new HashMap<>();
+                mapVar.put(SystemConstant.SCHOOL_ID, tfFlowLog.getSchoolId());
+                mapVar.put(SystemConstant.APPROVE_OPERATION, tfFlowLog.getApproveOperation());
+                MqDto mqDto = new MqDto(MqTagEnum.FLOW_MQ_WORK.getCode(), mapVar, String.valueOf(tfFlowLog.getFlowId()));
+                redisUtil.sendMessage(mqDto.getTopic(), mqDto);
+
+                Map<String, Object> mapDoneVar = new HashMap<>();
+                mapDoneVar.put(SystemConstant.FLOW_TASK_ID, tfFlowLog.getTaskId());
+                mapDoneVar.put(SystemConstant.SCHOOL_ID, tfFlowLog.getSchoolId());
+                MqDto mqDoneDto = new MqDto(MqTagEnum.FLOW_MQ_DONE.getCode(), mapDoneVar, String.valueOf(tfFlowLog.getFlowId()));
+                redisUtil.sendMessage(mqDoneDto.getTopic(), mqDoneDto);
+            }
+        }
+    }
+
+    /**
+     * 发送流程启动消息
+     *
+     * @param flowId
+     */
+    @Override
+    public void sendFlowStartMsg(Long flowId) {
+        SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
+        FlowMsgDto flowMsgDto = this.getFlowMsgData(sysUser.getSchoolId());
+        if (Objects.nonNull(flowMsgDto.getOpenFlowMsgPush()) && flowMsgDto.getOpenFlowMsgPush()) {
+            Map<String, Object> mapVar = new HashMap<>();
+            mapVar.put(SystemConstant.SCHOOL_ID, sysUser.getSchoolId());
+            mapVar.put(SystemConstant.APPROVE_OPERATION, FlowApproveOperationEnum.SUBMIT);
+            MqDto mqDto = new MqDto(MqTagEnum.FLOW_MQ_WORK.getCode(), mapVar, String.valueOf(flowId));
+            redisUtil.sendMessage(mqDto.getTopic(), mqDto);
+        }
+    }
+
+    /**
+     * 获取流程信息
+     *
+     * @param flowId
+     * @return
+     */
+    @Override
+    public StandardFlowData getFlowInfo(Long flowId) {
+        return tfCustomFlowService.findByFlowId(flowId);
+    }
 }

+ 10 - 2
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskDetailServiceImpl.java

@@ -390,12 +390,13 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
 
     @Override
     @Transactional
-    public boolean paperUpdate(ExamTaskDetail examTaskDetail) {
+    public Map<String, Object> paperUpdate(ExamTaskDetail examTaskDetail) {
         SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
 
         validPaperUpdate(examTaskDetail);
         SysOrg sysOrg = commonCacheService.orgCache(requestUser.getOrgId());
 
+        Map<String, Object> mapVar = new HashMap<>();
         ExamTaskDetail examTaskDetail1 = this.getByExamTaskId(examTaskDetail.getExamTaskId());
         String unexposedPaperType = examTaskDetail.getPaperType();
         if (StringUtils.isNotBlank(examTaskDetail1.getExposedPaperType())) {
@@ -464,6 +465,8 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
             UpdateWrapper<ExamTask> updateWrapper = new UpdateWrapper<>();
             updateWrapper.lambda().set(ExamTask::getFlowId, flowId).eq(ExamTask::getId, examTaskDetail.getExamTaskId());
             examTaskService.update(updateWrapper);
+            mapVar.putAll(map);
+            mapVar.put(SystemConstant.SEND_FLOW_START_MQ, true);
 
             tfFlowJoinService.saveOrUpdate(map);
             if (Objects.nonNull(flowId)) {
@@ -477,10 +480,15 @@ public class ExamTaskDetailServiceImpl extends ServiceImpl<ExamTaskDetailMapper,
                     String remark = Objects.nonNull(sysOrg) ? sysOrg.getName() : "无机构";
                     approverMap.computeIfAbsent(SystemConstant.APPROVE_REMARK, v -> requestUser.getRealName() + "(" + remark + ")" + FlowApprovePassEnum.RESTART.getTitle());
                     activitiService.taskApprove(approverMap);
+                    mapVar.putAll(approverMap);
+                    mapVar.remove(SystemConstant.SEND_FLOW_START_MQ);
+                    mapVar.put(SystemConstant.SEND_FLOW_MQ, true);
+
                 }
             }
         }
-        return true;
+        mapVar.put(SystemConstant.SUCCESS, true);
+        return mapVar;
     }
 
     @Override

+ 51 - 22
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -296,7 +296,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Transactional
     @Override
-    public Boolean assignUser(ExamTask examTask) {
+    public ExamTask assignUser(ExamTask examTask) {
         if (examTask.getId() == null) {
             throw ExceptionResultEnum.ERROR.exception("参数有误");
         }
@@ -322,6 +322,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 flowId = SystemConstant.convertIdToLong((String) map.get(SystemConstant.FLOW_ID));
                 map.computeIfAbsent(SystemConstant.FLOW_JOIN_TYPE, v -> FlowJoinTypeEnum.NEW);
                 tfFlowJoinService.saveOrUpdate(map);
+                examTask.setFlowId(flowId);
             }
         }
         // 更改命题老师
@@ -347,6 +348,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
                     tfFlowJoinService.deleteByObjectIdAndFlowId(examTask.getId(), null);
                     tfFlowJoinService.saveOrUpdate(map);
+                    examTask.setFlowId(flowId);
                 } else {
                     flowId = task.getFlowId();
                 }
@@ -357,8 +359,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 .set(ExamTask::getStatus, examStatusEnum)
                 .set(ExamTask::getFlowId, flowId)
                 .eq(ExamTask::getId, examTask.getId());
-
-        return this.update(updateWrapper);
+        this.update(updateWrapper);
+        return examTask;
     }
 
     @Transactional
@@ -798,6 +800,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 tfFlowJoinService.saveOrUpdate(map);
                 examTask.updateInfo(sysUser.getId());
                 this.updateById(examTask);
+                activitiService.sendFlowStartMsg(examTask.getFlowId());
             }
         }
         return list;
@@ -896,7 +899,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Transactional
     @Override
-    public boolean saveExamTaskDetail(ExamTaskDetail examTaskDetail) {
+    public Map<String, Object> saveExamTaskDetail(ExamTaskDetail examTaskDetail) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Optional.ofNullable(examTaskDetail.getExamTaskId()).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("命题任务ID不能为空"));
         if (StringUtils.isBlank(examTaskDetail.getOperateType())) {
@@ -914,17 +917,17 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             validSubmitParam(examTaskDetail, basicPrintConfig.getPrintContent());
         }
 
-
+        Map<String, Object> map = new HashMap<>();
         if (ExamStatusEnum.SUBMIT.name().equals(examTaskDetail.getOperateType())) {
             // 审核一级
             Task task = taskService.createTaskQuery().processInstanceId(String.valueOf(examTask.getFlowId())).singleResult();
             if (Objects.nonNull(task)) {
-                Map<String, Object> map = new HashMap<>();
                 map.computeIfAbsent(SystemConstant.FLOW_TASK_ID, v -> task.getId());
                 map.computeIfAbsent(SystemConstant.PAPAER_ATTACHMENT_IDS, v -> examTaskDetail.getPaperAttachmentIds());
                 map.computeIfAbsent(SystemConstant.APPROVE_OPERATION, v -> FlowApprovePassEnum.PASS);
                 map.computeIfAbsent(SystemConstant.APPROVE_USER_IDS, v -> examTaskDetail.getApproveUserIds());
-                activitiService.taskApprove(map);
+                map = activitiService.taskApprove(map);
+                map.put(SystemConstant.SEND_FLOW_MQ, true);
             }
         }
 
@@ -974,12 +977,12 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             cardUpdateWrapper.lambda().set(ExamCard::getUsed, true).eq(ExamCard::getId, cardId);
             examCardService.update(cardUpdateWrapper);
         }
-        return true;
+        return map;
     }
 
     @Override
     @Transactional
-    public boolean status(ExamTask examTask) {
+    public Map<String, Object> status(ExamTask examTask) {
         Optional.ofNullable(examTask.getId()).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("参数有误"));
         ExamTask task = this.getById(examTask.getId());
         if (Objects.nonNull(task.getReview()) && !task.getReview()) {
@@ -1025,7 +1028,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             updateWrapper.lambda().set(ExamCard::getUsed, false).in(ExamCard::getId, cardIds);
             examCardService.update(updateWrapper);
         }
-        return true;
+        return map;
     }
 
     @Override
@@ -1372,6 +1375,18 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         return examTaskMapper.getFlowTaskReadyList(iPage, schoolId, orgId, String.valueOf(userId));
     }
 
+    /**
+     * 根据流程id和任务节点id获取待办
+     *
+     * @param flowId
+     * @param taskId
+     * @return
+     */
+    @Override
+    public WorkResult getFlowInfo(Long flowId, Long taskId) {
+        return examTaskMapper.getFlowInfo(flowId, taskId);
+    }
+
     @Transactional
     @Override
     public void switchCard(Long examTaskId) {
@@ -1456,13 +1471,14 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Transactional
     @Override
-    public ExamTask saveExamTaskAndExamTaskDetail(ExamTaskApplyParam examTaskApplyParam) {
+    public Map<String, Object> saveExamTaskAndExamTaskDetail(ExamTaskApplyParam examTaskApplyParam) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         ExamTask examTask = examTaskApplyParam.getExamTask();
         String courseCode = examTask.getCourseCode();
         Long examId = examTask.getExamId();
         ExamTaskDetail examTaskDetail = examTaskApplyParam.getExamTaskDetail();
+        Map<String, Object> mapVar = new HashMap<>();
         try {
             BasicExamRule basicExamRule = basicExamRuleService.getBySchoolId();
             if (basicExamRule == null) {
@@ -1507,6 +1523,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     examTask.setFlowId(SystemConstant.convertIdToLong((String) map.get(SystemConstant.FLOW_ID)));
                     map.computeIfAbsent(SystemConstant.FLOW_JOIN_TYPE, v -> FlowJoinTypeEnum.NEW);
                     tfFlowJoinService.saveOrUpdate(map);
+                    mapVar.putAll(map);
+                    mapVar.put(SystemConstant.SEND_FLOW_START_MQ, true);
                 }
             }
             this.saveOrUpdate(examTask);
@@ -1524,6 +1542,9 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                         map.computeIfAbsent(SystemConstant.APPROVE_OPERATION, v -> FlowApprovePassEnum.PASS);
                         map.computeIfAbsent(SystemConstant.APPROVE_USER_IDS, v -> examTaskApplyParam.getApproveUserIds());
                         activitiService.taskApprove(map);
+                        mapVar.putAll(map);
+                        mapVar.remove(SystemConstant.SEND_FLOW_START_MQ);
+                        mapVar.put(SystemConstant.SEND_FLOW_MQ, true);
                     }
                 }
             }
@@ -1546,7 +1567,6 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
             examTaskDetail.setUpdateTime(System.currentTimeMillis());
 
             examTaskDetailService.saveOrUpdate(examTaskDetail);
-
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ActivitiObjectNotFoundException) {
@@ -1555,7 +1575,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                 ResultUtil.error(e.getMessage());
             }
         }
-        return examTask;
+        mapVar.put(SystemConstant.EXAM_TASK, examTask);
+        return mapVar;
     }
 
     /**
@@ -1602,7 +1623,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Transactional
     @Override
-    public ExamTask submitTaskApply(ExamTaskApplyTemp examTaskApplyTemp) {
+    public Map<String, Object> submitTaskApply(ExamTaskApplyTemp examTaskApplyTemp) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         Long customFlowId = examTaskApplyTemp.getCustomFlowId();
@@ -1621,7 +1642,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         }
 
         JSONObject jsonObject = JSONObject.parseObject(examTaskApplyTemp.getExamTaskContent());
-
+        Map<String, Object> mapVar = new HashMap<>();
         // 新建命题任务
         ExamTask examTask = JSONObject.parseObject(String.valueOf(jsonObject.get("examTask")), ExamTask.class);
         try {
@@ -1671,6 +1692,8 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     examTask.setFlowId(SystemConstant.convertIdToLong((String) map.get(SystemConstant.FLOW_ID)));
                     map.computeIfAbsent(SystemConstant.FLOW_JOIN_TYPE, v -> FlowJoinTypeEnum.NEW);
                     tfFlowJoinService.saveOrUpdate(map);
+                    mapVar.putAll(map);
+                    mapVar.put(SystemConstant.SEND_FLOW_START_MQ, true);
                 }
             }
             this.save(examTask);
@@ -1859,11 +1882,12 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     examDetailCourseService.save(examDetailCourse);
                 }
 
-                if (!CollectionUtils.isEmpty(errorClassIds)) {
-                    List<BasicClazz> basicClazzList = basicClazzService.listByIds(errorClassIds);
-                    String clazzNames = basicClazzList.stream().map(m -> m.getClazzName()).collect(Collectors.joining(","));
-                    throw ExceptionResultEnum.ERROR.exception("考试对象[" + clazzNames + "]已被其它人占用");
-                }
+                //TODO 测试流程暂时屏蔽
+//                if (!CollectionUtils.isEmpty(errorClassIds)) {
+//                    List<BasicClazz> basicClazzList = basicClazzService.listByIds(errorClassIds);
+//                    String clazzNames = basicClazzList.stream().map(m -> m.getClazzName()).collect(Collectors.joining(","));
+//                    throw ExceptionResultEnum.ERROR.exception("考试对象[" + clazzNames + "]已被其它人占用");
+//                }
             }
 
             if (Objects.nonNull(examTask.getFlowId())) {
@@ -1876,9 +1900,13 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
                     map.computeIfAbsent(SystemConstant.PAPAER_ATTACHMENT_IDS, v -> examTaskDetail.getPaperAttachmentIds());
                     map.computeIfAbsent(SystemConstant.APPROVE_USER_IDS, v -> examTaskApplyTemp.getApproveUserIds());
                     activitiService.taskApprove(map);
+                    mapVar.putAll(map);
+                    mapVar.remove(SystemConstant.SEND_FLOW_START_MQ);
+                    mapVar.put(SystemConstant.SEND_FLOW_MQ, true);
                 }
             }
-            return examTask;
+            mapVar.put(SystemConstant.EXAM_TASK, examTask);
+            return mapVar;
         } catch (Exception e) {
             log.error(SystemConstant.LOG_ERROR, e);
             if (e instanceof ActivitiObjectNotFoundException) {
@@ -2020,7 +2048,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
 
     @Transactional
     @Override
-    public void applyResave(ExamTaskReApplyParam examTaskReApplyParam) {
+    public Map<String, Object> applyResave(ExamTaskReApplyParam examTaskReApplyParam) {
         ExamTaskDetail examTaskDetail = examTaskReApplyParam.getExamTaskDetail();
         UpdateWrapper<ExamTaskDetail> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().set(ExamTaskDetail::getPaperAttachmentIds, examTaskDetail.getPaperAttachmentIds()).eq(ExamTaskDetail::getExamTaskId, examTaskDetail.getExamTaskId());
@@ -2033,6 +2061,7 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
         map.computeIfAbsent(SystemConstant.PAPAER_ATTACHMENT_IDS, v -> examTaskDetail.getPaperAttachmentIds());
         map.computeIfAbsent(SystemConstant.APPROVE_OPERATION, v -> FlowApprovePassEnum.PASS);
         activitiService.taskApprove(map);
+        return map;
     }
 
     @Override

+ 6 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFCustomFlowServiceImpl.java

@@ -2,6 +2,7 @@ package com.qmth.distributed.print.business.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.distributed.print.business.bean.flow.dto.StandardFlowData;
 import com.qmth.distributed.print.business.entity.TFCustomFlow;
 import com.qmth.distributed.print.business.mapper.TFCustomFlowMapper;
 import com.qmth.distributed.print.business.service.TFCustomFlowService;
@@ -63,4 +64,9 @@ public class TFCustomFlowServiceImpl extends ServiceImpl<TFCustomFlowMapper, TFC
     public String findActIdByFlowKey(String flowKey) {
         return tfCustomFlowMapper.findActIdByFlowKey(flowKey);
     }
+
+    @Override
+    public StandardFlowData findByFlowId(Long flowId) {
+        return tfCustomFlowMapper.findByFlowId(flowId);
+    }
 }

+ 12 - 10
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TFFlowLogServiceImpl.java

@@ -1,21 +1,15 @@
 package com.qmth.distributed.print.business.service.impl;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.distributed.print.business.bean.dto.approvalForm.ApprovalInfo;
 import com.qmth.distributed.print.business.bean.result.TFFlowLogResult;
 import com.qmth.distributed.print.business.entity.TFFlowLog;
 import com.qmth.distributed.print.business.mapper.TFFlowLogMapper;
 import com.qmth.distributed.print.business.service.TFFlowLogService;
-import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
-import com.qmth.teachcloud.common.service.SysOrgService;
-import com.qmth.teachcloud.common.service.SysUserService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
 import java.util.List;
-import java.util.Objects;
 
 /**
  * <p>
@@ -30,10 +24,6 @@ public class TFFlowLogServiceImpl extends ServiceImpl<TFFlowLogMapper, TFFlowLog
 
     @Resource
     TFFlowLogMapper tfFlowLogMapper;
-    @Resource
-    SysUserService sysUserService;
-    @Resource
-    SysOrgService sysOrgService;
 
     /**
      * 根据流程id查询流程状态
@@ -62,4 +52,16 @@ public class TFFlowLogServiceImpl extends ServiceImpl<TFFlowLogMapper, TFFlowLog
     public List<ApprovalInfo> findApprovalInfoByFlowId(Long flowId) {
         return this.baseMapper.findApprovalInfoByFlowId(flowId);
     }
+
+    /**
+     * 根据流程id和流程节点id查询
+     *
+     * @param flowId
+     * @param taskId
+     * @return
+     */
+    @Override
+    public List<TFFlowLogResult> findByFlowIdAndTaskId(Long flowId, Long taskId) {
+        return tfFlowLogMapper.findByFlowIdAndTaskId(flowId, taskId);
+    }
 }

+ 61 - 0
distributed-print-business/src/main/resources/mapper/ExamTaskMapper.xml

@@ -1196,4 +1196,65 @@
         </where>
         ORDER BY a.update_time DESC
     </select>
+
+    <select id="getFlowInfo" resultType="com.qmth.distributed.print.business.bean.result.WorkResult">
+        select
+              et.id,
+              et.school_id schoolId,
+              et.org_id as orgId,
+              et.course_code courseCode,
+              et.course_name courseName,
+              et.specialty,
+              et.paper_number paperNumber,
+              et.card_rule_id cardRuleId,
+              case
+                  et.card_rule_id when -1 then '全部通卡'
+                                  else b.name
+                  end cardRuleName,
+              cast(art.ASSIGNEE_ as Decimal(24)) as userId,
+              c.real_name userName,
+              et.start_time startTime,
+              et.end_time endTime,
+              tffa.status,
+              tffa.status auditStatus,
+              et.enable,
+              et.create_time as createTime,
+              et.update_time as updateTime,
+              art.EXECUTION_ID_ as executionId,
+              art.PROC_INST_ID_ as flowId,
+              art.NAME_ as taskName,
+              art.TASK_DEF_KEY_ as taskDefKey,
+              art.ID_ as taskId,
+              tffa.setup,
+              et.teacher_name teacherName,
+              et.lecturer_name lecturerName,
+              d.real_name as propositionName,
+              so.name teachingRoomName,
+              et.exam_id as examId
+          from
+              ACT_RU_TASK art
+                  left join t_f_flow_join tffj on
+                  tffj.flow_id = art.PROC_INST_ID_
+                  left join exam_task et on
+                  et.id = tffj.object_id
+                  left join basic_card_rule b ON
+                  et.card_rule_id = b.id
+                  left join t_f_flow_approve tffa on
+                  tffa.school_id = et.school_id and tffa.flow_id = et.flow_id
+                  left join sys_user c ON
+                  art.ASSIGNEE_ = c.id
+                  LEFT JOIN sys_user d ON
+                  et.user_id= d.id
+                  LEFT JOIN
+                  sys_org so ON et.teaching_room_id = so.id
+          <where>
+              et.enable = true
+              <if test="flowId != null and flowId != ''">
+                  and art.PROC_INST_ID_ = cast(#{flowId} as char)
+              </if>
+              <if test="taskId != null and taskId != ''">
+                  and art.ID_ = cast(#{taskId} as char);
+              </if>
+          </where>
+    </select>
 </mapper>

+ 12 - 0
distributed-print-business/src/main/resources/mapper/TFCustomFlowMapper.xml

@@ -54,4 +54,16 @@
     <select id="findActIdByFlowKey" resultType="java.lang.String">
         select max(arp.ID_) as actFlowId from act_re_procdef arp where arp.KEY_ = #{flowKey} order by arp.VERSION_ desc LIMIT 1
     </select>
+
+    <select id="findByFlowId" resultType="com.qmth.distributed.print.business.bean.flow.dto.StandardFlowData">
+        select
+            tfcf.*,
+            if(tbu2.real_name is not null,tbu2.real_name,tbu1.real_name) as updateName
+        from
+            t_f_custom_flow tfcf
+                join t_f_custom_flow_entity tfcfe on tfcfe.t_f_custom_flow_id = tfcf.id
+                join sys_user tbu1 on tfcf.create_id = tbu1.id
+                join sys_user tbu2 on tfcf.update_id = tbu2.id
+        where tfcfe.flow_id = #{flowId}
+    </select>
 </mapper>

+ 52 - 0
distributed-print-business/src/main/resources/mapper/TFFlowLogMapper.xml

@@ -77,4 +77,56 @@
         ORDER BY tffl.update_time
     </select>
 
+    <select id="findByFlowIdAndTaskId" resultType="com.qmth.distributed.print.business.bean.result.TFFlowLogResult">
+        select
+            DISTINCT tffl.approve_id as approveId,
+                     tffl.approve_setup as approveSetup,
+                     tffl.approve_remark as approveRemark,
+                     tffl.approve_operation as approveOperation,
+                     tffl.pend_approve_id as pendApproveId,
+                     tffl.create_time as createTime,
+                     tffl.flow_id as flowId,
+                     tffl.object_id as objectId,
+                     tffl.object_table as objectTable,
+                     tffl.id,
+                     tffl.paper_attachment_id as paperAttachmentId,
+                     tffl.task_id as taskId,
+                     su.school_id as schoolId,
+                     su.login_name as loginName,
+                     su.real_name as realName,
+                     su.code,
+                     su.mobile_number as mobileNumber,
+                     su.org_id as orgId,
+                     so.name as orgName,
+                     so.`type` as orgType,
+                     (select group_concat(su.real_name, '(', so.name, ')' order by FIND_IN_SET(su.id, replace(tffl.pend_approve_id, ', ', ',')))
+                      from sys_user su join sys_org so on so.id = su.org_id where FIND_IN_SET(su.id, replace(tffl.pend_approve_id, ', ', ','))) as pendApproveUserName,
+                     (
+                         select
+                             CONCAT(su.real_name, '(', so.name, ')')
+                         from
+                             sys_user su
+                                 join sys_org so on
+                                 so.id = su.org_id
+                         where
+                             su.id = tffl.approve_id) as approveUserName
+        from
+            t_f_flow_log tffl
+                join sys_user su on
+                su.id = tffl.approve_id
+                join sys_org so on
+                so.id = su.org_id
+        <where> 1 = 1
+            <if test="flowId != null and flowId != ''">
+                AND tffl.flow_id = #{flowId}
+            </if>
+            <if test="taskId != null and taskId != ''">
+                AND tffl.task_id = #{taskId}
+            </if>
+          and tffl.enable = 1
+        </where>
+        order by
+            tffl.create_time
+    </select>
+
 </mapper>

+ 55 - 11
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskController.java

@@ -12,7 +12,10 @@ import com.qmth.distributed.print.business.bean.params.ExamTaskPrintParams;
 import com.qmth.distributed.print.business.bean.params.ExamTaskReApplyParam;
 import com.qmth.distributed.print.business.bean.result.EditResult;
 import com.qmth.distributed.print.business.entity.*;
-import com.qmth.distributed.print.business.enums.*;
+import com.qmth.distributed.print.business.enums.ExamObjectType;
+import com.qmth.distributed.print.business.enums.ExamStatusEnum;
+import com.qmth.distributed.print.business.enums.MakeMethodEnum;
+import com.qmth.distributed.print.business.enums.ReviewStatusEnum;
 import com.qmth.distributed.print.business.service.*;
 import com.qmth.distributed.print.business.templete.execute.AsyncTaskReviewSampleExportService;
 import com.qmth.teachcloud.common.annotation.OperationLogDetail;
@@ -25,6 +28,7 @@ import com.qmth.teachcloud.common.enums.*;
 import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.service.BasicAttachmentService;
 import com.qmth.teachcloud.common.service.BasicStudentService;
+import com.qmth.teachcloud.common.util.RedisUtil;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import com.qmth.teachcloud.common.util.ServletUtil;
@@ -103,6 +107,9 @@ public class ExamTaskController {
     @Resource
     GradeInitializeService gradeInitializeService;
 
+    @Resource
+    RedisUtil redisUtil;
+
     /**
      * 命题任务管理-查询
      *
@@ -170,7 +177,11 @@ public class ExamTaskController {
     @RequestMapping(value = "/assign_user", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
     public Result assignUser(@RequestBody ExamTask examTask) {
-        return ResultUtil.ok(examTaskService.assignUser(examTask));
+        examTask = examTaskService.assignUser(examTask);
+        if (Objects.nonNull(examTask.getFlowId())) {
+            activitiService.sendFlowStartMsg(examTask.getFlowId());
+        }
+        return ResultUtil.ok(true);
     }
 
     /**
@@ -191,6 +202,9 @@ public class ExamTaskController {
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.ADD)
     public Result save(@RequestBody ExamTask examTask) {
         examTaskService.saveExamTaskNew(examTask);
+        if (Objects.nonNull(examTask.getFlowId())) {
+            activitiService.sendFlowStartMsg(examTask.getFlowId());
+        }
         return ResultUtil.ok(true);
     }
 
@@ -360,21 +374,25 @@ public class ExamTaskController {
     @RequestMapping(value = "/apply_save", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.EDIT)
     public Result taskApplySave(@RequestBody ExamTaskDetail examTaskDetail) throws IOException {
-        boolean isSuccess = examTaskService.saveExamTaskDetail(examTaskDetail);
+        Map<String, Object> map = examTaskService.saveExamTaskDetail(examTaskDetail);
         ExamTask examTask = examTaskService.getById(examTaskDetail.getExamTaskId());
         if (examTaskDetail.getOperateType().equals(ExamStatusEnum.SUBMIT.name()) && (Objects.nonNull(examTask.getReview()) && !examTask.getReview())) {
             // 校验是否可以提交打印状态
             printCommonService.checkData(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseCode(), examTask.getPaperNumber(), (SysUser) ServletUtil.getRequestUser());
         }
-
-        return ResultUtil.ok(isSuccess);
+        Boolean sendFlowMq = (Boolean) map.get(SystemConstant.SEND_FLOW_MQ);
+        if (Objects.nonNull(sendFlowMq) && sendFlowMq) {
+            activitiService.sendFlowTaskApproveMsg(map);
+        }
+        return ResultUtil.ok(true);
     }
 
     @ApiOperation(value = "审核-印刷员驳回后命题老师修改")
     @RequestMapping(value = "/apply_resave", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
     public Result taskReApplySave(@RequestBody ExamTaskReApplyParam examTaskReApplyParam) {
-        examTaskService.applyResave(examTaskReApplyParam);
+        Map<String, Object> map = examTaskService.applyResave(examTaskReApplyParam);
+        activitiService.sendFlowTaskApproveMsg(map);
         return ResultUtil.ok();
     }
 
@@ -388,7 +406,9 @@ public class ExamTaskController {
     @RequestMapping(value = "/apply_status", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
     public Result taskApplyStatus(@RequestBody ExamTask examTask) {
-        return ResultUtil.ok(examTaskService.status(examTask));
+        Map<String, Object> map = examTaskService.status(examTask);
+        activitiService.sendFlowTaskApproveMsg(map);
+        return ResultUtil.ok(true);
     }
 
     /**
@@ -528,6 +548,7 @@ public class ExamTaskController {
                         map.computeIfAbsent(SystemConstant.FLOW_TASK_ID, v -> task.getId());
                         map.computeIfAbsent(SystemConstant.APPROVE_OPERATION, v -> FlowApprovePassEnum.PASS);
                         activitiService.taskApprove(map);
+                        activitiService.sendFlowTaskApproveMsg(map);
                     }
                 }
             }
@@ -636,7 +657,8 @@ public class ExamTaskController {
     @RequestMapping(value = "/paper_update", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
     public Result taskPaperUpdate(@RequestBody ExamTaskDetail examTaskDetail) throws IOException {
-        boolean isSuccess = examTaskDetailService.paperUpdate(examTaskDetail);
+        Map<String, Object> map = examTaskDetailService.paperUpdate(examTaskDetail);
+        Boolean isSuccess = (Boolean) map.get(SystemConstant.SUCCESS);
         if (isSuccess) {
             ExamTask examTask = examTaskService.getById(examTaskDetail.getExamTaskId());
             if (Objects.nonNull(examTask.getReview()) && examTask.getReview()) {
@@ -651,6 +673,13 @@ public class ExamTaskController {
                     printCommonService.checkData(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseCode(), examTask.getPaperNumber(), sysUser);
                 }
             }
+            Boolean sendFlowStartMq = (Boolean) map.get(SystemConstant.SEND_FLOW_START_MQ);
+            Boolean sendFlowMq = (Boolean) map.get(SystemConstant.SEND_FLOW_MQ);
+            if (Objects.nonNull(sendFlowStartMq) && sendFlowStartMq) {
+                activitiService.sendFlowStartMsg(examTask.getFlowId());
+            } else if (Objects.nonNull(sendFlowMq) && sendFlowMq) {
+                activitiService.sendFlowTaskApproveMsg(map);
+            }
         }
         return ResultUtil.ok(isSuccess);
     }
@@ -706,11 +735,19 @@ public class ExamTaskController {
     @RequestMapping(value = "/submit_task_apply", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.ADD)
     public Result submitTaskApply(@RequestBody ExamTaskApplyTemp examTaskApplyTemp) throws IOException {
-        ExamTask examTask = examTaskService.submitTaskApply(examTaskApplyTemp);
+        Map<String, Object> map = examTaskService.submitTaskApply(examTaskApplyTemp);
+        ExamTask examTask = (ExamTask) map.get(SystemConstant.EXAM_TASK);
         if (Objects.nonNull(examTask.getReview()) && !examTask.getReview()) {
             // 校验是否可以提交打印状态
             printCommonService.checkData(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseCode(), examTask.getPaperNumber(), (SysUser) ServletUtil.getRequestUser());
         }
+        Boolean sendFlowStartMq = (Boolean) map.get(SystemConstant.SEND_FLOW_START_MQ);
+        Boolean sendFlowMq = (Boolean) map.get(SystemConstant.SEND_FLOW_MQ);
+        if (Objects.nonNull(sendFlowStartMq) && sendFlowStartMq) {
+            activitiService.sendFlowStartMsg(examTask.getFlowId());
+        } else if (Objects.nonNull(sendFlowMq) && sendFlowMq) {
+            activitiService.sendFlowTaskApproveMsg(map);
+        }
         return ResultUtil.ok();
     }
 
@@ -724,12 +761,19 @@ public class ExamTaskController {
     @RequestMapping(value = "/save_task_apply", method = RequestMethod.POST)
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.ADD)
     public Result saveTaskApply(@RequestBody ExamTaskApplyParam examTaskApplyParam) throws IOException {
-        ExamTask examTask = examTaskService.saveExamTaskAndExamTaskDetail(examTaskApplyParam);
+        Map<String, Object> map = examTaskService.saveExamTaskAndExamTaskDetail(examTaskApplyParam);
+        ExamTask examTask = (ExamTask) map.get(SystemConstant.EXAM_TASK);
         if (examTaskApplyParam.getExamTaskDetail().getOperateType().equals(ExamStatusEnum.SUBMIT.name()) && (Objects.nonNull(examTask.getReview()) && !examTask.getReview())) {
             // 校验是否可以提交打印状态
             printCommonService.checkData(examTask.getSchoolId(), examTask.getExamId(), examTask.getCourseCode(), examTask.getPaperNumber(), (SysUser) ServletUtil.getRequestUser());
         }
-
+        Boolean sendFlowStartMq = (Boolean) map.get(SystemConstant.SEND_FLOW_START_MQ);
+        Boolean sendFlowMq = (Boolean) map.get(SystemConstant.SEND_FLOW_MQ);
+        if (Objects.nonNull(sendFlowStartMq) && sendFlowStartMq) {
+            activitiService.sendFlowStartMsg(examTask.getFlowId());
+        } else if (Objects.nonNull(sendFlowMq) && sendFlowMq) {
+            activitiService.sendFlowTaskApproveMsg(map);
+        }
         return ResultUtil.ok(examTask);
     }
 

+ 22 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/SysAdminSetController.java

@@ -13,6 +13,7 @@ import com.qmth.teachcloud.common.bean.result.SysConfigResultOption;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.*;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.FlowMsgTypeEnum;
 import com.qmth.teachcloud.common.enums.SyncModeEnum;
 import com.qmth.teachcloud.common.enums.log.CustomizedOperationTypeEnum;
 import com.qmth.teachcloud.common.service.*;
@@ -91,6 +92,9 @@ public class SysAdminSetController {
         SysConfig sysConfigQuestionHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.QUESTION_HOST_URL);
         SysConfig sysConfigCloudmarkHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.CLOUDMARK_HOST_URL);
         SysConfig sysConfigTeachcloudReportHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.TEACHCLOUD_REPORT_HOST_URL);
+        SysConfig sysConfigOpenFlowMsgPush = commonCacheService.addSysConfigCache(schoolId, SystemConstant.OPEN_FLOW_MESSAGE_PUSH);
+        SysConfig sysConfigFlowMsgType = commonCacheService.addSysConfigCache(schoolId, SystemConstant.FLOW_MESSAGE_TYPE);
+        SysConfig sysConfigMqHostUrl = commonCacheService.addSysConfigCache(schoolId, SystemConstant.MQ_HOST_URL);
 
         List<SysConfigResult> sysConfigResultList = new ArrayList<>();
         if (Objects.nonNull(sysConfigQuestionHostUrl)) {
@@ -122,6 +126,24 @@ public class SysAdminSetController {
         } else {
             sysConfigResultList.add(new SysConfigResult(null, SystemConstant.TEACHCLOUD_REPORT_HOST_URL, "教研分析地址", "", 4));
         }
+
+        if (Objects.nonNull(sysConfigOpenFlowMsgPush)) {
+            sysConfigResultList.add(new SysConfigResult(sysConfigOpenFlowMsgPush));
+        } else {
+            sysConfigResultList.add(new SysConfigResult(null, SystemConstant.OPEN_FLOW_MESSAGE_PUSH, "是否开启消息推送", "false", 5));
+        }
+
+        if (Objects.nonNull(sysConfigFlowMsgType)) {
+            sysConfigResultList.add(new SysConfigResult(sysConfigFlowMsgType));
+        } else {
+            sysConfigResultList.add(new SysConfigResult(null, SystemConstant.FLOW_MESSAGE_TYPE, "消息类型", FlowMsgTypeEnum.STANDARD, 6));
+        }
+
+        if (Objects.nonNull(sysConfigMqHostUrl)) {
+            sysConfigResultList.add(new SysConfigResult(sysConfigMqHostUrl));
+        } else {
+            sysConfigResultList.add(new SysConfigResult(null, SystemConstant.MQ_HOST_URL, "消息中心地址", "", 7));
+        }
         return ResultUtil.ok(new SysAdminSetResult(schoolId, sysConfigResultList));
     }
 

+ 5 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/TFCustomFlowController.java

@@ -61,7 +61,7 @@ import java.util.stream.Collectors;
  */
 @Api(tags = "自定义流程Controller")
 @RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX  + SystemConstant.PREFIX_URL_CUSTOM_FLOW)
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_CUSTOM_FLOW)
 //@Aac(auth = BOOL.FALSE, strict = BOOL.FALSE)
 @Validated
 public class TFCustomFlowController {
@@ -178,6 +178,7 @@ public class TFCustomFlowController {
         map.computeIfAbsent(SystemConstant.APPROVE_SETUP, v -> flowTaskApproveParam.getSetup());
         map.computeIfAbsent(SystemConstant.APPROVE_USER_IDS, v -> flowTaskApproveParam.getApproveUserIds());
         activitiService.taskApprove(map);
+        activitiService.sendFlowTaskApproveMsg(map);
         return ResultUtil.ok(true);
     }
 
@@ -303,7 +304,9 @@ public class TFCustomFlowController {
     @OperationLogDetail(customizedOperationType = CustomizedOperationTypeEnum.UPDATE)
     public Result taskApproverExchange(@ApiParam(value = "审批人id", required = true) @RequestParam String userId,
                                        @ApiParam(value = "流程节点id", required = true) @RequestParam String taskId) {
-        return ResultUtil.ok(activitiService.taskApproverExchange(userId, taskId));
+        Map<String, Object> map = activitiService.taskApproverExchange(userId, taskId);
+        activitiService.sendFlowTaskExchangeMsg(map);
+        return ResultUtil.ok(map.get(SystemConstant.SUCCESS));
     }
 
     @ApiOperation(value = "获取当前流程节点信息")

+ 10 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -134,6 +134,7 @@ public class SystemConstant {
     /**
      * 系统配置
      */
+    public static final String EXAM_TASK = "examTask";
     public static final String START_PARENT = "../";
     public static final String DATE_TIME_FORMAT = "%02d";
     public static final String PRINT_DELETE_DATA_FILE_NAME = "db/4、delete-data.sql";
@@ -166,6 +167,10 @@ public class SystemConstant {
     public static final String TEACHCLOUD_REPORT_LOCATION_URL = "teachcloud.report.location.url";
     public static final String TEACHCLOUD_PRINT_HOST_DEFAULT_URL = "teachcloud.print.host.default.url";
 
+    public static final String OPEN_FLOW_MESSAGE_PUSH = "open.flow.message.push";//是否开启消息推送
+    public static final String FLOW_MESSAGE_TYPE = "flow.message.type";//消息类型,标准/非标准
+    public static final String MQ_HOST_URL = "mq.host.url";//消息中心地址,目前是cas单点登录地址
+
     public static final String SMS_SIGN_NAME = "sms.sign.name";
     public static final String SMS_TPL_CODE = "sms.tpl.code";
     public static final String SMS_AUDIT_PASS_CODE = "sms.audit.pass.code";
@@ -193,6 +198,8 @@ public class SystemConstant {
     /**
      * 系统常量
      */
+    public static final String SEND_FLOW_MQ = "sendFlowMq";
+    public static final String SEND_FLOW_START_MQ = "sendFlowStartMq";
     public static final String PT = "PT";
     public static final String CHARSET_NAME = "UTF-8";
     //    public static final String CHARSET_GB2312 = "gb2312";
@@ -448,6 +455,9 @@ public class SystemConstant {
     public static final String OBJECT_ID = "objectId";
     public static final String OBJECT_DATA = "objectData";
     public static final String APPROVE_TF_FLOW_LOG = "TFFlowLog";//流程院长自动审批
+    public static final String APPROVE_TF_FLOW_APPROVE = "TFFlowAppove";//流程流转记录
+    public static final String FLOW_WORK_MESSAGE = "workMsg";
+    public static final String FLOW_VIEW_MESSAGE = "viewMsg";
     public static final String PAPAER_ATTACHMENT_IDS = "paperAttachmentIds";//命题附件ids
     public static final String REDIS_LOCK_FLOW_TASK_PREFIX = "redis:lock:flow:task:";//流程节点锁
     public static final String REDIS_LOCK_EXAM_TASK_FLOW_PREFIX = "redis:lock:exam:task:flow:";//考试任务流程节点锁

+ 25 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/FlowMsgTypeEnum.java

@@ -0,0 +1,25 @@
+package com.qmth.teachcloud.common.enums;
+
+/**
+ * @Description: 流程消息类型
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2023/6/14
+ */
+public enum FlowMsgTypeEnum {
+
+    STANDARD("标准"),
+
+    OFF_STANDARD("非标准");
+
+    FlowMsgTypeEnum(String title) {
+        this.title = title;
+    }
+
+    private String title;
+
+    public String getTitle() {
+        return title;
+    }
+}

+ 5 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/MqTagEnum.java

@@ -11,7 +11,11 @@ import java.util.Objects;
  */
 public enum MqTagEnum {
 
-    PDF("创建pdf标签", "pdf", "normal", 0);
+    PDF("创建pdf标签", "pdf", "normal", 0),
+
+    FLOW_MQ_WORK("创建流程待办消息标签", "flow_mq_work", "normal", 0),
+
+    FLOW_MQ_DONE("创建流程已办消息标签", "flow_mq_done", "normal", 0);
 
     private MqTagEnum(String desc, String code, String type, int id) {
         this.desc = desc;

+ 4 - 4
teachcloud-common/src/main/java/com/qmth/teachcloud/common/enums/TFCustomTypeEnum.java

@@ -37,13 +37,13 @@ public enum TFCustomTypeEnum {
     /**
      * 状态转换 toName
      *
-     * @param title
+     * @param table
      * @return
      */
-    public static String convertToName(String title) {
+    public static TFCustomTypeEnum convertToEnum(String table) {
         for (TFCustomTypeEnum e : TFCustomTypeEnum.values()) {
-            if (Objects.equals(title, e.getTitle())) {
-                return e.name();
+            if (Objects.equals(table, e.getTable())) {
+                return e;
             }
         }
         return null;

+ 6 - 4
teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisListenerConfig.java

@@ -4,13 +4,13 @@ import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.threadPool.MyThreadPool;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.data.redis.connection.MessageListener;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
 import org.springframework.data.redis.listener.ChannelTopic;
 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
 import org.springframework.data.redis.listener.Topic;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
 
 /**
  * @Description: redis消息队列
@@ -26,7 +26,7 @@ public class RedisListenerConfig {
     private RedisConnectionFactory redisConnectionFactory;
 
     @Resource
-    private MessageListener messageListener;
+    private RedisMessageListener messageListener;
 
     @Resource
     MyThreadPool myThreadPool;
@@ -39,9 +39,11 @@ public class RedisListenerConfig {
         //设置运行任务池
         container.setTaskExecutor(myThreadPool);
         //定义监听渠道名称为
-        Topic topic = new ChannelTopic(MqTagEnum.PDF.getCode());
+        Topic topicPdf = new ChannelTopic(MqTagEnum.PDF.getCode());
+        Topic topicFlowMqWork = new ChannelTopic(MqTagEnum.FLOW_MQ_WORK.getCode());
+        Topic topicFlowMqDone = new ChannelTopic(MqTagEnum.FLOW_MQ_DONE.getCode());
         //定义监听器监听的Redis的消息
-        container.addMessageListener(messageListener, topic);
+        container.addMessageListener(messageListener, Arrays.asList(topicPdf, topicFlowMqWork, topicFlowMqDone));
         return container;
     }
 }

+ 54 - 12
teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisMessageListener.java

@@ -4,22 +4,32 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.gson.Gson;
 import com.qmth.boot.redis.uid.RedisMachineService;
+import com.qmth.distributed.print.business.bean.flow.dto.FlowMsgDto;
+import com.qmth.distributed.print.business.bean.flow.dto.HandleMessageDto;
+import com.qmth.distributed.print.business.bean.flow.dto.StandardFlowData;
+import com.qmth.distributed.print.business.bean.flow.dto.StandardFlowDoneMsg;
+import com.qmth.distributed.print.business.bean.result.TFFlowLogResult;
+import com.qmth.distributed.print.business.service.ActivitiService;
+import com.qmth.distributed.print.business.service.TFFlowLogService;
 import com.qmth.distributed.print.business.templete.execute.AsyncCreatePdfTempleteService;
 import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.entity.TBTask;
 import com.qmth.teachcloud.common.entity.TMMqMessage;
+import com.qmth.teachcloud.common.enums.FlowApproveOperationEnum;
+import com.qmth.teachcloud.common.enums.MqTagEnum;
 import com.qmth.teachcloud.common.service.TMMqMessageService;
+import com.qmth.teachcloud.common.util.GsonUtil;
 import com.qmth.teachcloud.common.util.JacksonUtil;
 import com.qmth.teachcloud.common.util.RedisUtil;
-import com.qmth.teachcloud.common.util.ResultUtil;
 import org.apache.commons.text.StringEscapeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.data.redis.connection.Message;
 import org.springframework.data.redis.connection.MessageListener;
 import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
 import java.time.Duration;
@@ -49,6 +59,12 @@ public class RedisMessageListener implements MessageListener {
     @Resource
     RedisMachineService redisMachineService;
 
+    @Resource
+    ActivitiService activitiService;
+
+    @Resource
+    TFFlowLogService tfFlowLogService;
+
     @Override
     public void onMessage(Message message, byte[] bytes) {
         if (Objects.nonNull(redisUtil.get(SystemConstant.CURRENT_TASK_MACHINE_ID))) {
@@ -77,18 +93,44 @@ public class RedisMessageListener implements MessageListener {
                             //通道
                             String topic = new String(message.getChannel(), SystemConstant.CHARSET_NAME);
                             log.info("mqDto:{},topic:{}", JacksonUtil.parseJson(mqDto), JacksonUtil.parseJson(topic));
-                            Map<String, Object> map = (Map<String, Object>) mqDto.getBody();
-                            Map<String, Object> finalMap = new HashMap<>();
-                            map.forEach((k, v) -> {
-                                if (Objects.equals(k, SystemConstant.TASK)) {
-                                    v = JSONObject.parseObject(JSON.toJSONString(v), TBTask.class);
-                                } else if (Objects.equals(k, SystemConstant.USER)) {
-                                    v = JSONObject.parseObject(JSON.toJSONString(v), SysUser.class);
+                            if (Objects.equals(topic, MqTagEnum.PDF.getCode())) {//创建pdf
+                                Map<String, Object> map = (Map<String, Object>) mqDto.getBody();
+                                Map<String, Object> finalMap = new HashMap<>();
+                                map.forEach((k, v) -> {
+                                    if (Objects.equals(k, SystemConstant.TASK)) {
+                                        v = JSONObject.parseObject(JSON.toJSONString(v), TBTask.class);
+                                    } else if (Objects.equals(k, SystemConstant.USER)) {
+                                        v = JSONObject.parseObject(JSON.toJSONString(v), SysUser.class);
+                                    }
+                                    Object finalV = v;
+                                    finalMap.computeIfAbsent(k, v1 -> finalV);
+                                });
+                                asyncCreatePdfTempleteService.createPdf(finalMap, null);
+                            } else if (Objects.equals(topic, MqTagEnum.FLOW_MQ_WORK.getCode())) {
+                                log.info("创建flowMqWork消息进来了");
+                                Map<String, Object> map = (Map<String, Object>) mqDto.getBody();
+                                Long schoolId = Long.parseLong(String.valueOf(map.get(SystemConstant.SCHOOL_ID)));
+                                FlowApproveOperationEnum flowApproveOperationEnum = FlowApproveOperationEnum.valueOf(String.valueOf(map.get(SystemConstant.APPROVE_OPERATION)));
+                                FlowMsgDto flowMsgDto = activitiService.getFlowMsgData(schoolId);
+                                StandardFlowData standardFlowData = activitiService.getFlowInfo(Long.parseLong(mqDto.getObjId()));
+                                HandleMessageDto handleMessageDto = activitiService.handleMessage(schoolId, Long.parseLong(mqDto.getObjId()), flowApproveOperationEnum);
+                                log.info("flowMq standardFlowData:{}", JacksonUtil.parseJson(standardFlowData));
+                                log.info("flowMq handleMessageDto:{}", JacksonUtil.parseJson(handleMessageDto));
+                            } else if (Objects.equals(topic, MqTagEnum.FLOW_MQ_DONE.getCode())) {
+                                log.info("创建flowMqDone消息进来了");
+                                Map<String, Object> map = (Map<String, Object>) mqDto.getBody();
+                                Long taskId = Long.parseLong(String.valueOf(map.get(SystemConstant.FLOW_TASK_ID)));
+                                Long schoolId = Long.parseLong(String.valueOf(map.get(SystemConstant.SCHOOL_ID)));
+                                Long flowId = Long.parseLong(mqDto.getObjId());
+                                FlowMsgDto flowMsgDto = activitiService.getFlowMsgData(schoolId);
+                                List<TFFlowLogResult> tfFlowLogResultList = tfFlowLogService.findByFlowIdAndTaskId(flowId, taskId);
+                                if (!CollectionUtils.isEmpty(tfFlowLogResultList)) {
+                                    StandardFlowDoneMsg standardFlowDoneMsg = GsonUtil.fromJson(GsonUtil.toJson(tfFlowLogResultList.get(tfFlowLogResultList.size() - 1)), StandardFlowDoneMsg.class);
+                                    standardFlowDoneMsg.setMessageType(flowMsgDto.getFlowMsgType());
+                                    standardFlowDoneMsg.setFlowOperation(standardFlowDoneMsg.getApproveOperation());
+                                    log.info("flowMq standardFlowDoneMsg:{}", JacksonUtil.parseJson(standardFlowDoneMsg));
                                 }
-                                Object finalV = v;
-                                finalMap.computeIfAbsent(k, v1 -> finalV);
-                            });
-                            asyncCreatePdfTempleteService.createPdf(finalMap, null);
+                            }
                             redisUtil.set(SystemConstant.CURRENT_TASK_MACHINE_ID, redisMachineService.getMachineId());
                             redisUtil.delete(SystemConstant.MQ_TOPIC_BUFFER_LIST, mqDto.getId());
                             mqDto.setAck(SystemConstant.STANDARD_ACK_TYPE);