weaver-e10-builder 1.2.5 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/assets/org-employee-template.xlsx +0 -0
  2. package/dist/commands/form-button.d.ts.map +1 -1
  3. package/dist/commands/form-button.js +28 -5
  4. package/dist/commands/form-button.js.map +1 -1
  5. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  6. package/dist/commands/form-field-linkage.js +27 -6
  7. package/dist/commands/form-field-linkage.js.map +1 -1
  8. package/dist/commands/form-formula-linkage.d.ts +3 -0
  9. package/dist/commands/form-formula-linkage.d.ts.map +1 -0
  10. package/dist/commands/form-formula-linkage.js +434 -0
  11. package/dist/commands/form-formula-linkage.js.map +1 -0
  12. package/dist/commands/form-formula.d.ts.map +1 -1
  13. package/dist/commands/form-formula.js +22 -3
  14. package/dist/commands/form-formula.js.map +1 -1
  15. package/dist/commands/form-list-click.d.ts.map +1 -1
  16. package/dist/commands/form-list-click.js +2 -1
  17. package/dist/commands/form-list-click.js.map +1 -1
  18. package/dist/commands/form-native.d.ts.map +1 -1
  19. package/dist/commands/form-native.js +11 -3
  20. package/dist/commands/form-native.js.map +1 -1
  21. package/dist/commands/form.d.ts.map +1 -1
  22. package/dist/commands/form.js +247 -173
  23. package/dist/commands/form.js.map +1 -1
  24. package/dist/commands/matrix.d.ts.map +1 -1
  25. package/dist/commands/matrix.js +175 -36
  26. package/dist/commands/matrix.js.map +1 -1
  27. package/dist/commands/org.d.ts +10 -0
  28. package/dist/commands/org.d.ts.map +1 -0
  29. package/dist/commands/org.js +278 -0
  30. package/dist/commands/org.js.map +1 -0
  31. package/dist/commands/role.d.ts.map +1 -1
  32. package/dist/commands/role.js +106 -62
  33. package/dist/commands/role.js.map +1 -1
  34. package/dist/commands/wf-form.d.ts.map +1 -1
  35. package/dist/commands/wf-form.js +501 -26
  36. package/dist/commands/wf-form.js.map +1 -1
  37. package/dist/commands/workflow-auth-resp.d.ts.map +1 -1
  38. package/dist/commands/workflow-auth-resp.js +53 -5
  39. package/dist/commands/workflow-auth-resp.js.map +1 -1
  40. package/dist/commands/workflow-create-auth-resp.d.ts.map +1 -1
  41. package/dist/commands/workflow-create-auth-resp.js +5 -1
  42. package/dist/commands/workflow-create-auth-resp.js.map +1 -1
  43. package/dist/commands/workflow.d.ts.map +1 -1
  44. package/dist/commands/workflow.js +78 -9
  45. package/dist/commands/workflow.js.map +1 -1
  46. package/dist/index.js +4 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/services/action-detail.d.ts.map +1 -1
  49. package/dist/services/action-detail.js +5 -4
  50. package/dist/services/action-detail.js.map +1 -1
  51. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  52. package/dist/services/actionflow/components/action_eb_update_compiler.js +22 -7
  53. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  54. package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
  55. package/dist/services/actionflow/components/approve_create.js +6 -3
  56. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  57. package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -1
  58. package/dist/services/actionflow/components/custom_set_form.js +35 -1
  59. package/dist/services/actionflow/components/custom_set_form.js.map +1 -1
  60. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
  61. package/dist/services/actionflow/components/custom_trigger.js +4 -1
  62. package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
  63. package/dist/services/actionflow/components/dml_execute.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/dml_execute.js +7 -3
  65. package/dist/services/actionflow/components/dml_execute.js.map +1 -1
  66. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  67. package/dist/services/actionflow/components/document_actions.js +7 -3
  68. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  69. package/dist/services/actionflow/components/hrm_actions.d.ts.map +1 -1
  70. package/dist/services/actionflow/components/hrm_actions.js +7 -3
  71. package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
  72. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  73. package/dist/services/actionflow/components/multiple_execution.js +14 -5
  74. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  75. package/dist/services/actionflow/components/output.js +1 -1
  76. package/dist/services/actionflow/components/output.js.map +1 -1
  77. package/dist/services/actionflow/components/send_message.js +2 -2
  78. package/dist/services/actionflow/components/send_message.js.map +1 -1
  79. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  80. package/dist/services/actionflow/components/workflow_actions.js +7 -3
  81. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  82. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  83. package/dist/services/actionflow/context_preflight.js +12 -2
  84. package/dist/services/actionflow/context_preflight.js.map +1 -1
  85. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  86. package/dist/services/actionflow/context_provider.js +21 -2
  87. package/dist/services/actionflow/context_provider.js.map +1 -1
  88. package/dist/services/actionflow/custom_trigger_context.d.ts +10 -0
  89. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -0
  90. package/dist/services/actionflow/custom_trigger_context.js +46 -0
  91. package/dist/services/actionflow/custom_trigger_context.js.map +1 -0
  92. package/dist/services/actionflow/filter_rules.js +2 -2
  93. package/dist/services/actionflow/filter_rules.js.map +1 -1
  94. package/dist/services/actionflow/formula_service.d.ts +9 -1
  95. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  96. package/dist/services/actionflow/formula_service.js +59 -21
  97. package/dist/services/actionflow/formula_service.js.map +1 -1
  98. package/dist/services/actionflow/id_generator.d.ts +2 -0
  99. package/dist/services/actionflow/id_generator.d.ts.map +1 -1
  100. package/dist/services/actionflow/id_generator.js +13 -0
  101. package/dist/services/actionflow/id_generator.js.map +1 -1
  102. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  103. package/dist/services/actionflow/preflight_service.js +6 -1
  104. package/dist/services/actionflow/preflight_service.js.map +1 -1
  105. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  106. package/dist/services/actionflow/workflow_compiler.js +89 -35
  107. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  108. package/dist/services/auth-resp-condition.d.ts +35 -0
  109. package/dist/services/auth-resp-condition.d.ts.map +1 -0
  110. package/dist/services/auth-resp-condition.js +111 -0
  111. package/dist/services/auth-resp-condition.js.map +1 -0
  112. package/dist/services/condition-rules.d.ts.map +1 -1
  113. package/dist/services/condition-rules.js +4 -1
  114. package/dist/services/condition-rules.js.map +1 -1
  115. package/dist/services/esb-interface/document-parser.d.ts.map +1 -1
  116. package/dist/services/esb-interface/document-parser.js +62 -5
  117. package/dist/services/esb-interface/document-parser.js.map +1 -1
  118. package/dist/services/form-association.d.ts +19 -0
  119. package/dist/services/form-association.d.ts.map +1 -1
  120. package/dist/services/form-association.js +64 -0
  121. package/dist/services/form-association.js.map +1 -1
  122. package/dist/services/form-button-action.d.ts +7 -0
  123. package/dist/services/form-button-action.d.ts.map +1 -1
  124. package/dist/services/form-button-action.js +11 -1
  125. package/dist/services/form-button-action.js.map +1 -1
  126. package/dist/services/form-create.d.ts +4 -0
  127. package/dist/services/form-create.d.ts.map +1 -1
  128. package/dist/services/form-create.js +18 -12
  129. package/dist/services/form-create.js.map +1 -1
  130. package/dist/services/form-field-patch.d.ts +3 -1
  131. package/dist/services/form-field-patch.d.ts.map +1 -1
  132. package/dist/services/form-field-patch.js +23 -9
  133. package/dist/services/form-field-patch.js.map +1 -1
  134. package/dist/services/form-formula-linkage.d.ts +349 -0
  135. package/dist/services/form-formula-linkage.d.ts.map +1 -0
  136. package/dist/services/form-formula-linkage.js +546 -0
  137. package/dist/services/form-formula-linkage.js.map +1 -0
  138. package/dist/services/form-layout-insert.d.ts +84 -0
  139. package/dist/services/form-layout-insert.d.ts.map +1 -0
  140. package/dist/services/form-layout-insert.js +244 -0
  141. package/dist/services/form-layout-insert.js.map +1 -0
  142. package/dist/services/form-linkage-condition.d.ts +159 -0
  143. package/dist/services/form-linkage-condition.d.ts.map +1 -0
  144. package/dist/services/form-linkage-condition.js +307 -0
  145. package/dist/services/form-linkage-condition.js.map +1 -0
  146. package/dist/services/formula-detail.d.ts +98 -6
  147. package/dist/services/formula-detail.d.ts.map +1 -1
  148. package/dist/services/formula-detail.js +208 -26
  149. package/dist/services/formula-detail.js.map +1 -1
  150. package/dist/services/matrix-rows.d.ts +43 -0
  151. package/dist/services/matrix-rows.d.ts.map +1 -0
  152. package/dist/services/matrix-rows.js +104 -0
  153. package/dist/services/matrix-rows.js.map +1 -0
  154. package/dist/services/org-department.d.ts +114 -0
  155. package/dist/services/org-department.d.ts.map +1 -0
  156. package/dist/services/org-department.js +209 -0
  157. package/dist/services/org-department.js.map +1 -0
  158. package/dist/services/org-employee.d.ts +87 -0
  159. package/dist/services/org-employee.d.ts.map +1 -0
  160. package/dist/services/org-employee.js +219 -0
  161. package/dist/services/org-employee.js.map +1 -0
  162. package/dist/services/role-member.d.ts +99 -0
  163. package/dist/services/role-member.d.ts.map +1 -0
  164. package/dist/services/role-member.js +206 -0
  165. package/dist/services/role-member.js.map +1 -0
  166. package/dist/services/workflow-info.d.ts +83 -0
  167. package/dist/services/workflow-info.d.ts.map +1 -0
  168. package/dist/services/workflow-info.js +97 -0
  169. package/dist/services/workflow-info.js.map +1 -0
  170. package/dist/services/workflow-odoc-setting.d.ts +1 -1
  171. package/dist/services/workflow-odoc-setting.d.ts.map +1 -1
  172. package/dist/services/workflow-odoc-setting.js +15 -6
  173. package/dist/services/workflow-odoc-setting.js.map +1 -1
  174. package/dist/utils/column-name.d.ts +24 -0
  175. package/dist/utils/column-name.d.ts.map +1 -1
  176. package/dist/utils/column-name.js +16 -0
  177. package/dist/utils/column-name.js.map +1 -1
  178. package/ecodecmd/package.json +1 -2
  179. package/ecodecmd/src/loaddep.js +19 -9
  180. package/package.json +4 -4
  181. package/skill-docs/SKILL.md +13 -9
  182. package/skill-docs/_catalog.md +85 -81
  183. package/skill-docs/actionflows/SKILL.md +173 -170
  184. package/skill-docs/actionflows/references/components/logic/Output.md +1 -1
  185. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +32 -0
  186. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
  187. package/skill-docs/references/common/guide-plan-template.md +9 -3
  188. package/skill-docs/references/common/ref-cli-commands.md +47 -22
  189. package/skill-docs/references/esb-interface/guide-import.md +4 -1
  190. package/skill-docs/references/form/guide-create-form.md +13 -0
  191. package/skill-docs/references/form/guide-field-linkage.md +2 -0
  192. package/skill-docs/references/form/guide-form-formula-functions.md +36 -0
  193. package/skill-docs/references/form/guide-form-layout-incremental.md +75 -0
  194. package/skill-docs/references/form/guide-form-linkage.md +61 -3
  195. package/skill-docs/references/form/guide-formula-linkage.md +250 -0
  196. package/skill-docs/references/form/ref-form-fields.md +6 -0
  197. package/skill-docs/references/hrm/guide-matrix.md +79 -16
  198. package/skill-docs/references/hrm/guide-org-employee.md +56 -0
  199. package/skill-docs/references/workflow/guide-workflow-auth-resp.md +48 -22
  200. package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +248 -0
  201. package/skill-docs/references/workflow/guide-workflow-odoc.md +23 -51
