Kaynağa Gözat

逸耀同步签到数据

wzy 1 ay önce
ebeveyn
işleme
7372559fc0

+ 1 - 1
mjava-yiyao/pom.xml

@@ -42,7 +42,7 @@
     </dependencies>
 
     <build>
-        <finalName>boyang</finalName>
+        <finalName>yiyao</finalName>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>

+ 102 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/controller/CallBackController.java

@@ -0,0 +1,102 @@
+package com.malk.yiyao.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.malk.controller.DDCallbackController;
+import com.malk.server.dingtalk.DDConf;
+import com.malk.server.dingtalk.crypto.DingCallbackCrypto;
+import com.malk.service.dingtalk.DDClient_Event;
+import com.malk.yiyao.service.YiyaoService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+@Slf4j
+@RestController
+@Component
+@RequestMapping("/aa")
+public class CallBackController extends DDCallbackController {
+    @Autowired
+    private DDConf ddConf;
+
+    @Autowired
+    private DDClient_Event ddClient_event;
+
+    @Autowired
+    private YiyaoService yiyaoService;
+
+    /**
+     * 钉钉审批回调: [依赖包方案已弃用]
+     * -
+     * DingCallbackCrypto 方案: 官网案例 DingCallbackCrypto 不在钉钉架包, 需要单独引用
+     * 在钉钉开放平台重新保存回调地址后, 所有的注册事件会被关闭:: 通过代码注册不成功; 官方回复, 要么使用调用注册的方式 要么是后台的方式, 二选一
+     */
+    @SneakyThrows
+    public Map<String, String> invokeCallback(@RequestParam(value = "signature", required = false) String signature,
+                                              @RequestParam(value = "timestamp", required = false) String timestamp,
+                                              @RequestParam(value = "nonce", required = false) String nonce,
+                                              @RequestBody(required = false) JSONObject json) {
+        log.info("signature:{}",signature);
+        log.info("timestamp:{}",timestamp);
+        log.info("nonce:{}",nonce);
+        log.info("json:{}",json);
+
+        DingCallbackCrypto callbackCrypto = new DingCallbackCrypto(ddConf.getToken(), ddConf.getAesKey(), ddConf.getAppKey());
+        final String decryptMsg = callbackCrypto.getDecryptMsg(signature, timestamp, nonce, json.getString("encrypt"));
+        JSONObject eventJson = JSON.parseObject(decryptMsg);
+        Map success = callbackCrypto.getEncryptedMap(DDConf.CALLBACK_RESPONSE, System.currentTimeMillis(), DingCallbackCrypto.Utils.getRandomStr(8));
+
+        String eventType = eventJson.getString("EventType");
+        if (DDConf.CALLBACK_CHECK.equals(eventType)) {
+            log.info("----- [DD]验证注册 -----");
+            return success;
+        }
+        if ("check_in".equals(eventType)) {
+            String eventId = eventJson.getString("eventId");//事件id
+
+            log.info("[DD]签到回调, {}", eventJson);
+
+            // 检查回调事件是否已经处理过,如果是,则忽略该回调
+            if (isCallbackProcessed(eventId)) {
+                log.info("----- [DD]该签到回调事件已处理过 忽略该回调 -----");
+                return success;
+            }else {
+                // 将回调事件和当前时间戳添加到已处理集合中
+                long currentTime = System.currentTimeMillis();
+                eventList.put(eventId, currentTime);
+            }
+
+            yiyaoService.getCheckInData(eventJson);
+
+            return success;
+        }
+        log.info("----- [DD]已注册, 未处理的其它回调 -----, {}", eventJson);
+        return success;
+    }
+
+    //保存10s内已处理的回调事件
+    private Map<String, Long> eventList = new HashMap<>();
+
+    /**
+     * 检查该回调事件在10s内是否处理过,应对钉钉瞬间重复回调
+     *
+     * @param eventId 回调事件id
+     * @return 是否处理过
+     */
+    private boolean isCallbackProcessed(String eventId) {
+        // 清理超过10s的回调事件
+        long currentTime = System.currentTimeMillis();
+        long expirationTime = currentTime - TimeUnit.MINUTES.toMillis(10);
+        eventList.entrySet().removeIf(entry -> entry.getValue() < expirationTime);
+
+        return eventList.containsKey(eventId);
+    }
+
+}

+ 3 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/YiyaoService.java

@@ -1,5 +1,6 @@
 package com.malk.yiyao.service;
 
