Преглед на файлове

象屿待办推送验证

malk преди 3 седмици
родител
ревизия
25b30f6386

+ 190 - 56
mjava-suodisi/src/main/java/com/malk/suodisi/controller/XYController.java

@@ -1,27 +1,25 @@
 package com.malk.suodisi.controller;
 
-import cn.hutool.core.util.ObjectUtil;
-import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.malk.server.aliwork.YDConf;
-import com.malk.server.aliwork.YDParam;
-import com.malk.server.common.McException;
 import com.malk.server.common.McR;
-import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.DDR_New;
 import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.suodisi.entity.XyTodo;
 import com.malk.suodisi.server.XYR;
 import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
-import com.malk.utils.UtilServlet;
-import com.sun.org.apache.bcel.internal.generic.NEW;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-import java.util.*;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 错误抛出与拦截详见 CatchException
@@ -30,6 +28,14 @@ import java.util.*;
 @RestController
 @RequestMapping("/xy")
 public class XYController {
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private YDConf ydConf;
 
     final static String XY_sys = "XYDING";
     final static String XY_secure = "51d7cbff-806f-4bc9-aca8-7a26fdd6327c";
@@ -42,7 +48,9 @@ public class XYController {
     }
 
     private static String getXyUrl(String path) {
-        return "https://xyapiuat.xiangyu.cn/xmxyg/todo/epi" + path;
+        return "http://xyapiuat.xiangyu.cn:8000/xmxyg/todo/epi" + path;
+//        return "http://10.16.8.160:8011/TODO/rest/ofs/ProxyServices" + path;
+//        return "https://xyesb.xiangyu.com:8011/TODO/rest/ofs/ProxyServices" + path;
     }
 
     /**
@@ -50,62 +58,188 @@ public class XYController {
      * - prd
      * 1. 待办创建, 更新均需要传递全部参数 (目前仅会校验审批时间不能小于历史数据)
      * 2. 接收人存在多人时, 统一待办会自动拆分为多个 (待办中心以 业务单据号 + 用户域账号)
-     *
-     * @param category       待办分类
-     * @param optType        操作类型:1待办、2已办、3待阅
-     * @param busNo          业务单据号
-     * @param title          待办标题
-     * @param currentStatus  待办进度
-     * @param pcUrl          待办PC端地址
-     * @param appUrl         待办移动端地址
-     * @param createDateTime 创建时间
-     * @param creator        创建人域账号(钉钉工号)
-     * @param creatorName    创建人姓名
-     * @param receivers      接收人姓名
-     * @param receiverNames  接收人域账号(钉钉工号)
-     * @param keywords       关键字字段
      */
-    private void syncXyTodo(String category, int optType, String busNo, String title, String currentStatus, String pcUrl, String appUrl,
-                              String createDateTime, String creator, String creatorName, String receivers, String receiverNames, List<String> keywords) {
+    private void syncXyTodo(XyTodo todo) {
+        try {
+            Map body = todo.toMap();
+            XYR r = (XYR) UtilHttp.doPost(getXyUrl("/push"), UtilMap.map("deipaaskeyauth","XahX56IIQ27SQ9hiKcp3T031A23bB4fw"), body, XYR.class);
+
+            log.info("创建统一待办, {}", r);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 删除象屿统一待办
+     */
+    private void deleteXyTodo(String busNo) {
+        try {
+            XYR r = (XYR) UtilHttp.doPost(getXyUrl("/delete"), null, UtilMap.map("busNo",busNo), XYR.class);
+
+            log.info("删除统一待办, {}", r);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 宜搭待办
+     */
+    @PostMapping("/sync")
+    McR sync(@RequestBody Map map) {
+        String formInstId = UtilMap.getString(map, "formInstId");//审批实例id
+
+        String busNo = UtilMap.getString(map, "busNo");//唯一流水号
+
+        String boName = UtilMap.getString(map,"boName");//单据名称
+
+        String pcUrl = "https://xiangyu.aliwork.com/"+ydConf.getAppType()+"/processDetail?procInsId="+formInstId;
+        String appUrl = "https://xiangyu.aliwork.com/"+ydConf.getAppType()+"/processDetail?procInsId="+formInstId;
+
+        //查询宜搭审批记录, 完成回调, 完成更新
+        Map<String,Object> param = new HashMap<>();
+        param.put("appType",ydConf.getAppType());
+        param.put("systemToken",ydConf.getSystemToken());
+        param.put("userId","yida_pub_account");
+        param.put("processInstanceId",formInstId);
+
+        Map<String,Object> result = (Map<String,Object>) JSONObject.parse(UtilHttp.doGet("https://api.dingtalk.com/v1.0/yida/processes/operationRecords", ddClient.initTokenHeader(), param));
+
+        List<Map<String,Object>> operationRecords = UtilMap.getList(result,"result");
+
+        XyTodo xyTodo = new XyTodo(XY_sys,XY_secure,DD_category.get(0));
+
+        xyTodo.setBusNo(busNo);//唯一流水号
+        xyTodo.setCreateDateTime(UtilDateTime.formatDateTime(new Date()));//创建时间
+        xyTodo.setPcUrl(pcUrl);
+        xyTodo.setAppUrl(appUrl);
+        xyTodo.setOptType(2);//操作类型:1、待办;2、已办;3、待阅
+        xyTodo.setCreateDateTime(UtilDateTime.formatDateTime(new Date()));//创建时间
+        xyTodo.setReceiveDateTime(UtilDateTime.formatDateTime(new Date()));//接收时间
+        xyTodo.setApproveDateTime(UtilDateTime.formatDateTime(new Date()));//审批时间
+
+        boolean isFirst = true;
+
+        //创建人、接收人账号应取象屿平台账号,若找不到账号则固定人员:陈文良
+        for (Map<String,Object> operationRecord : operationRecords) {
+            //第一条审批记录为发起节点
+            if (isFirst) {
+
+                String creatorName = UtilMap.getString(operationRecord, "operatorName");
+                String ddUserId = UtilMap.getString(operationRecord, "operatorUserId");
+                String creator = getXyUserId(ddUserId);
+
+                //若无域账号
+                if (Strings.isBlank(creator)){
+                    creator = "wl.chen";//创建人域账号
+                    creatorName = "陈文良";//创建人姓名
+                }
+
+                xyTodo.setCreator(creator);
+                xyTodo.setCreatorName(creatorName);
+                xyTodo.setTitle(boName + "-" + creatorName + "-" + busNo);//标题
+
+                isFirst = false;
+
+                continue;
+            }
 
-        Map body = UtilMap.map("sysCode, secureCode, busType, optType, isSupportBatch, receiveDateTime", XY_sys, XY_secure, category, optType, false, UtilDateTime.formatDateTime(new Date()));
-        body.putAll(UtilMap.map("busNo, title, currentStatus, pcUrl, appUrl, createDateTime", busNo, title, currentStatus, pcUrl, appUrl, createDateTime));
-        body.putAll(UtilMap.map("creator, creatorName, receivers, receiverNames, keywords", creator, creatorName, receivers, receiverNames, keywords));
+            String type = UtilMap.getString(operationRecord, "type");
 
-        XYR r = (XYR) UtilHttp.doPost(getXyUrl("/push"), null, body, XYR.class);
+            switch (type){
+                case "HISTORY":
+                    //统一待办仅展示最新 暂不考虑历史记录
+                    /*xyTodo.setOptType(2);
 
-        log.info("创建统一待办, {}", r);
+                    xyTodo.setReceivers(UtilMap.getString(operationRecord,"operatorUserId"));//接收人域账号
+                    xyTodo.setReceiverNames(UtilMap.getString(operationRecord,"operatorName"));//接收人姓名
+                    xyTodo.setApproveDateTime(convertDateTime(UtilMap.getString(operationRecord, "operateTimeGMT")));//审批时间
 
+                    //若该代办已存在,则拼接接收人  若该代办不存在,添加该代办
+                    if (!isExist(xyTodoList, xyTodo)) {
+                        xyTodoList.add(xyTodo);
+                    }*/
+
+                    break;
+                case "TODO":
+                    xyTodo.setOptType(1);
+                    xyTodo.setCurrentStatus(UtilMap.getString(operationRecord,"showName"));//当前状况(流程描述)
+
+                    String ddUserId = UtilMap.getString(operationRecord, "operatorUserId");
+                    String receiversName = UtilMap.getString(operationRecord, "operatorName");
+                    String receivers = getXyUserId(ddUserId);
+
+                    //若无域账号
+                    if (Strings.isBlank(receivers)){
+                        receivers = "wl.chen";
+                        receiversName = "陈文良";
+                    }
+                    xyTodo.setReceivers(receivers);//接收人域账号
+                    xyTodo.setReceiverNames(receiversName);//接收人姓名
+
+                    break;
+                case "FORCAST":break;
+                default:break;
+            }
+        }
+
+        //全部已办
+        if (Strings.isBlank(xyTodo.getReceivers())){
+            //最后一个审批记录审批人设为接收人
+            Map<String, Object> operationRecord = operationRecords.get(operationRecords.size() - 1);
+
+            String ddUserId = UtilMap.getString(operationRecord, "operatorUserId");
+            String receiversName = UtilMap.getString(operationRecord, "operatorName");
+            String receivers = getXyUserId(ddUserId);
+            //若无域账号
+            if (Strings.isBlank(receivers)){
+                receivers = "wl.chen";
+                receiversName = "陈文良";
+            }
+
+            xyTodo.setReceivers(receivers);//接收人域账号
+            xyTodo.setReceiverNames(receiversName);//接收人姓名
+            xyTodo.setCurrentStatus(UtilMap.getString(operationRecord,"showName"));//当前状况(流程描述)
+
+        }
+
+        syncXyTodo(xyTodo);
+
+        return McR.success();
     }
 
     /**
-     * 宜搭待办
+     * 删除宜搭待办
      */
-    @PostMapping("/sync")
-    McR sdsUpdate(HttpServletRequest request) {
-
-        Map data = UtilServlet.getParamMap(request);
-        log.info("宜搭待办, {}", JSON.toJSONString(data));
-        int optType = UtilMap.getInt(data, "optType");
-        String busNo = UtilMap.getString(data, "busNo");
-        String title = UtilMap.getString(data, "title");
-        String currentStatus = UtilMap.getString(data, "currentStatus");
-        String pcUrl = UtilMap.getString(data, "pcUrl");
-        String appUrl = UtilMap.getString(data, "appUrl");
-        String createDateTime = UtilDateTime.formatDateTime(new Date(UtilMap.getLong(data, "createDateTime")));
-        String creator = UtilMap.getString(data, "creator");
-        String creatorName = UtilMap.getString(data, "creatorName");
-        String receivers = UtilMap.getString(data, "receivers");
-        String receiverNames = UtilMap.getString(data, "receiverNames");
-        String keywords = UtilMap.getString(data, "keywords");
-
-        syncXyTodo(DD_category.get(0), optType, busNo, title, currentStatus, pcUrl, appUrl, createDateTime,creator , creatorName,receivers, receiverNames, Arrays.asList(keywords));
-
-        // Todo 查询宜搭审批记录, 完成回调, 完成更新
+    @PostMapping("/delete")
+    McR delete(@RequestBody Map map) {
+        String busNo = UtilMap.getString(map, "busNo");//唯一流水号
+
+        deleteXyTodo(busNo);
 
         return McR.success();
     }
 
+    @GetMapping("/test")
+    McR test(){
+        return McR.success("111");
+    }
+
+    //钉钉userId查询象屿域账号(钉钉工号)
+    private String getXyUserId(String userId){
+        DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, ddClient.initTokenParams(), UtilMap.map("userid", userId), DDR_New.class);
+
+        Map result = (Map) ddrNew.getResult();
+
+        String xyUserId = UtilMap.getString(result, "job_number");
+
+        return xyUserId;//接收人域账号
+    }
+
+
+
+
 }
 
 

+ 146 - 0
mjava-suodisi/src/main/java/com/malk/suodisi/entity/XyTodo.java

@@ -0,0 +1,146 @@
+package com.malk.suodisi.entity;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Data
+public class XyTodo {
+    //系统标识(每个系统和环境不同,需要联系管理员获取)
+    private String sysCode;
+
+    //密钥(每个系统和环境不同,需要联系管理员获取)
+    private String secureCode;
+
+    //唯一流水号
+    private String busNo;
+
+    //标题
+    private String title;
+
+    //业务层级类型,例如:"人力资源流程,员工出差申请",层级必须不少于二级。
+    private String busType;
+
+    //当前状况(流程描述,即当前节点名称)
+    private String currentStatus;
+
+    //待办 PC 地址,传输相对路径时需要向管理员提供唯一地址前缀,该地址需能过 OA 单点进行跳转
+    private String pcUrl;
+
+    //待办 APP 地址,传输相对路径时需要向管理员提供唯一地址前缀,该地址需能过 OA 单点进行跳转
+    private String appUrl;
+
+    //操作类型:1、待办;2、已办;3、待阅
+    //如果新的推送类型一样,本次推送不生效,所以不能通过重复推送的办法去修改例如标题,审批状态等数据,如果需要修改数据,请对接专门的修改接口
+    private int optType;
+
+    //创建人域账号
+    private String creator;
+
+    //创建人姓名
+    private String creatorName;
+
+    //创建时间,样例 : "yyyy-MM-dd HH:mm:ss"
+    private String createDateTime;
+
+    //接收人域账号,字符串形式,支持多人逗号隔开
+    private String receivers;
+
+    //接收人姓名,字符串形式,支持多人逗号隔开
+    private String receiverNames;
+
+    //接收时间,样例 : "yyyy-MM-dd HH:mm:ss"
+    private String receiveDateTime;
+
+    //是否支持批量操作
+    private boolean isSupportBatch;
+
+    //审批时间,新的数据必须大于等于数据库中的旧数据,本次推送才生效
+    private String approveDateTime;
+
+    //关键字字段(该字段为搜索条件,对单据进行定位)
+    private List<String> keywords;
+
+    //流程 id(主要用于统一待办添加关注功能,以及催办功能)
+    private String flowId;
+
+    public Map toMap() throws Exception {
+        ObjectMapper mapper = new ObjectMapper();
+        // 禁用属性名自动检测,直接使用字段名
+        mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
+        mapper.setVisibility(PropertyAccessor.GETTER, JsonAutoDetect.Visibility.NONE);
+        return mapper.convertValue(this, Map.class);
+    }
+
+    public XyTodo() {
+    }
+
+    public XyTodo(String sysCode, String secureCode, String busType) {
+        this.sysCode = sysCode;
+        this.secureCode = secureCode;
+        this.busType = busType;
+    }
+
+    public void setCurrentStatus(String currentStatus) {
+        if (Objects.nonNull(this.currentStatus)){
+            String[] split = this.currentStatus.split(",");
+
+            boolean isExist = false;
+            for (String s : split) {
+                if (s.equals(currentStatus)) {
+                    isExist = true;
+                }
+            }
+
+            if (!isExist) {
+                this.currentStatus += "," + currentStatus;
+            }
+        }else {
+            this.currentStatus = currentStatus;
+        }
+    }
+
+    public void setReceiverNames(String receiverNames) {
+        if (Objects.nonNull(this.receiverNames)){
+            String[] split = this.receiverNames.split(",");
+
+            boolean isExist = false;
+            for (String s : split) {
+                if (s.equals(receiverNames)) {
+                    isExist = true;
+                }
+            }
+
+            if (!isExist) {
+                this.receiverNames += "," + receiverNames;
+            }
+        }else {
+            this.receiverNames = receiverNames;
+        }
+    }
+
+    public void setReceivers(String receivers) {
+        if (Objects.nonNull(this.receivers)){
+            String[] split = this.receivers.split(",");
+
+            boolean isExist = false;
+            for (String s : split) {
+                if (s.equals(receivers)) {
+                    isExist = true;
+                }
+            }
+
+            if (!isExist) {
+                this.receivers += "," + receivers;
+            }
+        }else{
+            this.receivers = receivers;
+        }
+
+    }
+}