Browse Source

新增流程发送消息

wangliang 2 years ago
parent
commit
575dcc5e14

+ 127 - 102
cas/src/main/java/com/qmth/teachcloud/cas/mq/gdpu/api/GdpuMqController.java

@@ -1,61 +1,83 @@
 package com.qmth.teachcloud.cas.mq.gdpu.api;
 
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
-import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.teachcloud.cas.mq.gdpu.bean.*;
+import com.qmth.teachcloud.cas.mq.gdpu.bean.AESEncryptUtils;
+import com.qmth.teachcloud.cas.mq.gdpu.bean.ProcessInfoDTO;
+import com.qmth.teachcloud.cas.mq.gdpu.bean.RemarkInfoDTO;
+import com.qmth.teachcloud.cas.mq.gdpu.bean.TodoInfoDTO;
+import com.qmth.teachcloud.cas.mq.gdpu.cache.FlowMqCacheUtil;
+import com.qmth.teachcloud.exchange.common.bean.dto.flow.DoneTaskDto;
+import com.qmth.teachcloud.exchange.common.bean.dto.flow.StandardFlowWorkMsg;
+import com.qmth.teachcloud.exchange.common.bean.dto.flow.ToDoTaskDto;
+import com.qmth.teachcloud.exchange.common.bean.dto.syssetting.SimpleObject;
 import com.qmth.teachcloud.exchange.common.contant.SystemConstant;
-import com.qmth.teachcloud.exchange.common.util.HttpUtil;
-import com.qmth.teachcloud.exchange.common.util.Result;
+import com.qmth.teachcloud.exchange.common.service.CommonCacheService;
 import com.qmth.teachcloud.exchange.common.util.ResultUtil;
 import io.swagger.annotations.*;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.RequestHeader;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
 