@@ -0,0 +1,209 @@
1
+ /**
2
+ * 组织架构 — 部门的新建与删除。
3
+ *
4
+ * 新建部门是**四步链**,每一步的产出喂给下一步,缺一不可:
5
+ *
6
+ * ① GET `/api/bs/hrm/organization/getForm` 取**保存报文模板**(含现生成的 targetId)
7
+ * ② POST `/api/hrm/form/core/getFormLayout` 取 `formLayout.id` 与 `formLayoutMultiple.id`
8
+ * ③ POST `/api/hrm/form/core/saveFormData` 落表单数据,回吐 `recordId`
9
+ * ④ POST `/api/bs/hrm/organization/saveForm` 部门落进组织树
10
+ *
11
+ * ⚠ **① 给的模板不能直接当 ④ 的报文发** —— 形状对不上:
12
+ * ① 的 `data.parent` 是 `[]`、`data.subcompany` 是**对象数组**,
13
+ * 而 ④ 要的是 `parent: ""`(或父部门 id 字符串)与 `subcompany: "<机构id>"`。
14
+ * 转换集中在 `buildSaveFormPayload`,别在命令层现拼。
15
+ *
16
+ * 删除是单步:`POST /api/bs/hrm/department/delete`。
17
+ */
18
+ /** 保存报文里的组织类型。建部门固定 `department`。 */
19
+ export const ORG_TYPE_DEPARTMENT = 'department';
20
+ /**
21
+ * 解析当前登录用户所在机构 ID。
22
+ *
23
+ * `teamsCheck` 的 `body.currentUser.department`:优先 `subCompanyId`(公司级机构),
24
+ * 没有就退回 `department.id`(部分环境只有部门 id)。
25
+ *
26
+ * 与 `workflow-create-workflow.ts` 原先内联的那份同源 —— 那边已改为引用这里。
27
+ */
28
+ export async function resolveCurrentUserSubCompany(baseUrl, eteamsId) {
29
+ const dep = (await fetchCurrentUser(baseUrl, eteamsId))?.department;
30
+ return String(dep?.subCompanyId || dep?.id || '');
31
+ }
32
+ /**
33
+ * `teamsCheck` 拿当前登录用户。取不到就返回 `{}`(调用方各自兜底,这里不抛)。
34
+ *
35
+ * 人员导入要用 `currentUser.id` 当 `customParam.employeeId`,部门那两处要 `department`,
36
+ * 所以把请求这次抽出来共用 —— 不然同一份 teamsCheck 会有三处复制。
37
+ */
38
+ export async function fetchCurrentUser(baseUrl, eteamsId) {
39
+ try {
40
+ const resp = await fetch(`${baseUrl}/api/baseserver/layout/teamsCheck?clientType=not_xinchuang&client=WEB&domainName=${encodeURIComponent(baseUrl)}`, { method: 'POST', headers: { accept: 'application/json', 'content-type': 'application/json', eteamsid: eteamsId } });
41
+ const body = await resp.json();
42
+ return body?.currentUser ?? {};
43
+ }
44
+ catch {
45
+ return {};
46
+ }
47
+ }
48
+ /**
49
+ * 从 ① `getForm` 的返回里抽出模板。
50
+ *
51
+ * 抽不出来就抛 —— **不编默认值**:这四个 id 全是平台现生成的,
52
+ * 硬凑一个只会让后面的步骤以看不懂的方式失败。
53
+ */
54
+ export function extractOrgFormTemplate(response) {
55
+ const d = response?.data?.data ?? response?.data;
56
+ if (!d || typeof d !== 'object')
57
+ throw new Error('getForm 返回结构异常(拿不到模板)');
58
+ const targetId = String(d.targetId ?? '');
59
+ const formId = String(d.formdata?.formId ?? d.formId ?? '');
60
+ const versionId = String(d.formdata?.versionId ?? d.versionId ?? '');
61
+ const subcompanyId = String(d.subcompany?.[0]?.id ?? d.subcompany ?? '');
62
+ if (!targetId || !formId) {
63
+ // 实测:mulinquan 的 data 里带 `formdata`(含 formId/versionId),eteams 的**不带** ——
64
+ // 同一端点、同样的参数,差别在租户的部门表单配置。缺 formId 就没法走 ③④,直接说清。
65
+ throw new Error(`getForm 模板缺少关键 id(targetId=${targetId || '空'} formId=${formId || '空'}):`
66
+ + '该环境未返回部门表单配置(formdata.formId),当前无法在该环境建部门');
67
+ }
68
+ return {
69
+ targetId,
70
+ formId,
71
+ versionId,
72
+ subcompanyId,
73
+ rightList: Array.isArray(d.rightList) ? d.rightList.map(String) : [],
74
+ hideFieldList: Array.isArray(d.hideFieldList) ? d.hideFieldList.map(String) : [],
75
+ disporder: Number(d.disporder ?? 0),
76
+ virtualid: String(d.virtualid ?? '1'),
77
+ };
78
+ }
79
+ /** ③ `saveFormData` 的报文。`presetDataId` 就是模板里的 `targetId`。 */
80
+ export function buildSaveFormDataPayload(tpl, formLayoutId, multipleLayoutId) {
81
+ return {
82
+ module: 'hrm',
83
+ formData: {
84
+ module: 'hrm',
85
+ presetDataId: tpl.targetId,
86
+ dataDetails: [],
87
+ asyncTableData: false,
88
+ client: 'pc',
89
+ dataStatus: 'submit',
90
+ form: { id: tpl.formId },
91
+ formLayout: { id: formLayoutId },
92
+ multipleLayoutId,
93
+ },
94
+ };
95
+ }
96
+ /** ③ 的返回里取 `recordId`(④ 要用)。取不到就抛,不编。 */
97
+ export function extractRecordId(response) {
98
+ const d = response?.data ?? {};
99
+ const id = d.recordId ?? d.dataId ?? d.id ?? d.formDataId ?? '';
100
+ if (!id)
101
+ throw new Error('saveFormData 未返回 recordId(部门树那步会缺参数)');
102
+ return String(id);
103
+ }
104
+ /**
105
+ * ④ `organization/saveForm` 的报文 —— 把 ① 的模板**转成**平台实际收的形状。
106
+ *
107
+ * 转换点(这三处是踩过的坑,别改回去):
108
+ * - `parent`:模板给的是数组(顶层时为空数组)→ 要 `""` 或父部门 id **字符串**
109
+ * - `subcompany`:模板给的是对象数组 → 要机构 id **字符串**
110
+ * - `formdata.objectId` / `formdataId`:都等于 `targetId`
111
+ */
112
+ export function buildSaveFormPayload(tpl, input) {
113
+ // 所属机构取模板里的(或显式传入)—— **不要用 parentId 顶替**:
114
+ // 建子部门时 parentId 是父部门 id,拿它当 subcompany 会把子部门挂到错误的机构下。
115
+ const subcompanyId = input.subcompanyId || tpl.subcompanyId;
116
+ const isTopLevel = !input.parentId || input.parentId === subcompanyId;
117
+ return {
118
+ // 顶层部门时 parent 是空串(不是机构 id);挂在某个部门下时才写该部门 id
119
+ parent: isTopLevel ? '' : input.parentId,
120
+ subcompany: subcompanyId,
121
+ targetId: tpl.targetId,
122
+ advanceForm: true,
123
+ hideFieldList: tpl.hideFieldList,
124
+ virtualid: tpl.virtualid,
125
+ formdata: {
126
+ objectId: tpl.targetId,
127
+ formId: tpl.formId,
128
+ isEditable: true,
129
+ module: 'hrm',
130
+ versionId: tpl.versionId,
131
+ advanceForm: true,
132
+ },
133
+ type: ORG_TYPE_DEPARTMENT,
134
+ disporder: tpl.disporder,
135
+ rightList: tpl.rightList,
136
+ coadjutant: '',
137
+ code: input.code ?? '',
138
+ name: input.name,
139
+ ...(input.supDepartment ? { supDepartment: input.supDepartment } : {}),
140
+ ...(input.fullname ? { fullname: input.fullname } : {}),
141
+ formdataId: tpl.targetId,
142
+ recordId: input.recordId,
143
+ isMobile: false,
144
+ };
145
+ }
146
+ /** 删除部门的报文。`parent` 是它的**父**(顶层部门的父就是机构 id)。 */
147
+ export function buildDeleteDepartmentPayload(id, parent) {
148
+ return { id, parent, virtualId: '1', isMobile: false };
149
+ }
150
+ /**
151
+ * 编辑部门时读当前状态:`getForm` 带 **`id=`**(不是 `parentId=`)。
152
+ *
153
+ * 同一个端点两种用法:带 `parentId` 给**新建模板**,带 `id` 给**这个部门的完整现状**。
154
+ * 返回的 `data` 就是编辑报文的模板。
155
+ *
156
+ * ⚠ 这个读接口**不过滤已删记录** —— 删除是软删(`isDelete: true`),删完再读仍能读出来。
157
+ * 所以它不能用来判断「部门还在不在」,判删除要看 `isDelete` 字段或用组织树列表。
158
+ */
159
+ export function getOrgDetailPath(id) {
160
+ return `/api/bs/hrm/organization/getForm?id=${encodeURIComponent(id)}&flag=department&virtualId=1&isMobile=false`;
161
+ }
162
+ /**
163
+ * **编辑**部门的报文(`organization/saveForm`,与新建同一个端点但形状不同)。
164
+ *
165
+ * 编辑是「**当前完整状态 + 改动**」,不是只发改动,所以必须先用 `getOrgDetailPath` 把现状读回来。
166
+ * 与新建那版的差异(照着抓包对的):
167
+ * - 认 `id`,**没有** `targetId` / `formdata` / `formdataId` / `recordId`
168
+ * - 带 `tenantKey` / `creator` / `subcompanyid` / `datarank` / `createTime` / `updateTime` /
169
+ * `isTop` / `status` / `isDelete` / `usersettings` —— 这些**原样回传**,别自己造
170
+ * - `advanceForm` 是 `false`(新建时是 `true`)
171
+ * - `parent` 要的是**父的 id 字符串**;模板给的是数组,顶层部门则回填 `subcompanyid`
172
+ */
173
+ export function buildUpdateDepartmentPayload(detail, input) {
174
+ const d = detail?.data?.data ?? detail?.data ?? detail;
175
+ if (!d || typeof d !== 'object' || !d.id) {
176
+ throw new Error('getForm(id) 未返回部门详情(拿不到 id)');
177
+ }
178
+ const subcompanyid = String(d.subcompanyid ?? d.subcompany?.[0]?.id ?? '');
179
+ // 模板 parent 是数组:顶层部门是空数组,此时它的「父」就是所属机构
180
+ const templateParentId = String(d.parent?.[0]?.id ?? d.parent?.[0] ?? '');
181
+ const parent = input.parentId ?? (templateParentId || subcompanyid);
182
+ const payload = {
183
+ parent,
184
+ code: input.code ?? String(d.code ?? ''),
185
+ tenantKey: d.tenantKey,
186
+ type: d.type,
187
+ usersettings: d.usersettings ?? [],
188
+ coadjutant: Array.isArray(d.coadjutant) ? '' : (d.coadjutant ?? ''),
189
+ id: String(d.id),
190
+ virtualid: String(d.virtualid ?? '1'),
191
+ disporder: input.disporder ?? d.disporder ?? 0,
192
+ creator: d.creator,
193
+ subcompanyid,
194
+ advanceForm: false,
195
+ datarank: d.datarank,
196
+ isDelete: Boolean(d.isDelete),
197
+ hideFieldList: d.hideFieldList ?? [],
198
+ updateTime: d.updateTime,
199
+ rightList: d.rightList ?? [],
200
+ createTime: d.createTime,
201
+ isTop: Boolean(d.isTop),
202
+ name: input.name ?? String(d.name ?? ''),
203
+ fullname: input.fullname ?? String(d.fullname ?? ''),
204
+ status: Boolean(d.status),
205
+ isMobile: false,
206
+ };
207
+ return payload;
208
+ }
209
+ //# sourceMappingURL=org-department.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-department.js","sourceRoot":"","sources":["../../src/services/org-department.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ export interface ImportParam {
2
+ bizId: string;
3
+ moduleName: string;
4
+ functionName: string;
5
+ handlerName: string;
6
+ serviceName: string;
7
+ dataType: string;
8
+ }
9
+ /**
10
+ * 抽 ⓪ 的返回。**抽不到就抛** —— 这几个值是 `bizId` 和 ④ 报文的主体,
11
+ * 编一个默认值只会在很远的地方以看不懂的方式失败。
12
+ */
13
+ export declare function extractImportParam(resp: any): ImportParam;
14
+ /** 上传要用的文件元数据 —— 平台按这几个值认文件,得是**真实**的。 */
15
+ export interface FileMeta {
16
+ name: string;
17
+ size: number;
18
+ md5: string;
19
+ lastModified: number;
20
+ }
21
+ /**
22
+ * 读文件的真实元数据。`md5` 现算(平台会拿它校验文件完整性,编不得)。
23
+ *
24
+ * `lastModified` 取文件的 mtime 毫秒数 —— 实测这个值和 `lastModifiedDate` **填同一个数**。
25
+ */
26
+ export declare function readFileMeta(filePath: string): FileMeta;
27
+ /** ① 的报文。 */
28
+ export declare function buildPreUploadForm(meta: FileMeta, employeeId: string, fileBytes: Buffer<ArrayBuffer>): FormData;
29
+ /** ② 的报文 = ① + `preUploadId` + `uploadType`。 */
30
+ export declare function buildUploadForm(meta: FileMeta, employeeId: string, preUploadId: string, fileBytes: Buffer<ArrayBuffer>): FormData;
31
+ /** ① 的返回:预上传 id 藏在 `data.uploadModuleDto.fileid`(**小写 d**)。 */
32
+ export declare function extractPreUploadId(resp: any): string;
33
+ /**
34
+ * ② 的返回:`data.fileid`(**小写 d**)。
35
+ *
36
+ * 这里**只认小写**、不做驼峰回退:平台给的就是 `fileid`(实测),
37
+ * 加个 `fileId` 的兜底等于替平台猜一个不存在的写法,真出问题时反而更难查。
38
+ */
39
+ export declare function extractFileId(resp: any): string;
40
+ /** ④ 的 `uploadSet` —— 决定「怎么导」。 */
41
+ export interface UploadSet {
42
+ /** `add` 新增 / `update` 更新。 */
43
+ importType: string;
44
+ /** 更新时按哪个字段认人(如 `username`)。 */
45
+ empFindField: string;
46
+ /** 文件类型,从扩展名推。 */
47
+ fileType: string;
48
+ }
49
+ export declare function resolveUploadSet(opts?: {
50
+ importType?: string;
51
+ empFindField?: string;
52
+ fileType?: string;
53
+ }): UploadSet;
54
+ /**
55
+ * ④ 的报文。
56
+ *
57
+ * ⚠ `importType` 在报文里出现**两次**:顶层那个是空串、真正生效的在 `uploadSet.customObj` 里。
58
+ * 看着像冗余,但实测两次都是这样,照抄 —— 别「顺手清理」成一处。
59
+ */
60
+ export declare function buildUploadFileIdPayload(param: ImportParam, fileId: string, set: UploadSet, now: number): Record<string, unknown>;
61
+ /** ④ 的返回:`data.data.taskId`(**多一层 data**,这里最容易取空)。 */
62
+ export declare function extractTaskId(resp: any): string;
63
+ /**
64
+ * ⑤ 预览。
65
+ *
66
+ * `rerviewNum` 是**平台把 review 拼错了**,别改成 `reviewNum`(改了就不认)。
67
+ */
68
+ export declare function buildGetExcelDataPath(param: ImportParam, taskId: string, reviewNum?: number): string;
69
+ /** ⑥ 执行导入。 */
70
+ export declare function buildImportExcelDataPath(param: ImportParam, taskId: string): string;
71
+ /** ⑤ 解析出来的预览。 */
72
+ export interface ImportPreview {
73
+ fileName: string;
74
+ sheetNames: string[];
75
+ /** 列名(带「(必填)」后缀 —— 那是表头富文本的一部分,不是我们加的)。 */
76
+ columns: string[];
77
+ /** 每行是「列名 → 值」的对象。 */
78
+ rows: Record<string, unknown>[];
79
+ }
80
+ /**
81
+ * 抽 ⑤ 的预览。
82
+ *
83
+ * ⚠ `weaTable[0].total` 实测是 **-1**,不能拿来当行数 —— 行数看 `data.length`。
84
+ * 而且 `rerviewNum` 限了条数,**这里看到的只是前 N 行,不是全部**。
85
+ */
86
+ export declare function extractPreview(resp: any): ImportPreview;
87
+ //# sourceMappingURL=org-employee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-employee.d.ts","sourceRoot":"","sources":["../../src/services/org-employee.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG,WAAW,CAiBzD;AAED,0CAA0C;AAC1C,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAQvD;AAiBD,aAAa;AACb,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAK/G;AAED,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,WAAW,CAAC,GAAG,QAAQ,CAOjI;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAIpD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAI/C;AAED,kCAAkC;AAClC,MAAM,WAAW,SAAS;IACxB,8BAA8B;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,SAAS,CAMxH;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,GAAG,EAAE,MAAM,GACV,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA+BzB;AAED,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAK/C;AAYD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,MAAM,CAOjG;AAED,cAAc;AACd,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnF;AAED,iBAAiB;AACjB,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,GAAG,GAAG,aAAa,CAWvD"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * 组织架构 — 人员录入(Excel 批量导入)。
3
+ *
4
+ * 平台自己解析 Excel,**CLI 只是搬运工** —— 不上传解析结果,只上传**文件本身**。
5
+ * 所以要读的只有文件字节,不读单元格;预览走 ⑤ 拿平台解析好的结果。
6
+ *
7
+ * 完整链路(七步,每步的产出喂给下一步):
8
+ *
9
+ * ⓪ POST `/api/bs/hrm/emp/edit/importParam` body `{}`
10
+ * → `bizId` + moduleName / functionName / handlerName / serviceName / dataType
11
+ * ⚠ 这几项**全部由平台现给**,CLI 一律不硬编码 —— `bizId` 每次调用都重新生成。
12
+ *
13
+ * ① POST `/api/file/preUploadCheck` (multipart) → 预上传 id
14
+ * ② POST `/api/file/module/upload` (multipart + preUploadId) → `fileId`
15
+ * ⚠ ①② 的 multipart 字段**逐字相同**,② 只多 `preUploadId` 与 `uploadType=common`。
16
+ *
17
+ * ③ POST `/api/ebatch/checkFilePassword` `{fileId}`
18
+ * ④ POST `/api/ebatch/uploadFileId` `bizId` + `fileId` + `uploadSet` → `taskId`
19
+ * ⑤ POST `/api/ebatch/getExcelData` `?taskId&rerviewNum=N` → 预览(**不落库**)
20
+ * ⑥ POST `/api/ebatch/importExcelData` `?taskId&...` → 真正执行
21
+ *
22
+ * ⚠ **返回的嵌套层级三步三样,别想当然**(都是实测出来的):
23
+ * - ① 在 `data.uploadModuleDto.fileid`(藏在子对象里)
24
+ * - ② 在 `data.fileid`(**小写 d**,不是 `fileId`)
25
+ * - ③④ 在 `data.data.*`(多一层;④ 的 `taskId` 就在这里)
26
+ *
27
+ * ⑤ 是**干跑**:走到这里什么都不会落库,所以 `--dry-run` 就停在 ⑤。
28
+ * ⑤⑥ 的参数全在 query string,body 为空。
29
+ */
30
+ import { createHash } from 'node:crypto';
31
+ import { readFileSync, statSync } from 'node:fs';
32
+ import { basename } from 'node:path';
33
+ /** 上传的 multipart 字段名 —— ①② 共用这份,② 再补两个。 */
34
+ const MULTIPART_MODULE = 'ebatch';
35
+ /**
36
+ * 抽 ⓪ 的返回。**抽不到就抛** —— 这几个值是 `bizId` 和 ④ 报文的主体,
37
+ * 编一个默认值只会在很远的地方以看不懂的方式失败。
38
+ */
39
+ export function extractImportParam(resp) {
40
+ const d = resp?.data?.data ?? resp?.data;
41
+ if (!d || typeof d !== 'object')
42
+ throw new Error('importParam 返回结构异常(拿不到导入参数)');
43
+ const pick = (k) => String(d[k] ?? '');
44
+ const out = {
45
+ bizId: pick('bizId'),
46
+ moduleName: pick('moduleName'),
47
+ functionName: pick('functionName'),
48
+ handlerName: pick('handlerName'),
49
+ serviceName: pick('serviceName'),
50
+ dataType: pick('dataType'),
51
+ };
52
+ // bizId / functionName 缺了就进行不下去(④ 的报文主体 + ⑤⑥ 的 query)
53
+ for (const k of ['bizId', 'functionName']) {
54
+ if (!out[k])
55
+ throw new Error(`importParam 未返回 ${k}(该环境可能不支持人员导入)`);
56
+ }
57
+ return out;
58
+ }
59
+ /**
60
+ * 读文件的真实元数据。`md5` 现算(平台会拿它校验文件完整性,编不得)。
61
+ *
62
+ * `lastModified` 取文件的 mtime 毫秒数 —— 实测这个值和 `lastModifiedDate` **填同一个数**。
63
+ */
64
+ export function readFileMeta(filePath) {
65
+ const buf = readFileSync(filePath);
66
+ return {
67
+ name: basename(filePath),
68
+ size: buf.length,
69
+ md5: createHash('md5').update(buf).digest('hex'),
70
+ lastModified: Math.floor(statSync(filePath).mtimeMs),
71
+ };
72
+ }
73
+ /** 两端点共用的那批字段(顺序照实测:`file` 永远在最后)。 */
74
+ function appendCommonFields(form, meta, employeeId) {
75
+ form.append('compressImg', 'false');
76
+ form.append('customParam', JSON.stringify({ employeeId }));
77
+ form.append('module', MULTIPART_MODULE);
78
+ form.append('tempFileFlag', 'true');
79
+ form.append('createDoc', 'false');
80
+ form.append('tempFileTime', '1');
81
+ form.append('size', String(meta.size));
82
+ form.append('name', meta.name);
83
+ form.append('MD5', meta.md5);
84
+ form.append('lastModified', String(meta.lastModified));
85
+ form.append('lastModifiedDate', String(meta.lastModified));
86
+ }
87
+ /** ① 的报文。 */
88
+ export function buildPreUploadForm(meta, employeeId, fileBytes) {
89
+ const form = new FormData();
90
+ appendCommonFields(form, meta, employeeId);
91
+ form.append('file', new Blob([fileBytes]), meta.name);
92
+ return form;
93
+ }
94
+ /** ② 的报文 = ① + `preUploadId` + `uploadType`。 */
95
+ export function buildUploadForm(meta, employeeId, preUploadId, fileBytes) {
96
+ const form = new FormData();
97
+ appendCommonFields(form, meta, employeeId);
98
+ form.append('preUploadId', preUploadId);
99
+ form.append('uploadType', 'common');
100
+ form.append('file', new Blob([fileBytes]), meta.name);
101
+ return form;
102
+ }
103
+ /** ① 的返回:预上传 id 藏在 `data.uploadModuleDto.fileid`(**小写 d**)。 */
104
+ export function extractPreUploadId(resp) {
105
+ const id = resp?.data?.uploadModuleDto?.fileid ?? resp?.data?.fileid;
106
+ if (!id)
107
+ throw new Error('preUploadCheck 未返回文件 id(data.uploadModuleDto.fileid)');
108
+ return String(id);
109
+ }
110
+ /**
111
+ * ② 的返回:`data.fileid`(**小写 d**)。
112
+ *
113
+ * 这里**只认小写**、不做驼峰回退:平台给的就是 `fileid`(实测),
114
+ * 加个 `fileId` 的兜底等于替平台猜一个不存在的写法,真出问题时反而更难查。
115
+ */
116
+ export function extractFileId(resp) {
117
+ const id = resp?.data?.fileid;
118
+ if (!id)
119
+ throw new Error('文件上传未返回 fileid(data.fileid)');
120
+ return String(id);
121
+ }
122
+ export function resolveUploadSet(opts = {}) {
123
+ return {
124
+ importType: String(opts.importType ?? 'add'),
125
+ empFindField: String(opts.empFindField ?? 'username'),
126
+ fileType: String(opts.fileType ?? 'xlsx'),
127
+ };
128
+ }
129
+ /**
130
+ * ④ 的报文。
131
+ *
132
+ * ⚠ `importType` 在报文里出现**两次**:顶层那个是空串、真正生效的在 `uploadSet.customObj` 里。
133
+ * 看着像冗余,但实测两次都是这样,照抄 —— 别「顺手清理」成一处。
134
+ */
135
+ export function buildUploadFileIdPayload(param, fileId, set, now) {
136
+ return {
137
+ fileId,
138
+ bizId: param.bizId,
139
+ moduleName: param.moduleName,
140
+ functionName: param.functionName,
141
+ handlerName: param.handlerName,
142
+ serviceName: param.serviceName,
143
+ dataType: param.dataType,
144
+ isStepUpload: true,
145
+ isChunk: false,
146
+ chunkNum: 5000,
147
+ dataSeparator: ',',
148
+ uploadSet: {
149
+ requiredVerify: false,
150
+ defaultfill: false,
151
+ drillContent: false,
152
+ enableDataCompute: false,
153
+ needMergeHead: false,
154
+ needDetailHeader: false,
155
+ needmergeheadSheetNum: 1,
156
+ importType: '',
157
+ fileType: set.fileType,
158
+ customObj: { empFindField: set.empFindField, importType: set.importType },
159
+ uploadFileAsync: false,
160
+ skipApprove: false,
161
+ },
162
+ password: '',
163
+ validDuration: 1,
164
+ uploadTime: now,
165
+ };
166
+ }
167
+ /** ④ 的返回:`data.data.taskId`(**多一层 data**,这里最容易取空)。 */
168
+ export function extractTaskId(resp) {
169
+ const d = resp?.data?.data ?? resp?.data;
170
+ const id = d?.taskId ?? d?.id;
171
+ if (!id)
172
+ throw new Error('uploadFileId 未返回 taskId(data.data.taskId)');
173
+ return String(id);
174
+ }
175
+ /** ⑤⑥ 的参数都在 query 上,body 空 —— 两个端点共用这几个。 */
176
+ function queryOf(param, taskId) {
177
+ return new URLSearchParams({
178
+ taskId,
179
+ moduleName: param.moduleName,
180
+ functionName: param.functionName,
181
+ sendtotal: '1',
182
+ });
183
+ }
184
+ /**
185
+ * ⑤ 预览。
186
+ *
187
+ * `rerviewNum` 是**平台把 review 拼错了**,别改成 `reviewNum`(改了就不认)。
188
+ */
189
+ export function buildGetExcelDataPath(param, taskId, reviewNum = 100) {
190
+ const q = queryOf(param, taskId);
191
+ q.set('rerviewNum', String(reviewNum));
192
+ q.set('needMergeHead', 'false');
193
+ q.set('needmergeheadSheetNum', '1');
194
+ q.set('needDetailHeader', 'false');
195
+ return `/api/ebatch/getExcelData?${q.toString()}`;
196
+ }
197
+ /** ⑥ 执行导入。 */
198
+ export function buildImportExcelDataPath(param, taskId) {
199
+ return `/api/ebatch/importExcelData?${queryOf(param, taskId).toString()}`;
200
+ }
201
+ /**
202
+ * 抽 ⑤ 的预览。
203
+ *
204
+ * ⚠ `weaTable[0].total` 实测是 **-1**,不能拿来当行数 —— 行数看 `data.length`。
205
+ * 而且 `rerviewNum` 限了条数,**这里看到的只是前 N 行,不是全部**。
206
+ */
207
+ export function extractPreview(resp) {
208
+ const d = resp?.data?.data ?? resp?.data ?? {};
209
+ const t = Array.isArray(d.weaTable) ? d.weaTable[0] : (d.weaTable ?? {});
210
+ const columns = Array.isArray(t.columns) ? t.columns.map((c) => String(c?.title ?? '')).filter(Boolean) : [];
211
+ const rows = Array.isArray(t.data) ? t.data : [];
212
+ return {
213
+ fileName: String(d.fileName ?? ''),
214
+ sheetNames: Array.isArray(d.sheetNames) ? d.sheetNames.map(String) : [],
215
+ columns,
216
+ rows,
217
+ };
218
+ }
219
+ //# sourceMappingURL=org-employee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"org-employee.js","sourceRoot":"","sources":["../../src/services/org-employee.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * 角色成员:人员 / 部门 / 分部。
3
+ *
4
+ * 三类走**同一个**保存端点 `/api/bs/auth/role/{roleId}/member/save-or-update`,
5
+ * 靠 `objType` 选各自的数组键:
6
+ *
7
+ * resource → obj_resource[] 人员
8
+ * department → obj_department[] 部门
9
+ * subcompany → obj_subcompany[] 分部
10
+ *
11
+ * 成员项**不是「只给 id」** —— 平台要的是「搜索接口返回的那个对象」按各自形状再加工:
12
+ * 人员带 avatar(来自 `hrmAvatarInfos`,不是搜索结果里那个只有 showName 的 avatar)、
13
+ * 工号(`jobNum` → `number`)、姓名首字母(`logogram` 首字母大写 → `indexType`);
14
+ * 部门/分部带 `icon`、`title`(部门是「部门名|上级路径」)。
15
+ *
16
+ * 搜索那一步不在这里 —— 人员走 `getEmployeeByKeyWords`、部门/分部走
17
+ * `browser/data/{department,subcompany}`,各自形状不同,由调用方负责。
18
+ */
19
+ /**
20
+ * 角色成员的对象类型,与平台 `objType` 同值。
21
+ *
22
+ * 这几项就是保存报文里 `objectTypeFilter` 白名单中**可以逐个选**的那些:
23
+ * `resource`(人员) / `department`(部门) / `subcompany`(分部) / `position`(岗位) / `channel`(渠道)。
24
+ * 白名单里另三项(`all` 全体 / `external` 外部 / `allExternal` 全部外部)**不是逐个选的对象**,
25
+ * 语义不同,不走这里。
26
+ *
27
+ * 搜索接口(`browser/data/{kind}`,人员走 `getEmployeeByKeyWords`)与保存数组
28
+ * (`obj_{kind}`)都按这个类型名对齐;平台不认的类型会直接 500 `browser not found type`。
29
+ */
30
+ export type MemberKind = 'resource' | 'department' | 'subcompany' | 'position' | 'channel';
31
+ export declare const MEMBER_KINDS: readonly MemberKind[];
32
+ /** 类型的中文名(错误信息与命令输出用)。 */
33
+ export declare const MEMBER_KIND_LABEL: Record<MemberKind, string>;
34
+ /** 判定用户输入的形状是不是合法成员类型(CLI 侧收窄,比平台报错早)。 */
35
+ export declare function isMemberKind(v: string): v is MemberKind;
36
+ /** 成员类型 → 保存报文里的数组键(`resource` → `obj_resource`)。 */
37
+ export declare function memberArrayKey(kind: MemberKind): string;
38
+ /**
39
+ * 人员:`getEmployeeByKeyWords` 的返回项 → `obj_resource[]` 的一项。
40
+ *
41
+ * 几处**不能想当然**的地方:
42
+ * - `avatar` 要用 `hrmAvatarInfos`;搜索结果里那个 `avatar` 只有 `{showName}`,结构不对。
43
+ * - `title` 是**纯名字** —— 早期 CLI 自己拼过「名字|部门」,与平台实际存的不符。
44
+ * - `department` 留空(平台存的是空串,机构信息另有 `departmentId`)。
45
+ * - `number`(工号)**不是人人都有**,没有就不发这个键。
46
+ * - `userid`:搜索接口不返回它,用 `id` 顶上 —— 实测平台落库取的正是 `id`
47
+ * (读回 `member/list` 里 `userId === id`)。
48
+ */
49
+ export declare function buildPersonEntry(emp: any): Record<string, unknown>;
50
+ /**
51
+ * 部门 / 分部:浏览接口(`browser/data/{department,subcompany}`)的返回项 → `obj_department[]` / `obj_subcompany[]` 的一项。
52
+ *
53
+ * 两个返回项字段一致(`id`/`name`/`content`/`title`/`icon`),只有缺省图标不同,
54
+ * 所以共用一份构造。
55
+ */
56
+ export declare function buildOrgEntry(raw: any, kind: Exclude<MemberKind, 'resource'>): Record<string, unknown>;
57
+ /** 按类型分发到对应的构造器。 */
58
+ export declare function buildMemberEntry(kind: MemberKind, raw: any): Record<string, unknown>;
59
+ /**
60
+ * 从搜索结果里挑出目标对象:**精确同名优先**;只有一条结果时用它;否则报错。
61
+ *
62
+ * 不取首条 —— 同名或模糊命中时取首条会**静默加错人**,事后只能去角色里一条条翻。
63
+ */
64
+ export declare function pickExact(list: any[] | undefined, keyword: string, label: string, nameOf: (x: any) => unknown): any;
65
+ export interface MemberSaveOptions {
66
+ /** 安全级别的可选范围。**随租户配置变**(某租户 0–100、另一个 -999–999),不要当成固定值。 */
67
+ secMin?: number;
68
+ secMax?: number;
69
+ /** 是否启用安全级别校验(同样随租户:有的租户是 true)。 */
70
+ isSeclevel?: boolean;
71
+ /** 部门成员的归属属性(`subordinate` 含下属部门 / `partTimeStaff` 含兼职人员)。 */
72
+ departmentAttribute?: string[];
73
+ }
74
+ /**
75
+ * 组装 `member/save-or-update` 的报文。
76
+ *
77
+ * `objectTypeFilter` 与 `org_permission` 等取平台界面上的固定值;
78
+ * `objType` 决定哪个数组承载成员。
79
+ */
80
+ export declare function buildMemberSavePayload(kind: MemberKind, entries: Array<Record<string, unknown>>, opts?: MemberSaveOptions): Record<string, unknown>;
81
+ /** `member/list` 的请求体(分页与筛选都留空 = 取全部)。 */
82
+ export declare function buildMemberListBody(): Record<string, unknown>;
83
+ /** `member/list` 返回里的成员行(只取用得到的字段)。 */
84
+ export interface RoleMemberRow {
85
+ id: string;
86
+ object: string;
87
+ resourceType: string;
88
+ memberLevel: string;
89
+ orgPermission: string;
90
+ userId: string;
91
+ }
92
+ /**
93
+ * 从 `member/list` 的返回里抽出成员行。
94
+ *
95
+ * 返回体里除 `data` 外还夹着表格列定义、按钮权限等一堆东西,**只认 `data` 数组**,
96
+ * 别去猜别的键(`displayData` 是同一份内容的副本)。
97
+ */
98
+ export declare function extractMemberRows(response: any): RoleMemberRow[];
99
+ //# sourceMappingURL=role-member.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-member.d.ts","sourceRoot":"","sources":["../../src/services/role-member.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,SAAS,CAAC;AAE3F,eAAO,MAAM,YAAY,EAAE,SAAS,UAAU,EAE7C,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAMxD,CAAC;AAEF,0CAA0C;AAC1C,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,IAAI,UAAU,CAEvD;AAED,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEvD;AAqBD;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiClE;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAatG;AAED,oBAAoB;AACpB,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEpF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,GAAG,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,OAAO,GACnF,GAAG,CAcL;AAED,MAAM,WAAW,iBAAiB;IAChC,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8DAA8D;IAC9D,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACvC,IAAI,GAAE,iBAAsB,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuBzB;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAK7D;AAED,uCAAuC;AACvC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,GAAG,GAAG,aAAa,EAAE,CAehE"}