+import com.alibaba.fastjson.JSONObject;
 import com.malk.server.common.McR;
 
 public interface YiyaoService {
@@ -20,4 +21,6 @@ public interface YiyaoService {
     McR updateYiyao8();
 
     McR updateYiyao9();
+
+    void getCheckInData(JSONObject eventJson);
 }

+ 69 - 0
mjava-yiyao/src/main/java/com/malk/yiyao/service/impl/YiyaoServiceImpl.java

@@ -18,6 +18,7 @@ import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -1471,6 +1472,63 @@ public class YiyaoServiceImpl implements YiyaoService {
         return McR.success();
     }
 
+    @Override
+    public void getCheckInData(JSONObject eventJson) {
+        String timeStamp = eventJson.getString("timeStamp");//签到时间戳
+
+        timeStamp = roundToNearestThousand(Long.parseLong(timeStamp)) + "";
+
+        String staffId = eventJson.getString("StaffId");//签到人userId
+
+        //获取签到数据
+        Map body = new HashMap();
+        body.put("cursor",0);
+        body.put("size",100);
+        body.put("start_time",timeStamp);
+        body.put("end_time",timeStamp);
+        body.put("userid_list",staffId);
+
+
+
+        //查询用户详情
+        DDR_New ddrNew1 = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/v2/user/get", null, ddClient.initTokenParams(), UtilMap.map("userid", staffId), DDR_New.class);
+
+        Map result1 = (Map) ddrNew1.getResult();
+
+        String userName = UtilMap.getString(result1, "name");
+
+        //查询用户考勤数据
+        DDR_New ddrNew = (DDR_New) UtilHttp.doPost("https://oapi.dingtalk.com/topapi/checkin/record/get", null, ddClient.initTokenParams(), body, DDR_New.class);
+
+        Map result = (Map) ddrNew.getResult();
+
+        List list = UtilMap.getList(result, "page_list");
+
+        if (!list.isEmpty()){
+            Map formData = new HashMap();
+
+            Map checkInData = (Map) list.get(0);
+
+            Long checkinTime = UtilMap.getLong(checkInData, "checkin_time");
+            String detailPlace = UtilMap.getString(checkInData, "detail_place");
+            String remark = UtilMap.getString(checkInData,"remark");
+
+            formData.put("employeeField_mbypt8ro",Arrays.asList(staffId));//签到人
+            formData.put("textField_mbyq1cji",userName);//签到人-文本
+            formData.put("dateField_mbrb3qfy",checkinTime);//签到时间
+            formData.put("textField_mbrb3qfx",detailPlace);//签到地点
+            formData.put("textareaField_mbypt8rp",remark);//备注
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
+            String formattedDate = sdf.format(Long.parseLong(timeStamp));
+            formData.put("textField_mbrbdyl4","签到人:" +userName + ",签到时间:" + formattedDate + ",签到地点:" + detailPlace);//标题
+
+            ydClient.operateData(YDParam.builder()
+                    .formUuid("FORM-D4389CDAD1704F959E9D38CB64927AD8PKCH")
+                    .formDataJson(JSONObject.toJSONString(formData))
+                    .build(),YDConf.FORM_OPERATION.create);
+        }
+    }
+
 
     private List<Map> getYdDataList(String formUuid, String searchCondition, YDConf.FORM_QUERY formQuery) {
         List<Map> list = new ArrayList<>();
@@ -1488,4 +1546,15 @@ public class YiyaoServiceImpl implements YiyaoService {
         }while (ddrNew.getTotalCount() > ddrNew.getPageNumber() * pageSize);
         return list;
     }
+
+    public long roundToNearestThousand(long timestamp) {
+        // 将时间戳除以1000,得到秒级部分(带毫秒的小数部分)
+        double seconds = timestamp / 1000.0;
+
+        // 对秒级部分的个位数进行四舍五入(即对毫秒的千位四舍五入)
+        long roundedSeconds = Math.round(seconds);
+
+        // 将四舍五入后的秒级部分转换回毫秒时间戳
+        return roundedSeconds * 1000;
+    }
 }

+ 6 - 6
mjava-yiyao/src/main/resources/application-dev.yml

@@ -13,12 +13,12 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId: 2691784047
-  appKey: dinghbynhnd2dbgypmsa
-  appSecret: Kl5Xw8x0TlEIlvcJuUkYZD18UTTShJmfdKrAIpY8oX-Q_tazyUKA28nQh7dG5-mq
-  corpId: dingcc1b1ffad0d5ca1d
-  aesKey:
-  token:
+  agentId: 3914874648
+  appKey: dingyedbqoqricilvyog
+  appSecret: CAPT0hNRO5y-rHp81fmzMHz4LXYJhzkHqG1kh1L6OdM_LQPANR9IOoLtJrNLPVCc
+  corpId: dingf11f7d6ff834577b
+  aesKey: UqJRA1RTxarywiIWOK76BN8BSLfAN4gTDo6nEco4sqG
+  token: CpR7AsWa026FQV5VBNU5YrO5
 
 aliwork:
   appType: APP_HJJ3X3QN4WEWDHU2BJR2

+ 8 - 9
mjava-yiyao/src/main/resources/application-prod.yml

@@ -13,15 +13,14 @@ logging:
 
 # dingtalk
 dingtalk:
-  agentId: 3749205961
-  appKey: dingdcxnvojhmwi1lau0
-  appSecret: K0dfunjkLVQKzEN6KXbjdUxcVAX5_hyc0rTNzrj4MugXKc-dkn0erpAxzhSeGPVC
-  corpId:
-  aesKey:
-  token:
-  operator: 344749020127590108
+  agentId: 3914874648
+  appKey: dingyedbqoqricilvyog
+  appSecret: CAPT0hNRO5y-rHp81fmzMHz4LXYJhzkHqG1kh1L6OdM_LQPANR9IOoLtJrNLPVCc
+  corpId: dingf11f7d6ff834577b
+  aesKey: UqJRA1RTxarywiIWOK76BN8BSLfAN4gTDo6nEco4sqG
+  token: CpR7AsWa026FQV5VBNU5YrO5
 
 aliwork:
-  appType: APP_TTZS5KICGVVQNZ3RS8T4
-  systemToken: DWF66OA1K1VTVWET83C0SD6RULBO31AQEYG8MQO
+  appType: APP_HJJ3X3QN4WEWDHU2BJR2
+  systemToken: 7X866C81QPIHJKBFFM1QW4S8BV1U3U4MFO5RLY1