Browse Source

艾为 + 格屋 更新

pruple_boy 1 year ago
parent
commit
ad10e3ff07

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

@@ -109,9 +109,9 @@ public class TBxYDController {
 
         Map<String, ?> data = UtilServlet.getParamMap(request);
         log.info("分配项目角色, {}", data);
-        McException.assertParamException_Null(data, "projectId");
+        McException.assertParamException_Null(data, "projectId", "trNode");
 
-        awClint.updateProjectRole(UtilMap.getString(data, "projectId"));
+        awClint.updateProjectRole(UtilMap.getString(data, "projectId"), (List<String>) JSON.parse(UtilMap.getString(data, "trNode")));
         return McR.success();
     }
 

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

@@ -40,7 +40,7 @@ public interface AWClint {
     /**
      * 分配项目角色 prd 若是一人直接指定, 多人情况下忽略
      */
-    void updateProjectRole(String projectId);
+    void updateProjectRole(String projectId, List<String> trNode);
 
     /**
      * 项目迁移: 删除依赖项
@@ -48,7 +48,7 @@ public interface AWClint {
     void removeDependencies(String projectId, List<String> trNode);
 
     /**
-     * 同步预检项
+     * 同步预检项 [实现]
      *
      * @param srcParam          [appType, formUuid, systemToken]
      * @param compIds           映射表: 当前组件, 来源组件
@@ -60,7 +60,7 @@ public interface AWClint {
     void syncCheckList(YDParam srcParam, Map<String, ?> compIds, String taskCompId, String codeCompId, String checkType, String associationCompId);
 
     /**
-     * 同步预检项
+     * 同步预检项 [通用]
      *
      * @param type 预检项分类(0-经验库、1-技术评审要素表, 2-TR评审要素表)
      */

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

@@ -15,6 +15,7 @@ import com.malk.service.teambition.TBClient;
 import com.malk.utils.UtilEnv;
 import com.malk.utils.UtilMap;
 import com.malk.utils.UtilString;
+import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -340,6 +341,7 @@ public class AWImplClient implements AWClint {
     /**
      * 同步项目主数据 [兼容新增]
      */
+    @Synchronized
     @Override
     public Map syncProject(String projectCode) {
 
@@ -430,6 +432,7 @@ public class AWImplClient implements AWClint {
      * 通过模板创建项目 [ppExt: 过滤宜搭项目档案\TB项目, 避免重复创建, 若判定为更新下执行项目成员更新]
      */
     @Override
+    @Synchronized
     public void createProject(String projectCode, String templateId) {
 
         log.info("通过模板创建项目, {}, {}", projectCode, templateId);
@@ -479,7 +482,7 @@ public class AWImplClient implements AWClint {
             List<String> tRoleIds = UtilMap.getList(role, "roleIds");
             tRoleIds.remove(pmRoleId);
             if (tRoleIds.isEmpty()) {
-                tRoleIds.add(_getProjectRoleId(projectId, "项目成员"));
+                tRoleIds.add(_getProjectRoleId(projectId, "项目成员"));  // 极少情况, 无需冗余
             }
             tbClient.updateProjectMember(Arrays.asList(UtilMap.getString(role, "userId")), tRoleIds, projectId);
         }
@@ -501,8 +504,9 @@ public class AWImplClient implements AWClint {
     /**
      * 分配项目角色 prd 若是一人直接指定, 多人情况下忽略
      */
+    @Synchronized
     @Override
-    public void updateProjectRole(String projectId) {
+    public void updateProjectRole(String projectId, List<String> trNode) {
 
         // 项目档案 [tb项目号查询, 避免模糊匹配]
         List<Map> pList = ydService.queryDataList_FormData(_matchFormUuid("PROJECT"), UtilMap.map("textField_lqxtykce", projectId));
@@ -527,13 +531,25 @@ public class AWImplClient implements AWClint {
                     continue;
                 }
                 List<Map> customfields = (List<Map>) task.get("customfields");
+                // prd 按照tr节点分配成员, 若是含有全部则忽略
+                if (!trNode.contains("全部")) {
+                    Optional optional2 = customField.stream().filter(item -> AWServer.TASK_STAGE.equals(item.get("name"))).findAny();
+                    if (!optional2.isPresent()) {
+                        continue;
+                    }
+                    String trName = TBConf.getTaskFieldValue_First(customfields, UtilMap.getString((Map) optional2.get(), "id"));
+                    if (!trNode.contains(trName)) {
+                        continue;
+                    }
+                    log.info("trName = {}", trName);
+                }
                 String roleName = TBConf.getTaskFieldValue_First(customfields, UtilMap.getString((Map) optional.get(), "id"));
                 // 获取角色在项目主数据对应成员
                 optional = rList.stream().filter(item -> roleName.equals(item.get("selectField_lqxu6bgf"))).findAny();
                 if (!optional.isPresent()) {
                     continue;
                 }
-                log.info("分配项目角色 taskId = {}, 资源名称 = {}, 项目角色 = {}", UtilMap.getString(task, "id"), roleName, optional.get());
+                log.info("分配项目角色 taskId = {}, trNode = {}, 资源名称 = {}, 项目角色 = {}", UtilMap.getString(task, "id"), roleName, optional.get());
                 List<String> roleIds = (List<String>) UtilMap.getList((Map) optional.get(), "employeeField_lqxtykch_id");
                 if (roleIds.size() == 1) {
                     String tbUserId = _convertUserId(roleIds.get(0), false);
@@ -549,6 +565,7 @@ public class AWImplClient implements AWClint {
     /**
      * 项目迁移: 删除依赖项
      */
+    @Synchronized
     @Override
     public void removeDependencies(String projectId, List<String> trNode) {
 
@@ -557,7 +574,7 @@ public class AWImplClient implements AWClint {
         tbClient.queryProjectTaskList(projectId, null, taskList -> {
             for (Map task : taskList) {
 
-                Optional optional = customField.stream().filter(item -> "TR评审节点".equals(item.get("name"))).findAny();
+                Optional optional = customField.stream().filter(item -> AWServer.TASK_STAGE.equals(item.get("name"))).findAny();
                 if (!optional.isPresent()) {
                     continue;
                 }
@@ -603,6 +620,7 @@ public class AWImplClient implements AWClint {
     /**
      * 同步预检项 [全量同步, 忽略任务号为空记录]
      */
+    @Synchronized
     @Override
     public void syncCheckList(YDParam srcParam, Map<String, ?> compIds, String taskCompId, String codeCompId, String checkType, String associationCompId) {
 
@@ -642,6 +660,10 @@ public class AWImplClient implements AWClint {
         }
     }
 
+    /**
+     * 同步预检项 [通用]
+     */
+    @Synchronized
     @Override
     public void syncCheckList(int type) {
 

+ 13 - 5
mjava-gewu/src/main/java/com/malk/gewu/controller/GWController.java

@@ -10,8 +10,10 @@ 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.utils.UtilDateTime;
 import com.malk.utils.UtilMap;
 import com.malk.utils.UtilServlet;
+import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -20,6 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -35,6 +38,7 @@ public class GWController {
     /**
      * 同步花名册信息
      */
+    @Synchronized
     @PostMapping("sync")
     McR syncRoster() {
 
@@ -48,6 +52,7 @@ public class GWController {
     /**
      * 拆分培训记录表
      */
+    @Synchronized
     @PostMapping("copy")
     McR copyTrain(HttpServletRequest request) {
 
@@ -73,12 +78,15 @@ public class GWController {
     @PostMapping("schedule")
     McR schedule(HttpServletRequest request) {
 
-//        Map data = UtilServlet.getParamMap(request);
-//        log.info("创建提醒日程, {}", data);
-//        Map formData = (Map) JSON.parse(String.valueOf(data.get("formData")));
-//        List<String> userIds = (List<String>) JSON.parse(String.valueOf(formData.get("employeeField_limyct1y")));
+        Map data = UtilServlet.getParamMap(request);
+        log.info("创建提醒日程, {}", data);
+
+        List<String> userIds = (List<String>) JSON.parse(UtilMap.getString(data, "userIds"));
+        Date sTime = UtilDateTime.parseDateTime(UtilDateTime.formatDate(new Date(UtilMap.getLong(data, "sTime"))) + " 09:00:000");
+        Date eTime = UtilDateTime.parseDateTime(UtilDateTime.formatDate(new Date(UtilMap.getLong(data, "eTime"))) + " 18:00:000");
+        String organizer = UtilMap.getString(data, "organizer");
 
-        gwService.createSchedule();
+        gwService.createSchedule(UtilMap.getString(data, "summary"), UtilMap.getString(data, "description"), userIds, sTime, eTime, organizer);
         return McR.success();
     }
 

+ 5 - 2
mjava-gewu/src/main/java/com/malk/gewu/service/GWService.java

@@ -1,5 +1,8 @@
 package com.malk.gewu.service;
 
+import java.util.Date;
+import java.util.List;
+
 public interface GWService {
 
     /**
@@ -8,9 +11,9 @@ public interface GWService {
     void syncRoster();
 
     /**
-     * 参加钉钉日程
+     * 创建钉钉日程
      */
-    void createSchedule();
+    void createSchedule(String summary, String description, List<String> usrIds, Date sTime, Date eTIme, String organizer);
 
     // test
     void test();

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

@@ -10,6 +10,7 @@ import com.malk.service.dingtalk.DDClient;
 import com.malk.service.dingtalk.DDClient_Contacts;
 import com.malk.service.dingtalk.DDClient_Personnel;
 import com.malk.service.dingtalk.DDClient_Schedule;
+import com.malk.utils.UtilDateTime;
 import com.malk.utils.UtilFile;
 import com.malk.utils.UtilMap;
 import lombok.extern.slf4j.Slf4j;
@@ -108,16 +109,17 @@ public class GWImplService implements GWService {
     private DDClient_Schedule ddClient_schedule;
 
     /**
-     * 参加钉钉日程
+     * 创建钉钉日程
      */
     @Override
-    public void createSchedule() {
-        List attendees = Arrays.asList("011467460262746600", "2534342040877632");
+    public void createSchedule(String summary, String description, List<String> usrIds, Date sTime, Date eTIme, String organizer) {
+        String startTime = UtilDateTime.format(sTime, UtilDateTime.DATE_TIME_ISO).replace("+0800", "+08:00");
+        String endTime = UtilDateTime.format(eTIme, UtilDateTime.DATE_TIME_ISO).replace("+0800", "+08:00");
         // ppExt: start 与 end 不能使用同一个map对象, 会报错date不能为空.
-        Map start = UtilMap.map("date", "2024-01-31");
-        Map end = UtilMap.map("date", "2024-01-31");
-        Map body = UtilMap.map("summary, description, start, end, attendees, isAllDay", "日程标题", "日程描述", start, end, attendees, true);
-        ddClient_schedule.eventsSchedule(ddClient.getAccessToken(), "095358016629044412", body);
+        Map start = UtilMap.map("dateTime, timeZone", startTime, "Asia/Shanghai");
+        Map end = UtilMap.map("dateTime, timeZone", endTime, "Asia/Shanghai");
+        Map body = UtilMap.map("summary, description, start, end, userIds", summary, description, start, end, usrIds);
+        ddClient_schedule.eventsSchedule(ddClient.getAccessToken(), organizer, body);
     }
 
     /// test

+ 2 - 0
mjava/src/main/java/com/malk/service/dingtalk/DDClient_Schedule.java

@@ -8,6 +8,8 @@ public interface DDClient_Schedule {
 
     /**
      * 创建日程
+     *
+     * @param body start/time 1. UtilDateTime.DATE_TIME_ISO: ISO-8601的date-time格式, 2. 非全天日程传递 timeZone: Asia/Shanghai
      */
     DDR_New eventsSchedule(String access_token, String userId, Map body);
 }

+ 3 - 3
mjava/src/main/java/com/malk/service/dingtalk/impl/DDImplClient_Schedule.java

@@ -22,7 +22,7 @@ public class DDImplClient_Schedule implements DDClient_Schedule {
     private DDClient_Contacts ddClient_contacts;
 
     /**
-     * 创建日程 [; start 日程开始日期,格式:yyyy-MM-dd]
+     * 创建日程 [注意区分全天和非全天数据格式]
      *
      * @apiNote https://open.dingtalk.com/document/personalapp/create-schedule
      */
@@ -30,8 +30,8 @@ public class DDImplClient_Schedule implements DDClient_Schedule {
     public DDR_New eventsSchedule(String access_token, String userId, Map body) {
 
         String unionId = String.valueOf(ddClient_contacts.getUserInfoById(access_token, userId).get("unionid"));
-        // attendees 日程参数人上限为500, 需要传递unionId
-        List<String> attendees = UtilMap.getList(body, "attendees");
+        // attendees 日程参数人上限为500, 需要传递unionId. ppExt: start 与 end 不能使用同一个map对象, 会报错date不能为空.
+        List<String> attendees = UtilMap.getList(body, "userIds");
         if (UtilList.isNotEmpty(attendees)) {
             body.put("attendees", attendees.stream().map(dId -> {
                 String uId = String.valueOf(ddClient_contacts.getUserInfoById(access_token, dId).get("unionid"));

+ 4 - 1
mjava/src/main/java/com/malk/utils/UtilDateTime.java

@@ -18,11 +18,14 @@ import java.util.Date;
 public abstract class UtilDateTime {
 
     // todo: 获取次日开启时间, 获取次日结束时间
+
     public final static String DATE_PATTERN = "yyyy-MM-dd";
     public final static String TIME_PATTERN = "HH:mm:ss";
     public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+    /// ISO-8601的date-time格式: T表示分隔符,Z表示的是UTC
+    public final static String DATE_TIME_ISO = "yyyy-MM-dd'T'HH:mm:ssZ";
+    public final static String DATE_MSEL_ISO = "yyyy-MM-dd'T'HH:mm:SSSZ";
 
-    /// T表示分隔符,Z表示的是UTC "yyyy-MM-dd'T'HH:mm:ss.SSS Z"
 
     //// convert ////