weaver-work-cli 0.1.40 → 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.
- package/README.md +17 -0
- package/dist/chunks/{archive-JHTONRST.js → archive-P6TBQGKL.js} +13 -5
- package/dist/chunks/{archive-oa-FCHLCPHC.js → archive-oa-7TQ2NXOH.js} +12 -5
- package/dist/chunks/{asset-RLIHC7DB.js → asset-3ELRG37G.js} +11 -4
- package/dist/chunks/{asset-idle-KVOFTLCP.js → asset-idle-WIGMUFMD.js} +7 -3
- package/dist/chunks/{attachment-content-RZYDB3MB.js → attachment-content-E3276UOV.js} +5 -4
- package/dist/chunks/{blog-42OZTJNP.js → blog-C5NMZAAC.js} +11 -4
- package/dist/chunks/{caizhilian-KRK547K5.js → caizhilian-5XSM2DFP.js} +13 -6
- package/dist/chunks/{calendar-RTWAMKHD.js → calendar-FI2WNSBO.js} +71 -26
- package/dist/chunks/{chunk-CXRQWOZ5.js → chunk-3YBDYOC4.js} +3 -3
- package/dist/chunks/{chunk-OOUTBLZ4.js → chunk-56EZERK4.js} +1 -1
- package/dist/chunks/chunk-6N4JPNFL.js +76 -0
- package/dist/chunks/{chunk-ZUX3P6BQ.js → chunk-727FH2NI.js} +1 -1
- package/dist/chunks/chunk-7BDPM5ST.js +11 -0
- package/dist/chunks/{chunk-LN447PY2.js → chunk-BCVYBYYT.js} +432 -2247
- package/dist/chunks/{chunk-7E6MUOEK.js → chunk-CWYGFU5B.js} +2 -2
- package/dist/chunks/{chunk-NOODWMCL.js → chunk-D4ADSZ7H.js} +1 -1
- package/dist/chunks/{chunk-WFFNM65B.js → chunk-ETNJSKMM.js} +281 -29
- package/dist/chunks/{chunk-CAQNBBQA.js → chunk-F4E4EM35.js} +3 -3
- package/dist/chunks/{chunk-4CTESSKI.js → chunk-FAZTGX7S.js} +6 -6
- package/dist/chunks/chunk-FRZKBMSW.js +2562 -0
- package/dist/chunks/{chunk-BYBSCN4X.js → chunk-G7PQWD4L.js} +6 -3
- package/dist/chunks/{chunk-NJKREDA3.js → chunk-GAMZLAG2.js} +1 -1
- package/dist/chunks/{chunk-FLS4DPGP.js → chunk-GM6J7Q4B.js} +28 -15
- package/dist/chunks/{chunk-NETCCARD.js → chunk-GRDRG6HP.js} +3 -3
- package/dist/chunks/chunk-HIT4Y6OI.js +1238 -0
- package/dist/chunks/{chunk-EZALDOQH.js → chunk-HP7JIYMT.js} +5 -2
- package/dist/chunks/{chunk-IZSSVYAG.js → chunk-IAZ3UPY6.js} +3 -3
- package/dist/chunks/{chunk-ZEDWSH32.js → chunk-IC62NFM5.js} +1 -1
- package/dist/chunks/{chunk-P26ZWSKU.js → chunk-KIHNAS25.js} +5 -2
- package/dist/chunks/{chunk-57IECMWX.js → chunk-N4M2DDFE.js} +29 -15
- package/dist/chunks/{chunk-JWRZM2H2.js → chunk-OF4S23UB.js} +4 -4
- package/dist/chunks/{chunk-VNBU55SL.js → chunk-PC7VKEB5.js} +80 -2458
- package/dist/chunks/{chunk-G2JSIUWF.js → chunk-PUQS5MWL.js} +91 -2
- package/dist/chunks/{chunk-E7OK5WD5.js → chunk-Q4OYAQYH.js} +5 -5
- package/dist/chunks/{chunk-7BRU4EFH.js → chunk-QVSWRLLU.js} +35 -6
- package/dist/chunks/{chunk-T6EGVBKU.js → chunk-TA7FXXJD.js} +6 -3
- package/dist/chunks/{chunk-GPMFD4RD.js → chunk-TXUG266F.js} +1 -1
- package/dist/chunks/{chunk-4TEDNCON.js → chunk-UFIT2UU3.js} +354 -56
- package/dist/chunks/{chunk-LUSPKZKY.js → chunk-UG5G54VL.js} +1 -0
- package/dist/chunks/{chunk-NIAJ5ZCG.js → chunk-UL5XUQ25.js} +5 -2
- package/dist/chunks/{chunk-FMPJJYYI.js → chunk-WRXSAVKO.js} +1 -1
- package/dist/chunks/{chunk-7U577Q7U.js → chunk-WSF4NNMR.js} +3 -3
- package/dist/chunks/chunk-XHK4MDR5.js +2497 -0
- package/dist/chunks/{chunk-LFMSDBZN.js → chunk-XNIK66I4.js} +326 -161
- package/dist/chunks/{chunk-3SO6QL6U.js → chunk-YWX377BY.js} +5 -2
- package/dist/chunks/{chunk-BYATLLEF.js → chunk-Z3GDFVJR.js} +1 -1
- package/dist/chunks/{chunk-I566ZYNF.js → chunk-Z7VYWPZV.js} +1 -1
- package/dist/chunks/{conflict-VR55AOOO.js → conflict-ARLSZJ6V.js} +4 -3
- package/dist/chunks/{continuation-2CKSBLA6.js → continuation-3S37AUSH.js} +4 -3
- package/dist/chunks/{continuation-RN6PZN2M.js → continuation-3XLYYTKV.js} +4 -3
- package/dist/chunks/{continuation-HZIZRZBX.js → continuation-HFW2YT5S.js} +4 -3
- package/dist/chunks/{continuation-NLECEJPX.js → continuation-KI7DRRZN.js} +4 -3
- package/dist/chunks/{contract-HI4FNPYE.js → contract-DNIIW5VJ.js} +13 -5
- package/dist/chunks/{cowork-HJLI353D.js → cowork-GMLRGVIW.js} +31 -14
- package/dist/chunks/create-flow-J22BO65E.js +56 -0
- package/dist/chunks/{ebuilder-form-HTGI63UU.js → ebuilder-form-ANV2FHYV.js} +12 -7
- package/dist/chunks/{ehr-GYXIYH3A.js → ehr-GSTGAIY3.js} +695 -1255
- package/dist/chunks/{employee-SAK2QYXX.js → employee-22BGJ3QS.js} +3 -3
- package/dist/chunks/{env-DW3G4HUO.js → env-BX3VRFS7.js} +4 -3
- package/dist/chunks/{esb-I5INCEFE.js → esb-ATAIASX2.js} +12 -7
- package/dist/chunks/{factory-TKXGXS6L.js → factory-PETTFME6.js} +3 -2
- package/dist/chunks/{fna-K2MHTQ24.js → fna-YEKBSFSX.js} +14 -8
- package/dist/chunks/{group-chat-VYBNMJLG.js → group-chat-BFVXAYFX.js} +7 -4
- package/dist/chunks/{host-D5SERMAJ.js → host-HRBXEPDQ.js} +5 -5
- package/dist/chunks/{host-JM4YVHFM.js → host-LR55CTHP.js} +5 -5
- package/dist/chunks/{host-L3VLITMT.js → host-SUOY6VYQ.js} +5 -5
- package/dist/chunks/{host-ZUQTJYYK.js → host-SZGV4UNT.js} +5 -5
- package/dist/chunks/{host-256GVCAH.js → host-WIKN2EJ5.js} +5 -5
- package/dist/chunks/{hrm-VLRBKTZB.js → hrm-NRDO4W5G.js} +11 -7
- package/dist/chunks/{im-QK3VTLXK.js → im-IQ2HN23S.js} +11 -10
- package/dist/chunks/{invoice-T5JTA32H.js → invoice-MNRW76PP.js} +636 -1768
- package/dist/chunks/{jiuchuanhui-P2FNEQVZ.js → jiuchuanhui-DTRBAX4N.js} +14 -6
- package/dist/chunks/{lazy-dispatch-XRRI46M6.js → lazy-dispatch-ZVWAI25B.js} +7 -6
- package/dist/chunks/{mail-3Y7MJ6PS.js → mail-ZVAUXOJA.js} +16 -14
- package/dist/chunks/{meeting-M7LTXGJE.js → meeting-FEVPZ67S.js} +21 -13
- package/dist/chunks/{okr-OBC6S67L.js → okr-SDH3E5RA.js} +12 -5
- package/dist/chunks/{operations-5QL3AECO.js → operations-62N6EP3C.js} +4 -3
- package/dist/chunks/{plan-5H6I53SK.js → plan-E35JFDI7.js} +12 -5
- package/dist/chunks/{project-L75QZV4S.js → project-73QXBAB2.js} +49 -25
- package/dist/chunks/reception-UWZVACBN.js +1899 -0
- package/dist/chunks/recruit-stage-4MAOCKFY.js +4770 -0
- package/dist/chunks/registry-IM5G23LS.js +24 -0
- package/dist/chunks/{registry-UGRBCBHO.js → registry-JDUS4E7D.js} +7 -6
- package/dist/chunks/{registry-RXPN6BBT.js → registry-KNKSCJNT.js} +7 -6
- package/dist/chunks/{registry-NYPYMZXG.js → registry-PO7SI256.js} +4 -4
- package/dist/chunks/{registry-QGHFNUWS.js → registry-PVUZQDDQ.js} +3 -3
- package/dist/chunks/{room-recommend-A3UDC3CA.js → room-recommend-H7KLXA5R.js} +6 -5
- package/dist/chunks/{schedule-5GCACCK7.js → schedule-ESZIBAUO.js} +6 -5
- package/dist/chunks/{workflow-M5ZJ7DWF.js → workflow-CWJFJLQU.js} +15 -10
- package/dist/cmd/action.js +6 -0
- package/dist/cmd/identity/index.js +45 -0
- package/dist/cmd/index.js +2 -0
- package/dist/core/continuation-ttl.js +18 -0
- package/dist/core/error-codes.js +85 -0
- package/dist/core/logger.js +11 -0
- package/dist/index.js +41 -30
- package/dist/internal/e10/auth/commands.js +164 -8
- package/dist/internal/e10/auth/error-log.js +182 -0
- package/dist/internal/e10/auth/messages.js +6 -0
- package/dist/internal/e10/auth/session.js +34 -3
- package/dist/internal/e10/auth/xiaoe.js +286 -44
- package/dist/internal/e10/auth-recovery.js +72 -14
- package/dist/internal/e10/context.js +72 -13
- package/dist/internal/e10/index.js +1 -1
- package/dist/internal/e10/network-error.js +93 -0
- package/dist/internal/e10/request-runtime.js +6 -0
- package/dist/internal/skills/install.js +9 -1
- package/dist/shortcuts/archive/continuation.js +2 -1
- package/dist/shortcuts/archive/index.js +3 -0
- package/dist/shortcuts/archive/operations/confirm.js +2 -1
- package/dist/shortcuts/archive-oa/continuation.js +2 -1
- package/dist/shortcuts/archive-oa/index.js +2 -0
- package/dist/shortcuts/archive-oa/operations/confirm.js +2 -1
- package/dist/shortcuts/asset/continuation.js +2 -1
- package/dist/shortcuts/asset/index.js +2 -0
- package/dist/shortcuts/asset-idle/index.js +2 -0
- package/dist/shortcuts/blog/continuation.js +2 -1
- package/dist/shortcuts/blog/index.js +2 -0
- package/dist/shortcuts/caizhilian/continuation.js +2 -1
- package/dist/shortcuts/caizhilian/index.js +2 -0
- package/dist/shortcuts/caizhilian/operations/confirm.js +3 -2
- package/dist/shortcuts/calendar/continuation.js +2 -1
- package/dist/shortcuts/calendar/index.js +2 -0
- package/dist/shortcuts/calendar/operations/read.js +31 -22
- package/dist/shortcuts/calendar/operations/write.js +46 -2
- package/dist/shortcuts/contract/continuation.js +2 -1
- package/dist/shortcuts/contract/index.js +2 -0
- package/dist/shortcuts/contract/operations/write.js +2 -1
- package/dist/shortcuts/cowork/continuation.js +2 -1
- package/dist/shortcuts/cowork/index.js +2 -0
- package/dist/shortcuts/cowork/operations/discuss-write.js +5 -1
- package/dist/shortcuts/cowork/operations/item-write.js +1 -7
- package/dist/shortcuts/cowork/operations/member-write.js +3 -1
- package/dist/shortcuts/cowork/operations/permission-write.js +5 -1
- package/dist/shortcuts/cowork/operations/shared.js +7 -0
- package/dist/shortcuts/ebuilder-form/continuation.js +2 -1
- package/dist/shortcuts/ebuilder-form/index.js +2 -0
- package/dist/shortcuts/ebuilder-form/operations/write.js +3 -2
- package/dist/shortcuts/ehr/continuation.js +2 -1
- package/dist/shortcuts/ehr/index.js +2 -0
- package/dist/shortcuts/ehr/operations/attend-write.js +44 -2
- package/dist/shortcuts/ehr/operations/hr-contact.js +7 -4
- package/dist/shortcuts/ehr/operations/hr-report.js +13 -7
- package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +317 -63
- package/dist/shortcuts/ehr/operations/recruit-position.js +134 -2
- package/dist/shortcuts/ehr/operations/recruit-write.js +263 -18
- package/dist/shortcuts/ehr/operations/recruit.js +10 -4
- package/dist/shortcuts/ehr/operations/shared.js +47 -0
- package/dist/shortcuts/esb/continuation.js +2 -1
- package/dist/shortcuts/esb/index.js +2 -0
- package/dist/shortcuts/esb/operations/trigger.js +2 -1
- package/dist/shortcuts/fna/continuation.js +2 -1
- package/dist/shortcuts/fna/index.js +2 -0
- package/dist/shortcuts/fna/operations/invoice-writeoff.js +1 -1
- package/dist/shortcuts/fna/operations/loan.js +1 -1
- package/dist/shortcuts/hrm/index.js +2 -0
- package/dist/shortcuts/hrm/operations/org.js +118 -0
- package/dist/shortcuts/im/continuation.js +2 -1
- package/dist/shortcuts/index.js +10 -0
- package/dist/shortcuts/invoice/continuation.js +2 -1
- package/dist/shortcuts/invoice/index.js +14 -15
- package/dist/shortcuts/invoice/invoice-record.js +93 -0
- package/dist/shortcuts/invoice/manifest.js +190 -393
- package/dist/shortcuts/invoice/operations/add.js +2 -1
- package/dist/shortcuts/invoice/operations/delete.js +2 -1
- package/dist/shortcuts/invoice/operations/import.js +2 -1
- package/dist/shortcuts/invoice/operations/issuing-contract-detail.js +86 -0
- package/dist/shortcuts/invoice/operations/issuing-contracts.js +210 -0
- package/dist/shortcuts/invoice/operations/registry.js +17 -17
- package/dist/shortcuts/invoice/operations/reim-auto.js +4 -569
- package/dist/shortcuts/invoice/operations/reim.js +52 -341
- package/dist/shortcuts/invoice/operations/shared.js +21 -4
- package/dist/shortcuts/invoice/operations/update.js +2 -1
- package/dist/shortcuts/invoice/projection.js +10 -62
- package/dist/shortcuts/jiuchuanhui/continuation.js +2 -1
- package/dist/shortcuts/jiuchuanhui/index.js +2 -0
- package/dist/shortcuts/jiuchuanhui/operations/datajson.js +2 -1
- package/dist/shortcuts/jiuchuanhui/operations/esb.js +2 -1
- package/dist/shortcuts/mail/continuation.js +2 -1
- package/dist/shortcuts/mail/index.js +2 -0
- package/dist/shortcuts/mail/operations/mail-blacklist.js +1 -1
- package/dist/shortcuts/mail/operations/mail-contacts.js +1 -1
- package/dist/shortcuts/mail/operations/mail-send.js +1 -1
- package/dist/shortcuts/mail/operations/mail-sign.js +1 -1
- package/dist/shortcuts/mail/operations/mail-template.js +1 -1
- package/dist/shortcuts/meeting/continuation.js +2 -1
- package/dist/shortcuts/meeting/index.js +2 -0
- package/dist/shortcuts/meeting/operations/change.js +1 -1
- package/dist/shortcuts/meeting/operations/create.js +1 -1
- package/dist/shortcuts/meeting/operations/eb/catalog.js +4 -1
- package/dist/shortcuts/meeting/operations/eb/create-flow.js +101 -35
- package/dist/shortcuts/meeting/operations/eb/decision.js +1 -1
- package/dist/shortcuts/meeting/operations/eb/factory.js +34 -1
- package/dist/shortcuts/meeting/operations/eb/group-chat.js +25 -3
- package/dist/shortcuts/meeting/operations/eb/person-cache.js +96 -0
- package/dist/shortcuts/meeting/operations/eb/room-recommend.js +33 -11
- package/dist/shortcuts/meeting/operations/lifecycle.js +1 -1
- package/dist/shortcuts/meeting/operations/receipts.js +1 -1
- package/dist/shortcuts/meeting/operations/signs.js +1 -1
- package/dist/shortcuts/okr/continuation.js +2 -1
- package/dist/shortcuts/okr/index.js +2 -0
- package/dist/shortcuts/okr/operations/write.js +1 -1
- package/dist/shortcuts/plan/continuation.js +2 -1
- package/dist/shortcuts/plan/index.js +2 -0
- package/dist/shortcuts/plan/operations/write.js +1 -1
- package/dist/shortcuts/project/continuation.js +2 -1
- package/dist/shortcuts/project/index.js +2 -0
- package/dist/shortcuts/project/operations/read.js +6 -25
- package/dist/shortcuts/project/operations/shared.js +22 -0
- package/dist/shortcuts/project/operations/write.js +28 -2
- package/dist/shortcuts/reception/constants.js +53 -0
- package/dist/shortcuts/reception/errors.js +54 -0
- package/dist/shortcuts/reception/host.js +125 -0
- package/dist/shortcuts/reception/index.js +198 -0
- package/dist/shortcuts/reception/manifest.js +177 -0
- package/dist/shortcuts/reception/operations/ask.js +71 -0
- package/dist/shortcuts/reception/operations/browsertool.js +58 -0
- package/dist/shortcuts/reception/operations/compose.js +129 -0
- package/dist/shortcuts/reception/operations/customparams.js +74 -0
- package/dist/shortcuts/reception/operations/doc.js +238 -0
- package/dist/shortcuts/reception/operations/docrender.js +36 -0
- package/dist/shortcuts/reception/operations/panels.js +179 -0
- package/dist/shortcuts/reception/operations/registry.js +26 -0
- package/dist/shortcuts/reception/operations/render-assets.js +184 -0
- package/dist/shortcuts/reception/operations/render.js +123 -0
- package/dist/shortcuts/reception/operations/runs.js +38 -0
- package/dist/shortcuts/reception/operations/schedule.js +127 -0
- package/dist/shortcuts/reception/operations/shared.js +196 -0
- package/dist/shortcuts/reception/operations/snapshot.js +68 -0
- package/dist/shortcuts/reception/operations/types.js +1 -0
- package/dist/shortcuts/reception/operations.js +33 -0
- package/dist/shortcuts/reception/upload.js +218 -0
- package/dist/shortcuts/recruit-stage/context.js +231 -0
- package/dist/shortcuts/recruit-stage/continuation.js +74 -0
- package/dist/shortcuts/recruit-stage/errors.js +65 -0
- package/dist/shortcuts/recruit-stage/host.js +109 -0
- package/dist/shortcuts/recruit-stage/index.js +115 -0
- package/dist/shortcuts/recruit-stage/manifest.js +29 -0
- package/dist/shortcuts/recruit-stage/operations/interview-arrange.js +722 -0
- package/dist/shortcuts/recruit-stage/operations/interview-feedback.js +269 -0
- package/dist/shortcuts/recruit-stage/operations/jd-create.js +719 -0
- package/dist/shortcuts/recruit-stage/operations/list.js +431 -0
- package/dist/shortcuts/recruit-stage/operations/registry.js +38 -0
- package/dist/shortcuts/recruit-stage/operations/resume-import.js +1354 -0
- package/dist/shortcuts/recruit-stage/operations/search.js +158 -0
- package/dist/shortcuts/recruit-stage/operations/types.js +25 -0
- package/dist/shortcuts/recruit-stage/school-tiers.json +318 -0
- package/dist/shortcuts/recruit-stage/shared.js +608 -0
- package/dist/shortcuts/workflow/continuation.js +2 -1
- package/dist/shortcuts/workflow/index.js +2 -0
- package/dist/shortcuts/workflow/operations/form.js +32 -8
- package/dist/shortcuts/workflow/operations/todoSmartConvert/detailFieldRules.js +4 -2
- package/dist/shortcuts/workflow/operations/todoSmartConvert/summaryCache.js +13 -6
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailCache.js +17 -24
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoDetailFetcher.js +14 -9
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +50 -8
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +2 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.detail.js +17 -11
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +7 -39
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +3 -2
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +51 -15
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.pipeline.js +16 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +151 -63
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.subGroup.js +56 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +39 -14
- package/dist/shortcuts/workflow/operations/write.js +1 -1
- package/docs/_catalog.md +3 -0
- package/docs/agent-invoice.md +1 -1
- package/docs/archive-oa.md +1 -1
- package/docs/caizhilian.md +1 -1
- package/docs/calendar.md +1 -1
- package/docs/contract.md +1 -1
- package/docs/e10-auth.md +23 -1
- package/docs/ehr.md +2 -2
- package/docs/esb.md +1 -1
- package/docs/im.md +1 -1
- package/docs/invoice.md +8 -12
- package/docs/okr.md +1 -1
- package/docs/operation-manual.md +8 -0
- package/docs/reception.md +119 -0
- package/package.json +1 -1
- package/scripts/clean.mjs +43 -2
- package/scripts/install-skill-to-xiaoe.mjs +105 -0
- package/scripts/package-skill.mjs +4 -2
- package/skill-template/business-info.json +42 -2
- package/skill-template/domains/caizhilian.md +1 -1
- package/skill-template/domains/reception-flow.md +18 -0
- package/skill-template/domains/recruit-stage.md +29 -0
- package/skill-template/domains/yepiaotong.md +4 -7
- package/skills/weaver-e10-archive-oa/references/source-manifest.json +14 -14
- package/skills/weaver-e10-blog/references/blog-publish.md +1 -1
- package/skills/weaver-e10-blog/references/source-manifest.json +7 -7
- package/skills/weaver-e10-caizhilian/references/source-manifest.json +21 -21
- package/skills/weaver-e10-caizhilian/references/write-protocol.md +2 -2
- package/skills/weaver-e10-calendar/SKILL.md +2 -1
- package/skills/weaver-e10-calendar/references/calendar-write.md +55 -1
- package/skills/weaver-e10-cowork/SKILL.md +1 -1
- package/skills/weaver-e10-cowork/references/cowork-write.md +3 -1
- package/skills/weaver-e10-ebuilder-form/SKILL.md +1 -1
- package/skills/weaver-e10-ebuilder-form/references/custom-api.md +1 -1
- package/skills/weaver-e10-ebuilder-form/references/openapi-write.md +1 -1
- package/skills/weaver-e10-esb/SKILL.md +2 -2
- package/skills/weaver-e10-esb/references/source-manifest.json +22 -22
- package/skills/weaver-e10-esb/references/trigger.md +2 -2
- package/skills/weaver-e10-jinchengda/references/contract-clause-library-crud.md +1 -1
- package/skills/weaver-e10-jinchengda/references/contract-clause-reference-save.md +1 -1
- package/skills/weaver-e10-jinchengda/references/contract-request-write.md +1 -1
- package/skills/weaver-e10-jinchengda/references/source-manifest.json +29 -29
- package/skills/weaver-e10-jucailin/SKILL.md +1 -1
- package/skills/weaver-e10-jucailin/references/attend-write.md +10 -2
- package/skills/weaver-e10-jucailin/references/hr-contact.md +8 -0
- package/skills/weaver-e10-jucailin/references/hr-report.md +8 -0
- package/skills/weaver-e10-jucailin/references/recruit-create.md +14 -5
- package/skills/weaver-e10-jucailin/references/recruit-read.md +1 -1
- package/skills/weaver-e10-jucailin/references/recruit-write.md +5 -4
- package/skills/weaver-e10-mail/SKILL.md +1 -1
- package/skills/weaver-e10-meeting/SKILL.md +39 -7
- package/skills/weaver-e10-meeting/references/meeting-change.md +1 -1
- package/skills/weaver-e10-meeting/references/meeting-create.md +1 -1
- package/skills/weaver-e10-meeting/references/meeting-lifecycle.md +1 -1
- package/skills/weaver-e10-meeting/references/meeting-verification.md +1 -1
- package/skills/weaver-e10-okr/references/okr-align.md +1 -1
- package/skills/weaver-e10-okr/references/okr-keyresult.md +1 -1
- package/skills/weaver-e10-okr/references/okr-write.md +1 -1
- package/skills/weaver-e10-okr/references/source-manifest.json +8 -8
- package/skills/weaver-e10-plan/references/plan-report-write.md +1 -1
- package/skills/weaver-e10-plan/references/source-manifest.json +20 -20
- package/skills/weaver-e10-qiyecheng/references/loan-management.md +1 -1
- package/skills/weaver-e10-qiyecheng/references/source-manifest.json +18 -18
- package/skills/weaver-e10-reception-flow/SKILL.md +173 -0
- 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
- package/skills/weaver-e10-reception-flow/data/fields-snapshot.json +213 -0
- package/skills/weaver-e10-reception-flow/references/browsertool.md +68 -0
- package/skills/weaver-e10-reception-flow/references/env-pitfalls.md +51 -0
- package/skills/weaver-e10-reception-flow/references/fields-snapshot.md +227 -0
- package/skills/weaver-e10-reception-flow/references/guide.md +179 -0
- package/skills/weaver-e10-reception-flow/scripts/locate.sh +14 -0
- package/skills/weaver-e10-reception-flow/scripts/render.py +724 -0
- package/skills/weaver-e10-recruit-stage/SKILL.md +230 -0
- package/skills/weaver-e10-recruit-stage/agents/openai.yaml +119 -0
- package/skills/weaver-e10-recruit-stage/lib/recruit-xiaoe-file.mjs +188 -0
- package/skills/weaver-e10-recruit-stage/lib/xiaoe-session.mjs +66 -0
- package/skills/weaver-e10-recruit-stage/references/position-templates.md +202 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-arrange-interview.md +322 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-capability-check.md +127 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-check-install.md +65 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-detail-process.md +63 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-edit-interview-feedback.md +142 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-jd-create.md +95 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-jd-template.md +56 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-list-candidate.md +101 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-list-interview.md +148 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-match-candidates.md +77 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-output-links.md +59 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resolve-creator.md +69 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resolve-metadata.md +241 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resume-import.md +451 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-resume-parse.md +128 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-search-candidate.md +146 -0
- package/skills/weaver-e10-recruit-stage/references/recruit-urge-feedback.md +69 -0
- package/skills/weaver-e10-shared/SKILL.md +1 -1
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +10 -2
- package/skills/weaver-e10-shijingran/SKILL.md +7 -6
- package/skills/weaver-e10-shijingran/references/operations.md +3 -1
- package/skills/weaver-e10-shijingran/references/source-manifest.json +30 -28
- package/skills/weaver-e10-shijingran/references/write-operations.md +2 -0
- package/skills/weaver-e10-skill-maker/references/module-cli-generation.md +2 -0
- package/skills/weaver-e10-wenshuding/references/source-manifest.json +3 -3
- package/skills/weaver-e10-workflow/SKILL.md +4 -2
- package/skills/weaver-e10-workflow/aigroup/default.json +11 -9
- package/skills/weaver-e10-workflow/references/source-manifest.json +32 -32
- package/skills/weaver-e10-workflow/references/todo-smart-convert.md +23 -13
- package/skills/weaver-e10-workflow/tools/todo-summary.cjs +62 -20
- package/skills/weaver-e10-yepiaotong/SKILL.md +28 -36
- package/skills/weaver-e10-yepiaotong/references/invoice-agent-entry.md +6 -3
- package/skills/weaver-e10-yepiaotong/references/invoice-detail.md +13 -10
- package/skills/weaver-e10-yepiaotong/references/invoice-enterprise-list.md +2 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-workflow.md +194 -155
- package/skills/weaver-e10-yepiaotong/references/invoice-output-view.md +28 -32
- package/skills/weaver-e10-yepiaotong/references/invoice-personal-list.md +5 -1
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +8 -10
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +211 -616
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +149 -117
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +17 -20
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +20 -39
- package/skills/weaver-e10-yepiaotong/references/reim-matching-rules.md +55 -22
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +7 -17
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +88 -92
- package/skills/weaver-e10-yepiaotong/references/source-manifest.json +144 -354
- package/skills/weaver-e10-yimiaoban/SKILL.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/msg-write.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +7 -7
- package/dist/chunks/chunk-SPRHHSVC.js +0 -465
- package/dist/chunks/registry-KMHCPAAD.js +0 -22
- package/dist/shortcuts/invoice/markdown.js +0 -172
- package/dist/shortcuts/invoice/operations/issuing-qys.js +0 -424
- package/skills/weaver-e10-meeting.zip +0 -0
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-examples.md +0 -131
- package/skills/weaver-e10-yepiaotong/references/invoice-issuing-form-fill-rules.md +0 -179
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { ExitCode, isCliError, toErrorEnvelope } from '../../core/errors.js';
|
|
3
|
+
import { stateRoot } from '../../core/state.js';
|
|
4
|
+
import { DEFAULT_WORKFLOW, STATE_SUBDIR } from './constants.js';
|
|
5
|
+
import { receptionValidationError } from './errors.js';
|
|
6
|
+
import { createReceptionHost } from './host.js';
|
|
7
|
+
import { assertManifestMatchesRegistry, receptionManifest } from './manifest.js';
|
|
8
|
+
import { executeReceptionOperation, normalizeInput } from './operations.js';
|
|
9
|
+
import { jsonArg, textOf } from './operations/shared.js';
|
|
10
|
+
/**
|
|
11
|
+
* 命令面。
|
|
12
|
+
*
|
|
13
|
+
* 形态选择:保留 `ask / doc / render` 三个动词 + `schema / run` 通用入口。
|
|
14
|
+
* 理由不是"省事",而是这三条命令的返回值是给宿主消费的(面板定义、browsertool),
|
|
15
|
+
* 塞进 CRUD 式 operation 语义反而更别扭;同时补 schema,让 Agent 仍能自查合约。
|
|
16
|
+
*/
|
|
17
|
+
function asOptions(value) {
|
|
18
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
19
|
+
? value
|
|
20
|
+
: {};
|
|
21
|
+
}
|
|
22
|
+
/** `<stateRoot>/reception/`,与 profile 同级,多环境不串。 */
|
|
23
|
+
function stateDirOf(ctx) {
|
|
24
|
+
return join(stateRoot(ctx), STATE_SUBDIR);
|
|
25
|
+
}
|
|
26
|
+
function contextOf(ctx, options) {
|
|
27
|
+
const stateDir = stateDirOf(ctx);
|
|
28
|
+
const outDir = textOf(options, 'outDir') || join(stateDir, 'out');
|
|
29
|
+
return { host: createReceptionHost(ctx), stateDir, outDir };
|
|
30
|
+
}
|
|
31
|
+
function successEnvelope(operation, state, data, warnings, next) {
|
|
32
|
+
return {
|
|
33
|
+
schemaVersion: 1,
|
|
34
|
+
ok: true,
|
|
35
|
+
operation,
|
|
36
|
+
data: data === undefined ? null : data,
|
|
37
|
+
meta: { state, ...(next ? { next } : {}) },
|
|
38
|
+
warnings,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function failureEnvelope(error) {
|
|
42
|
+
return { schemaVersion: 1, ok: false, error: toErrorEnvelope(error) };
|
|
43
|
+
}
|
|
44
|
+
async function runOperation(ctx, operation, input, options) {
|
|
45
|
+
try {
|
|
46
|
+
const result = await executeReceptionOperation(operation, input, contextOf(ctx, options));
|
|
47
|
+
const envelope = successEnvelope(operation, result.state, result.data, result.warnings || [], result.next || null);
|
|
48
|
+
ctx.output.write(envelope, { json: true });
|
|
49
|
+
// 业务上判定不成功(如 render 无任何字段有值)时用参数错误退出,便于调用方分流
|
|
50
|
+
if (result.ok === false)
|
|
51
|
+
process.exitCode = ExitCode.UsageError;
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
/*
|
|
55
|
+
* 错误信封走 stdout,与本模块的成功输出同一通道。
|
|
56
|
+
*
|
|
57
|
+
* 其它 shortcut(plan / asset)走 stderr,这里刻意不同:接待流程的调用方是模型,
|
|
58
|
+
* 它只解析 stdout;SKILL.md 的失败矩阵全部依赖 `error.subtype` 分流,
|
|
59
|
+
* 走 stderr 会被多数宿主丢掉,表现为"命令失败了但不知道为什么"。
|
|
60
|
+
*/
|
|
61
|
+
ctx.output.write(failureEnvelope(error), { json: true });
|
|
62
|
+
process.exitCode = isCliError(error) ? error.exitCode : ExitCode.GeneralError;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function parseAnswers(options, code = 'ANSWERS') {
|
|
66
|
+
return jsonArg(options, 'answers', { code });
|
|
67
|
+
}
|
|
68
|
+
export const receptionShortcut = {
|
|
69
|
+
name: 'reception',
|
|
70
|
+
description: '泛微客户参观接待流程(面板 / 行程单与内部方案 / 填单页预填)',
|
|
71
|
+
category: 'shortcut',
|
|
72
|
+
register({ program, action }) {
|
|
73
|
+
assertManifestMatchesRegistry();
|
|
74
|
+
const reception = program.command('reception')
|
|
75
|
+
.description('泛微客户参观接待流程:出面板 → 出两份产物并挂附件 → 输出填单页 browsertool');
|
|
76
|
+
reception.command('schema')
|
|
77
|
+
.description('输出 operation 合约(Agent 自查入口)')
|
|
78
|
+
.action(action((ctx) => {
|
|
79
|
+
ctx.output.write(receptionManifest, { json: true });
|
|
80
|
+
}));
|
|
81
|
+
reception.command('run')
|
|
82
|
+
.description('按 operation 名执行(reception.ask / reception.doc / reception.render)')
|
|
83
|
+
.argument('<operation>', 'operation 名,如 reception.ask')
|
|
84
|
+
.option('--input <path>', 'JSON 入参文件,- 表示 stdin')
|
|
85
|
+
.option('--input-json <json>', '内联 JSON 入参')
|
|
86
|
+
.option('--out-dir <dir>', '产物输出目录')
|
|
87
|
+
.action(action(async (ctx, operation, options) => {
|
|
88
|
+
const opts = asOptions(options);
|
|
89
|
+
let input = {};
|
|
90
|
+
if (opts.inputJson) {
|
|
91
|
+
const parsed = jsonArg({ inputJson: opts.inputJson }, 'inputJson', { code: 'INPUT_JSON', required: true });
|
|
92
|
+
input = normalizeInput(parsed);
|
|
93
|
+
}
|
|
94
|
+
else if (typeof opts.input === 'string' && opts.input.trim() && opts.input !== '-') {
|
|
95
|
+
throw receptionValidationError('INPUT_UNSUPPORTED', '请用 --input-json 传参,或直接使用动词命令', {
|
|
96
|
+
hint: 'read 类操作没有大结果回传需求,不支持 --input 文件',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
await runOperation(ctx, String(operation), input, opts);
|
|
100
|
+
}));
|
|
101
|
+
reception.command('ask')
|
|
102
|
+
.description('出交互面板(缺项才出屏,总屏数 ≤2)')
|
|
103
|
+
.option('--known <json>', '7 项抽取结果(内联 JSON)')
|
|
104
|
+
.option('--known-file <path>', '7 项抽取结果(JSON 文件,推荐)')
|
|
105
|
+
.option('--user <names>', '陪同人员姓名,多人逗号分隔;不传用当前登录人兜底')
|
|
106
|
+
.option('--customer <name>', '客户名称,覆盖 known.customer')
|
|
107
|
+
.option('--workflow <name>', `目标流程名,默认「${DEFAULT_WORKFLOW}」`)
|
|
108
|
+
.option('--out-dir <dir>', '产物输出目录')
|
|
109
|
+
.action(action(async (ctx, options) => {
|
|
110
|
+
const opts = asOptions(options);
|
|
111
|
+
const known = jsonArg(opts, 'known', {
|
|
112
|
+
code: 'KNOWN',
|
|
113
|
+
required: true,
|
|
114
|
+
hint: '推荐用文件传参:先写 known.json(无 BOM 的 UTF-8),再 reception ask --known-file known.json',
|
|
115
|
+
});
|
|
116
|
+
await runOperation(ctx, 'reception.ask', {
|
|
117
|
+
known,
|
|
118
|
+
user: textOf(opts, 'user') || undefined,
|
|
119
|
+
customer: textOf(opts, 'customer') || undefined,
|
|
120
|
+
workflow: textOf(opts, 'workflow') || undefined,
|
|
121
|
+
}, opts);
|
|
122
|
+
}));
|
|
123
|
+
reception.command('doc')
|
|
124
|
+
.description('生成行程单 docx + 内部参考文档 md,并上传附件(零写请求)')
|
|
125
|
+
.option('--run-id <id>', 'ask 返回的 runId')
|
|
126
|
+
.option('--known <json>', 'run 失效时用于现场重建的 7 项抽取结果')
|
|
127
|
+
.option('--known-file <path>', '同上,JSON 文件')
|
|
128
|
+
.option('--answers <json>', '面板回填值(内联 JSON)')
|
|
129
|
+
.option('--answers-file <path>', '面板回填值(JSON 文件,推荐)')
|
|
130
|
+
.option('--cases-file <path>', '案例 + 专家检索结果 JSON')
|
|
131
|
+
.option('--workflow <name>', '目标流程名')
|
|
132
|
+
.option('--out-dir <dir>', '产物输出目录')
|
|
133
|
+
.option('--snapshot <path>', '字段快照路径(同时用于推导 render.py)')
|
|
134
|
+
.option('--render-py <path>', '显式指定 render.py')
|
|
135
|
+
.option('--no-upload', '跳过附件上传,只出本地文件')
|
|
136
|
+
.action(action(async (ctx, options) => {
|
|
137
|
+
const opts = asOptions(options);
|
|
138
|
+
await runOperation(ctx, 'reception.doc', {
|
|
139
|
+
runId: textOf(opts, 'runId') || undefined,
|
|
140
|
+
known: jsonArg(opts, 'known', { code: 'KNOWN' }) || undefined,
|
|
141
|
+
answers: parseAnswers(opts) || undefined,
|
|
142
|
+
casesFile: textOf(opts, 'casesFile') || undefined,
|
|
143
|
+
workflow: textOf(opts, 'workflow') || undefined,
|
|
144
|
+
outDir: textOf(opts, 'outDir') || undefined,
|
|
145
|
+
snapshot: textOf(opts, 'snapshot') || undefined,
|
|
146
|
+
renderPy: textOf(opts, 'renderPy') || undefined,
|
|
147
|
+
noUpload: opts.upload === false,
|
|
148
|
+
}, opts);
|
|
149
|
+
}));
|
|
150
|
+
reception.command('render')
|
|
151
|
+
.description('输出填单页 browsertool(纯本地,不调接口)')
|
|
152
|
+
.option('--run-id <id>', 'ask / doc 返回的 runId')
|
|
153
|
+
.option('--answers <json>', '面板回填值(内联 JSON)')
|
|
154
|
+
.option('--answers-file <path>', '面板回填值(JSON 文件,推荐)')
|
|
155
|
+
.option('--attachment-fileid <ids>', '附件 fileid,多个逗号分隔')
|
|
156
|
+
.option('--sdk-render <type>', '打开形态:inline / popup / drawer(默认 drawer)')
|
|
157
|
+
.option('--snapshot <path>', '字段快照路径')
|
|
158
|
+
.action(action(async (ctx, options) => {
|
|
159
|
+
const opts = asOptions(options);
|
|
160
|
+
await runOperation(ctx, 'reception.render', {
|
|
161
|
+
runId: textOf(opts, 'runId') || undefined,
|
|
162
|
+
answers: parseAnswers(opts) || undefined,
|
|
163
|
+
attachmentFileid: textOf(opts, 'attachmentFileid') || undefined,
|
|
164
|
+
sdkRender: textOf(opts, 'sdkRender') || undefined,
|
|
165
|
+
snapshot: textOf(opts, 'snapshot') || undefined,
|
|
166
|
+
}, opts);
|
|
167
|
+
}));
|
|
168
|
+
reception.command('doc-render')
|
|
169
|
+
.description('一次完成「出件 + 传附件 + 拼填单参数」(doc 与 render 合并,省一次工具往返)')
|
|
170
|
+
.option('--run-id <id>', 'ask 返回的 runId')
|
|
171
|
+
.option('--known <json>', 'run 失效时用于现场重建的 7 项抽取结果')
|
|
172
|
+
.option('--known-file <path>', '同上,JSON 文件')
|
|
173
|
+
.option('--answers <json>', '面板回填值(内联 JSON)')
|
|
174
|
+
.option('--answers-file <path>', '面板回填值(JSON 文件,推荐)')
|
|
175
|
+
.option('--cases-file <path>', '案例 + 专家检索结果 JSON')
|
|
176
|
+
.option('--workflow <name>', '目标流程名')
|
|
177
|
+
.option('--out-dir <dir>', '产物输出目录')
|
|
178
|
+
.option('--snapshot <path>', '字段快照路径(同时用于推导 render.py)')
|
|
179
|
+
.option('--render-py <path>', '显式指定 render.py')
|
|
180
|
+
.option('--no-upload', '跳过附件上传,只出本地文件')
|
|
181
|
+
.option('--sdk-render <type>', '打开形态:inline / popup / drawer(默认 drawer)')
|
|
182
|
+
.action(action(async (ctx, options) => {
|
|
183
|
+
const opts = asOptions(options);
|
|
184
|
+
await runOperation(ctx, 'reception.docRender', {
|
|
185
|
+
runId: textOf(opts, 'runId') || undefined,
|
|
186
|
+
known: jsonArg(opts, 'known', { code: 'KNOWN' }) || undefined,
|
|
187
|
+
answers: parseAnswers(opts) || undefined,
|
|
188
|
+
casesFile: textOf(opts, 'casesFile') || undefined,
|
|
189
|
+
workflow: textOf(opts, 'workflow') || undefined,
|
|
190
|
+
outDir: textOf(opts, 'outDir') || undefined,
|
|
191
|
+
snapshot: textOf(opts, 'snapshot') || undefined,
|
|
192
|
+
renderPy: textOf(opts, 'renderPy') || undefined,
|
|
193
|
+
noUpload: opts.upload === false,
|
|
194
|
+
sdkRender: textOf(opts, 'sdkRender') || undefined,
|
|
195
|
+
}, opts);
|
|
196
|
+
}));
|
|
197
|
+
},
|
|
198
|
+
};
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { receptionOperationNames } from './operations/registry.js';
|
|
2
|
+
export const receptionOperations = [
|
|
3
|
+
{
|
|
4
|
+
name: 'reception.ask',
|
|
5
|
+
risk: 'read',
|
|
6
|
+
summary: '按 7 项抽取结果出交互面板:缺项才出屏,总屏数 ≤2(客户需求 + 接待细节)。返回 runId 供 doc 使用。',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: 'object',
|
|
9
|
+
additionalProperties: false,
|
|
10
|
+
required: ['known'],
|
|
11
|
+
properties: {
|
|
12
|
+
known: {
|
|
13
|
+
type: 'object',
|
|
14
|
+
description: '模型抽取的 7 项:customer/headcount/visitDate/visitType/companions/demand/接待细节',
|
|
15
|
+
additionalProperties: true,
|
|
16
|
+
},
|
|
17
|
+
user: { type: 'string', description: '陪同人员姓名,多人用逗号分隔;不传则用当前登录人兜底' },
|
|
18
|
+
customer: { type: 'string', description: '客户名称(覆盖 known.customer)' },
|
|
19
|
+
workflow: { type: 'string', description: '目标流程名,默认「泛微客户参观接待流程」' },
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
outputSchema: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
runId: { type: 'string' },
|
|
26
|
+
panels: { type: 'array', items: { type: 'object' } },
|
|
27
|
+
known: { type: 'object' },
|
|
28
|
+
timings: { type: 'object' },
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'reception.doc',
|
|
34
|
+
risk: 'read',
|
|
35
|
+
summary: '生成客户版行程单 docx 与内部版接待交流参考文档 md,并上传两份附件拿 fileid。零写请求:流程不落库、不提交。',
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
additionalProperties: false,
|
|
39
|
+
properties: {
|
|
40
|
+
runId: { type: 'string', description: 'ask 返回的 runId;run 失效时改用 known 现场重建' },
|
|
41
|
+
known: { type: 'object', description: 'run 失效时的 7 项抽取结果,用于现场重建 run' },
|
|
42
|
+
answers: { type: 'object', description: 'ask_user 面板回填值:{customer_need, logistics, fields}' },
|
|
43
|
+
casesFile: { type: 'string', description: '案例 + 专家检索结果 JSON 文件路径(软依赖,缺省则不注入)' },
|
|
44
|
+
workflow: { type: 'string', description: '目标流程名' },
|
|
45
|
+
outDir: { type: 'string', description: '产物输出目录' },
|
|
46
|
+
noUpload: { type: 'boolean', description: '跳过附件上传,只出本地文件' },
|
|
47
|
+
snapshot: { type: 'string', description: '字段快照路径;同时用于推导技能包内 render.py 位置' },
|
|
48
|
+
renderPy: { type: 'string', description: '显式指定 render.py 路径' },
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
outputSchema: {
|
|
52
|
+
type: 'object',
|
|
53
|
+
properties: {
|
|
54
|
+
runId: { type: 'string' },
|
|
55
|
+
rebuilt: { type: 'boolean' },
|
|
56
|
+
files: { type: 'array', items: { type: 'object' } },
|
|
57
|
+
internalDoc: {
|
|
58
|
+
type: ['object', 'null'],
|
|
59
|
+
description: '内部参考文档正文 {name,path,content};null 表示没生成。模型据此在对话中原样贴出,不必再读产物文件',
|
|
60
|
+
},
|
|
61
|
+
attachments: { type: 'array', items: { type: 'object' } },
|
|
62
|
+
attachmentPending: { type: 'boolean' },
|
|
63
|
+
qa: { type: 'object' },
|
|
64
|
+
verify: { type: 'object' },
|
|
65
|
+
timings: { type: 'object' },
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'reception.render',
|
|
71
|
+
risk: 'read',
|
|
72
|
+
summary: '按快照把接待数据拼成 customParams,输出 <browsertool> 供宿主打开填单页。纯本地,不调接口。',
|
|
73
|
+
inputSchema: {
|
|
74
|
+
type: 'object',
|
|
75
|
+
additionalProperties: false,
|
|
76
|
+
required: ['runId'],
|
|
77
|
+
properties: {
|
|
78
|
+
runId: { type: 'string', description: 'ask / doc 返回的 runId' },
|
|
79
|
+
answers: { type: 'object', description: '面板回填值,覆盖 run.answers' },
|
|
80
|
+
attachmentFileid: { type: 'string', description: '显式指定附件 fileid,多个用逗号分隔' },
|
|
81
|
+
sdkRender: {
|
|
82
|
+
type: 'string',
|
|
83
|
+
enum: ['inline', 'popup', 'drawer'],
|
|
84
|
+
description: '打开形态:drawer 为右侧抽屉(默认)',
|
|
85
|
+
},
|
|
86
|
+
snapshot: { type: 'string', description: '字段快照路径' },
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
outputSchema: {
|
|
90
|
+
type: 'object',
|
|
91
|
+
properties: {
|
|
92
|
+
customParams: { type: 'object' },
|
|
93
|
+
fieldAssignKeys: { type: 'string' },
|
|
94
|
+
detailRowCount: { type: 'integer' },
|
|
95
|
+
attachmentPending: { type: 'boolean' },
|
|
96
|
+
sdkRenderType: { type: 'string' },
|
|
97
|
+
todos: { type: 'array', items: { type: 'string' } },
|
|
98
|
+
browsertool: { type: 'string' },
|
|
99
|
+
browsertoolFile: { type: 'string', description: 'browsertool 落盘的绝对路径(正斜杠)' },
|
|
100
|
+
browsertoolRef: { type: 'string', description: '文件引用形态,宿主支持时模型只输出这一行' },
|
|
101
|
+
timings: { type: 'object' },
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'reception.docRender',
|
|
107
|
+
risk: 'read',
|
|
108
|
+
summary: '一次完成 doc + render:出 docx/md、上传附件、拼 customParams、落 browsertool。'
|
|
109
|
+
+ '两者之间没有人工确认点,合并只为省一次工具往返;失败语义与分开调用一致。',
|
|
110
|
+
inputSchema: {
|
|
111
|
+
type: 'object',
|
|
112
|
+
additionalProperties: false,
|
|
113
|
+
properties: {
|
|
114
|
+
runId: { type: 'string', description: 'ask 返回的 runId;run 失效时改用 known 现场重建' },
|
|
115
|
+
known: { type: 'object', description: 'run 失效时的 7 项抽取结果,用于现场重建 run' },
|
|
116
|
+
answers: { type: 'object', description: 'ask_user 面板回填值:{customer_need, logistics, fields}' },
|
|
117
|
+
casesFile: { type: 'string', description: '案例 + 专家检索结果 JSON 文件路径(软依赖)' },
|
|
118
|
+
workflow: { type: 'string', description: '目标流程名' },
|
|
119
|
+
outDir: { type: 'string', description: '产物输出目录' },
|
|
120
|
+
noUpload: { type: 'boolean', description: '跳过附件上传,只出本地文件' },
|
|
121
|
+
snapshot: { type: 'string', description: '字段快照路径;同时用于推导技能包内 render.py 位置' },
|
|
122
|
+
renderPy: { type: 'string', description: '显式指定 render.py 路径' },
|
|
123
|
+
sdkRender: {
|
|
124
|
+
type: 'string',
|
|
125
|
+
enum: ['inline', 'popup', 'drawer'],
|
|
126
|
+
description: '填单页打开形态:drawer 为右侧抽屉(默认)',
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
outputSchema: {
|
|
131
|
+
type: 'object',
|
|
132
|
+
properties: {
|
|
133
|
+
runId: { type: 'string' },
|
|
134
|
+
rebuilt: { type: 'boolean' },
|
|
135
|
+
files: { type: 'array', items: { type: 'object' } },
|
|
136
|
+
internalDoc: {
|
|
137
|
+
type: ['object', 'null'],
|
|
138
|
+
description: '内部参考文档正文 {name,path,content};null 表示没生成。模型据此在对话中原样贴出,不必再读产物文件',
|
|
139
|
+
},
|
|
140
|
+
attachments: { type: 'array', items: { type: 'object' } },
|
|
141
|
+
attachmentPending: { type: 'boolean' },
|
|
142
|
+
uploadDiagnostics: { type: 'array', items: { type: 'object' } },
|
|
143
|
+
customParams: { type: 'object' },
|
|
144
|
+
fieldAssignKeys: { type: 'string' },
|
|
145
|
+
detailRowCount: { type: 'integer' },
|
|
146
|
+
todos: { type: 'array', items: { type: 'string' } },
|
|
147
|
+
browsertool: { type: 'string' },
|
|
148
|
+
browsertoolFile: { type: 'string' },
|
|
149
|
+
browsertoolRef: { type: 'string' },
|
|
150
|
+
qa: { type: 'object' },
|
|
151
|
+
timings: { type: 'object' },
|
|
152
|
+
},
|
|
153
|
+
},
|
|
154
|
+
},
|
|
155
|
+
];
|
|
156
|
+
export const receptionManifest = {
|
|
157
|
+
schemaVersion: 1,
|
|
158
|
+
name: 'reception',
|
|
159
|
+
title: '泛微客户参观接待流程(面板/出件/填单页)',
|
|
160
|
+
version: '1.0.0',
|
|
161
|
+
host: 'e10-reception',
|
|
162
|
+
status: 'builtin',
|
|
163
|
+
sourceSkill: 'weaver-e10-reception-flow',
|
|
164
|
+
capabilities: ['reception'],
|
|
165
|
+
/** 全链路零写请求:只上传附件,流程由用户在页面上提交。 */
|
|
166
|
+
writePolicy: 'none',
|
|
167
|
+
operations: receptionOperations,
|
|
168
|
+
operationNames: receptionOperationNames,
|
|
169
|
+
};
|
|
170
|
+
/** 命令面自检时用;与 registry 保持一致,避免文档与实现脱节。 */
|
|
171
|
+
export function assertManifestMatchesRegistry() {
|
|
172
|
+
const declared = receptionOperations.map((item) => item.name).sort();
|
|
173
|
+
const registered = [...receptionOperationNames].sort();
|
|
174
|
+
if (declared.join(',') !== registered.join(',')) {
|
|
175
|
+
throw new Error(`manifest 与 registry 不一致:\nmanifest=${declared.join(',')}\nregistry=${registered.join(',')}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { DEFAULT_WORKFLOW } from '../constants.js';
|
|
2
|
+
import { buildPanels } from './panels.js';
|
|
3
|
+
import { newRunId, saveRun } from './runs.js';
|
|
4
|
+
import { nameList } from './shared.js';
|
|
5
|
+
export async function ask(input, ctx) {
|
|
6
|
+
const startedAt = Date.now();
|
|
7
|
+
const known = input.known || {};
|
|
8
|
+
const workflow = input.workflow || DEFAULT_WORKFLOW;
|
|
9
|
+
const warnings = [];
|
|
10
|
+
const customerKeyword = input.customer || (typeof known.customer === 'string' ? known.customer : '');
|
|
11
|
+
// 宿主已支持直接传中文,人机交互前不再查客户/人员的 ID(省掉两次接口往返)。
|
|
12
|
+
// 人员:--user 或 known.companions 里的姓名直接落到 companions;
|
|
13
|
+
// 一个都没有时,compose 用 empId(当前登录人)兜底填「参与人员」。
|
|
14
|
+
const data = { ...known };
|
|
15
|
+
delete data.customerId;
|
|
16
|
+
if (customerKeyword)
|
|
17
|
+
data.customer = customerKeyword;
|
|
18
|
+
// 主联络人优先级:`known.escorts`(明确指定的对接人)> `--user`(陪同)> `known.companions` > 登录人兜底。
|
|
19
|
+
//
|
|
20
|
+
// 事故背景:模型把对接人写在 `escorts`,同时把「当前操作人」当成陪同传给了 `--user`,
|
|
21
|
+
// 旧代码只认后两者,于是主联络人被填成操作人。
|
|
22
|
+
// 因此这里让 `escorts` 赢:它语义最明确(对接人 = 主联络人),而 `--user` 可能是操作人。
|
|
23
|
+
const escorts = nameList(known.escorts);
|
|
24
|
+
const explicitUser = nameList(input.user || '');
|
|
25
|
+
const companions = nameList(known.companions);
|
|
26
|
+
const names = escorts.length ? escorts : (explicitUser.length ? explicitUser : companions);
|
|
27
|
+
if (names.length)
|
|
28
|
+
data.companions = names.map((name) => ({ name }));
|
|
29
|
+
// ask 完全不读会话:解析会话要读加密 auth 并解 keyring,实测 ~300ms,
|
|
30
|
+
// 而 ask 只拿它填 empId(登录人兜底)和 base(拼 URL),这两件事 doc / render 阶段
|
|
31
|
+
// 本来就绕不开会话,放在那里做即可。ask 保持纯本地,冷启动从 643ms 降到 340ms。
|
|
32
|
+
data.empId = '';
|
|
33
|
+
const runId = newRunId();
|
|
34
|
+
saveRun(ctx.stateDir, {
|
|
35
|
+
runId,
|
|
36
|
+
createdAt: new Date().toISOString(),
|
|
37
|
+
workflow,
|
|
38
|
+
outDir: ctx.outDir,
|
|
39
|
+
base: '',
|
|
40
|
+
data,
|
|
41
|
+
customer: null,
|
|
42
|
+
user: null,
|
|
43
|
+
mode: 'browsertool',
|
|
44
|
+
});
|
|
45
|
+
const panels = buildPanels(data);
|
|
46
|
+
return {
|
|
47
|
+
state: 'asked',
|
|
48
|
+
ok: true,
|
|
49
|
+
data: {
|
|
50
|
+
runId,
|
|
51
|
+
known: {
|
|
52
|
+
customer: data.customer || '',
|
|
53
|
+
visitDate: data.visitDate || '',
|
|
54
|
+
visitType: data.visitType || '',
|
|
55
|
+
companions: data.companions || [],
|
|
56
|
+
// 兜底由 render 阶段补:ask 不读会话,这里恒为空
|
|
57
|
+
contactFallback: '',
|
|
58
|
+
},
|
|
59
|
+
panels,
|
|
60
|
+
timings: { totalMs: Date.now() - startedAt },
|
|
61
|
+
},
|
|
62
|
+
warnings,
|
|
63
|
+
next: {
|
|
64
|
+
command: 'ask_user(panels) → weaver-work-cli reception doc --run-id … --answers \'{...}\'',
|
|
65
|
+
reason: '一次问完;answers 原样回传',
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
export const askOperation = {
|
|
70
|
+
execute: (input, ctx) => ask(input, ctx),
|
|
71
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<browsertool>` 渲染。
|
|
3
|
+
*
|
|
4
|
+
* 依据官方《browsertool 渲染说明》:
|
|
5
|
+
* fill_form + data → iframe 填单
|
|
6
|
+
* fill_form + sdkOptions → E10 表单组件化渲染(本文件用的形态)
|
|
7
|
+
* open_web → 打开外部网页 + XiaoEWorkspace 通信(不用于 E10 表单)
|
|
8
|
+
*
|
|
9
|
+
* 打开形态由 `arguments.sdkRenderType` 决定:
|
|
10
|
+
* inline 内嵌(移动端默认)
|
|
11
|
+
* popup / drawer 弹层(PC 端默认;drawer = 右侧抽屉,即"侧边打开")
|
|
12
|
+
* 不传则用宿主默认值(实测为内嵌),所以这里显式给值。
|
|
13
|
+
*
|
|
14
|
+
* 除 title / src / sdkRenderType / 两处 routerProps / params 外全部写死;JSON 用 2 空格缩进。
|
|
15
|
+
*/
|
|
16
|
+
export const SDK_RENDER_TYPES = ['inline', 'popup', 'drawer'];
|
|
17
|
+
function normalizeRenderType(value) {
|
|
18
|
+
const text = String(value || '').trim().toLowerCase();
|
|
19
|
+
return SDK_RENDER_TYPES.includes(text) ? text : '';
|
|
20
|
+
}
|
|
21
|
+
/** 默认形态:右侧抽屉(业务要的就是"侧边打开")。可用 RECEPTION_SDK_RENDER 或 --sdk-render 覆盖。 */
|
|
22
|
+
export const DEFAULT_SDK_RENDER = normalizeRenderType(process.env.RECEPTION_SDK_RENDER) || 'drawer';
|
|
23
|
+
/** 对外:给定入参解析出最终形态(非法值回落到默认)。 */
|
|
24
|
+
export const resolveRenderType = (value) => normalizeRenderType(value) || DEFAULT_SDK_RENDER;
|
|
25
|
+
export function renderBrowsertool(options) {
|
|
26
|
+
const base = String(options.baseUrl || '').replace(/\/+$/u, '');
|
|
27
|
+
const id = String(options.workflowId || '').trim();
|
|
28
|
+
if (!base || !id)
|
|
29
|
+
throw new Error('渲染 browsertool 需要 baseUrl 与 workflowId');
|
|
30
|
+
const renderType = normalizeRenderType(options.sdkRenderType) || DEFAULT_SDK_RENDER;
|
|
31
|
+
const createPath = `/flowpage/create/${id}`;
|
|
32
|
+
const payload = {
|
|
33
|
+
version: 1,
|
|
34
|
+
callId: 'call_001',
|
|
35
|
+
toolId: 'fill_form',
|
|
36
|
+
arguments: {
|
|
37
|
+
type: 'e10',
|
|
38
|
+
title: String(options.workflowName || ''),
|
|
39
|
+
src: `${base}/sp/workflow${createPath}?workflowId=${id}&isCreate=1`,
|
|
40
|
+
sdkRenderType: renderType,
|
|
41
|
+
sdkOptions: {
|
|
42
|
+
compName: 'ui.CorsComponent',
|
|
43
|
+
routerType: 'MemoryRouter',
|
|
44
|
+
routerProps_pc: { initialEntries: [createPath] },
|
|
45
|
+
routerProps_mobile: { initialEntries: [createPath] },
|
|
46
|
+
params_pc: { app: '@weapp/workflow', compName: 'Comp.WffpRoute', noMDialog: true },
|
|
47
|
+
params_mobile: { app: '@weapp/workflow', compName: 'Comp.MWffpRoute', noMDialog: true },
|
|
48
|
+
params: {
|
|
49
|
+
customParams: {
|
|
50
|
+
...options.customParams.values,
|
|
51
|
+
fieldAssignKeys: options.customParams.keys.join(','),
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
return `<browsertool>\n${JSON.stringify(payload, null, 2)}\n</browsertool>`;
|
|
58
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { buildCustomParams } from './customparams.js';
|
|
2
|
+
import { normalizeScheduleRows } from './schedule.js';
|
|
3
|
+
import { nameList } from './shared.js';
|
|
4
|
+
/**
|
|
5
|
+
* 把「接待数据 + 字段快照」合成 customParams(纯本地、零网络)。
|
|
6
|
+
*
|
|
7
|
+
* 这是渲染段的核心:不依赖实时 formctx,也不需要 continuation。
|
|
8
|
+
* 字段清单来自技能包里的快照,字段 ID 与 doNotWrite / attachmentMountField 都在快照里。
|
|
9
|
+
*/
|
|
10
|
+
const pick = (map, key) => (key && map && map[String(key)] !== undefined ? String(map[String(key)]) : '');
|
|
11
|
+
/** 附件 id 归一:接受 [{fileid,name}] / ['id1','id2'] / 'id1,id2' / 单串,返回去重后的 id 数组。 */
|
|
12
|
+
export function normAttachmentIds(list, single = '') {
|
|
13
|
+
const fromList = (Array.isArray(list) ? list : [])
|
|
14
|
+
.map((item) => {
|
|
15
|
+
if (typeof item === 'string')
|
|
16
|
+
return item.trim();
|
|
17
|
+
if (!item || typeof item !== 'object')
|
|
18
|
+
return '';
|
|
19
|
+
const record = item;
|
|
20
|
+
return String(record.fileid || record.optionId || record.fileId || record.id || '').trim();
|
|
21
|
+
})
|
|
22
|
+
.filter(Boolean);
|
|
23
|
+
if (fromList.length)
|
|
24
|
+
return [...new Set(fromList)];
|
|
25
|
+
return String(single || '').split(',').map((item) => item.trim()).filter(Boolean);
|
|
26
|
+
}
|
|
27
|
+
export function composeInitialValues(options) {
|
|
28
|
+
const { snapshot, data = {}, attachmentFileid = '', attachmentFileids = null } = options;
|
|
29
|
+
const fields = (snapshot && snapshot.fields) || [];
|
|
30
|
+
const codes = (snapshot && snapshot.optionCodes) || {};
|
|
31
|
+
const warnings = [];
|
|
32
|
+
const todos = [];
|
|
33
|
+
const params = { values: {}, keys: [] };
|
|
34
|
+
const valueOf = (name) => {
|
|
35
|
+
switch (name) {
|
|
36
|
+
// 客户名直接传中文,宿主已支持;不再拼 {id,name} 对象
|
|
37
|
+
case '来访客户名称':
|
|
38
|
+
return data.customer || '';
|
|
39
|
+
case '参观访问类型':
|
|
40
|
+
return pick(codes['参观访问类型'], data.visitType) || data.visitType || '';
|
|
41
|
+
case '客户到达日期':
|
|
42
|
+
case '客户参观日期':
|
|
43
|
+
return data.visitDate || data.arrivalDate || '';
|
|
44
|
+
case '客户需求':
|
|
45
|
+
return data.demand || '';
|
|
46
|
+
case '客户性质':
|
|
47
|
+
return pick(codes['客户性质'], data.nature) || data.nature || '';
|
|
48
|
+
case '项目金额(万元)':
|
|
49
|
+
return data.amount === 0 || data.amount ? data.amount : '';
|
|
50
|
+
case '泛微分支机构参与人员(主联络人,此人必须陪客户一同参观)': {
|
|
51
|
+
// escorts 是用户明确指定的对接人,优先级最高:companions 可能被 --user 覆盖成当前操作人。
|
|
52
|
+
// 直接传中文姓名;一个都没有时才用当前登录人 employeeid 兜底。
|
|
53
|
+
const escorts = nameList(data.escorts);
|
|
54
|
+
if (escorts.length)
|
|
55
|
+
return escorts;
|
|
56
|
+
const list = Array.isArray(data.companions) ? data.companions : [];
|
|
57
|
+
const names = list
|
|
58
|
+
.map((item) => (typeof item === 'string' ? item : item && (item.name || item.id)))
|
|
59
|
+
.map((item) => String(item || '').trim())
|
|
60
|
+
.filter(Boolean);
|
|
61
|
+
if (names.length)
|
|
62
|
+
return names;
|
|
63
|
+
return data.empId ? [String(data.empId)] : [];
|
|
64
|
+
}
|
|
65
|
+
case '是否需要高层参与':
|
|
66
|
+
return pick(codes['是否需要高层参与'], data.senior) || data.senior || '';
|
|
67
|
+
case '客户带队人':
|
|
68
|
+
return data.leader || '';
|
|
69
|
+
case '客户参观接待行程单(由行政经理汇总后反馈)':
|
|
70
|
+
// doNotWrite,走下方挂载字段
|
|
71
|
+
return '';
|
|
72
|
+
default:
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const items = [];
|
|
77
|
+
for (const field of fields) {
|
|
78
|
+
if (field.doNotWrite)
|
|
79
|
+
continue;
|
|
80
|
+
const value = valueOf(field.name);
|
|
81
|
+
if (value === '' || value === null || value === undefined) {
|
|
82
|
+
if (field.required && ['客户性质', '项目金额(万元)', '客户带队人', '是否需要高层参与'].includes(field.name)) {
|
|
83
|
+
todos.push(`${field.name} 未填`);
|
|
84
|
+
}
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
items.push({ fieldId: field.id, value });
|
|
88
|
+
}
|
|
89
|
+
// 附件挂载字段(不在 formctx 的 10 个字段里,但页面认这个 id)
|
|
90
|
+
// 多附件(行程单 docx + 接待方案 md):同字段多值用 `,`,交给 buildCustomParams 拼
|
|
91
|
+
const mount = (snapshot && snapshot.attachmentMountField && snapshot.attachmentMountField.fieldId) || '';
|
|
92
|
+
const attachIds = normAttachmentIds(attachmentFileids, attachmentFileid);
|
|
93
|
+
const attachmentPending = attachIds.length === 0;
|
|
94
|
+
if (mount && attachIds.length)
|
|
95
|
+
items.push({ fieldId: mount, value: attachIds });
|
|
96
|
+
// 日程明细开关 + 7 列
|
|
97
|
+
const details = (snapshot && snapshot.details) || {};
|
|
98
|
+
const rows = normalizeScheduleRows(data);
|
|
99
|
+
const switchCode = (details.switch && details.switch.codes && details.switch.codes[details.switch.on]) || '1';
|
|
100
|
+
if (rows.length && details.switch)
|
|
101
|
+
items.push({ fieldId: details.switch.fieldId, value: switchCode });
|
|
102
|
+
for (const [semantic, fieldId] of Object.entries(details.columns || {})) {
|
|
103
|
+
rows.forEach((row, index) => items.push({
|
|
104
|
+
fieldId: String(fieldId),
|
|
105
|
+
value: row[semantic],
|
|
106
|
+
dataIndex: index,
|
|
107
|
+
}));
|
|
108
|
+
}
|
|
109
|
+
if (!rows.length)
|
|
110
|
+
warnings.push('日程明细为 0 行:页面上明细会是空的');
|
|
111
|
+
const built = buildCustomParams(items);
|
|
112
|
+
params.values = built.values;
|
|
113
|
+
params.keys = built.keys;
|
|
114
|
+
if (attachmentPending)
|
|
115
|
+
todos.push('行程单附件未上传(可在页面手动添加)');
|
|
116
|
+
if (!data.companions || !data.companions.length)
|
|
117
|
+
todos.push('陪同人员未填');
|
|
118
|
+
if (!data.demand)
|
|
119
|
+
todos.push('客户需求未填');
|
|
120
|
+
return {
|
|
121
|
+
values: params.values,
|
|
122
|
+
keys: params.keys,
|
|
123
|
+
todos,
|
|
124
|
+
warnings,
|
|
125
|
+
attachmentPending,
|
|
126
|
+
detailRowCount: rows.length,
|
|
127
|
+
items,
|
|
128
|
+
};
|
|
129
|
+
}
|