weaver-e10-builder 1.2.5 → 1.5.2

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 (230) hide show
  1. package/assets/org-employee-template.xlsx +0 -0
  2. package/dist/commands/form-add-physical-field.d.ts +3 -0
  3. package/dist/commands/form-add-physical-field.d.ts.map +1 -0
  4. package/dist/commands/form-add-physical-field.js +125 -0
  5. package/dist/commands/form-add-physical-field.js.map +1 -0
  6. package/dist/commands/form-button.d.ts.map +1 -1
  7. package/dist/commands/form-button.js +28 -5
  8. package/dist/commands/form-button.js.map +1 -1
  9. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  10. package/dist/commands/form-field-linkage.js +27 -6
  11. package/dist/commands/form-field-linkage.js.map +1 -1
  12. package/dist/commands/form-formula-linkage.d.ts +3 -0
  13. package/dist/commands/form-formula-linkage.d.ts.map +1 -0
  14. package/dist/commands/form-formula-linkage.js +434 -0
  15. package/dist/commands/form-formula-linkage.js.map +1 -0
  16. package/dist/commands/form-formula.d.ts.map +1 -1
  17. package/dist/commands/form-formula.js +22 -3
  18. package/dist/commands/form-formula.js.map +1 -1
  19. package/dist/commands/form-list-click.d.ts.map +1 -1
  20. package/dist/commands/form-list-click.js +2 -1
  21. package/dist/commands/form-list-click.js.map +1 -1
  22. package/dist/commands/form-list-permission.js +1 -1
  23. package/dist/commands/form-list-permission.js.map +1 -1
  24. package/dist/commands/form-native.d.ts.map +1 -1
  25. package/dist/commands/form-native.js +11 -3
  26. package/dist/commands/form-native.js.map +1 -1
  27. package/dist/commands/form-physical-table.d.ts +3 -0
  28. package/dist/commands/form-physical-table.d.ts.map +1 -0
  29. package/dist/commands/form-physical-table.js +195 -0
  30. package/dist/commands/form-physical-table.js.map +1 -0
  31. package/dist/commands/form.d.ts.map +1 -1
  32. package/dist/commands/form.js +246 -549
  33. package/dist/commands/form.js.map +1 -1
  34. package/dist/commands/matrix.d.ts.map +1 -1
  35. package/dist/commands/matrix.js +175 -36
  36. package/dist/commands/matrix.js.map +1 -1
  37. package/dist/commands/org.d.ts +10 -0
  38. package/dist/commands/org.d.ts.map +1 -0
  39. package/dist/commands/org.js +402 -0
  40. package/dist/commands/org.js.map +1 -0
  41. package/dist/commands/role.d.ts.map +1 -1
  42. package/dist/commands/role.js +106 -62
  43. package/dist/commands/role.js.map +1 -1
  44. package/dist/commands/wf-form.d.ts.map +1 -1
  45. package/dist/commands/wf-form.js +501 -26
  46. package/dist/commands/wf-form.js.map +1 -1
  47. package/dist/commands/workflow-auth-resp.d.ts.map +1 -1
  48. package/dist/commands/workflow-auth-resp.js +53 -5
  49. package/dist/commands/workflow-auth-resp.js.map +1 -1
  50. package/dist/commands/workflow-create-auth-resp.d.ts.map +1 -1
  51. package/dist/commands/workflow-create-auth-resp.js +5 -1
  52. package/dist/commands/workflow-create-auth-resp.js.map +1 -1
  53. package/dist/commands/workflow-operator-sign.js +1 -1
  54. package/dist/commands/workflow-operator-sign.js.map +1 -1
  55. package/dist/commands/workflow.d.ts.map +1 -1
  56. package/dist/commands/workflow.js +78 -9
  57. package/dist/commands/workflow.js.map +1 -1
  58. package/dist/index.js +8 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/services/action-detail.d.ts.map +1 -1
  61. package/dist/services/action-detail.js +5 -4
  62. package/dist/services/action-detail.js.map +1 -1
  63. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_update_compiler.js +22 -7
  65. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  66. package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
  67. package/dist/services/actionflow/components/approve_create.js +6 -3
  68. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  69. package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -1
  70. package/dist/services/actionflow/components/custom_set_form.js +35 -1
  71. package/dist/services/actionflow/components/custom_set_form.js.map +1 -1
  72. package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
  73. package/dist/services/actionflow/components/custom_trigger.js +4 -1
  74. package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
  75. package/dist/services/actionflow/components/dml_execute.d.ts.map +1 -1
  76. package/dist/services/actionflow/components/dml_execute.js +7 -3
  77. package/dist/services/actionflow/components/dml_execute.js.map +1 -1
  78. package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
  79. package/dist/services/actionflow/components/document_actions.js +7 -3
  80. package/dist/services/actionflow/components/document_actions.js.map +1 -1
  81. package/dist/services/actionflow/components/hrm_actions.d.ts.map +1 -1
  82. package/dist/services/actionflow/components/hrm_actions.js +7 -3
  83. package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
  84. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  85. package/dist/services/actionflow/components/multiple_execution.js +14 -5
  86. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  87. package/dist/services/actionflow/components/output.js +1 -1
  88. package/dist/services/actionflow/components/output.js.map +1 -1
  89. package/dist/services/actionflow/components/send_message.js +2 -2
  90. package/dist/services/actionflow/components/send_message.js.map +1 -1
  91. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  92. package/dist/services/actionflow/components/workflow_actions.js +7 -3
  93. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  94. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  95. package/dist/services/actionflow/context_preflight.js +12 -2
  96. package/dist/services/actionflow/context_preflight.js.map +1 -1
  97. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  98. package/dist/services/actionflow/context_provider.js +21 -2
  99. package/dist/services/actionflow/context_provider.js.map +1 -1
  100. package/dist/services/actionflow/custom_trigger_context.d.ts +10 -0
  101. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -0
  102. package/dist/services/actionflow/custom_trigger_context.js +46 -0
  103. package/dist/services/actionflow/custom_trigger_context.js.map +1 -0
  104. package/dist/services/actionflow/filter_rules.js +2 -2
  105. package/dist/services/actionflow/filter_rules.js.map +1 -1
  106. package/dist/services/actionflow/formula_service.d.ts +9 -1
  107. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  108. package/dist/services/actionflow/formula_service.js +59 -21
  109. package/dist/services/actionflow/formula_service.js.map +1 -1
  110. package/dist/services/actionflow/id_generator.d.ts +2 -0
  111. package/dist/services/actionflow/id_generator.d.ts.map +1 -1
  112. package/dist/services/actionflow/id_generator.js +13 -0
  113. package/dist/services/actionflow/id_generator.js.map +1 -1
  114. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  115. package/dist/services/actionflow/preflight_service.js +6 -1
  116. package/dist/services/actionflow/preflight_service.js.map +1 -1
  117. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  118. package/dist/services/actionflow/workflow_compiler.js +89 -35
  119. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  120. package/dist/services/auth-resp-condition.d.ts +35 -0
  121. package/dist/services/auth-resp-condition.d.ts.map +1 -0
  122. package/dist/services/auth-resp-condition.js +111 -0
  123. package/dist/services/auth-resp-condition.js.map +1 -0
  124. package/dist/services/condition-rules.d.ts.map +1 -1
  125. package/dist/services/condition-rules.js +4 -1
  126. package/dist/services/condition-rules.js.map +1 -1
  127. package/dist/services/esb-interface/document-parser.d.ts.map +1 -1
  128. package/dist/services/esb-interface/document-parser.js +62 -5
  129. package/dist/services/esb-interface/document-parser.js.map +1 -1
  130. package/dist/services/form-association.d.ts +19 -0
  131. package/dist/services/form-association.d.ts.map +1 -1
  132. package/dist/services/form-association.js +64 -0
  133. package/dist/services/form-association.js.map +1 -1
  134. package/dist/services/form-button-action.d.ts +7 -0
  135. package/dist/services/form-button-action.d.ts.map +1 -1
  136. package/dist/services/form-button-action.js +11 -1
  137. package/dist/services/form-button-action.js.map +1 -1
  138. package/dist/services/form-create.d.ts +4 -0
  139. package/dist/services/form-create.d.ts.map +1 -1
  140. package/dist/services/form-create.js +18 -12
  141. package/dist/services/form-create.js.map +1 -1
  142. package/dist/services/form-field-build.d.ts +71 -0
  143. package/dist/services/form-field-build.d.ts.map +1 -0
  144. package/dist/services/form-field-build.js +436 -0
  145. package/dist/services/form-field-build.js.map +1 -0
  146. package/dist/services/form-field-patch.d.ts +3 -1
  147. package/dist/services/form-field-patch.d.ts.map +1 -1
  148. package/dist/services/form-field-patch.js +23 -9
  149. package/dist/services/form-field-patch.js.map +1 -1
  150. package/dist/services/form-formula-linkage.d.ts +349 -0
  151. package/dist/services/form-formula-linkage.d.ts.map +1 -0
  152. package/dist/services/form-formula-linkage.js +546 -0
  153. package/dist/services/form-formula-linkage.js.map +1 -0
  154. package/dist/services/form-layout-insert.d.ts +84 -0
  155. package/dist/services/form-layout-insert.d.ts.map +1 -0
  156. package/dist/services/form-layout-insert.js +244 -0
  157. package/dist/services/form-layout-insert.js.map +1 -0
  158. package/dist/services/form-linkage-condition.d.ts +159 -0
  159. package/dist/services/form-linkage-condition.d.ts.map +1 -0
  160. package/dist/services/form-linkage-condition.js +307 -0
  161. package/dist/services/form-linkage-condition.js.map +1 -0
  162. package/dist/services/form-physical-table.d.ts +115 -0
  163. package/dist/services/form-physical-table.d.ts.map +1 -0
  164. package/dist/services/form-physical-table.js +153 -0
  165. package/dist/services/form-physical-table.js.map +1 -0
  166. package/dist/services/formula-detail.d.ts +98 -6
  167. package/dist/services/formula-detail.d.ts.map +1 -1
  168. package/dist/services/formula-detail.js +208 -26
  169. package/dist/services/formula-detail.js.map +1 -1
  170. package/dist/services/matrix-rows.d.ts +43 -0
  171. package/dist/services/matrix-rows.d.ts.map +1 -0
  172. package/dist/services/matrix-rows.js +104 -0
  173. package/dist/services/matrix-rows.js.map +1 -0
  174. package/dist/services/org-department.d.ts +114 -0
  175. package/dist/services/org-department.d.ts.map +1 -0
  176. package/dist/services/org-department.js +209 -0
  177. package/dist/services/org-department.js.map +1 -0
  178. package/dist/services/org-employee.d.ts +191 -0
  179. package/dist/services/org-employee.d.ts.map +1 -0
  180. package/dist/services/org-employee.js +400 -0
  181. package/dist/services/org-employee.js.map +1 -0
  182. package/dist/services/role-member.d.ts +99 -0
  183. package/dist/services/role-member.d.ts.map +1 -0
  184. package/dist/services/role-member.js +206 -0
  185. package/dist/services/role-member.js.map +1 -0
  186. package/dist/services/workflow-info.d.ts +83 -0
  187. package/dist/services/workflow-info.d.ts.map +1 -0
  188. package/dist/services/workflow-info.js +97 -0
  189. package/dist/services/workflow-info.js.map +1 -0
  190. package/dist/services/workflow-odoc-setting.d.ts +1 -1
  191. package/dist/services/workflow-odoc-setting.d.ts.map +1 -1
  192. package/dist/services/workflow-odoc-setting.js +15 -6
  193. package/dist/services/workflow-odoc-setting.js.map +1 -1
  194. package/dist/utils/column-name.d.ts +24 -0
  195. package/dist/utils/column-name.d.ts.map +1 -1
  196. package/dist/utils/column-name.js +16 -0
  197. package/dist/utils/column-name.js.map +1 -1
  198. package/ecodecmd/package.json +1 -2
  199. package/ecodecmd/src/loaddep.js +19 -9
  200. package/package.json +4 -4
  201. package/skill-docs/SKILL.md +13 -9
  202. package/skill-docs/_catalog.md +86 -81
  203. package/skill-docs/actionflows/SKILL.md +173 -170
  204. package/skill-docs/actionflows/references/components/logic/Output.md +1 -1
  205. package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +32 -0
  206. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
  207. package/skill-docs/references/common/guide-plan-template.md +9 -3
  208. package/skill-docs/references/common/ref-cli-commands.md +54 -23
  209. package/skill-docs/references/esb-interface/guide-import.md +4 -1
  210. package/skill-docs/references/form/guide-create-form.md +13 -0
  211. package/skill-docs/references/form/guide-field-linkage.md +2 -0
  212. package/skill-docs/references/form/guide-form-association.md +1 -1
  213. package/skill-docs/references/form/guide-form-formula-functions.md +36 -0
  214. package/skill-docs/references/form/guide-form-layout-incremental.md +75 -0
  215. package/skill-docs/references/form/guide-form-linkage.md +62 -4
  216. package/skill-docs/references/form/guide-form-physical-table.md +146 -0
  217. package/skill-docs/references/form/guide-formula-linkage.md +250 -0
  218. package/skill-docs/references/form/ref-form-fields.md +6 -0
  219. package/skill-docs/references/hrm/guide-matrix.md +79 -16
  220. package/skill-docs/references/hrm/guide-org-employee.md +124 -0
  221. package/skill-docs/references/report/cell-config-echo-guide.md +1 -1
  222. package/skill-docs/references/report/dataset-query-filter-guide.md +3 -3
  223. package/skill-docs/references/report/date-range-query-reference.md +2 -2
  224. package/skill-docs/references/report/query-condition-api-guide.md +11 -11
  225. package/skill-docs/references/report/report-designer-feature-map.md +1 -1
  226. package/skill-docs/references/report/report-permission-guide.md +2 -2
  227. package/skill-docs/references/workflow/guide-workflow-auth-resp.md +48 -22
  228. package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +248 -0
  229. package/skill-docs/references/workflow/guide-workflow-odoc.md +23 -51
  230. package/skill-docs/references/workflow/guide-workflow.md +1 -1
