weaver-work-cli 0.1.1 → 0.1.4

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 (351) hide show
  1. package/README.md +187 -76
  2. package/dist/cmd/setup/index.js +5 -5
  3. package/dist/cmd/skills/index.js +1 -1
  4. package/dist/core/hooks.js +7 -0
  5. package/dist/index.js +0 -0
  6. package/dist/internal/e10/auth/commands.js +160 -55
  7. package/dist/internal/e10/auth/crypto.js +7 -22
  8. package/dist/internal/e10/auth/session.js +1 -1
  9. package/dist/internal/e10/auth/xiaoe.js +268 -0
  10. package/dist/internal/e10/context.js +16 -2
  11. package/dist/internal/e10/index.js +1 -0
  12. package/dist/internal/e10/request-runtime.js +344 -0
  13. package/dist/internal/skills/install.js +48 -6
  14. package/dist/internal/skills/reader.js +27 -0
  15. package/dist/shortcuts/archive/continuation.js +70 -0
  16. package/dist/shortcuts/archive/errors.js +53 -0
  17. package/dist/shortcuts/archive/host.js +197 -0
  18. package/dist/shortcuts/archive/index.js +363 -0
  19. package/dist/shortcuts/archive/manifest.js +45 -0
  20. package/dist/shortcuts/archive/operations/archive-info.js +55 -0
  21. package/dist/shortcuts/archive/operations/borrow-car.js +146 -0
  22. package/dist/shortcuts/archive/operations/borrow-list.js +200 -0
  23. package/dist/shortcuts/archive/operations/confirm.js +46 -0
  24. package/dist/shortcuts/archive/operations/download.js +238 -0
  25. package/dist/shortcuts/archive/operations/flow-url.js +240 -0
  26. package/dist/shortcuts/archive/operations/fonds.js +95 -0
  27. package/dist/shortcuts/archive/operations/getPageUrl.js +137 -0
  28. package/dist/shortcuts/archive/operations/registry.js +43 -0
  29. package/dist/shortcuts/archive/operations/search.js +88 -0
  30. package/dist/shortcuts/archive/operations/shared.js +120 -0
  31. package/dist/shortcuts/archive/operations/types.js +23 -0
  32. package/dist/shortcuts/archive/operations/upload.js +182 -0
  33. package/dist/shortcuts/archive/operations.js +13 -0
  34. package/dist/shortcuts/archive/render/search-format.js +276 -0
  35. package/dist/shortcuts/archive/render/search-view.js +125 -0
  36. package/dist/shortcuts/asset/continuation.js +70 -0
  37. package/dist/shortcuts/asset/errors.js +67 -0
  38. package/dist/shortcuts/asset/host.js +438 -0
  39. package/dist/shortcuts/asset/index.js +255 -0
  40. package/dist/shortcuts/asset/manifest.js +471 -0
  41. package/dist/shortcuts/asset/operations/query.js +249 -0
  42. package/dist/shortcuts/asset/operations/registry.js +85 -0
  43. package/dist/shortcuts/asset/operations/shared.js +100 -0
  44. package/dist/shortcuts/asset/operations/type-cache.js +49 -0
  45. package/dist/shortcuts/asset/operations/types.js +1 -0
  46. package/dist/shortcuts/asset/operations/viewlink.js +117 -0
  47. package/dist/shortcuts/asset/operations/write.js +435 -0
  48. package/dist/shortcuts/asset/operations.js +9 -0
  49. package/dist/shortcuts/calendar/continuation.js +70 -0
  50. package/dist/shortcuts/calendar/errors.js +53 -0
  51. package/dist/shortcuts/calendar/host.js +148 -0
  52. package/dist/shortcuts/calendar/index.js +125 -0
  53. package/dist/shortcuts/calendar/manifest.js +26 -0
  54. package/dist/shortcuts/calendar/operations/read.js +259 -0
  55. package/dist/shortcuts/calendar/operations/registry.js +31 -0
  56. package/dist/shortcuts/calendar/operations/shared.js +132 -0
  57. package/dist/shortcuts/calendar/operations/types.js +25 -0
  58. package/dist/shortcuts/calendar/operations/write.js +439 -0
  59. package/dist/shortcuts/calendar/operations.js +8 -0
  60. package/dist/shortcuts/ehr/continuation.js +70 -0
  61. package/dist/shortcuts/ehr/errors.js +53 -0
  62. package/dist/shortcuts/ehr/host.js +213 -0
  63. package/dist/shortcuts/ehr/index.js +205 -0
  64. package/dist/shortcuts/ehr/manifest.js +47 -0
  65. package/dist/shortcuts/ehr/operations/attend-read.js +373 -0
  66. package/dist/shortcuts/ehr/operations/attend-write.js +514 -0
  67. package/dist/shortcuts/ehr/operations/hr-contact.js +363 -0
  68. package/dist/shortcuts/ehr/operations/hr-ds.js +298 -0
  69. package/dist/shortcuts/ehr/operations/hr-report.js +386 -0
  70. package/dist/shortcuts/ehr/operations/recruit-write.js +1629 -0
  71. package/dist/shortcuts/ehr/operations/recruit.js +803 -0
  72. package/dist/shortcuts/ehr/operations/registry.js +43 -0
  73. package/dist/shortcuts/ehr/operations/salary.js +319 -0
  74. package/dist/shortcuts/ehr/operations/shared.js +246 -0
  75. package/dist/shortcuts/ehr/operations/types.js +25 -0
  76. package/dist/shortcuts/ehr/operations.js +25 -0
  77. package/dist/shortcuts/esb/continuation.js +70 -0
  78. package/dist/shortcuts/esb/errors.js +65 -0
  79. package/dist/shortcuts/esb/host.js +187 -0
  80. package/dist/shortcuts/esb/index.js +112 -0
  81. package/dist/shortcuts/esb/manifest.js +91 -0
  82. package/dist/shortcuts/esb/operations/input-format.js +31 -0
  83. package/dist/shortcuts/esb/operations/registry.js +48 -0
  84. package/dist/shortcuts/esb/operations/shared.js +152 -0
  85. package/dist/shortcuts/esb/operations/trigger.js +76 -0
  86. package/dist/shortcuts/esb/operations/types.js +21 -0
  87. package/dist/shortcuts/esb/operations.js +15 -0
  88. package/dist/shortcuts/fna/continuation.js +70 -0
  89. package/dist/shortcuts/fna/errors.js +59 -0
  90. package/dist/shortcuts/fna/host.js +146 -0
  91. package/dist/shortcuts/fna/index.js +111 -0
  92. package/dist/shortcuts/fna/manifest.js +41 -0
  93. package/dist/shortcuts/fna/operations/budget.js +124 -0
  94. package/dist/shortcuts/fna/operations/expense-center.js +148 -0
  95. package/dist/shortcuts/fna/operations/invoice-writeoff.js +212 -0
  96. package/dist/shortcuts/fna/operations/loan.js +195 -0
  97. package/dist/shortcuts/fna/operations/registry.js +35 -0
  98. package/dist/shortcuts/fna/operations/shared.js +210 -0
  99. package/dist/shortcuts/fna/operations/types.js +25 -0
  100. package/dist/shortcuts/fna/operations.js +19 -0
  101. package/dist/shortcuts/hrm/errors.js +38 -0
  102. package/dist/shortcuts/hrm/host.js +156 -0
  103. package/dist/shortcuts/hrm/index.js +111 -0
  104. package/dist/shortcuts/hrm/manifest.js +32 -0
  105. package/dist/shortcuts/hrm/operations/employee.js +338 -0
  106. package/dist/shortcuts/hrm/operations/org.js +110 -0
  107. package/dist/shortcuts/hrm/operations/position.js +176 -0
  108. package/dist/shortcuts/hrm/operations/registry.js +33 -0
  109. package/dist/shortcuts/hrm/operations/shared.js +143 -0
  110. package/dist/shortcuts/hrm/operations/types.js +23 -0
  111. package/dist/shortcuts/hrm/operations.js +19 -0
  112. package/dist/shortcuts/index.js +20 -0
  113. package/dist/shortcuts/invoice/host.js +99 -94
  114. package/dist/shortcuts/invoice/index.js +65 -61
  115. package/dist/shortcuts/invoice/manifest.js +222 -14
  116. package/dist/shortcuts/invoice/operations/browse-field.js +17 -0
  117. package/dist/shortcuts/invoice/operations/issuing.js +198 -0
  118. package/dist/shortcuts/invoice/operations/ocr-preview.js +6 -3
  119. package/dist/shortcuts/invoice/operations/registry.js +17 -0
  120. package/dist/shortcuts/invoice/operations/reim.js +401 -0
  121. package/dist/shortcuts/invoice/operations/shared.js +271 -6
  122. package/dist/shortcuts/invoice/operations/validate-preview.js +1 -1
  123. package/dist/shortcuts/jiuchuanhui/cache.js +441 -0
  124. package/dist/shortcuts/jiuchuanhui/continuation.js +70 -0
  125. package/dist/shortcuts/jiuchuanhui/errors.js +59 -0
  126. package/dist/shortcuts/jiuchuanhui/host.js +159 -0
  127. package/dist/shortcuts/jiuchuanhui/index.js +109 -0
  128. package/dist/shortcuts/jiuchuanhui/manifest.js +469 -0
  129. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +214 -0
  130. package/dist/shortcuts/jiuchuanhui/operations/esb.js +157 -0
  131. package/dist/shortcuts/jiuchuanhui/operations/generic.js +146 -0
  132. package/dist/shortcuts/jiuchuanhui/operations/registry.js +133 -0
  133. package/dist/shortcuts/jiuchuanhui/operations/shared.js +158 -0
  134. package/dist/shortcuts/jiuchuanhui/operations/types.js +1 -0
  135. package/dist/shortcuts/jiuchuanhui/operations.js +8 -0
  136. package/dist/shortcuts/mail/continuation.js +70 -0
  137. package/dist/shortcuts/mail/errors.js +53 -0
  138. package/dist/shortcuts/mail/host.js +182 -0
  139. package/dist/shortcuts/mail/index.js +519 -0
  140. package/dist/shortcuts/mail/manifest.js +38 -0
  141. package/dist/shortcuts/mail/operations/mail-blacklist.js +79 -0
  142. package/dist/shortcuts/mail/operations/mail-contacts.js +195 -0
  143. package/dist/shortcuts/mail/operations/mail-manage.js +335 -0
  144. package/dist/shortcuts/mail/operations/mail-read.js +508 -0
  145. package/dist/shortcuts/mail/operations/mail-send.js +474 -0
  146. package/dist/shortcuts/mail/operations/mail-sign.js +203 -0
  147. package/dist/shortcuts/mail/operations/mail-template.js +170 -0
  148. package/dist/shortcuts/mail/operations/registry.js +41 -0
  149. package/dist/shortcuts/mail/operations/shared.js +64 -0
  150. package/dist/shortcuts/mail/operations/types.js +27 -0
  151. package/dist/shortcuts/mail/operations.js +19 -0
  152. package/dist/shortcuts/plan/continuation.js +70 -0
  153. package/dist/shortcuts/plan/errors.js +70 -0
  154. package/dist/shortcuts/plan/host.js +180 -0
  155. package/dist/shortcuts/plan/index.js +150 -0
  156. package/dist/shortcuts/plan/manifest.js +53 -0
  157. package/dist/shortcuts/plan/operations/link.js +256 -0
  158. package/dist/shortcuts/plan/operations/read.js +259 -0
  159. package/dist/shortcuts/plan/operations/registry.js +33 -0
  160. package/dist/shortcuts/plan/operations/shared.js +246 -0
  161. package/dist/shortcuts/plan/operations/types.js +49 -0
  162. package/dist/shortcuts/plan/operations/version.js +49 -0
  163. package/dist/shortcuts/plan/operations/write.js +710 -0
  164. package/dist/shortcuts/plan/operations.js +8 -0
  165. package/docs/SKILL.md +11 -7
  166. package/docs/_catalog.md +23 -5
  167. package/docs/agent-invoice.md +31 -10
  168. package/docs/agent-skill-install.md +211 -0
  169. package/docs/calendar.md +87 -0
  170. package/docs/e10-auth.md +28 -9
  171. package/docs/ehr.md +186 -0
  172. package/docs/esb.md +64 -0
  173. package/docs/fna.md +72 -0
  174. package/docs/hrm.md +89 -0
  175. package/docs/invoice.md +66 -20
  176. package/docs/jiuchuanhui.md +131 -0
  177. package/docs/operation-manual.md +443 -0
  178. package/docs/plan.md +82 -0
  179. package/docs/wenshuding.md +129 -0
  180. package/docs/ziguanjia.md +89 -0
  181. package/package.json +4 -4
  182. package/scripts/package-skill.mjs +127 -34
  183. package/scripts/postbuild.mjs +13 -0
  184. package/skill-template/business-info.json +13 -2
  185. package/skill-template/domains/calendar.md +15 -0
  186. package/skill-template/domains/esb.md +13 -0
  187. package/skill-template/domains/hrm.md +16 -0
  188. package/skill-template/domains/jiuchuanhui.md +23 -0
  189. package/skill-template/domains/jucailin.md +22 -0
  190. package/skill-template/domains/mail.md +21 -0
  191. package/skill-template/domains/plan.md +17 -0
  192. package/skill-template/domains/qiyecheng.md +17 -0
  193. package/skill-template/domains/shared.md +9 -3
  194. package/skill-template/domains/skill-maker.md +10 -0
  195. package/skill-template/domains/wenshuding.md +22 -0
  196. package/skill-template/domains/{invoice.md → yepiaotong.md} +4 -0
  197. package/skill-template/domains/ziguanjia.md +21 -0
  198. package/skill-template/master-skill-template.md +12 -6
  199. package/skill-template/skill-template.md +40 -9
  200. package/skills/weaver-e10-calendar/SKILL.md +101 -0
  201. package/skills/weaver-e10-calendar/product.json +8 -0
  202. package/skills/weaver-e10-calendar/references/calendar-app-check.md +65 -0
  203. package/skills/weaver-e10-calendar/references/calendar-dict.md +55 -0
  204. package/skills/weaver-e10-calendar/references/calendar-query.md +70 -0
  205. package/skills/weaver-e10-calendar/references/calendar-write.md +97 -0
  206. package/skills/weaver-e10-calendar/references/source-manifest.json +54 -0
  207. package/skills/weaver-e10-esb/SKILL.md +102 -0
  208. package/skills/weaver-e10-esb/product.json +8 -0
  209. package/skills/weaver-e10-esb/references/input-format.md +52 -0
  210. package/skills/weaver-e10-esb/references/source-manifest.json +242 -0
  211. package/skills/weaver-e10-esb/references/trigger.md +99 -0
  212. package/skills/weaver-e10-hrm/SKILL.md +87 -0
  213. package/skills/weaver-e10-hrm/product.json +8 -0
  214. package/skills/weaver-e10-hrm/references/employee.md +109 -0
  215. package/skills/weaver-e10-hrm/references/org.md +95 -0
  216. package/skills/weaver-e10-hrm/references/position.md +95 -0
  217. package/skills/weaver-e10-hrm/references/source-manifest.json +121 -0
  218. package/skills/weaver-e10-jiuchuanhui/SKILL.md +174 -0
  219. package/skills/weaver-e10-jiuchuanhui/product.json +8 -0
  220. package/skills/weaver-e10-jiuchuanhui/references/cache.md +110 -0
  221. package/skills/weaver-e10-jiuchuanhui/references/clue.md +61 -0
  222. package/skills/weaver-e10-jiuchuanhui/references/contact-plan.md +56 -0
  223. package/skills/weaver-e10-jiuchuanhui/references/contact-records.md +48 -0
  224. package/skills/weaver-e10-jiuchuanhui/references/contact.md +56 -0
  225. package/skills/weaver-e10-jiuchuanhui/references/customer.md +69 -0
  226. package/skills/weaver-e10-jiuchuanhui/references/disabled-capabilities.md +24 -0
  227. package/skills/weaver-e10-jiuchuanhui/references/discovery-config.md +60 -0
  228. package/skills/weaver-e10-jiuchuanhui/references/general-helpers.md +59 -0
  229. package/skills/weaver-e10-jiuchuanhui/references/jiuchuanhui-entry.md +60 -0
  230. package/skills/weaver-e10-jiuchuanhui/references/sale.md +72 -0
  231. package/skills/weaver-e10-jiuchuanhui/references/source-manifest.json +2632 -0
  232. package/skills/weaver-e10-jucailin/SKILL.md +101 -0
  233. package/skills/weaver-e10-jucailin/product.json +8 -0
  234. package/skills/weaver-e10-jucailin/references/attend-read.md +73 -0
  235. package/skills/weaver-e10-jucailin/references/attend-write.md +82 -0
  236. package/skills/weaver-e10-jucailin/references/hr-contact.md +92 -0
  237. package/skills/weaver-e10-jucailin/references/hr-datasource.md +104 -0
  238. package/skills/weaver-e10-jucailin/references/hr-report.md +76 -0
  239. package/skills/weaver-e10-jucailin/references/recruit-read.md +76 -0
  240. package/skills/weaver-e10-jucailin/references/recruit-write.md +70 -0
  241. package/skills/weaver-e10-jucailin/references/safety-boundaries.md +35 -0
  242. package/skills/weaver-e10-jucailin/references/salary.md +110 -0
  243. package/skills/weaver-e10-jucailin/references/source-manifest.json +152 -0
  244. package/skills/weaver-e10-mail/SKILL.md +151 -0
  245. package/skills/weaver-e10-mail/product.json +8 -0
  246. package/skills/weaver-e10-mail/references/mail-agent-entry.md +47 -0
  247. package/skills/weaver-e10-mail/references/mail-attachment.md +30 -0
  248. package/skills/weaver-e10-mail/references/mail-blacklist.md +27 -0
  249. package/skills/weaver-e10-mail/references/mail-contacts.md +33 -0
  250. package/skills/weaver-e10-mail/references/mail-manage.md +44 -0
  251. package/skills/weaver-e10-mail/references/mail-read.md +76 -0
  252. package/skills/weaver-e10-mail/references/mail-send.md +43 -0
  253. package/skills/weaver-e10-mail/references/mail-sign.md +33 -0
  254. package/skills/weaver-e10-mail/references/mail-template.md +31 -0
  255. package/skills/weaver-e10-mail/references/safety-boundaries.md +32 -0
  256. package/skills/weaver-e10-plan/SKILL.md +139 -0
  257. package/skills/weaver-e10-plan/product.json +8 -0
  258. package/skills/weaver-e10-plan/references/plan-collect-and-compose.md +123 -0
  259. package/skills/weaver-e10-plan/references/plan-overview-and-routing.md +138 -0
  260. package/skills/weaver-e10-plan/references/plan-report-query.md +154 -0
  261. package/skills/weaver-e10-plan/references/plan-report-remind.md +104 -0
  262. package/skills/weaver-e10-plan/references/plan-report-write.md +162 -0
  263. package/skills/weaver-e10-plan/references/source-manifest.json +858 -0
  264. package/skills/weaver-e10-qiyecheng/SKILL.md +118 -0
  265. package/skills/weaver-e10-qiyecheng/product.json +8 -0
  266. package/skills/weaver-e10-qiyecheng/references/budget.md +65 -0
  267. package/skills/weaver-e10-qiyecheng/references/catalog.md +56 -0
  268. package/skills/weaver-e10-qiyecheng/references/expense-center.md +51 -0
  269. package/skills/weaver-e10-qiyecheng/references/invoice-writeoff.md +57 -0
  270. package/skills/weaver-e10-qiyecheng/references/loan-management.md +59 -0
  271. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +698 -0
  272. package/skills/weaver-e10-shared/SKILL.md +86 -0
  273. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +127 -0
  274. package/skills/weaver-e10-shared/references/json-output-contract.md +120 -0
  275. package/skills/weaver-e10-shared/references/weaver-e10-installation.md +110 -0
  276. package/skills/weaver-e10-skill-maker/SKILL.md +77 -0
  277. package/skills/weaver-e10-skill-maker/product.json +8 -0
  278. package/skills/weaver-e10-skill-maker/references/business-skill-generation.md +124 -0
  279. package/skills/weaver-e10-skill-maker/references/detector-validation.md +101 -0
  280. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +230 -0
  281. package/skills/weaver-e10-skill-maker/references/post-generation-install.md +105 -0
  282. package/skills/weaver-e10-skill-maker/references/source-update-detection.md +261 -0
  283. package/skills/weaver-e10-skill-maker/references/weaver-skill-style.md +141 -0
  284. package/skills/weaver-e10-wenshuding/SKILL.md +157 -0
  285. package/skills/weaver-e10-wenshuding/product.json +8 -0
  286. package/skills/weaver-e10-wenshuding/references/archive-agent-entry.md +63 -0
  287. package/skills/weaver-e10-wenshuding/references/archive-borrow-car.md +52 -0
  288. package/skills/weaver-e10-wenshuding/references/archive-borrow-list.md +52 -0
  289. package/skills/weaver-e10-wenshuding/references/archive-disabled-capabilities.md +22 -0
  290. package/skills/weaver-e10-wenshuding/references/archive-download.md +48 -0
  291. package/skills/weaver-e10-wenshuding/references/archive-flow.md +46 -0
  292. package/skills/weaver-e10-wenshuding/references/archive-fonds.md +34 -0
  293. package/skills/weaver-e10-wenshuding/references/archive-info.md +33 -0
  294. package/skills/weaver-e10-wenshuding/references/archive-search.md +52 -0
  295. package/skills/weaver-e10-wenshuding/references/archive-upload.md +41 -0
  296. package/skills/weaver-e10-wenshuding/references/source-manifest.json +517 -0
  297. package/skills/weaver-e10-yepiaotong/SKILL.md +184 -0
  298. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-add.md +1 -1
  299. package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +47 -0
  300. package/skills/weaver-e10-yepiaotong/references/invoice-browse-field-data.md +204 -0
  301. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-delete.md +1 -1
  302. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-detail.md +13 -5
  303. package/skills/weaver-e10-yepiaotong/references/invoice-disabled-capabilities.md +28 -0
  304. package/skills/weaver-e10-yepiaotong/references/invoice-download.md +31 -0
  305. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +45 -0
  306. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-file-upload.md +15 -4
  307. package/skills/weaver-e10-yepiaotong/references/invoice-import.md +45 -0
  308. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +120 -0
  309. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-field-rules.md +161 -0
  310. package/skills/weaver-e10-yepiaotong/references/invoice-issuing.md +99 -0
  311. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-ocr-preview.md +14 -4
  312. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +58 -0
  313. package/skills/weaver-e10-yepiaotong/references/invoice-red.md +261 -0
  314. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +97 -0
  315. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-update.md +1 -1
  316. package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/references/invoice-validation-preview.md +10 -3
  317. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +1340 -0
  318. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +845 -0
  319. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +94 -0
  320. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +449 -0
  321. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +266 -0
  322. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +494 -0
  323. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +1103 -0
  324. package/skills/weaver-e10-ziguanjia/SKILL.md +162 -0
  325. package/skills/weaver-e10-ziguanjia/product.json +8 -0
  326. package/skills/weaver-e10-ziguanjia/references/source-manifest.json +147 -0
  327. package/skills/weaver-e10-ziguanjia/references/ziguanjia-agent-entry.md +65 -0
  328. package/skills/weaver-e10-ziguanjia/references/ziguanjia-create.md +45 -0
  329. package/skills/weaver-e10-ziguanjia/references/ziguanjia-depre.md +48 -0
  330. package/skills/weaver-e10-ziguanjia/references/ziguanjia-disabled-capabilities.md +22 -0
  331. package/skills/weaver-e10-ziguanjia/references/ziguanjia-purch.md +57 -0
  332. package/skills/weaver-e10-ziguanjia/references/ziguanjia-query.md +62 -0
  333. package/skills/weaver-e10-ziguanjia/references/ziguanjia-repair.md +83 -0
  334. package/skills/weaver-e10-ziguanjia/references/ziguanjia-resolve.md +49 -0
  335. package/skills/weaver-e10-ziguanjia/references/ziguanjia-return.md +70 -0
  336. package/skills/weaver-e10-ziguanjia/references/ziguanjia-update.md +45 -0
  337. package/skills/weaver-e10-ziguanjia/references/ziguanjia-use.md +60 -0
  338. package/skills/weaver-e10-ziguanjia/references/ziguanjia-viewlink.md +81 -0
  339. package/skills/weaver-work-cli-invoice/SKILL.md +0 -103
  340. package/skills/weaver-work-cli-invoice/references/invoice-agent-entry.md +0 -38
  341. package/skills/weaver-work-cli-invoice/references/invoice-disabled-capabilities.md +0 -26
  342. package/skills/weaver-work-cli-invoice/references/invoice-download.md +0 -22
  343. package/skills/weaver-work-cli-invoice/references/invoice-enterprise-list.md +0 -35
  344. package/skills/weaver-work-cli-invoice/references/invoice-import.md +0 -28
  345. package/skills/weaver-work-cli-invoice/references/invoice-personal-list.md +0 -47
  346. package/skills/weaver-work-cli-shared/SKILL.md +0 -53
  347. package/skills/weaver-work-cli-shared/references/e10-auth-and-session.md +0 -83
  348. package/skills/weaver-work-cli-shared/references/json-output-contract.md +0 -61
  349. package/skills/weaver-work-cli-shared/references/weaver-work-cli-installation.md +0 -61
  350. /package/skills/{weaver-work-cli-shared → weaver-e10-shared}/references/high-risk-write.md +0 -0
  351. /package/skills/{weaver-work-cli-invoice → weaver-e10-yepiaotong}/product.json +0 -0
