weaver-work-cli 0.1.42 → 0.1.44

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 (318) hide show
  1. package/README.md +17 -0
  2. package/dist/chunks/{archive-J4I6MCKF.js → archive-P6TBQGKL.js} +13 -5
  3. package/dist/chunks/{archive-oa-BRZKKTO4.js → archive-oa-7TQ2NXOH.js} +12 -5
  4. package/dist/chunks/{asset-L7D4FAOZ.js → asset-3ELRG37G.js} +11 -4
  5. package/dist/chunks/{asset-idle-DADLLV75.js → asset-idle-WIGMUFMD.js} +7 -3
  6. package/dist/chunks/{attachment-content-K4C7VLWQ.js → attachment-content-E3276UOV.js} +5 -4
  7. package/dist/chunks/{blog-BVGQ7NZL.js → blog-C5NMZAAC.js} +11 -4
  8. package/dist/chunks/{caizhilian-SAADNFD6.js → caizhilian-5XSM2DFP.js} +13 -6
  9. package/dist/chunks/{calendar-Q7NQY5Z2.js → calendar-FI2WNSBO.js} +12 -5
  10. package/dist/chunks/{chunk-YRSZQUD2.js → chunk-3YBDYOC4.js} +3 -3
  11. package/dist/chunks/{chunk-OOUTBLZ4.js → chunk-56EZERK4.js} +1 -1
  12. package/dist/chunks/chunk-6N4JPNFL.js +76 -0
  13. package/dist/chunks/{chunk-ZUX3P6BQ.js → chunk-727FH2NI.js} +1 -1
  14. package/dist/chunks/chunk-7BDPM5ST.js +11 -0
  15. package/dist/chunks/{chunk-EKWAQSLU.js → chunk-BCVYBYYT.js} +432 -2248
  16. package/dist/chunks/{chunk-W7BEHOSR.js → chunk-CWYGFU5B.js} +2 -2
  17. package/dist/chunks/{chunk-NOODWMCL.js → chunk-D4ADSZ7H.js} +1 -1
  18. package/dist/chunks/{chunk-SA6VBIHY.js → chunk-ETNJSKMM.js} +214 -16
  19. package/dist/chunks/{chunk-BBKDXQEC.js → chunk-F4E4EM35.js} +3 -3
  20. package/dist/chunks/{chunk-IZ7S7QUS.js → chunk-FAZTGX7S.js} +6 -6
  21. package/dist/chunks/{chunk-NKZRQXST.js → chunk-FRZKBMSW.js} +52 -36
  22. package/dist/chunks/{chunk-BYBSCN4X.js → chunk-G7PQWD4L.js} +6 -3
  23. package/dist/chunks/{chunk-GEWYMQME.js → chunk-GAMZLAG2.js} +1 -1
  24. package/dist/chunks/{chunk-R4CHUSKC.js → chunk-GM6J7Q4B.js} +4 -4
  25. package/dist/chunks/{chunk-APVFJUQH.js → chunk-GRDRG6HP.js} +3 -3
  26. package/dist/chunks/{chunk-LDZQPUIA.js → chunk-HIT4Y6OI.js} +1 -1
  27. package/dist/chunks/{chunk-EZALDOQH.js → chunk-HP7JIYMT.js} +5 -2
  28. package/dist/chunks/{chunk-LADPYOWC.js → chunk-IAZ3UPY6.js} +3 -3
  29. package/dist/chunks/{chunk-ZEDWSH32.js → chunk-IC62NFM5.js} +1 -1
  30. package/dist/chunks/{chunk-P26ZWSKU.js → chunk-KIHNAS25.js} +5 -2
  31. package/dist/chunks/{chunk-BIPYLLVS.js → chunk-N4M2DDFE.js} +15 -15
  32. package/dist/chunks/{chunk-QKNKR4RH.js → chunk-OF4S23UB.js} +4 -4
  33. package/dist/chunks/{chunk-JPRO6ER2.js → chunk-PC7VKEB5.js} +57 -60
  34. package/dist/chunks/{chunk-4PD5NWAX.js → chunk-PUQS5MWL.js} +2 -2
  35. package/dist/chunks/{chunk-2LV74IWP.js → chunk-Q4OYAQYH.js} +1 -1
  36. package/dist/chunks/{chunk-72CKAUAG.js → chunk-QVSWRLLU.js} +7 -5
  37. package/dist/chunks/{chunk-4RAE6JXP.js → chunk-TA7FXXJD.js} +6 -3
  38. package/dist/chunks/{chunk-GPMFD4RD.js → chunk-TXUG266F.js} +1 -1
  39. package/dist/chunks/{chunk-FOAA27U5.js → chunk-UFIT2UU3.js} +16 -4
  40. package/dist/chunks/{chunk-LUSPKZKY.js → chunk-UG5G54VL.js} +1 -0
  41. package/dist/chunks/{chunk-NIAJ5ZCG.js → chunk-UL5XUQ25.js} +5 -2
  42. package/dist/chunks/{chunk-FMPJJYYI.js → chunk-WRXSAVKO.js} +1 -1
  43. package/dist/chunks/{chunk-G4UR6NXN.js → chunk-WSF4NNMR.js} +3 -3
  44. package/dist/chunks/chunk-XHK4MDR5.js +2497 -0
  45. package/dist/chunks/{chunk-3KTFS4IA.js → chunk-XNIK66I4.js} +19 -9
  46. package/dist/chunks/{chunk-3SO6QL6U.js → chunk-YWX377BY.js} +5 -2
  47. package/dist/chunks/{chunk-BYATLLEF.js → chunk-Z3GDFVJR.js} +1 -1
  48. package/dist/chunks/{chunk-GHXCDPTM.js → chunk-Z7VYWPZV.js} +1 -1
  49. package/dist/chunks/{conflict-F2OMZRTO.js → conflict-ARLSZJ6V.js} +4 -3
  50. package/dist/chunks/{continuation-2CKSBLA6.js → continuation-3S37AUSH.js} +4 -3
  51. package/dist/chunks/{continuation-RN6PZN2M.js → continuation-3XLYYTKV.js} +4 -3
  52. package/dist/chunks/{continuation-HZIZRZBX.js → continuation-HFW2YT5S.js} +4 -3
  53. package/dist/chunks/{continuation-NLECEJPX.js → continuation-KI7DRRZN.js} +4 -3
  54. package/dist/chunks/{contract-5BETHRSG.js → contract-DNIIW5VJ.js} +13 -5
  55. package/dist/chunks/{cowork-3MN6EQQO.js → cowork-GMLRGVIW.js} +11 -4
  56. package/dist/chunks/{create-flow-5FQNNMVO.js → create-flow-J22BO65E.js} +8 -7
  57. package/dist/chunks/{ebuilder-form-SBHOYBUD.js → ebuilder-form-ANV2FHYV.js} +12 -7
  58. package/dist/chunks/{ehr-KMOJULKG.js → ehr-GSTGAIY3.js} +266 -24
  59. package/dist/chunks/{employee-SAK2QYXX.js → employee-22BGJ3QS.js} +3 -3
  60. package/dist/chunks/{env-LB7NBL2O.js → env-BX3VRFS7.js} +4 -3
  61. package/dist/chunks/{esb-W2PJCFCX.js → esb-ATAIASX2.js} +12 -7
  62. package/dist/chunks/{factory-6ZFQXQ46.js → factory-PETTFME6.js} +3 -2
  63. package/dist/chunks/{fna-ZQPCUV4R.js → fna-YEKBSFSX.js} +14 -8
  64. package/dist/chunks/{group-chat-2HHAJN46.js → group-chat-BFVXAYFX.js} +5 -4
  65. package/dist/chunks/{host-ATKVNZAT.js → host-HRBXEPDQ.js} +5 -5
  66. package/dist/chunks/{host-BQH22NTQ.js → host-LR55CTHP.js} +5 -5
  67. package/dist/chunks/{host-X2CSLFM6.js → host-SUOY6VYQ.js} +5 -5
  68. package/dist/chunks/{host-4CBHGOHT.js → host-SZGV4UNT.js} +5 -5
  69. package/dist/chunks/{host-YTODKMSL.js → host-WIKN2EJ5.js} +5 -5
  70. package/dist/chunks/{hrm-FFM4UJFS.js → hrm-NRDO4W5G.js} +11 -7
  71. package/dist/chunks/{im-VEHKDQPB.js → im-IQ2HN23S.js} +8 -7
  72. package/dist/chunks/{invoice-LVIKSIIF.js → invoice-MNRW76PP.js} +636 -1768
  73. package/dist/chunks/{jiuchuanhui-X6DINO5P.js → jiuchuanhui-DTRBAX4N.js} +14 -6
  74. package/dist/chunks/{lazy-dispatch-KSWTN5L6.js → lazy-dispatch-ZVWAI25B.js} +7 -6
  75. package/dist/chunks/{mail-VDKRGUD3.js → mail-ZVAUXOJA.js} +16 -14
  76. package/dist/chunks/{meeting-CLC6HP3Z.js → meeting-FEVPZ67S.js} +21 -14
  77. package/dist/chunks/{okr-CHG4OO3U.js → okr-SDH3E5RA.js} +12 -5
  78. package/dist/chunks/{operations-5QL3AECO.js → operations-62N6EP3C.js} +4 -3
  79. package/dist/chunks/{plan-XWR75667.js → plan-E35JFDI7.js} +12 -5
  80. package/dist/chunks/{project-5BXOOKMG.js → project-73QXBAB2.js} +11 -4
  81. package/dist/chunks/reception-UWZVACBN.js +1899 -0
  82. package/dist/chunks/{recruit-stage-DGMFNNDE.js → recruit-stage-4MAOCKFY.js} +320 -57
  83. package/dist/chunks/registry-IM5G23LS.js +24 -0
  84. package/dist/chunks/{registry-RHMW6ANW.js → registry-JDUS4E7D.js} +7 -6
  85. package/dist/chunks/{registry-7FFOXIAW.js → registry-KNKSCJNT.js} +7 -6
  86. package/dist/chunks/{registry-Z43434VG.js → registry-PO7SI256.js} +4 -4
  87. package/dist/chunks/{registry-OZSMDVPP.js → registry-PVUZQDDQ.js} +3 -3
  88. package/dist/chunks/{room-recommend-62H7ZQQ6.js → room-recommend-H7KLXA5R.js} +6 -5
  89. package/dist/chunks/{schedule-FNXKH3DQ.js → schedule-ESZIBAUO.js} +6 -5
  90. package/dist/chunks/{workflow-ADHKCAJK.js → workflow-CWJFJLQU.js} +13 -8
  91. package/dist/cmd/action.js +6 -0
  92. package/dist/cmd/identity/index.js +45 -0
  93. package/dist/cmd/index.js +2 -0
  94. package/dist/core/continuation-ttl.js +18 -0
  95. package/dist/core/error-codes.js +85 -0
  96. package/dist/core/logger.js +11 -0
  97. package/dist/index.js +37 -31
  98. package/dist/internal/e10/auth/commands.js +163 -8
  99. package/dist/internal/e10/auth/error-log.js +182 -0
  100. package/dist/internal/e10/auth/session.js +17 -3
  101. package/dist/internal/e10/auth-recovery.js +39 -12
  102. package/dist/internal/e10/context.js +17 -2
  103. package/dist/internal/skills/install.js +9 -1
  104. package/dist/shortcuts/archive/continuation.js +2 -1
  105. package/dist/shortcuts/archive/index.js +3 -0
  106. package/dist/shortcuts/archive/operations/confirm.js +2 -1
  107. package/dist/shortcuts/archive-oa/continuation.js +2 -1
  108. package/dist/shortcuts/archive-oa/index.js +2 -0
  109. package/dist/shortcuts/archive-oa/operations/confirm.js +2 -1
  110. package/dist/shortcuts/asset/continuation.js +2 -1
  111. package/dist/shortcuts/asset/index.js +2 -0
  112. package/dist/shortcuts/asset-idle/index.js +2 -0
  113. package/dist/shortcuts/blog/continuation.js +2 -1
  114. package/dist/shortcuts/blog/index.js +2 -0
  115. package/dist/shortcuts/caizhilian/continuation.js +2 -1
  116. package/dist/shortcuts/caizhilian/index.js +2 -0
  117. package/dist/shortcuts/caizhilian/operations/confirm.js +3 -2
  118. package/dist/shortcuts/calendar/continuation.js +2 -1
  119. package/dist/shortcuts/calendar/index.js +2 -0
  120. package/dist/shortcuts/calendar/operations/write.js +1 -1
  121. package/dist/shortcuts/contract/continuation.js +2 -1
  122. package/dist/shortcuts/contract/index.js +2 -0
  123. package/dist/shortcuts/contract/operations/write.js +2 -1
  124. package/dist/shortcuts/cowork/continuation.js +2 -1
  125. package/dist/shortcuts/cowork/index.js +2 -0
  126. package/dist/shortcuts/ebuilder-form/continuation.js +2 -1
  127. package/dist/shortcuts/ebuilder-form/index.js +2 -0
  128. package/dist/shortcuts/ebuilder-form/operations/write.js +3 -2
  129. package/dist/shortcuts/ehr/continuation.js +2 -1
  130. package/dist/shortcuts/ehr/index.js +2 -0
  131. package/dist/shortcuts/ehr/operations/attend-write.js +1 -1
  132. package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +182 -3
  133. package/dist/shortcuts/ehr/operations/recruit-position.js +134 -2
  134. package/dist/shortcuts/ehr/operations/recruit-write.js +1 -1
  135. package/dist/shortcuts/esb/continuation.js +2 -1
  136. package/dist/shortcuts/esb/index.js +2 -0
  137. package/dist/shortcuts/esb/operations/trigger.js +2 -1
  138. package/dist/shortcuts/fna/continuation.js +2 -1
  139. package/dist/shortcuts/fna/index.js +2 -0
  140. package/dist/shortcuts/fna/operations/invoice-writeoff.js +1 -1
  141. package/dist/shortcuts/fna/operations/loan.js +1 -1
  142. package/dist/shortcuts/hrm/index.js +2 -0
  143. package/dist/shortcuts/im/continuation.js +2 -1
  144. package/dist/shortcuts/index.js +5 -0
  145. package/dist/shortcuts/invoice/continuation.js +2 -1
  146. package/dist/shortcuts/invoice/index.js +14 -15
  147. package/dist/shortcuts/invoice/invoice-record.js +93 -0
  148. package/dist/shortcuts/invoice/manifest.js +190 -393
  149. package/dist/shortcuts/invoice/operations/add.js +2 -1
  150. package/dist/shortcuts/invoice/operations/delete.js +2 -1
  151. package/dist/shortcuts/invoice/operations/import.js +2 -1
  152. package/dist/shortcuts/invoice/operations/issuing-contract-detail.js +86 -0
  153. package/dist/shortcuts/invoice/operations/issuing-contracts.js +210 -0
  154. package/dist/shortcuts/invoice/operations/registry.js +17 -17
  155. package/dist/shortcuts/invoice/operations/reim-auto.js +4 -569
  156. package/dist/shortcuts/invoice/operations/reim.js +52 -341
  157. package/dist/shortcuts/invoice/operations/shared.js +21 -4
  158. package/dist/shortcuts/invoice/operations/update.js +2 -1
  159. package/dist/shortcuts/invoice/projection.js +10 -62
  160. package/dist/shortcuts/jiuchuanhui/continuation.js +2 -1
  161. package/dist/shortcuts/jiuchuanhui/index.js +2 -0
  162. package/dist/shortcuts/jiuchuanhui/operations/datajson.js +2 -1
  163. package/dist/shortcuts/jiuchuanhui/operations/esb.js +2 -1
  164. package/dist/shortcuts/mail/continuation.js +2 -1
  165. package/dist/shortcuts/mail/index.js +2 -0
  166. package/dist/shortcuts/mail/operations/mail-blacklist.js +1 -1
  167. package/dist/shortcuts/mail/operations/mail-contacts.js +1 -1
  168. package/dist/shortcuts/mail/operations/mail-send.js +1 -1
  169. package/dist/shortcuts/mail/operations/mail-sign.js +1 -1
  170. package/dist/shortcuts/mail/operations/mail-template.js +1 -1
  171. package/dist/shortcuts/meeting/continuation.js +2 -1
  172. package/dist/shortcuts/meeting/index.js +2 -0
  173. package/dist/shortcuts/meeting/operations/change.js +1 -1
  174. package/dist/shortcuts/meeting/operations/create.js +1 -1
  175. package/dist/shortcuts/meeting/operations/eb/create-flow.js +16 -7
  176. package/dist/shortcuts/meeting/operations/eb/decision.js +1 -1
  177. package/dist/shortcuts/meeting/operations/eb/factory.js +1 -1
  178. package/dist/shortcuts/meeting/operations/lifecycle.js +1 -1
  179. package/dist/shortcuts/meeting/operations/receipts.js +1 -1
  180. package/dist/shortcuts/meeting/operations/signs.js +1 -1
  181. package/dist/shortcuts/okr/continuation.js +2 -1
  182. package/dist/shortcuts/okr/index.js +2 -0
  183. package/dist/shortcuts/okr/operations/write.js +1 -1
  184. package/dist/shortcuts/plan/continuation.js +2 -1
  185. package/dist/shortcuts/plan/index.js +2 -0
  186. package/dist/shortcuts/plan/operations/write.js +1 -1
  187. package/dist/shortcuts/project/continuation.js +2 -1
  188. package/dist/shortcuts/project/index.js +2 -0
  189. package/dist/shortcuts/reception/constants.js +53 -0
  190. package/dist/shortcuts/reception/errors.js +54 -0
  191. package/dist/shortcuts/reception/host.js +125 -0
  192. package/dist/shortcuts/reception/index.js +198 -0
  193. package/dist/shortcuts/reception/manifest.js +177 -0
  194. package/dist/shortcuts/reception/operations/ask.js +71 -0
  195. package/dist/shortcuts/reception/operations/browsertool.js +58 -0
  196. package/dist/shortcuts/reception/operations/compose.js +129 -0
  197. package/dist/shortcuts/reception/operations/customparams.js +74 -0
  198. package/dist/shortcuts/reception/operations/doc.js +238 -0
  199. package/dist/shortcuts/reception/operations/docrender.js +36 -0
  200. package/dist/shortcuts/reception/operations/panels.js +179 -0
  201. package/dist/shortcuts/reception/operations/registry.js +26 -0
  202. package/dist/shortcuts/reception/operations/render-assets.js +184 -0
  203. package/dist/shortcuts/reception/operations/render.js +123 -0
  204. package/dist/shortcuts/reception/operations/runs.js +38 -0
  205. package/dist/shortcuts/reception/operations/schedule.js +127 -0
  206. package/dist/shortcuts/reception/operations/shared.js +196 -0
  207. package/dist/shortcuts/reception/operations/snapshot.js +68 -0
  208. package/dist/shortcuts/reception/operations/types.js +1 -0
  209. package/dist/shortcuts/reception/operations.js +33 -0
  210. package/dist/shortcuts/reception/upload.js +218 -0
  211. package/dist/shortcuts/recruit-stage/context.js +145 -33
  212. package/dist/shortcuts/recruit-stage/continuation.js +2 -1
  213. package/dist/shortcuts/recruit-stage/operations/jd-create.js +106 -17
  214. package/dist/shortcuts/recruit-stage/operations/resume-import.js +166 -10
  215. package/dist/shortcuts/workflow/continuation.js +2 -1
  216. package/dist/shortcuts/workflow/index.js +2 -0
  217. package/dist/shortcuts/workflow/operations/form.js +32 -8
  218. package/dist/shortcuts/workflow/operations/write.js +1 -1
  219. package/docs/_catalog.md +3 -0
  220. package/docs/agent-invoice.md +1 -1
  221. package/docs/archive-oa.md +1 -1
  222. package/docs/caizhilian.md +1 -1
  223. package/docs/calendar.md +1 -1
  224. package/docs/contract.md +1 -1
  225. package/docs/e10-auth.md +16 -0
  226. package/docs/ehr.md +2 -2
  227. package/docs/esb.md +1 -1
  228. package/docs/im.md +1 -1
  229. package/docs/invoice.md +8 -12
  230. package/docs/okr.md +1 -1
  231. package/docs/reception.md +119 -0
  232. package/package.json +1 -1
  233. package/scripts/clean.mjs +43 -2
  234. package/skill-template/business-info.json +18 -2
  235. package/skill-template/domains/caizhilian.md +1 -1
  236. package/skill-template/domains/reception-flow.md +18 -0
  237. package/skill-template/domains/yepiaotong.md +4 -7
  238. package/skills/weaver-e10-archive-oa/references/source-manifest.json +14 -14
  239. package/skills/weaver-e10-blog/references/blog-publish.md +1 -1
  240. package/skills/weaver-e10-blog/references/source-manifest.json +7 -7
  241. package/skills/weaver-e10-caizhilian/references/source-manifest.json +21 -21
  242. package/skills/weaver-e10-caizhilian/references/write-protocol.md +2 -2
  243. package/skills/weaver-e10-calendar/references/calendar-write.md +1 -1
  244. package/skills/weaver-e10-cowork/SKILL.md +1 -1
  245. package/skills/weaver-e10-ebuilder-form/SKILL.md +1 -1
  246. package/skills/weaver-e10-ebuilder-form/references/custom-api.md +1 -1
  247. package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +1 -1
  248. package/skills/weaver-e10-esb/SKILL.md +2 -2
  249. package/skills/weaver-e10-esb/references/source-manifest.json +22 -22
  250. package/skills/weaver-e10-esb/references/trigger.md +2 -2
  251. package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +1 -1
  252. package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +1 -1
  253. package/skills/weaver-e10-jinchengda/references/contract-request-write.md +1 -1
  254. package/skills/weaver-e10-jinchengda/references/source-manifest.json +29 -29
  255. package/skills/weaver-e10-jucailin/SKILL.md +1 -1
  256. package/skills/weaver-e10-jucailin/references/attend-write.md +2 -2
  257. package/skills/weaver-e10-jucailin/references/recruit-create.md +12 -3
  258. package/skills/weaver-e10-jucailin/references/recruit-write.md +1 -1
  259. package/skills/weaver-e10-meeting/SKILL.md +8 -6
  260. package/skills/weaver-e10-meeting/references/meeting-change.md +1 -1
  261. package/skills/weaver-e10-meeting/references/meeting-create.md +1 -1
  262. package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +1 -1
  263. package/skills/weaver-e10-meeting/references/meeting-verification.md +1 -1
  264. package/skills/weaver-e10-okr/references/okr-align.md +1 -1
  265. package/skills/weaver-e10-okr/references/okr-keyresult.md +1 -1
  266. package/skills/weaver-e10-okr/references/okr-write.md +1 -1
  267. package/skills/weaver-e10-okr/references/source-manifest.json +8 -8
  268. package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
  269. package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
  270. package/skills/weaver-e10-qiyecheng/references/loan-management.md +1 -1
  271. package/skills/weaver-e10-qiyecheng/references/source-manifest.json +18 -18
  272. package/skills/weaver-e10-reception-flow/SKILL.md +173 -0
  273. package/skills/weaver-e10-reception-flow/assets//350/241/214/347/250/213/345/215/225/346/250/241/346/235/277-/346/263/233/345/276/256.docx +0 -0
  274. package/skills/weaver-e10-reception-flow/data/fields-snapshot.json +213 -0
  275. package/skills/weaver-e10-reception-flow/references/browsertool.md +68 -0
  276. package/skills/weaver-e10-reception-flow/references/env-pitfalls.md +51 -0
  277. package/skills/weaver-e10-reception-flow/references/fields-snapshot.md +227 -0
  278. package/skills/weaver-e10-reception-flow/references/guide.md +179 -0
  279. package/skills/weaver-e10-reception-flow/scripts/locate.sh +14 -0
  280. package/skills/weaver-e10-reception-flow/scripts/render.py +724 -0
  281. package/skills/weaver-e10-recruit-stage/SKILL.md +9 -5
  282. package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +1 -1
  283. package/skills/weaver-e10-recruit-stage/lib/xiaoe-session.mjs +66 -0
  284. package/skills/weaver-e10-recruit-stage/references/position-templates.md +202 -0
  285. package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +22 -0
  286. package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +14 -1
  287. package/skills/weaver-e10-shared/references/e10-auth-and-session.md +6 -0
  288. package/skills/weaver-e10-shijingran/SKILL.md +5 -5
  289. package/skills/weaver-e10-shijingran/references/source-manifest.json +37 -36
  290. package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +2 -0
  291. package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
  292. package/skills/weaver-e10-workflow/references/source-manifest.json +32 -32
  293. package/skills/weaver-e10-yepiaotong/SKILL.md +19 -26
  294. package/skills/weaver-e10-yepiaotong/references/invoice-detail.md +13 -10
  295. package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +2 -0
  296. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +194 -155
  297. package/skills/weaver-e10-yepiaotong/references/invoice-output-view.md +28 -32
  298. package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +5 -1
  299. package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +8 -10
  300. package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +211 -616
  301. package/skills/weaver-e10-yepiaotong/references/reim-examples.md +149 -117
  302. package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +17 -20
  303. package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +20 -39
  304. package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +55 -22
  305. package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -17
  306. package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +88 -92
  307. package/skills/weaver-e10-yepiaotong/references/source-manifest.json +144 -354
  308. package/skills/weaver-e10-yimiaoban/SKILL.md +1 -1
  309. package/skills/weaver-e10-yimiaoban/references/msg-write.md +1 -1
  310. package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +1 -1
  311. package/skills/weaver-e10-yimiaoban/references/source-manifest.json +7 -7
  312. package/dist/chunks/chunk-TTPJJJC4.js +0 -465
  313. package/dist/chunks/registry-BKBZPBAJ.js +0 -23
  314. package/dist/shortcuts/invoice/markdown.js +0 -172
  315. package/dist/shortcuts/invoice/operations/issuing-qys.js +0 -424
  316. package/skills/weaver-e10-meeting.zip +0 -0
  317. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +0 -131
  318. package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +0 -179
