lfx 1 week ago
parent
commit
0c38a9bfb4

+ 5 - 0
mjava-cloudpure/pom.xml

@@ -24,6 +24,11 @@
             <artifactId>mjava</artifactId>
             <version>${mjava.version}</version>
         </dependency>
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.4</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 90 - 0
mjava-cloudpure/src/main/java/com/malk/cloudpure/controller/XBBController.java

@@ -2,11 +2,16 @@ package com.malk.cloudpure.controller;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.malk.cloudpure.helper.ApiRequestWrapper;
 import com.malk.server.common.McException;
 import com.malk.server.common.McR;
+import com.malk.server.xbongbong.DigestUtil;
 import com.malk.server.xbongbong.XBBConf;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.service.dingtalk.DDClient_Notable;
 import com.malk.service.dingtalk.DDClient_Personnel;
 import com.malk.service.xbongbong.XBBClient;
 import com.malk.utils.UtilMap;
@@ -14,6 +19,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -32,6 +40,9 @@ public class XBBController {
     @Autowired
     private DDClient_Contacts ddClientContacts;
 
+    @Autowired
+    private DDClient_Notable ddClientNotable;
+
     private static List<Integer> AUTH_WHITELIST_DEPFIDS=Arrays.asList(95172190,333372743); // 权限白名单
 
     /**
@@ -165,6 +176,85 @@ private Long getWorkOrderInfo(@RequestParam String workOrderSerierNO) {
         ddClientContacts.getUserInfoById(ddClient.getAccessToken(), "16608972969409067");
         return McR.success();
     }
+
+    /**
+     * 测试token
+     */
+    private static final String TOKEN = "b88c3b27b11fa252500ce3041cc918fe";
+    @RequestMapping(value = "/callback", method = RequestMethod.POST)
+    public String test(HttpServletRequest httpServletRequest) {
+        String response;
+        try {
+            // 获取请求体中的参数
+            JSONObject params = getParams(httpServletRequest);
+//            System.out.println(JSON.toJSONString(params));
+            log.info("callback request= " + JSON.toJSONString(params));
+            // 获取请求头中的sign
+            String sign = httpServletRequest.getHeader("sign");
+            if (checkSign(params, sign)) {
+                log.info("callback check success!");
+                if(params.getString("type").equals("customerCommunicate")
+                && params.getString("operate").equals("new")){
+                    Map map=xbbClient.getDataDetail(XBBConf.API_DETAIL_communicate,params.getLong("dataId"));
+                    Map data = (Map) map.get("data");
+                    System.out.println(JSONObject.toJSONString(map));
+                    String creatorId=UtilMap.getString(UtilMap.getMap(data,"creatorId"),"id");
+                    String content=String.valueOf(data.get("text_6"));
+                    String merName=UtilMap.getString(UtilMap.getMap(data,data.containsKey("text_1")?"text_1":"text_5"),"name");
+                    System.out.println(merName+":"+content);
+
+                    Map<String,Object> paramsMap = new HashMap<>();
+                    paramsMap.put("filter", UtilMap.map("combination, conditions","and", Arrays.asList(UtilMap.map("field, operator, value","客户全称","equal",Arrays.asList(merName)))));
+                    List<Map> list=ddClientNotable.getRecords(ddClient.getAccessToken(),"bxgzX5wq4YoJPQG3jLvR8Ry2OB79ALPD","dulvlx8e4ru1wmna9lt8m","0LeoESGUiSKn272PRD8Qv3AiEiE",paramsMap);
+                    for(Map detail:list){
+                        String id=UtilMap.getString(detail,"id");
+                        Map <String,Object> map1=new HashMap<>();
+                        map1.put("id",id);
+                        map1.put("fields",UtilMap.map("详情", content));
+                        List<Map> updateRecords= Arrays.asList(map1);
+                        ddClientNotable.updateRecords(ddClient.getAccessToken(),"bxgzX5wq4YoJPQG3jLvR8Ry2OB79ALPD","dulvlx8e4ru1wmna9lt8m","0LeoESGUiSKn272PRD8Qv3AiEiE",updateRecords);
+                    }
+                }
+
+            }
+            response = "request analysis success!";
+        } catch (Exception e) {
+            response = "request analysis error!";
+        }
+        return response;
+    }
+
+    /**
+     * sign校验,如果需要对回调请求进行合法性校验,需要对传过来的sign做验证
+     * @param params 有序的接收到的参数
+     * @param orSign 请求传过来的sign
+     * @return
+     */
+    private boolean checkSign(JSONObject params, String orSign) {
+        // 将请求参数与token进行SHA256运算,得到校验签名sign
+        String sign = DigestUtil.Encrypt(params.toJSONString() + TOKEN, "SHA-256");
+        // 将请求过来的checkSign与生成的sign进行匹配,匹配成功则证明到达该接口的请求是由销帮帮发出的安全的请求
+        if (Objects.equals(orSign, sign)) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 获取参数
+     * @param request
+     * @return JSONObject 将请求参数有序接收后格式示例:{"corpid":"XXX","dataId":123456,"formId":714275,"operate":"EDIT","saasMark":1,"type":"CUSTOMER"}
+     * @throws IOException
+     */
+    public static JSONObject getParams(HttpServletRequest request) throws IOException {
+        ApiRequestWrapper requestWrapper = new ApiRequestWrapper(request);
+        byte[] requestWrapperBody = requestWrapper.getBody();
+        String requestWrapperString = new String(requestWrapperBody, StandardCharsets.UTF_8);
+        LinkedHashMap params = JSON.parseObject(requestWrapperString, LinkedHashMap.class, Feature.OrderedField);
+        JSONObject requestJsonObject = new JSONObject(true);
+        requestJsonObject.putAll(params);
+        return requestJsonObject;
+    }
 }
 
 

+ 79 - 0
mjava-cloudpure/src/main/java/com/malk/cloudpure/helper/ApiRequestWrapper.java

@@ -0,0 +1,79 @@
+package com.malk.cloudpure.helper;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import org.apache.commons.io.IOUtils;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * 回调请求参数数据封装
+ */
+public class ApiRequestWrapper extends HttpServletRequestWrapper {
+    private byte[] body;
+    private ServletInputStreamWrapper inputStreamWrapper;
+
+    public ApiRequestWrapper(HttpServletRequest request) throws IOException {
+        super(request);
+        this.body = IOUtils.toByteArray(request.getInputStream());
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(this.body);
+        this.inputStreamWrapper = new ServletInputStreamWrapper(byteArrayInputStream);
+        resetInputStream();
+    }
+
+    private void resetInputStream() {
+        this.inputStreamWrapper.setInputStream(new ByteArrayInputStream(this.body != null ? this.body : new byte[0]));
+    }
+
+    public byte[] getBody() {
+        return this.body.clone();
+    }
+
+    public void setBody(String body) {
+        this.body = body.getBytes(StandardCharsets.UTF_8);
+        resetInputStream();
+    }
+
+    @Override
+    public ServletInputStream getInputStream() throws IOException {
+        return this.inputStreamWrapper;
+    }
+
+    @Override
+    public BufferedReader getReader() throws IOException {
+        return new BufferedReader(new InputStreamReader(this.inputStreamWrapper, StandardCharsets.UTF_8));
+    }
+
+    @Data
+    @AllArgsConstructor
+    private static class ServletInputStreamWrapper extends ServletInputStream {
+
+        private InputStream inputStream;
+
+        @Override
+        public boolean isFinished() {
+            return true;
+        }
+
+        @Override
+        public boolean isReady() {
+            return false;
+        }
+
+        @Override
+        public void setReadListener(ReadListener readListener) {
+
+        }
+
+        @Override
+        public int read() throws IOException {
+            return this.inputStream.read();
+        }
+    }
+
+}

+ 1 - 0
mjava/src/main/java/com/malk/server/common/VenR.java

@@ -26,6 +26,7 @@ public class VenR extends BaseDto {
     public static final String RC_YD = "com.malk.server.aliwork.YDR";
     public static final String RC_ALY = "com.malk.server.aliyun.ALYR";
     public static final String RC_DD = "com.malk.server.dingtalk.DDR";
+    public static final String RC_DD_RE = "com.malk.server.dingtalk.DDR_RECORDS";
     public static final String RC_DD_New = "com.malk.server.dingtalk.DDR_New";
     public static final String RC_EKB = "com.malk.server.ekuaibao.EKBRR";
     public static final String RC_FXK = "com.malk.server.fxiaoke.FXKR ";

+ 102 - 0
mjava/src/main/java/com/malk/server/dingtalk/DDR_RECORDS.java

@@ -0,0 +1,102 @@
+package com.malk.server.dingtalk;
+
+import com.malk.server.common.McException;
+import com.malk.server.common.VenR;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 返回值配置参考McR
+ */
+@Data
+@NoArgsConstructor
+public class DDR_RECORDS<T> extends VenR {
+
+    // 请求状态
+    private boolean success;
+
+    private String errcode;
+
+    private String errmsg;
+
+    private T result;
+
+    /**
+     * token
+     */
+    private String accessToken;
+    private int expiresIn;
+
+    /**
+     * ticket
+     */
+    private String ticket;
+
+    /**
+     * 审批实例ID
+     */
+    private String processInstanceId;
+
+    /**
+     * 审批实例详情
+     */
+    private Map processInstance;
+
+    /**
+     * 回调失败事件
+     */
+    private List<Map> failedList;
+
+    private boolean hasMore;
+
+    private List<Map> records;
+
+    private String corpid;
+
+    /**
+     * 发送工作通知
+     */
+    private String task_id; // 可调用获取工作通知消息的发送结果查询结果
+
+    /**
+     * 考勤打卡数据
+     */
+    private List<Map> recordresult;
+
+    // 成功状态标记
+    private final static String SUC_CODE = "0";
+
+    // 创建用户邀请成功提示
+    private final static String USER_CREATE = "40103";
+
+    /**
+     * 断言错误信息
+     */
+    @Override
+    public void assertSuccess() {
+    }
+
+    /**
+     * 通用post请求
+     */
+    public static DDR_RECORDS doPost(String url, Map header, Map param, Map body) {
+        return (DDR_RECORDS) DDR_RECORDS.doPost(url, header, param, body, VenR.RC_DD_RE);
+    }
+
+    /**
+     * 通用get请求
+     */
+    public static DDR_RECORDS doGet(String url, Map header, Map param) {
+        return (DDR_RECORDS) DDR_RECORDS.doGet(url, header, param, VenR.RC_DD_RE);
+    }
+
+    /**
+     * 通用put请求
+     */
+    public static DDR_RECORDS doPut(String url, Map header, Map param, Map body) {
+        return (DDR_RECORDS) DDR_RECORDS.doPut(url, header, param, body, VenR.RC_DD_RE);
+    }
+}

+ 1 - 0
mjava/src/main/java/com/malk/server/xbongbong/XBBConf.java

@@ -53,6 +53,7 @@ public class XBBConf {
     public static final String API_LIST_customer = "https://proapi.xbongbong.com/pro/v2/api/customer/list"; // 客户列表
     public static final String API_LIST_contract = "https://proapi.xbongbong.com/pro/v2/api/contract/list"; // 合同列表
     public static final String API_LIST_communicate = "https://proapi.xbongbong.com/pro/v2/api/communicate/list"; // 跟进记录
+    public static final String API_DETAIL_communicate = "https://proapi.xbongbong.com/pro/v2/api/communicate/detail"; // 跟进记录
     public static final String API_LIST_opportunity = "https://proapi.xbongbong.com/pro/v2/api/opportunity/list"; // 销售机会
     public static final String API_LIST_paymentSheet = "https://proapi.xbongbong.com/pro/v2/api/paymentSheet/list"; // 回款单
 

+ 12 - 0
mjava/src/main/java/com/malk/service/dingtalk/DDClient_Notable.java

@@ -0,0 +1,12 @@
+package com.malk.service.dingtalk;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DDClient_Notable {
+
+    List<Map> getRecords(String access_token,String baseId,String sheetIdOrName,String operatorId,Map<String,Object> params);
+
+    void updateRecords(String access_token,String baseId,String sheetIdOrName,String operatorId,List<Map> records);
+
+}

+ 31 - 0
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Notable.java

@@ -0,0 +1,31 @@
+package com.malk.service.dingtalk.impl;
+
+import com.malk.server.dingtalk.DDR;
+import com.malk.server.dingtalk.DDR_RECORDS;
+import com.malk.service.dingtalk.DDClient_Notable;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Slf4j
+public class DDImplClient_Notable implements DDClient_Notable {
+
+
+    @Override
+    public List<Map> getRecords(String access_token,String baseId, String sheetIdOrName, String operatorId, Map<String, Object> params) {
+        Map param = UtilMap.map("x-acs-dingtalk-access-token", access_token);
+        return (List<Map>) DDR_RECORDS.doPost("https://api.dingtalk.com/v1.0/notable/bases/"+baseId+"/sheets/"+sheetIdOrName+"/records/list?operatorId="+operatorId, param, null, params).getRecords();
+    }
+
+    @Override
+    public void updateRecords(String access_token,String baseId, String sheetIdOrName, String operatorId, List<Map> records) {
+        Map param = UtilMap.map("x-acs-dingtalk-access-token", access_token);
+        Map params = UtilMap.map("records", records);
+        DDR_RECORDS.doPut("https://api.dingtalk.com/v1.0/notable/bases/"+baseId+"/sheets/"+sheetIdOrName+"/records?operatorId="+operatorId, param, null, params);
+    }
+}

+ 4 - 0
mjava/src/main/java/com/malk/service/xbongbong/XBBClient.java

@@ -33,6 +33,10 @@ public interface XBBClient {
      */
     Map getDataResult(String url, @NotNull long formId, List<Map> conditions, Map extInfo);
 
+    /**
+     */
+    Map getDataDetail(String url, @NotNull long dataId);
+
     /**
      * 表单列表接口 [返回list]
      */

+ 7 - 0
mjava/src/main/java/com/malk/service/xbongbong/impl/XBBImplClient.java

@@ -91,6 +91,13 @@ public class XBBImplClient implements XBBClient {
         return (Map) xbbr.getResult();
     }
 
+    @Override
+    public Map getDataDetail(String url, long dataId) {
+        Map body = UtilMap.map("dataId, corpid, userId", dataId, xbbConf.getCorpid(), xbbConf.getUserId());
+        XBBR xbbr = (XBBR) XBBR.doPost(url, getHeaderSign(body), null, body, VenR.RC_XBB);
+        return (Map) xbbr.getResult();
+    }
+
     /**
      * 表单列表接口 [返回list]
      */