@@ -0,0 +1,41 @@
1
+ import { fnaOperationDefinitions } from './operations/registry.js';
2
+ /**
3
+ * FNA 费控中心(齐业成)模块禁用/暂缓边界。
4
+ * 11 个源接口全部落地;以下几类能力不在本 CLI,写入 manifest 供 Agent 判断,
5
+ * 不得编造 operation 或绕过 CLI 直连接口:
6
+ * - 姓名/流程名 → employeeId/workflowId 的人员与流程解析不在本模块;
7
+ * - 借款「确认已还 confirmRepay」、核销明细等页面按钮能力未随源资料提供接口,未实现。
8
+ */
9
+ const FNA_WITHHELD = [
10
+ {
11
+ name: 'fna.loan.confirm.repay',
12
+ reason: '借款管理菜单提供「确认已还 confirmRepay」按钮,但源资料未提供其接口路径、请求方法、关键字段与确认条件,未实现;不得猜测接口。',
13
+ },
14
+ {
15
+ name: 'fna.resolve.person.workflow',
16
+ reason: '姓名→employeeId、流程名→workflowId 的解析依赖人员/流程基表接口,源资料未提供;需要时请使用已提供的 ID 或由用户在对话中提供。',
17
+ },
18
+ ];
19
+ function buildOperations() {
20
+ return fnaOperationDefinitions().map((definition) => ({
21
+ name: definition.name,
22
+ resource: definition.resource,
23
+ summary: definition.summary,
24
+ ...(definition.capability ? { capability: definition.capability } : {}),
25
+ risk: definition.risk,
26
+ ...(definition.requiresConfirmation ? { requiresConfirmation: true } : {}),
27
+ inputSchema: definition.inputSchema,
28
+ }));
29
+ }
30
+ export const fnaManifest = {
31
+ schemaVersion: 1,
32
+ name: 'fna',
33
+ title: '泛微E10齐业成费控中心(预算查询/费用中心/借款管理/发票核销)',
34
+ version: '0.1.0',
35
+ host: 'e10-fna',
36
+ status: 'builtin',
37
+ sourceSkill: 'weaver-e10-qiyecheng',
38
+ capabilities: ['budget', 'expense', 'loan', 'invoice-writeoff'],
39
+ operations: buildOperations(),
40
+ withheldOperations: FNA_WITHHELD,
41
+ };
@@ -0,0 +1,124 @@
1
+ import { fnaValidationError } from '../errors.js';
2
+ import { fnaSuccess, READ, schemaOf, SCHEMA_ID, SCHEMA_INTEGER_POSITIVE } from './types.js';
3
+ import { numericId, toPositiveInt, unwrapData } from './shared.js';
4
+ /**
5
+ * 预算:事前申请单预算详情。
6
+ * GET /api/fna/expense/preApplication/getApplicationDetail?requestId=<id>(公开只读)。
7
+ * 归一化 WeaForm:申请名称/创建人/发起时间 + budgetInfo.otherParams 的预算口径。
8
+ */
9
+ const fnaBudgetApplicationDetail = {
10
+ name: 'fna.budget.application.detail',
11
+ resource: 'budget',
12
+ method: 'budget.application.detail',
13
+ action: 'fna.budget.application.detail',
14
+ summary: '事前申请单预算详情:按 requestId 返回申请名称、创建人、发起时间与预算口径(总额/已报销/报销中/剩余可用/已释放),并附原始表单 items',
15
+ capability: 'budget',
16
+ risk: READ,
17
+ inputSchema: schemaOf({ requestId: { ...SCHEMA_ID, description: '事前申请单 ID(必填)' } }, { required: ['requestId'], description: '预算:事前申请单预算详情' }),
18
+ handler: async (args, { host }) => {
19
+ const requestId = numericId(args.requestId, 'requestId');
20
+ if (requestId === undefined) {
21
+ throw fnaValidationError('request_id_required', 'requestId 必填(事前申请单 ID)');
22
+ }
23
+ const response = await host.request({
24
+ method: 'GET',
25
+ path: '/api/fna/expense/preApplication/getApplicationDetail',
26
+ query: { requestId },
27
+ });
28
+ const form = unwrapData(response);
29
+ const items = form?.items ?? {};
30
+ const budgetInfo = items.budgetInfo?.otherParams ?? {};
31
+ const budget = {
32
+ totalAmount: budgetInfo.budgeteTotalAmount ?? 0,
33
+ reimbursedFee: budgetInfo.reimbursedFee ?? 0,
34
+ reimbursingFee: budgetInfo.reimburserFee ?? 0,
35
+ remainingBudget: budgetInfo.remainingBudgete ?? 0,
36
+ releasedBudgetAmount: budgetInfo.releasedBudgetAmount ?? 0,
37
+ isDisplay: budgetInfo.isDisplay ?? false,
38
+ };
39
+ const detail = {
40
+ requestId: String(requestId),
41
+ requestName: items.requestName?.value ?? '',
42
+ createPerson: items.createPerson?.value ?? '',
43
+ createPersonUserId: items.createPerson?.otherParams?.userId ?? '',
44
+ createTime: items.createTime?.value ?? '',
45
+ budget,
46
+ consistencyHint: '预算总额 = 已报销 + 报销中 + 剩余可用 + 已释放;若不等,数据可能未刷新或存在并发在途变更',
47
+ };
48
+ return fnaSuccess('fna.budget.application.detail', detail, { rawForm: form });
49
+ },
50
+ };
51
+ /**
52
+ * 预算:预算执行报表查询。
53
+ * POST /api/fna/execute/getExecuteListByAi(公开只读)。返回 WeaTable 分页表 + 合计。
54
+ */
55
+ const fnaBudgetExecuteList = {
56
+ name: 'fna.budget.execute.list',
57
+ resource: 'budget',
58
+ method: 'budget.execute.list',
59
+ action: 'fna.budget.execute.list',
60
+ summary: '预算执行报表:按预算模板 + 维度/期间筛选,返回分页明细行与 customParameters 合计(budget_sumAmount 前缀),仅列明当前模板可用的维度 key',
61
+ capability: 'budget',
62
+ risk: READ,
63
+ inputSchema: schemaOf({
64
+ current: { ...SCHEMA_INTEGER_POSITIVE, description: '当前页码(必填,从 1 开始)' },
65
+ pageSize: { ...SCHEMA_INTEGER_POSITIVE, description: '每页条数(必填)' },
66
+ templateId: { ...SCHEMA_ID, description: '预算模板 ID;为空只返回表头' },
67
+ formDatas: {
68
+ type: 'object',
69
+ description: '维度/期间筛选,value 为「单元素数组包裹同名 key 数组」的二层嵌套;periodName 传金额列名 budget_amount1~12,dimenMem1 等维度 key 由模板 corrColumn 决定',
70
+ },
71
+ type: { type: 'string', enum: ['and', 'or'], description: '筛选关联方式' },
72
+ departmentFlag: { type: 'string', description: '部门标识' },
73
+ exportType: { type: 'string', description: '导出类型' },
74
+ ignoreReportPower: { type: 'boolean', description: '是否忽略报表权限校验(仅内部/管理员)' },
75
+ }, {
76
+ required: ['current', 'pageSize'],
77
+ description: '预算:预算执行报表查询(模板 + 维度 + 期间)',
78
+ }),
79
+ handler: async (args, { host }) => {
80
+ const current = toPositiveInt(args.current, 'current');
81
+ const pageSize = toPositiveInt(args.pageSize, 'pageSize');
82
+ if (current === undefined)
83
+ throw fnaValidationError('current_required', 'current 必填(正整数页码)');
84
+ if (pageSize === undefined)
85
+ throw fnaValidationError('page_size_required', 'pageSize 必填(正整数每页条数)');
86
+ const body = { current, pageSize };
87
+ if (args.templateId !== undefined)
88
+ body.templateId = numericId(args.templateId, 'templateId');
89
+ if (args.formDatas !== undefined)
90
+ body.formDatas = args.formDatas;
91
+ if (args.type !== undefined)
92
+ body.type = args.type;
93
+ if (args.departmentFlag !== undefined)
94
+ body.departmentFlag = args.departmentFlag;
95
+ if (args.exportType !== undefined)
96
+ body.exportType = args.exportType;
97
+ if (args.ignoreReportPower !== undefined)
98
+ body.ignoreReportPower = args.ignoreReportPower;
99
+ const response = await host.request({
100
+ method: 'POST',
101
+ path: '/api/fna/execute/getExecuteListByAi',
102
+ body,
103
+ });
104
+ const table = unwrapData(response);
105
+ const result = {
106
+ pageUid: table?.pageUid ?? 'FnaBudgetExecuteList',
107
+ total: table?.total ?? 0,
108
+ current: table?.current ?? current,
109
+ pageSize: table?.pageSize ?? pageSize,
110
+ hasMore: table?.hasMore ?? false,
111
+ periodFlag: table?.periodFlag ?? false,
112
+ columns: table?.columns ?? [],
113
+ rows: Array.isArray(table?.data) ? table.data : [],
114
+ totals: table?.customParameters ?? {},
115
+ };
116
+ return fnaSuccess('fna.budget.execute.list', result, {
117
+ hint: 'templateId 为空时仅返回表头列定义(正常行为);汇总问题优先读 totals 中 budget_sumAmount 前缀字段;金额/比率为字符串需转数值并去 %',
118
+ });
119
+ },
120
+ };
121
+ export const budgetOperations = [
122
+ fnaBudgetApplicationDetail,
123
+ fnaBudgetExecuteList,
124
+ ];
@@ -0,0 +1,148 @@
1
+ import { fnaSuccess, READ, schemaOf, SCHEMA_DATE, SCHEMA_ID } from './types.js';
2
+ import { assertDateRange, numericId } from './shared.js';
3
+ /** SumAmountByAiVo 共用字段(body 可为空,默认当前登录人)。 */
4
+ const SUM_AMOUNT_PROPERTIES = {
5
+ employeeId: { ...SCHEMA_ID, description: '员工 ID(数字);为空默认当前登录人' },
6
+ startDate: { ...SCHEMA_DATE, description: '开始日期 YYYY-MM-DD(闭区间)' },
7
+ endDate: { ...SCHEMA_DATE, description: '结束日期 YYYY-MM-DD(闭区间)' },
8
+ workflowId: { ...SCHEMA_ID, description: '流程类型 ID(数字)' },
9
+ requestId: { ...SCHEMA_ID, description: '流程实例 ID(数字)' },
10
+ };
11
+ function sleep(ms) {
12
+ return new Promise((resolve) => {
13
+ setTimeout(resolve, ms);
14
+ });
15
+ }
16
+ /**
17
+ * 归一化 SumAmountByAiVo 输入:日期成对校验;ID 类字段数字优先(借款接口只认数字,
18
+ * 传字符串会静默返回空 data);仅输出已提供的字段。
19
+ */
20
+ function sumAmountBody(args) {
21
+ const range = assertDateRange(args, 'startDate', 'endDate');
22
+ const body = {};
23
+ const employeeId = numericId(args.employeeId, 'employeeId');
24
+ const workflowId = numericId(args.workflowId, 'workflowId');
25
+ const requestId = numericId(args.requestId, 'requestId');
26
+ if (employeeId !== undefined)
27
+ body.employeeId = employeeId;
28
+ if (range.start !== undefined)
29
+ body.startDate = range.start;
30
+ if (range.end !== undefined)
31
+ body.endDate = range.end;
32
+ if (workflowId !== undefined)
33
+ body.workflowId = workflowId;
34
+ if (requestId !== undefined)
35
+ body.requestId = requestId;
36
+ return body;
37
+ }
38
+ /** 判断响应对象是否真的带 data 键(用于区分「无记录 data:null」与「瞬时空响应缺 data」)。 */
39
+ function hasDataKey(value) {
40
+ return Boolean(value && typeof value === 'object' && Object.prototype.hasOwnProperty.call(value, 'data'));
41
+ }
42
+ /**
43
+ * 费用中心:报销金额合计(只读)。
44
+ * POST /api/fna/expense/center/getSumReimbursedAmountByAi
45
+ * 口径:明细状态 status=1(审批完成)的 reimburse_amount 合计 = 已报销金额;无数据返回 0.0。
46
+ */
47
+ const fnaExpenseReimbursedSum = {
48
+ name: 'fna.expense.reimbursed.sum',
49
+ resource: 'expense',
50
+ method: 'expense.reimbursed.sum',
51
+ action: 'fna.expense.reimbursed.sum',
52
+ summary: '报销金额合计(已报销口径,审批完成明细合计):按员工/日期/流程过滤,返回金额(元)与口径说明',
53
+ capability: 'expense',
54
+ risk: READ,
55
+ inputSchema: schemaOf(SUM_AMOUNT_PROPERTIES, { description: '费用中心:报销金额合计(body 可为空,默认当前登录人)' }),
56
+ handler: async (args, { host }) => {
57
+ const response = await host.request({
58
+ method: 'POST',
59
+ path: '/api/fna/expense/center/getSumReimbursedAmountByAi',
60
+ body: sumAmountBody(args),
61
+ });
62
+ const amount = response?.data ?? 0.0;
63
+ return fnaSuccess('fna.expense.reimbursed.sum', {
64
+ amount,
65
+ currency: 'CNY',
66
+ note: '已报销口径:审批完成(明细状态 status=1)明细的 reimburse_amount 合计;无匹配数据返回 0.0',
67
+ });
68
+ },
69
+ };
70
+ /**
71
+ * 费用中心:借款金额分段汇总(只读)。
72
+ * POST /api/fna/expense/center/getSumLoanAmountByAi
73
+ * ⚠️ 服务端实现缺陷:只统计首条借款记录;且首次/冷启动可能瞬时返回缺 data 的空响应(自动重试最多 2 次)。
74
+ */
75
+ const fnaExpenseLoanSum = {
76
+ name: 'fna.expense.loan.sum',
77
+ resource: 'expense',
78
+ method: 'expense.loan.sum',
79
+ action: 'fna.expense.loan.sum',
80
+ summary: '借款金额分段汇总(待还款 dhk/还款中 hkz/已还款 yhk/借款总额 jk,含笔数):注意服务端只统计首条借款记录的已知缺陷',
81
+ capability: 'expense',
82
+ risk: READ,
83
+ inputSchema: schemaOf(SUM_AMOUNT_PROPERTIES, { description: '费用中心:借款金额分段汇总(body 可为空,默认当前登录人)' }),
84
+ handler: async (args, { host }) => {
85
+ const body = sumAmountBody(args);
86
+ let response;
87
+ let attempts = 0;
88
+ // 借款接口存在冷启动/缓存导致 data 键缺省的空响应:先重试 2 次再下结论。
89
+ for (;;) {
90
+ response = await host.request({
91
+ method: 'POST',
92
+ path: '/api/fna/expense/center/getSumLoanAmountByAi',
93
+ body,
94
+ });
95
+ if (hasDataKey(response) || attempts >= 2)
96
+ break;
97
+ attempts += 1;
98
+ await sleep(150);
99
+ }
100
+ if (!hasDataKey(response)) {
101
+ return fnaSuccess('fna.expense.loan.sum', { segments: null }, {
102
+ note: '连续 3 次请求均未返回 data,按「暂无借款记录」处理;若确有借款,可稍后重试',
103
+ });
104
+ }
105
+ const segments = response.data;
106
+ return fnaSuccess('fna.expense.loan.sum', {
107
+ segments,
108
+ note: '该借款接口仅统计首条借款记录(for 循环内 return),金额/笔数可能不全,待开发修复;展示与回传以 key(dhk/hkz/yhk/jk)为准,不依赖 costType 文案',
109
+ });
110
+ },
111
+ };
112
+ /**
113
+ * 费用中心:预付核销金额(只读)。
114
+ * POST /api/fna/expense/center/selectPrepayWriteOffAmountBySkill
115
+ * data: payment_amount(预付金额)/writeOffing(核销中)/writeOffed(已核销)/noArrivedAmount(未到账),无数据兜底 0。
116
+ */
117
+ const fnaExpensePrepayWriteOffSum = {
118
+ name: 'fna.expense.prepay.writeoff.sum',
119
+ resource: 'expense',
120
+ method: 'expense.prepay.writeoff.sum',
121
+ action: 'fna.expense.prepay.writeoff.sum',
122
+ summary: '预付核销金额汇总(对公支付预付单):预付金额/核销中/已核销/未到账合计,按创建人/日期/流程过滤',
123
+ capability: 'expense',
124
+ risk: READ,
125
+ inputSchema: schemaOf(SUM_AMOUNT_PROPERTIES, { description: '费用中心:预付核销金额汇总(body 可为空,默认当前登录人)' }),
126
+ handler: async (args, { host }) => {
127
+ const response = await host.request({
128
+ method: 'POST',
129
+ path: '/api/fna/expense/center/selectPrepayWriteOffAmountBySkill',
130
+ body: sumAmountBody(args),
131
+ });
132
+ const value = response?.data ?? {};
133
+ const result = {
134
+ paymentAmount: value.payment_amount ?? 0,
135
+ writeOffing: value.writeOffing ?? 0,
136
+ writeOffed: value.writeOffed ?? 0,
137
+ noArrivedAmount: value.noArrivedAmount ?? 0,
138
+ note: '口径:employeeId 匹配预付单创建人;日期按核销记录创建时间过滤;未到账 = 预付金额 − 已到账 − 已核销;无匹配数据兜底 0',
139
+ };
140
+ return fnaSuccess('fna.expense.prepay.writeoff.sum', result);
141
+ },
142
+ };
143
+ export const expenseCenterOperations = [
144
+ fnaExpenseReimbursedSum,
145
+ fnaExpenseLoanSum,
146
+ fnaExpensePrepayWriteOffSum,
147
+ ];
148
+ export { sumAmountBody, hasDataKey };
@@ -0,0 +1,212 @@
1
+ import { fnaPartialError, fnaValidationError, isFnaNetworkError } from '../errors.js';
2
+ import { fnaSuccess, READ, schemaOf, SCHEMA_INTEGER_POSITIVE, WRITE } from './types.js';
3
+ import { compact, fingerprint, normalizeWeaTable, requireConfirm, requireRequestIds, toPositiveInt, unwrapData, verifyLease } from './shared.js';
4
+ const CONTINUATION_TTL_SECONDS = 600;
5
+ /** 发票核销公开字段(InvWriteOffSearchVo 非分页部分)。 */
6
+ const WRITE_OFF_FILTER_FIELDS = {
7
+ invoiceStatus: {
8
+ type: 'string',
9
+ enum: ['unWritten', 'unarrivedTicket', 'dealing', 'callTicket'],
10
+ description: '发票状态过滤:unWritten 未核销 / unarrivedTicket 未到票 / dealing 核销中 / callTicket 催票',
11
+ },
12
+ type: { type: 'string', description: '类型,默认 1' },
13
+ departmentId: { type: 'string', description: '部门 ID,为空查全部' },
14
+ menuCode: { type: 'string', description: '菜单编码,如 inv_write_off_financial(与环境核对)' },
15
+ permissionSetCode: { type: 'string', description: '权限集编码,如 inv_write_off_financial.default(与环境核对)' },
16
+ dataSource: { type: 'string', description: '数据来源' },
17
+ cfgType: { type: 'string', description: '配置类型' },
18
+ dataStatisticCfgId: { type: 'string', description: '数据统计配置 ID' },
19
+ requestId: { type: 'string', description: '流程请求 ID' },
20
+ };
21
+ /**
22
+ * 发票核销:金额 tab 汇总(财务/管理员,只读,公开权限)。
23
+ * POST /api/fna/expense/inv/financial/writeOffPageTab
24
+ * data: whx 未核销 / hxz 核销中 / bfhx 部分核销 / wqhx 完全核销(amount 格式化字符串 + count)。
25
+ */
26
+ const fnaInvoiceWriteOffTab = {
27
+ name: 'fna.invoice.writeoff.summary',
28
+ resource: 'invoice-writeoff',
29
+ method: 'invoice.writeoff.summary',
30
+ action: 'fna.invoice.writeoff.summary',
31
+ summary: '发票核销金额 tab 汇总(未核销/核销中/部分核销/完全核销的金额与笔数,财务/管理员)',
32
+ capability: 'invoice-writeoff',
33
+ risk: READ,
34
+ inputSchema: schemaOf(WRITE_OFF_FILTER_FIELDS, { description: '发票核销:金额 tab 汇总(可传 invoiceStatus 过滤,不分页)' }),
35
+ handler: async (args, { host }) => {
36
+ const body = compact({
37
+ invoiceStatus: args.invoiceStatus,
38
+ type: args.type,
39
+ departmentId: args.departmentId,
40
+ menuCode: args.menuCode,
41
+ permissionSetCode: args.permissionSetCode,
42
+ dataSource: args.dataSource,
43
+ cfgType: args.cfgType,
44
+ dataStatisticCfgId: args.dataStatisticCfgId,
45
+ requestId: args.requestId,
46
+ });
47
+ const response = await host.request({
48
+ method: 'POST',
49
+ path: '/api/fna/expense/inv/financial/writeOffPageTab',
50
+ body,
51
+ });
52
+ const data = unwrapData(response);
53
+ return fnaSuccess('fna.invoice.writeoff.summary', {
54
+ whx: data?.whx ?? null,
55
+ hxz: data?.hxz ?? null,
56
+ bfhx: data?.bfhx ?? null,
57
+ wqhx: data?.wqhx ?? null,
58
+ note: 'amount 为格式化字符串(元);menuCode/permissionSetCode 环境相关,示例值需与环境核对',
59
+ });
60
+ },
61
+ };
62
+ /**
63
+ * 发票核销:核销列表(财务/管理员,只读)。
64
+ * POST /api/fna/expense/inv/financial/writeOffList
65
+ * 必填 current/pageSize;催票用返回行的 requestId 组装 fna.invoice.writeoff.callticket.prepare。
66
+ */
67
+ const fnaInvoiceWriteOffList = {
68
+ name: 'fna.invoice.writeoff.list',
69
+ resource: 'invoice-writeoff',
70
+ method: 'invoice.writeoff.list',
71
+ action: 'fna.invoice.writeoff.list',
72
+ summary: '发票核销列表(分页,财务/管理员):返回核销单行(requestId/id 可用于催票)',
73
+ capability: 'invoice-writeoff',
74
+ risk: READ,
75
+ inputSchema: schemaOf({
76
+ current: { ...SCHEMA_INTEGER_POSITIVE, description: '当前页码(必填)' },
77
+ pageSize: { ...SCHEMA_INTEGER_POSITIVE, description: '每页条数(必填)' },
78
+ ...WRITE_OFF_FILTER_FIELDS,
79
+ quickSearchDatas: { type: 'object', description: '快捷搜索数据' },
80
+ formDatas: { type: 'object', description: '表单搜索数据' },
81
+ }, { required: ['current', 'pageSize'], description: '发票核销:核销列表' }),
82
+ handler: async (args, { host }) => {
83
+ const current = toPositiveInt(args.current, 'current');
84
+ const pageSize = toPositiveInt(args.pageSize, 'pageSize');
85
+ if (current === undefined)
86
+ throw fnaValidationError('current_required', 'current 必填(正整数页码)');
87
+ if (pageSize === undefined)
88
+ throw fnaValidationError('page_size_required', 'pageSize 必填(正整数每页条数)');
89
+ const body = compact({
90
+ current,
91
+ pageSize,
92
+ invoiceStatus: args.invoiceStatus,
93
+ type: args.type,
94
+ departmentId: args.departmentId,
95
+ menuCode: args.menuCode,
96
+ permissionSetCode: args.permissionSetCode,
97
+ dataSource: args.dataSource,
98
+ quickSearchDatas: args.quickSearchDatas,
99
+ formDatas: args.formDatas,
100
+ cfgType: args.cfgType,
101
+ dataStatisticCfgId: args.dataStatisticCfgId,
102
+ requestId: args.requestId,
103
+ });
104
+ const response = await host.request({
105
+ method: 'POST',
106
+ path: '/api/fna/expense/inv/financial/writeOffList',
107
+ body,
108
+ });
109
+ const table = normalizeWeaTable(unwrapData(response), { current, pageSize });
110
+ return fnaSuccess('fna.invoice.writeoff.list', table, {
111
+ hint: '催票请取 rows 行的 requestId(或 id)组装 requestids 传给 fna.invoice.writeoff.callticket.prepare;金额字段为格式化字符串(元)',
112
+ });
113
+ },
114
+ };
115
+ /**
116
+ * 发票核销:催票 prepare(写操作)。
117
+ * 本地校验 requestids 并生成预览(条数 + 前若干 ID)与 continuation,不发送催票。
118
+ */
119
+ const fnaInvoiceCallTicketPrepare = {
120
+ name: 'fna.invoice.writeoff.callticket.prepare',
121
+ resource: 'invoice-writeoff',
122
+ method: 'invoice.writeoff.callticket.prepare',
123
+ action: 'fna.invoice.writeoff.callticket.prepare',
124
+ summary: '催票(准备):传入 writeOffList 行的 requestId 列表,校验并生成预览与 continuation,不发送催票',
125
+ capability: 'invoice-writeoff',
126
+ risk: WRITE,
127
+ requiresConfirmation: true,
128
+ inputSchema: schemaOf({
129
+ requestids: {
130
+ type: 'array',
131
+ items: { type: 'string', pattern: '^\\d+$' },
132
+ minItems: 1,
133
+ description: '流程请求 ID 列表(writeOffList 返回行的 requestId / id,最多 200 条)',
134
+ },
135
+ }, { required: ['requestids'], description: '发票核销:催票(准备)' }),
136
+ handler: async (args, { host, continuation }) => {
137
+ const requestids = requireRequestIds(args.requestids);
138
+ const session = await host.getSession();
139
+ const token = await continuation.issue({
140
+ operation: 'fna.invoice.writeoff.callticket.apply',
141
+ baseUrl: session.baseUrl,
142
+ profile: session.profile,
143
+ userId: session.userId,
144
+ fingerprint: fingerprint(requestids),
145
+ count: requestids.length,
146
+ }, CONTINUATION_TTL_SECONDS * 1000);
147
+ return fnaSuccess('fna.invoice.writeoff.callticket.prepare', {
148
+ status: 'AWAITING_CONFIRMATION',
149
+ preview: {
150
+ count: requestids.length,
151
+ ids: requestids.slice(0, 20),
152
+ action: '对以上预付流程发送催票通知',
153
+ hint: '向用户展示条数与目标流程(建议同时用 fna.invoice.writeoff.list 的行展示申请名称/未核销金额),获得明确确认后再调用 fna.invoice.writeoff.callticket.apply',
154
+ },
155
+ continuation: token,
156
+ expiresInSeconds: CONTINUATION_TTL_SECONDS,
157
+ });
158
+ },
159
+ };
160
+ /**
161
+ * 发票核销:催票 apply(写操作,需用户明确确认)。
162
+ * 校验 confirm=true 与 continuation;requestids 指纹须与 prepare 一致。
163
+ */
164
+ const fnaInvoiceCallTicketApply = {
165
+ name: 'fna.invoice.writeoff.callticket.apply',
166
+ resource: 'invoice-writeoff',
167
+ method: 'invoice.writeoff.callticket.apply',
168
+ action: 'fna.invoice.writeoff.callticket.apply',
169
+ summary: '催票(执行):需 confirm=true 与 prepare 返回的 continuation,requestids 与 prepare 一致才会发送催票',
170
+ capability: 'invoice-writeoff',
171
+ risk: WRITE,
172
+ requiresConfirmation: true,
173
+ inputSchema: schemaOf({
174
+ requestids: { type: 'array', items: { type: 'string', pattern: '^\\d+$' }, minItems: 1 },
175
+ confirm: { const: true },
176
+ continuation: { type: 'string', minLength: 1 },
177
+ }, { required: ['requestids', 'confirm', 'continuation'], description: '发票核销:催票(执行)' }),
178
+ handler: async (args, env) => {
179
+ requireConfirm(args, 'fna.invoice.writeoff.callticket.apply');
180
+ const requestids = requireRequestIds(args.requestids);
181
+ const lease = await verifyLease(args, 'fna.invoice.writeoff.callticket.apply', env);
182
+ if (fingerprint(requestids) !== lease.fingerprint || requestids.length !== lease.count) {
183
+ throw fnaValidationError('target_changed', '催票目标与 prepare 时的快照不一致,请重新执行 prepare');
184
+ }
185
+ let response;
186
+ try {
187
+ response = await env.host.request({
188
+ method: 'POST',
189
+ path: '/api/fna/expense/inv/financial/callTicket',
190
+ body: { requestids },
191
+ });
192
+ }
193
+ catch (error) {
194
+ if (isFnaNetworkError(error)) {
195
+ throw fnaPartialError('催票请求发送后连接中断,是否已发送不确定,禁止自动重试;可通过 fna.invoice.writeoff.list 回查或重新 prepare 确认', { attempted: { count: requestids.length } }, { stage: 'invoice.writeoff.callTicket' });
196
+ }
197
+ throw error;
198
+ }
199
+ const message = response?.data?.msg ?? '催票消息发送成功';
200
+ return fnaSuccess('fna.invoice.writeoff.callticket.apply', {
201
+ msg: message,
202
+ calledCount: requestids.length,
203
+ note: '本接口只发送催票通知,不改变核销金额状态',
204
+ });
205
+ },
206
+ };
207
+ export const invoiceWriteOffOperations = [
208
+ fnaInvoiceWriteOffTab,
209
+ fnaInvoiceWriteOffList,
210
+ fnaInvoiceCallTicketPrepare,
211
+ fnaInvoiceCallTicketApply,
212
+ ];