|
@@ -215,7 +215,7 @@ public class AWImplClient implements AWClint {
|
|
|
Map taskData = _getTaskFieldMap(taskId, AWServer.TASK_CODE, AWServer.TASK_CHECK_LINK, AWServer.TASK_ROLE, AWServer.TASK_STAGE);
|
|
|
String checkLink = UtilMap.getString(taskData, AWServer.TASK_CHECK_LINK);
|
|
|
/// prd 预检项持续维护需要重新匹配, 任务号和主数据判定为非法, 无需重新刷新
|
|
|
- if (isTask && (StringUtils.isNotBlank(checkLink) && !"未配置预检项".equals(checkLink))) {
|
|
|
+ if (isTask && (StringUtils.isNotBlank(checkLink) && !AWServer.TASK_TIPS.equals(checkLink))) {
|
|
|
return UtilMap.map("result", "链接已加载");
|
|
|
}
|
|
|
Map rTask = UtilMap.getMap(taskData, "task");
|
|
@@ -235,7 +235,7 @@ public class AWImplClient implements AWClint {
|
|
|
.searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lrncf4hk, radioField_lrnddfq6", tCode, "启用")))
|
|
|
.build());
|
|
|
if (tList.size() == 0) {
|
|
|
- result = "未配置预检项";
|
|
|
+ result = AWServer.TASK_TIPS;
|
|
|
} else {
|
|
|
// List<Map> pList = ydService.queryDataList_FormData("FORM-84EF78C7DBA047E58A8C8511106F91D5WNVI", UtilMap.map("textField_lqxtykce", pCode));
|
|
|
List<Map> pList = ydService.queryDataList_FormData("FORM-141E21DF183846028E21727CE43CD1C75CLZ", UtilMap.map("textField_lqxtykce", pCode));
|
|
@@ -254,6 +254,11 @@ public class AWImplClient implements AWClint {
|
|
|
Map body = TBConf.assembleCustomFieldName(AWServer.TASK_CHECK_LINK, result);
|
|
|
tbClient.updateTaskCustomField(taskId, creatorId, body);
|
|
|
}
|
|
|
+ // prd 未配置预检项更新为已检查, 避免完成任务完成触发必填校验
|
|
|
+ if (AWServer.TASK_TIPS.equals(result)) {
|
|
|
+ Map body = TBConf.assembleCustomFieldName(AWServer.TASK_CHECK_STATUS, "已检查");
|
|
|
+ tbClient.updateTaskCustomField(taskId, creatorId, body);
|
|
|
+ }
|
|
|
return UtilMap.map("result", result);
|
|
|
}
|
|
|
McException.assertAccessException(ObjectUtil.isNull(rProject), result);
|
|
@@ -265,7 +270,11 @@ public class AWImplClient implements AWClint {
|
|
|
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")))));
|
|
|
// 返回检查项
|
|
|
- formData.put("tableField_lqxxgj4s", tList);
|
|
|
+ formData.put("tableField_lqxxgj4s", tList.stream().map(item -> {
|
|
|
+// item.put("associationFormField_lrrsitxu", YDConf.associationForm("APP_H7WUJTKB448F9IBDC6C4", "FORM-7B63BB056145452F8BC0A2C52492DE00QVBH", UtilMap.getString(item, "instanceId"), UtilMap.getString(item, "textField_lrnd3h0r"), "", false));
|
|
|
+ item.put("associationFormField_lrrnem5r", YDConf.associationForm("APP_R5EBUF2FPN3Y8DRF93M4", "FORM-6E2C0D1197264B8AA23EB3FECAE7344B00BN", UtilMap.getString(item, "instanceId"), UtilMap.getString(item, "textField_lrnd3h0r"), "", false));
|
|
|
+ return item;
|
|
|
+ }).collect(Collectors.toList()));
|
|
|
return formData;
|
|
|
}
|
|
|
|
|
@@ -284,4 +293,217 @@ public class AWImplClient implements AWClint {
|
|
|
Map body2 = TBConf.assembleCustomFieldName(AWServer.TASK_CHECK_LINK, result);
|
|
|
tbClient.updateTaskCustomField(String.valueOf(data.get("taskId")), String.valueOf(data.get("creatorId")), body2);
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 同步项目主数据 [兼容新增]
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map syncProject(String projectCode) {
|
|
|
+
|
|
|
+ // 新增场景下, 提供实例ID回写TB项目编号
|
|
|
+ Map formData = null;
|
|
|
+
|
|
|
+ // fixme: test生产环境, 人员组件不能同步, 更新后人员会为空. todo 测试环境建立模拟项目主数据单据
|
|
|
+ // 查询项目主数据 [艾为应用]
|
|
|
+ YDParam ydParam = YDParam.builder()
|
|
|
+ .appType("APP_QBWQITQBSPJNYTUTNPDK")
|
|
|
+ .systemToken("8F966HB12J27MQJM6V4IQDYHYTPA2G4GTZGCLN1")
|
|
|
+ .formUuid("FORM-Q4A664A1V158R81L662N9507PLND288T7O6ELN")
|
|
|
+ .build();
|
|
|
+ if (StringUtils.isNotBlank(projectCode)) {
|
|
|
+ ydParam.setSearchFieldJson(JSON.toJSONString(UtilMap.map("textField_le6o88w0", projectCode)));
|
|
|
+ }
|
|
|
+ List<Map> mapBaseList = ydService.queryAllFormData(ydParam);
|
|
|
+ log.info("项目主数据, {}", mapBaseList.size());
|
|
|
+ McException.assertAccessException(mapBaseList.isEmpty(), "未匹配项目主数据");
|
|
|
+
|
|
|
+ // 查询项目角色
|
|
|
+ YDParam ydParam1 = YDParam.builder()
|
|
|
+// .formUuid("FORM-5BE21392886E46DF955D1EBC100ADA429NON")
|
|
|
+ .formUuid("FORM-3C7396A12ADB48A8833EBD90089C93833R21")
|
|
|
+ .build();
|
|
|
+ List<Map> mapRool = (List<Map>) ydClient.queryData(ydParam1, YDConf.FORM_QUERY.retrieve_list).getData();
|
|
|
+
|
|
|
+ // 匹配数据组件ID
|
|
|
+ for (Map item : mapBaseList) {
|
|
|
+ Map baseFormData = (Map) item.get("formData");
|
|
|
+
|
|
|
+ // 项目主数据
|
|
|
+ formData = new HashMap();
|
|
|
+ formData.put("textField_lqxtykcd", baseFormData.get("textField_lo2c1f0l")); //项目名称
|
|
|
+ formData.put("textField_lrj7vnxb", baseFormData.get("textField_le6o88w0")); //项目号
|
|
|
+ formData.put("textField_lrj7vnxc", baseFormData.get("textField_le6o88w1")); //项目简称
|
|
|
+ formData.put("textareaField_lrj7vnxl", baseFormData.get("textField_le6o88w2")); //项目描述
|
|
|
+ formData.put("textField_lrj7vnxf", item.get("formInstanceId")); //项目实例ID
|
|
|
+
|
|
|
+ // 项目角色详情
|
|
|
+ List<Map> details = new ArrayList<>();
|
|
|
+ mapRool.forEach(rool -> {
|
|
|
+ Map roolFormData = (Map) rool.get("formData");
|
|
|
+ //创建详情的角色名称和成员组件Map
|
|
|
+ Map row = new HashMap();
|
|
|
+// Object roolItems = baseFormData.get(roolFormData.get("textField_lrj7t5mn"));
|
|
|
+// Object projectRool = roolFormData.get("textField_lqxu439g");
|
|
|
+ Object roolItems = baseFormData.get(roolFormData.get("textField_lr7bgi76"));
|
|
|
+ Object projectRool = roolFormData.get("textField_lqxu439g");
|
|
|
+
|
|
|
+ if (roolItems != null && projectRool != null) {
|
|
|
+// row.put("employeeField_lqxtykch", baseFormData.get(roolFormData.get("textField_lrj7t5mn")));
|
|
|
+// row.put("selectField_lqxu6bgf", roolFormData.get("textField_lqxu439g"));
|
|
|
+ row.put("employeeField_lqxtykch", baseFormData.get(roolFormData.get("textField_lr7bgi76")));
|
|
|
+ row.put("selectField_lqxu6bgf", roolFormData.get("textField_lqxu439g"));
|
|
|
+ details.add(row);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ formData.put("tableField_lqxtykcf", details);
|
|
|
+
|
|
|
+ //通过项目号获取项目是否已存在
|
|
|
+ YDParam ydParam2 = YDParam.builder()
|
|
|
+// .formUuid("FORM-84EF78C7DBA047E58A8C8511106F91D5WNVI")
|
|
|
+ .formUuid("FORM-141E21DF183846028E21727CE43CD1C75CLZ")
|
|
|
+ .searchFieldJson(JSON.toJSONString(UtilMap.map("textField_lrj7vnxb", baseFormData.get("textField_le6o88w0"))))
|
|
|
+ .build();
|
|
|
+ List<Map> projectMaps = (List<Map>) ydClient.queryData(ydParam2, YDConf.FORM_QUERY.retrieve_search_form).getData();
|
|
|
+ YDParam ydParam3 = YDParam.builder()
|
|
|
+// .formUuid("FORM-84EF78C7DBA047E58A8C8511106F91D5WNVI")
|
|
|
+ .formUuid("FORM-141E21DF183846028E21727CE43CD1C75CLZ")
|
|
|
+ .formDataJson(JSON.toJSONString(formData))
|
|
|
+ .updateFormDataJson(JSON.toJSONString(formData))
|
|
|
+ .build();
|
|
|
+ if (projectMaps.size() > 0) {
|
|
|
+ ydParam3.setFormInstanceId(String.valueOf(projectMaps.get(0).get("formInstanceId")));
|
|
|
+ ydClient.operateData(ydParam3, YDConf.FORM_OPERATION.update);
|
|
|
+ // 保留tb项目号, 避免冲重复通过模板参加项目
|
|
|
+ formData.put("textField_lqxtykce", UtilMap.getMap(projectMaps.get(0), "formData").get("textField_lqxtykce"));
|
|
|
+ } else {
|
|
|
+ String formInstId = (String) ydClient.operateData(ydParam3, YDConf.FORM_OPERATION.create);
|
|
|
+ formData.put("formInstanceId", formInstId);
|
|
|
+ }
|
|
|
+ log.info("同步项目主数据", projectCode);
|
|
|
+ }
|
|
|
+ return formData;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TBConf tbConf;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过模板创建项目 [ppExt: 过滤宜搭项目档案\TB项目, 避免重复创建, 若判定为更新下执行项目成员更新]
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void createProject(String projectCode, String templateId) {
|
|
|
+
|
|
|
+ log.info("通过模板创建项目, {}, {}", projectCode, templateId);
|
|
|
+
|
|
|
+ // 虽然先创建TB, 可以一次性同步项目数据, 但避免执行异常, 因此成功创建TB项目再回写
|
|
|
+ Map formData = syncProject(projectCode);
|
|
|
+ log.info("项目主数据, {}", formData);
|
|
|
+
|
|
|
+ String projectId = UtilMap.getString(formData, "textField_lqxtykce");
|
|
|
+ if (StringUtils.isBlank(projectId)) {
|
|
|
+ // 通过模板创建项目, 创建项目并更新项目TB项目ID
|
|
|
+ Map result = tbClient.projectCreateWithTemplate(projectCode, templateId, tbConf.getOperatorId());
|
|
|
+ projectId = UtilMap.getString(result, "id");
|
|
|
+ ydClient.operateData(YDParam.builder()
|
|
|
+ .formInstanceId(UtilMap.getString(formData, "formInstanceId"))
|
|
|
+ .updateFormDataJson(JSON.toJSONString(UtilMap.map("textField_lqxtykce", projectId)))
|
|
|
+ .build(), YDConf.FORM_OPERATION.update);
|
|
|
+ }
|
|
|
+ // prd TB项目成员, 项目经理设置为管理者
|
|
|
+ List<String> pmUserId = new ArrayList<>();
|
|
|
+ List<String> roleIds = new ArrayList<>();
|
|
|
+ List<Map> details = (List<Map>) formData.get("tableField_lqxtykcf");
|
|
|
+ for (Map row : details) {
|
|
|
+ // 同步项目主数据, 会重新匹配项目成员, 因此无需 employeeField_xxx_id 取值
|
|
|
+ List<String> userIds = (List<String>) UtilMap.getList(row, "employeeField_lqxtykch");
|
|
|
+ if (userIds.isEmpty()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (AWServer.PROJECT_PM_NAME.equals(row.get("selectField_lqxu6bgf"))) {
|
|
|
+ pmUserId.addAll(userIds);
|
|
|
+ }
|
|
|
+ roleIds.addAll(userIds);
|
|
|
+ }
|
|
|
+ // 钉钉人员ID转TB人员ID
|
|
|
+ roleIds = _convertUserId(roleIds, false);
|
|
|
+ tbClient.createProjectMember(projectId, roleIds, tbConf.getOperatorId());
|
|
|
+ // todo 删除项目成员
|
|
|
+
|
|
|
+ // 指定项目经理为编辑权限
|
|
|
+ if (!pmUserId.isEmpty()) {
|
|
|
+ tbClient.updateProjectMember(_convertUserId(pmUserId, false), Arrays.asList(_getProjectRoleId(projectId, AWServer.PROJECT_PM_ROLE)), projectId);
|
|
|
+ }
|
|
|
+ log.info("TB项目信息, {}, {}", projectId, roleIds.size());
|
|
|
+ }
|
|
|
+
|
|
|
+ // todo 提取方法, 并封装为 ...roleName
|
|
|
+ private String _getProjectRoleId(String projectId, String roleName) {
|
|
|
+ List<Map> roles = tbClient.queryProjectRoles(projectId);
|
|
|
+ Optional optional = roles.stream().filter(item -> roleName.equals(item.get("name"))).findAny();
|
|
|
+ McException.assertAccessException(!optional.isPresent(), roleName + ": 项目角色不存在");
|
|
|
+ return UtilMap.getString((Map) optional.get(), "id");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分配项目角色 prd 若是一人直接指定, 多人情况下忽略
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void updateProjectRole(String projectId) {
|
|
|
+
|
|
|
+ // todo 1000递归查询
|
|
|
+ // 项目档案
|
|
|
+// List<Map> pList = ydService.queryDataList_FormData("FORM-84EF78C7DBA047E58A8C8511106F91D5WNVI", UtilMap.map("textField_lqxtykce", projectId));
|
|
|
+ List<Map> pList = ydService.queryDataList_FormData("FORM-141E21DF183846028E21727CE43CD1C75CLZ", UtilMap.map("textField_lqxtykce", projectId));
|
|
|
+ McException.assertAccessException(pList.isEmpty(), "未匹配到项目主数据");
|
|
|
+ List<Map> rList = (List<Map>) pList.get(0).get("tableField_lqxtykcf");
|
|
|
+
|
|
|
+ // 任务编码字段ID
|
|
|
+ List<Map> customField = tbClient.queryProjectCustomField(projectId, null);
|
|
|
+
|
|
|
+ List<Map> taskList = tbClient.queryProjectTaskList(projectId, null);
|
|
|
+ for (Map task : taskList) {
|
|
|
+
|
|
|
+ // 获取资源名称对应的项目角色
|
|
|
+ Optional optional = customField.stream().filter(item -> AWServer.TASK_ROLE.equals(item.get("name"))).findAny();
|
|
|
+ if (!optional.isPresent()) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<Map> customfields = (List<Map>) task.get("customfields");
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ List<String> roleIds = (List<String>) UtilMap.getList((Map) optional.get(), "employeeField_lqxtykch_id");
|
|
|
+ if (roleIds.size() == 1) {
|
|
|
+ tbClient.updateTaskExecutor(UtilMap.getString(task, "id"), tbConf.getOperatorId(), _convertUserId(roleIds.get(0), false), false, false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // TB与宜搭userId转换 todo 提取 tbService
|
|
|
+ private String _convertUserId(String userId, boolean isTBID) {
|
|
|
+ List<Map> tbMap = tbClient.idMapQuery(userId, isTBID);
|
|
|
+ // 过滤未匹配人员信息 [ppExt: TB人员未匹配, 不执行修改也无报错]
|
|
|
+ if (tbMap.isEmpty()) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ if (!isTBID) {
|
|
|
+ return UtilMap.getString(tbMap.get(0), "tbId");
|
|
|
+ } else {
|
|
|
+ Map extra = UtilMap.getMap(tbMap.get(0), "extra");
|
|
|
+ return UtilMap.getString(extra, "userId");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // TB与宜搭userId转换 todo 提取 tbService
|
|
|
+ private List<String> _convertUserId(List<String> userIds, boolean isTBID) {
|
|
|
+ return userIds.stream().distinct()
|
|
|
+ .map(id -> _convertUserId(id, isTBID))
|
|
|
+ .filter(id -> StringUtils.isNotBlank(id))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ }
|
|
|
}
|
|
|
+
|