Преглед изворни кода

工程部报表日期写入问题调整
钉钉架构添加部门、人员事件订阅回调

fyz пре 1 месец
родитељ
комит
124798ad1f

+ 1 - 1
mjava-lanyun/src/main/java/com/malk/lanyun/schedule/ScheduleTask.java

@@ -160,7 +160,7 @@ public class ScheduleTask {
      * 20点20分全量同步账龄表
      */
 //    @Async
-    @Scheduled(cron = "0 20 20 * * ?")
+    @Scheduled(cron = "0 20 1 * * ?")
     void syncAgingTask(){
         log.info("全量同步账龄表");
         fService.syncAgingSchedule();

+ 9 - 8
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/TimerServiceImpl.java

@@ -832,21 +832,22 @@ public class TimerServiceImpl implements TimerService {
                             //物耗定额
                             double remaining = s.get("numberField_lrru2tnu_value") == null || s.get("numberField_lrru2tnu_value").toString().isEmpty() ? 0f:Double.parseDouble(s.get("numberField_lrru2tnu_value").toString());
                             //已用物耗定额
-                            double used = s.get("numberField_ludujw4f_value") == null || s.get("numberField_ludujw4f_value").toString().isEmpty() ? 0f:Double.parseDouble(s.get("numberField_ludujw4f_value").toString());
+                            double used = UtilMap.getDouble(s,"numberField_ludujw4f");
                             used = used + nowCost;
                             s.put("numberField_ludujw4f",used);
+                            log.info("已用物耗定额:{}",used);
                             remaining = remaining - used;
                             s.put("numberField_lrru2tnv",remaining);
                         }
                     });
-                }
-                ydClient.operateData(YDParam.builder()
-                        .appType("APP_ERBDTFS82HOVBPL3NFH0")
-                        .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
-                        .formInstanceId(e.get("formInstanceId").toString())
+                    ydClient.operateData(YDParam.builder()
+                            .appType("APP_ERBDTFS82HOVBPL3NFH0")
+                            .systemToken("RRB66F91T97H1WN89QZYC47PKLZO2ZQOUMOQLP")
+                            .formInstanceId(e.get("formInstanceId").toString())
 //                    .useLatestVersion(true)
-                        .updateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lrru2tnq", sonList)))
-                        .build(), YDConf.FORM_OPERATION.update);
+                            .updateFormDataJson(JSON.toJSONString(UtilMap.map("tableField_lrru2tnq", sonList)))
+                            .build(), YDConf.FORM_OPERATION.update);
+                }
             });
             log.info("日常物耗流程id为:{}",formInstId);
             log.info("初始物耗费用合计为:{}",firstCost);

+ 5 - 4
mjava-lanyun/src/main/java/com/malk/lanyun/service/impl/WorkServiceImpl.java

