|
|
@@ -37,6 +37,15 @@ public class MingleiDocumentServiceImpl implements MingleiDocumentService {
|
|
|
private static final String THIRD_LEVEL_DEPARTMENT_MANAGER_FIELD_ID = "employeeField_mszdqrla";
|
|
|
private static final String FOURTH_LEVEL_DEPARTMENT_MANAGER_FIELD_ID = "employeeField_mszdqrlb";
|
|
|
private static final String DEPARTMENT_LEADER_FIELD_ID = "employeeField_mszdqrl3";
|
|
|
+ /**
|
|
|
+ * 审批矩阵表单中"部门"选择字段 ID,其存储值的 {@code _id} 即钉钉部门 ID。
|
|
|
+ * 审批矩阵按此字段精确匹配转入部门,替代原先的"部门编号"文本字段。
|
|
|
+ */
|
|
|
+ private static final String DEPARTMENT_FIELD_ID = "departmentSelectField_mszdqrks";
|
|
|
+ /**
|
|
|
+ * 审批矩阵表单中"部门负责人"成员字段 ID(宜搭线上表单新增字段)。
|
|
|
+ */
|
|
|
+ private static final String DEPARTMENT_HEAD_FIELD_ID = "employeeField_mualkf6a";
|
|
|
private static final String[] DEPARTMENT_MANAGER_FIELD_IDS = {
|
|
|
FIRST_LEVEL_DEPARTMENT_MANAGER_FIELD_ID,
|
|
|
SECOND_LEVEL_DEPARTMENT_MANAGER_FIELD_ID,
|
|
|
@@ -119,6 +128,27 @@ public class MingleiDocumentServiceImpl implements MingleiDocumentService {
|
|
|
throw new IllegalArgumentException("One of dept_id, user_id or dept_name must be provided");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 按"部门"选择字段中内嵌的部门 ID 精确查询审批矩阵,返回各级别负责人 userid。
|
|
|
+ *
|
|
|
+ * <p>与 {@link #queryDocuments(MingleiDocumentQueryRequest)} 的区别在于:本方法按部门选择字段
|
|
|
+ * {@code departmentSelectField_mszdqrks}(其 {@code _id} 为钉钉部门 ID)匹配,而非按"部门编号"文本字段;
|
|
|
+ * 并且返回的结果额外包含"部门负责人"字段,以语义化 key 暴露,解耦调用方与具体字段 ID。
|
|
|
+ *
|
|
|
+ * @param departmentId 钉钉部门 ID,与审批矩阵"部门"字段的 {@code _id} 精确匹配
|
|
|
+ * @return 仅包含一级至四级部门负责人、部门负责人和部门分管领导的单层结果
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> queryDepartmentManagersByDepartmentId(String departmentId) {
|
|
|
+ String normalizedDepartmentId = trimToNull(departmentId);
|
|
|
+ if (normalizedDepartmentId == null) {
|
|
|
+ throw new IllegalArgumentException("departmentId must not be blank");
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> queryResult = executeQuery(DEPARTMENT_FIELD_ID, normalizedDepartmentId, 1, PRECISE_QUERY_PAGE_SIZE, true);
|
|
|
+ return extractApprovalTransferManagers(queryResult);
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 按查询范围读取部门成员 ID,并按成员首次出现顺序去重。
|
|
|
*
|
|
|
@@ -180,6 +210,10 @@ public class MingleiDocumentServiceImpl implements MingleiDocumentService {
|
|
|
}
|
|
|
|
|
|
private Map<String, Object> executeQuery(String fieldId, String fieldValue, int page, int size) {
|
|
|
+ return executeQuery(fieldId, fieldValue, page, size, false);
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<String, Object> executeQuery(String fieldId, String fieldValue, int page, int size, boolean departmentField) {
|
|
|
validateConfiguration();
|
|
|
|
|
|
YDParam parameter = new YDParam();
|
|
|
@@ -189,7 +223,9 @@ public class MingleiDocumentServiceImpl implements MingleiDocumentService {
|
|
|
parameter.setCurrentPage(page);
|
|
|
parameter.setPageSize(size);
|
|
|
if (fieldId != null) {
|
|
|
- parameter.setSearchFieldJson(createExactSearchFieldJson(fieldId, fieldValue));
|
|
|
+ parameter.setSearchFieldJson(departmentField
|
|
|
+ ? createDepartmentSearchFieldJson(fieldId, fieldValue)
|
|
|
+ : createExactSearchFieldJson(fieldId, fieldValue));
|
|
|
}
|
|
|
|
|
|
DDR_New response = yidaClient.queryData(parameter, YDConf.FORM_QUERY.retrieve_search_form);
|
|
|
@@ -231,6 +267,31 @@ public class MingleiDocumentServiceImpl implements MingleiDocumentService {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 从精准查询命中的首条单据提取审批转入所需的各级别负责人,并以语义化 key 暴露。
|
|
|
+ *
|
|
|
+ * <p>相较 {@link #extractDepartmentManagers(Map)},本方法额外提取"部门负责人"字段,且不直接返回
|
|
|
+ * 宜搭字段 ID,避免调用方硬编码字段 ID 而产生漂移。
|
|
|
+ *
|
|
|
+ * @param queryResult 宜搭列表查询结果
|
|
|
+ * @return 包含一级至四级部门负责人、部门负责人和部门分管领导的语义化结果
|
|
|
+ */
|
|
|
+ private Map<String, Object> extractApprovalTransferManagers(Map<String, Object> queryResult) {
|
|
|
+ Map formData = firstFormData(queryResult.get("records"));
|
|
|
+ if (formData == null) {
|
|
|
+ return Collections.emptyMap();
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> result = new LinkedHashMap<String, Object>();
|
|
|
+ result.put("firstLevelManagerUserId", firstEmployeeUserId(formData.get(FIRST_LEVEL_DEPARTMENT_MANAGER_FIELD_ID + "_id")));
|
|
|
+ result.put("secondLevelManagerUserId", firstEmployeeUserId(formData.get(SECOND_LEVEL_DEPARTMENT_MANAGER_FIELD_ID + "_id")));
|
|
|
+ result.put("thirdLevelManagerUserId", firstEmployeeUserId(formData.get(THIRD_LEVEL_DEPARTMENT_MANAGER_FIELD_ID + "_id")));
|
|
|
+ result.put("fourthLevelManagerUserId", firstEmployeeUserId(formData.get(FOURTH_LEVEL_DEPARTMENT_MANAGER_FIELD_ID + "_id")));
|
|
|
+ result.put("departmentHeadUserId", firstEmployeeUserId(formData.get(DEPARTMENT_HEAD_FIELD_ID + "_id")));
|
|
|
+ result.put("departmentLeaderUserId", firstEmployeeUserId(formData.get(DEPARTMENT_LEADER_FIELD_ID + "_id")));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
private Map firstFormData(Object records) {
|
|
|
if (!(records instanceof Iterable)) {
|
|
|
return null;
|
|
|
@@ -329,6 +390,30 @@ public class MingleiDocumentServiceImpl implements MingleiDocumentService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 按宜搭部门选择字段(DepartmentSelectField)的等值查询格式生成 searchFieldJson。
|
|
|
+ *
|
|
|
+ * <p>部门字段存储为 {@code [{"_id":"部门ID","label":"部门名"}]},需以部门 ID 作为 value,
|
|
|
+ * 并使用 {@code DepartmentSelectField} 组件类型;沿用报表字段配置约定 {@code dataType=STRING}。
|
|
|
+ *
|
|
|
+ * @param fieldId 宜搭部门字段 ID
|
|
|
+ * @param value 需要精确匹配的部门 ID
|
|
|
+ * @return 宜搭搜索条件 JSON
|
|
|
+ */
|
|
|
+ private String createDepartmentSearchFieldJson(String fieldId, String value) {
|
|
|
+ Map<String, String> condition = new LinkedHashMap<String, String>();
|
|
|
+ condition.put("key", fieldId);
|
|
|
+ condition.put("value", value);
|
|
|
+ condition.put("type", "STRING");
|
|
|
+ condition.put("operator", "eq");
|
|
|
+ condition.put("componentName", "DepartmentSelectField");
|
|
|
+ try {
|
|
|
+ return objectMapper.writeValueAsString(Collections.singletonList(condition));
|
|
|
+ } catch (JsonProcessingException exception) {
|
|
|
+ throw new IllegalStateException("Unable to create Yida department search condition", exception);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private String firstDepartmentId(Object departmentIds) {
|
|
|
if (departmentIds instanceof Iterable) {
|
|
|
for (Object departmentId : (Iterable<?>) departmentIds) {
|