@@ -1,41 +1,5 @@
1
1
  import { invoiceValidationError } from '../errors.js';
2
- import { quoteEmployeeIdsInJsonText } from './reim.js';
3
- import { asNonEmptyString, assertBusinessSuccess, objectFingerprint, optionalEpochSeconds, reqBase, workflow, } from './shared.js';
4
- /** 总部费用报销流程(实测 2026-09-14/09-21 两次 apply 成功的固化映射)。 */
5
- export const REIM_TEMPLATE_WORKFLOW_ID = '100003460000000060';
6
- /** 上述流程的显示名,用于预览时把工作流 ID 渲染成「中文(id)」。 */
7
- export const REIM_TEMPLATE_WORKFLOW_NAME = '总部费用报销';
8
- /** 费用类型(科目)默认值:日常消费。 */
9
- const DEFAULT_SUBJECT_ID = '1256664958132969489';
10
- /** 币种:人民币。 */
11
- const CNY_ID = '100001050000000001';
12
- /** 报销方式选项:银行(个人报销)。 */
13
- const BANK_OPTION_VALUE = '7';
14
- /** 明细表「相关发票」字段,用作费用明细子表的结构签名。 */
15
- const DETAIL_INVOICE_FIELD_ID = '100003720000077896';
16
- /** 明细表「费用类型(科目)」「币种」字段 ID,用于给明细行渲染中文名。 */
17
- const DETAIL_SUBJECT_FIELD_ID = '100003720000000360';
18
- const DETAIL_CURRENCY_FIELD_ID = '100003720000052200';
19
- /** 主表「报销方式」「相关客户」「合同号」字段 ID。 */
20
- const MAIN_METHOD_FIELD_ID = '100003720000000084';
21
- const MAIN_CUSTOMER_FIELD_ID = '100003720000000687';
22
- const MAIN_CONTRACT_FIELD_ID = '100003720000001376';
23
- /**
24
- * 模板固化映射自带的字典值兜底显示名。
25
- * `row-info`/`superiors` 等实时接口取到名字时优先用实时值,这里只兜实时值缺失的情况。
26
- * 这些值与 `REIM_TEMPLATE_WORKFLOW_ID` 一样是「总部费用报销」模板的固化口径,不是通用字典。
27
- */
28
- const TEMPLATE_SELECT_OPTIONS = {
29
- [MAIN_METHOD_FIELD_ID]: {
30
- '7': '银行(个人报销)',
31
- '4': '冲销借款',
32
- '6': '银行(付公司)',
33
- },
34
- };
35
- const TEMPLATE_SUBJECT_NAMES = { [DEFAULT_SUBJECT_ID]: '日常消费' };
36
- const TEMPLATE_CURRENCY_NAMES = { [CNY_ID]: '人民币' };
37
- /** 非出差场景固定使用的相关客户(见 skill 文档 Step 4.5),仅作名称兜底。 */
38
- const TEMPLATE_CUSTOMER_NAMES = { '100504500000311504': '泛微上海' };
2
+ import { isRedReversedInvoice, optionalEpochSeconds, reqBase, workflow } from './shared.js';
39
3
  const MONEY_PATTERN = /^-?\d+(?:\.\d{1,2})?$/u;
