Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mjava/src/main/java/com/malk/service/aliwork/impl/YDClientImpl.java
lfx 9 months ago
parent
commit
27a97272e8
26 changed files with 760 additions and 37 deletions
  1. 1 1
      mjava-aipocloud/src/main/resources/application-test.yml
  2. 14 2
      mjava-aiwei/src/main/java/com/malk/aiwei/controller/TBxYDController.java
  3. 1 0
      mjava-aiwei/src/main/java/com/malk/aiwei/server/AWServer.java
  4. 5 0
      mjava-aiwei/src/main/java/com/malk/aiwei/service/AWClint.java
  5. 22 4
      mjava-aiwei/src/main/java/com/malk/aiwei/service/impl/AWImplClient.java
  6. 1 2
      mjava-gewu/src/main/java/com/malk/gewu/controller/GWController.java
  7. 1 1
      mjava-gewu/src/main/java/com/malk/gewu/service/impl/GWImplService.java
  8. 2 2
      mjava-hake/src/main/java/com/malk/hake/controller/HKController.java
  9. 8 3
      mjava-hake/src/main/java/com/malk/hake/service/impl/HKImplClient.java
  10. 7 0
      mjava-hangshi/src/main/java/com/malk/hangshi/controller/HSController.java
  11. 16 0
      mjava-hangshi/src/main/java/com/malk/hangshi/schedule/HSScheduleTask.java
  12. 6 0
      mjava-hangshi/src/main/java/com/malk/hangshi/service/HSService.java
  13. 142 3
      mjava-hangshi/src/main/java/com/malk/hangshi/service/impl/HSImplService.java
  14. 4 0
      mjava-luyi/src/main/java/com/malk/luyi/Boot.java
  15. 265 0
      mjava-luyi/src/main/java/com/malk/luyi/controller/KSJCController.java
  16. 32 0
      mjava-luyi/src/main/java/com/malk/luyi/controller/KSJC_timer.java
  17. 59 15
      mjava-luyi/src/main/java/com/malk/luyi/controller/PJJSController.java
  18. 4 0
      mjava/pom.xml
  19. 2 1
      mjava/src/main/java/com/malk/server/aliwork/YDConf.java
  20. 2 1
      mjava/src/main/java/com/malk/service/aliwork/YDClient.java
  21. 21 2
      mjava/src/main/java/com/malk/service/aliwork/impl/YDClientImpl.java
  22. 11 0
      mjava/src/main/java/com/malk/service/dingtalk/DDClient.java
  23. 103 0
      mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient.java
  24. 14 0
      mjava/src/main/java/com/malk/service/teambition/TBClient.java
  25. 14 0
      mjava/src/main/java/com/malk/service/teambition/impl/TBClientImpl.java
  26. 3 0
      mjava/src/main/java/com/malk/utils/UtilMap.java

+ 1 - 1
mjava-aipocloud/src/main/resources/application-test.yml

@@ -18,7 +18,7 @@ spring:
   # database
   datasource:
     driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
-    url: jdbc:sqlserver://10.14.2.4:1433;SelectMethod=cursor;DatabaseName=dingtalk
+    url: jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=dingtalk
     username: DingTalk
     password: Dingding2023@#
     # JPA

+ 14 - 2
mjava-aiwei/src/main/java/com/malk/aiwei/controller/TBxYDController.java

@@ -215,6 +215,18 @@ public class TBxYDController {
         return McR.success();
     }
 
+
+    /**
+     * 提供verifier数据读取服务
+     */
+    @GetMapping("verifier/sync")
+    McR syncVerifier(String projectCode) {
+
+        List<Map> dataList = awClint.syncVerifier(projectCode);
+        log.info("syncVerifier, {}, {}", projectCode, dataList.size());
+        return McR.success(dataList);
+    }
+
     //////// test ////////
 
     @Autowired
@@ -262,8 +274,8 @@ public class TBxYDController {
     }
 
     @GetMapping("tmp")
-    McR tmp() {
+    McR tmp(String programIds) {
 
-        return McR.success();
+        return McR.success(tbClient.queryProgramList(programIds));
     }
 }

+ 1 - 0
mjava-aiwei/src/main/java/com/malk/aiwei/server/AWServer.java

