pruple_boy 1 month ago
parent
commit
0f7f26a48f

+ 24 - 1
mjava-hake/src/main/java/com/malk/hake/controller/HKController.java

@@ -20,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -99,7 +100,7 @@ public class HKController {
     McR syncContact() {
 
         log.info("手动触发, 通讯录同步");
-        hkClient.syncContact();
+        hkClient.syncContact(false);
         return McR.success();
     }
 
@@ -115,6 +116,28 @@ public class HKController {
         return McR.success();
     }
 
+    /**
+     * 手动同步考勤数据
+     */
+    @PostMapping("attendance/sync")
+    McR attendance(HttpServletRequest request) {
+
+        Map data = UtilServlet.getParamMap(request);
+        log.info("手动同步考勤数据, {}", data);
+        List<String> userIds = (List) JSON.parse(String.valueOf(data.get("userIds")));
+        hkClient.syncAttendance(UtilMap.getString(data, "tDate"), userIds);
+        return McR.success();
+    }
+
+    /**
+     * 增量补卡数据同步
+     */
+    @PostMapping("attendance/reissue")
+    McR reissue(HttpServletRequest request) {
+        
+        return McR.success();
+    }
+
     @Autowired
     private YDClient ydClient;
 

+ 2 - 2
mjava-hake/src/main/java/com/malk/hake/delegate/DDDelegate.java

@@ -54,7 +54,7 @@ public class DDDelegate implements DDEvent {
         log.info("executeEvent_Instance_Finish");
         String approveResult = isAgree ? "agree" : "refuse";
         if (isTerminate) approveResult = "terminated";
-        
+
 
         log.info("审批实例回调执行业务逻辑, {}", approveResult);
     }
@@ -66,6 +66,6 @@ public class DDDelegate implements DDEvent {
     @Override
     public void executeEvent_attendance_check(Map<String, ?> record) {
         log.info("executeEvent_attendance_check");
-        hkClient.callbackAttendance(record);
+        //hkClient.callbackAttendance(record);
     }
 }

+ 14 - 5
mjava-hake/src/main/java/com/malk/hake/schedule/HKScheduleTask.java

@@ -26,7 +26,7 @@ public class HKScheduleTask {
     @Scheduled(cron = "0 0 6,16 * * ? ")
     public void timer_1() {
         try {
-            hkClient.syncContact();
+            hkClient.syncContact(false);
         } catch (Exception e) {
             // 记录错误信息
             e.printStackTrace();
@@ -36,7 +36,7 @@ public class HKScheduleTask {
     @Scheduled(cron = "0 30 11,19 * * ? ")
     public void timer_2() {
         try {
-            hkClient.syncContact();
+            hkClient.syncContact(false);
         } catch (Exception e) {
             // 记录错误信息
             e.printStackTrace();
@@ -69,11 +69,20 @@ public class HKScheduleTask {
         }
     }
 
+//    /**
+//     * 清理打卡标记位: 每天早晨7点
+//     */
+//    @Scheduled(cron = "0 0 7 * * ? ")
+//    public void timer_5() {
+//        hkClient.clearClockStatus();
+//    }
+
     /**
-     * 清理打卡标记位: 每天早餐7点
+     * 全量同步考勤
      */
     @Scheduled(cron = "0 0 7 * * ? ")
     public void timer_5() {
-        hkClient.clearClockStatus();
+        // 同步前一日全量考勤数据
+//         hkClient.syncAttendance();
     }
-}
+}

+ 11 - 4
mjava-hake/src/main/java/com/malk/hake/service/HKClient.java

@@ -1,5 +1,6 @@
 package com.malk.hake.service;
 
+import java.util.List;
 import java.util.Map;
 
 public interface HKClient {
@@ -15,22 +16,28 @@ public interface HKClient {
     void callbackProcess(Map data);
 
     /**
-     * 通讯录同步
+     * 通讯录同步 [考勤同步前获取人员信息]
      */
-    void syncContact();
+    List<String> syncContact(boolean isAttendance);
 
     /**
      * 付款数据同步
      */
     void syncMonitor(String code, Map data);
-    
+
     /**
-     * 考勤回调
+     * 考勤回调 [废弃, 通过全量同步处理]
      */
+    @Deprecated
     void callbackAttendance(Map data);
 
     /**
      * 清理标记位
      */
     void clearClockStatus();
+
+    /**
+     * 全量同步考勤
+     */
+    void syncAttendance(String tDate, List<String> userIds);
 }

+ 69 - 7
mjava-hake/src/main/java/com/malk/hake/service/impl/HKImplClient.java

@@ -10,6 +10,7 @@ import com.malk.server.dingtalk.DDConf;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
 import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Attendance;
 import com.malk.service.dingtalk.DDClient_Contacts;
 import com.malk.service.dingtalk.DDService;
 import com.malk.utils.*;
@@ -189,11 +190,13 @@ public class HKImplClient implements HKClient {
     }
 
     /**
-     * 通讯录同步
+     * 通讯录同步 [考勤同步前获取人员信息]
      */
     @Override
     @Synchronized
-    public void syncContact() {
+    public List<String> syncContact(boolean isAttendance) {
+
+        List<String> uIds = new ArrayList<>();
 
         // prd: 非全量同步: 总部\哈克\负责人
         List<Long> deptList = UtilList.asList(DDConf.TOP_DEPARTMENT);
@@ -211,6 +214,10 @@ public class HKImplClient implements HKClient {
             if (depts.length >= 3) {
                 deptName = depts[2];
             }
+            if (isAttendance) {
+                uIds.addAll(userIds);
+                continue;
+            }
             for (String userId : userIds) {
                 Map userInfo = ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), userId);
                 Map data = UtilMap.map("employeeNumber, employeeName, dtPersonId, lastName", userInfo.get("job_number"), userInfo.get("name"), userInfo.get("userid"), userInfo.get("title"));
@@ -230,6 +237,10 @@ public class HKImplClient implements HKClient {
             }
         }
 
+        if (isAttendance) {
+            return uIds;
+        }
+
         // 离职人员同步
         Date sDate = UtilDateTime.convertToDateFromLocalDateTime(LocalDateTime.now().minusDays(1));
         List<Map<String, String>> maps = ddClient_contacts.getLeaveEmployeeRecords(ddClient.getAccessToken(), sDate, null);
@@ -243,6 +254,7 @@ public class HKImplClient implements HKClient {
 
         userIdReflect = null;
         log.info("重新同步人员映射表", getUserIdReflect().size());
+        return uIds;
     }
 
     /// 员工信息写入monitor
@@ -305,7 +317,6 @@ public class HKImplClient implements HKClient {
         List<Map> dataList = (List<Map>) UtilMap.getList(result, isYF ? "orders" : "rows");
         log.info("付款数据同步, {} {}", code, dataList.size());
 
-
         // prd: 通过 http status 判定, 200 即为成功
         for (Map row : dataList) {
             Map search = null;
@@ -376,10 +387,6 @@ public class HKImplClient implements HKClient {
     private void _syncCheckingRecord(boolean isIn, String time, String employeeId) {
         String type = isIn ? "ClockIn" : "ClockOut";
         String url = _getMonitorApi("/api/v1/TimeRecording/RecordingDays/" + type);
-        // 若不传递 TimeStamp, 则会以当前时间
-        if (StringUtils.isBlank(time)) {
-            time = UtilDateTime.formatDateTime(new Date());
-        }
         Map param = UtilMap.map("EmployeeId, TimeStamp", employeeId, time);
         okRequest(url, _getAuthSessionId(), param);
     }
@@ -442,4 +449,59 @@ public class HKImplClient implements HKClient {
             }
         }
     }
+
+    @Autowired
+    private DDClient_Attendance ddClient_attendance;
+
+    /**
+     * 全量同步考勤
+     */
+    @Override
+    public void syncAttendance(String tDate, List<String> userIds) {
+
+        if (UtilString.isBlankCompatNull(tDate)) {
+            tDate = UtilDateTime.formatDate(new Date());
+        }
+        if (ObjectUtil.isNull(userIds)) {
+            userIds = syncContact(true);
+        }
+//        List<Map> reflects = getUserIdReflect();
+        List<Map> reflects = Arrays.asList(UtilMap.map("textField_m4sjp8pf, textField_m4sjp8pg", "014729640938335186, 1082859770907354296"));
+        log.info("考勤同步信息, 人员数量 = {}, id映射表数据 = {}", userIds.size(), reflects.size());
+
+        for (String userId : userIds) {
+            Optional optional = reflects.stream().filter(item -> userId.equals(UtilMap.getString(item, "textField_m4sjp8pf"))).findAny();
+            if (!optional.isPresent()) {
+                Map formData = UtilMap.map("dateField_lo47byyd, employeeField_lo47byyj, textareaField_lo47byyo, textareaField_lo47sanj", new Date().getTime(), userId, "monitor id 未匹配, 请管理员维护", "");
+                _attendanceExceptionRecord(formData);
+                continue;
+            }
+            String employeeId = UtilMap.getString((Map) optional.get(), "textField_m4sjp8pg");
+            Map record = ddClient_attendance.getAttendanceRecord(ddClient.getAccessToken(), userId, tDate);
+            List<Map> checks = UtilMap.getList(record, "attendance_result_list");
+            checks.sort(Comparator.comparingLong(item -> UtilDateTime.parseDateTime(UtilMap.getString(item, "user_check_time")).getTime())); // 排序
+            for (Map check : checks) {
+                boolean isIn = !"OffDuty".equals(UtilMap.getString(check, "check_type"));
+                try {
+                    _syncCheckingRecord(isIn, UtilMap.getString(check, "user_check_time"), employeeId);
+                } catch (McException e) {
+                    Map formData = UtilMap.map("dateField_lo47byyd, employeeField_lo47byyj, textareaField_lo47byyo, textField_m9r144bh", new Date().getTime(), userId, e.getMessage(), employeeId);
+                    formData.put("radioField_m9r144bo", isIn ? "上班" : "下班");
+                    formData.put("textField_m9r144br", UtilMap.getString(check, "user_check_time"));
+                    formData.put("textField_m9r144bs", UtilMap.getString(check, "plan_check_time"));
+                    _attendanceExceptionRecord(formData);
+                    log.error("同步 monitor 异常, {}", e.getMessage());
+                }
+            }
+        }
+    }
+
+    // 写入考勤异常记录
+    private void _attendanceExceptionRecord(Map formData) {
+        ydClient.operateData(YDParam.builder()
+                .formUuid("FORM-E6219F15B3BE418382378DAC42CCEC49PNZQ")
+                .formDataJson(JSON.toJSONString(formData))
+                .build(), YDConf.FORM_OPERATION.create);
+    }
 }
+

+ 8 - 8
mjava-hake/src/main/resources/application-dev.yml

@@ -44,13 +44,13 @@ dingtalk:
   token:
   operator: ""   # OA管理员账号
 
-## aliwork-上海
-#aliwork:
-#  appType: "APP_QWUVLI1R6XYUXWAOPF6O"
-#  systemToken: "SE766NA1XW0F9PG19UX926VYF9RS31DVAYMNLJ27"
+# aliwork-上海
+aliwork:
+  appType: "APP_QWUVLI1R6XYUXWAOPF6O"
+  systemToken: "SE766NA1XW0F9PG19UX926VYF9RS31DVAYMNLJ27"
 
 
-# aliwork-马来
-aliwork:
-  appType: "APP_QJOL2IQW1DTH37FXPGSY"
-  systemToken: "E3A66E810VPOPE2LCXHUJ6O6CWA12VWLSO81MOG"
+## aliwork-马来
+#aliwork:
+#  appType: "APP_QJOL2IQW1DTH37FXPGSY"
+#  systemToken: "E3A66E810VPOPE2LCXHUJ6O6CWA12VWLSO81MOG"

+ 226 - 227
mjava-taisen/src/main/java/com/malk/taisen/controller/TSController.java

@@ -9,13 +9,10 @@ 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.DDR_New;
 import com.malk.service.aliwork.YDClient;
 import com.malk.service.aliwork.YDService;
-import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import com.malk.utils.UtilServlet;
-import com.malk.utils.UtilString;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -24,7 +21,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -143,229 +142,229 @@ public class TSController {
         return McR.success(updateForm);
     }
 
-
-    ///// 数据修复
-
-    @PostMapping("test11")
-    McR test11() {
-
-
-        // 丢行处理
-
-        // 孙静
-//        String tId = "f54bb1ab-e989-4b61-ad9b-7cd9e2dab69b";
-//        String sId = "62f796fd-b35d-4db8-85ad-c14dbc2050ad";
-
-        // 陈黛珠
-//        String tId = "96af9edc-83cb-4027-9687-8ec0e1cbd4eb";
-//        String sId = "5005d16d-a392-43a6-bdcb-c1ae93d30deb";
-
-        // 陈豹
-//        String tId = "640cff6e-89fb-4d50-9c45-aa2fcf8b06d5";
-//        String sId = "13dfaba7-7f27-4f51-bcb6-5c8d71b758c1";
-
-        //
-        String tId = "7cd24af9-2ab2-4c70-b723-4db5b75089e4";
-        String sId = "06aec1b9-7023-49aa-b607-cacafae6f9f6";
-
-        Map formData = ydClient.queryData(YDParam.builder()
-                        .formInstanceId(tId)
-                        .build(),
-                YDConf.FORM_QUERY.retrieve_id).getFormData();
-        List<Map> details = ((List<Map>) formData.get("tableField_l6lmxo5r")).stream().map(item -> {
-            item.put("associationFormField_l6vk2yxg", JSON.parse(item.get("associationFormField_l6vk2yxg_id").toString()));
-            item.put("associationFormField_l6napwww", JSON.parse(String.valueOf(item.get("associationFormField_l6napwww_id"))));
-            // 关联申请
-//            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
-//                            .formUuid("FORM-78766VC1KTX2HZQ6E6IR3CYXWUFU3RO8RGN6L6")
-//                            .searchFieldJson(JSON.toJSONString(UtilMap.map("employeeField_l82gi80j, numberField_l6ngrh2h", formData.get("employeeField_l843wfsm_id"), Arrays.asList(item.get("numberField_l6lmxo60"), item.get("numberField_l6lmxo60")))))
-//                            .build(),
-//                    YDConf.FORM_QUERY.retrieve_search_form).getData();
-//            item.put("associationFormField_l6napwww", ydConf.associationForm("FORM-78766VC1KTX2HZQ6E6IR3CYXWUFU3RO8RGN6L6", dataList.get(0).get("formInstanceId").toString(), "深圳", null, false));
-            return item;
-        }).collect(Collectors.toList());
-
-        Map updateForm = UtilMap.map("tableField_l6lmxo5r", details);
-        ydClient.operateData(YDParam.builder()
-                .formInstanceId(sId)
-                .updateFormDataJson(JSON.toJSONString(updateForm)).build(), YDConf.FORM_OPERATION.update);
-
-        return McR.success(formData);
-    }
-
-    // 当前表税率为0处理
-    @PostMapping("test13")
-    McR test13() {
-
-        String fid = "6f565a2f-a605-4f01-93c2-db177e2118c5";
-
-        Map formData = ydClient.queryData(YDParam.builder()
-                .formInstanceId(fid)
-                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
-        List<Map> details = (List<Map>) formData.get("tableField_l6lmxo5r");
-
-        details.forEach(item -> {
-
-            if (UtilString.isBlankCompatNull(String.valueOf(item.get("numberField_l6lmxo61")))) {
-                item.put("numberField_l6lmxo61", 0);
-            }
-            item.put("associationFormField_l6vk2yxg", JSON.parse(String.valueOf(item.get("associationFormField_l6vk2yxg_id"))));
-            item.put("associationFormField_l6napwww", JSON.parse(String.valueOf(item.get("associationFormField_l6napwww_id"))));
-
-            log.info("xxxx, {}", item.get("numberField_l6lmxo61"));
-        });
-
-        Map updateForm = UtilMap.map("tableField_l6lmxo5r", details);
-
-        ydClient.operateData(YDParam.builder()
-                .formInstanceId(fid)
-                .updateFormDataJson(JSON.toJSONString(updateForm)).build(), YDConf.FORM_OPERATION.update);
-
-        return McR.success(updateForm);
-    }
-
-    // 修改报销金额
-    @PostMapping("test15")
-    McR test15() {
-
-        String fid = "6f565a2f-a605-4f01-93c2-db177e2118c5";
-
-        Map formData = ydClient.queryData(YDParam.builder()
-                .formInstanceId(fid)
-                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
-        List<Map> details = (List<Map>) formData.get("tableField_l6lmxo5r");
-
-
-        details.forEach(item -> {
-
-            if (UtilMap.getFloat(item, "numberField_l6napwwi") == 146.66f || UtilMap.getFloat(item, "numberField_l6napwwi") == 235f || UtilMap.getFloat(item, "numberField_l6napwwi") == 162.66f) {
-                item.put("numberField_l6napwwi", 0);
-            }
-            item.put("associationFormField_l6vk2yxg", JSON.parse(String.valueOf(item.get("associationFormField_l6vk2yxg_id"))));
-            item.put("associationFormField_l6napwww", JSON.parse(String.valueOf(item.get("associationFormField_l6napwww_id"))));
-
-            log.info("xxxx, {}", item.get("numberField_l6napwwi"));
-        });
-        details = details.stream().filter(item -> UtilMap.getFloat(item, "numberField_l6napwwi") > 0f).collect(Collectors.toList());
-        Map updateForm = UtilMap.map("tableField_l6lmxo5r, numberField_l6lmxo6h, textField_l6bynqte", details, 1788, "壹仟柒佰捌拾捌元整");
-
-        ydClient.operateData(YDParam.builder()
-                .formInstanceId(fid)
-                .updateFormDataJson(JSON.toJSONString(updateForm)).build(), YDConf.FORM_OPERATION.update);
-
-        return McR.success(updateForm);
-    }
-
-    // 变更记录
-    @PostMapping("changed")
-    McR changed() {
-
-        for (int i = 1; i <= 55; i++) {
-
-            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
-                    .formUuid("FORM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ")
-                    .pageNumber(i)
-                    .currentPage(i)
-                    .build(), YDConf.FORM_QUERY.retrieve_search_form).getData();
-
-            Map<String, List<Map>> record = ydClient.queryData(YDParam.builder()
-                    .formUuid("FROM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ")
-                    .formInstanceIdList(dataList.stream().map(item -> String.valueOf(item.get("formInstanceId"))).collect(Collectors.toList()))
-                    .build(), YDConf.FORM_QUERY.retrieve_changed).getOperationLogMap();
-            for (String id : record.keySet()) {
-
-                Map form = dataList.stream().filter(item -> item.get("formInstanceId").equals(id)).findAny().get();
-                Map data = (Map) form.get("formData");
-                Map formData = UtilMap.map("associationFormField_lnukdrl8", ydConf.associationForm("FORM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ", id, String.valueOf(form.get("title")), null, true));
-                formData.put("textField_lnulmox7", data.get("textField_l7a7bf8d"));
-                formData.put("employeeField_lnulmox8", data.get("employeeField_l843wfsm_id"));
-
-                List<Map> details = record.get(id).stream().map(item -> UtilMap.map("textField_lnukfzeh, textField_lnukfzei, textField_lnukfzej, textField_lnukfzel, textField_lnukfzek, textField_lnukfzem",
-                        item.get("currentText"), item.get("preText"), item.get("gmtModified"), item.get("componentName"), item.get("operationType"), UtilMap.getMap(item, "operator").get("displayName")))
-                        .collect(Collectors.toList());
-                formData.put("tableField_lnukfzeg", details);
-                ydClient.operateData(YDParam.builder()
-                        .formUuid("FORM-4W8667D1440FEE4PFEX586YVOCEN3EXFDKUNLB1")
-                        .formDataJson(JSON.toJSONString(formData))
-                        .build(), YDConf.FORM_OPERATION.create);
-            }
-
-        }
-
-        return McR.success();
-    }
-
-
-    /// 广舜临时修改
-    @PostMapping("gc")
-    McR gc() {
-
-
+//
+//    ///// 数据修复
+//
+//    @PostMapping("test11")
+//    McR test11() {
+//
+//
+//        // 丢行处理
+//
+//        // 孙静
+////        String tId = "f54bb1ab-e989-4b61-ad9b-7cd9e2dab69b";
+////        String sId = "62f796fd-b35d-4db8-85ad-c14dbc2050ad";
+//
+//        // 陈黛珠
+////        String tId = "96af9edc-83cb-4027-9687-8ec0e1cbd4eb";
+////        String sId = "5005d16d-a392-43a6-bdcb-c1ae93d30deb";
+//
+//        // 陈豹
+////        String tId = "640cff6e-89fb-4d50-9c45-aa2fcf8b06d5";
+////        String sId = "13dfaba7-7f27-4f51-bcb6-5c8d71b758c1";
+//
+//        //
+//        String tId = "7cd24af9-2ab2-4c70-b723-4db5b75089e4";
+//        String sId = "06aec1b9-7023-49aa-b607-cacafae6f9f6";
+//
+//        Map formData = ydClient.queryData(YDParam.builder()
+//                        .formInstanceId(tId)
+//                        .build(),
+//                YDConf.FORM_QUERY.retrieve_id).getFormData();
+//        List<Map> details = ((List<Map>) formData.get("tableField_l6lmxo5r")).stream().map(item -> {
+//            item.put("associationFormField_l6vk2yxg", JSON.parse(item.get("associationFormField_l6vk2yxg_id").toString()));
+//            item.put("associationFormField_l6napwww", JSON.parse(String.valueOf(item.get("associationFormField_l6napwww_id"))));
+//            // 关联申请
+////            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+////                            .formUuid("FORM-78766VC1KTX2HZQ6E6IR3CYXWUFU3RO8RGN6L6")
+////                            .searchFieldJson(JSON.toJSONString(UtilMap.map("employeeField_l82gi80j, numberField_l6ngrh2h", formData.get("employeeField_l843wfsm_id"), Arrays.asList(item.get("numberField_l6lmxo60"), item.get("numberField_l6lmxo60")))))
+////                            .build(),
+////                    YDConf.FORM_QUERY.retrieve_search_form).getData();
+////            item.put("associationFormField_l6napwww", ydConf.associationForm("FORM-78766VC1KTX2HZQ6E6IR3CYXWUFU3RO8RGN6L6", dataList.get(0).get("formInstanceId").toString(), "深圳", null, false));
+//            return item;
+//        }).collect(Collectors.toList());
+//
+//        Map updateForm = UtilMap.map("tableField_l6lmxo5r", details);
 //        ydClient.operateData(YDParam.builder()
-//                .formInstanceId("39e50d18-fcd4-4b19-b825-23d421a255ff")
-//                .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_llalwnd7", "HA0051C")))
-//                .build(), YDConf.FORM_OPERATION.update);
-
-        List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
-                .formUuid("FORM-08866RA1SPVC8CISDK79NBIXH4ZT3CBF61MKL0")
-                .dynamicOrder(JSON.toJSONString(UtilMap.map("gmt_create", "+")))
-                .build(), YDConf.FORM_QUERY.retrieve_search_process).getData();
-
-        Collections.reverse(dataList);
-
-        int i = 1;
-        for (Map formData : dataList) {
-
-            String newS = String.valueOf(UtilMap.getMap(formData, "data").get("textField_llalwnd7"));
-            if (UtilMap.getMap(formData, "data").containsKey("textField_lmu9nuzp")) {
-                newS += "-" + String.valueOf(UtilMap.getMap(formData, "data").get("textField_lmu9nuzp"));
-            } else {
-                newS += "-" + "M";
-            }
-            if (i > 9) {
-                newS += "00" + i;
-            } else {
-                newS += "000" + i;
-            }
-            newS += UtilDateTime.format(new Date(Long.valueOf(String.valueOf(UtilMap.getMap(formData, "data").get("dateField_llabt1ft")))), "yyMMdd");
-
-            log.info("xxxx, {}, ", newS);
-            ydClient.operateData(YDParam.builder()
-                    .formInstanceId(String.valueOf(formData.get("processInstanceId")))
-                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lkkmaxdw, serialNumberField_lnlu5r43", newS, newS)))
-                    .build(), YDConf.FORM_OPERATION.update);
-            i++;
+//                .formInstanceId(sId)
+//                .updateFormDataJson(JSON.toJSONString(updateForm)).build(), YDConf.FORM_OPERATION.update);
 //
-        }
-        return McR.success();
-    }
-
-
-    @PostMapping("test")
-    McR test(String id, @RequestBody Map data) {
-
-
-        id = "27791e35-0ade-4f58-91ac-0eb62f8db9b6";
-//        String fd = "FORM-56666571H80F5YH6B53L8AMCU02I2HLC4KLNL5"; // 测试
-//        String pd = "TPROC--56666571H80F5YH6B53L8AMCU02I29QC4KLNL6";
-
-        String fd = "FORM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ"; // 正式
-        String pd = "TPROC--UX866Q61LRK2LACIB8A6M6T1ZOLM2YY5NYB6L01";
-
-        // 重新审批: selectField_lo6wzjxo, 流程结束:selectField_lo6wzjxp
-//        Object rsp = ydService.mirrorFormData(id, fd, pd, UtilMap.map("selectField_lo6wzjxo, employeeField_lo6wzjxm, employeeField_lo6wzjxn", "是", Arrays.asList("112743683235841523"), Arrays.asList("112743683235841523")));
-        Object rsp = ydService.mirrorFormData(id, fd, pd, UtilMap.map("selectField_lo6wzjxo, radioField_l8k1azrt", "是", "是"), null);
-        return McR.success(rsp);
-    }
-
-
-    @PostMapping("exist")
-    DDR_New exist(@RequestBody Map data) {
-
-        DDR_New ddr_new = ydClient.queryData(YDParam.builder()
-                .formUuid(String.valueOf(data.get("formUuid")))
-                .searchFieldJson(JSON.toJSONString(data.get("conditions")))
-                .build(), YDConf.FORM_QUERY.retrieve_search_form);
-        return ddr_new;
-    }
+//        return McR.success(formData);
+//    }
+//
+//    // 当前表税率为0处理
+//    @PostMapping("test13")
+//    McR test13() {
+//
+//        String fid = "6f565a2f-a605-4f01-93c2-db177e2118c5";
+//
+//        Map formData = ydClient.queryData(YDParam.builder()
+//                .formInstanceId(fid)
+//                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+//        List<Map> details = (List<Map>) formData.get("tableField_l6lmxo5r");
+//
+//        details.forEach(item -> {
+//
+//            if (UtilString.isBlankCompatNull(String.valueOf(item.get("numberField_l6lmxo61")))) {
+//                item.put("numberField_l6lmxo61", 0);
+//            }
+//            item.put("associationFormField_l6vk2yxg", JSON.parse(String.valueOf(item.get("associationFormField_l6vk2yxg_id"))));
+//            item.put("associationFormField_l6napwww", JSON.parse(String.valueOf(item.get("associationFormField_l6napwww_id"))));
+//
+//            log.info("xxxx, {}", item.get("numberField_l6lmxo61"));
+//        });
+//
+//        Map updateForm = UtilMap.map("tableField_l6lmxo5r", details);
+//
+//        ydClient.operateData(YDParam.builder()
+//                .formInstanceId(fid)
+//                .updateFormDataJson(JSON.toJSONString(updateForm)).build(), YDConf.FORM_OPERATION.update);
+//
+//        return McR.success(updateForm);
+//    }
+//
+//    // 修改报销金额
+//    @PostMapping("test15")
+//    McR test15() {
+//
+//        String fid = "6f565a2f-a605-4f01-93c2-db177e2118c5";
+//
+//        Map formData = ydClient.queryData(YDParam.builder()
+//                .formInstanceId(fid)
+//                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+//        List<Map> details = (List<Map>) formData.get("tableField_l6lmxo5r");
+//
+//
+//        details.forEach(item -> {
+//
+//            if (UtilMap.getFloat(item, "numberField_l6napwwi") == 146.66f || UtilMap.getFloat(item, "numberField_l6napwwi") == 235f || UtilMap.getFloat(item, "numberField_l6napwwi") == 162.66f) {
+//                item.put("numberField_l6napwwi", 0);
+//            }
+//            item.put("associationFormField_l6vk2yxg", JSON.parse(String.valueOf(item.get("associationFormField_l6vk2yxg_id"))));
+//            item.put("associationFormField_l6napwww", JSON.parse(String.valueOf(item.get("associationFormField_l6napwww_id"))));
+//
+//            log.info("xxxx, {}", item.get("numberField_l6napwwi"));
+//        });
+//        details = details.stream().filter(item -> UtilMap.getFloat(item, "numberField_l6napwwi") > 0f).collect(Collectors.toList());
+//        Map updateForm = UtilMap.map("tableField_l6lmxo5r, numberField_l6lmxo6h, textField_l6bynqte", details, 1788, "壹仟柒佰捌拾捌元整");
+//
+//        ydClient.operateData(YDParam.builder()
+//                .formInstanceId(fid)
+//                .updateFormDataJson(JSON.toJSONString(updateForm)).build(), YDConf.FORM_OPERATION.update);
+//
+//        return McR.success(updateForm);
+//    }
+//
+//    // 变更记录
+//    @PostMapping("changed")
+//    McR changed() {
+//
+//        for (int i = 1; i <= 55; i++) {
+//
+//            List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+//                    .formUuid("FORM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ")
+//                    .pageNumber(i)
+//                    .currentPage(i)
+//                    .build(), YDConf.FORM_QUERY.retrieve_search_form).getData();
+//
+//            Map<String, List<Map>> record = ydClient.queryData(YDParam.builder()
+//                    .formUuid("FROM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ")
+//                    .formInstanceIdList(dataList.stream().map(item -> String.valueOf(item.get("formInstanceId"))).collect(Collectors.toList()))
+//                    .build(), YDConf.FORM_QUERY.retrieve_changed).getOperationLogMap();
+//            for (String id : record.keySet()) {
+//
+//                Map form = dataList.stream().filter(item -> item.get("formInstanceId").equals(id)).findAny().get();
+//                Map data = (Map) form.get("formData");
+//                Map formData = UtilMap.map("associationFormField_lnukdrl8", ydConf.associationForm("FORM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ", id, String.valueOf(form.get("title")), null, true));
+//                formData.put("textField_lnulmox7", data.get("textField_l7a7bf8d"));
+//                formData.put("employeeField_lnulmox8", data.get("employeeField_l843wfsm_id"));
+//
+//                List<Map> details = record.get(id).stream().map(item -> UtilMap.map("textField_lnukfzeh, textField_lnukfzei, textField_lnukfzej, textField_lnukfzel, textField_lnukfzek, textField_lnukfzem",
+//                        item.get("currentText"), item.get("preText"), item.get("gmtModified"), item.get("componentName"), item.get("operationType"), UtilMap.getMap(item, "operator").get("displayName")))
+//                        .collect(Collectors.toList());
+//                formData.put("tableField_lnukfzeg", details);
+//                ydClient.operateData(YDParam.builder()
+//                        .formUuid("FORM-4W8667D1440FEE4PFEX586YVOCEN3EXFDKUNLB1")
+//                        .formDataJson(JSON.toJSONString(formData))
+//                        .build(), YDConf.FORM_OPERATION.create);
+//            }
+//
+//        }
+//
+//        return McR.success();
+//    }
+//
+//
+//    /// 广舜临时修改
+//    @PostMapping("gc")
+//    McR gc() {
+//
+//
+////        ydClient.operateData(YDParam.builder()
+////                .formInstanceId("39e50d18-fcd4-4b19-b825-23d421a255ff")
+////                .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_llalwnd7", "HA0051C")))
+////                .build(), YDConf.FORM_OPERATION.update);
+//
+//        List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+//                .formUuid("FORM-08866RA1SPVC8CISDK79NBIXH4ZT3CBF61MKL0")
+//                .dynamicOrder(JSON.toJSONString(UtilMap.map("gmt_create", "+")))
+//                .build(), YDConf.FORM_QUERY.retrieve_search_process).getData();
+//
+//        Collections.reverse(dataList);
+//
+//        int i = 1;
+//        for (Map formData : dataList) {
+//
+//            String newS = String.valueOf(UtilMap.getMap(formData, "data").get("textField_llalwnd7"));
+//            if (UtilMap.getMap(formData, "data").containsKey("textField_lmu9nuzp")) {
+//                newS += "-" + String.valueOf(UtilMap.getMap(formData, "data").get("textField_lmu9nuzp"));
+//            } else {
+//                newS += "-" + "M";
+//            }
+//            if (i > 9) {
+//                newS += "00" + i;
+//            } else {
+//                newS += "000" + i;
+//            }
+//            newS += UtilDateTime.format(new Date(Long.valueOf(String.valueOf(UtilMap.getMap(formData, "data").get("dateField_llabt1ft")))), "yyMMdd");
+//
+//            log.info("xxxx, {}, ", newS);
+//            ydClient.operateData(YDParam.builder()
+//                    .formInstanceId(String.valueOf(formData.get("processInstanceId")))
+//                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lkkmaxdw, serialNumberField_lnlu5r43", newS, newS)))
+//                    .build(), YDConf.FORM_OPERATION.update);
+//            i++;
+////
+//        }
+//        return McR.success();
+//    }
+//
+//
+//    @PostMapping("test")
+//    McR test(String id, @RequestBody Map data) {
+//
+//
+//        id = "27791e35-0ade-4f58-91ac-0eb62f8db9b6";
+////        String fd = "FORM-56666571H80F5YH6B53L8AMCU02I2HLC4KLNL5"; // 测试
+////        String pd = "TPROC--56666571H80F5YH6B53L8AMCU02I29QC4KLNL6";
+//
+//        String fd = "FORM-UX866Q61LRK2LACIB8A6M6T1ZOLM2VY5NYB6LZ"; // 正式
+//        String pd = "TPROC--UX866Q61LRK2LACIB8A6M6T1ZOLM2YY5NYB6L01";
+//
+//        // 重新审批: selectField_lo6wzjxo, 流程结束:selectField_lo6wzjxp
+////        Object rsp = ydService.mirrorFormData(id, fd, pd, UtilMap.map("selectField_lo6wzjxo, employeeField_lo6wzjxm, employeeField_lo6wzjxn", "是", Arrays.asList("112743683235841523"), Arrays.asList("112743683235841523")));
+//        Object rsp = ydService.mirrorFormData(id, fd, pd, UtilMap.map("selectField_lo6wzjxo, radioField_l8k1azrt", "是", "是"), null);
+//        return McR.success(rsp);
+//    }
+//
+//
+//    @PostMapping("exist")
+//    DDR_New exist(@RequestBody Map data) {
+//
+//        DDR_New ddr_new = ydClient.queryData(YDParam.builder()
+//                .formUuid(String.valueOf(data.get("formUuid")))
+//                .searchFieldJson(JSON.toJSONString(data.get("conditions")))
+//                .build(), YDConf.FORM_QUERY.retrieve_search_form);
+//        return ddr_new;
+//    }
 }

+ 1 - 1
mjava-taisen/src/main/resources/application-prod.yml

@@ -2,7 +2,7 @@
 server:
   port: 9014
   servlet:
-    context-path: /api/taisen
+    context-path: /cover/taisen
 
 # condition
 spel:

+ 6 - 4
mjava/src/main/java/com/malk/service/dingtalk/DDClient_Attendance.java

@@ -74,13 +74,15 @@ public interface DDClient_Attendance {
     List<Map> getAttColumnVal(String access_token, String userid, List<String> column_id_list, String from_date, String to_date);
 
     /**
-     * 获取考勤报表列值
-     *
-     * @param leave_names 报表列ID,假期名称,多个用英文逗号分隔,最大长度20 [获取考勤报表列定义接口, 无Id列]
-     * @param to_date     结束时间,结束时间减去开始时间必须在31天以内 [格式为 yyyy-MM-dd HH:mm:ss]
+     * 获取报表假期数据
      */
     List<Map> getLeaveTimeByNames(String access_token, String userid, List<String> leave_names, String from_date, String to_date);
 
+    /**
+     * 获取用户考勤数据
+     */
+    Map getAttendanceRecord(String access_token, String userid, String work_date);
+
     /**
      * 获取班次详情 [应出勤天数, 仅返回当天]
      */

+ 12 - 1
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Attendance.java

@@ -146,7 +146,7 @@ public class DDImplClient_Attendance implements DDClient_Attendance {
     }
 
     /**
-     * 获取用户考勤数据
+     * 获取报表假期数据
      *
      * @apiNote https://open.dingtalk.com/document/orgapp/obtains-the-holiday-data-from-the-smart-attendance-report
      */
@@ -157,6 +157,17 @@ public class DDImplClient_Attendance implements DDClient_Attendance {
         return (List<Map>) ((Map) (ddr.getResult())).get("columns");
     }
 
+    /**
+     * 获取用户考勤数据
+     */
+    @Override
+    public Map getAttendanceRecord(String access_token, String userid, String work_date) {
+        Map bodys = UtilMap.map("userid, work_date", userid, work_date);
+        DDR ddr = DDR.doPost("https://oapi.dingtalk.com/topapi/attendance/getupdatedata", null, DDConf.initTokenParams(access_token), bodys);
+        return (Map) ddr.getResult();
+    }
+
+
     /**
      * 获取班次详情
      *