weaver-work-cli 0.1.32 → 0.1.33
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 +2 -2
- package/dist/chunks/{archive-UMGX72K6.js → archive-FVFY6GZN.js} +2 -2
- package/dist/chunks/{archive-oa-N2IYBLF3.js → archive-oa-NW3OD4UV.js} +2 -2
- package/dist/chunks/{asset-GLEGKFG5.js → asset-7QJKMIDV.js} +2 -2
- package/dist/chunks/{attachment-content-AQNX5N3S.js → attachment-content-OSAVA6K3.js} +3 -2
- package/dist/chunks/{blog-E44OTVDA.js → blog-I7SDPNW4.js} +2 -2
- package/dist/chunks/{caizhilian-DQUFZXZL.js → caizhilian-O37ZIQNY.js} +2 -2
- package/dist/chunks/{calendar-JKPIRKFD.js → calendar-7KXE4ED3.js} +2 -2
- package/dist/chunks/{chunk-4YC43QQ4.js → chunk-2FLWXFVS.js} +4 -4
- package/dist/chunks/{chunk-QWY6PGL6.js → chunk-2LV74IWP.js} +361 -56
- package/dist/chunks/chunk-3SO6QL6U.js +73 -0
- package/dist/chunks/{chunk-DW6AUUKS.js → chunk-6ATGWRZM.js} +6 -4
- package/dist/chunks/chunk-BYATLLEF.js +68 -0
- package/dist/chunks/chunk-BYBSCN4X.js +932 -0
- package/dist/chunks/{chunk-2GA5ZIQL.js → chunk-D223PTXU.js} +1 -0
- package/dist/chunks/{chunk-H7J4DC5R.js → chunk-EEWPQE3O.js} +2 -2
- package/dist/chunks/{chunk-6RKD4DRZ.js → chunk-GFPXQIY2.js} +2 -2
- package/dist/chunks/{chunk-C6R3B2ML.js → chunk-HEL5XTYI.js} +12 -6
- package/dist/chunks/{chunk-CVZ2JOSW.js → chunk-IHUYP6LO.js} +1 -1
- package/dist/chunks/{chunk-YRVDW4WN.js → chunk-ILMBNVSG.js} +2 -2
- package/dist/chunks/{chunk-G3QJULO2.js → chunk-KAS45KNR.js} +1 -1
- package/dist/chunks/{chunk-H6XSTSLM.js → chunk-MEEFGWTM.js} +54 -196
- package/dist/chunks/{chunk-GCG2NMWR.js → chunk-MQ2I5AA3.js} +4 -2
- package/dist/chunks/chunk-NHA62QD7.js +774 -0
- package/dist/chunks/{chunk-WKI2FBIQ.js → chunk-OCU4RLHC.js} +641 -309
- package/dist/chunks/{chunk-WSKBSQ2U.js → chunk-PRHJGPMA.js} +2 -2
- package/dist/chunks/{chunk-6EFWDL7Y.js → chunk-Q6LWB5HX.js} +2 -2
- package/dist/chunks/{chunk-IURUFGZK.js → chunk-RBGOMK4Y.js} +50 -33
- package/dist/chunks/chunk-VBCFFFGT.js +226 -0
- package/dist/chunks/{ebuilder-form-V5FG2EHC.js → chunk-WRRJ4GG2.js} +22 -1148
- package/dist/chunks/{chunk-E4Z23GHM.js → chunk-WY74UBJ6.js} +264 -750
- package/dist/chunks/conflict-SFNEVJY5.js +21 -0
- package/dist/chunks/continuation-RN6PZN2M.js +11 -0
- package/dist/chunks/cowork-CKWYHXYB.js +2508 -0
- package/dist/chunks/ebuilder-form-KOLJRVZD.js +121 -0
- package/dist/chunks/{ehr-HMFY6VIL.js → ehr-WFOC3B4D.js} +1174 -20
- package/dist/chunks/{esb-ZYSVB7SG.js → esb-LJZTN663.js} +4 -4
- package/dist/chunks/{fna-B7RKPAZD.js → fna-F7QRIIZC.js} +2 -2
- package/dist/chunks/{host-45WED2KK.js → host-BCGUVEWX.js} +3 -3
- package/dist/chunks/host-BQBRHVR3.js +23 -0
- package/dist/chunks/{host-I4Z6BFYX.js → host-DGE2TZD4.js} +3 -3
- package/dist/chunks/{host-KNZ52LJZ.js → host-KXPTEWFS.js} +3 -3
- package/dist/chunks/{host-OCH2BCCV.js → host-VQ6JJXGQ.js} +3 -3
- package/dist/chunks/{hrm-2KAZGUHI.js → hrm-NI6XAKW5.js} +3 -3
- package/dist/chunks/{im-ACJJWH4U.js → im-7TRTF3KT.js} +88 -12
- package/dist/chunks/{invoice-ZK3WCX2U.js → invoice-AOXWJKYT.js} +3 -3
- package/dist/chunks/{jiuchuanhui-5PQD3IL2.js → jiuchuanhui-7NQWEZAW.js} +2 -2
- package/dist/chunks/{lazy-dispatch-JQXBW3GM.js → lazy-dispatch-RNS4EE4S.js} +4 -4
- package/dist/chunks/{mail-S2HDDXO2.js → mail-VDHJAB4O.js} +3 -3
- package/dist/chunks/{meeting-QVN3I37L.js → meeting-GA7XCNNP.js} +214 -43
- package/dist/chunks/{okr-QNG4VC2Q.js → okr-TQIRERPQ.js} +2 -2
- package/dist/chunks/operations-5QL3AECO.js +11 -0
- package/dist/chunks/{plan-A25EMW6U.js → plan-4RY4LN2P.js} +2 -2
- package/dist/chunks/{project-G6XV66DZ.js → project-D6XT2OC5.js} +2 -2
- package/dist/chunks/{registry-DC6KR3NH.js → registry-JHRIDQ3A.js} +4 -4
- package/dist/chunks/{registry-2VLUAESA.js → registry-OZSMDVPP.js} +2 -2
- package/dist/chunks/{registry-TI3CIUXF.js → registry-QKMI43Q6.js} +8 -6
- package/dist/chunks/{registry-7C5UMIPL.js → registry-VOGKFFTR.js} +2 -2
- package/dist/chunks/{room-recommend-WRTHO6Y2.js → room-recommend-D4EUOOWY.js} +4 -3
- package/dist/chunks/{schedule-KFIITGSK.js → schedule-XPFBHPCV.js} +4 -3
- package/dist/chunks/{workflow-DJ7SYWAF.js → workflow-HLBZRWIY.js} +172 -6
- package/dist/index.js +30 -25
- package/dist/internal/e10/auth-recovery.js +14 -4
- package/dist/shortcuts/contract/host.js +34 -59
- package/dist/shortcuts/cowork/continuation.js +70 -0
- package/dist/shortcuts/cowork/errors.js +59 -0
- package/dist/shortcuts/cowork/host.js +172 -0
- package/dist/shortcuts/cowork/index.js +166 -0
- package/dist/shortcuts/cowork/manifest.js +65 -0
- package/dist/shortcuts/cowork/operations/discuss-write.js +277 -0
- package/dist/shortcuts/cowork/operations/item-write.js +380 -0
- package/dist/shortcuts/cowork/operations/member-write.js +283 -0
- package/dist/shortcuts/cowork/operations/permission-write.js +286 -0
- package/dist/shortcuts/cowork/operations/read.js +423 -0
- package/dist/shortcuts/cowork/operations/registry.js +39 -0
- package/dist/shortcuts/cowork/operations/review-write.js +157 -0
- package/dist/shortcuts/cowork/operations/shared.js +215 -0
- package/dist/shortcuts/cowork/operations/types.js +24 -0
- package/dist/shortcuts/cowork/operations.js +19 -0
- package/dist/shortcuts/ehr/host.js +4 -1
- package/dist/shortcuts/ehr/operations/recruit-candidate-import.js +757 -0
- package/dist/shortcuts/ehr/operations/recruit-position.js +367 -0
- package/dist/shortcuts/ehr/operations/recruit-stats.js +133 -0
- package/dist/shortcuts/ehr/operations/recruit-write.js +8 -16
- package/dist/shortcuts/ehr/operations/recruit.js +35 -10
- package/dist/shortcuts/ehr/operations/registry.js +6 -0
- package/dist/shortcuts/im/diagnostics.js +97 -0
- package/dist/shortcuts/im/host.js +58 -31
- package/dist/shortcuts/im/index.js +7 -2
- package/dist/shortcuts/im/operations/at-mention.js +127 -0
- package/dist/shortcuts/im/operations/file-user.js +10 -2
- package/dist/shortcuts/im/operations/group-read.js +26 -5
- package/dist/shortcuts/im/operations/group-write.js +35 -28
- package/dist/shortcuts/im/operations/msg-sync.js +7 -2
- package/dist/shortcuts/im/operations/msg-write.js +76 -10
- package/dist/shortcuts/im/operations/quote-mention.js +119 -0
- package/dist/shortcuts/im/operations/session.js +1 -1
- package/dist/shortcuts/im/operations/shared.js +10 -0
- package/dist/shortcuts/im/operations/types.js +13 -0
- package/dist/shortcuts/index.js +5 -0
- package/dist/shortcuts/mail/host.js +4 -1
- package/dist/shortcuts/meeting/host.js +27 -34
- package/dist/shortcuts/meeting/operations/create.js +4 -1
- package/dist/shortcuts/meeting/operations/eb/catalog.js +5 -0
- package/dist/shortcuts/meeting/operations/eb/conflict.js +78 -7
- package/dist/shortcuts/meeting/operations/eb/create-flow.js +168 -26
- package/dist/shortcuts/meeting/operations/eb/factory.js +69 -1
- package/dist/shortcuts/meeting/operations/eb/index.js +16 -3
- package/dist/shortcuts/meeting/operations/eb/room-recommend.js +14 -3
- package/dist/shortcuts/meeting/operations/eb-fallback.js +159 -0
- package/dist/shortcuts/meeting/operations/env.js +93 -46
- package/dist/shortcuts/meeting/operations/form-fields.js +110 -0
- package/dist/shortcuts/meeting/operations/registry.js +2 -0
- package/dist/shortcuts/meeting/operations/standard-guard.js +71 -0
- package/dist/shortcuts/meeting/operations.js +16 -0
- package/dist/shortcuts/workflow/index.js +110 -1
- package/dist/shortcuts/workflow/operations/form.js +24 -3
- package/dist/shortcuts/workflow/operations/read.js +104 -23
- package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupRules.js +448 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/aigroupStore.js +106 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/businessRules.js +47 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.collect.js +30 -23
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.core.js +1 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.group.js +1 -0
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.groupSummary.js +2 -1
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.js +2 -4
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.smartGroup.js +138 -181
- package/dist/shortcuts/workflow/operations/todoSmartConvert/todoSmartConvert.summary.js +12 -7
- package/docs/e10-auth.md +1 -1
- package/docs/im.md +8 -1
- package/docs/todo-smart-convert/README.md +1 -1
- package/docs/todo-smart-convert/data-contract.md +2 -2
- package/docs/todo-smart-convert/subgroup-rules.md +6 -0
- package/package.json +1 -1
- package/skill-template/domains/yimiaoban.md +3 -3
- package/skill-template/skill-template.md +1 -1
- package/skills/weaver-e10-blog/SKILL.md +5 -5
- package/skills/weaver-e10-caizhilian/SKILL.md +5 -5
- package/skills/weaver-e10-calendar/SKILL.md +5 -5
- package/skills/weaver-e10-esb/SKILL.md +5 -5
- package/skills/weaver-e10-hrm/SKILL.md +5 -5
- package/skills/weaver-e10-jinchengda/SKILL.md +2 -2
- package/skills/weaver-e10-jiuchuanhui/SKILL.md +5 -5
- package/skills/weaver-e10-jucailin/SKILL.md +18 -12
- package/skills/weaver-e10-jucailin/references/recruit-create.md +104 -0
- package/skills/weaver-e10-mail/SKILL.md +5 -5
- package/skills/weaver-e10-meeting/SKILL.md +171 -25
- package/skills/weaver-e10-meeting/references/meeting-eb.md +4 -3
- package/skills/weaver-e10-meeting/references/meeting-queries.md +9 -6
- package/skills/weaver-e10-meeting/references/meeting-verification.md +8 -6
- package/skills/weaver-e10-meeting.zip +0 -0
- package/skills/weaver-e10-okr/SKILL.md +5 -5
- package/skills/weaver-e10-okr/references/source-manifest.json +3 -3
- package/skills/weaver-e10-plan/SKILL.md +5 -5
- package/skills/weaver-e10-shared/SKILL.md +12 -12
- package/skills/weaver-e10-shared/references/e10-auth-and-session.md +4 -4
- package/skills/weaver-e10-wenshuding/SKILL.md +5 -5
- package/skills/weaver-e10-workflow/SKILL.md +29 -5
- package/skills/weaver-e10-workflow/aigroup/default.json +88 -0
- package/skills/weaver-e10-workflow/references/todo-smart-convert.md +66 -14
- package/skills/weaver-e10-workflow/references/workflow-agent-entry.md +1 -1
- package/skills/weaver-e10-workflow/references/workflow-memory.md +1 -1
- package/skills/weaver-e10-workflow/references/workflow-query.md +12 -10
- package/skills/weaver-e10-workflow/references/workflow-view.md +2 -2
- package/skills/weaver-e10-workflow/tools/todo-serve.cjs +239 -0
- package/skills/weaver-e10-workflow/{scripts → tools}/todo-summary.cjs +218 -28
- package/skills/weaver-e10-yepiaotong/SKILL.md +10 -8
- package/skills/weaver-e10-yepiaotong/references/invoice-reim.md +7 -7
- package/skills/weaver-e10-yepiaotong/references/reim-api-reference.md +10 -10
- package/skills/weaver-e10-yepiaotong/references/reim-examples.md +40 -37
- package/skills/weaver-e10-yepiaotong/references/reim-expense-subject-rules.md +4 -4
- package/skills/weaver-e10-yepiaotong/references/reim-form-fill-rules.md +27 -38
- package/skills/weaver-e10-yepiaotong/references/reim-phone-subsidy-rules.md +4 -4
- package/skills/weaver-e10-yepiaotong/references/reim-workflow.md +37 -29
- package/skills/weaver-e10-yimiaoban/SKILL.md +156 -33
- package/skills/weaver-e10-yimiaoban/references/ding-write.md +1 -1
- package/skills/weaver-e10-yimiaoban/references/error-codes.md +5 -1
- package/skills/weaver-e10-yimiaoban/references/group-read.md +5 -1
- package/skills/weaver-e10-yimiaoban/references/group-write.md +6 -4
- package/skills/weaver-e10-yimiaoban/references/msg-read.md +1 -0
- package/skills/weaver-e10-yimiaoban/references/msg-write.md +34 -2
- package/skills/weaver-e10-yimiaoban/references/safety-boundaries.md +5 -2
- package/skills/weaver-e10-yimiaoban/references/source-manifest.json +79 -58
- package/skills/weaver-e10-yimiaoban/references/user-remind.md +2 -2
- package/skills/weaver-e10-ziguanjia/SKILL.md +5 -5
|
@@ -1,18 +1,29 @@
|
|
|
1
1
|
import { createRequire as __esbuildCreateRequire } from 'node:module';
|
|
2
2
|
const require = __esbuildCreateRequire(import.meta.url);
|
|
3
|
-
import {
|
|
4
|
-
meetingEbScheduleOperations
|
|
5
|
-
} from "./chunk-4YC43QQ4.js";
|
|
6
3
|
import {
|
|
7
4
|
ebRoomRecommendOperation,
|
|
8
5
|
recommendRooms,
|
|
9
6
|
rememberFrequentRoom
|
|
10
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-HEL5XTYI.js";
|
|
8
|
+
import {
|
|
9
|
+
meetingEbScheduleOperations
|
|
10
|
+
} from "./chunk-2FLWXFVS.js";
|
|
11
|
+
import {
|
|
12
|
+
ebMeetingWritePreflight,
|
|
13
|
+
fetchEbAppSettings,
|
|
14
|
+
findCommonFreeSlots,
|
|
15
|
+
meetingEbConflictOperations
|
|
16
|
+
} from "./chunk-NHA62QD7.js";
|
|
11
17
|
import {
|
|
12
18
|
listMeetingAttachments,
|
|
13
19
|
meetingAttachmentContentOperations,
|
|
14
20
|
renderDocx
|
|
15
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-MQ2I5AA3.js";
|
|
22
|
+
import {
|
|
23
|
+
meetingEnvOperations,
|
|
24
|
+
meetingStateDir,
|
|
25
|
+
resolveMeetingEnvMode
|
|
26
|
+
} from "./chunk-VBCFFFGT.js";
|
|
16
27
|
import {
|
|
17
28
|
EB_BASE,
|
|
18
29
|
EB_ENDPOINTS,
|
|
@@ -31,9 +42,7 @@ import {
|
|
|
31
42
|
fingerprint,
|
|
32
43
|
meetingConfirmationError,
|
|
33
44
|
meetingConflictError,
|
|
34
|
-
meetingEnvOperations,
|
|
35
45
|
meetingPartialError,
|
|
36
|
-
meetingStateDir,
|
|
37
46
|
meetingSuccess,
|
|
38
47
|
meetingValidationError,
|
|
39
48
|
mergeSnapshot,
|
|
@@ -41,13 +50,12 @@ import {
|
|
|
41
50
|
pickBusinessInput,
|
|
42
51
|
queryBody,
|
|
43
52
|
requireConfirm,
|
|
44
|
-
resolveMeetingEnvMode,
|
|
45
53
|
schemaOf,
|
|
46
54
|
toIdCsv,
|
|
47
55
|
toIdString,
|
|
48
56
|
verifyLease,
|
|
49
57
|
writeBody
|
|
50
|
-
} from "./chunk-
|
|
58
|
+
} from "./chunk-MEEFGWTM.js";
|
|
51
59
|
|
|
52
60
|
// src/shortcuts/meeting/operations/meetings.ts
|
|
53
61
|
function overlapsDate(beginDatetime, endDatetime, date) {
|
|
@@ -776,7 +784,7 @@ async function assertCreatePathAllowed(args, env) {
|
|
|
776
784
|
if (!isRepeat && Number(base.onlyFlowCreate) === 1) {
|
|
777
785
|
throw meetingConflictError(
|
|
778
786
|
"conflict_rejected",
|
|
779
|
-
"\u8BE5\u79DF\u6237 onlyFlowCreate=1\uFF1A\u4F1A\u8BAE\u53EA\u80FD\u901A\u8FC7\u6D41\u7A0B\u521B\u5EFA\
|
|
787
|
+
"\u8BE5\u79DF\u6237 onlyFlowCreate=1\uFF1A\u4F1A\u8BAE\u53EA\u80FD\u901A\u8FC7\u6D41\u7A0B\u521B\u5EFA\uFF0C\u76F4\u8FDE\u5EFA\u4F1A\u5DF2\u88AB\u62D2\u7EDD\uFF08\u4E0D\u4F1A\u5199\u5165\u4EFB\u4F55\u6570\u636E\uFF09\u3002\u4E0D\u7528\u505C\u624B \u2014\u2014 \u6539\u8D70 **meeting.eb.meeting.create.flow**\uFF08prepare\u2192apply\uFF09\u5373\u53EF\uFF1A\u5B83\u4F1A\u8F7D\u5165\u5EFA\u4F1A\u6D41\u7A0B\u8868\u5355\u3001\u63D0\u4EA4\u5BA1\u6279\uFF0C\u5E76\u5728\u4F1A\u8BAE\u751F\u6210\u540E\u81EA\u52A8\u51FA\u9080\u8BF7\u51FD\u3002\u5982\u9700\u76F4\u8FDE\u5EFA\u4F1A\uFF0C\u8BF7\u7BA1\u7406\u5458\u5148\u5728\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u4E2D\u5173\u95ED\u8BE5\u5F00\u5173\u3002",
|
|
780
788
|
{ workFlowBaseIds: base.workFlowBaseIds ?? "" }
|
|
781
789
|
);
|
|
782
790
|
}
|
|
@@ -2213,7 +2221,7 @@ var meetingAttachmentAttach = {
|
|
|
2213
2221
|
if (mode === "append" && existingIds.length === 0) {
|
|
2214
2222
|
existingIds.push(...beforeIds);
|
|
2215
2223
|
}
|
|
2216
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
2224
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
2217
2225
|
const list = getMeetingOperation2("meeting.eb.meeting.list");
|
|
2218
2226
|
let fileId = incomingFileId;
|
|
2219
2227
|
let name = String(args.name ?? "").trim();
|
|
@@ -2301,7 +2309,7 @@ function textOf(value) {
|
|
|
2301
2309
|
return value === void 0 || value === null ? "" : String(value);
|
|
2302
2310
|
}
|
|
2303
2311
|
async function readMinute(env, id) {
|
|
2304
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
2312
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
2305
2313
|
const detail = getMeetingOperation2("meeting.eb.minute.detail");
|
|
2306
2314
|
const result = await detail.handler({ id }, env);
|
|
2307
2315
|
const row = result?.data?.data;
|
|
@@ -2380,7 +2388,7 @@ var meetingMinuteWriteContent = {
|
|
|
2380
2388
|
} else {
|
|
2381
2389
|
statusReason = "\u4EC5\u6E05\u7A7A\u5185\u5BB9\uFF0C\u672A\u6539\u72B6\u6001";
|
|
2382
2390
|
}
|
|
2383
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
2391
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
2384
2392
|
const prepare = getMeetingOperation2("meeting.eb.minute.update.prepare");
|
|
2385
2393
|
const apply = getMeetingOperation2("meeting.eb.minute.update.apply");
|
|
2386
2394
|
const prepared = await prepare.handler({ id, mt_id: mtId, ...patch }, env);
|
|
@@ -2738,7 +2746,7 @@ var meetingMinuteFromGroupChat = {
|
|
|
2738
2746
|
const mtId = textOf2(args.mt_id).trim();
|
|
2739
2747
|
if (!mtId) throw meetingValidationError("mt_id_required", "\u5FC5\u987B\u63D0\u4F9B\u4F1A\u8BAE id\uFF08mt_id\uFF09");
|
|
2740
2748
|
const pipeline = ["text", "minutes", "document"].includes(args.pipeline) ? args.pipeline : "text";
|
|
2741
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
2749
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
2742
2750
|
const ctx = env.ctx;
|
|
2743
2751
|
let stepStart = Date.now();
|
|
2744
2752
|
const listed = await getMeetingOperation2("meeting.eb.meeting.list").handler(
|
|
@@ -2762,9 +2770,9 @@ var meetingMinuteFromGroupChat = {
|
|
|
2762
2770
|
}
|
|
2763
2771
|
mark("readMeeting", stepStart);
|
|
2764
2772
|
const pullStart = Date.now();
|
|
2765
|
-
const { createImHost } = await import("./host-
|
|
2773
|
+
const { createImHost } = await import("./host-DGE2TZD4.js");
|
|
2766
2774
|
const { createImContinuationSigner } = await import("./continuation-2CKSBLA6.js");
|
|
2767
|
-
const { getImOperation } = await import("./registry-
|
|
2775
|
+
const { getImOperation } = await import("./registry-OZSMDVPP.js");
|
|
2768
2776
|
const imEnv = { ctx, host: createImHost(ctx), continuation: createImContinuationSigner(ctx) };
|
|
2769
2777
|
const syncOp = getImOperation("im.msg.sync.group");
|
|
2770
2778
|
const chatWindow = computeChatWindow(meeting);
|
|
@@ -2832,7 +2840,7 @@ var meetingMinuteFromGroupChat = {
|
|
|
2832
2840
|
try {
|
|
2833
2841
|
const { readFile: readFile4 } = await import("node:fs/promises");
|
|
2834
2842
|
const buffer = await readFile4(file);
|
|
2835
|
-
const { extractText } = await import("./attachment-content-
|
|
2843
|
+
const { extractText } = await import("./attachment-content-OSAVA6K3.js");
|
|
2836
2844
|
const extracted = extractText(buffer, file, "");
|
|
2837
2845
|
if (extracted.text.trim()) {
|
|
2838
2846
|
extraSections.push(`\u3010\u6750\u6599\uFF1A${file.split(/[\\/]/).pop() ?? file}\u3011
|
|
@@ -2959,9 +2967,9 @@ ${groupTranscript}` : ""
|
|
|
2959
2967
|
if (!employeeId) {
|
|
2960
2968
|
warnings.push("\u672A\u53D6\u5230 ESB \u89E6\u53D1\u4EBA id\uFF08employeeId\uFF09\uFF0C\u5DF2\u8DF3\u8FC7\u540E\u7EED ESB \u8C03\u7528");
|
|
2961
2969
|
} else {
|
|
2962
|
-
const { createEsbHost } = await import("./host-
|
|
2970
|
+
const { createEsbHost } = await import("./host-BCGUVEWX.js");
|
|
2963
2971
|
const { createEsbContinuationSigner } = await import("./continuation-NLECEJPX.js");
|
|
2964
|
-
const { getEsbOperation } = await import("./registry-
|
|
2972
|
+
const { getEsbOperation } = await import("./registry-JHRIDQ3A.js");
|
|
2965
2973
|
const esbEnv = { ctx, host: createEsbHost(ctx), continuation: createEsbContinuationSigner(ctx) };
|
|
2966
2974
|
const prepareOp = getEsbOperation("esb.trigger.prepare");
|
|
2967
2975
|
const applyOp = getEsbOperation("esb.trigger.apply");
|
|
@@ -3145,7 +3153,7 @@ var meetingDecisionNotifyGroup = {
|
|
|
3145
3153
|
const warnings = [];
|
|
3146
3154
|
const mtId = textOf3(args.mt_id).trim();
|
|
3147
3155
|
if (!mtId) throw meetingValidationError("mt_id_required", "\u5FC5\u987B\u63D0\u4F9B\u4F1A\u8BAE id\uFF08mt_id\uFF09");
|
|
3148
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
3156
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
3149
3157
|
const ctx = env.ctx;
|
|
3150
3158
|
const listed = await getMeetingOperation2("meeting.eb.meeting.list").handler(
|
|
3151
3159
|
{ mt_id: mtId, pageNo: 1, pageSize: 1 },
|
|
@@ -3209,7 +3217,7 @@ var meetingDecisionNotifyGroup = {
|
|
|
3209
3217
|
charCount: formatted.text.length,
|
|
3210
3218
|
text: formatted.text
|
|
3211
3219
|
};
|
|
3212
|
-
const { createImHost } = await import("./host-
|
|
3220
|
+
const { createImHost } = await import("./host-DGE2TZD4.js");
|
|
3213
3221
|
const imHost = createImHost(ctx);
|
|
3214
3222
|
let displayText = formatted.text;
|
|
3215
3223
|
let wireText = formatted.text;
|
|
@@ -3217,7 +3225,7 @@ var meetingDecisionNotifyGroup = {
|
|
|
3217
3225
|
const mentioned = [];
|
|
3218
3226
|
if (args.mention !== false) {
|
|
3219
3227
|
try {
|
|
3220
|
-
const { getImOperation } = await import("./registry-
|
|
3228
|
+
const { getImOperation } = await import("./registry-OZSMDVPP.js");
|
|
3221
3229
|
const membersResult = await getImOperation("im.group.users").handler(
|
|
3222
3230
|
{ groupId },
|
|
3223
3231
|
{ ctx, host: imHost }
|
|
@@ -3447,7 +3455,7 @@ var meetingPipelineRun = {
|
|
|
3447
3455
|
const needsConfirm = level === "tasks" || level === "notify";
|
|
3448
3456
|
const confirmed = args.confirm === true;
|
|
3449
3457
|
const executedLevel = needsConfirm && !confirmed ? "document" : level;
|
|
3450
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
3458
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
3451
3459
|
const ctx = env.ctx;
|
|
3452
3460
|
let stepStart = Date.now();
|
|
3453
3461
|
const reuseMinuteId = textOf4(args.minuteId).trim();
|
|
@@ -3516,7 +3524,7 @@ var meetingPipelineRun = {
|
|
|
3516
3524
|
]);
|
|
3517
3525
|
}
|
|
3518
3526
|
stepStart = Date.now();
|
|
3519
|
-
const { createHrmHost } = await import("./host-
|
|
3527
|
+
const { createHrmHost } = await import("./host-KXPTEWFS.js");
|
|
3520
3528
|
const { getHrmOperation } = await import("./registry-NYPYMZXG.js");
|
|
3521
3529
|
const hrmEnv = { ctx, host: createHrmHost(ctx) };
|
|
3522
3530
|
const queryOp = getHrmOperation("hrm.employee.query");
|
|
@@ -3757,7 +3765,7 @@ function formatTimeRange(start, end) {
|
|
|
3757
3765
|
}
|
|
3758
3766
|
async function loadAgendaFromTopics(env, mtId) {
|
|
3759
3767
|
try {
|
|
3760
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
3768
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
3761
3769
|
const operation = getMeetingOperation2("meeting.eb.topic.list");
|
|
3762
3770
|
const result = await operation.handler({ mt_id: mtId, pageNo: 1, pageSize: 200 }, env);
|
|
3763
3771
|
const rows = result.data?.rows ?? [];
|
|
@@ -3968,7 +3976,7 @@ var meetingInvitationRender = {
|
|
|
3968
3976
|
if (value !== void 0 && value !== null) extra[key] = String(value);
|
|
3969
3977
|
}
|
|
3970
3978
|
}
|
|
3971
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
3979
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
3972
3980
|
const listOperation = getMeetingOperation2("meeting.eb.meeting.list");
|
|
3973
3981
|
let row;
|
|
3974
3982
|
try {
|
|
@@ -4698,7 +4706,7 @@ var meetingSummaryGet = {
|
|
|
4698
4706
|
const mtId = textOf5(args.mt_id).trim();
|
|
4699
4707
|
if (!mtId) throw meetingValidationError("mt_id_required", "\u5FC5\u987B\u63D0\u4F9B\u4F1A\u8BAE id\uFF08mt_id\uFF09");
|
|
4700
4708
|
const ctx = env.ctx;
|
|
4701
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
4709
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
4702
4710
|
const warnings = [];
|
|
4703
4711
|
const timings = {};
|
|
4704
4712
|
const include = Array.isArray(args.include) && args.include.length > 0 ? args.include.filter((item) => ALL_SECTIONS.includes(item)) : ALL_SECTIONS;
|
|
@@ -4834,9 +4842,9 @@ var meetingSummaryGet = {
|
|
|
4834
4842
|
warnings.push("\u8BE5\u4F1A\u8BAE\u6CA1\u6709\u5173\u8054\u7FA4\u804A\uFF08imchat_groupid \u4E3A\u7A7A\uFF09\uFF0Cchat \u6BB5\u4E3A null");
|
|
4835
4843
|
} else {
|
|
4836
4844
|
try {
|
|
4837
|
-
const { createImHost } = await import("./host-
|
|
4845
|
+
const { createImHost } = await import("./host-DGE2TZD4.js");
|
|
4838
4846
|
const { createImContinuationSigner } = await import("./continuation-2CKSBLA6.js");
|
|
4839
|
-
const { getImOperation } = await import("./registry-
|
|
4847
|
+
const { getImOperation } = await import("./registry-OZSMDVPP.js");
|
|
4840
4848
|
const imEnv = {
|
|
4841
4849
|
ctx,
|
|
4842
4850
|
// 测试环境靠 env.imHost 注入假实现,否则会真的打到线上群聊
|
|
@@ -4917,704 +4925,95 @@ var meetingSummaryGet = {
|
|
|
4917
4925
|
};
|
|
4918
4926
|
var meetingSummaryOperations = [meetingSummaryGet];
|
|
4919
4927
|
|
|
4920
|
-
// src/shortcuts/meeting/operations/
|
|
4921
|
-
|
|
4922
|
-
|
|
4923
|
-
var MT_ID_BATCH = 50;
|
|
4924
|
-
var MAX_PAGES = 50;
|
|
4925
|
-
function errorText(error) {
|
|
4926
|
-
return error instanceof Error ? error.message : String(error);
|
|
4927
|
-
}
|
|
4928
|
-
async function requestEbList(env, interfacePk, query, operation) {
|
|
4929
|
-
const session = await env.host.getSession();
|
|
4930
|
-
const pageNo = typeof query.pageNo === "number" ? query.pageNo : 1;
|
|
4931
|
-
const pageSize = typeof query.pageSize === "number" ? query.pageSize : PAGE_SIZE;
|
|
4932
|
-
const response = await env.host.request({
|
|
4933
|
-
method: "POST",
|
|
4934
|
-
path: `${EB_BASE}/getFormDataList/${interfacePk}`,
|
|
4935
|
-
operation,
|
|
4936
|
-
query,
|
|
4937
|
-
body: queryBody(session.userId, { pageNo, pageSize }),
|
|
4938
|
-
acceptBusiness: ebBusinessSuccess
|
|
4939
|
-
});
|
|
4940
|
-
return extractEbRows(response).rows.map((row) => row?.mainTable ? row.mainTable : row);
|
|
4941
|
-
}
|
|
4942
|
-
async function listAllEbRows(env, interfacePk, baseQuery, operation) {
|
|
4943
|
-
const rows = [];
|
|
4944
|
-
let requests = 0;
|
|
4945
|
-
for (let pageNo = 1; pageNo <= MAX_PAGES; pageNo += 1) {
|
|
4946
|
-
const page = await requestEbList(env, interfacePk, { ...baseQuery, pageNo, pageSize: PAGE_SIZE }, operation);
|
|
4947
|
-
requests += 1;
|
|
4948
|
-
rows.push(...page);
|
|
4949
|
-
if (page.length < PAGE_SIZE) break;
|
|
4950
|
-
}
|
|
4951
|
-
return { rows, requests };
|
|
4952
|
-
}
|
|
4953
|
-
async function fetchEbAppSettings(env, operation) {
|
|
4954
|
-
try {
|
|
4955
|
-
const rows = await requestEbList(env, "query_meeting_baseset", { pageNo: 1, pageSize: 20 }, operation);
|
|
4956
|
-
const valid = rows.filter((row) => String(row.data_status ?? "1") === "1");
|
|
4957
|
-
const ordered = [...valid].sort((left, right) => String(right.update_time ?? "").localeCompare(String(left.update_time ?? "")));
|
|
4958
|
-
const base = ordered[0] ?? {};
|
|
4959
|
-
return {
|
|
4960
|
-
roomChk: String(base.room_conflict_chk ?? ""),
|
|
4961
|
-
roomAction: String(base.room_conflict ?? ""),
|
|
4962
|
-
memberChk: String(base.member_conflict_chk ?? ""),
|
|
4963
|
-
memberAction: String(base.member_conflict ?? ""),
|
|
4964
|
-
onlyFlowCreate: String(base.only_flow_create ?? ""),
|
|
4965
|
-
openMtApprove: String(base.open_mt_approve ?? ""),
|
|
4966
|
-
mtNewWf: String(base.mt_new_wf ?? ""),
|
|
4967
|
-
mtRepeatNewWf: String(base.mt_repeat_new_wf ?? ""),
|
|
4968
|
-
settingsRows: valid.length,
|
|
4969
|
-
settingsId: String(base.id ?? ""),
|
|
4970
|
-
settingsUpdatedAt: String(base.update_time ?? "")
|
|
4971
|
-
};
|
|
4972
|
-
} catch (error) {
|
|
4973
|
-
return {
|
|
4974
|
-
roomChk: "",
|
|
4975
|
-
roomAction: "",
|
|
4976
|
-
memberChk: "",
|
|
4977
|
-
memberAction: "",
|
|
4978
|
-
onlyFlowCreate: "",
|
|
4979
|
-
openMtApprove: "",
|
|
4980
|
-
mtNewWf: "",
|
|
4981
|
-
mtRepeatNewWf: "",
|
|
4982
|
-
settingsRows: 0,
|
|
4983
|
-
error: errorText(error)
|
|
4984
|
-
};
|
|
4985
|
-
}
|
|
4986
|
-
}
|
|
4987
|
-
function assertEbCreatePathAllowed(settings) {
|
|
4988
|
-
if (settings.error) {
|
|
4989
|
-
throw meetingConflictError(
|
|
4990
|
-
"conflict_check_failed",
|
|
4991
|
-
`\u65E0\u6CD5\u8BFB\u53D6\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\uFF08query_meeting_baseset\uFF09\uFF0C\u65E0\u6CD5\u5224\u5B9A\u662F\u5426\u5141\u8BB8\u76F4\u63A5\u5EFA\u4F1A\uFF08only_flow_create / open_mt_approve\uFF09\uFF0C\u5DF2\u6309\u4FDD\u5B88\u7B56\u7565\u62D2\u7EDD\uFF1A${settings.error}`
|
|
4992
|
-
);
|
|
4993
|
-
}
|
|
4994
|
-
const blocked = [];
|
|
4995
|
-
if (settings.onlyFlowCreate === "1") {
|
|
4996
|
-
blocked.push("only_flow_create=1\uFF08\u53EA\u5141\u8BB8\u901A\u8FC7\u6D41\u7A0B\u65B0\u5EFA\u4F1A\u8BAE\uFF09");
|
|
4997
|
-
}
|
|
4998
|
-
if (settings.openMtApprove === "1") {
|
|
4999
|
-
blocked.push("open_mt_approve=1\uFF08\u4F1A\u8BAE\u63D0\u4EA4\u9700\u5BA1\u6279\uFF09");
|
|
5000
|
-
}
|
|
5001
|
-
if (blocked.length === 0) return;
|
|
5002
|
-
throw meetingConflictError(
|
|
5003
|
-
"conflict_rejected",
|
|
5004
|
-
`\u5E94\u7528\u8BBE\u7F6E\u4E0D\u5141\u8BB8\u76F4\u63A5\u5EFA\u4F1A\uFF1A${blocked.join("\uFF1B")}\u3002\u8BE5\u5E94\u7528\u7684\u4F1A\u8BAE\u5FC5\u987B\u7ECF\u6D41\u7A0B\u521B\u5EFA\uFF08\u65B0\u5EFA\u4F1A\u8BAE\u5DE5\u4F5C\u6D41 mt_new_wf=${settings.mtNewWf || "\u672A\u914D\u7F6E"}\uFF0C\u5468\u671F\u4F1A\u8BAE\u5DE5\u4F5C\u6D41 mt_repeat_new_wf=${settings.mtRepeatNewWf || "\u672A\u914D\u7F6E"}\uFF09\u2014\u2014CLI \u4E0D\u76F4\u63A5\u5EFA\u4F1A\u3001\u4E5F\u4E0D\u4EE3\u66FF\u6D41\u7A0B\u5EFA\u4F1A\uFF08\u5426\u5219\u4F1A\u4EA7\u751F\u6D41\u7A0B\u4E4B\u5916\u3001request_id \u4E3A\u7A7A\u7684\u4F1A\u8BAE\uFF0C\u4E14\u4E0E\u6D41\u7A0B/ESB \u81EA\u52A8\u5EFA\u4F1A\u91CD\u590D\uFF09\u3002\u8FD9\u5C5E\u4E8E\u5E94\u7528\u7BA1\u63A7\uFF0CCLI \u4E0D\u4F1A\u7ED5\u8FC7 \u2014\u2014 \u4F46\u4E5F\u4E0D\u7528\u505C\u624B\uFF1A\u6539\u8D70 **meeting.eb.meeting.create.flow**\uFF08prepare\u2192apply\uFF09\u5373\u53EF\uFF0C\u5B83\u4F1A\u6309 mt_new_wf \u8F7D\u5165\u5EFA\u4F1A\u6D41\u7A0B\u8868\u5355\u3001\u63D0\u4EA4\u5BA1\u6279\uFF0C\u5E76\u5728\u4F1A\u8BAE\u751F\u6210\u540E\u81EA\u52A8\u51FA\u9080\u8BF7\u51FD\u3002\u5982\u9700\u76F4\u8FDE\u5EFA\u4F1A\uFF0C\u8BF7\u7BA1\u7406\u5458\u5148\u5728\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u4E2D\u5173\u95ED\u8BE5\u5F00\u5173\u3002`,
|
|
5005
|
-
{
|
|
5006
|
-
onlyFlowCreate: settings.onlyFlowCreate,
|
|
5007
|
-
openMtApprove: settings.openMtApprove,
|
|
5008
|
-
mtNewWf: settings.mtNewWf,
|
|
5009
|
-
mtRepeatNewWf: settings.mtRepeatNewWf
|
|
5010
|
-
}
|
|
5011
|
-
);
|
|
5012
|
-
}
|
|
5013
|
-
async function checkRoomConflict(roomId, begin, end, excludeMtId, env, operation) {
|
|
5014
|
-
const { rows, requests } = await listAllEbRows(
|
|
5015
|
-
env,
|
|
5016
|
-
"query_roomusage_list",
|
|
5017
|
-
// 重叠判定:占用开始 < 我的结束(enddatetime 算子 lt)且 占用结束 > 我的开始(begindatetime 算子 gt)
|
|
5018
|
-
{ address: roomId, enddatetime: end, begindatetime: begin },
|
|
5019
|
-
operation
|
|
5020
|
-
);
|
|
5021
|
-
const conflicts = rows.map((row) => ({
|
|
5022
|
-
mtId: String(row.mt_id ?? ""),
|
|
5023
|
-
begin: String(row.startdate ?? ""),
|
|
5024
|
-
end: String(row.enddate ?? "")
|
|
5025
|
-
})).filter((item) => item.mtId && item.mtId !== excludeMtId);
|
|
5026
|
-
return { conflicts, requests };
|
|
5027
|
-
}
|
|
5028
|
-
async function collectMemberConflicts(members, begin, end, excludeMtId, env, operation) {
|
|
5029
|
-
const wanted = new Set(members);
|
|
5030
|
-
const candidate = await listAllEbRows(
|
|
5031
|
-
env,
|
|
5032
|
-
"query_mtDetail_list",
|
|
5033
|
-
{ begindatetime: begin, enddatetime: end, mt_status: ACTIVE_MT_STATUS },
|
|
5034
|
-
operation
|
|
5035
|
-
);
|
|
5036
|
-
const candidates = candidate.rows.map((row) => ({
|
|
5037
|
-
id: String(row.id ?? ""),
|
|
5038
|
-
name: String(row.mt_name ?? row.name ?? ""),
|
|
5039
|
-
begin: String(row.begin_datetime ?? ""),
|
|
5040
|
-
end: String(row.end_datetime ?? "")
|
|
5041
|
-
})).filter((item) => item.id && item.id !== excludeMtId);
|
|
5042
|
-
const byId = new Map(candidates.map((item) => [item.id, item]));
|
|
5043
|
-
const byMeeting = /* @__PURE__ */ new Map();
|
|
5044
|
-
let receiptCalls = 0;
|
|
5045
|
-
let receipts = 0;
|
|
5046
|
-
for (let index = 0; index < candidates.length; index += MT_ID_BATCH) {
|
|
5047
|
-
const csv = candidates.slice(index, index + MT_ID_BATCH).map((item) => item.id).join(",");
|
|
5048
|
-
const page = await listAllEbRows(env, "query_meeting_receipt_list", { mt_id: csv }, operation);
|
|
5049
|
-
receiptCalls += page.requests;
|
|
5050
|
-
receipts += page.rows.length;
|
|
5051
|
-
for (const row of page.rows) {
|
|
5052
|
-
const meetingId = String(row.mt_id ?? "");
|
|
5053
|
-
const memberId = String(row.member_id ?? "");
|
|
5054
|
-
const memberType = String(row.member_type ?? "");
|
|
5055
|
-
if (!meetingId || !memberId) continue;
|
|
5056
|
-
if (memberType && memberType !== "1") continue;
|
|
5057
|
-
if (!wanted.has(memberId)) continue;
|
|
5058
|
-
if (!byMeeting.has(meetingId)) byMeeting.set(meetingId, /* @__PURE__ */ new Set());
|
|
5059
|
-
byMeeting.get(meetingId).add(memberId);
|
|
5060
|
-
}
|
|
5061
|
-
}
|
|
5062
|
-
const conflicts = [...byMeeting.entries()].map(([meetingId, ids]) => {
|
|
5063
|
-
const meeting = byId.get(meetingId);
|
|
5064
|
-
return {
|
|
5065
|
-
meetingId,
|
|
5066
|
-
name: meeting?.name ?? "",
|
|
5067
|
-
begin: meeting?.begin ?? "",
|
|
5068
|
-
end: meeting?.end ?? "",
|
|
5069
|
-
conflictedMembers: [...ids]
|
|
5070
|
-
};
|
|
5071
|
-
});
|
|
5072
|
-
conflicts.sort((left, right) => left.begin.localeCompare(right.begin));
|
|
5073
|
-
return {
|
|
5074
|
-
conflicts,
|
|
5075
|
-
listCalls: candidate.requests,
|
|
5076
|
-
receiptCalls,
|
|
5077
|
-
candidates: candidates.length,
|
|
5078
|
-
receipts
|
|
5079
|
-
};
|
|
4928
|
+
// src/shortcuts/meeting/operations/form-fields.ts
|
|
4929
|
+
function textOf6(value) {
|
|
4930
|
+
return value === void 0 || value === null ? "" : String(value);
|
|
5080
4931
|
}
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
const end = assertDateTimeMinute(input.endDatetime, "end_datetime");
|
|
5085
|
-
const warnings = [];
|
|
5086
|
-
const policy = options.settings ?? await fetchEbAppSettings(env, operation);
|
|
5087
|
-
const outcome = { warnings, policy };
|
|
5088
|
-
if (policy.error) {
|
|
5089
|
-
warnings.push(
|
|
5090
|
-
`\u5E94\u7528\u8BBE\u7F6E\uFF08query_meeting_baseset\uFF09\u8BFB\u53D6\u5931\u8D25\uFF0C\u51B2\u7A81\u7B56\u7565\u6309\u300C\u5F00\u542F\u68C0\u6D4B + \u4EC5\u63D0\u9192\u300D\u5904\u7406\uFF1A${policy.error}`
|
|
5091
|
-
);
|
|
5092
|
-
}
|
|
5093
|
-
const handleHit = (action, message, details) => {
|
|
5094
|
-
if (action === "1") {
|
|
5095
|
-
const text = `${message}\uFF1B\u5E94\u7528\u8BBE\u7F6E\u7981\u6B62\u63D0\u4EA4\uFF08action=1\uFF09\uFF0C\u5DF2\u62D2\u7EDD\uFF0C\u8BF7\u66F4\u6362\u65F6\u95F4\u6216\u5730\u70B9\u540E\u91CD\u8BD5`;
|
|
5096
|
-
if (throwOnReject) throw meetingConflictError("conflict_rejected", text, details);
|
|
5097
|
-
warnings.push(text);
|
|
5098
|
-
return;
|
|
5099
|
-
}
|
|
5100
|
-
warnings.push(
|
|
5101
|
-
`${message}\uFF1B\u5E94\u7528\u8BBE\u7F6E\u4EC5\u63D0\u9192\uFF08action=0\uFF09\uFF1A\u672C\u6B21\u4E0D\u963B\u6B62\u63D0\u4EA4\uFF0C\u8BF7\u5982\u5B9E\u544A\u77E5\u7528\u6237\u8BE5\u51B2\u7A81\u5E76\u5EFA\u8BAE\u66F4\u6362\u65F6\u95F4\u6216\u5730\u70B9\uFF0C\u7531\u7528\u6237\u51B3\u5B9A\u662F\u5426\u7EE7\u7EED\uFF08\u4E0D\u8981\u4E3B\u52A8\u5EFA\u8BAE\u5FFD\u7565\u51B2\u7A81\uFF0C\u4E5F\u4E0D\u8981\u66FF\u7528\u6237\u505A\u51B3\u5B9A\uFF09`
|
|
5102
|
-
);
|
|
5103
|
-
};
|
|
5104
|
-
if (input.address) {
|
|
5105
|
-
if (policy.roomChk === "0") {
|
|
5106
|
-
outcome.room = { skipped: true, hasConflict: false, conflicts: [], requests: 0 };
|
|
5107
|
-
warnings.push("\u5E94\u7528\u8BBE\u7F6E room_conflict_chk=0\uFF08\u5173\u95ED\uFF09\uFF0C\u5DF2\u8DF3\u8FC7\u4F1A\u8BAE\u5BA4\u51B2\u7A81\u68C0\u6D4B");
|
|
5108
|
-
} else {
|
|
5109
|
-
let result;
|
|
5110
|
-
try {
|
|
5111
|
-
result = await checkRoomConflict(input.address, begin, end, input.excludeMtId, env, operation);
|
|
5112
|
-
} catch (error) {
|
|
5113
|
-
throw meetingConflictError(
|
|
5114
|
-
"conflict_check_failed",
|
|
5115
|
-
`\u4F1A\u8BAE\u5BA4\u51B2\u7A81\u68C0\u6D4B\u5931\u8D25\uFF08\u89C6\u4E3A\u51B2\u7A81\uFF0C\u62D2\u7EDD\u5EFA\u4F1A\uFF09\uFF1A${errorText(error)}`
|
|
5116
|
-
);
|
|
5117
|
-
}
|
|
5118
|
-
const hasConflict = result.conflicts.length > 0;
|
|
5119
|
-
outcome.room = { skipped: false, hasConflict, conflicts: result.conflicts, requests: result.requests };
|
|
5120
|
-
if (hasConflict) {
|
|
5121
|
-
const detail = result.conflicts.map((item) => `${item.mtId}${item.begin ? `(${item.begin}~${item.end})` : ""}`).join("\u3001");
|
|
5122
|
-
handleHit(
|
|
5123
|
-
policy.roomAction,
|
|
5124
|
-
`\u4F1A\u8BAE\u5BA4\u51B2\u7A81\uFF1A\u4F1A\u8BAE\u5BA4 ${input.address} \u5728 ${begin} ~ ${end} \u5DF2\u88AB\u5360\u7528\uFF08\u5360\u7528\u4F1A\u8BAE ${detail}\uFF09`,
|
|
5125
|
-
{ address: input.address, conflicts: result.conflicts, policy: policy.roomAction }
|
|
5126
|
-
);
|
|
5127
|
-
}
|
|
5128
|
-
}
|
|
5129
|
-
}
|
|
5130
|
-
const members = toIdCsv(input.hrmMembers, "hrm_members");
|
|
5131
|
-
if (policy.memberChk === "0") {
|
|
5132
|
-
outcome.member = {
|
|
5133
|
-
skipped: true,
|
|
5134
|
-
hasConflict: false,
|
|
5135
|
-
conflicts: [],
|
|
5136
|
-
listCalls: 0,
|
|
5137
|
-
receiptCalls: 0,
|
|
5138
|
-
candidates: 0,
|
|
5139
|
-
receipts: 0
|
|
5140
|
-
};
|
|
5141
|
-
warnings.push("\u5E94\u7528\u8BBE\u7F6E member_conflict_chk=0\uFF08\u5173\u95ED\uFF09\uFF0C\u5DF2\u8DF3\u8FC7\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B");
|
|
5142
|
-
} else if (members) {
|
|
5143
|
-
let result;
|
|
5144
|
-
try {
|
|
5145
|
-
result = await collectMemberConflicts(members.split(","), begin, end, input.excludeMtId, env, operation);
|
|
5146
|
-
} catch (error) {
|
|
5147
|
-
throw meetingConflictError(
|
|
5148
|
-
"conflict_check_failed",
|
|
5149
|
-
`\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B\u5931\u8D25\uFF08\u89C6\u4E3A\u51B2\u7A81\uFF0C\u62D2\u7EDD\u5EFA\u4F1A\uFF09\uFF1A${errorText(error)}`
|
|
5150
|
-
);
|
|
5151
|
-
}
|
|
5152
|
-
const hasConflict = result.conflicts.length > 0;
|
|
5153
|
-
outcome.member = {
|
|
5154
|
-
skipped: false,
|
|
5155
|
-
hasConflict,
|
|
5156
|
-
conflicts: result.conflicts,
|
|
5157
|
-
listCalls: result.listCalls,
|
|
5158
|
-
receiptCalls: result.receiptCalls,
|
|
5159
|
-
candidates: result.candidates,
|
|
5160
|
-
receipts: result.receipts
|
|
5161
|
-
};
|
|
5162
|
-
if (hasConflict) {
|
|
5163
|
-
const detail = result.conflicts.map((item) => `${item.name || item.meetingId}(${item.begin}~${item.end}) \u51B2\u7A81\u4EBA ${item.conflictedMembers.join(",")}`).join("\uFF1B");
|
|
5164
|
-
handleHit(
|
|
5165
|
-
policy.memberAction,
|
|
5166
|
-
`\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\uFF1A${result.conflicts.length} \u573A\u4F1A\u8BAE\u4E0E\u672C\u6B21\u53C2\u4F1A\u4EBA\u65F6\u95F4\u91CD\u53E0 \u2014\u2014 ${detail}`,
|
|
5167
|
-
{ conflicts: result.conflicts, policy: policy.memberAction }
|
|
5168
|
-
);
|
|
5169
|
-
}
|
|
5170
|
-
if (input.orgMembers) {
|
|
5171
|
-
warnings.push(
|
|
5172
|
-
"org_members\uFF08\u53C2\u4F1A\u90E8\u95E8\uFF09\u672A\u5C55\u5F00\u4E3A\u5458\u5DE5\u540D\u5355\uFF0C\u672C\u6B21\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B\u4EC5\u8986\u76D6 hrm_members \u663E\u5F0F\u6307\u5B9A\u7684\u4EBA\u5458"
|
|
5173
|
-
);
|
|
5174
|
-
}
|
|
5175
|
-
} else if (input.orgMembers) {
|
|
5176
|
-
warnings.push(
|
|
5177
|
-
"\u4EC5\u63D0\u4F9B org_members\uFF08\u53C2\u4F1A\u90E8\u95E8\uFF09\u800C\u672A\u63D0\u4F9B hrm_members\uFF1ACLI \u4E0D\u5C55\u5F00\u90E8\u95E8\u6210\u5458\uFF0C\u5DF2\u8DF3\u8FC7\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B"
|
|
5178
|
-
);
|
|
5179
|
-
}
|
|
5180
|
-
return outcome;
|
|
5181
|
-
}
|
|
5182
|
-
var ebMeetingWritePreflight = async ({ endpoint, payload, args, env, extras }) => {
|
|
5183
|
-
const isCreate = endpoint.interfacePk === "create_meeting";
|
|
5184
|
-
const isChange = endpoint.interfacePk === "change_meeting";
|
|
5185
|
-
if (!isCreate && !isChange) return [];
|
|
5186
|
-
const operation = isChange ? "meeting.eb.meeting.change.prepare" : "meeting.eb.meeting.create.prepare";
|
|
5187
|
-
const main = payload.mainTable;
|
|
5188
|
-
const begin = typeof main.begin_datetime === "string" ? main.begin_datetime : "";
|
|
5189
|
-
const end = typeof main.end_datetime === "string" ? main.end_datetime : "";
|
|
5190
|
-
const address = typeof main.address === "string" && main.address ? main.address : void 0;
|
|
5191
|
-
const hrmMembers = typeof main.hrm_members === "string" && main.hrm_members ? main.hrm_members : void 0;
|
|
5192
|
-
const settings = isCreate || address || hrmMembers ? await fetchEbAppSettings(env, operation) : void 0;
|
|
5193
|
-
const preflightWarnings = [];
|
|
5194
|
-
if (settings && isCreate) {
|
|
5195
|
-
assertEbCreatePathAllowed(settings);
|
|
5196
|
-
if ((settings.settingsRows ?? 0) > 1) {
|
|
5197
|
-
preflightWarnings.push(
|
|
5198
|
-
`\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u5B58\u5728 ${settings.settingsRows} \u6761\u8BB0\u5F55\uFF0C\u672C\u6B21\u6309\u6700\u65B0\u4E00\u6761\uFF08id=${settings.settingsId ?? "\u672A\u77E5"}\uFF0C\u66F4\u65B0\u4E8E ${settings.settingsUpdatedAt || "\u672A\u77E5"}\uFF09\u5224\u65AD\u5EFA\u4F1A\u8DEF\u5F84\u4E0E\u51B2\u7A81\u7B56\u7565\uFF1B\u5982\u9700\u4EE5\u53E6\u4E00\u6761\u4E3A\u51C6\uFF0C\u8BF7\u5148\u5728\u7CFB\u7EDF\u9875\u9762\u6E05\u7406\u91CD\u590D\u7684\u8BBE\u7F6E\u8BB0\u5F55\u3002`
|
|
5199
|
-
);
|
|
5200
|
-
}
|
|
5201
|
-
}
|
|
5202
|
-
if (!begin || !end) return preflightWarnings;
|
|
5203
|
-
if (!address && !hrmMembers) return preflightWarnings;
|
|
5204
|
-
const outcome = await runEbConflictCheck(
|
|
5205
|
-
{
|
|
5206
|
-
beginDatetime: begin,
|
|
5207
|
-
endDatetime: end,
|
|
5208
|
-
...address ? { address } : {},
|
|
5209
|
-
...hrmMembers ? { hrmMembers } : {},
|
|
5210
|
-
...typeof main.org_members === "string" && main.org_members ? { orgMembers: main.org_members } : {},
|
|
5211
|
-
...typeof args.id === "string" || typeof args.id === "number" ? { excludeMtId: String(args.id) } : {}
|
|
5212
|
-
},
|
|
5213
|
-
env,
|
|
5214
|
-
operation,
|
|
5215
|
-
settings ? { settings } : {}
|
|
5216
|
-
);
|
|
5217
|
-
const extraWarnings = [];
|
|
5218
|
-
if (outcome.member && outcome.member.conflicts.length > 0) {
|
|
5219
|
-
extras.memberConflicts = outcome.member.conflicts;
|
|
5220
|
-
if (begin && end && hrmMembers) {
|
|
5221
|
-
try {
|
|
5222
|
-
const durationMinutes = Math.max(15, Math.round((Date.parse(end.replace(" ", "T")) - Date.parse(begin.replace(" ", "T"))) / 6e4) || 60);
|
|
5223
|
-
const day = begin.slice(0, 10);
|
|
5224
|
-
const free = await findCommonFreeSlots(env, {
|
|
5225
|
-
rangeStart: `${day} 00:00`,
|
|
5226
|
-
rangeEnd: `${day} 23:59`,
|
|
5227
|
-
durationMinutes,
|
|
5228
|
-
members: hrmMembers.split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== ""),
|
|
5229
|
-
...typeof args.id === "string" || typeof args.id === "number" ? { excludeMtId: String(args.id) } : {},
|
|
5230
|
-
maxSlots: 3,
|
|
5231
|
-
maxDays: 1,
|
|
5232
|
-
includeSchedule: true
|
|
5233
|
-
});
|
|
5234
|
-
if (free.slots.length > 0) {
|
|
5235
|
-
extras.suggestedSlots = free.slots;
|
|
5236
|
-
extras.slotOptions = free.slots.map((slot, index) => ({
|
|
5237
|
-
key: `T${index + 1}`,
|
|
5238
|
-
// 选项里必须写清"为什么推荐这个时段",否则用户看到的只是两个时间点(2026-10-28 用户反馈)
|
|
5239
|
-
label: `${slot.begin.slice(11)}~${slot.end.slice(11)}\uFF08${day}\uFF09 \xB7 \u5168\u90E8\u53C2\u4F1A\u4EBA\u7A7A\u95F2`,
|
|
5240
|
-
value: { begin: slot.begin, end: slot.end },
|
|
5241
|
-
reason: "\u8BE5\u65F6\u6BB5\u6240\u6709\u53C2\u4F1A\u4EBA\u90FD\u6CA1\u6709\u4F1A\u8BAE\u4E0E\u65E5\u7A0B\u5360\u7528"
|
|
5242
|
-
}));
|
|
5243
|
-
extraWarnings.push(
|
|
5244
|
-
`\u5F53\u5929\uFF08${day}\uFF09\u63A8\u8350\u6539\u671F\u5230\uFF1A${free.slots.map((slot, index) => `[T${index + 1}] ${slot.begin.slice(11)}~${slot.end.slice(11)}`).join("\uFF1B")}\uFF08\u5DF2\u540C\u65F6\u6838\u5BF9\u4F1A\u8BAE\u56DE\u6267\u4E0E\u65E5\u7A0B\uFF09\u2014\u2014\u8BF7\u7528\u9009\u9879\u65B9\u5F0F\u8BA9\u7528\u6237\u6311\u4E00\u4E2A\u3002`
|
|
5245
|
-
);
|
|
5246
|
-
} else if (free.blockingSummary) {
|
|
5247
|
-
extraWarnings.push(free.blockingSummary);
|
|
5248
|
-
extras.dayBlocked = { day, summary: free.blockingSummary };
|
|
5249
|
-
}
|
|
5250
|
-
extras.scheduleItems = free.scheduleItems;
|
|
5251
|
-
extras.busyByMember = free.busyByMember;
|
|
5252
|
-
extras.availabilityCost = free.cost;
|
|
5253
|
-
} catch (error) {
|
|
5254
|
-
extraWarnings.push(`\u5171\u540C\u7A7A\u95F2\u65F6\u6BB5\u8BA1\u7B97\u5931\u8D25\uFF08${String(error?.message ?? error).slice(0, 80)}\uFF09\uFF0C\u8BF7\u624B\u52A8\u6362\u65F6\u95F4`);
|
|
5255
|
-
}
|
|
5256
|
-
}
|
|
5257
|
-
}
|
|
5258
|
-
return [...preflightWarnings, ...outcome.warnings, ...extraWarnings];
|
|
5259
|
-
};
|
|
5260
|
-
var ebConflictRoom = {
|
|
5261
|
-
name: "meeting.eb.conflict.room",
|
|
4932
|
+
var TYPES = Object.keys(MEETING_EB_TAGS);
|
|
4933
|
+
var meetingFormFields = {
|
|
4934
|
+
name: "meeting.form.fields",
|
|
5262
4935
|
resource: "eb",
|
|
5263
|
-
method: "meeting.
|
|
5264
|
-
action: "meeting.
|
|
5265
|
-
summary: "
|
|
5266
|
-
capability: "eb.
|
|
4936
|
+
method: "meeting.form.fields",
|
|
4937
|
+
action: "meeting.form.fields",
|
|
4938
|
+
summary: "\u8BFB\u53D6\u4F1A\u8BAE\u8868\u5355\u7684\u771F\u5B9E\u5B57\u6BB5\u6E05\u5355\uFF08\u4E2D\u6587\u540D / dataKey / \u5B57\u6BB5 id / \u7EC4\u4EF6\u7C7B\u578B / \u662F\u5426\u591A\u9009\uFF09\uFF0C\u4F9B extraFields \u6309\u771F\u5B9E\u5B57\u6BB5\u540D\u5199\u5165\u79DF\u6237\u81EA\u5B9A\u4E49\u5B57\u6BB5",
|
|
4939
|
+
capability: "eb.meta",
|
|
5267
4940
|
risk: "read",
|
|
5268
4941
|
inputSchema: {
|
|
5269
4942
|
type: "object",
|
|
5270
4943
|
additionalProperties: false,
|
|
5271
4944
|
properties: {
|
|
5272
|
-
|
|
5273
|
-
|
|
5274
|
-
|
|
5275
|
-
|
|
5276
|
-
},
|
|
5277
|
-
required: ["beginDatetime", "endDatetime", "address"]
|
|
5278
|
-
},
|
|
5279
|
-
handler: async (args, env) => {
|
|
5280
|
-
const outcome = await runEbConflictCheck(
|
|
5281
|
-
{
|
|
5282
|
-
beginDatetime: args.beginDatetime,
|
|
5283
|
-
endDatetime: args.endDatetime,
|
|
5284
|
-
address: String(args.address),
|
|
5285
|
-
...args.mtId !== void 0 ? { excludeMtId: String(args.mtId) } : {}
|
|
5286
|
-
},
|
|
5287
|
-
env,
|
|
5288
|
-
"meeting.eb.conflict.room",
|
|
5289
|
-
{ throwOnReject: false }
|
|
5290
|
-
);
|
|
5291
|
-
const room = outcome.room ?? { skipped: true, hasConflict: false, conflicts: [], requests: 0 };
|
|
5292
|
-
const verdict = room.skipped ? "skipped" : !room.hasConflict ? "ok" : outcome.policy.roomAction === "1" ? "rejected" : "warn";
|
|
5293
|
-
return meetingSuccess(
|
|
5294
|
-
"meeting.eb.conflict.room",
|
|
5295
|
-
{
|
|
5296
|
-
verdict,
|
|
5297
|
-
hasConflict: room.hasConflict,
|
|
5298
|
-
skipped: room.skipped,
|
|
5299
|
-
conflicts: room.conflicts,
|
|
5300
|
-
policy: { chk: outcome.policy.roomChk, action: outcome.policy.roomAction },
|
|
5301
|
-
requests: 1 + room.requests
|
|
4945
|
+
type: {
|
|
4946
|
+
type: "string",
|
|
4947
|
+
enum: TYPES,
|
|
4948
|
+
description: "\u8981\u67E5\u54EA\u5F20\u8868\uFF1Ameeting=\u4F1A\u8BAE\u3001topic=\u8BAE\u9898\u3001minutes=\u7EAA\u8981\u3001room=\u4F1A\u8BAE\u5BA4\u3001sign=\u7B7E\u5230\u3001receipt=\u56DE\u6267\u2026\uFF08\u9ED8\u8BA4 meeting\uFF09"
|
|
5302
4949
|
},
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
};
|
|
5307
|
-
var ebConflictMember = {
|
|
5308
|
-
name: "meeting.eb.conflict.member",
|
|
5309
|
-
resource: "eb",
|
|
5310
|
-
method: "meeting.eb.conflict.member",
|
|
5311
|
-
action: "meeting.eb.conflict.member",
|
|
5312
|
-
summary: "EB \u7248\u53C2\u4F1A\u4EBA\u5458\u51B2\u7A81\u68C0\u6D4B\uFF08query_mtDetail_list \u5019\u9009 \u2192 query_meeting_receipt_list?mt_id=\u591A\u503C\u6279\u91CF \u2192 \u672C\u5730\u6BD4\u5BF9\uFF1B2 \u6B21\u8BF7\u6C42\uFF0C\u65E0 N+1\uFF09\uFF1A\u6309 member_conflict_chk/member_conflict \u7ED9\u51FA verdict",
|
|
5313
|
-
capability: "eb.conflict",
|
|
5314
|
-
risk: "read",
|
|
5315
|
-
inputSchema: {
|
|
5316
|
-
type: "object",
|
|
5317
|
-
additionalProperties: false,
|
|
5318
|
-
properties: {
|
|
5319
|
-
beginDatetime: { ...SCHEMA_DATETIME_MINUTE, description: "\u5F00\u59CB\u65F6\u95F4\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
|
|
5320
|
-
endDatetime: { ...SCHEMA_DATETIME_MINUTE, description: "\u7ED3\u675F\u65F6\u95F4\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
|
|
5321
|
-
hrmMembers: { type: "string", description: "\u53C2\u4F1A\u4EBA\u5458 id\uFF0C\u9017\u53F7\u5206\u9694\u5B57\u7B26\u4E32\uFF08\u5FC5\u586B\uFF09" },
|
|
5322
|
-
mtId: { ...SCHEMA_ID, description: "\u53D8\u66F4\u4F1A\u8BAE\u65F6\u6392\u9664\u81EA\u8EAB" }
|
|
5323
|
-
},
|
|
5324
|
-
required: ["beginDatetime", "endDatetime", "hrmMembers"]
|
|
4950
|
+
keyword: { type: "string", description: "\u53EA\u8FD4\u56DE\u4E2D\u6587\u540D/dataKey \u5305\u542B\u8BE5\u5173\u952E\u8BCD\u7684\u5B57\u6BB5\uFF08\u5982\u300C\u5BA2\u6237\u300D\u300C\u8054\u7CFB\u300D\uFF09" },
|
|
4951
|
+
refresh: { type: "boolean", description: "\u9ED8\u8BA4\u8BFB\u7F13\u5B58\uFF1B\u4F20 true \u5F3A\u5236\u91CD\u65B0\u89E3\u6790\u8868 id \u4E0E\u5B57\u6BB5\u5B9A\u4E49" }
|
|
4952
|
+
}
|
|
5325
4953
|
},
|
|
5326
4954
|
handler: async (args, env) => {
|
|
5327
|
-
const
|
|
5328
|
-
|
|
5329
|
-
|
|
5330
|
-
|
|
5331
|
-
|
|
5332
|
-
|
|
5333
|
-
|
|
5334
|
-
|
|
5335
|
-
"meeting.
|
|
5336
|
-
|
|
5337
|
-
|
|
5338
|
-
|
|
5339
|
-
|
|
5340
|
-
|
|
5341
|
-
|
|
5342
|
-
|
|
5343
|
-
|
|
5344
|
-
|
|
5345
|
-
|
|
4955
|
+
const type = TYPES.includes(args.type) ? args.type : "meeting";
|
|
4956
|
+
const tag = MEETING_EB_TAGS[type];
|
|
4957
|
+
const resolved = await resolveMeetingEbObjs(env.host, env.ctx, {
|
|
4958
|
+
tags: [tag],
|
|
4959
|
+
...args.refresh === true ? { refresh: true } : {}
|
|
4960
|
+
});
|
|
4961
|
+
const obj = resolved.objs[tag];
|
|
4962
|
+
if (!obj?.objId) {
|
|
4963
|
+
return meetingSuccess("meeting.form.fields", {
|
|
4964
|
+
type,
|
|
4965
|
+
tag,
|
|
4966
|
+
objId: "",
|
|
4967
|
+
fields: [],
|
|
4968
|
+
hint: "\u6CA1\u89E3\u6790\u5230\u8BE5\u8868\u7684 objId\uFF08\u53EF\u80FD\u5F53\u524D\u73AF\u5883\u6CA1\u6709\u8FD9\u5F20\u8868\uFF0C\u6216\u8D26\u53F7\u65E0\u6743\u9650\uFF09"
|
|
4969
|
+
}, { warnings: resolved.warnings });
|
|
4970
|
+
}
|
|
4971
|
+
const { createEbuilderFormHost } = await import("./host-BQBRHVR3.js");
|
|
4972
|
+
const { createEbuilderFormContinuationSigner } = await import("./continuation-RN6PZN2M.js");
|
|
4973
|
+
const { executeEbuilderFormOperation } = await import("./operations-5QL3AECO.js");
|
|
4974
|
+
const formEnv = {
|
|
4975
|
+
ctx: env.ctx,
|
|
4976
|
+
host: createEbuilderFormHost(env.ctx),
|
|
4977
|
+
continuation: createEbuilderFormContinuationSigner(env.ctx)
|
|
5346
4978
|
};
|
|
5347
|
-
const
|
|
5348
|
-
|
|
5349
|
-
|
|
5350
|
-
|
|
5351
|
-
|
|
5352
|
-
|
|
5353
|
-
|
|
5354
|
-
|
|
5355
|
-
|
|
5356
|
-
cost: {
|
|
5357
|
-
baseSetCalls: 1,
|
|
5358
|
-
listCalls: member.listCalls,
|
|
5359
|
-
receiptCalls: member.receiptCalls,
|
|
5360
|
-
candidates: member.candidates,
|
|
5361
|
-
receipts: member.receipts
|
|
5362
|
-
}
|
|
5363
|
-
},
|
|
5364
|
-
outcome.warnings.length > 0 ? { warnings: outcome.warnings } : {}
|
|
5365
|
-
);
|
|
5366
|
-
}
|
|
5367
|
-
};
|
|
5368
|
-
function parseMinute(text) {
|
|
5369
|
-
const match = /^(\d{4})-(\d{2})-(\d{2})[ T](\d{2}):(\d{2})/.exec(String(text ?? "").trim());
|
|
5370
|
-
if (!match) return null;
|
|
5371
|
-
return new Date(
|
|
5372
|
-
Number(match[1]),
|
|
5373
|
-
Number(match[2]) - 1,
|
|
5374
|
-
Number(match[3]),
|
|
5375
|
-
Number(match[4]),
|
|
5376
|
-
Number(match[5]),
|
|
5377
|
-
0,
|
|
5378
|
-
0
|
|
5379
|
-
);
|
|
5380
|
-
}
|
|
5381
|
-
function formatMinute(date) {
|
|
5382
|
-
const pad2 = (n) => String(n).padStart(2, "0");
|
|
5383
|
-
return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())} ${pad2(date.getHours())}:${pad2(date.getMinutes())}`;
|
|
5384
|
-
}
|
|
5385
|
-
async function resolveMemberNames(env, ids) {
|
|
5386
|
-
const map = /* @__PURE__ */ new Map();
|
|
5387
|
-
const unique = [...new Set(ids.filter((id) => id !== ""))];
|
|
5388
|
-
if (unique.length === 0) return map;
|
|
5389
|
-
try {
|
|
5390
|
-
const { hrmEmployeeOperations } = await import("./employee-SAK2QYXX.js");
|
|
5391
|
-
const batch = hrmEmployeeOperations.find((operation) => operation.name === "hrm.employee.batch");
|
|
5392
|
-
if (!batch) return map;
|
|
5393
|
-
const result = await batch.handler({ ids: unique }, env);
|
|
5394
|
-
const rows = result?.data?.rows ?? result?.data?.userList ?? [];
|
|
5395
|
-
for (const row of rows) {
|
|
5396
|
-
const id = String(row.id ?? "").trim();
|
|
5397
|
-
const name = String(row.name ?? "").trim();
|
|
5398
|
-
if (id && name) map.set(id, name);
|
|
5399
|
-
}
|
|
5400
|
-
} catch {
|
|
5401
|
-
}
|
|
5402
|
-
return map;
|
|
5403
|
-
}
|
|
5404
|
-
async function findCommonFreeSlots(env, input) {
|
|
5405
|
-
const members = input.members.map((item) => String(item).trim()).filter((item) => item !== "");
|
|
5406
|
-
const wanted = new Set(members);
|
|
5407
|
-
const duration = Math.max(15, Math.min(24 * 60, Math.round(input.durationMinutes || 60)));
|
|
5408
|
-
const step = Math.max(15, Math.min(120, Math.round(input.stepMinutes ?? 30)));
|
|
5409
|
-
const workStart = Math.max(0, Math.min(23, input.workStartHour ?? 9));
|
|
5410
|
-
const workEnd = Math.max(workStart + 1, Math.min(24, input.workEndHour ?? 18));
|
|
5411
|
-
const maxSlots = Math.max(1, Math.min(20, input.maxSlots ?? 3));
|
|
5412
|
-
const maxDays = Math.max(1, Math.min(14, input.maxDays ?? 1));
|
|
5413
|
-
const includeSchedule = input.includeSchedule !== false;
|
|
5414
|
-
const rangeStart = parseMinute(input.rangeStart);
|
|
5415
|
-
const rangeEnd = parseMinute(input.rangeEnd);
|
|
5416
|
-
const cost = { candidateCalls: 0, receiptCalls: 0, candidates: 0, busyIntervals: 0, scheduleCalls: 0 };
|
|
5417
|
-
const empty = { slots: [], idle: false, cost, scheduleItems: [], busyByMember: [] };
|
|
5418
|
-
if (!rangeStart || !rangeEnd) return empty;
|
|
5419
|
-
const detail = /* @__PURE__ */ new Map();
|
|
5420
|
-
const pushBusy = (memberId, item) => {
|
|
5421
|
-
const list = detail.get(memberId) ?? [];
|
|
5422
|
-
list.push(item);
|
|
5423
|
-
detail.set(memberId, list);
|
|
5424
|
-
cost.busyIntervals += 1;
|
|
5425
|
-
};
|
|
5426
|
-
const candidate = await listAllEbRows(
|
|
5427
|
-
env,
|
|
5428
|
-
"query_mtDetail_list",
|
|
5429
|
-
{ begindatetime: input.rangeStart, enddatetime: input.rangeEnd, mt_status: ACTIVE_MT_STATUS },
|
|
5430
|
-
"meeting.eb.conflict.availability"
|
|
5431
|
-
);
|
|
5432
|
-
cost.candidateCalls += candidate.requests;
|
|
5433
|
-
const meetings = candidate.rows.map((row) => ({
|
|
5434
|
-
id: String(row.id ?? ""),
|
|
5435
|
-
name: String(row.mt_name ?? row.name ?? row.mt_name ?? ""),
|
|
5436
|
-
begin: parseMinute(String(row.begin_datetime ?? "")),
|
|
5437
|
-
end: parseMinute(String(row.end_datetime ?? ""))
|
|
5438
|
-
})).filter((item) => item.id && item.id !== (input.excludeMtId ?? "") && item.begin && item.end);
|
|
5439
|
-
cost.candidates = meetings.length;
|
|
5440
|
-
const byId = new Map(meetings.map((item) => [item.id, item]));
|
|
5441
|
-
for (let index = 0; index < meetings.length; index += MT_ID_BATCH) {
|
|
5442
|
-
const csv = meetings.slice(index, index + MT_ID_BATCH).map((item) => item.id).join(",");
|
|
5443
|
-
const page = await listAllEbRows(env, "query_meeting_receipt_list", { mt_id: csv }, "meeting.eb.conflict.availability");
|
|
5444
|
-
cost.receiptCalls += page.requests;
|
|
5445
|
-
for (const row of page.rows) {
|
|
5446
|
-
const meetingId = String(row.mt_id ?? "");
|
|
5447
|
-
const memberId = String(row.member_id ?? "");
|
|
5448
|
-
const memberType = String(row.member_type ?? "");
|
|
5449
|
-
if (!meetingId || !memberId) continue;
|
|
5450
|
-
if (memberType && memberType !== "1") continue;
|
|
5451
|
-
if (!wanted.has(memberId)) continue;
|
|
5452
|
-
const meeting = byId.get(meetingId);
|
|
5453
|
-
if (!meeting?.begin || !meeting?.end) continue;
|
|
5454
|
-
pushBusy(memberId, {
|
|
5455
|
-
source: "meeting",
|
|
5456
|
-
title: meeting.name || "\u4F1A\u8BAE",
|
|
5457
|
-
begin: formatMinute(meeting.begin),
|
|
5458
|
-
end: formatMinute(meeting.end)
|
|
5459
|
-
});
|
|
5460
|
-
}
|
|
5461
|
-
}
|
|
5462
|
-
const scheduleItems = [];
|
|
5463
|
-
if (includeSchedule) {
|
|
5464
|
-
try {
|
|
5465
|
-
const { runScheduleConflictFlow, parseScheduleConflictMessage, resolveMemberIdsByName } = await import("./schedule-KFIITGSK.js");
|
|
5466
|
-
const dayBegin = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate(), 0, 0, 0, 0);
|
|
5467
|
-
const dayEnd = new Date(rangeStart.getFullYear(), rangeStart.getMonth(), rangeStart.getDate(), 23, 59, 0, 0);
|
|
5468
|
-
const flow = await runScheduleConflictFlow(env, {
|
|
5469
|
-
startDate: formatMinute(dayBegin),
|
|
5470
|
-
endDate: formatMinute(dayEnd),
|
|
5471
|
-
memberIds: members
|
|
5472
|
-
});
|
|
5473
|
-
cost.scheduleCalls += 1;
|
|
5474
|
-
const rawItems = [];
|
|
5475
|
-
for (const row of flow.rows) {
|
|
5476
|
-
const main = row?.mainTable ?? row ?? {};
|
|
5477
|
-
const type = main.agn_type;
|
|
5478
|
-
const typeId = Array.isArray(type) ? String(type[0]?.id ?? "") : String(type?.id ?? type ?? "");
|
|
5479
|
-
void typeId;
|
|
5480
|
-
rawItems.push({
|
|
5481
|
-
title: String(main.agn_name ?? main.name ?? "").trim() || "\u65E5\u7A0B",
|
|
5482
|
-
begin: String(main.start_time ?? "").trim(),
|
|
5483
|
-
end: String(main.end_time ?? "").trim(),
|
|
5484
|
-
names: String(main.participants ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "")
|
|
5485
|
-
});
|
|
5486
|
-
}
|
|
5487
|
-
if (rawItems.length === 0) {
|
|
5488
|
-
for (const item of parseScheduleConflictMessage(flow.message)) {
|
|
5489
|
-
rawItems.push({ title: item.title, begin: item.startTime, end: item.endTime, names: item.memberNames });
|
|
5490
|
-
}
|
|
5491
|
-
}
|
|
5492
|
-
const idsByName = await resolveMemberIdsByName(env, rawItems.flatMap((item) => item.names));
|
|
5493
|
-
const datePrefix = `${rangeStart.getFullYear()}-${String(rangeStart.getMonth() + 1).padStart(2, "0")}-${String(rangeStart.getDate()).padStart(2, "0")}`;
|
|
5494
|
-
for (const item of rawItems) {
|
|
5495
|
-
const beginText = item.begin.includes("-") ? item.begin : `${datePrefix} ${item.begin}`;
|
|
5496
|
-
const endText = item.end.includes("-") ? item.end : `${datePrefix} ${item.end}`;
|
|
5497
|
-
const beginDate = parseMinute(beginText);
|
|
5498
|
-
const endDate = parseMinute(endText);
|
|
5499
|
-
if (!beginDate || !endDate) continue;
|
|
5500
|
-
const memberIds = item.names.map((name) => idsByName.get(name) ?? "").filter((id) => id !== "");
|
|
5501
|
-
scheduleItems.push({ title: item.title, begin: beginText, end: endText, members: memberIds.length > 0 ? memberIds : item.names });
|
|
5502
|
-
for (const memberId of memberIds) {
|
|
5503
|
-
if (!wanted.has(memberId)) continue;
|
|
5504
|
-
pushBusy(memberId, { source: "schedule", title: item.title, begin: beginText, end: endText });
|
|
5505
|
-
}
|
|
4979
|
+
const raw = await executeEbuilderFormOperation("ebuilder-form.fields.get", { objId: obj.objId }, formEnv);
|
|
4980
|
+
const nodes = Array.isArray(raw?.data?.result?.data) ? raw.data.result.data : [];
|
|
4981
|
+
const rows = [];
|
|
4982
|
+
const detailTables = [];
|
|
4983
|
+
for (const node of nodes) {
|
|
4984
|
+
const fields = Array.isArray(node?.fields) ? node.fields : [];
|
|
4985
|
+
if (fields.length === 0 && textOf6(node?.name)) {
|
|
4986
|
+
detailTables.push(textOf6(node.name));
|
|
4987
|
+
continue;
|
|
5506
4988
|
}
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5515
|
-
|
|
5516
|
-
|
|
5517
|
-
|
|
5518
|
-
for (const item of entry.items) {
|
|
5519
|
-
const begin = parseMinute(item.begin);
|
|
5520
|
-
const end = parseMinute(item.end);
|
|
5521
|
-
if (!begin || !end) continue;
|
|
5522
|
-
if (slotStart < end && slotEnd > begin) return true;
|
|
4989
|
+
for (const field of fields) {
|
|
4990
|
+
const config = field?.config ?? {};
|
|
4991
|
+
const dataKey = textOf6(config.dataKey || config.columnName || field.physicalField);
|
|
4992
|
+
rows.push({
|
|
4993
|
+
dataKey,
|
|
4994
|
+
fieldId: textOf6(field.name || field.id),
|
|
4995
|
+
label: textOf6(field.text || config.title),
|
|
4996
|
+
compType: textOf6(field.compType || config.componentKey),
|
|
4997
|
+
type: textOf6(field.type || config.type),
|
|
4998
|
+
multiSelect: String(field.multiSelect ?? "false") === "true"
|
|
4999
|
+
});
|
|
5523
5000
|
}
|
|
5524
5001
|
}
|
|
5525
|
-
|
|
5526
|
-
|
|
5527
|
-
|
|
5528
|
-
|
|
5529
|
-
|
|
5530
|
-
|
|
5531
|
-
|
|
5532
|
-
|
|
5533
|
-
|
|
5534
|
-
|
|
5535
|
-
|
|
5536
|
-
|
|
5537
|
-
if (slotStart < rangeStart || slotEnd > rangeEnd) continue;
|
|
5538
|
-
if (overlaps(slotStart, slotEnd)) continue;
|
|
5539
|
-
slots.push({ begin: formatMinute(slotStart), end: formatMinute(slotEnd) });
|
|
5540
|
-
if (slots.length >= maxSlots) break;
|
|
5541
|
-
}
|
|
5542
|
-
}
|
|
5543
|
-
let blockingSummary;
|
|
5544
|
-
if (slots.length === 0) {
|
|
5545
|
-
const day = `${rangeStart.getFullYear()}-${String(rangeStart.getMonth() + 1).padStart(2, "0")}-${String(rangeStart.getDate()).padStart(2, "0")}`;
|
|
5546
|
-
const perMember = busyByMember.map((entry) => {
|
|
5547
|
-
const items = entry.items.slice(0, 3).map((item) => `${item.source === "meeting" ? "\u4F1A\u8BAE" : "\u65E5\u7A0B"}\u300A${item.title}\u300B${item.begin.slice(11)}~${item.end.slice(11)}`).join("\u3001");
|
|
5548
|
-
const more = entry.items.length > 3 ? ` \u7B49 ${entry.items.length} \u9879` : "";
|
|
5549
|
-
return `${entry.memberName ?? entry.memberId}\uFF1A${items}${more}`;
|
|
5550
|
-
});
|
|
5551
|
-
blockingSummary = perMember.length > 0 ? `${day} \u5F53\u5929 ${workStart}:00-${workEnd}:00 \u5185\u6CA1\u6709\u6240\u6709\u4EBA\u90FD\u7A7A\u95F2\u7684 ${duration} \u5206\u949F\u65F6\u6BB5\uFF08\u5DF2\u540C\u65F6\u6838\u5BF9\u4F1A\u8BAE\u56DE\u6267\u4E0E\u65E5\u7A0B\uFF09\u2014\u2014${perMember.join("\uFF1B")}` : `${day} \u5F53\u5929 ${workStart}:00-${workEnd}:00 \u5185\u6CA1\u6709\u627E\u5230\u7B26\u5408\u6761\u4EF6\u7684 ${duration} \u5206\u949F\u65F6\u6BB5\uFF0C\u5EFA\u8BAE\u6362\u4E2A\u65E5\u671F\u6216\u7F29\u77ED\u65F6\u957F`;
|
|
5552
|
-
}
|
|
5553
|
-
return {
|
|
5554
|
-
slots,
|
|
5555
|
-
idle: cost.busyIntervals === 0,
|
|
5556
|
-
cost,
|
|
5557
|
-
scheduleItems,
|
|
5558
|
-
busyByMember,
|
|
5559
|
-
...blockingSummary ? { blockingSummary } : {}
|
|
5560
|
-
};
|
|
5561
|
-
}
|
|
5562
|
-
var ebConflictAvailability = {
|
|
5563
|
-
name: "meeting.eb.conflict.availability",
|
|
5564
|
-
resource: "eb",
|
|
5565
|
-
method: "meeting.eb.conflict.availability",
|
|
5566
|
-
action: "meeting.eb.conflict.availability",
|
|
5567
|
-
summary: "\u53C2\u4F1A\u4EBA\u5171\u540C\u7A7A\u95F2\u65F6\u6BB5\u63A8\u8350\uFF08\u4F1A\u8BAE\u7EF4\u5EA6\uFF09\uFF1A\u4E00\u6B21\u62C9\u5019\u9009\u4F1A\u8BAE + \u6279\u91CF\u56DE\u6267\uFF0C\u5185\u5B58\u5207 30 \u5206\u949F slot\uFF0C\u7ED9\u51FA\u6240\u6709\u4EBA\u90FD\u7A7A\u95F2\u7684\u65F6\u95F4\u6BB5\uFF08\u9ED8\u8BA4\u6700\u591A 3 \u4E2A\uFF0C\u5F80\u540E 7 \u5929\uFF09",
|
|
5568
|
-
capability: "eb.conflict",
|
|
5569
|
-
risk: "read",
|
|
5570
|
-
inputSchema: {
|
|
5571
|
-
type: "object",
|
|
5572
|
-
additionalProperties: false,
|
|
5573
|
-
properties: {
|
|
5574
|
-
rangeStart: { ...SCHEMA_DATETIME_MINUTE, description: "\u641C\u7D22\u8303\u56F4\u5F00\u59CB\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
|
|
5575
|
-
rangeEnd: { ...SCHEMA_DATETIME_MINUTE, description: "\u641C\u7D22\u8303\u56F4\u7ED3\u675F\uFF08\u5FC5\u586B\uFF0Cyyyy-MM-dd HH:mm\uFF09" },
|
|
5576
|
-
durationMinutes: { type: "number", description: "\u4F1A\u8BAE\u65F6\u957F\uFF08\u5206\u949F\uFF0C\u9ED8\u8BA4 60\uFF09" },
|
|
5577
|
-
hrmMembers: { type: "string", description: "\u53C2\u4F1A\u4EBA id\uFF0C\u9017\u53F7\u5206\u9694\uFF08\u5FC5\u586B\uFF09" },
|
|
5578
|
-
mtId: { ...SCHEMA_ID, description: "\u53D8\u66F4\u4F1A\u8BAE\u65F6\u6392\u9664\u81EA\u8EAB" },
|
|
5579
|
-
workStartHour: { type: "number", description: "\u5DE5\u4F5C\u65F6\u6BB5\u8D77\u59CB\u5C0F\u65F6\uFF08\u9ED8\u8BA4 9\uFF09" },
|
|
5580
|
-
workEndHour: { type: "number", description: "\u5DE5\u4F5C\u65F6\u6BB5\u7ED3\u675F\u5C0F\u65F6\uFF08\u9ED8\u8BA4 18\uFF09" },
|
|
5581
|
-
stepMinutes: { type: "number", description: "\u5019\u9009\u6B65\u957F\uFF08\u5206\u949F\uFF0C\u9ED8\u8BA4 30\uFF09" },
|
|
5582
|
-
maxSlots: { type: "number", description: "\u8FD4\u56DE\u51E0\u4E2A\u65F6\u6BB5\uFF08\u9ED8\u8BA4 3\uFF0C\u6700\u591A 20\uFF09" },
|
|
5583
|
-
maxDays: { type: "number", description: '\u5F80\u540E\u627E\u51E0\u5929\uFF08\u9ED8\u8BA4 1 = \u53EA\u627E\u5F53\u5929\uFF0C\u7B26\u5408"\u7EA6\u7684\u662F\u54EA\u5929\u5C31\u63A8\u8350\u54EA\u5929"\uFF09' },
|
|
5584
|
-
includeSchedule: { type: "boolean", description: "\u662F\u5426\u540C\u65F6\u6838\u5BF9\u65E5\u7A0B\uFF08ESB\uFF09\uFF0C\u9ED8\u8BA4 true" }
|
|
5585
|
-
},
|
|
5586
|
-
required: ["rangeStart", "rangeEnd", "hrmMembers"]
|
|
5587
|
-
},
|
|
5588
|
-
handler: async (args, env) => {
|
|
5589
|
-
const members = String(args.hrmMembers ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "");
|
|
5590
|
-
if (members.length === 0) {
|
|
5591
|
-
throw meetingValidationError("members_required", "hrmMembers \u4E0D\u80FD\u4E3A\u7A7A");
|
|
5592
|
-
}
|
|
5593
|
-
const result = await findCommonFreeSlots(env, {
|
|
5594
|
-
rangeStart: String(args.rangeStart),
|
|
5595
|
-
rangeEnd: String(args.rangeEnd),
|
|
5596
|
-
durationMinutes: Number(args.durationMinutes ?? 60),
|
|
5597
|
-
members,
|
|
5598
|
-
...args.mtId ? { excludeMtId: String(args.mtId) } : {},
|
|
5599
|
-
...args.workStartHour !== void 0 ? { workStartHour: Number(args.workStartHour) } : {},
|
|
5600
|
-
...args.workEndHour !== void 0 ? { workEndHour: Number(args.workEndHour) } : {},
|
|
5601
|
-
...args.stepMinutes !== void 0 ? { stepMinutes: Number(args.stepMinutes) } : {},
|
|
5602
|
-
...args.maxSlots !== void 0 ? { maxSlots: Number(args.maxSlots) } : {},
|
|
5603
|
-
...args.maxDays !== void 0 ? { maxDays: Number(args.maxDays) } : {},
|
|
5604
|
-
...args.includeSchedule !== void 0 ? { includeSchedule: args.includeSchedule !== false } : {}
|
|
5605
|
-
});
|
|
5606
|
-
return meetingSuccess("meeting.eb.conflict.availability", {
|
|
5607
|
-
slots: result.slots,
|
|
5608
|
-
idle: result.idle,
|
|
5609
|
-
members,
|
|
5610
|
-
scheduleItems: result.scheduleItems,
|
|
5611
|
-
busyByMember: result.busyByMember,
|
|
5612
|
-
...result.blockingSummary ? { blockingSummary: result.blockingSummary } : {},
|
|
5613
|
-
cost: result.cost
|
|
5614
|
-
}, result.slots.length === 0 ? { warnings: [result.blockingSummary ?? "\u8303\u56F4\u5185\u6CA1\u6709\u627E\u5230\u6240\u6709\u4EBA\u90FD\u7A7A\u95F2\u7684\u65F6\u6BB5\uFF0C\u5EFA\u8BAE\u6362\u4E2A\u65E5\u671F\u6216\u7F29\u77ED\u65F6\u957F"] } : {});
|
|
5002
|
+
const keyword = textOf6(args.keyword).trim();
|
|
5003
|
+
const matched = keyword ? rows.filter((row) => row.label.includes(keyword) || row.dataKey.includes(keyword) || row.fieldId.includes(keyword)) : rows;
|
|
5004
|
+
return meetingSuccess("meeting.form.fields", {
|
|
5005
|
+
type,
|
|
5006
|
+
tag,
|
|
5007
|
+
objId: obj.objId,
|
|
5008
|
+
tableName: obj.tableName,
|
|
5009
|
+
total: matched.length,
|
|
5010
|
+
fields: matched,
|
|
5011
|
+
detailTables,
|
|
5012
|
+
hint: keyword && matched.length === 0 ? `\u6CA1\u6709\u5339\u914D\u300C${keyword}\u300D\u7684\u5B57\u6BB5 \u2014\u2014 \u8FD9\u5F20\u8868\u91CC\u786E\u5B9E\u6CA1\u6709\u8BE5\u5B57\u6BB5\uFF0C\u4E0D\u8981\u786C\u586B\uFF08\u786C\u586B\u4F1A\u88AB\u670D\u52A1\u7AEF\u9759\u9ED8\u4E22\u5F03\uFF09` : "\u5199\u4F1A\u8BAE\u5B57\u6BB5\u7528 dataKey\uFF08extraFields\uFF09\uFF1B\u5199\u5EFA\u4F1A\u6D41\u7A0B\u8868\u5355\u7528 label\uFF08\u4E2D\u6587\u540D\uFF09"
|
|
5013
|
+
}, { warnings: resolved.warnings });
|
|
5615
5014
|
}
|
|
5616
5015
|
};
|
|
5617
|
-
var
|
|
5016
|
+
var meetingFormFieldOperations = [meetingFormFields];
|
|
5618
5017
|
|
|
5619
5018
|
// src/shortcuts/meeting/operations/eb/decision.ts
|
|
5620
5019
|
var CONTINUATION_TTL_SECONDS6 = 600;
|
|
@@ -5629,7 +5028,7 @@ var MT_STATUS_OVER = "8";
|
|
|
5629
5028
|
var CANCELLED_MARK_DELAY_MS = 800;
|
|
5630
5029
|
async function isCancelledMeeting(env, mtId) {
|
|
5631
5030
|
try {
|
|
5632
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
5031
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
5633
5032
|
const listed = await getMeetingOperation2("meeting.eb.meeting.list").handler(
|
|
5634
5033
|
// withCount:false —— 这里只要一行状态,不必额外请求 count(少一次往返,也便于测试替身)
|
|
5635
5034
|
{ mt_id: mtId, pageNo: 1, pageSize: 1, withCount: false },
|
|
@@ -6055,7 +5454,7 @@ function splitIds(value) {
|
|
|
6055
5454
|
}
|
|
6056
5455
|
return [...seen];
|
|
6057
5456
|
}
|
|
6058
|
-
function
|
|
5457
|
+
function errorText(error) {
|
|
6059
5458
|
return error instanceof Error ? error.message : String(error);
|
|
6060
5459
|
}
|
|
6061
5460
|
async function writeOne(env, interfacePk, args) {
|
|
@@ -6074,7 +5473,7 @@ async function writeOne(env, interfacePk, args) {
|
|
|
6074
5473
|
}
|
|
6075
5474
|
return { ok: true };
|
|
6076
5475
|
} catch (error) {
|
|
6077
|
-
return { ok: false, error: `${interfacePk}: ${
|
|
5476
|
+
return { ok: false, error: `${interfacePk}: ${errorText(error)}` };
|
|
6078
5477
|
}
|
|
6079
5478
|
}
|
|
6080
5479
|
var ebMeetingAssociation = async (ctx) => {
|
|
@@ -6169,9 +5568,9 @@ function workflowEnv(env) {
|
|
|
6169
5568
|
return env;
|
|
6170
5569
|
}
|
|
6171
5570
|
async function loadCreateForm(env, workflowId) {
|
|
6172
|
-
const { createWorkflowHost } = await import("./host-
|
|
5571
|
+
const { createWorkflowHost } = await import("./host-VQ6JJXGQ.js");
|
|
6173
5572
|
const { createWorkflowContinuationSigner } = await import("./continuation-HZIZRZBX.js");
|
|
6174
|
-
const { getWorkflowOperation } = await import("./registry-
|
|
5573
|
+
const { getWorkflowOperation } = await import("./registry-VOGKFFTR.js");
|
|
6175
5574
|
const wfEnv = {
|
|
6176
5575
|
...workflowEnv(env),
|
|
6177
5576
|
host: createWorkflowHost(env.ctx),
|
|
@@ -6218,7 +5617,7 @@ async function resolveEmployeeNames(env, ids) {
|
|
|
6218
5617
|
async function resolveRoomValue(env, input) {
|
|
6219
5618
|
const text = String(input ?? "").trim();
|
|
6220
5619
|
if (!text) return null;
|
|
6221
|
-
const { loadRooms } = await import("./room-recommend-
|
|
5620
|
+
const { loadRooms } = await import("./room-recommend-D4EUOOWY.js");
|
|
6222
5621
|
try {
|
|
6223
5622
|
const { rooms } = await loadRooms(env, {});
|
|
6224
5623
|
const byId = rooms.find((room) => room.id === text);
|
|
@@ -6229,7 +5628,7 @@ async function resolveRoomValue(env, input) {
|
|
|
6229
5628
|
}
|
|
6230
5629
|
if (/^\d+$/.test(text)) {
|
|
6231
5630
|
try {
|
|
6232
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
5631
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
6233
5632
|
const detail = await getMeetingOperation2("meeting.eb.room.detail").handler({ id: text }, env);
|
|
6234
5633
|
const main = detail?.data?.mainTable ?? detail?.data?.data?.mainTable ?? {};
|
|
6235
5634
|
const name = String(main.room_name ?? "").trim();
|
|
@@ -6284,7 +5683,7 @@ function mapFields(fields, values) {
|
|
|
6284
5683
|
const unmapped = [];
|
|
6285
5684
|
for (const [key, raw] of Object.entries(values)) {
|
|
6286
5685
|
if (raw === void 0 || raw === null || raw === "") continue;
|
|
6287
|
-
const aliases = FIELD_ALIASES[key] ?? [];
|
|
5686
|
+
const aliases = FIELD_ALIASES[key] ?? [key];
|
|
6288
5687
|
const hit = aliases.map((name) => byName.get(name)).find((field) => field !== void 0);
|
|
6289
5688
|
if (!hit) {
|
|
6290
5689
|
unmapped.push(key);
|
|
@@ -6295,9 +5694,30 @@ function mapFields(fields, values) {
|
|
|
6295
5694
|
}
|
|
6296
5695
|
return { main, mapped, unmapped };
|
|
6297
5696
|
}
|
|
5697
|
+
function normalizeWorkflowIds(raw) {
|
|
5698
|
+
if (raw === void 0 || raw === null) return [];
|
|
5699
|
+
const list = Array.isArray(raw) ? raw : [raw];
|
|
5700
|
+
const ids = [];
|
|
5701
|
+
for (const item of list) {
|
|
5702
|
+
for (const piece of String(item ?? "").split(/[,;,;\s]+/)) {
|
|
5703
|
+
const term = piece.trim();
|
|
5704
|
+
if (!term) continue;
|
|
5705
|
+
const matched = term.match(/[((](\d{6,})[))]$/);
|
|
5706
|
+
const id = matched ? matched[1] : term;
|
|
5707
|
+
if (!ids.includes(id)) ids.push(id);
|
|
5708
|
+
}
|
|
5709
|
+
}
|
|
5710
|
+
return ids;
|
|
5711
|
+
}
|
|
6298
5712
|
async function resolveWorkflowId(env, args) {
|
|
6299
|
-
const
|
|
6300
|
-
if (
|
|
5713
|
+
const explicitList = normalizeWorkflowIds(args.workflowId);
|
|
5714
|
+
if (explicitList.length > 0) {
|
|
5715
|
+
return {
|
|
5716
|
+
workflowId: explicitList.length === 1 ? explicitList[0] : "",
|
|
5717
|
+
candidates: explicitList,
|
|
5718
|
+
source: "argument"
|
|
5719
|
+
};
|
|
5720
|
+
}
|
|
6301
5721
|
const settings = await fetchEbAppSettings(env, "meeting.eb.meeting.create.flow.prepare");
|
|
6302
5722
|
const candidates = String(settings.mtNewWf ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "");
|
|
6303
5723
|
if (candidates.length === 0) {
|
|
@@ -6306,7 +5726,7 @@ async function resolveWorkflowId(env, args) {
|
|
|
6306
5726
|
"\u5E94\u7528\u8BBE\u7F6E\u91CC\u6CA1\u6709\u914D\u7F6E\u300C\u65B0\u5EFA\u4F1A\u8BAE\u5DE5\u4F5C\u6D41\u300D\uFF08mt_new_wf \u4E3A\u7A7A\uFF09\uFF0C\u65E0\u6CD5\u8D70\u6D41\u7A0B\u5EFA\u4F1A\uFF1B\u8BF7\u7BA1\u7406\u5458\u5728\u4F1A\u8BAE\u5E94\u7528\u8BBE\u7F6E\u91CC\u914D\u7F6E\uFF0C\u6216\u5173\u95ED\u300C\u53EA\u5141\u8BB8\u901A\u8FC7\u6D41\u7A0B\u65B0\u5EFA\u4F1A\u8BAE\u300D"
|
|
6307
5727
|
);
|
|
6308
5728
|
}
|
|
6309
|
-
return { workflowId: candidates.length === 1 ? candidates[0] : "", candidates };
|
|
5729
|
+
return { workflowId: candidates.length === 1 ? candidates[0] : "", candidates, source: "settings" };
|
|
6310
5730
|
}
|
|
6311
5731
|
var ebMeetingCreateFlowPrepare = {
|
|
6312
5732
|
name: "meeting.eb.meeting.create.flow.prepare",
|
|
@@ -6330,9 +5750,16 @@ var ebMeetingCreateFlowPrepare = {
|
|
|
6330
5750
|
caller: { type: "string", description: "\u53EC\u96C6\u4EBA" },
|
|
6331
5751
|
contacter: { type: "string", description: "\u8054\u7CFB\u4EBA" },
|
|
6332
5752
|
other_remark: { type: "string", description: "\u5907\u6CE8" },
|
|
6333
|
-
workflowId: {
|
|
5753
|
+
workflowId: {
|
|
5754
|
+
oneOf: [{ type: "string" }, { type: "array", items: { type: "string" } }],
|
|
5755
|
+
description: "\u6307\u5B9A\u5EFA\u4F1A\u6D41\u7A0B id\uFF1A\u5355\u4E2A id\u3001id \u6570\u7EC4\u6216\u9017\u53F7\u5206\u9694\u90FD\u53EF\u4EE5\uFF0C\u4E5F\u63A5\u53D7\u300C\u6D41\u7A0B\u540D(123456)\u300D\u5199\u6CD5\u3002**\u4F20\u591A\u4E2A\u65F6 CLI \u540C\u6837\u4E0D\u4F1A\u66FF\u4F60\u9009**\u2014\u2014\u4F1A\u9010\u4E2A\u63A2\u6D4B\u53EF\u53D1\u8D77\u6027\uFF0C\u591A\u4E2A\u53EF\u7528\u5219\u8FD4\u56DE NEEDS_SELECTION \u8BA9\u7528\u6237\u6311\uFF1B\u4E0D\u4F20\u5219\u7528\u5E94\u7528\u8BBE\u7F6E mt_new_wf \u914D\u7F6E\u7684\u6D41\u7A0B\uFF08\u914D\u4E86\u591A\u4E2A\u65F6\u540C\u6837\u8BA9\u7528\u6237\u9009\uFF09"
|
|
5756
|
+
},
|
|
6334
5757
|
autoRoom: { type: "boolean", description: "\u9ED8\u8BA4 false\uFF1A\u672A\u6307\u5B9A\u4F1A\u8BAE\u5BA4\u65F6\u8FD4\u56DE\u5019\u9009\u8BA9\u7528\u6237\u9009\uFF1B\u4F20 true \u624D\u81EA\u52A8\u91C7\u7528\u63A8\u8350" },
|
|
6335
|
-
allowNoRoom: { type: "boolean", description: "\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\u7B49\uFF09\u65F6\u4F20 true\uFF0C\u907F\u514D\u88AB\u201C\u8BF7\u9009\u62E9\u4F1A\u8BAE\u5BA4\u201D\u62E6\u4F4F" }
|
|
5758
|
+
allowNoRoom: { type: "boolean", description: "\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\u7B49\uFF09\u65F6\u4F20 true\uFF0C\u907F\u514D\u88AB\u201C\u8BF7\u9009\u62E9\u4F1A\u8BAE\u5BA4\u201D\u62E6\u4F4F" },
|
|
5759
|
+
extraFields: {
|
|
5760
|
+
type: "object",
|
|
5761
|
+
description: '\u6309**\u6D41\u7A0B\u8868\u5355\u91CC\u7684\u5B57\u6BB5\u540D**\u586B\u989D\u5916\u5B57\u6BB5\uFF0C\u5F62\u5982 {"\u53C2\u4F1A\u5BA2\u6237": "xx\u516C\u53F8", "\u8054\u7CFB\u65B9\u5F0F": "138xxxx"}\uFF1A\u7528\u4E8E\u79DF\u6237\u5728\u6D41\u7A0B\u8868\u5355\u4E0A\u81EA\u5EFA\u3001CLI \u5185\u7F6E\u522B\u540D\u91CC\u6CA1\u6709\u7684\u5B57\u6BB5\u3002\u952E\u5FC5\u987B\u4E0E\u8BE5\u6D41\u7A0B\u8868\u5355\u7684\u5B57\u6BB5\u540D\u5B8C\u5168\u4E00\u81F4\uFF08prepare \u7684 warnings \u4F1A\u5217\u51FA\u8868\u5355\u73B0\u6709\u5168\u90E8\u5B57\u6BB5\u540D\uFF09\uFF1B\u5339\u914D\u4E0D\u5230\u7684\u4F1A\u8FDB unmapped \u63D0\u793A\uFF0C\u4E0D\u4F1A\u778E\u586B'
|
|
5762
|
+
}
|
|
6336
5763
|
},
|
|
6337
5764
|
{ required: ["mt_name", "begin_datetime", "end_datetime"] }
|
|
6338
5765
|
),
|
|
@@ -6340,6 +5767,7 @@ var ebMeetingCreateFlowPrepare = {
|
|
|
6340
5767
|
const resolved = await resolveWorkflowId(env, args);
|
|
6341
5768
|
const candidates = resolved.candidates;
|
|
6342
5769
|
let workflowId = resolved.workflowId;
|
|
5770
|
+
const sourceLabel = resolved.source === "argument" ? "\u8C03\u7528\u65B9\u4F20\u5165" : "\u5E94\u7528\u8BBE\u7F6E\u914D\u7F6E";
|
|
6343
5771
|
const probes = [];
|
|
6344
5772
|
const loadedForms = /* @__PURE__ */ new Map();
|
|
6345
5773
|
if (!workflowId && candidates.length > 1) {
|
|
@@ -6375,24 +5803,27 @@ var ebMeetingCreateFlowPrepare = {
|
|
|
6375
5803
|
if (launchable.length === 0) {
|
|
6376
5804
|
throw meetingValidationError(
|
|
6377
5805
|
"flow_not_launchable",
|
|
6378
|
-
|
|
5806
|
+
`${sourceLabel}\u4E86 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u4F46\u5F53\u524D\u8D26\u53F7\u4E00\u4E2A\u90FD\u53D1\u8D77\u4E0D\u4E86\uFF08\u65E0\u53D1\u8D77\u6743\u9650\u6216\u6D41\u7A0B\u5DF2\u505C\u7528\uFF09\uFF1A` + probes.map((probe) => `${probe.workflowId}\uFF08${probe.reason ?? "\u4E0D\u53EF\u53D1\u8D77"}\uFF09`).join("\uFF1B"),
|
|
6379
5807
|
{ probes }
|
|
6380
5808
|
);
|
|
6381
5809
|
}
|
|
6382
5810
|
if (launchable.length > 1) {
|
|
6383
5811
|
return meetingSuccess("meeting.eb.meeting.create.flow.prepare", {
|
|
6384
5812
|
status: "NEEDS_SELECTION",
|
|
6385
|
-
message:
|
|
5813
|
+
message: `${sourceLabel}\u4E86 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u5F53\u524D\u8D26\u53F7\u53EF\u53D1\u8D77\u5176\u4E2D ${launchable.length} \u4E2A\uFF0C\u8BF7\u8BA9\u7528\u6237\u9009\u62E9\u8981\u89E6\u53D1\u54EA\u4E00\u4E2A \u2014\u2014 **\u4E0D\u8981\u9ED8\u8BA4\u53D6\u7B2C\u4E00\u4E2A**\uFF08\u5404\u6D41\u7A0B\u8868\u5355\u5B57\u6BB5\u53EF\u80FD\u5B8C\u5168\u4E0D\u540C\uFF0C\u9009\u9519\u4F1A\u6F0F\u5B57\u6BB5\uFF1B2026-10-29 \u771F\u5B9E\u4E8B\u6545\uFF1A\u53D6\u7B2C\u4E00\u4E2A\u5BFC\u81F4\u5B57\u6BB5\u5168\u586B\u4E0D\u8FDB\u53E6\u4E00\u6761\u6D41\u7A0B\uFF0C\u7528\u6237\u4EE5\u4E3A"\u7CFB\u7EDF\u53EA\u652F\u6301\u4E00\u6761\u6D41\u7A0B"\uFF09`,
|
|
6386
5814
|
options: launchable.map((probe, index) => ({
|
|
6387
5815
|
key: `W${index + 1}`,
|
|
6388
5816
|
label: probe.name ? `${probe.name}\uFF08${probe.workflowId}\uFF09` : probe.workflowId,
|
|
6389
5817
|
value: { workflowId: probe.workflowId },
|
|
6390
|
-
reason: "\u5F53\u524D\u8D26\u53F7\u6709\u53D1\u8D77\u6743\u9650"
|
|
5818
|
+
reason: "\u5F53\u524D\u8D26\u53F7\u6709\u53D1\u8D77\u6743\u9650",
|
|
5819
|
+
// 把该流程的字段名如实带出来:不同流程字段差异很大(有的有设备需求/涉密项目,有的没有),
|
|
5820
|
+
// 用户要靠这个才能选对(2026-10-29 用户反馈:选错方式后字段全填不进去)。
|
|
5821
|
+
fields: (loadedForms.get(probe.workflowId)?.fields ?? []).map((f) => f.name).filter(Boolean)
|
|
6391
5822
|
})),
|
|
6392
5823
|
probes
|
|
6393
5824
|
}, {
|
|
6394
5825
|
warnings: [
|
|
6395
|
-
|
|
5826
|
+
`${sourceLabel}\u4E86 ${candidates.length} \u4E2A\u5EFA\u4F1A\u6D41\u7A0B\uFF0C\u5176\u4E2D ${launchable.length} \u4E2A\u5F53\u524D\u8D26\u53F7\u53EF\u53D1\u8D77\uFF1B**\u5FC5\u987B\u628A\u8FD9\u51E0\u4E2A\u6D41\u7A0B\u505A\u6210\u9009\u9879\u8BA9\u7528\u6237\u6311\u4E00\u4E2A\uFF0C\u7981\u6B62\u81EA\u5DF1\u66FF\u7528\u6237\u9009**\uFF1B\u9009\u5B9A\u540E\u5E26\u5355\u4E2A workflowId \u91CD\u65B0 prepare\u3002`,
|
|
6396
5827
|
...probes.filter((probe) => !probe.launchable).map((probe) => `\u6D41\u7A0B ${probe.workflowId} \u5F53\u524D\u8D26\u53F7\u65E0\u6CD5\u53D1\u8D77\uFF08${probe.reason ?? "\u65E0\u6743\u9650"}\uFF09\uFF0C\u5DF2\u6392\u9664`)
|
|
6397
5828
|
]
|
|
6398
5829
|
});
|
|
@@ -6409,18 +5840,28 @@ var ebMeetingCreateFlowPrepare = {
|
|
|
6409
5840
|
const endText = String(args.end_datetime ?? "").trim();
|
|
6410
5841
|
const memberIds = String(args.hrm_members ?? "").split(/[,;,;\s]+/).map((item) => item.trim()).filter((item) => item !== "");
|
|
6411
5842
|
let addressInput = args.address;
|
|
5843
|
+
const hadAddressInput = String(args.address ?? "").trim() !== "";
|
|
6412
5844
|
const day = beginText.slice(0, 10);
|
|
6413
5845
|
const durationMinutes = beginText && endText ? Math.max(15, Math.round((Date.parse(endText.replace(" ", "T")) - Date.parse(beginText.replace(" ", "T"))) / 6e4) || 60) : 60;
|
|
6414
5846
|
const timings = {};
|
|
6415
5847
|
const startedAt = Date.now();
|
|
6416
|
-
const roomTask = enrich &&
|
|
5848
|
+
const roomTask = enrich && beginText && endText ? recommendRooms(env, {
|
|
6417
5849
|
beginDatetime: beginText,
|
|
6418
5850
|
endDatetime: endText,
|
|
6419
5851
|
...memberIds.length > 0 ? { memberCount: memberIds.length } : {},
|
|
6420
5852
|
topN: 3
|
|
6421
5853
|
}).catch(() => null) : Promise.resolve(null);
|
|
5854
|
+
const addressId = String(addressInput ?? "").trim();
|
|
5855
|
+
const addressIsRoomId = /^\d+$/.test(addressId);
|
|
5856
|
+
const roomConflictTask = enrich && beginText && endText && addressIsRoomId ? (async () => {
|
|
5857
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
5858
|
+
return getMeetingOperation2("meeting.eb.conflict.room").handler(
|
|
5859
|
+
{ beginDatetime: beginText, endDatetime: endText, address: addressId },
|
|
5860
|
+
env
|
|
5861
|
+
);
|
|
5862
|
+
})().catch(() => null) : Promise.resolve(null);
|
|
6422
5863
|
const conflictTask = enrich && beginText && endText && memberIds.length > 0 ? (async () => {
|
|
6423
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
5864
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
6424
5865
|
return getMeetingOperation2("meeting.eb.conflict.member").handler(
|
|
6425
5866
|
{ beginDatetime: beginText, endDatetime: endText, hrmMembers: memberIds.join(",") },
|
|
6426
5867
|
env
|
|
@@ -6435,15 +5876,45 @@ var ebMeetingCreateFlowPrepare = {
|
|
|
6435
5876
|
maxDays: 1,
|
|
6436
5877
|
includeSchedule: true
|
|
6437
5878
|
}).catch(() => null) : Promise.resolve(null);
|
|
6438
|
-
const [roomRec, memberConflict, free] = await Promise.all([
|
|
5879
|
+
const [roomRec, memberConflict, free, roomConflict] = await Promise.all([
|
|
5880
|
+
roomTask,
|
|
5881
|
+
conflictTask,
|
|
5882
|
+
availabilityTask,
|
|
5883
|
+
roomConflictTask
|
|
5884
|
+
]);
|
|
6439
5885
|
timings.parallelMs = Date.now() - startedAt;
|
|
5886
|
+
const roomOptions = (roomRec?.candidates ?? []).map((candidate, index) => ({
|
|
5887
|
+
key: `R${index + 1}`,
|
|
5888
|
+
label: `${candidate.name}${candidate.capacity.max > 0 ? `\uFF08\u53EF\u5BB9 ${candidate.capacity.max} \u4EBA\uFF09` : ""}${index === 0 ? " \xB7 \u63A8\u8350" : ""}`,
|
|
5889
|
+
value: { id: candidate.id, name: candidate.name },
|
|
5890
|
+
reason: candidate.reasons.join("\uFF1B")
|
|
5891
|
+
}));
|
|
5892
|
+
const roomConflictData = roomConflict?.data;
|
|
5893
|
+
if (addressInput && roomConflictData?.hasConflict === true) {
|
|
5894
|
+
const busy = Array.isArray(roomConflictData.conflicts) ? roomConflictData.conflicts : [];
|
|
5895
|
+
decisions.roomConflict = {
|
|
5896
|
+
address: addressId,
|
|
5897
|
+
hasConflict: true,
|
|
5898
|
+
conflicts: busy,
|
|
5899
|
+
verdict: roomConflictData.verdict ?? "conflict"
|
|
5900
|
+
};
|
|
5901
|
+
if (roomOptions.length > 0) decisions.roomOptions = roomOptions;
|
|
5902
|
+
return meetingSuccess("meeting.eb.meeting.create.flow.prepare", {
|
|
5903
|
+
status: "NEEDS_SELECTION",
|
|
5904
|
+
selectionType: "room_conflict",
|
|
5905
|
+
message: `\u4F60\u6307\u5B9A\u7684\u4F1A\u8BAE\u5BA4\u5728 ${beginText}~${endText} \u5DF2\u88AB\u5360\u7528\uFF08${busy.length} \u6761\u5360\u7528\u8BB0\u5F55\uFF09\uFF0C\u672C\u6B21**\u6CA1\u6709\u63D0\u4EA4**\u3002\u8BF7\u6539\u7528\u4E0B\u9762\u7A7A\u95F2\u7684\u4F1A\u8BAE\u5BA4\uFF0C\u6216\u8C03\u6574\u4F1A\u8BAE\u65F6\u95F4`,
|
|
5906
|
+
options: roomOptions,
|
|
5907
|
+
recommended: roomOptions[0]?.value ?? null,
|
|
5908
|
+
conflicts: busy,
|
|
5909
|
+
hint: "\u9009\u5B9A\u540E\u628A value.id \u4F5C\u4E3A address \u91CD\u65B0\u8C03\u7528\uFF1B\u8981\u6539\u65F6\u95F4\u5C31\u540C\u65F6\u4F20\u65B0\u7684 begin_datetime/end_datetime"
|
|
5910
|
+
}, {
|
|
5911
|
+
warnings: [
|
|
5912
|
+
`\u4F1A\u8BAE\u5BA4 ${addressId} \u5728\u8BE5\u65F6\u6BB5\u5DF2\u6709 ${busy.length} \u6761\u5360\u7528\uFF0C\u5DF2\u62E6\u4E0B\u672A\u63D0\u4EA4\u3002`,
|
|
5913
|
+
roomOptions.length > 0 ? `\u5DF2\u6309\u4EBA\u6570/\u5E38\u7528/\u7A7A\u95F2\u7ED9\u51FA ${roomOptions.length} \u4E2A\u66FF\u4EE3\u4F1A\u8BAE\u5BA4\uFF08R1 \u4E3A\u9996\u9009\uFF09\u3002` : "\u8BE5\u65F6\u6BB5\u6CA1\u6709\u53EF\u66FF\u4EE3\u7684\u7A7A\u95F2\u4F1A\u8BAE\u5BA4\uFF0C\u5EFA\u8BAE\u8C03\u6574\u4F1A\u8BAE\u65F6\u95F4\u6216\u6539\u7EBF\u4E0A\u4F1A\u8BAE\uFF08allowNoRoom: true\uFF09\u3002"
|
|
5914
|
+
]
|
|
5915
|
+
});
|
|
5916
|
+
}
|
|
6440
5917
|
if (roomRec) {
|
|
6441
|
-
const roomOptions = roomRec.candidates.map((candidate, index) => ({
|
|
6442
|
-
key: `R${index + 1}`,
|
|
6443
|
-
label: `${candidate.name}${candidate.capacity.max > 0 ? `\uFF08\u53EF\u5BB9 ${candidate.capacity.max} \u4EBA\uFF09` : ""}${index === 0 ? " \xB7 \u63A8\u8350" : ""}`,
|
|
6444
|
-
value: { id: candidate.id, name: candidate.name },
|
|
6445
|
-
reason: candidate.reasons.join("\uFF1B")
|
|
6446
|
-
}));
|
|
6447
5918
|
decisions.roomOptions = roomOptions;
|
|
6448
5919
|
decisions.autoRoom = {
|
|
6449
5920
|
picked: roomRec.best ? { id: roomRec.best.id, name: roomRec.best.name, score: roomRec.best.score, reasons: roomRec.best.reasons } : null,
|
|
@@ -6471,6 +5942,28 @@ var ebMeetingCreateFlowPrepare = {
|
|
|
6471
5942
|
addressInput = roomRec.best.id;
|
|
6472
5943
|
}
|
|
6473
5944
|
}
|
|
5945
|
+
if (enrich && !addressInput && args.allowNoRoom !== true) {
|
|
5946
|
+
decisions.roomUnavailable = {
|
|
5947
|
+
reason: roomRec ? `\u8BE5\u65F6\u6BB5\u6CA1\u6709\u6EE1\u8DB3\u6761\u4EF6\u7684\u7A7A\u95F2\u4F1A\u8BAE\u5BA4\uFF08\u5171 ${roomRec.meta?.roomsTotal ?? 0} \u95F4\uFF0C\u53EF\u7528 ${roomRec.meta?.roomsUsable ?? 0} \u95F4\uFF0C\u88AB\u5360\u7528 ${roomRec.meta?.roomsBusy ?? 0} \u95F4\uFF09` : "\u4F1A\u8BAE\u5BA4\u63A8\u8350\u6CA1\u6709\u8FD4\u56DE\u7ED3\u679C\uFF08\u4F1A\u8BAE\u5BA4\u5217\u8868\u63A5\u53E3\u8BFB\u4E0D\u5230\uFF0C\u6216\u63A8\u8350\u8FC7\u7A0B\u51FA\u9519\uFF09",
|
|
5948
|
+
meta: roomRec?.meta ?? null
|
|
5949
|
+
};
|
|
5950
|
+
return meetingSuccess("meeting.eb.meeting.create.flow.prepare", {
|
|
5951
|
+
status: "NEEDS_SELECTION",
|
|
5952
|
+
selectionType: "room_unavailable",
|
|
5953
|
+
message: "\u672A\u6307\u5B9A\u4F1A\u8BAE\u5BA4\uFF0C\u4E14\u6309\u4EBA\u6570/\u65F6\u6BB5\u6CA1\u80FD\u63A8\u8350\u51FA\u53EF\u7528\u7684\u7A7A\u95F2\u4F1A\u8BAE\u5BA4\u3002\u8BF7\u8BA9\u7528\u6237\u4ECE\u4E0B\u9762\u4E09\u6761\u91CC\u9009\u4E00\u6761\uFF0C**\u4E0D\u8981**\u76F4\u63A5\u63D0\u4EA4\u4E00\u4E2A\u6CA1\u6709\u5730\u70B9\u7684\u4F1A\u8BAE",
|
|
5954
|
+
options: [
|
|
5955
|
+
{ key: "C1", label: "\u6211\u6307\u5B9A\u5177\u4F53\u4F1A\u8BAE\u5BA4\uFF08\u8868\u5355\u91CC\u70B9\u9009\uFF0C\u6216\u544A\u8BC9\u6211\u4F1A\u8BAE\u5BA4\u540D\u79F0/id\uFF09", value: { action: "specify" } },
|
|
5956
|
+
{ key: "C2", label: "\u6539\u7528\u7EBF\u4E0A\u4F1A\u8BAE\uFF08\u817E\u8BAF\u4F1A\u8BAE/\u89C6\u9891\uFF09", value: { action: "no_room" } },
|
|
5957
|
+
{ key: "C3", label: '\u5148\u6309"\u5730\u70B9\u5F85\u5B9A"\u63D0\u4EA4', value: { action: "allow_no_room" } }
|
|
5958
|
+
],
|
|
5959
|
+
roomUnavailable: decisions.roomUnavailable
|
|
5960
|
+
}, {
|
|
5961
|
+
warnings: [
|
|
5962
|
+
`\u4F1A\u8BAE\u5BA4\u63A8\u8350\u65E0\u7ED3\u679C\uFF1A${String(decisions.roomUnavailable.reason)}\u3002\u672C\u6B21**\u6CA1\u6709\u63D0\u4EA4**\u3002`,
|
|
5963
|
+
"\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\uFF09\u5C31\u5E26 allowNoRoom: true \u91CD\u65B0\u8C03\u7528\uFF1B\u8981\u6307\u5B9A\u623F\u95F4\u5C31\u5E26 address\u3002"
|
|
5964
|
+
]
|
|
5965
|
+
});
|
|
5966
|
+
}
|
|
6474
5967
|
const conflicts = memberConflict?.data?.conflicts ?? [];
|
|
6475
5968
|
if (conflicts.length > 0) decisions.memberConflicts = conflicts;
|
|
6476
5969
|
if (free) {
|
|
@@ -6501,13 +5994,14 @@ var ebMeetingCreateFlowPrepare = {
|
|
|
6501
5994
|
caller: args.caller,
|
|
6502
5995
|
contacter: args.contacter,
|
|
6503
5996
|
other_remark: args.other_remark,
|
|
6504
|
-
mt_type: args.mt_type
|
|
5997
|
+
mt_type: args.mt_type,
|
|
5998
|
+
...args.extraFields && typeof args.extraFields === "object" && !Array.isArray(args.extraFields) ? args.extraFields : {}
|
|
6505
5999
|
});
|
|
6506
6000
|
const { main, mapped, unmapped } = mapFields(form.fields, shaped.values);
|
|
6507
6001
|
const warnings = [];
|
|
6508
6002
|
for (const note of shaped.notes) warnings.push(note);
|
|
6509
6003
|
const picked = decisions.autoRoom?.picked;
|
|
6510
|
-
if (picked) {
|
|
6004
|
+
if (picked && !hadAddressInput) {
|
|
6511
6005
|
warnings.push(
|
|
6512
6006
|
`\u672A\u6307\u5B9A\u4F1A\u8BAE\u5BA4 \u2192 \u5DF2\u81EA\u52A8\u9009\u62E9\u300C${picked.name}\u300D\uFF08${(picked.reasons ?? []).join("\uFF1B")}\uFF09\uFF1B\u53E6\u6709\u5019\u9009 ${(decisions.roomOptions ?? []).slice(1).map((item) => item.label).join(" / ") || "\u65E0"}`
|
|
6513
6007
|
);
|
|
@@ -6597,9 +6091,9 @@ var ebMeetingCreateFlowApply = {
|
|
|
6597
6091
|
throw meetingValidationError("context_mismatch", "\u786E\u8BA4\u4E0A\u4E0B\u6587\u5DF2\u53D8\u5316\uFF08\u79DF\u6237\u6216\u767B\u5F55\u8D26\u53F7\u4E0D\u540C\uFF09\uFF0C\u8BF7\u91CD\u65B0\u6267\u884C prepare");
|
|
6598
6092
|
}
|
|
6599
6093
|
const payload = lease?.payload ?? {};
|
|
6600
|
-
const { createWorkflowHost } = await import("./host-
|
|
6094
|
+
const { createWorkflowHost } = await import("./host-VQ6JJXGQ.js");
|
|
6601
6095
|
const { createWorkflowContinuationSigner } = await import("./continuation-HZIZRZBX.js");
|
|
6602
|
-
const { getWorkflowOperation } = await import("./registry-
|
|
6096
|
+
const { getWorkflowOperation } = await import("./registry-VOGKFFTR.js");
|
|
6603
6097
|
const wfEnv = {
|
|
6604
6098
|
...workflowEnv(env),
|
|
6605
6099
|
host: createWorkflowHost(env.ctx),
|
|
@@ -6652,7 +6146,7 @@ var ebMeetingCreateFlowApply = {
|
|
|
6652
6146
|
let meetingId = "";
|
|
6653
6147
|
const timings = { submitMs: Date.now() - submitStartedAt };
|
|
6654
6148
|
if (waitSeconds > 0) {
|
|
6655
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
6149
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
6656
6150
|
const list = getMeetingOperation2("meeting.eb.meeting.list");
|
|
6657
6151
|
const deadline = Date.now() + Math.min(waitSeconds, 30) * 1e3;
|
|
6658
6152
|
const pollStart = Date.now();
|
|
@@ -6678,7 +6172,7 @@ var ebMeetingCreateFlowApply = {
|
|
|
6678
6172
|
if (meetingId) {
|
|
6679
6173
|
const invitationStart = Date.now();
|
|
6680
6174
|
try {
|
|
6681
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
6175
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
6682
6176
|
const render = getMeetingOperation2("meeting.invitation.render");
|
|
6683
6177
|
const rendered = await render.handler({ mtId: meetingId }, env);
|
|
6684
6178
|
invitation = { pending: false, ...rendered?.data ?? {} };
|
|
@@ -6733,12 +6227,19 @@ var ebMeetingCreateFlowQuick = {
|
|
|
6733
6227
|
caller: { type: "string", description: "\u53EC\u96C6\u4EBA" },
|
|
6734
6228
|
contacter: { type: "string", description: "\u8054\u7CFB\u4EBA" },
|
|
6735
6229
|
other_remark: { type: "string", description: "\u5907\u6CE8" },
|
|
6736
|
-
workflowId: {
|
|
6230
|
+
workflowId: {
|
|
6231
|
+
oneOf: [{ type: "string" }, { type: "array", items: { type: "string" } }],
|
|
6232
|
+
description: "\u6307\u5B9A\u5EFA\u4F1A\u6D41\u7A0B id\uFF08\u5355\u4E2A / \u6570\u7EC4 / \u9017\u53F7\u5206\u9694\uFF09\u3002\u4F20\u591A\u4E2A\u65F6\u4E0D\u4F1A\u66FF\u4F60\u9009\uFF1A\u4F1A\u8FD4\u56DE NEEDS_SELECTION \u8BA9\u7528\u6237\u6311"
|
|
6233
|
+
},
|
|
6737
6234
|
autoRoom: { type: "boolean", description: "\u9ED8\u8BA4 false\uFF1A\u4E0D\u6307\u5B9A\u4F1A\u8BAE\u5BA4\u65F6\u8FD4\u56DE\u5019\u9009\u8BA9\u7528\u6237\u9009\uFF1B\u4F20 true \u624D\u81EA\u52A8\u91C7\u7528\u63A8\u8350\u4F1A\u8BAE\u5BA4" },
|
|
6738
6235
|
allowNoRoom: { type: "boolean", description: "\u786E\u5B9E\u4E0D\u9700\u8981\u4F1A\u8BAE\u5BA4\uFF08\u7EBF\u4E0A\u4F1A\u7B49\uFF09\u65F6\u4F20 true" },
|
|
6739
6236
|
confirm: { type: "boolean", description: "\u5FC5\u987B\u663E\u5F0F true \u624D\u4F1A\u771F\u6B63\u63D0\u4EA4" },
|
|
6740
6237
|
waitSeconds: { type: "number", description: "\u63D0\u4EA4\u540E\u7B49\u5F85\u4F1A\u8BAE\u751F\u6210\u7684\u79D2\u6570\uFF08\u9ED8\u8BA4 20\uFF1B\u7B97\u6CD5\u662F\u7ACB\u5373\u67E5\u4E00\u6B21 + 5s \u518D\u67E5\u4E00\u6B21\uFF0C\u4ECD\u672A\u751F\u6210\u5C31\u8FD4\u56DE pending\uFF09" },
|
|
6741
|
-
enrich: { type: "boolean", description: "\u662F\u5426\u987A\u5E26\u505A\u4F1A\u8BAE\u5BA4\u63A8\u8350/\u51B2\u7A81\u68C0\u6D4B/\u7A7A\u95F2\u65F6\u6BB5\uFF08\u9ED8\u8BA4 true\uFF1B\u4EBA\u3001\u65F6\u95F4\u3001\u623F\u95F4\u90FD\u5DF2\u786E\u5B9A\u65F6\u4F20 false \u53EF\u663E\u8457\u52A0\u5FEB\uFF09" }
|
|
6238
|
+
enrich: { type: "boolean", description: "\u662F\u5426\u987A\u5E26\u505A\u4F1A\u8BAE\u5BA4\u63A8\u8350/\u51B2\u7A81\u68C0\u6D4B/\u7A7A\u95F2\u65F6\u6BB5\uFF08\u9ED8\u8BA4 true\uFF1B\u4EBA\u3001\u65F6\u95F4\u3001\u623F\u95F4\u90FD\u5DF2\u786E\u5B9A\u65F6\u4F20 false \u53EF\u663E\u8457\u52A0\u5FEB\uFF09" },
|
|
6239
|
+
extraFields: {
|
|
6240
|
+
type: "object",
|
|
6241
|
+
description: '\u6309\u6D41\u7A0B\u8868\u5355\u5B57\u6BB5\u540D\u586B\u989D\u5916\u5B57\u6BB5\uFF08\u79DF\u6237\u81EA\u5EFA\u5B57\u6BB5\u7528\u8FD9\u4E2A\u53E3\u5B50\u5E26\u8FDB\u53BB\uFF09\uFF0C\u5F62\u5982 {"\u53C2\u4F1A\u5BA2\u6237": "xx\u516C\u53F8"}'
|
|
6242
|
+
}
|
|
6742
6243
|
},
|
|
6743
6244
|
{ required: ["mt_name", "begin_datetime", "end_datetime", "confirm"] }
|
|
6744
6245
|
),
|
|
@@ -6749,7 +6250,7 @@ var ebMeetingCreateFlowQuick = {
|
|
|
6749
6250
|
"\u4E00\u6B65\u5EFA\u4F1A\u4F1A\u76F4\u63A5\u63D0\u4EA4\u6D41\u7A0B\uFF0C\u5FC5\u987B\u663E\u5F0F\u4F20 confirm=true\uFF1B\u5982\u53EA\u60F3\u770B\u65B9\u6848\uFF0C\u8BF7\u7528 meeting.eb.meeting.create.flow.prepare"
|
|
6750
6251
|
);
|
|
6751
6252
|
}
|
|
6752
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
6253
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
6753
6254
|
const prepareStartedAt = Date.now();
|
|
6754
6255
|
const prepared = await getMeetingOperation2("meeting.eb.meeting.create.flow.prepare").handler(
|
|
6755
6256
|
{ ...args, confirm: void 0 },
|
|
@@ -6808,8 +6309,10 @@ var meetingEbCreateFlowOperations = [
|
|
|
6808
6309
|
var ebAutoRoomPreflight = async (context) => {
|
|
6809
6310
|
const { extras } = context;
|
|
6810
6311
|
const warnings = [];
|
|
6811
|
-
const enabled = String(process.env.WEAVER_MEETING_AUTO_ROOM ?? "1") !== "0";
|
|
6812
6312
|
const isCreate = context.endpoint.kind === "create" && context.endpoint.interfacePk === "create_meeting";
|
|
6313
|
+
const markRoomUnavailable = (reason, meta) => {
|
|
6314
|
+
extras.roomUnavailable = { reason, ...meta ? { meta } : {} };
|
|
6315
|
+
};
|
|
6813
6316
|
const mode = String(process.env.WEAVER_MEETING_AUTO_ROOM ?? "").trim();
|
|
6814
6317
|
if (isCreate && !context.payload.mainTable.address && mode !== "0") {
|
|
6815
6318
|
const begin = String(context.payload.mainTable.begin_datetime ?? "").trim();
|
|
@@ -6853,15 +6356,25 @@ var ebAutoRoomPreflight = async (context) => {
|
|
|
6853
6356
|
);
|
|
6854
6357
|
} else {
|
|
6855
6358
|
warnings.push(...result.warnings);
|
|
6359
|
+
markRoomUnavailable(
|
|
6360
|
+
`\u6CA1\u6709\u53EF\u7528\u7684\u4F1A\u8BAE\u5BA4\u5019\u9009\uFF08\u5171 ${result.meta?.roomsTotal ?? 0} \u95F4\uFF0C\u53EF\u7528 ${result.meta?.roomsUsable ?? 0} \u95F4\uFF0C\u8BE5\u65F6\u6BB5\u88AB\u5360\u7528 ${result.meta?.roomsBusy ?? 0} \u95F4\uFF09`,
|
|
6361
|
+
result.meta
|
|
6362
|
+
);
|
|
6363
|
+
warnings.push(
|
|
6364
|
+
"\u26A0\uFE0F \u672C\u6B21\u5EFA\u4F1A**\u6CA1\u6709\u4F1A\u8BAE\u5BA4**\uFF1A\u63A8\u8350\u4E0D\u51FA\u5019\u9009\uFF08\u89C1 roomUnavailable.reason\uFF09\u3002\u5FC5\u987B\u7528\u9009\u9879\u65B9\u5F0F\u8BA9\u7528\u6237\u786E\u8BA4\u5730\u70B9 \u2014\u2014 \u6539\u6307\u5B9A\u5177\u4F53\u4F1A\u8BAE\u5BA4\uFF08\u4F20 address\uFF09\u3001\u6539\u4E3A\u7EBF\u4E0A\u4F1A\u8BAE\uFF0C\u6216\u660E\u786E\u63A5\u53D7\u300C\u5730\u70B9\u5F85\u5B9A\u300D\u3002\u4E0D\u8981\u9ED8\u9ED8\u5EFA\u6210\u4E00\u573A\u6CA1\u6709\u5730\u70B9\u7684\u4F1A\u3002"
|
|
6365
|
+
);
|
|
6856
6366
|
}
|
|
6857
6367
|
} catch (error) {
|
|
6858
6368
|
if (error?.subtype === "room_selection_required") throw error;
|
|
6369
|
+
const reason = String(error?.message ?? error).slice(0, 200);
|
|
6370
|
+
markRoomUnavailable(`\u4F1A\u8BAE\u5BA4\u63A8\u8350\u5931\u8D25\uFF1A${reason}`);
|
|
6859
6371
|
warnings.push(
|
|
6860
|
-
`\u4F1A\u8BAE\u5BA4\u63A8\u8350\u5931\u8D25\uFF08${
|
|
6372
|
+
`\u26A0\uFE0F \u4F1A\u8BAE\u5BA4\u63A8\u8350\u5931\u8D25\uFF08${reason}\uFF09\uFF1A\u672C\u6B21**\u4E0D\u586B\u4F1A\u8BAE\u5BA4\u7EE7\u7EED**\uFF0C\u8BF7\u4E0E\u7528\u6237\u786E\u8BA4\u5730\u70B9\uFF0C\u4E0D\u8981\u9ED8\u8BA4\u300C\u5730\u70B9\u5F85\u5B9A\u300D\u3002`
|
|
6861
6373
|
);
|
|
6862
6374
|
}
|
|
6863
6375
|
} else {
|
|
6864
|
-
|
|
6376
|
+
markRoomUnavailable("\u4F1A\u8BAE\u5F00\u59CB/\u7ED3\u675F\u65F6\u95F4\u4E0D\u5B8C\u6574\uFF0C\u65E0\u6CD5\u6309\u65F6\u6BB5\u63A8\u8350");
|
|
6377
|
+
warnings.push("\u4F1A\u8BAE\u5F00\u59CB/\u7ED3\u675F\u65F6\u95F4\u4E0D\u5B8C\u6574\uFF0C\u8DF3\u8FC7\u4F1A\u8BAE\u5BA4\u63A8\u8350\uFF08\u672C\u6B21\u4E0D\u4F1A\u586B\u4F1A\u8BAE\u5BA4\uFF0C\u8BF7\u4E0E\u7528\u6237\u786E\u8BA4\u5730\u70B9\uFF09");
|
|
6865
6378
|
}
|
|
6866
6379
|
}
|
|
6867
6380
|
const conflictWarnings = await ebMeetingWritePreflight(context);
|
|
@@ -6879,7 +6392,7 @@ var ebAutoInvitationAfterWrite = async (context) => {
|
|
|
6879
6392
|
const mtId = String(context.dataIds?.[0] ?? "").trim();
|
|
6880
6393
|
if (!isCreate || !enabled || !mtId) return association;
|
|
6881
6394
|
try {
|
|
6882
|
-
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-
|
|
6395
|
+
const { getMeetingOperation: getMeetingOperation2 } = await import("./registry-QKMI43Q6.js");
|
|
6883
6396
|
const render = getMeetingOperation2("meeting.invitation.render");
|
|
6884
6397
|
const result = await render.handler({ mtId }, context.env);
|
|
6885
6398
|
return { ...association ?? {}, invitation: result?.data ?? null };
|
|
@@ -6930,6 +6443,7 @@ function buildRegistry() {
|
|
|
6930
6443
|
...meetingInvitationOperations,
|
|
6931
6444
|
...meetingQrOperations,
|
|
6932
6445
|
...meetingSummaryOperations,
|
|
6446
|
+
...meetingFormFieldOperations,
|
|
6933
6447
|
...meetingEbOperations
|
|
6934
6448
|
];
|
|
6935
6449
|
for (const definition of definitions) {
|