@@ -343,10 +343,10 @@ public class WorkServiceImpl implements WorkService {
 
             //日期 早上到达时间 下午结束时间 施工单位 施工内容 联系人 工程负责人 人工数 人均产值 物耗金额 物耗成本比率 施工地址 联系电话
             Map<String, Object> dataForm = UtilMap.map("dateField_mfmbs72j, dateField_lrn7frgy, dateField_lrn7frgz, textField_mfmbs72h, textField_mfmbs72i, textField_mfmbs72k, employeeField_mfmbs72q, " +
-                            "numberField_mfmbs72s, numberField_mfmbs72y, numberField_mfmbs72z, numberField_mfz00i97, textField_mfz00i96, textField_mfz00i98", d.get("dateField_lrn734i2"),
+                            "numberField_mfmbs72s, numberField_mfmbs72y, numberField_mfmbs72z, numberField_mfz00i97, textField_mfz00i96, textField_mfz00i98, numberField_mn494tk1", d.get("dateField_lrn734i2"),
                     d.get("dateField_lrn7frgy"), d.get("dateField_lrn7frgz"), d.get("textField_lrn734ie"), d.get("textField_lrn7frh6"), d.get("textField_lv37crl1"),
                     d.get("employeeField_lrn7frgx_id"), zsdWorkHours + outWorkHours + inWorkHours, amount / (zsdWorkHours + outWorkHours + inWorkHours), 0.0, 0.0,
-                    d.get("textField_luz6ben7"), d.get("textField_lv37crkw"));
+                    d.get("textField_luz6ben7"), d.get("textField_lv37crkw"), amount);
 
             ydClient.operateData(YDParam.builder()
                     .appType("APP_FKRD7416H19LDAIN348Y")
@@ -386,7 +386,7 @@ public class WorkServiceImpl implements WorkService {
                 .searchFieldJson(JSON.toJSONString(UtilMap.map("dateField_mfmbs72j", (Object) dateList)))
                 .build());
         // 按 "姓名" 分组,汇总工时、人均产值、出勤天数
-        Map<String, Map<String, Object>> groupByIds = dataList.stream()
+        Map<String, Map<String, Object>> groupByIds = dataList.stream().filter(map -> "黄珣".equals(UtilMap.getString(map,"textField_mfmbs72k")))
                 .collect(
                         Collectors.groupingBy(
                                 map -> (String) map.get("textField_mfmbs72k"),
@@ -444,7 +444,7 @@ public class WorkServiceImpl implements WorkService {
                 .build());
         groupByIds.forEach((k0,v0)->{
             Map<String, Object> dataMap = UtilMap.map("dateField_mfmbs72j, textField_mfmbs72k, numberField_mfmbs72s, numberField_mfmbs72u, numberField_mfmbs72y",
-                    DateUtil.lastMonth(), k0, v0.get("recordCount"), v0.get("workHours"), v0.get("totalSummary"));
+                    dateList[0], k0, v0.get("recordCount"), v0.get("workHours"), v0.get("totalSummary"));
             groupByType.forEach((k1,v1)->{
                 //月份 姓名 出勤天数 工时 应计总产值
                 if (k0.equals(k1)){
@@ -750,6 +750,7 @@ public class WorkServiceImpl implements WorkService {
                                         put("numberField_mfenmehw", sbgjj + xyzfy);//定额工资(未加人工定额)
                                         put("numberField_mfenmei5", yfgzA - jfjl + wpgz + jxgz);//调整后应发工资(未加生产成本-业务外包费)
                                         put("rgzbfz", yfgzA + wpgz + jxgz + sbgjj);//人工占比分子
+                                        put("numberField_mm0b51nl", rskkzx);//人工占比分子
                                     }};
                                 }
                         )

+ 11 - 0
mjava/src/main/java/com/malk/controller/DDCallbackController.java

@@ -51,6 +51,7 @@ public class DDCallbackController {
         JSONObject eventJson = JSON.parseObject(decryptMsg);
         Map success = callbackCrypto.getEncryptedMap(DDConf.CALLBACK_RESPONSE, System.currentTimeMillis(), DingCallbackCrypto.Utils.getRandomStr(8));
         String eventType = eventJson.getString("EventType");
+        log.info("eventType:{}",eventType);
         if (DDConf.CALLBACK_CHECK.equals(eventType)) {
             log.info("----- [DD]验证注册 -----");
             return success;
@@ -61,6 +62,16 @@ public class DDCallbackController {
             ddClient_event.callBackEvent_Workflow(eventJson);
             return success;
         }
+        if (Arrays.asList(DDConf.ORG_DEPT_CREATE, DDConf.ORG_DEPT_MODIFY, DDConf.ORG_DEPT_REMOVE).contains(eventType)) {
+//            log.info("[DD]审批回调, {}", eventJson);
+            ddClient_event.callBackEvent_Dept(eventJson);
+            return success;
+        }
+        if (Arrays.asList(DDConf.ORG_PERSON_CREATE, DDConf.ORG_PERSON_REMOVE).contains(eventType)) {
+//            log.info("[DD]审批回调, {}", eventJson);
+            ddClient_event.callBackEvent_Person(eventJson);
+            return success;
+        }
         log.info("----- [DD]已注册, 未处理的其它回调 -----, {}", eventJson);
         return success;
     }

+ 32 - 0
mjava/src/main/java/com/malk/delegate/DDDeptEvent.java

@@ -0,0 +1,32 @@
+package com.malk.delegate;
+
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.List;
+
+/**
+ * 钉钉事件回调 3_2
+ * -
+ * [主项目若无实现, 项目启动异常; 若子项目有订阅需添加 @Primary 以实现优先注入]
+ * -
+ * 子项目实现接口 [静态代理], 添加对应 processCode 单据业务逻辑
+ * OA审批, 撤销和拒绝流程不继续执行连接器, 通过事件订阅实现实时同步
+ */
+public interface DDDeptEvent {
+
+
+    // todo, 回调做try, 失败记录做存储, 提供查询接口
+
+    // todo, 回调参数统一, 宜搭查询接口统一
+
+    // 审批任务回调执行业务逻辑
+    @Async
+    void executeEvent_Dept_Create(List deptIds);
+
+    @Async
+    void executeEvent_Dept_Modify(List deptIds);
+
+    @Async
+    void executeEvent_Dept_Remove(List deptIds);
+
+}

+ 29 - 0
mjava/src/main/java/com/malk/delegate/DDPersonEvent.java

@@ -0,0 +1,29 @@
+package com.malk.delegate;
+
+import org.springframework.scheduling.annotation.Async;
+
+import java.util.List;
+
+/**
+ * 钉钉事件回调 3_2
+ * -
+ * [主项目若无实现, 项目启动异常; 若子项目有订阅需添加 @Primary 以实现优先注入]
+ * -
+ * 子项目实现接口 [静态代理], 添加对应 processCode 单据业务逻辑
+ * OA审批, 撤销和拒绝流程不继续执行连接器, 通过事件订阅实现实时同步
+ */
+public interface DDPersonEvent {
+
+
+    // todo, 回调做try, 失败记录做存储, 提供查询接口
+
+    // todo, 回调参数统一, 宜搭查询接口统一
+
+    // 审批任务回调执行业务逻辑
+    @Async
+    void executeEvent_Person_Create(List deptIds);
+
+    @Async
+    void executeEvent_person_Remove(List deptIds);
+
+}

+ 38 - 0
mjava/src/main/java/com/malk/delegate/impl/DDDeptEventImpl.java

@@ -0,0 +1,38 @@
+package com.malk.delegate.impl;
+
+import com.malk.delegate.DDDeptEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+/**
+ * 钉钉部门变更事件 [主项目若无实现, 项目启动异常; 若子项目有订阅需添加 @Primary 以实现优先注入]
+ * -
+ * 取消方案: 撤销和拒绝流程不继续执行连接器, 因此不使用连接器与轮询审批记录方案 [低效而且占用较高钉钉api调次数];
+ * 优化方案: 通过事件订阅实现实时同步所有审批状态, 定时查询钉钉回调失败记录 [配置钉钉事件Delegate, 添加定时任务]
+ */
+@Slf4j
+@Service
+public class DDDeptEventImpl implements DDDeptEvent {
+    @Async
+    @Override
+    public void executeEvent_Dept_Create(List deptIds) {
+        log.info("executeEvent_Dept_Create: 未被代理");
+
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Dept_Modify(List deptIds) {
+        log.info("executeEvent_Dept_Modify: 未被代理");
+
+    }
+
+    @Async
+    @Override
+    public void executeEvent_Dept_Remove(List deptIds) {
+        log.info("executeEvent_Dept_Remove: 未被代理");
+
+    }
+}

+ 26 - 0
mjava/src/main/java/com/malk/delegate/impl/DDPersonEventImpl.java

@@ -0,0 +1,26 @@
+package com.malk.delegate.impl;
+
+import com.malk.delegate.DDPersonEvent;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Slf4j
+@Service
+public class DDPersonEventImpl implements DDPersonEvent {
+    @Async
+    @Override
+    public void executeEvent_Person_Create(List deptIds) {
+        log.info("executeEvent_Person_Create: 未被代理");
+
+    }
+
+    @Async
+    @Override
+    public void executeEvent_person_Remove(List deptIds) {
+        log.info("executeEvent_person_Remove: 未被代理");
+
+    }
+}

+ 20 - 0
mjava/src/main/java/com/malk/server/dingtalk/DDConf.java

@@ -59,6 +59,26 @@ public class DDConf {
      * 审批实例回调 [审批实例开始、结束]
      */
     public static final String BPMS_INSTANCE_CHANGE = "bpms_instance_change";
+ /**
+     * 部门新增回调
+     */
+    public static final String ORG_DEPT_CREATE = "org_dept_create";
+ /**
+     * 部门修改回调
+     */
+    public static final String ORG_DEPT_MODIFY = "org_dept_modify";
+ /**
+     * 部门删除回调
+     */
+    public static final String ORG_DEPT_REMOVE = "org_dept_remove";
+    /**
+     * 员工新增回调
+     */
+    public static final String ORG_PERSON_CREATE = "user_add_org";
+ /**
+     * 员工删除回调
+     */
+    public static final String ORG_PERSON_REMOVE = "user_leave_org";
 
     /**
      * token授权参数: 旧版本

+ 8 - 1
mjava/src/main/java/com/malk/service/dingtalk/DDClient_Event.java

@@ -14,6 +14,14 @@ public interface DDClient_Event {
      */
     void callBackEvent_Workflow(JSONObject eventJson);
 
+    /**
+     * 钉钉部门变更-增删改
+     * @param eventJson
+     */
+    void callBackEvent_Dept(JSONObject eventJson);
+
+    void callBackEvent_Person(JSONObject eventJson);
+
     /**
      * 同步推送失败记录定时处理 [推送失败钉钉记录, 获取后记录会被清空]
      * -
@@ -35,5 +43,4 @@ public interface DDClient_Event {
      * 获取推送失败列表_全部
      */
     List getFailedList_all(String access_token);
-
 }

+ 60 - 0
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Event.java

@@ -2,10 +2,13 @@ package com.malk.service.dingtalk.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.malk.delegate.DDDeptEvent;
 import com.malk.delegate.DDEvent;
+import com.malk.delegate.DDPersonEvent;
 import com.malk.server.dingtalk.DDConf;
 import com.malk.server.dingtalk.DDR;
 import com.malk.service.dingtalk.DDClient_Event;
+import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -28,6 +31,12 @@ public class DDImplClient_Event implements DDClient_Event {
     @Autowired
     private DDEvent event_delegate;
 
+    @Autowired
+    private DDDeptEvent event_dept_delegate;
+
+    @Autowired
+    private DDPersonEvent event_person_delegate;
+
     /**
      * 钉钉审批回调事件
      *
@@ -84,6 +93,57 @@ public class DDImplClient_Event implements DDClient_Event {
             return;
         }
     }
+    /**
+     * 钉钉部门回调事件
+     *
+     * @apiNote https://open.dingtalk.com/document/development/create-department-event
+     */
+    @Override
+    public void callBackEvent_Dept(JSONObject eventJson) {
+        String eventType = eventJson.getString("EventType");
+        List deptIds = UtilMap.getList(eventJson, "DeptId");
+
+        if (ObjectUtil.isNotNull(deptIds) && deptIds.size() > 0) {
+            // 根据回调数据类型做不同的业务处理
+            if (DDConf.ORG_DEPT_CREATE.equals(eventType)) {
+                log.info("[开始]审批任务回调, {}", eventJson);
+                event_dept_delegate.executeEvent_Dept_Create(deptIds);
+                return;
+            } else if (DDConf.ORG_DEPT_MODIFY.equals(eventType)) {
+                log.info("[开始]审批任务回调, {}", eventJson);
+                event_dept_delegate.executeEvent_Dept_Modify(deptIds);
+                return;
+            } else if (DDConf.ORG_DEPT_REMOVE.equals(eventType)) {
+                log.info("[开始]审批任务回调, {}", eventJson);
+                event_dept_delegate.executeEvent_Dept_Remove(deptIds);
+                return;
+            }
+        }
+    }
+    /**
+     * 钉钉员工回调事件
+     *
+     * @apiNote https://open.dingtalk.com/document/development/enterprise-increases-employee-events
+     */
+    @Override
+    public void callBackEvent_Person(JSONObject eventJson) {
+
+        String eventType = eventJson.getString("EventType");
+        List userIds = UtilMap.getList(eventJson, "UserId");
+
+        if (ObjectUtil.isNotNull(userIds) && userIds.size() > 0) {
+            // 根据回调数据类型做不同的业务处理
+            if (DDConf.ORG_PERSON_CREATE.equals(eventType)) {
+                log.info("[开始]审批任务回调, {}", eventJson);
+                event_person_delegate.executeEvent_Person_Create(userIds);
+                return;
+            } else if (DDConf.ORG_PERSON_REMOVE.equals(eventType)) {
+                log.info("[开始]审批任务回调, {}", eventJson);
+                event_person_delegate.executeEvent_person_Remove(userIds);
+                return;
+            }
+        }
+    }
 
     /**
      * 同步推送失败记录定时处理

+ 5 - 1
pom.xml

@@ -83,7 +83,11 @@
                 <version>${junit.verson}</version>
                 <scope>test</scope>
             </dependency>
-
+            <dependency>
+                <groupId>io.swagger.core.v3</groupId>
+                <artifactId>swagger-annotations</artifactId>
+                <version>2.2.16</version> <!-- 建议使用较新稳定版本 -->
+            </dependency>
             <!-- lombok -->
             <dependency>
                 <groupId>org.projectlombok</groupId>