-import java.io.IOException;
+import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.Map;
+import java.util.*;
 
 @Api(tags = "广东药科大学服务中台controller")
 @RestController
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + SystemConstant.PREFIX_URL_GDPU)
+//@RequestMapping(SystemConstant.PREFIX_URL_GDPU_GET_BACK_LOG)
 @Aac(auth = BOOL.FALSE)
 @Validated
 public class GdpuMqController {
     private final static Logger log = LoggerFactory.getLogger(GdpuMqController.class);
 
-    @RequestMapping(value = "/todotask/send", method = RequestMethod.POST)
-    @ApiOperation(value = "推送流程信息")
-    @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
-    public Result toDoTask(@ApiParam(value = "流程ID(所属应用的ID号+使用业务系统中该流程实例的主键,拼接一起)", required = true) @RequestParam String docunId,
-                           @ApiParam(value = "所属应用的ID号(由学校管理员提供)", required = true) @RequestParam String sysAppId) throws IOException {
-        Map<String, Object> params = new LinkedHashMap<>();
-        params.put(SystemConstant.GDPU_DOCUN_ID, sysAppId + docunId);
-        params.put(SystemConstant.GDPU_SYS_APP_ID, sysAppId);
-        String dateStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
-        String encryptedvalue = DigestUtils.md5Hex(SystemConstant.GDPU_APP_ID + SystemConstant.GDPU_APP_SECRET + dateStr).toUpperCase();
-        String result = HttpUtil.postGdpu(SystemConstant.GDPU_MQ_PUSH_URL, params, SystemConstant.GDPU_APP_ID, encryptedvalue, System.currentTimeMillis());
-        log.info("result:{}", result);
-        return ResultUtil.ok(true);
-    }
+    @Resource
+    CommonCacheService commonCacheService;
 
-    @RequestMapping(value = "/getbacklog", method = RequestMethod.POST)
+    @RequestMapping(value = SystemConstant.PREFIX_URL_GDPU_GET_BACK_LOG, method = RequestMethod.POST)
     @ApiOperation(value = "获取流程事项信息")
     @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
     public JSONObject syncAffairInfo(@ApiParam(value = "appid", required = true) @RequestHeader String appid,
                                      @ApiParam(value = "签名串", required = true) @RequestHeader String secret,
                                      @ApiParam(value = "流程id", required = true) @RequestHeader String orunId) {
+        log.info("appid:{},secret:{},orunId:{}", appid, secret, orunId);
+        Long flowId = null;
+        if (Objects.nonNull(orunId)) {
+            flowId = Long.parseLong(orunId.substring(4, orunId.length()));
+        }
+        Long schoolId = FlowMqCacheUtil.getSchoolId(flowId);
+        Map<String, SimpleObject> mapSetting = commonCacheService.getSysSetting(schoolId);
+
+        String appId = null, appSecret = null, sysAppId = null;
+        if (!CollectionUtils.isEmpty(mapSetting)) {
+            SimpleObject simpleObjectAppId = mapSetting.get(SystemConstant.GDPU_APP_ID_PARAM);
+            Objects.requireNonNull(simpleObjectAppId, "未配置学校appId");
+
+            SimpleObject simpleObjectAppSecret = mapSetting.get(SystemConstant.GDPU_APP_SECRET_PARAM);
+            Objects.requireNonNull(simpleObjectAppSecret, "未配置学校secret");
+
+            SimpleObject simpleObjectSysAppId = mapSetting.get(SystemConstant.GDPU_SYS_APP_ID_PARAM);
+            Objects.requireNonNull(simpleObjectSysAppId, "未配置学校sysAppid");
+
+            appId = simpleObjectAppId.getValue();
+            appSecret = simpleObjectAppSecret.getValue();
+            sysAppId = simpleObjectSysAppId.getValue();
+        }
         //校验secret
-        String dateStr = new SimpleDateFormat("yyyyMMdd").format(new Date());
-        String encryptedvalue = DigestUtils.md5Hex(appid + SystemConstant.GDPU_APP_SECRET + dateStr).toUpperCase();
+        String dateStr = new SimpleDateFormat(SystemConstant.DEFAULT_DATE).format(new Date());
+        String encryptedvalue = DigestUtils.md5Hex(appid + appSecret + dateStr).toUpperCase();
         JSONObject result = new JSONObject();
+
         JSONObject content = new JSONObject();
         if (!encryptedvalue.equals(secret)) {
             content.put("code", "501");
@@ -63,25 +85,21 @@ public class GdpuMqController {
             result.put("content", content);
             return result;
         }
-        String sysAppId = "znks";
-        String flowId = "401331061809741824";
-        String docunId = sysAppId + flowId;
         JSONObject data = new JSONObject();
+        ToDoTaskDto toDoTaskDto = FlowMqCacheUtil.getToDoTask(flowId);
         JSONArray processInfo = new JSONArray(); //主流程信息
         if (orunId != null) {
             ProcessInfoDTO processInfoDTO = new ProcessInfoDTO();
             processInfoDTO.setSysAppId(sysAppId);
-            processInfoDTO.setOrunId(docunId);
-            // TODO 根据业务系统和场景,传入参数。
-            setProcessInfoDTO(processInfoDTO, flowId);
+            processInfoDTO.setOrunId(orunId);
+            setProcessInfoDTO(processInfoDTO, toDoTaskDto);
             processInfo.add(processInfoDTO);
         }
         JSONArray todoInfo = new JSONArray(); //待办信息
-        if (orunId != null) {
+        List<StandardFlowWorkMsg> standardFlowWorkMsgList = toDoTaskDto.getTodoTaskList();
+        for (StandardFlowWorkMsg s : standardFlowWorkMsgList) {
             TodoInfoDTO todoInfoDTO = new TodoInfoDTO();
-            todoInfoDTO.setOrunId(orunId);
-            // TODO 根据业务系统和场景,传入参数。
-            setTodoInfoDTO(todoInfoDTO, flowId);
+            setTodoInfoDTO(todoInfoDTO, s);
             todoInfo.add(todoInfoDTO);
         }
 //        JSONArray toreadInfo = new JSONArray(); //待阅信息
@@ -91,16 +109,15 @@ public class GdpuMqController {
 //            setToReadInfoDTO(toReadInfoDTO);
 //            toreadInfo.add(toReadInfoDTO);
 //        }
-//        JSONArray remarkInfo = new JSONArray(); //已办信息
-//        if (orunId != null) {
-//            RemarkInfoDTO remarkInfoDTO = new RemarkInfoDTO();
-//            // TODO 根据业务系统和场景,传入触发本次操作的办理信息参数。
-//            setRemarkInfoDTO(remarkInfoDTO);
-//            remarkInfo.add(remarkInfoDTO);
-//        }
+        DoneTaskDto doneTaskDto = FlowMqCacheUtil.getDoneTask(flowId);
+        JSONArray remarkInfo = new JSONArray(); //已办信息
+        RemarkInfoDTO remarkInfoDTO = new RemarkInfoDTO();
+        setRemarkInfoDTO(remarkInfoDTO, doneTaskDto);
+        remarkInfo.add(remarkInfoDTO);
+
         data.put("processInfo", processInfo);
         data.put("todoInfo", todoInfo);
-//        data.put("toreadInfo", toreadInfo);
+////        data.put("toreadInfo", toreadInfo);
 //        data.put("remarkInfo", remarkInfo);
         content.put("statusCode", 200);
         content.put("success", true);
@@ -109,7 +126,7 @@ public class GdpuMqController {
         log.info("content:{}", content.toJSONString());
 //请求参数body内容加密
         try {
-            result.put("content", AESEncryptUtils.aesEncrypt(content.toJSONString(), SystemConstant.GDPU_APP_SECRET.substring(0, 16)));
+            result.put("content", AESEncryptUtils.aesEncrypt(content.toJSONString(), appSecret.substring(0, 16)));
         } catch (Exception e) {
             System.out.println("AES加密失败");
             e.printStackTrace();
@@ -118,74 +135,82 @@ public class GdpuMqController {
         return result;
     }
 
-    private void setProcessInfoDTO(ProcessInfoDTO processInfoDTO, String flowId) {
+    private void setProcessInfoDTO(ProcessInfoDTO processInfoDTO, ToDoTaskDto toDoTaskDto) {
 //        processInfoDTO.setSysAppId("LYOA");
 //        processInfoDTO.setOrunId("LYOA79ec0af89702d641d839d5bbb5e9073b0e4b");
-        processInfoDTO.setSubject("测试流程");
-        processInfoDTO.setCurrentNodeId("T10004");
-        processInfoDTO.setCurrentNodeName("拟稿");
+        List<StandardFlowWorkMsg> standardFlowWorkMsgList = toDoTaskDto.getTodoTaskList();
+        List<String> userIdList = new LinkedList<>(), userNameList = new LinkedList<>();
+        for (StandardFlowWorkMsg s : standardFlowWorkMsgList) {
+            userIdList.add(String.valueOf(s.getUserId()));
+            userNameList.add(s.getUserName());
+        }
+
+        processInfoDTO.setSubject(toDoTaskDto.getFlowData().getName());
+        processInfoDTO.setCurrentNodeId(String.valueOf(toDoTaskDto.getFlowData().getId()));
+        processInfoDTO.setCurrentNodeName(toDoTaskDto.getFlowData().getName());
+//        processInfoDTO.setStatus(standardFlowWorkMsgList.get(0).getStatus().name());
         processInfoDTO.setStatus("Current");
-        processInfoDTO.setUserId("znkspt"); //申请人ID
-        processInfoDTO.setUserName("znkspt"); //申请人名称
-        processInfoDTO.setAuthor("znkspt"); //当前审批人的账户ID(多个使用逗号分隔(示例:2007112, admin))
-        processInfoDTO.setAuthorCn("znkspt"); //当前审批人的账户名称(多个使用逗号分隔(示例:2007112, admin))
-        processInfoDTO.setUrl("https://portal.lysky.com:6205/bpmui/formRender/run?docUnid=" + flowId);
-        processInfoDTO.setMobileUrl("https://portal.lysky.com:6205/bpmui/formRender/run?docUnid=" + flowId);
+        processInfoDTO.setUserId(String.valueOf(toDoTaskDto.getFlowData().getCreateId())); //申请人ID
+        processInfoDTO.setUserName(toDoTaskDto.getFlowData().getUpdateName()); //申请人名称
+        processInfoDTO.setAuthor(StringUtils.join(userIdList, ",")); //当前审批人的账户ID(多个使用逗号分隔(示例:2007112, admin))
+        processInfoDTO.setAuthorCn(StringUtils.join(userNameList, ",")); //当前审批人的账户名称(多个使用逗号分隔(示例:2007112, admin))
+        processInfoDTO.setUrl("https://portal.lysky.com:6205/bpmui/formRender/run?docUnid=" + toDoTaskDto.getFlowData().getFlowId());
+        processInfoDTO.setMobileUrl("https://portal.lysky.com:6205/bpmui/formRender/run?docUnid=" + toDoTaskDto.getFlowData().getFlowId());
         processInfoDTO.setDocAddTime(new Date());// "2022-07-25 02:36:00"
-        processInfoDTO.setDesc("描述");
+        processInfoDTO.setDesc(toDoTaskDto.getFlowData().getName());
     }
 
-    private void setTodoInfoDTO(TodoInfoDTO todoInfoDTO, String flowId) {
-        todoInfoDTO.setUserId("znkspt");
-        todoInfoDTO.setUserName("znkspt");
-        todoInfoDTO.setStartTime("2023-06-13 12:15:10");
-//        todoInfoDTO.setOrunId("a18a585c07b1c04cb00b66e0b76ca9ab1359");
-        todoInfoDTO.setNodeId("T10005");
-        todoInfoDTO.setNodeName("部门审批");
-        todoInfoDTO.setUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=" + flowId);
-        todoInfoDTO.setMobileUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=" + flowId);
+    private void setTodoInfoDTO(TodoInfoDTO todoInfoDTO, StandardFlowWorkMsg standardFlowWorkMsg) {
+        todoInfoDTO.setUserId(String.valueOf(standardFlowWorkMsg.getUserId()));
+        todoInfoDTO.setUserName(standardFlowWorkMsg.getUserName());
+        todoInfoDTO.setStartTime(DateUtil.format(new Date(standardFlowWorkMsg.getCreateTime()), SystemConstant.DEFAULT_DATE_PATTERN));
+        todoInfoDTO.setOrunId(String.valueOf(standardFlowWorkMsg.getExecutionId()));
+        todoInfoDTO.setNodeId(String.valueOf(standardFlowWorkMsg.getTaskId()));
+        todoInfoDTO.setNodeName(standardFlowWorkMsg.getTaskName());
+        todoInfoDTO.setUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=" + standardFlowWorkMsg.getFlowId());
+        todoInfoDTO.setMobileUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=" + standardFlowWorkMsg.getFlowId());
         todoInfoDTO.setStatus("Current"); //当出现或签、抢占流程时,需要将其他未办理用户设置为Pause状态。
     }
 
     //以审批通过为例,给出办理记录DTO的数据填充demo
-    private void setRemarkInfoDTO(RemarkInfoDTO remarkInfoDTO) {
-        remarkInfoDTO.setNodeId("T10006");
-        remarkInfoDTO.setNodeName("校领导审批");
-        remarkInfoDTO.setStartTime("2022-07-25 18:21:00");
-        remarkInfoDTO.setEndTime("2022-07-26 18:21:10");
-        remarkInfoDTO.setActionName("同意");
-        remarkInfoDTO.setUserId("admin");
-        remarkInfoDTO.setUserName("超级管理员");
-//        remarkInfoDTO.setOrunId("4519915c090cd0452208f610ef5f146920b3");
-        remarkInfoDTO.setRemark("同意本流程--审批通过");
+    private void setRemarkInfoDTO(RemarkInfoDTO remarkInfoDTO, DoneTaskDto doneTaskDto) {
+        remarkInfoDTO.setNodeId(String.valueOf(doneTaskDto.getTaskId()));
+        remarkInfoDTO.setNodeName(doneTaskDto.getHistoricName());
+        remarkInfoDTO.setStartTime(DateUtil.format(new Date(doneTaskDto.getCreateTime()), SystemConstant.DEFAULT_DATE_PATTERN));
+        remarkInfoDTO.setEndTime(DateUtil.format(new Date(doneTaskDto.getCreateTime()), SystemConstant.DEFAULT_DATE_PATTERN));
+        remarkInfoDTO.setActionName(doneTaskDto.getApproveOperation().name());
+        remarkInfoDTO.setUserId(String.valueOf(doneTaskDto.getApproveId()));
+        remarkInfoDTO.setUserName(doneTaskDto.getApproveUserName());
+        remarkInfoDTO.setOrunId(String.valueOf(doneTaskDto.getId()));
+        remarkInfoDTO.setRemark(doneTaskDto.getApproveRemark());
         remarkInfoDTO.setUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=79ec0af89702d641d839d5bbb5e9073b0e4b");
         remarkInfoDTO.setMobileUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=79ec0af89702d641d839d5bbb5e9073b0e4b");
     }
 
-    private void setToReadInfoDTO(ToReadInfoDTO toReadInfoDTO) {
-        JSONArray toReadUsers = new JSONArray();
-//根据场景 -- 插入待阅用户记录
-        JSONObject toReadUser1 = new JSONObject();
-        toReadUser1.put("toReadUserId", "admin");
-        toReadUser1.put("toReadUserName", "超级管理员");
-        toReadUser1.put("Status", "Current");
-        toReadUser1.put("remark", null);
-        toReadUser1.put("startTime", "2022-12-09 17:34:46");
-        toReadUsers.add(toReadUser1);
-//根据场景 -- 更新已阅用户记录
-        JSONObject toReadUser2 = new JSONObject();
-        toReadUser2.put("toReadUserId", "admin");
-        toReadUser2.put("toReadUserName", "超级管理员");
-        toReadUser2.put("Status", "End");
-        toReadUser2.put("remark", "已读");
-        toReadUser2.put("startTime", "2022-12-09 17:34:46");
-        toReadUser2.put("readTime", "2022-12-10 17:34:46");
-        toReadUsers.add(toReadUser2);
-        toReadInfoDTO.setToReadUser(toReadUsers);
-//        toReadInfoDTO.setOrunId("a18a585c07b1c04cb00b66e0b76ca9125456");
-        toReadInfoDTO.setNodeId("T10005");
-        toReadInfoDTO.setUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=79ec0af89702d641d839d5bbb5e9073b0e4b");
-        toReadInfoDTO.setMobileUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=79ec0af89702d641d839d5bbb5e9073b0e4b");
-        toReadInfoDTO.setNodeName("部门审批");
-    }
+//    private void setToReadInfoDTO(ToReadInfoDTO toReadInfoDTO) {
+//        JSONArray toReadUsers = new JSONArray();
+////根据场景 -- 插入待阅用户记录
+//        JSONObject toReadUser1 = new JSONObject();
+//        toReadUser1.put("toReadUserId", "admin");
+//        toReadUser1.put("toReadUserName", "超级管理员");
+//        toReadUser1.put("Status", "Current");
+//        toReadUser1.put("remark", null);
+//        toReadUser1.put("startTime", "2022-12-09 17:34:46");
+//        toReadUsers.add(toReadUser1);
+////根据场景 -- 更新已阅用户记录
+//        JSONObject toReadUser2 = new JSONObject();
+//        toReadUser2.put("toReadUserId", "admin");
+//        toReadUser2.put("toReadUserName", "超级管理员");
+//        toReadUser2.put("Status", "End");
+//        toReadUser2.put("remark", "已读");
+//        toReadUser2.put("startTime", "2022-12-09 17:34:46");
+//        toReadUser2.put("readTime", "2022-12-10 17:34:46");
+//        toReadUsers.add(toReadUser2);
+//        toReadInfoDTO.setToReadUser(toReadUsers);
+////        toReadInfoDTO.setOrunId("a18a585c07b1c04cb00b66e0b76ca9125456");
+//        toReadInfoDTO.setNodeId("T10005");
+//        toReadInfoDTO.setUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=79ec0af89702d641d839d5bbb5e9073b0e4b");
+//        toReadInfoDTO.setMobileUrl("https://portal.lysky.com:6205/bpmui/#/formRender/run?docUnid=79ec0af89702d641d839d5bbb5e9073b0e4b");
+//        toReadInfoDTO.setNodeName("部门审批");
+//    }
 }

+ 99 - 5
cas/src/main/java/com/qmth/teachcloud/cas/mq/gdpu/api/OpenMqController.java

@@ -3,24 +3,28 @@ package com.qmth.teachcloud.cas.mq.gdpu.api;
 import com.qmth.boot.api.annotation.Aac;
 import com.qmth.boot.api.annotation.BOOL;
 import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.teachcloud.cas.mq.gdpu.cache.FlowMqCacheUtil;
 import com.qmth.teachcloud.exchange.common.bean.dto.flow.DoneTaskDto;
 import com.qmth.teachcloud.exchange.common.bean.dto.flow.ToDoTaskDto;
+import com.qmth.teachcloud.exchange.common.bean.dto.syssetting.SimpleObject;
 import com.qmth.teachcloud.exchange.common.contant.SystemConstant;
 import com.qmth.teachcloud.exchange.common.entity.BasicSchool;
 import com.qmth.teachcloud.exchange.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.exchange.common.util.AuthThirdUtil;
-import com.qmth.teachcloud.exchange.common.util.JacksonUtil;
-import com.qmth.teachcloud.exchange.common.util.Result;
-import com.qmth.teachcloud.exchange.common.util.ResultUtil;
+import com.qmth.teachcloud.exchange.common.service.CommonCacheService;
+import com.qmth.teachcloud.exchange.common.util.*;
 import io.swagger.annotations.*;
+import org.apache.commons.codec.digest.DigestUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
 import java.io.IOException;
 import java.net.URLDecoder;
-import java.util.Optional;
+import java.text.SimpleDateFormat;
+import java.util.*;
 
 @Api(tags = "广东药科大学获取流程消息controller")
 @RestController
@@ -30,6 +34,9 @@ import java.util.Optional;
 public class OpenMqController {
     private final static Logger log = LoggerFactory.getLogger(OpenMqController.class);
 
+    @Resource
+    CommonCacheService commonCacheService;
+
     @RequestMapping(value = "/{schoolCode}/todotask", method = RequestMethod.POST)
     @ApiOperation(value = "获取流程待办信息")
     @ApiResponses({@ApiResponse(code = 200, message = "常规信息", response = ResultUtil.class)})
@@ -39,8 +46,47 @@ public class OpenMqController {
         String decodeJson = URLDecoder.decode(data, SystemConstant.CHARSET_NAME);
         ToDoTaskDto toDoTaskDto = JacksonUtil.readJson(decodeJson, ToDoTaskDto.class);
         log.info("todotask进来了,toDoTaskDto:{}", JacksonUtil.parseJson(toDoTaskDto));
+//        Map<String, Object> map = JSONObject.parseObject(decodeJson);
+//        ToDoTaskDto toDoTaskDto = new ToDoTaskDto();
+//        HandleMessageDto handleMessageDto = new HandleMessageDto();
+//        StandardFlowViewMsg flowViewResult = new StandardFlowViewMsg();
+//        map.forEach((k, v) -> {
+//            if (Objects.equals(k, "flowData")) {
+//                toDoTaskDto.setFlowData((StandardFlowData) v);
+//            } else if (Objects.equals(k, "todoTaskList")) {
+//                toDoTaskDto.setTodoTaskList((List<StandardFlowWorkMsg>) v);
+//            } else if (Objects.equals(k, "handleMessageDto")) {
+//                Map<String, Object> mapVar = JSONObject.parseObject(JSONObject.toJSONString(v));
+//                mapVar.forEach((k1, v1) -> {
+//                    if (Objects.equals(k1, "standardFlowWorkMsgList")) {
+//                        handleMessageDto.setStandardFlowWorkMsgList((List<StandardFlowWorkMsg>) v1);
+//                    } else if (Objects.equals(k1, "standardFlowViewMsg")) {
+//                        Map<String, Object> mapTempVar = JSONObject.parseObject(JSONObject.toJSONString(v1));
+//                        mapTempVar.forEach((k2, v2) -> {
+//                            if (Objects.equals(k2, "multipleUserApproveType")) {
+//                                flowViewResult.setMultipleUserApproveType(CustomFlowMultipleUserApproveTypeEnum.valueOf((String) v2));
+//                            } else if (Objects.equals(k2, "currFlowTaskResult")) {
+//                                flowViewResult.setCurrFlowTaskResult((FlowTaskResult) v2);
+//                            } else if (Objects.equals(k2, "tfFlowViewLogResultList")) {
+//                                flowViewResult.setTfFlowViewLogResultList((List<TFFlowViewLogResult>) v2);
+//                            }
+//                        });
+////                        handleMessageDto.setStandardFlowViewMsg(flowViewResult);
+//                    }
+//                });
+//                toDoTaskDto.setHandleMessageDto((HandleMessageDto) v);
+//            }
+//        });
+//        ToDoTaskDto toDoTaskDto = JSONObject.parseObject(JSON.toJSONString(decodeJson), ToDoTaskDto.class);
+//        log.info("todotask进来了,toDoTaskDto:{}", JacksonUtil.parseJson(toDoTaskDto));
 
         BasicSchool basicSchool = AuthThirdUtil.hasPermission();
+        //发送广药流程
+        if (Objects.nonNull(toDoTaskDto.getFlowData())) {
+            this.sendFlowDataMq(basicSchool.getId(), String.valueOf(toDoTaskDto.getFlowData().getFlowId()));
+            FlowMqCacheUtil.setSchoolId(toDoTaskDto.getFlowData().getFlowId(), basicSchool.getId());
+            FlowMqCacheUtil.setToDoTask(toDoTaskDto.getFlowData().getFlowId(), toDoTaskDto);
+        }
         return ResultUtil.ok(true);
     }
 
@@ -55,6 +101,54 @@ public class OpenMqController {
         log.info("donetask进来了,doneTaskDto:{}", JacksonUtil.parseJson(doneTaskDto));
 
         BasicSchool basicSchool = AuthThirdUtil.hasPermission();
+        //发送广药流程
+        if (Objects.nonNull(doneTaskDto)) {
+            this.sendFlowDataMq(basicSchool.getId(), String.valueOf(doneTaskDto.getFlowId()));
+            FlowMqCacheUtil.setSchoolId(doneTaskDto.getFlowId(), basicSchool.getId());
+            FlowMqCacheUtil.setDoneTask(doneTaskDto.getFlowId(), doneTaskDto);
+        }
         return ResultUtil.ok(true);
     }
+
+    /**
+     * 发送广药流程
+     *
+     * @param schoolId
+     * @param flowId
+     * @return
+     * @throws IOException
+     */
+    private String sendFlowDataMq(Long schoolId, String flowId) throws IOException {
+        String result = null;
+        Map<String, SimpleObject> mapSetting = commonCacheService.getSysSetting(schoolId);
+        if (!CollectionUtils.isEmpty(mapSetting)) {
+            SimpleObject simpleObjectAppId = mapSetting.get(SystemConstant.GDPU_APP_ID_PARAM);
+            Objects.requireNonNull(simpleObjectAppId, "未配置学校appId");
+
+            SimpleObject simpleObjectAppSecret = mapSetting.get(SystemConstant.GDPU_APP_SECRET_PARAM);
+            Objects.requireNonNull(simpleObjectAppSecret, "未配置学校secret");
+
+            SimpleObject simpleObjectSysAppId = mapSetting.get(SystemConstant.GDPU_SYS_APP_ID_PARAM);
+            Objects.requireNonNull(simpleObjectSysAppId, "未配置学校sysAppid");
+
+            SimpleObject simpleObjectServiceAddress = mapSetting.get(SystemConstant.GDPU_SERVICE_ADDRESS_PARAM);
+            Objects.requireNonNull(simpleObjectServiceAddress, "未配置学校服务中台地址");
+
+            String appId = simpleObjectAppId.getValue();
+            String secret = simpleObjectAppSecret.getValue();
+            String sysAppId = simpleObjectSysAppId.getValue();
+            String serviceAddress = simpleObjectServiceAddress.getValue();
+
+            Map<String, Object> params = new LinkedHashMap<>();
+            params.put(SystemConstant.GDPU_DOCUN_ID, sysAppId + flowId);
+            params.put(SystemConstant.GDPU_SYS_APP_ID, sysAppId);
+            String dateStr = new SimpleDateFormat(SystemConstant.DEFAULT_DATE).format(new Date());
+            String encryptedvalue = DigestUtils.md5Hex(appId + secret + dateStr).toUpperCase();
+
+            //更新流程事件
+            result = HttpUtil.postGdpu(serviceAddress, params, appId, encryptedvalue, System.currentTimeMillis());
+            log.info("result:{}", result);
+        }
+        return result;
+    }
 }

+ 44 - 0
cas/src/main/java/com/qmth/teachcloud/cas/mq/gdpu/cache/FlowMqCacheUtil.java

@@ -0,0 +1,44 @@
+package com.qmth.teachcloud.cas.mq.gdpu.cache;
+
+import com.qmth.teachcloud.exchange.common.bean.dto.flow.DoneTaskDto;
+import com.qmth.teachcloud.exchange.common.bean.dto.flow.ToDoTaskDto;
+import com.qmth.teachcloud.exchange.common.cache.RedisKeyHelper;
+import com.qmth.teachcloud.exchange.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.exchange.common.enums.flow.FlowMqFieldEnum;
+import com.qmth.teachcloud.exchange.common.util.RedisUtil;
+
+/**
+ * 考试记录缓存hash值操作
+ *
+ * @Description:
+ * @Author: xiatian
+ * @Date: 2020-07-29
+ */
+public class FlowMqCacheUtil {
+
+    private static RedisUtil redisUtil = SpringContextHolder.getBean(RedisUtil.class);
+
+    public static void setSchoolId(Long flowId, Long schoolId) {
+        redisUtil.set(RedisKeyHelper.flowIdCacheKey(flowId), FlowMqFieldEnum.schoolId.name(), schoolId);
+    }
+
+    public static Long getSchoolId(Long flowId) {
+        return (Long) redisUtil.get(RedisKeyHelper.flowIdCacheKey(flowId), FlowMqFieldEnum.schoolId.name());
+    }
+
+    public static void setToDoTask(Long flowId, ToDoTaskDto toDoTaskDto) {
+        redisUtil.set(RedisKeyHelper.flowIdCacheKey(flowId), FlowMqFieldEnum.todotask.name(), toDoTaskDto);
+    }
+
+    public static ToDoTaskDto getToDoTask(Long flowId) {
+        return (ToDoTaskDto) redisUtil.get(RedisKeyHelper.flowIdCacheKey(flowId), FlowMqFieldEnum.todotask.name());
+    }
+
+    public static void setDoneTask(Long flowId, DoneTaskDto doneTaskDto) {
+        redisUtil.set(RedisKeyHelper.flowIdCacheKey(flowId), FlowMqFieldEnum.donetask.name(), doneTaskDto);
+    }
+
+    public static DoneTaskDto getDoneTask(Long flowId) {
+        return (DoneTaskDto) redisUtil.get(RedisKeyHelper.flowIdCacheKey(flowId), FlowMqFieldEnum.donetask.name());
+    }
+}

+ 60 - 2
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/bean/dto/flow/DoneTaskDto.java

@@ -1,7 +1,11 @@
 package com.qmth.teachcloud.exchange.common.bean.dto.flow;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
-import com.qmth.teachcloud.exchange.common.bean.result.flow.TFFlowViewLogResult;
+import com.qmth.teachcloud.exchange.common.bean.result.flow.TFFlowLogResult;
+import com.qmth.teachcloud.exchange.common.enums.flow.FlowApproveOperationEnum;
+import com.qmth.teachcloud.exchange.common.enums.flow.FlowMsgTypeEnum;
+import com.qmth.teachcloud.exchange.common.enums.flow.TFCustomTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
 
 import java.io.Serializable;
 
@@ -13,6 +17,60 @@ import java.io.Serializable;
  * @Date: 2023/6/14
  */
 @JsonInclude(JsonInclude.Include.NON_NULL)
-public class DoneTaskDto extends TFFlowViewLogResult implements Serializable {
+public class DoneTaskDto extends TFFlowLogResult implements Serializable {
 
+    @ApiModelProperty(value = "流程类型")
+    TFCustomTypeEnum flowType;
+
+    @ApiModelProperty(value = "流程操作")
+    FlowApproveOperationEnum flowOperation;
+
+    @ApiModelProperty(value = "消息类型")
+    FlowMsgTypeEnum messageType;
+
+    @ApiModelProperty(value = "待办链接")
+    String url;
+
+    @ApiModelProperty(value = "移动待办链接")
+    String mobileUrl;
+
+    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 FlowMsgTypeEnum getMessageType() {
+        return messageType;
+    }
+
+    public void setMessageType(FlowMsgTypeEnum messageType) {
+        this.messageType = messageType;
+    }
+
+    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;
+    }
 }

+ 12 - 0
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/bean/dto/flow/StandardFlowData.java

@@ -57,6 +57,18 @@ public class StandardFlowData extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "最后更新人")
     private String updateName;
 
+    @ApiModelProperty(value = "流程id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long flowId;
+
+    public Long getFlowId() {
+        return flowId;
+    }
+
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
+    }
+
     public String getUpdateName() {
         return updateName;
     }

+ 17 - 0
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/bean/dto/flow/ToDoTaskDto.java

@@ -20,6 +20,9 @@ public class ToDoTaskDto implements Serializable {
     @ApiModelProperty(value = "待办消息")
     List<StandardFlowWorkMsg> todoTaskList;
 
+    @ApiModelProperty(value = "待办详情消息")
+    HandleMessageDto handleMessageDto;
+
     public ToDoTaskDto() {
 
     }
@@ -29,6 +32,20 @@ public class ToDoTaskDto implements Serializable {
         this.todoTaskList = todoTaskList;
     }
 
+    public ToDoTaskDto(StandardFlowData flowData, List<StandardFlowWorkMsg> todoTaskList, HandleMessageDto handleMessageDto) {
+        this.flowData = flowData;
+        this.todoTaskList = todoTaskList;
+        this.handleMessageDto = handleMessageDto;
+    }
+
+    public HandleMessageDto getHandleMessageDto() {
+        return handleMessageDto;
+    }
+
+    public void setHandleMessageDto(HandleMessageDto handleMessageDto) {
+        this.handleMessageDto = handleMessageDto;
+    }
+
     public StandardFlowData getFlowData() {
         return flowData;
     }

+ 20 - 0
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/cache/RedisKeyHelper.java

@@ -0,0 +1,20 @@
+package com.qmth.teachcloud.exchange.common.cache;
+
+public class RedisKeyHelper {
+    private static String underLine = "_";
+
+    /**
+     * gdpu_flow
+     */
+    private static String gdpuFlowKeyPrefix = "gdpu_flow:";
+
+    /**
+     * 流程id
+     *
+     * @param flowId
+     * @return
+     */
+    public static String flowIdCacheKey(Long flowId) {
+        return gdpuFlowKeyPrefix + flowId;
+    }
+}

+ 11 - 5
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/contant/SystemConstant.java

@@ -23,20 +23,26 @@ public class SystemConstant {
     /**
      * 广药mq请求参数
      */
-    public static final String GDPU_APP_ID = "3E5E377838002556";
-    public static final String GDPU_APP_SECRET = "aa7ba8bfc8a14e15a886a2492e66cbdd";
+//    public static final String GDPU_APP_ID = "3E5E377838002556";
+//    public static final String GDPU_APP_SECRET = "aa7ba8bfc8a14e15a886a2492e66cbdd";
+    public static final String DEFAULT_DATE = "yyyyMMdd";
+    public static final String DEFAULT_DATE_PATTERN = "yyyy-MM-dd HH:mm:ss";
     public static final String GDPU_SYS_APP_ID = "sysAppId";
+    public static final String GDPU_APP_ID_PARAM = "gdpuAppId";
+    public static final String GDPU_APP_SECRET_PARAM = "gdpuAppSecret";
+    public static final String GDPU_SYS_APP_ID_PARAM = "gdpuSysAppId";
+    public static final String GDPU_SERVICE_ADDRESS_PARAM = "gdpuServiceAddress";
+
     public static final String GDPU_DOCUN_ID = "docunId";
     public static final String GDPU_HEADER_APP_ID = "appid";
     public static final String GDPU_HEADER_APP_SECRET = "secret";
-    public static final String GDPU_MQ_PUSH_URL = "https://portal.gdpu.edu.cn/mq/todotask/send";
-
+//    public static final String GDPU_MQ_PUSH_URL = "https://portal.gdpu.edu.cn/mq/todotask/send";
 
     /**
      * api前缀
      */
     public static final String PREFIX_URL_OPEN = "/open";
-    public static final String PREFIX_URL_GDPU = "/admin/affair";
+    public static final String PREFIX_URL_GDPU_GET_BACK_LOG = "/getbacklog";
     public static final String PREFIX_URL_GDPU_MQ = "/open/mq";
 
     /**

+ 28 - 0
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/enums/flow/FlowMqFieldEnum.java

@@ -0,0 +1,28 @@
+package com.qmth.teachcloud.exchange.common.enums.flow;
+
+/**
+ * @Description: 考试记录字段
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/9/18
+ */
+public enum FlowMqFieldEnum {
+
+
+    schoolId("学校id"),
+
+    todotask("待办"),
+
+    donetask("已办");
+
+    private String title;
+
+    private FlowMqFieldEnum(String title) {
+        this.title = title;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+}

+ 235 - 0
teachcloud-exchange-common/src/main/java/com/qmth/teachcloud/exchange/common/util/RedisUtil.java

@@ -0,0 +1,235 @@
+package com.qmth.teachcloud.exchange.common.util;
+
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @Description: redis util
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2020/4/15
+ */
+@Component
+public class RedisUtil {
+
+    @Resource
+    RedisTemplate<String, Object> redisTemplate;
+
+    /**
+     * 批量获取key的value
+     *
+     * @param keys
+     * @return
+     */
+    public List<?> multiGet(Set keys) {
+        return redisTemplate.opsForValue().multiGet(keys);
+    }
+
+    /**
+     * 获取key like
+     *
+     * @param key
+     * @return
+     */
+    public Set<?> getKeyPatterns(String key) {
+        if (Objects.nonNull(key)) {
+            return redisTemplate.keys(key);
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * 设置hash
+     *
+     * @param key
+     * @param hashKey
+     * @param hashValue
+     */
+    public void set(String key, String hashKey, Object hashValue) {
+        redisTemplate.opsForHash().put(key, hashKey, hashValue);
+    }
+
+    /**
+     * 获取hash
+     *
+     * @param key
+     * @param hashKey
+     * @return
+     */
+    public Object get(String key, String hashKey) {
+        return redisTemplate.opsForHash().get(key, hashKey);
+    }
+
+    /**
+     * hash删除
+     *
+     * @param key
+     * @param hashKey
+     */
+    public void delete(String key, String hashKey) {
+        redisTemplate.opsForHash().delete(key, hashKey);
+    }
+
+    /**
+     * 获取hash大小
+     *
+     * @param key
+     * @return
+     */
+    public Long getHashSize(String key) {
+        return redisTemplate.opsForHash().size(key);
+    }
+
+    /**
+     * 获取hash map
+     *
+     * @param key
+     * @return
+     */
+    public Map getHashEntries(String key) {
+        return redisTemplate.opsForHash().entries(key);
+    }
+
+    /**
+     * 分布式锁
+     *
+     * @param key
+     * @param timeout SECONDS
+     * @return
+     */
+    public boolean lock(String key, long timeout) {
+        long expireAt = System.currentTimeMillis() + (timeout * 1000) + 1;
+        return redisTemplate.opsForValue().setIfAbsent(key, expireAt, timeout, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 删除锁
+     *
+     * @param key
+     * @return
+     */
+    public void releaseLock(String key) {
+        redisTemplate.expire(key, 100, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * 删除锁(课程序号)
+     *
+     * @param key
+     * @return
+     */
+    public void releaseCourseSequenceLock(String key) {
+        redisTemplate.expire(key, 1, TimeUnit.MILLISECONDS);
+    }
+
+    /**
+     * 设置缓存
+     *
+     * @param key
+     * @param o
+     */
+    public void set(String key, Object o) {
+        redisTemplate.opsForValue().set(key, o);
+    }
+
+    /**
+     * 设置缓存
+     *
+     * @param key
+     * @param o
+     * @param time
+     * @param timeUnit
+     */
+    public void set(String key, Object o, long time, TimeUnit timeUnit) {
+        redisTemplate.opsForValue().set(key, o, time, timeUnit);
+    }
+
+    /**
+     * 设置缓存
+     *
+     * @param key
+     * @param o
+     * @param time SECONDS
+     */
+    public void set(String key, Object o, long time) {
+        set(key, o, time, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 获取缓存
+     *
+     * @param key
+     * @return
+     */
+    public Object get(String key) {
+        return redisTemplate.opsForValue().get(key);
+    }
+
+    /**
+     * 删除缓存
+     *
+     * @param key
+     * @return
+     */
+    public void delete(String key) {
+        redisTemplate.expire(key, 0, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 保存hash结构
+     *
+     * @param key
+     * @param map
+     */
+    public void setForHash(String key, Map<String, Object> map) {
+        redisTemplate.opsForHash().putAll(key, map);
+    }
+
+    /**
+     * 保存list
+     *
+     * @param key
+     * @param Object
+     */
+    public void setForLeftList(String key, Object Object) {
+        redisTemplate.opsForList().leftPush(key, Object);
+    }
+
+    /**
+     * 获取list
+     *
+     * @param key
+     */
+    public Object getForRightList(String key) {
+        return redisTemplate.opsForList().rightPop(key, 0, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 设置过期时间(秒)
+     *
+     * @param key
+     * @param timeOutSecond
+     */
+    public void expire(String key, int timeOutSecond) {
+        redisTemplate.expire(key, timeOutSecond, TimeUnit.SECONDS);
+    }
+
+    /**
+     * 设置过期时间
+     *
+     * @param key
+     * @param timeOut
+     */
+    public void expire(String key, long timeOut, TimeUnit timeUnit) {
+        redisTemplate.expire(key, timeOut, timeUnit);
+    }
+}