@@ -19,6 +19,7 @@ public class AWServer {
     public static final String TASK_STAGE = "TR评审节点";
     public static final String TASK_STAGE_BLANK = "无TR评审节点";
     public static final String TASK_PRODUCT = "产品型号";
+    public static final String TASK_PRODUCT_VERSION = "产品版本";
 
     // prd 23.02.29 字段从 预检项 变更为 技术检查项
     public static final String TASK_CHECK_LINK = "技术检查项";

+ 5 - 0
mjava-aiwei/src/main/java/com/malk/aiwei/service/AWClint.java

@@ -88,5 +88,10 @@ public interface AWClint {
      */
     void syncCheckList(int type);
 
+    /**
+     * 提供verifier数据读取服务
+     */
+    List<Map> syncVerifier(String projectCode);
+
     void test();
 }

+ 22 - 4
mjava-aiwei/src/main/java/com/malk/aiwei/service/impl/AWImplClient.java

@@ -273,7 +273,7 @@ public class AWImplClient implements AWClint {
     public Map doCheck(String taskId, boolean isTask) {
 
         log.info("检查项check, {}", taskId);
-        Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_CODE, AWServer.TASK_CHECK_LINK, AWServer.TASK_ROLE, AWServer.TASK_STAGE, AWServer.TASK_CHECK_STATUS);
+        Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_CODE, AWServer.TASK_CHECK_LINK, AWServer.TASK_ROLE, AWServer.TASK_STAGE, AWServer.TASK_CHECK_STATUS, AWServer.TASK_PRODUCT, AWServer.TASK_PRODUCT_VERSION);
         Map rTask = UtilMap.getMap(taskData, "task");
         String pCode = UtilMap.getString(rTask, "projectId");
         if (AWServer.PROJECT_IGNORE_ID.contains(pCode)) {
@@ -337,7 +337,8 @@ public class AWImplClient implements AWClint {
         formData.putAll(UtilMap.map("selectField_lqxuswze, textField_lrndwu07, textField_lqxuc9m4", UtilMap.getString(rProject, "textField_lrj7vnxb"), UtilMap.getString(rProject, "textareaField_lrj7vnxl"), UtilMap.getString(rProject, "textField_lqxtykcd")));
         // 任务信息 [TBManager 操作]
         Map<String, String> extra = (Map) tbClient.idMapQuery(creatorId, "dingTalk-user", ddConf.getCorpId()).get(0).get("extra");
-        formData.putAll(UtilMap.map("textField_lrndwu09, textField_lrndwu0a, textField_lrndwu0b, employeeField_lrndwu0e", rTask.get("content"), taskData.get(AWServer.TASK_STAGE), taskData.get(AWServer.TASK_ROLE), Arrays.asList(UtilMap.map("value, name", extra.get("userId"), extra.get("userId")))));
+        // ppExt: TB映射钉钉信息仅返回 userId, 人员组件返回前端展示需要 name. 通过页面公式临时自动加载, 可通过TB接口或钉钉用户接口查询
+        formData.putAll(UtilMap.map("textField_lrndwu09, textField_lrndwu0a, textField_lrndwu0b, employeeField_lrndwu0e, textField_lvbrueqs, textField_lvbrueqt", rTask.get("content"), taskData.get(AWServer.TASK_STAGE), taskData.get(AWServer.TASK_ROLE), Arrays.asList(UtilMap.map("value, name", extra.get("userId"), extra.get("userId"))), taskData.get(AWServer.TASK_PRODUCT), taskData.get(AWServer.TASK_PRODUCT_VERSION)));
         // 返回检查项
         formData.put("tableField_lqxxgj4s", tList.stream().map(item -> {
             item.put("associationFormField_lrrnem5r", YDConf.associationForm(ydConf.getAppType(), _matchFormUuid("CHECK"), UtilMap.getString(item, "instanceId"), UtilMap.getString(item, "textField_lrnd3h0r"), "", false));
@@ -833,8 +834,10 @@ public class AWImplClient implements AWClint {
     // 推送crm: prd 单次推送必须为相同料号
     void _pushCRM(String projectId, Map record) {
         log.info("推送crm, {}", record);
-        Map param = UtilMap.map("username, password, client_id, client_secret, grant_type", "interface@awinic.com.cn.uat", "welcome12", "3MVG959Nd8JMmavT2IGqAtf_hIbxepsElGbOpno6AO8KdQJSpSNqY9bnLRU2exuAEh3qIXb1oTn98S9h0WWZk", "3C9FC7427866D69586964F65A16D288EBBB1544335DD9FF3A03DE21DF14A7C6A", "password");
-        String rsp = UtilHttp.doPost("https://test.salesforce.com/services/oauth2/token", null, param, UtilMap.empty());
+        //Map param = UtilMap.map("username, password, client_id, client_secret, grant_type", "interface@awinic.com.cn.uat", "welcome12", "3MVG959Nd8JMmavT2IGqAtf_hIbxepsElGbOpno6AO8KdQJSpSNqY9bnLRU2exuAEh3qIXb1oTn98S9h0WWZk", "3C9FC7427866D69586964F65A16D288EBBB1544335DD9FF3A03DE21DF14A7C6A", "password");
+        Map param = UtilMap.map("username, password, client_id, client_secret, grant_type", "interface@awinic.com.cn", "welcome12", "3MVG9d8..z.hDcPKSaWop76C8GRQarYhn0LpBnP_U2S3VJaT8a6l05e2pDkdk5oE4MInQYwyLMpqWM7bLDzqm", "26A90098BDBE8C356817938986472730BAE5D9536DA9096AC7C45A4973867100", "password");
+        //String rsp = UtilHttp.doPost("https://test.salesforce.com/services/oauth2/token", null, param, UtilMap.empty());
+        String rsp = UtilHttp.doPost("https://login.salesforce.com/services/oauth2/token", null, param, UtilMap.empty());
         Map result = (Map) JSON.parse(rsp);
         Map header = UtilMap.map("Authorization", "OAuth " + result.get("access_token"));
         rsp = UtilHttp.doPost(UtilMap.getString(result, "instance_url") + "/services/apexrest/TBProductStageTimeRest", header, null, Arrays.asList(record), null);
@@ -1018,6 +1021,21 @@ public class AWImplClient implements AWClint {
         log.info("同步预检项 ##, {}", type);
     }
 
+    /**
+     * 提供verifier数据读取服务
+     */
+    @Override
+    public List<Map> syncVerifier(String projectCode) {
+        List<Map> dataList = ydService.queryFormData_all(YDParam.builder()
+                .formUuid("FORM-23B67983E91C4ED3B063F9B629D6E964SGHH")
+                .searchCondition(JSON.toJSONString(UtilMap.map("textField_lt6xd8lm", projectCode)))
+                .build());
+
+        return dataList.stream().map(item -> {
+            return item;
+        }).collect(Collectors.toList());
+
+    }
 
     @Override
     public void test() {

+ 1 - 2
mjava-gewu/src/main/java/com/malk/gewu/controller/GWController.java

@@ -30,8 +30,7 @@ import java.util.Map;
 @RestController
 @RequestMapping
 public class GWController {
-
-
+    
     @Autowired
     private GWService gwService;
 

+ 1 - 1
mjava-gewu/src/main/java/com/malk/gewu/service/impl/GWImplService.java

@@ -45,7 +45,7 @@ public class GWImplService implements GWService {
     public void syncRoster() {
 
         // 花名册元数据
-        List<Map> metaList = (List<Map>) UtilFile.readJsonObjectFromResource("static/json/personnel.json"); // 本地匹配了宜搭组件ID
+        List<Map> metaList = (List<Map>) UtilFile.readJsonObjectFromResource("static/json/personnel"); // 本地匹配了宜搭组件ID
 //        List<Map> metaList = ddClient_personnel.getPersonnelMeta(ddClient.getAccessToken(), ddConf.getAgentId());
         // 同步全量人员
         ddClient_contacts.getDepartmentId_all(ddClient.getAccessToken(), true).forEach(deptId -> {

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

@@ -52,8 +52,8 @@ public class HKController {
 
         Map data = UtilServlet.getParamMap(request);
         log.info("审批校验, {}", JSON.toJSONString(data));
-        // 拒绝审批意见必填校验
-        McException.assertParamException_Null(data, "Remark");
+        // 拒绝审批意见必填校验 prd 4.17 取消拒绝校验, 统一返回 [审核人xxx拒绝], monitor通过活动跳转
+        //McException.assertParamException_Null(data, "Remark");
         return McR.success();
     }
 

+ 8 - 3
mjava-hake/src/main/java/com/malk/hake/service/impl/HKImplClient.java

@@ -154,13 +154,18 @@ public class HKImplClient implements HKClient {
 
         // 拒绝审批意见必填校验
         McException.assertParamException_Null(data, "Result");
-        if ("0".equals(data.get("Result"))) {
-            McException.assertParamException_Null(data, "Remark");
-        }
+        // prd 4.17 取消拒绝校验, 统一返回 [审核人xxx拒绝], monitor通过活动跳转
+        //if ("0".equals(data.get("Result"))) {
+        // McException.assertParamException_Null(data, "Remark");
+        //}
         // 回调monitor审批信息
         data.put("Url", "https://pxi03f.aliwork.com/APP_QWUVLI1R6XYUXWAOPF6O/processDetail?procInsId=" + data.get("DdProcessId"));
         data.put("ApprovalDate", UtilDateTime.formatLocalDateTime(LocalDateTime.now()));
         Map UserInfo = ddClient_contacts.getUserInfoById(ddClient.getAccessToken(), String.valueOf(data.get("Approver")));
+        // prd 4.17 取消拒绝校验, 统一返回 [审核人xxx拒绝], monitor通过活动跳转
+        if ("0".equals(data.get("Result")) && !data.containsKey("Remark")) {
+            data.put("Remark", "审批人 【" + UserInfo.get("name") + "】拒绝");
+        }
         data.put("Approver", String.valueOf(UserInfo.get("name")));
         log.info("审批回调, {}", JSON.toJSONString(data));
         // prd: 通过 http status 判定, 200 即为成功

+ 7 - 0
mjava-hangshi/src/main/java/com/malk/hangshi/controller/HSController.java

@@ -111,6 +111,13 @@ public class HSController {
         McException.assertParamException_Null(data, "code");
         return McR.success(ddService.getUserInfoByCode(data.get("code")));
     }
+    @RequestMapping("test")
+    McR test(HttpServletRequest request) {
+
+            hsService.syncHangShiInfo();
+
+        return McR.success();
+    }
 
 }
 

+ 16 - 0
mjava-hangshi/src/main/java/com/malk/hangshi/schedule/HSScheduleTask.java

@@ -32,4 +32,20 @@ public class HSScheduleTask {
             e.printStackTrace();
         }
     }
+
+
+    /**
+     * 每天8点同步
+     */
+    @Scheduled(cron = "0 30 9 * * ? ")
+    public void syncHangShiInfo() {
+        try {
+            hsService.syncHangShiInfo();
+        } catch (Exception e) {
+            // 记录错误信息
+            e.printStackTrace();
+        }
+    }
+
+
 }

+ 6 - 0
mjava-hangshi/src/main/java/com/malk/hangshi/service/HSService.java

@@ -13,4 +13,10 @@ public interface HSService {
      * 组织人数
      */
     int getCorpCount();
+
+
+    /**
+     * 同步航食数据
+     */
+    void syncHangShiInfo();
 }

+ 142 - 3
mjava-hangshi/src/main/java/com/malk/hangshi/service/impl/HSImplService.java

@@ -1,24 +1,37 @@
 package com.malk.hangshi.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
 import com.malk.hangshi.service.HSService;
+import com.malk.server.aliwork.YDConf;
+import com.malk.server.aliwork.YDParam;
 import com.malk.server.dingtalk.DDConf;
+import com.malk.service.aliwork.YDClient;
 import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Contacts;
+import com.malk.utils.UtilDateTime;
+import com.malk.utils.UtilHttp;
 import com.malk.utils.UtilMap;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.text.DecimalFormat;
+import java.time.LocalDate;
+import java.util.*;
 
 @Service
 @Slf4j
 public class HSImplService implements HSService {
 
+
+    //进出口
+    private final static String OUTINURL="https://eacconsole.ceair.com/api/WBPM1-eaccart/statistical/asis/list";
+    //餐车数
+    private final static String CARURL="https://eacconsole.ceair.com/api/WBPM1-eaccart/cartAbnormal/abnormal";
+
+
     @Autowired
     private DDClient ddClient;
 
@@ -77,4 +90,130 @@ public class HSImplService implements HSService {
     public int getCorpCount() {
         return ddClient_contacts.getUserCount(ddClient.getAccessToken(), true);
     }
+
+
+    @Autowired
+    private YDClient ydClient;
+
+    @Override
+    public void syncHangShiInfo() {
+
+        YDParam ydParam = YDParam.builder()
+                .appType("APP_RNU2SVHDBJX8KIFTWVYZ")
+                .systemToken("H7966HA1OP38AMWZAHPAB6GZSTR134F87IWDLH")
+                .formUuid("FORM-YU966T91NP38DWF5FKBBK6G90HWP3BRBQIWDL1") //获取所有航食列表
+                .build();
+        List<Map> dataList = (List<Map>) ydClient.queryData(ydParam, YDConf.FORM_QUERY.retrieve_search_form).getData();
+
+
+        //遍历航食数据
+        dataList.forEach(dataItem -> {
+            Map map = (Map) dataItem.get("formData");
+
+            String hsName =  map.get("textField_ldwirsz3").toString();
+            String hsId=  map.get("textField_lvxkvjcw").toString();
+
+            LocalDate currentDate = LocalDate.now();
+            LocalDate previousDay = currentDate.minusDays(1);
+
+            String rsp = getOutInInfo(getToken(),hsId,previousDay.toString(),OUTINURL);
+            Map result = (Map) JSON.parse(rsp);
+
+            Map hashMap = new HashMap();
+            Map maps = (Map) result.get("osisList");
+            List<Map> mapList = (List<Map>) maps.get("data");
+
+            DecimalFormat df = new DecimalFormat("#.##");
+            mapList.forEach(mapItem -> {
+                Map map1 = (Map) mapItem.get("dynamicInventoryStatistical");
+                hashMap.put("numberField_ldwi9du2",map1.get("longNumber"));  //昨日库存长
+                hashMap.put("numberField_ldwi9du3",map1.get("shortNumber"));  //昨日库存长
+                hashMap.put("numberField_ldwi9du4",map1.get("total"));  //昨日总库存
+                Map map2 = (Map) mapItem.get("inputCartStatistical");
+                hashMap.put("numberField_ldwi9dua",map2.get("total"));  //昨日进港量
+                Map map3 = (Map) mapItem.get("outputCartStatistical");
+                hashMap.put("numberField_ldwi9du9",map3.get("total")); //昨日出港量
+                Double totalIn = Double.valueOf(map2.get("total").toString());
+                Double totalOut = Double.valueOf(map3.get("total").toString());
+                Double totalSum = Double.valueOf(map1.get("total").toString());
+                hashMap.put("numberField_ldwi9dub",totalIn-totalOut); //昨日总盈亏
+                double  tatalScale= (totalOut / totalSum) * 100;
+                hashMap.put("numberField_ldwk062u",df.format(tatalScale)); //餐车利用率
+
+            });
+
+
+            String rsp2 = getOutInInfo(getToken(),hsId,previousDay.toString(),CARURL);
+            Map result2 = (Map) JSON.parse(rsp2);
+
+            Map maps2 = (Map) result2.get("stationAbnormal");
+            List<Map> mapList2 = (List<Map>) maps2.get("data");
+
+            mapList2.forEach(mapItem2 -> {
+                hashMap.put("numberField_ldwi9dug",mapItem2.get("openingCart"));  //昨日开口餐车数
+            });
+
+            hashMap.put("selectField_ldwi9dtr",hsName);  //航食名称
+
+            hashMap.put("dateField_ldwi9dtt", UtilDateTime.parse(String.valueOf(currentDate),"yyyy-MM-dd"));
+            hashMap.put("dateField_le2jibxo", UtilDateTime.parse(String.valueOf(previousDay),"yyyy-MM-dd"));
+
+
+            try {
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_RNU2SVHDBJX8KIFTWVYZ")
+                        .systemToken("H7966HA1OP38AMWZAHPAB6GZSTR134F87IWDLH")
+                        .formUuid("FORM-FC731953C5684406B3A980B1EA6AC93EA9JD") //获取所有航食列表
+                        .formDataJson(JSON.toJSONString(hashMap))
+                        .build(), YDConf.FORM_OPERATION.create);
+            } catch (Exception e) {
+                log.info("异常数据 hashMap:{}",hashMap);
+            }
+
+
+        });
+    }
+
+
+    /**
+     *
+     */
+    public String getToken() {
+
+        Map<String, String> body = new HashMap<>();
+        body.put("account","7859121209872651");
+        body.put("password","efc736bbE@09054c");
+        String str = UtilHttp.doPost("https://eacconsole.ceair.com/api/WBPM1-eacorg/external/access",null,null,body);
+        String token = String.valueOf(((Map) JSON.parse(str)).get("accessToken"));
+        return token;
+    }
+
+
+    /**
+     * 进出港数据   开口餐车数
+     * @param token
+     * @param id
+     * @param dataTime
+     * @return
+     */
+    public String getOutInInfo(String token,String id,String dataTime,String url){
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type","application/json;charset=UTF-8");
+        headers.put("X-GL-ACCESS-TOKEN",token);
+        headers.put("X-GL-AGENT","EAFORG-SERVICE");
+        headers.put("X-GL-CLIENT","OPERATION");
+
+        Map<String, String> params = new HashMap<>();
+        params.put("pageStart","0");
+        params.put("pageSize","10");
+        params.put("id",id);
+        params.put("paramType","ORGANIZATION");
+        params.put("startTime",dataTime);
+        params.put("endTime",dataTime);
+        String rsp= UtilHttp.doGet(url,headers,params);
+
+        return rsp;
+    }
+
 }

+ 4 - 0
mjava-luyi/src/main/java/com/malk/luyi/Boot.java

@@ -1,6 +1,8 @@
 package com.malk.luyi;
 
+import com.malk.luyi.controller.KSJCController;
 import com.querydsl.jpa.impl.JPAQueryFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.annotation.Bean;
@@ -18,10 +20,12 @@ import javax.persistence.EntityManager;
 @SpringBootApplication(scanBasePackages = {"com.malk"})
 public class Boot {
 
+
     public static void main(String... args) {
         SpringApplication.run(Boot.class, args);
     }
 
+
     /**
      * 让Spring管理JPAQueryFactory [不使用Qualifier详见mjava-Boot]
      */

+ 265 - 0
mjava-luyi/src/main/java/com/malk/luyi/controller/KSJCController.java

@@ -0,0 +1,265 @@
+package com.malk.luyi.controller;
+
+import cn.hutool.json.JSONArray;
+import cn.hutool.json.JSONObject;
+import com.alibaba.fastjson.JSON;
+import com.malk.delegate.McDelegate;
+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.utils.UtilMap;
+import com.malk.utils.UtilServlet;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.time.*;
+import java.util.*;
+
+@Slf4j
+@RestController
+@RequestMapping()
+public class KSJCController {
+    @Autowired
+    private YDClient ydClient;
+
+    @Autowired
+    private DDClient dd;
+
+    @Autowired
+    private McDelegate mcDelegate;
+
+    @SneakyThrows
+    @PostMapping("/JCKQZ")
+//集尘根据员工id获取所在考勤组
+    McR insetTHXM(HttpServletRequest request) {
+        Map data = UtilServlet.getParamMap(request);
+        String FormInstanceId = data.get("FormInstanceId").toString();
+        String UserId = data.get("UserId").toString();
+
+        if (UserId != "" && FormInstanceId != "") {
+            Map rsp = dd.getusergroup(UserId);
+            System.out.println("rsp:" + UserId + ":" + FormInstanceId);
+            System.out.println("rsp:" + rsp);
+            if (rsp != null) {
+                JSONObject jsonObject = new JSONObject(rsp);
+                String groupId = jsonObject.get("group_id").toString();
+                String name = jsonObject.get("name").toString();
+                String FORMID = "textField_lyo89dyq, textField_lyo89dyr";
+                //获取到考勤组名称和考勤组id后,写入到宜搭
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_X89Y00KKTG36B8JYGZVR")
+                        .systemToken("QIA66091HJPLRHM3AUFJLCN24CUP2VNMO41XLW4")
+                        .formInstanceId(String.valueOf(FormInstanceId))
+                        .updateFormDataJson(JSON.toJSONString(UtilMap.map(FORMID, name, groupId)))
+                        .build(), YDConf.FORM_OPERATION.update);
+            }
+            log.info("rsp:" + rsp);
+            System.out.println("rsp:" + rsp);
+        }
+        return McR.success();
+    }
+
+    @SneakyThrows
+    @PostMapping("/JCpd")
+//集尘根据员工id判断今天能不能打卡
+    McR insetTHXM_TMER() {
+        //获取所有人员
+        List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+                .appType("APP_X89Y00KKTG36B8JYGZVR")
+                .systemToken("QIA66091HJPLRHM3AUFJLCN24CUP2VNMO41XLW4")
+                .formUuid("FORM-1F9CC98764D84B64AB1B6A04BEB8CA2BIPQ0")
+                // .searchFieldJson(JSON.toJSONString(UtilMap.map("serialNumberField_lt1i52jt",data.get("XMBH").toString())))
+                .build(), YDConf.FORM_QUERY.retrieve_search_form).getData();
+        //循环获得人员
+        for (Map formData : dataList) {
+            //人员-字段值
+            String FormInstanceId = String.valueOf(formData.get("formInstanceId"));//实例id
+            String if_pd = String.valueOf(UtilMap.getMap(formData, "formData").get("selectField_lyo6e0gi"));//是否能打卡
+            String Ehtid = String.valueOf(UtilMap.getMap(formData, "formData").get("textField_lyo8p27i"));//考勤人ID
+            String grup_id = String.valueOf(UtilMap.getMap(formData, "formData").get("textField_lyo89dyr"));//所在考勤组ID
+            Map rsp = new HashMap<>();//用来接反馈值
+            if (if_pd.equals("否")) {//如果为否,校验:1.昨天是否请假  2.昨天是否不用打卡
+                // 判断昨天是否请假
+                LocalDate yesterday = LocalDate.now().minusDays(1);
+                // 构造昨天7点00分的时间
+                LocalTime time = LocalTime.of(7, 0);
+                //将日期和时间结合
+                LocalDateTime yesterdaySevenPm = yesterday.atTime(time);
+                // 假设我们使用的是系统默认时区,这里为了演示明确转换到UTC,
+                // 但在计算时间戳时,如果不指定时区,默认会使用JVM的时区
+                ZonedDateTime zdt = yesterdaySevenPm.atZone(ZoneId.systemDefault());
+                // 转换为时间戳(毫秒)
+                long timestamp_up = zdt.toInstant().toEpochMilli();
+                yesterday = LocalDate.now().minusDays(1);
+                time = LocalTime.of(23, 0);
+                yesterdaySevenPm = yesterday.atTime(time);
+                zdt = yesterdaySevenPm.atZone(ZoneId.systemDefault());
+                long timestamp_dp = zdt.toInstant().toEpochMilli();
+                rsp = dd.getleavestatus(Ehtid, timestamp_up, timestamp_dp);//获得请假请框
+                JSONObject jsonObject = new JSONObject(rsp);
+                String leave_status = jsonObject.get("leave_status").toString();
+                if (!leave_status.equals("[]") && leave_status != null) {
+                    if_pd = "是";
+                }
+                //判断昨天是否考勤组的休息日
+                rsp = dd.getgroupquery(Ehtid, grup_id);
+                jsonObject = new JSONObject(rsp);
+                if (!jsonObject.get("work_day_list").toString().equals("[]") && jsonObject.get("work_day_list").toString() != null) {//如果是固定班次就判断昨天是不是休息日
+                    // 使用逗号分割字符串,得到元素字符串数组
+                    String[] elements = jsonObject.get("work_day_list").toString().split(",");
+                    LocalDate today = LocalDate.now();
+                    LocalDate yesterday_dak = today.minusDays(1);
+                    DayOfWeek dayOfWeekYesterday = yesterday_dak.getDayOfWeek();
+                    int nums = 10;
+                    switch (dayOfWeekYesterday) {
+                        case SUNDAY:
+                            nums = 0;
+                            break;
+                        case MONDAY:
+                            nums = 1;
+                            break;
+                        case TUESDAY:
+                            nums = 2;
+                            break;
+                        case WEDNESDAY:
+                            nums = 3;
+                            break;
+                        case THURSDAY:
+                            nums = 4;
+                            break;
+                        case FRIDAY:
+                            nums = 5;
+                            break;
+                        case SATURDAY:
+                            nums = 6;
+                            break;
+                    }
+                    ;
+                    if (nums != 10) {
+                        if (elements[nums].equals("[0") || elements[nums].equals("0") || elements[nums].equals("0]")) {
+                            if_pd = "是";
+                        }
+                    }
+
+
+                }
+
+                System.out.println("work_day_list:" + jsonObject.get("work_day_list").toString());
+            }
+
+            if (if_pd.equals("是")) {
+                //1222310842
+                rsp = dd.inset_hr_group("删除", Ehtid, "1222310842");
+                //如果能打卡,就把人员加入到考勤组
+                rsp = dd.inset_hr_group("新增", Ehtid, grup_id);
+                JSONObject jsonObject = new JSONObject(rsp);
+
+            }
+            if (if_pd.equals("否")) {
+                //如果不能打卡,就把人员踢出考勤组
+                rsp = dd.inset_hr_group("删除", Ehtid, grup_id);
+                //1222310842
+                rsp = dd.inset_hr_group("新增", Ehtid, "1222310842");
+            }
+            //   执行完加入,把校验状态改成 否
+            ydClient.operateData(YDParam.builder()
+                    .appType("APP_X89Y00KKTG36B8JYGZVR")
+                    .systemToken("QIA66091HJPLRHM3AUFJLCN24CUP2VNMO41XLW4")
+                    .formInstanceId(String.valueOf(FormInstanceId))
+                    .updateFormDataJson(JSON.toJSONString(UtilMap.map("selectField_lyo6e0gi", "否")))
+                    .build(), YDConf.FORM_OPERATION.update);
+        }
+        return McR.success();
+    }
+
+    @SneakyThrows
+    @PostMapping("/insetHR_kaoqin")
+//打卡完成后,立即把员工移进考勤组
+    McR insetHR_kaoqin(HttpServletRequest request) {
+        Map data = UtilServlet.getParamMap(request);
+        String Ehtid = data.get("Ehtid").toString();
+        String grup_id = data.get("grup_id").toString();
+
+          Map rsp = dd.inset_hr_group("删除", Ehtid, "1222310842");
+          rsp = dd.inset_hr_group("新增", Ehtid, grup_id);
+        JSONObject jsonObject = new JSONObject(rsp);
+        return McR.success();
+    }
+    @SneakyThrows
+    @PostMapping("/insetJie_Duan")
+//根据项目和机台信息维护阶段数据。
+    McR insetJie_Duan(HttpServletRequest request) {
+        Map data = UtilServlet.getParamMap(request);
+        String formInstanceId = data.get("formInstanceId").toString();
+        if (!formInstanceId.equals("")) {
+            List<Map> dataList_XM = (List<Map>) ydClient.queryData(YDParam.builder()
+                    .appType("APP_X89Y00KKTG36B8JYGZVR")
+                    .systemToken("QIA66091HJPLRHM3AUFJLCN24CUP2VNMO41XLW4")
+                    .formUuid("FORM-A6153EC780554425A1A7451548F9D405PMSN")
+                    .searchFieldJson(JSON.toJSONString(UtilMap.map("formInstanceId", formInstanceId)))
+                    .build(), YDConf.FORM_QUERY.retrieve_search_form).getData();
+            if (dataList_XM != null && dataList_XM.size() > 0) {
+                for (Map formData_XM : dataList_XM) {
+                    System.out.println("dsfasdf:" + formData_XM.get("formInstanceId").toString());
+                    if (formData_XM.get("formInstanceId").toString().equals(formInstanceId)) {
+                        String XMMC = String.valueOf(UtilMap.getMap(formData_XM, "formData").get("textField_lx1iumdr"));
+                        String XMBH = String.valueOf(UtilMap.getMap(formData_XM, "formData").get("textField_lx1irnyo"));
+                        String sdfa = String.valueOf(UtilMap.getMap(formData_XM, "formData").get("tableField_lx1iumdu"));     //textField_ly6lt3dm -> 111右套
+                        JSONArray jsonArray = new JSONArray(sdfa);
+                        if (jsonArray != null && jsonArray.size() > 0) {
+                            for (int i = 0; i < jsonArray.size(); i++) {
+                                // 获取每个JSONObject
+                                JSONObject jsonObject = jsonArray.getJSONObject(i);
+                                // 从JSONObject中获取你需要的字段
+                                String JTXX = (String) jsonObject.get("textField_ly6lt3dm");
+                                if (!XMBH.equals("") && !XMBH.equals("") && !JTXX.equals("")) {
+                                    List<Map> dataList = (List<Map>) ydClient.queryData(YDParam.builder()
+                                            .appType("APP_X89Y00KKTG36B8JYGZVR")
+                                            .systemToken("QIA66091HJPLRHM3AUFJLCN24CUP2VNMO41XLW4")
+                                            .formUuid("FORM-CA8ABC2353B94262BC02D4C5332273EEHRU2")//完成阶段配置
+                                            // .searchFieldJson(JSON.toJSONString(UtilMap.map("serialNumberField_lt1i52jt",data.get("XMBH").toString())))
+                                            .build(), YDConf.FORM_QUERY.retrieve_search_form).getData();
+                                    //循环阶段数据,并写入限制完成表
+                                    for (Map formData : dataList) {
+                                        String JDMC = String.valueOf(UtilMap.getMap(formData, "formData").get("textField_lx31so5x"));//阶段名称
+                                        String LX = String.valueOf(UtilMap.getMap(formData, "formData").get("textField_lxy17mef"));//类型
+                                        String ZB = String.valueOf(UtilMap.getMap(formData, "formData").get("numberField_lxsaen1q"));//占比
+                                        String ZZB = String.valueOf(UtilMap.getMap(formData, "formData").get("numberField_lxsaen1r"));//占总比
+                                        String XH = String.valueOf(UtilMap.getMap(formData, "formData").get("numberField_lx31so5r"));//序号
+                                        String ZZBZ = String.valueOf(UtilMap.getMap(formData, "formData").get("numberField_lxy17mee"));//#占总比值
+                                        String[] sdfassss = new String[]{String.valueOf(UtilMap.getMap(formData, "formData").get("departmentSelectField_lyy1hoyr_id"))};
+                                        String ZD = "textField_m00ovvk4, textField_m00ovvk3, textField_m00wsnjk, textField_lx31so5x, textField_lxy17mef, numberField_lxsaen1q, numberField_lxsaen1r, numberField_lx31so5r, numberField_lxy17mee, radioField_m00ovvk5, departmentSelectField_lyy1hoyr";
+                                        if (i>0 && (LX.equals("设计达成率") || LX.equals("电气达成率") || JDMC.equals("下单") || JDMC.equals("询价"))){
+
+                                        }else {
+                                            String tquid = ydClient.operateData(YDParam.builder()
+                                                    .appType("APP_X89Y00KKTG36B8JYGZVR")
+                                                    .systemToken("QIA66091HJPLRHM3AUFJLCN24CUP2VNMO41XLW4")
+                                                    .formUuid("FORM-9A3C0361CC6F43E2AEB6F66BA6B4F87DRHP5")
+                                                    .formDataJson(JSON.toJSONString(UtilMap.map(ZD, XMBH, XMMC, JTXX, JDMC, LX, ZB, ZZB, XH, ZZBZ, "否", sdfassss[0].toString())))//这里
+                                                    .build(), YDConf.FORM_OPERATION.create).toString();////
+                                        }
+
+
+                                    }
+                                }
+                            }
+                        }
+
+                    }
+                }
+            }
+        }
+        return McR.success();
+    }
+
+
+}

+ 32 - 0
mjava-luyi/src/main/java/com/malk/luyi/controller/KSJC_timer.java

@@ -0,0 +1,32 @@
+package com.malk.luyi.controller;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+
+@Slf4j
+@Configuration
+@EnableScheduling
+public class KSJC_timer {
+    @Autowired
+    private KSJCController legalEntityService;
+    /*集晨判断是否能打卡*/
+    //每天早晨7点05分同步数据
+ @Scheduled(cron = "0 5 7 * * ?")
+   // @Scheduled(fixedRate = 5000)
+    public void LegalEntityList(){
+        log.info("k");
+        try{
+           legalEntityService.insetTHXM_TMER();
+            System.out.println("集晨判断,同步完成");
+        }catch (Exception e){
+            //记录错误信息
+            e.printStackTrace();
+        }
+
+    }
+}

+ 59 - 15
mjava-luyi/src/main/java/com/malk/luyi/controller/PJJSController.java

@@ -10,12 +10,14 @@ 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.utils.UtilMap;
 import com.malk.utils.UtilServlet;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -30,6 +32,10 @@ public class PJJSController {
 
     @Autowired
     private YDClient ydClient;
+
+    @Autowired
+    private DDClient dd;
+
     @Autowired
     private McDelegate mcDelegate;
 
@@ -43,10 +49,13 @@ public class PJJSController {
 
 
         String XMLX=data.get("xmLx").toString();
+        String hangye1=data.get("hangye1").toString();//行业1
+        String hangye2=data.get("hangye2").toString();//行业2
+        String zyyw=data.get("zyyw").toString();//主营业务
         if (XMLX.equals("投前项目")){
             FORMID="textField_ltjj7pre";
             UUID="FORM-6EC75348FD8241D989DACA4B272CD8EBXFQK";
-              ZD="associationFormField_lt1jaec6, textField_lt1jaecd, textField_lt1jaecc, selectField_lt1iahs9";
+            ZD="associationFormField_lt1jaec6, textField_lt1jaecd, textField_lt1jaecc, selectField_lt1iahs9, selectField_lt1iahsi, selectField_lt1iahsj, textField_ltr1vksn";
 
         }else if (XMLX.equals("投后项目")){
             FORMID="textField_ltjj7prg";
@@ -60,20 +69,20 @@ public class PJJSController {
             log.info("associations: {}", associations);
             log.info("UUID, {}", UUID);
             log.info("ZD, {}", ZD);
-             String tquid=   ydClient.operateData(YDParam.builder()
-                     .appType("APP_G951QZ32AUJNJUE4G127")
-                     .systemToken("HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6")
-                        .formUuid(UUID)
-                        .formDataJson(JSON.toJSONString(UtilMap.map(ZD, associations,data.get("xmName"),data.get("xmcLsh") , XMLX )))
-                        .build(), YDConf.FORM_OPERATION.create).toString();////
-                if (tquid!=""){
-                    ydClient.operateData(YDParam.builder()
-                            .appType("APP_G951QZ32AUJNJUE4G127")
-                            .systemToken("HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6")
-                            .formInstanceId(String.valueOf(data.get("xmcId")))
-                            .updateFormDataJson(JSON.toJSONString(UtilMap.map(FORMID,tquid )))
-                            .build(), YDConf.FORM_OPERATION.update);
-                }
+            String tquid=   ydClient.operateData(YDParam.builder()
+                    .appType("APP_G951QZ32AUJNJUE4G127")
+                    .systemToken("HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6")
+                    .formUuid(UUID)
+                    .formDataJson(JSON.toJSONString(UtilMap.map(ZD, associations,data.get("xmName"),data.get("xmcLsh") , XMLX,hangye1,hangye2,zyyw )))//这里
+                    .build(), YDConf.FORM_OPERATION.create).toString();////
+            if (tquid!=""){
+                ydClient.operateData(YDParam.builder()
+                        .appType("APP_G951QZ32AUJNJUE4G127")
+                        .systemToken("HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6")
+                        .formInstanceId(String.valueOf(data.get("xmcId")))
+                        .updateFormDataJson(JSON.toJSONString(UtilMap.map(FORMID,tquid )))
+                        .build(), YDConf.FORM_OPERATION.update);
+            }
 
 
 
@@ -150,6 +159,41 @@ public class PJJSController {
 
 
 
+    ///
+    @SneakyThrows
+    @PostMapping("report/PJJStemporary")
+    McR temporary(@RequestBody Map<String,String> data ) {
+        String formid=data.get("fomid") ;
+        log.info("formid,{}",formid);
+        Map formdata=    ydClient.queryData(YDParam.builder()
+                .appType("APP_G951QZ32AUJNJUE4G127")
+                .systemToken("HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6")
+                .formUuid("FORM-04F671D6ABB048B2953763C3DAE14AE6ICGU")
+                .formInstanceId(String.valueOf(formid))
+                .build(), YDConf.FORM_QUERY.retrieve_id).getFormData();
+
+        List<Map> list=(List<Map>) JSON.parse(String.valueOf(formdata.get("attachmentField_lt468w10")));
+       //String ddapptonken= dd.getAccessToken("dingraobfxqulra4mp9r","KN28UwWycxxCkKkug1x61lsWWAhEaNpQbc8efrgMKyNUXayw-O2sRxDkhh9LTh8y");
+       // log.info("ddapptonken, {}",ddapptonken);
+       // log.info("ddapptonken, {}",list.get(0));
+       // System.out.println("list.get(0):"+list.get(0).toString());
+       // return McR.success(ydClient.convertTemporaryUrl(list.get(0).get("url").toString(),"APP_G951QZ32AUJNJUE4G127","HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6",ddapptonken));
+        //log.info("url, {}",McR.success(ydClient.convertTemporaryUrl_PJJS(list.get(0).get("url").toString() )));
+   //System.out.println("URL:"+McR.success(ydClient.convertTemporaryUrl_PJJS(list.get(0).get("url").toString() )));
+        System.out.println("afasdf:"+ydClient.convertTemporaryUrl_PJJS(list.get(0).get("url").toString() ));
+       return McR.success(ydClient.convertTemporaryUrl_PJJS(list.get(0).get("url").toString() ));
+
+//
+//       System.out.println("url:"+list.get(0) );
+//      return McR.success(list.get(0).get("downloadUrl").toString());
+
+
+
+
+    }
+
+
+
 
 
 

+ 4 - 0
mjava/pom.xml

@@ -21,6 +21,10 @@
 
     <dependencies>
 
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
     </dependencies>
 
     <build>

+ 2 - 1
mjava/src/main/java/com/malk/server/aliwork/YDConf.java

@@ -54,7 +54,8 @@ public class YDConf {
 
         retrieve_id,                // 单个ID查询 todo 若秘钥不匹配, 返回空, 添加报错说明
 
-        retrieve_search_process,            // 流程列表
+        retrieve_search_process, // 流程列表
+
         retrieve_search_form,               // 表单列表
 
         retrieve_search_process_id,         // 流程列表

+ 2 - 1
mjava/src/main/java/com/malk/service/aliwork/YDClient.java

@@ -21,9 +21,10 @@ public interface YDClient {
      * w
      * 获取宜搭附件临时免登地址
      */
-    String convertTemporaryUrl(String url, int timeout);
 
     String convertTemporaryUrl(String url, int timeout,String appType,String sysToken);
 
     String convertTemporaryUrl(String url);
+
+    String convertTemporaryUrl_PJJS(String url);
 }

+ 21 - 2
mjava/src/main/java/com/malk/service/aliwork/impl/YDClientImpl.java

@@ -24,6 +24,8 @@ public class YDClientImpl implements YDClient {
 
     @Autowired
     private DDClient ddClient;
+    @Autowired
+    private DDClient dd;
 
     // 初始化请求参数
     Map _initBodyParam(YDParam ydParam) {
@@ -141,6 +143,16 @@ public class YDClientImpl implements YDClient {
         return (String) DDR_New.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/" + ydConf.getAppType(), ddClient.initTokenHeader(), param).getResult();
     }
 
+    @Override
+    public String convertTemporaryUrl(String url ) {
+        Map param = new HashMap();
+        param.put("systemToken", ydConf.getSystemToken());
+        param.put("userId", YDConf.PUB_ACCOUNT);
+        param.put("fileUrl", url);          // URL在param上时, 需要编码 [UtilHttp已经做了编码] - URLEncoder.encode(url, "UTF-8")
+        param.put("timeout", 60000);      // 默认1分钟, 最大24小时 [毫秒]
+        return (String) DDR_New.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/" + ydConf.getAppType(), ddClient.initTokenHeader(), param).getResult();
+    }
+
     @Override
     public String convertTemporaryUrl(String url, int timeout, String appType, String sysToken) {
         timeout = timeout < 1000 ? 60000:timeout;
@@ -153,7 +165,14 @@ public class YDClientImpl implements YDClient {
     }
 
     @Override
-    public String convertTemporaryUrl(String url) {
-        return convertTemporaryUrl(url, 60000);
+    public String convertTemporaryUrl_PJJS(String url ) {
+      //  String ddapptonken= dd.getAccessToken("dingraobfxqulra4mp9r","KN28UwWycxxCkKkug1x61lsWWAhEaNpQbc8efrgMKyNUXayw-O2sRxDkhh9LTh8y");
+        Map param = new HashMap();
+        param.put("systemToken", "HOA66I8176RID79L6QF3554SPPYH22VTBH1TLX6");
+        param.put("userId", YDConf.PUB_ACCOUNT);
+        param.put("fileUrl", url);          // URL在param上时, 需要编码 [UtilHttp已经做了编码] - URLEncoder.encode(url, "UTF-8")
+        param.put("timeout", 60000);      // 默认1分钟, 最大24小时 [毫秒]
+        System.out.println("ssss:"+(String) DDR_New.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/APP_G951QZ32AUJNJUE4G127" , ddClient.initTokenHeader_PJSS(), param).getResult());
+        return (String) DDR_New.doGet("https://api.dingtalk.com/v1.0/yida/apps/temporaryUrls/APP_G951QZ32AUJNJUE4G127" , ddClient.initTokenHeader_PJSS(), param).getResult();
     }
 }

+ 11 - 0
mjava/src/main/java/com/malk/service/dingtalk/DDClient.java

@@ -30,5 +30,16 @@ public interface DDClient {
      * 通过免登码获取用户信息
      */
     Map getUserInfoByCode(String accessToken, String code);
+
+    Map initTokenHeader_PJSS();
+
+
+    Map getusergroup(String UserId);//获取用户考勤组
+
+    Map inset_hr_group(String type,String UserId,String grupid);//把人员写入考勤组
+
+    Map getleavestatus(String userid_list,long start_time,long end_time);// 询指定企业下指定用户在指定时间段内每天的请假状态和请假时长信息。
+
+    Map getgroupquery(String op_user_id,String  group_id );//调用本接口,可获取考勤组名称、考勤组主负责人和考勤类型等信息。
 }
 

+ 103 - 0
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient.java

@@ -43,6 +43,22 @@ public class DDImplClient implements DDClient {
         return accessToken;
     }
 
+    public String getAccessToken_PJSS() {
+        //浦江基石
+        String accessToken = UtilToken.get("invalid-token-dingtalk");
+        if (StringUtils.isNotBlank(accessToken)) return accessToken;
+        Map param = new HashMap();
+        param.put("appkey", "dingraobfxqulra4mp9r");
+        param.put("appsecret", "KN28UwWycxxCkKkug1x61lsWWAhEaNpQbc8efrgMKyNUXayw-O2sRxDkhh9LTh8y");
+        DDR r = (DDR) UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", param, DDR.class);
+        log.info("响应token, {}", r.getAccessToken());
+        accessToken = r.getAccessToken();
+        // token失效自动重置: DD重新调用会重置过期时间
+        UtilToken.put("invalid-token-dingtalk", accessToken, r.getExpiresIn() * 1000L);
+        return accessToken;
+    }
+
+
     @Override
     public String getAccessToken(String appKey, String appSecret) {
         Map param = UtilMap.map("appkey, appsecret", appKey, appSecret);
@@ -67,6 +83,10 @@ public class DDImplClient implements DDClient {
         return DDConf.initTokenHeader(getAccessToken());
     }
 
+    public Map initTokenHeader_PJSS() {
+        return DDConf.initTokenHeader(getAccessToken_PJSS());
+    }
+
     /**
      * 获取jsapi_ticket
      *
@@ -92,4 +112,87 @@ public class DDImplClient implements DDClient {
     public Map getUserInfoByCode(String accessToken, String code) {
         return (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/v2/user/getuserinfo", null, DDConf.initTokenParams(accessToken), UtilMap.map("code", code)).getResult();
     }
+
+
+    public Map getusergroup( String userid) {
+
+        Map param = new HashMap();
+        param.put("appkey", "dingapqprcbwk5bvahc1");
+        param.put("appsecret", "V_YgI8ZYx3lSf_Fw3qNH6k-U9umKhxglpPrnPkdb73CVrXWFme_SwUCdQxR2poFi");
+        DDR r = (DDR) UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", param, DDR.class);
+        log.info("响应token, {}", r.getAccessToken());
+       String accessToken = r.getAccessToken();
+        // token失效自动重置: DD重新调用会重置过期时间
+        UtilToken.put("invalid-token-dingtalk", accessToken, r.getExpiresIn() * 1000L);
+
+        return (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/attendance/getusergroup", null, DDConf.initTokenParams(accessToken), UtilMap.map("userid", userid)).getResult();
+    }
+
+    public  Map inset_hr_group(String type,String UserId,String grupid){
+        Map  vlsumap= new HashMap();
+        Map param = new HashMap();
+        param.put("appkey", "dingapqprcbwk5bvahc1");
+        param.put("appsecret", "V_YgI8ZYx3lSf_Fw3qNH6k-U9umKhxglpPrnPkdb73CVrXWFme_SwUCdQxR2poFi");
+        DDR r = (DDR) UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", param, DDR.class);
+        log.info("响应token, {}", r.getAccessToken());
+        String accessToken = r.getAccessToken();
+        // token失效自动重置: DD重新调用会重置过期时间
+        UtilToken.put("invalid-token-dingtalk", accessToken, r.getExpiresIn() * 1000L);
+
+        Map param_post = new HashMap();
+
+        param_post.put("op_user_id","683135622237866009");//操作人userId。
+        param_post.put("group_id",grupid);//考勤组ID
+        param_post.put("schedule_flag",0);//从哪天开始排班。0:从今天开始排班1:从明天开始排班
+        if (type.equals("新增")){
+            Map param_post_upda = new HashMap();
+            String[] arr = {UserId};
+            param_post_upda.put("add_users",UserId);
+            param_post.put("update_param",param_post_upda);
+        }else  if (type.equals("删除")){
+            Map param_post_upda = new HashMap();
+            String[] arr = {UserId};
+            param_post_upda.put("remove_users",UserId);
+            param_post.put("update_param",param_post_upda);
+        }
+        System.out.println("param_post:"+param_post);
+
+        vlsumap= (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/attendance/group/member/update", null, DDConf.initTokenParams(accessToken), param_post ).getResult();
+
+       return  vlsumap;
+    }
+
+    public Map getleavestatus(String userid_list,long start_time,long end_time){
+        Map param = new HashMap();
+        param.put("appkey", "dingapqprcbwk5bvahc1");
+        param.put("appsecret", "V_YgI8ZYx3lSf_Fw3qNH6k-U9umKhxglpPrnPkdb73CVrXWFme_SwUCdQxR2poFi");
+        DDR r = (DDR) UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", param, DDR.class);
+        log.info("响应token, {}", r.getAccessToken());
+        String accessToken = r.getAccessToken();
+        // token失效自动重置: DD重新调用会重置过期时间
+        UtilToken.put("invalid-token-dingtalk", accessToken, r.getExpiresIn() * 1000L);
+        Map param_post = new HashMap();
+        param_post.put("userid_list",userid_list);//操作人userId。
+        param_post.put("start_time",start_time);//考勤组ID
+        param_post.put("end_time",end_time);//从哪天开始排班。0:从今天开始排班1:从明天开始排班
+        param_post.put("offset",0);//支持分页查询,与size参数同时设置时才生效,此参数代表偏移量,偏移量从0开始
+        param_post.put("size",10);//支持分页查询,与offset参数同时设置时才生效,此参数代表分页大小,最大20。
+        return  (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/attendance/getleavestatus", null, DDConf.initTokenParams(accessToken), param_post ).getResult();
+    };
+
+   public Map getgroupquery(String op_user_id,String  group_id ){//考勤组部分信息如下图所示。调用本接口,可获取考勤组名称、考勤组主负责人和考勤类型等信息。
+       op_user_id="683135622237866009";
+       Map param = new HashMap();
+       param.put("appkey", "dingapqprcbwk5bvahc1");
+       param.put("appsecret", "V_YgI8ZYx3lSf_Fw3qNH6k-U9umKhxglpPrnPkdb73CVrXWFme_SwUCdQxR2poFi");
+       DDR r = (DDR) UtilHttp.doGet("https://oapi.dingtalk.com/gettoken", param, DDR.class);
+       log.info("响应token, {}", r.getAccessToken());
+       String accessToken = r.getAccessToken();
+       // token失效自动重置: DD重新调用会重置过期时间
+       UtilToken.put("invalid-token-dingtalk", accessToken, r.getExpiresIn() * 1000L);
+       Map param_post = new HashMap();
+       param_post.put("op_user_id",op_user_id);//操作人userId。
+       param_post.put("group_id",group_id);//考勤组ID
+       return  (Map) DDR.doPost("https://oapi.dingtalk.com/topapi/attendance/group/query", null, DDConf.initTokenParams(accessToken), param_post ).getResult();
+   };
 }

+ 14 - 0
mjava/src/main/java/com/malk/service/teambition/TBClient.java

@@ -237,6 +237,20 @@ public interface TBClient {
     Map updateTag(String projectTagId, Map param);
 
 
+    /**
+     * 查询项目集
+     *
+     * @apiNote https://open.teambition.com/docs/apis/64e810fe912d20d3b58f9ff9
+     */
+    List<Map> queryProgramList(String programIds);
+
+    /**
+     * 批量添加项目到项目集
+     *
+     * @apiNote https://open.teambition.com/docs/apis/64e810fe912d20d3b58f9ff9
+     */
+    List<Map> upsertProgramProject(String programId, List<String> projectIds);
+
     /**
      * 查询全部数据 [函数回调]
      * - ppExt

+ 14 - 0
mjava/src/main/java/com/malk/service/teambition/impl/TBClientImpl.java

@@ -341,4 +341,18 @@ public class TBClientImpl implements TBClient {
         TBR tbr = (TBR) UtilHttp.doGet(tbConf.getApiHost() + "/v3/project-tag/" + projectTagId, initHeaderToken(), param, TBR.class);
         return (Map) tbr.getResult();
     }
+
+    @Override
+    public List<Map> queryProgramList(String programIds) {
+        /// todo post请求 id虽然为非必填,但是这个参数是和get请求,在url后不在body里面。因此也会触发必填校验. BUG
+        Map param = UtilMap.map("programIds", programIds);
+        TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "/v3/program/query", initHeaderToken(), param, null, TBR.class);
+        return (List<Map>) tbr.getResult();
+    }
+
+    @Override
+    public List<Map> upsertProgramProject(String programId, List<String> projectIds) {
+        TBR tbr = (TBR) UtilHttp.doPost(tbConf.getApiHost() + "v3/program/" + programId + "/project/create", initHeaderToken(), UtilMap.map("projectIds", projectIds), TBR.class);
+        return (List<Map>) tbr.getResult();
+    }
 }

+ 3 - 0
mjava/src/main/java/com/malk/utils/UtilMap.java

@@ -49,6 +49,9 @@ public abstract class UtilMap {
      * 快速创建map [key, Strings]
      */
     public static Map<String, String> map(String keys, String values) {
+        if (UtilString.isBlankCompatNull(keys) || UtilString.isBlankCompatNull(values)) {
+            return UtilMap.empty();
+        }
         String[] props = keys.split(", ");
         String[] contents = values.split(", ");
         if (props.length != contents.length) {