40
4
  function boundedInteger(value, name, options) {
41
5
  const parsed = value === undefined ? options.defaultValue : Number(value);
@@ -44,14 +8,6 @@ function boundedInteger(value, name, options) {
44
8
  }
45
9
  return parsed;
46
10
  }
47
- function optionalString(value, name, maxLength = 500) {
48
- if (value === undefined || value === null || value === '')
49
- return undefined;
50
- const text = asNonEmptyString(value, name);
51
- if (text.length > maxLength)
52
- throw invoiceValidationError('input_invalid', `${name} 长度不能超过 ${maxLength}`);
53
- return text;
54
- }
55
11
  function toCents(value) {
56
12
  if (value === undefined || value === null || value === '')
57
13
  return null;
@@ -82,16 +38,10 @@ function sumMoney(values) {
82
38
  }
83
39
  return { amount: centsToMoney(sum), invalid };
84
40
  }
85
- function todayInShanghai() {
86
- return new Intl.DateTimeFormat('en-CA', { timeZone: 'Asia/Shanghai' }).format(new Date());
87
- }
88
41
  function invoiceRecordId(info) {
89
42
  const raw = info.fid ?? info.id;
90
43
  return raw === undefined || raw === null ? '' : String(raw);
91
44
  }
92
- function cleanFysm(value) {
93
- return String(value ?? '').replace(/\*/g, '').trim();
94
- }
95
45
  function reimRequestNames(info) {
96
46
  const entries = info?.oreim?.list_reim;
97
47
  if (!Array.isArray(entries))
@@ -116,480 +66,12 @@ function candidateItem(info) {
116
66
  reimRequests: reimRequestNames(info),
117
67
  };
118
68
  }