@@ -0,0 +1,400 @@
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
+ * ⑦ POST `/api/ebatch/getByTaskId` `?taskId` → **导入结果**(条数 / 失败原因 / 错误文件)
22
+ *
23
+ * ⚠ **返回的嵌套层级三步三样,别想当然**:
24
+ * - ① 在 `data.preUploadId`(有的环境是 `data.uploadModuleDto.fileid`,藏在子对象里)
25
+ * - ② 在 `data.fileid`(**小写 d**,不是 `fileId`)
26
+ * - ③④ 在 `data.data.*`(多一层;④ 的 `taskId` 就在这里)
27
+ *
28
+ * ⚠ **⑥ 的响应体只有一个 `true`**,条数不在里面 —— 不补 ⑦ 的话,**整批失败也会显示成「导入已提交」**。
29
+ *
30
+ * ⑤ 是**干跑**:走到这里什么都不会落库,所以 `--dry-run` 就停在 ⑤。
31
+ * ⑤⑥ 的参数全在 query string,body 为空。
32
+ */
33
+ import { createHash } from 'node:crypto';
34
+ import { readFileSync, statSync } from 'node:fs';
35
+ import { basename } from 'node:path';
36
+ import XLSX from 'xlsx';
37
+ /** 上传的 multipart 字段名 —— ①② 共用这份,② 再补两个。 */
38
+ const MULTIPART_MODULE = 'ebatch';
39
+ /**
40
+ * 抽 ⓪ 的返回。**抽不到就抛** —— 这几个值是 `bizId` 和 ④ 报文的主体,
41
+ * 编一个默认值只会在很远的地方以看不懂的方式失败。
42
+ */
43
+ export function extractImportParam(resp) {
44
+ const d = resp?.data?.data ?? resp?.data;
45
+ if (!d || typeof d !== 'object')
46
+ throw new Error('importParam 返回结构异常(拿不到导入参数)');
47
+ const pick = (k) => String(d[k] ?? '');
48
+ const out = {
49
+ bizId: pick('bizId'),
50
+ moduleName: pick('moduleName'),
51
+ functionName: pick('functionName'),
52
+ handlerName: pick('handlerName'),
53
+ serviceName: pick('serviceName'),
54
+ dataType: pick('dataType'),
55
+ };
56
+ // bizId / functionName 缺了就进行不下去(④ 的报文主体 + ⑤⑥ 的 query)
57
+ for (const k of ['bizId', 'functionName']) {
58
+ if (!out[k])
59
+ throw new Error(`importParam 未返回 ${k}(该环境可能不支持人员导入)`);
60
+ }
61
+ return out;
62
+ }
63
+ /**
64
+ * 读文件的真实元数据。`md5` 现算(平台会拿它校验文件完整性,编不得)。
65
+ *
66
+ * `lastModified` 取文件的 mtime 毫秒数 —— 实测这个值和 `lastModifiedDate` **填同一个数**。
67
+ */
68
+ export function readFileMeta(filePath) {
69
+ const buf = readFileSync(filePath);
70
+ return {
71
+ name: basename(filePath),
72
+ size: buf.length,
73
+ md5: createHash('md5').update(buf).digest('hex'),
74
+ lastModified: Math.floor(statSync(filePath).mtimeMs),
75
+ };
76
+ }
77
+ /** 两端点共用的那批字段(顺序照实测:`file` 永远在最后)。 */
78
+ function appendCommonFields(form, meta, employeeId) {
79
+ form.append('compressImg', 'false');
80
+ form.append('customParam', JSON.stringify({ employeeId }));
81
+ form.append('module', MULTIPART_MODULE);
82
+ form.append('tempFileFlag', 'true');
83
+ form.append('createDoc', 'false');
84
+ form.append('tempFileTime', '1');
85
+ form.append('size', String(meta.size));
86
+ form.append('name', meta.name);
87
+ form.append('MD5', meta.md5);
88
+ form.append('lastModified', String(meta.lastModified));
89
+ form.append('lastModifiedDate', String(meta.lastModified));
90
+ }
91
+ /** ① 的报文。 */
92
+ export function buildPreUploadForm(meta, employeeId, fileBytes) {
93
+ const form = new FormData();
94
+ appendCommonFields(form, meta, employeeId);
95
+ form.append('file', new Blob([fileBytes]), meta.name);
96
+ return form;
97
+ }
98
+ /** ② 的报文 = ① + `preUploadId` + `uploadType`。 */
99
+ export function buildUploadForm(meta, employeeId, preUploadId, fileBytes) {
100
+ const form = new FormData();
101
+ appendCommonFields(form, meta, employeeId);
102
+ form.append('preUploadId', preUploadId);
103
+ form.append('uploadType', 'common');
104
+ form.append('file', new Blob([fileBytes]), meta.name);
105
+ return form;
106
+ }
107
+ /**
108
+ * ① 的返回:预上传 id。
109
+ *
110
+ * **同一个端点在不同环境返回的形状不一样** —— 实测 mulinquan 只给 `data.preUploadId`
111
+ * (`data` 下就三个键:`preUploadId` / `uploadType` / `permissionType`,**没有** `uploadModuleDto`、
112
+ * 也**没有** `fileid`),而 `data.uploadModuleDto.fileid` 是另一套环境/版本的写法。
113
+ * 两者语义相同(都是给 ② 当 `preUploadId` 用),所以都认;一个都没有才报错。
114
+ */
115
+ export function extractPreUploadId(resp) {
116
+ const id = resp?.data?.preUploadId ?? resp?.data?.uploadModuleDto?.fileid ?? resp?.data?.fileid;
117
+ if (!id)
118
+ throw new Error('preUploadCheck 未返回文件 id(data.preUploadId / data.uploadModuleDto.fileid)');
119
+ return String(id);
120
+ }
121
+ /**
122
+ * ② 的返回:`data.fileid`(**小写 d**)。
123
+ *
124
+ * 这里**只认小写**、不做驼峰回退:平台给的就是 `fileid`(实测),
125
+ * 加个 `fileId` 的兜底等于替平台猜一个不存在的写法,真出问题时反而更难查。
126
+ */
127
+ export function extractFileId(resp) {
128
+ const id = resp?.data?.fileid;
129
+ if (!id)
130
+ throw new Error('文件上传未返回 fileid(data.fileid)');
131
+ return String(id);
132
+ }
133
+ export function resolveUploadSet(opts = {}) {
134
+ return {
135
+ importType: String(opts.importType ?? 'add'),
136
+ empFindField: String(opts.empFindField ?? 'username'),
137
+ fileType: String(opts.fileType ?? 'xlsx'),
138
+ };
139
+ }
140
+ /**
141
+ * ④ 的报文。
142
+ *
143
+ * ⚠ `importType` 在报文里出现**两次**:顶层那个是空串、真正生效的在 `uploadSet.customObj` 里。
144
+ * 看着像冗余,但实测两次都是这样,照抄 —— 别「顺手清理」成一处。
145
+ */
146
+ export function buildUploadFileIdPayload(param, fileId, set, now) {
147
+ return {
148
+ fileId,
149
+ bizId: param.bizId,
150
+ moduleName: param.moduleName,
151
+ functionName: param.functionName,
152
+ handlerName: param.handlerName,
153
+ serviceName: param.serviceName,
154
+ dataType: param.dataType,
155
+ isStepUpload: true,
156
+ isChunk: false,
157
+ chunkNum: 5000,
158
+ dataSeparator: ',',
159
+ uploadSet: {
160
+ requiredVerify: false,
161
+ defaultfill: false,
162
+ drillContent: false,
163
+ enableDataCompute: false,
164
+ needMergeHead: false,
165
+ needDetailHeader: false,
166
+ needmergeheadSheetNum: 1,
167
+ importType: '',
168
+ fileType: set.fileType,
169
+ customObj: { empFindField: set.empFindField, importType: set.importType },
170
+ uploadFileAsync: false,
171
+ skipApprove: false,
172
+ },
173
+ password: '',
174
+ validDuration: 1,
175
+ uploadTime: now,
176
+ };
177
+ }
178
+ /** ④ 的返回:`data.data.taskId`(**多一层 data**,这里最容易取空)。 */
179
+ export function extractTaskId(resp) {
180
+ const d = resp?.data?.data ?? resp?.data;
181
+ const id = d?.taskId ?? d?.id;
182
+ if (!id)
183
+ throw new Error('uploadFileId 未返回 taskId(data.data.taskId)');
184
+ return String(id);
185
+ }
186
+ /** ⑤⑥ 的参数都在 query 上,body 空 —— 两个端点共用这几个。 */
187
+ function queryOf(param, taskId) {
188
+ return new URLSearchParams({
189
+ taskId,
190
+ moduleName: param.moduleName,
191
+ functionName: param.functionName,
192
+ sendtotal: '1',
193
+ });
194
+ }
195
+ /**
196
+ * ⑤ 预览。
197
+ *
198
+ * `rerviewNum` 是**平台把 review 拼错了**,别改成 `reviewNum`(改了就不认)。
199
+ */
200
+ export function buildGetExcelDataPath(param, taskId, reviewNum = 100) {
201
+ const q = queryOf(param, taskId);
202
+ q.set('rerviewNum', String(reviewNum));
203
+ q.set('needMergeHead', 'false');
204
+ q.set('needmergeheadSheetNum', '1');
205
+ q.set('needDetailHeader', 'false');
206
+ return `/api/ebatch/getExcelData?${q.toString()}`;
207
+ }
208
+ /** ⑥ 执行导入。 */
209
+ export function buildImportExcelDataPath(param, taskId) {
210
+ return `/api/ebatch/importExcelData?${queryOf(param, taskId).toString()}`;
211
+ }
212
+ /**
213
+ * 抽 ⑤ 的预览。
214
+ *
215
+ * ⚠ `weaTable[0].total` 实测是 **-1**,不能拿来当行数 —— 行数看 `data.length`。
216
+ * 而且 `rerviewNum` 限了条数,**这里看到的只是前 N 行,不是全部**。
217
+ */
218
+ export function extractPreview(resp) {
219
+ const d = resp?.data?.data ?? resp?.data ?? {};
220
+ const t = Array.isArray(d.weaTable) ? d.weaTable[0] : (d.weaTable ?? {});
221
+ const columns = Array.isArray(t.columns) ? t.columns.map((c) => String(c?.title ?? '')).filter(Boolean) : [];
222
+ const rows = Array.isArray(t.data) ? t.data : [];
223
+ return {
224
+ fileName: String(d.fileName ?? ''),
225
+ sheetNames: Array.isArray(d.sheetNames) ? d.sheetNames.map(String) : [],
226
+ columns,
227
+ rows,
228
+ };
229
+ }
230
+ /** ⑥ 之后的进度查询。 */
231
+ export function buildGetByTaskIdPath(taskId) {
232
+ return `/api/ebatch/getByTaskId?taskId=${encodeURIComponent(taskId)}`;
233
+ }
234
+ /**
235
+ * 解析任务状态。
236
+ *
237
+ * ⚠ `callbackData` 是**一个 JSON 字符串**,要二次解析;里面 `successCount` 是**数字**
238
+ * (`1`)、`errorCount` 却是**字符串**(`"0"`)—— 同一段 JSON 里类型不一致,两边都过一遍 `Number`。
239
+ */
240
+ export function parseTaskResult(resp) {
241
+ const d = resp?.data ?? {};
242
+ let cb = {};
243
+ let countsUnknown = true;
244
+ const raw = d.callbackData;
245
+ if (typeof raw === 'string' && raw.trim()) {
246
+ try {
247
+ cb = JSON.parse(raw);
248
+ countsUnknown = false;
249
+ }
250
+ catch {
251
+ cb = {};
252
+ }
253
+ }
254
+ else if (raw && typeof raw === 'object') {
255
+ cb = raw;
256
+ countsUnknown = false;
257
+ }
258
+ return {
259
+ status: Number(d.status),
260
+ msg: String(d.msg ?? ''),
261
+ successCount: Number(cb.successCount ?? 0),
262
+ errorCount: Number(cb.errorCount ?? 0),
263
+ errorFileId: String(cb.errorFileId ?? ''),
264
+ countsUnknown,
265
+ };
266
+ }
267
+ /**
268
+ * 任务是否已到终态。
269
+ *
270
+ * **判据是 `callbackData` 能不能解出来,不是 `status`。** 踩过的坑:按 `status === 0` 判完成,
271
+ * 会在任务刚开始那一刻就停 —— 那时 `status: 0`、`msg: 成功`、`callbackData` 还没有,
272
+ * 几秒后才落成 `-1` + 失败 1 条。**中途值长得像成功,这是最坏的一种**。
273
+ *
274
+ * `status === -1` 也直接算终态(明确失败,没必要再等);此时若条数还取不到,调用方会照实提示。
275
+ */
276
+ export function isTaskSettled(r) {
277
+ return !r.countsUnknown || r.status === -1;
278
+ }
279
+ export async function fetchTaskResult(client, baseUrl, taskId) {
280
+ const r = await client.post(`${baseUrl}${buildGetByTaskIdPath(taskId)}`);
281
+ if (r?.code !== 200 || r?.status === false)
282
+ throw new Error(`查询导入任务失败: ${r?.msg || '未知错误'}`);
283
+ return parseTaskResult(r);
284
+ }
285
+ /**
286
+ * 轮询到终态。超时返回 `null`(**不编一个成功出来**)—— 调用方据此如实报「还在处理」。
287
+ */
288
+ export async function waitTaskResult(client, baseUrl, taskId, opts = {}) {
289
+ const timeoutMs = opts.timeoutMs ?? 60_000;
290
+ const intervalMs = opts.intervalMs ?? 1_000;
291
+ const deadline = Date.now() + timeoutMs;
292
+ let last = null;
293
+ for (;;) {
294
+ try {
295
+ last = await fetchTaskResult(client, baseUrl, taskId);
296
+ if (isTaskSettled(last))
297
+ return last;
298
+ }
299
+ catch {
300
+ // 单次查询失败不致命:任务在平台侧照跑,继续轮询到超时为止
301
+ }
302
+ if (Date.now() >= deadline)
303
+ return null;
304
+ await new Promise((r) => setTimeout(r, intervalMs));
305
+ }
306
+ }
307
+ // ─── 失败数据下载 ───────────────────────────────────────────
308
+ /**
309
+ * 失败数据的下载地址。
310
+ *
311
+ * 这是个**跳转**:平台 302 到对象存储的签名地址,文件真身在那一步。
312
+ */
313
+ export function buildErrorFileDownloadPath(fileId) {
314
+ return `/api/file/remotedownload/${encodeURIComponent(fileId)}/token/true?authModule=ebatch`;
315
+ }
316
+ /** 文件名:优先取对象存储那步 `response-content-disposition` 里的,取不到就用兜底名。 */
317
+ export function fileNameFromDisposition(location, fallback) {
318
+ try {
319
+ const q = new URL(location).searchParams.get('response-content-disposition') || '';
320
+ const m = /filename=([^;]+)/i.exec(q);
321
+ if (m)
322
+ return decodeURIComponent(m[1].trim());
323
+ }
324
+ catch { /* 不是合法 URL 就用兜底 */ }
325
+ return fallback;
326
+ }
327
+ /**
328
+ * 下载失败数据。
329
+ *
330
+ * 两步走是**故意的**:先带鉴权拿 302,再**不带任何鉴权头**去对象存储取文件。
331
+ * 直接把 `eteamsid` 跟着跳转发到腾讯云域名上,等于把会话凭证递给第三方主机 —— 哪怕那是租户自己的桶,
332
+ * 也没有理由发。
333
+ *
334
+ * 这里不走 `ApiClient`:它把 302 一律当「会话过期」会去重新登录,而这个 302 是正常业务跳转。
335
+ */
336
+ export async function downloadErrorFile(baseUrl, fileId, eteamsId) {
337
+ const first = await fetch(`${baseUrl}${buildErrorFileDownloadPath(fileId)}`, {
338
+ headers: { eteamsid: eteamsId, langtype: 'zh_CN' },
339
+ redirect: 'manual',
340
+ });
341
+ const fallback = `错误数据_${fileId}.xlsx`;
342
+ if (first.status >= 300 && first.status < 400) {
343
+ const location = first.headers.get('location') || '';
344
+ if (!location)
345
+ throw new Error(`下载跳转缺少 location(HTTP ${first.status})`);
346
+ const second = await fetch(location);
347
+ if (!second.ok)
348
+ throw new Error(`从对象存储下载失败: HTTP ${second.status}`);
349
+ return {
350
+ bytes: Buffer.from(await second.arrayBuffer()),
351
+ fileName: fileNameFromDisposition(location, fallback),
352
+ };
353
+ }
354
+ if (!first.ok)
355
+ throw new Error(`下载失败数据失败: HTTP ${first.status}`);
356
+ return { bytes: Buffer.from(await first.arrayBuffer()), fileName: fallback };
357
+ }
358
+ function stripHeaderSuffix(title) {
359
+ return title.replace(/[((]\s*必填\s*[))]\s*$/, '').trim();
360
+ }
361
+ /**
362
+ * 从一个错误 xlsx 的字节里把「哪一格、错在哪」抽出来。
363
+ *
364
+ * 批注是**默认就解析**的(挂在 `cell.c`),不用开任何选项 —— 这里刻意不传 `cellComments`,
365
+ * 那玩意儿在这版类型里没声明,传了编译不过,而它本来也不改变行为。
366
+ */
367
+ export function parseErrorFileReasons(bytes) {
368
+ const wb = XLSX.read(bytes);
369
+ const out = [];
370
+ for (const sheetName of wb.SheetNames) {
371
+ const ws = wb.Sheets[sheetName];
372
+ const ref = ws?.['!ref'];
373
+ if (!ref)
374
+ continue;
375
+ const range = XLSX.utils.decode_range(ref);
376
+ // 表头固定在第 1 行:批注挂在数据行上,得回头去表头取列名
377
+ const headers = [];
378
+ for (let c = range.s.c; c <= range.e.c; c++) {
379
+ const cell = ws[XLSX.utils.encode_cell({ r: range.s.r, c })];
380
+ headers[c] = stripHeaderSuffix(String(cell?.v ?? ''));
381
+ }
382
+ for (let r = range.s.r + 1; r <= range.e.r; r++) {
383
+ for (let c = range.s.c; c <= range.e.c; c++) {
384
+ const cell = ws[XLSX.utils.encode_cell({ r, c })];
385
+ const note = Array.isArray(cell?.c) ? cell.c.map((x) => String(x?.t ?? '')).filter(Boolean).join(' / ') : '';
386
+ if (!note)
387
+ continue;
388
+ out.push({
389
+ row: r + 1,
390
+ column: c + 1,
391
+ header: headers[c] || XLSX.utils.encode_col(c),
392
+ value: String(cell?.v ?? ''),
393
+ reason: note,
394
+ });
395
+ }
396
+ }
397
+ }
398
+ return out;
399
+ }
400
+ //# 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"}