lfx 9 kuukautta sitten
vanhempi
commit
350f42c3a3

+ 202 - 0
mjava-guyuan/src/main/java/com/malk/guyuan/controller/NhOaTLYController.java

@@ -0,0 +1,202 @@
+package com.malk.guyuan.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
+import com.malk.server.common.McR;
+import com.malk.service.aliwork.YDClient;
+import com.malk.service.dingtalk.DDClient;
+import com.malk.service.dingtalk.DDClient_Workflow;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilMap;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.map.HashedMap;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.*;
+
+/**
+ * 错误抛出与拦截详见 CatchException
+ */
+@Slf4j
+@RestController
+@RequestMapping("/oa/")
+public class NhOaTLYController {
+
+    @Autowired
+    private DDClient ddClient;
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DDClient_Workflow ddClient_workflow;
+
+    /**
+     * 推送审批
+     */
+    @PostMapping("do-approve")
+    public McR doApprove(String processInstanceId, String type) {
+
+        log.info("推送审批, {} {}", type, processInstanceId);
+        Map formData=new HashMap();
+        // OA组件name, 匹配宜搭组件ID
+        formData.put("selectField_m0qg3qz0","审批中");
+        Map<String, String> compsId_main = UtilMap.map("出差事由, 出差天数, 外部人员, 出差备注, 出行人(同行人)", "textareaField_lygo9owv, numberField_lygo4abs, textField_m0naj26h, textareaField_lygo9ox1, employeeField_lygo9ox2");
+        if ("出差1".equals(type)) {
+            formData.put("selectField_m0naj267","出差批准及订票申请");
+        }else if ("出差2".equals(type)) {
+            formData.put("selectField_m0naj267","出差返程及回家订票申请");
+            compsId_main.put("已在外出差及驻地天数","numberField_m0naj26f");
+        }else{
+            return McR.error("201","类型错误!");
+        }
+
+        Map<String, String> compsId_itinerary = UtilMap.map("交通工具, 单程往返, 出发城市, 目的城市, 开始时间, 结束时间, 时长", "textField_lygo9oww, textField_lygo9owx, textField_lygo9owy, textField_lygo9owz, textField_lygvu31i, textField_lygvu31j, numberField_lygo9ox0");
+        compsId_main.put("出差明细", "tableField_lygo9owu"); // 子表组件
+        syncYD(processInstanceId, "FORM-BD5B7CCC28124B808B9DAD98F153CEDACB79", compsId_main, compsId_itinerary, "itinerary",formData);
+        return McR.success();
+    }
+
+    /**
+     * 推送审批
+     */
+    @GetMapping("approved")
+    public McR approved(String processInstanceId, String result) {
+
+        log.info("审批完成, {} {}", result, processInstanceId);
+        List<Map> formList = (List<Map>) ydClient.queryData(YDParam.builder()
+                .appType(APP_TYPE)
+                .systemToken(SYSTRM_TOKEN)
+                .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lyh4y3th",processInstanceId)))
+                .formUuid("FORM-BD5B7CCC28124B808B9DAD98F153CEDACB79")
+                .build(), YDConf.FORM_QUERY.retrieve_list).getData();
+        if(formList!=null&&formList.size()>0){
+            ydClient.operateData(YDParam.builder()
+                    .appType(APP_TYPE)
+                    .systemToken(SYSTRM_TOKEN)
+                    .formInstanceId(UtilMap.getString(formList.get(0),"formInstanceId"))
+                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("selectField_m0qg3qz0",result)))
+                    .build(), YDConf.FORM_OPERATION.update);
+        }
+        return McR.success();
+    }
+
+    /// dingtalk
+    final String APP_EKY = "dingbde12wxlamjrfze4";
+    final String APP_SECRET = "h1jDsG2Bem2cjpVkxgHtUi_zF3wV8VGM6QJM19-FcnMLfJc4JmgOIQPQSg5yv3Tl";
+    /// aliwork
+    final String APP_TYPE = "APP_Y5KGBSIKJGG6ZQBTNKSZ";
+    final String SYSTRM_TOKEN = "GFA66U91QQDMO11Y7N7YC7MA6U0M236VMM2YLBO11";
+
+    /// 同步OA单据到宜搭
+    public void syncYD(String processInstanceId, String formUuid, Map<String, String> compsId_main, Map<String, String> compsId_itinerary, String compId_sub_oa,Map formData) {
+
+        String token = ddClient.getAccessToken(APP_EKY, APP_SECRET);
+
+        Map processData = ddClient_workflow.getProcessInstanceId(token, processInstanceId);
+        List<Map> formComponentValues = (List<Map>) processData.get("formComponentValues");
+
+        String userId = String.valueOf(processData.get("originatorUserId"));
+        long cDate = UtilDateTime.parse(UtilMap.getString(processData, "createTime"), "yyyy-MM-dd'T'HH:mm").getTime();
+        formData.putAll(UtilMap.map("employeeField_ltxqs53k, departmentSelectField_lu20ayky, departmentSelectField_m0naj26d, dateField_ltxqs53j, textField_lygnetw9", Arrays.asList(userId), Arrays.asList(processData.get("originatorDeptId")), Arrays.asList(processData.get("originatorDeptId")), cDate, UtilMap.getString(processData, "businessId")));
+
+        for (String name : compsId_main.keySet()) {
+            String compId = compsId_main.get(name);
+            // 判定是否子表 [宜搭]
+            if (compId.startsWith("tableField_")) {
+                List<Map> details = new ArrayList<>();
+                // 兼容明细组件, 存在多条情况 [加班跨天才有有明细]
+                Optional optional = formComponentValues.stream().filter(item -> compId_sub_oa.equals(item.get("bizAlias"))).findAny();
+                if (!optional.isPresent()) {
+                    continue;
+                }
+                String schedule = UtilMap.getString((Map) optional.get(), "value");
+                List<Map> itineraryList = ((List<Map>) JSON.parse(schedule));
+                // 循环明细数据
+                for (Map itinerary : itineraryList) {
+                    List<Map> rowValue = (List<Map>) itinerary.get("rowValue");
+                    Map rowData = new HashedMap();
+                    // 循环子表组件
+                    for (String subName : compsId_itinerary.keySet()) {
+                        log.info("子表字段, {}", subName);
+                        //  加班单跨天 [子表label为空]
+                        rowData.put(compsId_itinerary.get(subName), rowValue.stream().filter(item -> subName.equals(item.get("bizAlias")) || subName.equals(item.get("label"))).findAny().get().get("value"));
+                    }
+                    details.add(rowData);
+                }
+                formData.put(compId, details);
+                continue;
+            }
+            log.info("主表字段, {}", name);
+            // 请假套件: 开始时间 / 结束时间 / 时长 / 单位 / 请假类型
+            if ("DDHolidayField".equals(name)) {
+                Optional optional = formComponentValues.stream().filter(item -> "DDHolidayField".equals(item.get("componentType"))).findAny();
+                if (optional.isPresent()) {
+                    String[] ids = compId.split(" / ");
+                    List vas = (List) JSON.parse(UtilMap.getString((Map) optional.get(), "value"));
+                    for (int i = 0; i < ids.length; i++) {
+                        formData.put(ids[i], vas.get(i));
+                    }
+                }
+                continue;
+            }
+            Map formComp = formComponentValues.stream().filter(item -> name.equals(item.get("name"))).findAny().get();
+            Object value = formComp.get("value");
+            // 成员组件, 数据处理
+            if ("InnerContactField".equals(formComp.get("componentType")) && formComp.containsKey("value")) {
+                List<Map> empInfos = (List<Map>) JSON.parse(String.valueOf(formComp.get("extValue")));
+                List<String> emplsId = new ArrayList<>();
+                for (Map empInfo : empInfos) {
+                    emplsId.add(String.valueOf(empInfo.get("emplId")));
+                }
+                value = emplsId; // 成员多选
+            }
+            formData.put(compId, value);
+        }
+
+        // 用于审批回传
+        List<Map> tasks = UtilMap.getList(processData, "tasks");
+        formData.put("textField_lygvvyd9", tasks.get(0).get("taskId"));
+        formData.put("textField_lygvvyda", tasks.get(0).get("userId"));
+        formData.put("textField_lyh4y3th", processInstanceId);
+        formData.put("selectField_lyo1uao4", "否"); // 出差是否报销, 否
+        formData.put("selectField_lyo1zprd", "是"); // 同步存量数据, 否
+
+        log.info("审批数据, {}", JSON.toJSONString(formData));
+        ydClient.operateData(YDParam.builder()
+                .appType(APP_TYPE)
+                .systemToken(SYSTRM_TOKEN)
+                .formUuid(formUuid)
+                .formDataJson(JSON.toJSONString(formData))
+                .userId(userId)
+                .build(), YDConf.FORM_OPERATION.create);
+    }
+
+    /**
+     * 审批回调
+     */
+    @PostMapping("approved")
+    public McR approved(String processInstanceId, String userId, String taskId, String result) {
+        log.info("审批回调, {} {}", processInstanceId, result);
+        String accessToken = ddClient.getAccessToken(APP_EKY, APP_SECRET);
+//        ddClient_workflow.executeRunningApprove(accessToken, processInstanceId, userId, taskId, result, "", null);
+        return McR.success();
+    }
+
+    /**
+     * 删除/撤销
+     */
+    @PostMapping("terminate")
+    public McR terminate(String processInstanceId, String userId) {
+        log.info("删除/撤销, {} {}", processInstanceId, userId);
+
+        String accessToken = ddClient.getAccessToken(APP_EKY, APP_SECRET);
+        ddClient_workflow.terminateRunningApprove(accessToken, processInstanceId, true, "发起人撤销", userId);
+        return McR.success();
+    }
+}