|
@@ -50,7 +50,7 @@ public class AWImplClient implements AWClint {
|
|
|
formUuid.put("ROLE", "FORM-3C7396A12ADB48A8833EBD90089C93833R21"); // 项目角色
|
|
|
formUuid.put("DOMAIN", "https://yida.awinic.com/"); // 宜搭域名
|
|
|
} else {
|
|
|
- // [ ppExt: 测试环境添加主数据, 匹配不同架构下企业成员 ]
|
|
|
+ // [ fixme: 测试环境添加主数据, 匹配不同架构下企业成员 ]
|
|
|
formUuid.put("REVIEW", "FORM-FBC1A390B4C348089020C763938A6F54RUNY");
|
|
|
formUuid.put("REVIEW_PROCESS", "TPROC--YU966T91PIDH4XDR82OJC8GVOP7Z19PODTXQL6");
|
|
|
formUuid.put("PROJECT", "FORM-84EF78C7DBA047E58A8C8511106F91D5WNVI");
|
|
@@ -69,12 +69,12 @@ public class AWImplClient implements AWClint {
|
|
|
@Override
|
|
|
public void doApprove(Map data) {
|
|
|
|
|
|
- log.info("交付物审批, {}", data);
|
|
|
String projectId = UtilMap.getString(data, "projectId");
|
|
|
String workFlowApprove = _getWorkFlowStatus(projectId, AWServer.WORKFLOW_APPROVE);
|
|
|
if (!data.get("tfsId").equals(workFlowApprove)) {
|
|
|
return;
|
|
|
}
|
|
|
+ log.info("交付物审批, {}", data);
|
|
|
String pCode = UtilMap.getString(data, "projectId");
|
|
|
String creatorId = UtilMap.getString(data, "creatorId");
|
|
|
String taskId = UtilMap.getString(data, "taskId");
|
|
@@ -258,19 +258,22 @@ public class AWImplClient implements AWClint {
|
|
|
|
|
|
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 rTask = UtilMap.getMap(taskData, "task");
|
|
|
+ String pCode = UtilMap.getString(rTask, "projectId");
|
|
|
+ if (AWServer.PROJECT_IGNORE_ID.contains(pCode)) {
|
|
|
+ return UtilMap.map("result", "模板/复用项目");
|
|
|
+ }
|
|
|
String checkLink = UtilMap.getString(taskData, AWServer.TASK_CHECK_LINK);
|
|
|
/// prd 预检项持续维护需要重新匹配, 任务号和主数据判定为非法, 无需重新刷新
|
|
|
if (isTask && (StringUtils.isNotBlank(checkLink) && !"未配置预检项".equals(checkLink))) {
|
|
|
return UtilMap.map("result", "链接已加载");
|
|
|
}
|
|
|
// prd 非未完成任务若是未配置预检项状态, 忽略更新
|
|
|
- Map rTask = UtilMap.getMap(taskData, "task");
|
|
|
- if (isTask && !_getWorkFlowStatusList(UtilMap.getString(rTask, "projectId"), AWServer.WORKFLOW_INITIAL).contains(rTask.get("tfsId"))) {
|
|
|
+ if (isTask && !_getWorkFlowStatusList(pCode, AWServer.WORKFLOW_INITIAL).contains(rTask.get("tfsId"))) {
|
|
|
return UtilMap.map("result", "任务已执行");
|
|
|
}
|
|
|
String creatorId = UtilMap.getString(rTask, "creatorId");
|
|
|
String tCode = UtilMap.getString(taskData, AWServer.TASK_CODE);
|
|
|
- String pCode = UtilMap.getString(rTask, "projectId");
|
|
|
|
|
|
String result = "";
|
|
|
List<Map> tList = null;
|
|
@@ -384,17 +387,23 @@ public class AWImplClient implements AWClint {
|
|
|
formData.put("textField_ltsdsti7", baseFormData.get("textField_llouhiyf")); // 项目状态
|
|
|
formData.put("textField_ltsdsti8", baseFormData.get("textField_lo2c1f0r")); // mPDT
|
|
|
formData.put("textField_ltsdsti9", baseFormData.get("textField_lki3egzn")); // Charter子类
|
|
|
+ formData.put("textField_ltwcq7s5", baseFormData.get("textField_lki3egzm")); // Charter
|
|
|
+ formData.put("textField_ltwcq7s6", baseFormData.get("textField_lnjqpeie")); // 项目类型 (TB项目模板)
|
|
|
// 项目角色详情
|
|
|
List<Map> details = new ArrayList<>();
|
|
|
- mapRool.forEach(root -> {
|
|
|
+ for (Map root : mapRool) {
|
|
|
Map rootFormData = (Map) root.get("formData");
|
|
|
// 创建详情的角色名称和成员组件Map
|
|
|
Object rootItems = baseFormData.get(rootFormData.get("textField_lr7bgi76"));
|
|
|
Object projectRoot = rootFormData.get("textField_lqxu439g");
|
|
|
if (rootItems != null && projectRoot != null) {
|
|
|
details.add(UtilMap.map("employeeField_lqxtykch, selectField_lqxu6bgf", rootItems, projectRoot));
|
|
|
+ // prd 添加项目经理, 用于数据权限控制
|
|
|
+ if (AWServer.PROJECT_PM_NAME.equals(projectRoot)) {
|
|
|
+ formData.put("employeeField_ltzn872j", rootItems);
|
|
|
+ }
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
formData.put("tableField_lqxtykcf", details);
|
|
|
// 通过项目号获取项目是否已存在
|
|
|
List<Map> projectMaps = ydService.queryDataList_FormData(_matchFormUuid("PROJECT"), UtilMap.map("textField_lrj7vnxb", baseFormData.get("textField_le6o88w0")));
|
|
@@ -415,7 +424,7 @@ public class AWImplClient implements AWClint {
|
|
|
String formInstId = (String) ydClient.operateData(ydParam2, YDConf.FORM_OPERATION.create);
|
|
|
formData.put("formInstanceId", formInstId);
|
|
|
}
|
|
|
- // tb项目成员更新 [兼容存量创建项目, 被删除后执行异常]
|
|
|
+ // 全量兼容: tb项目成员更新 [兼容存量创建项目, 被删除后执行异常]
|
|
|
String projectId = UtilMap.getString(formData, "textField_lqxtykce");
|
|
|
if (StringUtils.isNotBlank(projectId) && StringUtils.isBlank(projectCode)) {
|
|
|
try {
|
|
@@ -444,9 +453,8 @@ public class AWImplClient implements AWClint {
|
|
|
|
|
|
// 虽然先创建TB, 可以一次性同步项目数据, 但避免执行异常, 因此成功创建TB项目再回写
|
|
|
Map formData = syncProject(projectCode);
|
|
|
- log.info("项目主数据, {}", formData);
|
|
|
-
|
|
|
String projectId = UtilMap.getString(formData, "textField_lqxtykce");
|
|
|
+ log.info("项目主数据, {}, {}", projectId, formData);
|
|
|
if (StringUtils.isBlank(projectId)) {
|
|
|
// 通过模板创建项目, 创建项目并更新项目TB项目ID
|
|
|
Map result = tbClient.projectCreateWithTemplate(projectCode, templateId, tbConf.getOperatorId());
|
|
@@ -459,11 +467,31 @@ public class AWImplClient implements AWClint {
|
|
|
_syncProjectRole(formData, projectId);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 项目主数据增量更新
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void updateProject(String projectCode) {
|
|
|
+ Map formData = syncProject(projectCode);
|
|
|
+ log.info("项目主数据增量更新, {}", formData);
|
|
|
+ String projectId = UtilMap.getString(formData, "textField_lqxtykce");
|
|
|
+ if (StringUtils.isNotBlank(projectId)) { // 屏蔽未创建项目, 出现新增
|
|
|
+ _syncProjectRole(formData, projectId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// 同步TB项目成员/项目分组 todo 群成员
|
|
|
void _syncProjectRole(Map formData, String projectId) {
|
|
|
+
|
|
|
// prd TB项目成员, 项目经理设置为管理者
|
|
|
List<String> pmUserId = new ArrayList<>();
|
|
|
List<String> roleIds = new ArrayList<>();
|
|
|
+ List<String> representativeIds = new ArrayList<>();
|
|
|
+
|
|
|
+ String representative = _getProjectRoleId(projectId, "项目各代表");
|
|
|
+ String pmRoleId = _getProjectRoleId(projectId, AWServer.PROJECT_PM_ROLE);
|
|
|
+ String staffRoleId = _getProjectRoleId(projectId, "项目成员");
|
|
|
+
|
|
|
List<Map> details = (List<Map>) formData.get("tableField_lqxtykcf");
|
|
|
for (Map row : details) {
|
|
|
// 同步项目主数据, 会重新匹配项目成员, 因此无需 employeeField_xxx_id 取值
|
|
@@ -471,23 +499,29 @@ public class AWImplClient implements AWClint {
|
|
|
if (userIds.isEmpty()) {
|
|
|
continue;
|
|
|
}
|
|
|
- if (AWServer.PROJECT_PM_NAME.equals(row.get("selectField_lqxu6bgf"))) {
|
|
|
+ String roleName = UtilMap.getString(row, "selectField_lqxu6bgf");
|
|
|
+ if (AWServer.PROJECT_PM_NAME.equals(roleName)) {
|
|
|
pmUserId.addAll(userIds);
|
|
|
}
|
|
|
+ // prd 项目各代表, 可独立N/A任务, 添加角色控制权限
|
|
|
+ if (roleName.endsWith("代表")) {
|
|
|
+ representativeIds.addAll(userIds);
|
|
|
+ }
|
|
|
roleIds.addAll(userIds);
|
|
|
}
|
|
|
// 钉钉人员ID转TB人员ID
|
|
|
roleIds = _convertUserId(roleIds, false);
|
|
|
tbClient.createProjectMember(projectId, roleIds, tbConf.getOperatorId());
|
|
|
-
|
|
|
+ if (!representativeIds.isEmpty()) {
|
|
|
+ tbClient.updateProjectMember(_convertUserId(representativeIds, false), Arrays.asList(staffRoleId, representative), projectId);
|
|
|
+ }
|
|
|
// prd 不做删除, 离职自动退出, 避免临时交接不可见的问题. 但需要移除项目经理权限
|
|
|
- String pmRoleId = _getProjectRoleId(projectId, AWServer.PROJECT_PM_ROLE);
|
|
|
List<Map> roleList = tbClient.queryProjectMember(projectId, UtilMap.map("projectRoleId", pmRoleId));
|
|
|
for (Map role : roleList) {
|
|
|
List<String> tRoleIds = UtilMap.getList(role, "roleIds");
|
|
|
tRoleIds.remove(pmRoleId);
|
|
|
if (tRoleIds.isEmpty()) {
|
|
|
- tRoleIds.add(_getProjectRoleId(projectId, "项目成员")); // 极少情况, 无需冗余
|
|
|
+ tRoleIds.add(staffRoleId);
|
|
|
}
|
|
|
tbClient.updateProjectMember(Arrays.asList(UtilMap.getString(role, "userId")), tRoleIds, projectId);
|
|
|
}
|
|
@@ -500,7 +534,7 @@ public class AWImplClient implements AWClint {
|
|
|
if (StringUtils.isNotBlank(groupName)) {
|
|
|
List<Map> tagList = tbClient.queryTagList(UtilMap.map("q", groupName));
|
|
|
if (tagList.size() > 0) {
|
|
|
- tbClient.updateProjectTag(projectId, Arrays.asList(UtilMap.getString(tagList.get(0), "id")), tbConf.getOperatorId());
|
|
|
+ tbClient.updateProjectTag(projectId, Arrays.asList(UtilMap.getString(tagList.get(0), "id"), staffRoleId), tbConf.getOperatorId());
|
|
|
}
|
|
|
}
|
|
|
log.info("TB项目信息, {}, {}", projectId, roleIds.size());
|
|
@@ -550,11 +584,19 @@ public class AWImplClient implements AWClint {
|
|
|
if (!optional2.isPresent()) {
|
|
|
continue;
|
|
|
}
|
|
|
+
|
|
|
+ // prd 传递无TR评审节点值, 匹配空值, 作为分配条件
|
|
|
String trName = TBConf.getTaskFieldValue_First(customfields, UtilMap.getString((Map) optional2.get(), "id"));
|
|
|
- if (!trNode.contains(trName)) {
|
|
|
- continue;
|
|
|
+ if (StringUtils.isBlank(trName)) {
|
|
|
+ if (!trNode.contains(AWServer.TASK_STAGE_BLANK)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (!trNode.contains(trName)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
}
|
|
|
- log.info("trName = {}", trName);
|
|
|
+ log.info("tr节点控制, {}, {}", trName, trNode);
|
|
|
}
|
|
|
String roleName = TBConf.getTaskFieldValue_First(customfields, UtilMap.getString((Map) optional.get(), "id"));
|
|
|
// 获取角色在项目主数据对应成员
|
|
@@ -562,7 +604,7 @@ public class AWImplClient implements AWClint {
|
|
|
if (!optional.isPresent()) {
|
|
|
continue;
|
|
|
}
|
|
|
- log.info("分配项目角色 taskId = {}, trNode = {}, 资源名称 = {}, 项目角色 = {}", UtilMap.getString(task, "id"), roleName, optional.get());
|
|
|
+ log.info("分配项目角色 taskId = {}, 资源名称 = {}, 角色信息 = {}", 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);
|
|
@@ -593,7 +635,8 @@ public class AWImplClient implements AWClint {
|
|
|
}
|
|
|
List<Map> customfields = (List<Map>) task.get("customfields");
|
|
|
String trName = TBConf.getTaskFieldValue_First(customfields, UtilMap.getString((Map) optional.get(), "id"));
|
|
|
- if (trNode.contains(trName)) {
|
|
|
+ // prd 传递无TR评审节点值, 匹配空值, 作为删除条件
|
|
|
+ if (trNode.contains(trName) || (StringUtils.isBlank(trName) && trNode.contains(AWServer.TASK_STAGE_BLANK))) {
|
|
|
String taskId = UtilMap.getString(task, "id");
|
|
|
List<Map> dependencies = tbClient.queryTaskDependency(taskId, null);
|
|
|
log.info("taskID = {}, trNode, {}, 依赖数量: {}", taskId, trName, dependencies.size());
|
|
@@ -645,6 +688,7 @@ public class AWImplClient implements AWClint {
|
|
|
.formUuid(curFormUuid)
|
|
|
.searchFieldJson(JSON.toJSONString(UtilMap.map("selectField_lrnd3h0s", checkType)))
|
|
|
.build());
|
|
|
+ log.info("全量同步 ##, srcList = {}, curList = {}", srcList.size(), curList.size());
|
|
|
|
|
|
for (Map item : srcList) {
|
|
|
if (StringUtils.isBlank(UtilMap.getString(item, taskCompId))) {
|
|
@@ -680,6 +724,7 @@ public class AWImplClient implements AWClint {
|
|
|
@Override
|
|
|
public void syncCheckList(int type) {
|
|
|
|
|
|
+ log.info("## 同步预检项, {}", type);
|
|
|
switch (type) {
|
|
|
case 0:
|
|
|
// 经验库
|
|
@@ -688,8 +733,8 @@ public class AWImplClient implements AWClint {
|
|
|
.systemToken("6J8668A1B59FA7SAFTAF89PTKKGP2HY3FP3OLV1")
|
|
|
.formUuid("FORM-D47CCA076DA54F969DF7442D81E4B5A8PC6Q")
|
|
|
.build();
|
|
|
- // 任务号, 描述, ID(标题)
|
|
|
- Map<String, ?> compIds1 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r", "selectField_ls9yctsd", "textareaField_lo5eakcv", "serialNumberField_lo5dmyfb");
|
|
|
+ // 任务号, 描述, ID(标题), 任务名称, 适用项目类型
|
|
|
+ Map<String, ?> compIds1 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r, textField_ltzl9mpc, multiSelectField_ltwjre9s", "selectField_ls9yctsd, textareaField_lo5eakcv, serialNumberField_lo5dmyfb, textField_ls9xvxvk, multiSelectField_ltwjre9s");
|
|
|
syncCheckList(ydParam1, compIds1, "selectField_ls9yctsd", "serialNumberField_lo5dmyfb", "经验库", "associationFormField_lrrn5csf");
|
|
|
break;
|
|
|
|
|
@@ -700,8 +745,8 @@ public class AWImplClient implements AWClint {
|
|
|
.systemToken("UM6660D1BFTFLFAP7NPJDBJEEAB737FAR1SOLD4")
|
|
|
.formUuid("FORM-B40420AFCDB84AD69FE78D82D6D5CFD2C2D2")
|
|
|
.build();
|
|
|
- // 任务号, 描述, ID(标题)
|
|
|
- Map<String, ?> compIds2 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r", "selectField_bclg9y5", "textField_k1e08ji", "textField_96ikaoh");
|
|
|
+ // 任务号, 描述, ID(标题), 任务名称, 适用项目类型
|
|
|
+ Map<String, ?> compIds2 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r, textField_ltzl9mpc, multiSelectField_ltwjre9s", "selectField_bclg9y5, textField_k1e08ji, textField_96ikaoh, textField_lsa0d856, multiSelectField_ltwjre9s");
|
|
|
syncCheckList(ydParam2, compIds2, "selectField_bclg9y5", "textField_96ikaoh", "技术评审要素表", "associationFormField_lrrn5csg");
|
|
|
break;
|
|
|
|
|
@@ -710,11 +755,12 @@ public class AWImplClient implements AWClint {
|
|
|
YDParam ydParam3 = YDParam.builder()
|
|
|
.formUuid("FORM-5436DC75BC8347D498DFF2617925BA70O066")
|
|
|
.build();
|
|
|
- // 任务号, 描述, ID(标题), 验收标准, 等级
|
|
|
- Map<String, ?> compIds3 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r, textField_cd4f65l, textField_267kho2", "selectField_4gwjfa5, textField_lryetn3g, textField_9x1yps6, textField_cd4f65l, textField_267kho2");
|
|
|
+ // 任务号, 描述, ID(标题), 验收标准, 等级, 任务名称, 适用项目类型
|
|
|
+ Map<String, ?> compIds3 = UtilMap.map("selectField_lrncf4hk, textField_lrrnqz7w, textField_lrnd3h0r, textField_cd4f65l, textField_267kho2, textField_ltzl9mpc, multiSelectField_ltwjre9s", "selectField_4gwjfa5, textField_lryetn3g, textField_9x1yps6, textField_cd4f65l, textField_267kho2, textField_ls9xvxvk, multiSelectField_ltwjre9s");
|
|
|
syncCheckList(ydParam3, compIds3, "selectField_4gwjfa5", "textField_9x1yps6", "TR评审要素表", "associationFormField_lrrn5csa");
|
|
|
break;
|
|
|
}
|
|
|
+ log.info("同步预检项 ##, {}", type);
|
|
|
}
|
|
|
|
|
|
@Override
|