119
- /** 全额红冲发票的票面状态值。 */
120
- const RED_REVERSED_STATUS = 8;
121
- /** 判断发票是否为全额红冲(`comm_info.pro.status === 8`)。 */
122
- function isRedReversedInvoice(info) {
123
- const raw = info?.comm_info?.pro?.status;
124
- const status = typeof raw === 'number' ? raw : Number(raw ?? 0);
125
- return status === RED_REVERSED_STATUS;
126
- }
127
- async function mapWithConcurrency(items, limit, fn) {
128
- const results = new Array(items.length);
129
- let cursor = 0;
130
- const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
131
- while (cursor < items.length) {
132
- const index = cursor;
133
- cursor += 1;
134
- results[index] = await fn(items[index], index);
135
- }
136
- });
137
- await Promise.all(workers);
138
- return results;
139
- }
140
- function optionalName(value) {
141
- const text = value === undefined || value === null ? '' : String(value).trim();
142
- return text || undefined;
143
- }
144
- async function fetchSuperiors(host, warnings) {
145
- const value = await host.invoiceRequest({
146
- path: '/api/inc/book/getEmployeeSuperiors',
147
- method: 'GET',
148
- rewriteJsonText: quoteEmployeeIdsInJsonText,
149
- operation: 'invoice.reim.template.build',
150
- });
151
- assertBusinessSuccess(value, 'reim_superiors_failed', '获取人员上级失败');
152
- const data = (value?.data && typeof value.data === 'object' ? value.data : value);
153
- const currentEmployeeId = String(data?.currentEmployee?.id ?? '');
154
- if (!currentEmployeeId)
155
- throw invoiceValidationError('superiors_invalid', '未取得当前人员 ID,无法组装报销单');
156
- const directId = data?.directSuperior?.id === undefined || data?.directSuperior?.id === null ? undefined : String(data.directSuperior.id);
157
- if (!directId)
158
- warnings.push('接口未返回 directSuperior(直属上级),报销人上级/承担人直接上级字段留空,需在确认时补充');
159
- const allSuperiorIds = Array.isArray(data?.allSuperiors)
160
- ? data.allSuperiors.map((item) => String(item?.id ?? '')).filter((id) => id)
161
- : [];
162
- if (!allSuperiorIds.length)
163
- warnings.push('接口未返回 allSuperiors,承担人所有上级字段留空');
164
- const allSuperiorNames = Array.isArray(data?.allSuperiors)
165
- ? data.allSuperiors.map((item) => optionalName(item?.name) ?? '').filter((name) => name)
166
- : [];
167
- return {
168
- currentEmployeeId,
169
- currentEmployeeName: optionalName(data?.currentEmployee?.name),
170
- directSuperiorId: directId,
171
- directSuperiorName: optionalName(data?.directSuperior?.name),
172
- allSuperiorIds,
173
- allSuperiorNames,
174
- };
175
- }
176
- async function resolveWorkflowId(host, input) {
177
- if (input.workflowId !== undefined) {
178
- const id = asNonEmptyString(input.workflowId, 'workflowId');
179
- return { id, name: id === REIM_TEMPLATE_WORKFLOW_ID ? REIM_TEMPLATE_WORKFLOW_NAME : undefined };
180
- }
181
- const value = await host.invoiceRequest({
182
- path: '/api/inc/book/getReimburseWorkflowByRequestIds',
183
- method: 'POST',
184
- body: { requestIds: [] },
185
- operation: 'invoice.reim.template.build',
186
- });
187
- assertBusinessSuccess(value, 'reim_workflow_resolve_failed', '解析候选报销流程失败');
188
- const data = (value?.data && typeof value.data === 'object' ? value.data : value);
189
- const candidates = Array.isArray(data?.candidateWorkflows) ? data.candidateWorkflows : [];
190
- if (candidates.length === 0)
191
- throw invoiceValidationError('workflow_unresolved', '没有可用的候选报销流程');
192
- if (candidates.length > 1) {
193
- const names = candidates.map((item) => `${item?.workFlowName ?? ''}(${item?.workFlowId ?? ''})`).join('、');
194
- throw invoiceValidationError('input_ambiguous', `候选报销流程多于一个,请显式传入 workflowId:${names}`);
195
- }
196
- const id = String(candidates[0].workFlowId);
197
- const name = optionalName(candidates[0].workFlowName)
198
- ?? (id === REIM_TEMPLATE_WORKFLOW_ID ? REIM_TEMPLATE_WORKFLOW_NAME : undefined);
199
- return { id, name };
200
- }
201
- /** 按名称在指定字段的可选项里反查 ID(`fieldRelateSearch` 只支持名称模糊匹配,不支持按 ID 反查)。 */
202
- async function searchFieldOptionId(host, workflowId, fieldId, name) {
203
- const value = await host.invoiceRequest({
204
- path: '/api/government/formStructure/fieldRelateSearch',
205
- method: 'GET',
206
- query: { keywords: name, fieldId, formModeType: 'wf', workflowId, nodeId: '100004140000000271' },
207
- operation: 'invoice.reim.template.build',
208
- });
209
- assertBusinessSuccess(value, 'reim_field_search_failed', `按名称「${name}」搜索字段可选项失败`);
210
- const items = Array.isArray(value?.data) ? value.data : [];
211
- const ids = Array.from(new Set(items.map((item) => String(item?.id ?? '')).filter((id) => Boolean(id))));
212
- if (!ids.length)
213
- throw invoiceValidationError('related_customer_unresolved', `按名称「${name}」没有搜索到相关客户,请改用 relatedCustomerId`);
214
- if (ids.length > 1) {
215
- const names = items.map((item) => `${item?.name ?? ''}(${item?.id ?? ''})`).join('、');
216
- throw invoiceValidationError('input_ambiguous', `名称「${name}」匹配到多个相关客户,请改用 relatedCustomerId:${names}`);
217
- }
218
- return ids[0];
219
- }
220
- function collectSelectOptions(raw) {
221
- const collected = {};
222
- const fields = Array.isArray(raw) ? raw : [];
223
- for (const field of fields) {
224
- const fieldId = String(field?.fieldId ?? '');
225
- const options = field?.options;
226
- if (!fieldId || !Array.isArray(options) || !options.length)
227
- continue;
228
- const map = {};
229
- for (const option of options) {
230
- const optionValue = option?.optionValue === undefined || option?.optionValue === null ? '' : String(option.optionValue);
231
- const optionName = optionalName(option?.optionName);
232
- if (optionValue && optionName)
233
- map[optionValue] = optionName;
234
- }
235
- if (Object.keys(map).length)
236
- collected[fieldId] = map;
237
- }
238
- return collected;
239
- }
240
- async function fetchStructure(host, workflowId) {
241
- const value = await host.invoiceRequest({
242
- path: '/api/inc/book/getFormStructure',
243
- method: 'GET',
244
- query: { workflowId, nodeId: '1' },
245
- operation: 'invoice.reim.template.build',
246
- });
247
- assertBusinessSuccess(value, 'reim_structure_failed', '获取报销表单结构失败');
248
- const data = (value?.data && typeof value.data === 'object' ? value.data : value);
249
- const mainFormId = String(data?.mainFormId ?? '');
250
- if (!mainFormId)
251
- throw invoiceValidationError('structure_invalid', '表单结构缺少 mainFormId');
252
- const subTables = Array.isArray(data?.subTables) ? data.subTables : [];
253
- const byName = subTables.find((table) => String(table?.subFormName ?? '').includes('费用明细'));
254
- const bySignature = subTables.find((table) => Array.isArray(table?.subFields)
255
- && table.subFields.some((field) => String(field?.fieldId ?? '') === DETAIL_INVOICE_FIELD_ID));
256
- const target = byName || bySignature;
257
- if (!target) {
258
- const names = subTables.map((table) => String(table?.subFormName ?? '')).filter(Boolean).join('、');
259
- throw invoiceValidationError('structure_invalid', `表单结构中没有可识别的费用明细子表(现有子表:${names || '无'})`);
260
- }
261
- const selectOptions = {
262
- ...TEMPLATE_SELECT_OPTIONS,
263
- ...collectSelectOptions(data?.mainFields),
264
- };
265
- for (const table of subTables) {
266
- Object.assign(selectOptions, collectSelectOptions(table?.subFields));
267
- }
268
- return {
269
- mainFormId,
270
- detailSubFormId: String(target.subFormId),
271
- detailSubFormName: String(target.subFormName ?? ''),
272
- selectOptions,
273
- };
274
- }
275
- async function fetchInvoiceInfos(host, invoiceIds) {
276
- const value = await host.invoiceRequest({
277
- path: '/api/inc/get',
278
- method: 'POST',
279
- body: { ids: invoiceIds, mask: 0, userFlag: '1', isDelFlag: '1', req_base: reqBase() },
280
- operation: 'invoice.reim.template.build',
281
- });
282
- assertBusinessSuccess(value, 'invoice_detail_failed', '获取发票详情失败');
283
- const infos = Array.isArray(value?.infos) ? value.infos : [];
284
- const byId = new Map();
285
- for (const entry of infos) {
286
- if (entry?.ret?.ret !== 0 || !entry.info)
287
- continue;
288
- byId.set(invoiceRecordId(entry.info), entry.info);
289
- }
290
- const missing = invoiceIds.filter((id) => !byId.has(id));
291
- if (missing.length) {
292
- throw invoiceValidationError('invoice_not_found', `以下发票未找到或无权查看:${missing.join('、')}`);
293
- }
294
- return byId;
295
- }
296
- async function fetchRowInfo(host, userId, invoiceId) {
297
- const value = await host.invoiceFormRequest({
298
- path: '/api/secondev/fna/expense/dataInfo/getRowInfo',
299
- method: 'POST',
300
- query: { sf_request_type: 'fetch' },
301
- fields: { cdzt: userId, requestid: '', invoiceId },
302
- operation: 'invoice.reim.template.build',
303
- });
304
- assertBusinessSuccess(value, 'reim_row_info_failed', `获取发票 ${invoiceId} 行预填失败`);
305
- return (value?.data && typeof value.data === 'object' ? value.data : value);
306
- }
307
- function detailField(fieldId, fieldName, value) {
308
- return { fieldId, fieldName, value };
309
- }
310
- function mainField(fieldId, fieldName, value, optionValue) {
311
- return optionValue !== undefined
312
- ? { fieldId, fieldName, optionValue }
313
- : { fieldId, fieldName, value };
314
- }
315
- /** 把单个 ID 渲染成「中文(id)」;没有中文名时原样返回 ID,绝不编造。 */
316
- function renderIdWithName(id, names) {
317
- const text = id === undefined || id === null ? '' : String(id).trim();
318
- if (!text)
319
- return '';
320
- const name = names[text];
321
- return name ? `${name}(${text})` : text;
322
- }
323
- /** 渲染逗号分隔的 ID 串(如「承担人所有上级」),逐项带中文名。 */
324
- function renderIdList(value, names) {
325
- const text = value === undefined || value === null ? '' : String(value);
326
- if (!text)
327
- return '';
328
- const parts = text.split(',').map((part) => part.trim()).filter(Boolean);
329
- if (parts.length <= 1)
330
- return renderIdWithName(text, names);
331
- return parts.map((part) => renderIdWithName(part, names)).join(', ');
332
- }
333
- /** 生成主表字段的可读文本,供预览直接展示,避免调用方看到裸 ID。 */
334
- function renderMainFieldView(field, dictionaries) {
335
- if (field.optionValue !== undefined) {
336
- const optionValue = String(field.optionValue);
337
- const optionName = dictionaries.selectOptions[field.fieldId]?.[optionValue];
338
- return {
339
- fieldId: field.fieldId,
340
- fieldName: field.fieldName,
341
- optionValue,
342
- text: optionName ? `${optionName}(optionValue=${optionValue})` : `optionValue=${optionValue}`,
343
- };
344
- }
345
- const value = field.value === undefined || field.value === null ? '' : String(field.value);
346
- if (dictionaries.employees[value]) {
347
- return { fieldId: field.fieldId, fieldName: field.fieldName, value, text: `${dictionaries.employees[value]}(${value})` };
348
- }
349
- if (dictionaries.customers[value]) {
350
- return { fieldId: field.fieldId, fieldName: field.fieldName, value, text: `${dictionaries.customers[value]}(${value})` };
351
- }
352
- if (value.includes(',') && value.split(',').every((part) => dictionaries.employees[part.trim()])) {
353
- return { fieldId: field.fieldId, fieldName: field.fieldName, value, text: renderIdList(value, dictionaries.employees) };
354
- }
355
- return { fieldId: field.fieldId, fieldName: field.fieldName, value, text: value };
356
- }
357
- export async function buildReimCreatePayload(input, host, operationName) {
358
- const invoiceIdsRaw = input.invoiceIds;
359
- if (invoiceIdsRaw === undefined && input.invoiceId !== undefined) {
360
- input.invoiceIds = [input.invoiceId];
361
- }
362
- if (!Array.isArray(input.invoiceIds) || input.invoiceIds.length === 0) {
363
- throw invoiceValidationError('input_invalid', 'invoiceIds 必须是非空数组');
364
- }
365
- if (input.invoiceIds.length > 100)
366
- throw invoiceValidationError('input_invalid', 'invoiceIds 单次最多 100 张');
367
- const invoiceIds = input.invoiceIds.map((id, index) => {
368
- const text = String(id ?? '').trim();
369
- if (!/^[1-9]\d*$/.test(text))
370
- throw invoiceValidationError('input_invalid', `invoiceIds[${index}] 必须是正整数 ID`);
371
- return text;
372
- });
373
- if (new Set(invoiceIds).size !== invoiceIds.length) {
374
- throw invoiceValidationError('input_invalid', 'invoiceIds 不能包含重复 ID');
375
- }
376
- const requestName = optionalString(input.requestName, 'requestName', 100);
377
- if (!requestName)
378
- throw invoiceValidationError('input_invalid', 'requestName 必填');
379
- const reason = optionalString(input.reason, 'reason');
380
- let relatedCustomerId = optionalString(input.relatedCustomerId, 'relatedCustomerId', 32);
381
- const relatedCustomerNameInput = optionalString(input.relatedCustomerName, 'relatedCustomerName', 200);
382
- const contractNoInput = optionalString(input.contractNo, 'contractNo', 100);
383
- const contractNo = contractNoInput ?? '20260999';
384
- const warnings = [];
385
- const session = await host.getSession();
386
- const superiors = await fetchSuperiors(host, warnings);
387
- const workflowRef = await resolveWorkflowId(host, input);
388
- const workflowId = workflowRef.id;
389
- const structure = await fetchStructure(host, workflowId);
390
- const invoices = await fetchInvoiceInfos(host, invoiceIds);
391
- // 相关客户:只给名称时反查 ID;ID 与名称都给时不额外调接口。
392
- if (!relatedCustomerId && relatedCustomerNameInput) {
393
- relatedCustomerId = await searchFieldOptionId(host, workflowId, MAIN_CUSTOMER_FIELD_ID, relatedCustomerNameInput);
394
- }
395
- for (const id of invoiceIds) {
396
- const info = invoices.get(id);
397
- const number = String(info.number ?? id);
398
- const status = Number(info?.comm_info?.pro?.status ?? 0);
399
- if (status === 8) {
400
- throw invoiceValidationError('invoice_not_reimbursable', `发票 ${number} 已全额红冲(status=8),不能用于报销`);
401
- }
402
- const assigned = reimRequestNames(info);
403
- if (assigned.length) {
404
- warnings.push(`发票 ${number} 已挂在报销单:${assigned.join('、')},继续组装存在重复报销风险`);
405
- }
406
- if (!MONEY_PATTERN.test(String(info?.comm_info?.price?.total ?? ''))) {
407
- throw invoiceValidationError('invoice_total_invalid', `发票 ${number} 的票面金额缺失或格式异常`);
408
- }
409
- }
410
- const rowInfos = await mapWithConcurrency(invoiceIds, 4, async (id, index) => {
411
- try {
412
- return await fetchRowInfo(host, session.userId, id);
413
- }
414
- catch (error) {
415
- warnings.push(`发票 ${String(invoices.get(id)?.number ?? id)} 行预填获取失败(第 ${index + 1} 行按票面兜底)`);
416
- return {};
417
- }
418
- });
419
- // 每行的字典值(费用科目 / 币种 / 说明)来自 row-info 实时返回;取不到中文名时退回模板固化值。
420
- const rowMeta = invoiceIds.map((id, index) => {
421
- const info = invoices.get(id);
422
- const rowInfo = rowInfos[index] || {};
423
- const subjectId = String(rowInfo.subjectId || DEFAULT_SUBJECT_ID);
424
- const currencyEntry = Array.isArray(rowInfo.bz) ? rowInfo.bz[0] : undefined;
425
- const currencyId = String(currencyEntry?.id ?? CNY_ID);
426
- return {
427
- invoiceId: id,
428
- invoiceNumber: String(info?.number ?? ''),
429
- subjectId,
430
- subjectName: optionalName(rowInfo.subjectName) ?? TEMPLATE_SUBJECT_NAMES[subjectId],
431
- currencyId,
432
- currencyName: optionalName(currencyEntry?.name) ?? TEMPLATE_CURRENCY_NAMES[currencyId],
433
- expenseNote: cleanFysm(rowInfo.fysm),
434
- };
435
- });
436
- const detailRows = invoiceIds.map((id, index) => {
437
- const info = invoices.get(id);
438
- const rowInfo = rowInfos[index] || {};
439
- const pro = info?.comm_info?.pro || {};
440
- const total = String(info?.comm_info?.price?.total ?? '');
441
- return {
442
- dataIndex: index + 1,
443
- subFormId: structure.detailSubFormId,
444
- invoiceId: id,
445
- fields: [
446
- detailField('100003720000000419', '费用日期', String(rowInfo.date || pro.date || '')),
447
- detailField('100003720000000228', '实报金额', total),
448
- detailField('100003720000016373', '申请金额', total),
449
- detailField('1211391578999111696', '人民币金额', total),
450
- detailField(DETAIL_SUBJECT_FIELD_ID, '费用类型(科目)', rowMeta[index].subjectId),
451
- detailField('100003720000000361', '费用说明', cleanFysm(rowInfo.fysm)),
452
- detailField('100003720000000362', '附件数', '1'),
453
- detailField(DETAIL_CURRENCY_FIELD_ID, '币种', CNY_ID),
454
- detailField(DETAIL_INVOICE_FIELD_ID, '相关发票', id),
455
- ],
456
- };
457
- });
458
- const { amount: totalAmount } = sumMoney(detailRows.map((row) => row.fields.find((field) => field.fieldId === '100003720000000228')?.value));
459
- if (!totalAmount || toCents(totalAmount) === 0) {
460
- throw invoiceValidationError('invoice_total_invalid', '发票金额合计为 0 或无法解析,拒绝组装报销单');
461
- }
462
- const today = todayInShanghai();
463
- const mainFields = [
464
- mainField('100003720000000073', '申请人', superiors.currentEmployeeId),
465
- mainField('100003720000000075', '报销日期', today),
466
- mainField('100003720000000088', '报销事由', reason || requestName),
467
- mainField('100003720000000084', '报销方式', undefined, BANK_OPTION_VALUE),
468
- ];
469
- if (relatedCustomerId)
470
- mainFields.push(mainField(MAIN_CUSTOMER_FIELD_ID, '相关客户', relatedCustomerId));
471
- else
472
- warnings.push('未提供 relatedCustomerId,相关客户字段留空');
473
- mainFields.push(mainField('100003720000001375', '人员ID', superiors.currentEmployeeId));
474
- if (!contractNoInput) {
475
- warnings.push('contractNo 未传入,已使用默认合同号 "20260999"');
476
- }
477
- if (contractNo)
478
- mainFields.push(mainField(MAIN_CONTRACT_FIELD_ID, '合同号', contractNo));
479
- mainFields.push(mainField('100003720000008409', '承担主体', superiors.currentEmployeeId), mainField('100003720000012512', '提单人员', superiors.currentEmployeeId), mainField('100003720000012513', '提单人员ID', superiors.currentEmployeeId), mainField('100003720000012514', '申请日期', today));
480
- if (superiors.directSuperiorId) {
481
- mainFields.push(mainField('100003720000013859', '报销人上级', superiors.directSuperiorId), mainField('100003720000029984', '承担人直接上级', superiors.directSuperiorId));
482
- }
483
- if (superiors.allSuperiorIds.length) {
484
- mainFields.push(mainField('1159505470551416896', '承担人所有上级', superiors.allSuperiorIds.join(',')));
485
- }
486
- mainFields.push(mainField('100003720000000080', '报销总金额', totalAmount), mainField('100003720000012506', '报销合计(小写)', totalAmount), mainField('100003720000013853', '实际报销金额new', totalAmount), mainField('1211462428610863218', '人民币金额合计', totalAmount), mainField('100003720000000081', '附件总数', String(detailRows.length)));
487
- const payload = {
488
- work_flow_id: workflowId,
489
- mainFormId: structure.mainFormId,
490
- request_name: requestName,
491
- main_fields: mainFields,
492
- detail_rows: detailRows,
493
- need_user_confirm: [],
494
- unable_to_fill: [],
495
- };
496
- // 字典类 ID → 中文名。实时接口取到的名字优先,模板固化值兜底;都取不到就如实记进 unresolved。
497
- const unresolved = [];
498
- const employeeNames = {};
499
- if (superiors.currentEmployeeName)
500
- employeeNames[superiors.currentEmployeeId] = superiors.currentEmployeeName;
501
- if (superiors.directSuperiorId && superiors.directSuperiorName) {
502
- employeeNames[superiors.directSuperiorId] = superiors.directSuperiorName;
503
- }
504
- superiors.allSuperiorIds.forEach((id, index) => {
505
- const name = superiors.allSuperiorNames[index];
506
- if (name)
507
- employeeNames[id] = name;
508
- else
509
- unresolved.push(`人员 ${id}`);
510
- });
511
- const subjectNames = { ...TEMPLATE_SUBJECT_NAMES };
512
- const currencyNames = { ...TEMPLATE_CURRENCY_NAMES };
513
- for (const meta of rowMeta) {
514
- if (meta.subjectName)
515
- subjectNames[meta.subjectId] = meta.subjectName;
516
- else
517
- unresolved.push(`费用科目 ${meta.subjectId}`);
518
- if (meta.currencyName)
519
- currencyNames[meta.currencyId] = meta.currencyName;
520
- else
521
- unresolved.push(`币种 ${meta.currencyId}`);
522
- }
523
- const customerNames = {};
524
- if (relatedCustomerId) {
525
- const name = relatedCustomerNameInput ?? TEMPLATE_CUSTOMER_NAMES[relatedCustomerId];
526
- if (name)
527
- customerNames[relatedCustomerId] = name;
528
- else {
529
- unresolved.push(`相关客户 ${relatedCustomerId}`);
530
- warnings.push(`相关客户 ${relatedCustomerId} 无法自动取到中文名(字段可选项目只支持按名称搜索,不支持按 ID 反查);如需展示中文名请传入 relatedCustomerName`);
531
- }
532
- }
533
- const labels = {
534
- workflow: { id: workflowId, name: workflowRef.name ?? '' },
535
- mainFormId: structure.mainFormId,
536
- detailSubForm: { id: structure.detailSubFormId, name: structure.detailSubFormName },
537
- employees: employeeNames,
538
- subjects: subjectNames,
539
- currencies: currencyNames,
540
- customers: customerNames,
541
- selectOptions: structure.selectOptions,
542
- customer: relatedCustomerId ? { id: relatedCustomerId, name: customerNames[relatedCustomerId] ?? null } : null,
543
- unresolved: Array.from(new Set(unresolved)),
544
- };
545
- const dictionaries = {
546
- employees: employeeNames,
547
- customers: customerNames,
548
- selectOptions: structure.selectOptions,
549
- };
550
- const preview = {
551
- requestName,
552
- workflowId,
553
- mainFormId: structure.mainFormId,
554
- mainFieldCount: mainFields.length,
555
- detailRowCount: detailRows.length,
556
- totalAmount,
557
- invoiceCount: invoiceIds.length,
558
- // 以下三项已把字典类 ID 渲染成「中文(id)」,调用方可直接展示,无需额外查询。
559
- mainFields: mainFields.map((field) => renderMainFieldView(field, dictionaries)),
560
- detailRows: rowMeta.map((meta, index) => ({
561
- dataIndex: index + 1,
562
- invoiceId: meta.invoiceId,
563
- invoiceNumber: meta.invoiceNumber,
564
- amount: String(detailRows[index].fields.find((field) => field.fieldId === '100003720000000228')?.value ?? ''),
565
- expenseNote: meta.expenseNote,
566
- subject: renderIdWithName(meta.subjectId, subjectNames),
567
- currency: renderIdWithName(meta.currencyId, currencyNames),
568
- })),
569
- unresolvedLabels: labels.unresolved,
570
- };
571
- return { payload, preview, labels, warnings, workflowId };
572
- }
573
- function templateEnvelope(result, operationName) {
574
- return {
575
- status: 'COMPLETE',
576
- data: {
577
- payload: result.payload,
578
- preview: result.preview,
579
- labels: result.labels,
580
- warnings: result.warnings,
581
- workflow: workflow(operationName, 'COMPLETE'),
582
- },
583
- };
584
- }
585
- /** 票夹候选分类:自动翻页拉取未报销发票,按已挂单/全额红冲/可报三分类输出。 */
69
+ /** 票夹候选分类:自动翻页拉取未报销发票,按已挂单/可报两类输出。 */
586
70
  export class InvoiceReimCandidatesListOperation {
587
71
  name = 'invoice.reim.candidates.list';
588
72
  async execute(input, { host }) {
589
73
  const pageSize = boundedInteger(input.page_size, 'page_size', { min: 10, max: 200, defaultValue: 50 });
590
74
  const maxItems = boundedInteger(input.max_items, 'max_items', { min: 1, max: 500, defaultValue: 200 });
591
- // 报销场景默认剔除全额红冲发票:红冲票不可报销,混进候选会让调用方多一道人工剔除。
592
- const includeRedReversed = input.include_red_reversed === true;
593
75
  const dateBegin = optionalEpochSeconds(input.date_begin, 'date_begin');
594
76
  const dateEnd = optionalEpochSeconds(input.date_end, 'date_end');
595
77
  const consumptionBegin = optionalEpochSeconds(input.consumption_tm_begin, 'consumption_tm_begin');
@@ -605,7 +87,6 @@ export class InvoiceReimCandidatesListOperation {
605
87
  let total = 0;
606
88
  let hasMore = false;
607
89
  let startPos = 0;
608
- let skippedRedReversed = 0;
609
90
  let pulled = 0;
610
91
  do {
611
92
  const body = {
@@ -630,10 +111,8 @@ export class InvoiceReimCandidatesListOperation {
630
111
  const infos = Array.isArray(result?.infos) ? result.infos : [];
631
112
  for (const info of infos) {
632
113
  pulled += 1;
633
- if (!includeRedReversed && isRedReversedInvoice(info)) {
634
- skippedRedReversed += 1;
114
+ if (isRedReversedInvoice(info))
635
115
  continue;
636
- }
637
116
  kept.push(info);
638
117
  }
639
118
  startPos += infos.length;
@@ -648,12 +127,9 @@ export class InvoiceReimCandidatesListOperation {
648
127
  }
649
128
  const available = [];
650
129
  const assigned = [];
651
- const redReversed = [];
652
130
  for (const info of capped) {
653
131
  const item = candidateItem(info);
654
- if (item.status === RED_REVERSED_STATUS)
655
- redReversed.push(item);
656
- else if (item.reimRequests.length)
132
+ if (item.reimRequests.length)
657
133
  assigned.push(item);
658
134
  else
659
135
  available.push(item);
@@ -667,11 +143,8 @@ export class InvoiceReimCandidatesListOperation {
667
143
  const summary = {
668
144
  availableCount: available.length,
669
145
  assignedCount: assigned.length,
670
- redReversedCount: redReversed.length,
671
146
  availableAmount: summarize(available),
672
147
  assignedAmount: summarize(assigned),
673
- redReversedAmount: summarize(redReversed),
674
- filteredRedReversedCount: skippedRedReversed,
675
148
  };
676
149
  return {
677
150
  status: 'COMPLETE',
@@ -681,7 +154,6 @@ export class InvoiceReimCandidatesListOperation {
681
154
  hasMore: pulled < total,
682
155
  available,
683
156
  assigned,
684
- redReversed,
685
157
  summary,
686
158
  warnings,
687
159
  workflow: workflow(this.name, 'COMPLETE'),
@@ -689,40 +161,3 @@ export class InvoiceReimCandidatesListOperation {
689
161
  };
690
162
  }
691
163
  }
692
- /** 报销单模板组装:固化「总部费用报销」字段映射,从发票 ID 直接产出可提交 payload(只读)。 */
693
- export class InvoiceReimTemplateBuildOperation {
694
- name = 'invoice.reim.template.build';
695
- async execute(input, { host }) {
696
- const result = await buildReimCreatePayload(input, host, this.name);
697
- return templateEnvelope(result, this.name);
698
- }
699
- }
700
- /** 一站式 prepare:模板组装 + 签发 flow.create.apply continuation,停在 AWAITING_CONFIRMATION。 */
701
- export class InvoiceReimFlowCreateAutoPrepareOperation {
702
- name = 'invoice.reim.flow.create.auto-prepare';
703
- async execute(input, { host, continuation }) {
704
- const result = await buildReimCreatePayload(input, host, this.name);
705
- const session = await host.getSession();
706
- const continuationToken = await continuation.issue({
707
- operation: 'invoice.reim.flow.create.apply',
708
- workflow: workflow('invoice.reim.flow.create', 'AWAITING_CONFIRMATION'),
709
- baseUrl: session.baseUrl,
710
- profile: session.profile,
711
- userId: session.userId,
712
- fingerprint: objectFingerprint(result.payload),
713
- preview: result.preview,
714
- });
715
- return {
716
- status: 'AWAITING_CONFIRMATION',
717
- data: {
718
- preview: result.preview,
719
- payload: result.payload,
720
- labels: result.labels,
721
- continuation: continuationToken,
722
- expiresInSeconds: 600,
723
- warnings: result.warnings,
724
- workflow: workflow('invoice.reim.flow.create', 'AWAITING_CONFIRMATION'),
725
- },
726
- };
727
- }
728
- }