galaxy-opc-plugin 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.ts +244 -8
- package/package.json +17 -3
- package/skills/acquisition-management/SKILL.md +83 -0
- package/skills/ai-staff/SKILL.md +89 -0
- package/skills/asset-package/SKILL.md +142 -0
- package/skills/opb-canvas/SKILL.md +88 -0
- package/src/__tests__/e2e/company-lifecycle.test.ts +399 -0
- package/src/__tests__/integration/business-workflows.test.ts +366 -0
- package/src/__tests__/test-utils.ts +316 -0
- package/src/commands/opc-command.ts +422 -0
- package/src/db/index.ts +3 -0
- package/src/db/migrations.test.ts +324 -0
- package/src/db/migrations.ts +131 -0
- package/src/db/schema.ts +211 -0
- package/src/db/sqlite-adapter.ts +5 -0
- package/src/opc/autonomy-rules.ts +132 -0
- package/src/opc/briefing-builder.ts +1331 -0
- package/src/opc/business-workflows.test.ts +535 -0
- package/src/opc/business-workflows.ts +325 -0
- package/src/opc/context-injector.ts +366 -28
- package/src/opc/event-triggers.ts +472 -0
- package/src/opc/intelligence-engine.ts +702 -0
- package/src/opc/milestone-detector.ts +251 -0
- package/src/opc/proactive-service.ts +179 -0
- package/src/opc/reminder-service.ts +4 -43
- package/src/opc/session-task-tracker.ts +60 -0
- package/src/opc/stage-detector.ts +168 -0
- package/src/opc/task-executor.ts +332 -0
- package/src/opc/task-templates.ts +179 -0
- package/src/tools/acquisition-tool.ts +8 -5
- package/src/tools/document-tool.ts +1176 -0
- package/src/tools/finance-tool.test.ts +238 -0
- package/src/tools/finance-tool.ts +922 -14
- package/src/tools/hr-tool.ts +10 -1
- package/src/tools/legal-tool.test.ts +251 -0
- package/src/tools/legal-tool.ts +26 -4
- package/src/tools/lifecycle-tool.test.ts +231 -0
- package/src/tools/media-tool.ts +156 -1
- package/src/tools/monitoring-tool.ts +135 -2
- package/src/tools/opc-tool.test.ts +250 -0
- package/src/tools/opc-tool.ts +251 -28
- package/src/tools/project-tool.test.ts +218 -0
- package/src/tools/schemas.ts +80 -0
- package/src/tools/search-tool.ts +227 -0
- package/src/tools/staff-tool.ts +395 -2
- package/src/web/config-ui.ts +299 -45
package/src/db/schema.ts
CHANGED
|
@@ -57,11 +57,28 @@ export const OPC_TABLES = {
|
|
|
57
57
|
tags TEXT NOT NULL DEFAULT '[]',
|
|
58
58
|
notes TEXT NOT NULL DEFAULT '',
|
|
59
59
|
last_contact_date TEXT NOT NULL DEFAULT (date('now')),
|
|
60
|
+
pipeline_stage TEXT NOT NULL DEFAULT 'lead',
|
|
61
|
+
follow_up_date TEXT NOT NULL DEFAULT '',
|
|
62
|
+
deal_value REAL NOT NULL DEFAULT 0,
|
|
63
|
+
source TEXT NOT NULL DEFAULT '',
|
|
60
64
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
61
65
|
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
66
|
+
UNIQUE(company_id, name),
|
|
62
67
|
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
63
68
|
)
|
|
64
69
|
`,
|
|
70
|
+
|
|
71
|
+
contact_interactions: `
|
|
72
|
+
CREATE TABLE IF NOT EXISTS opc_contact_interactions (
|
|
73
|
+
id TEXT PRIMARY KEY,
|
|
74
|
+
contact_id TEXT NOT NULL,
|
|
75
|
+
company_id TEXT NOT NULL,
|
|
76
|
+
interaction_type TEXT NOT NULL DEFAULT 'note',
|
|
77
|
+
content TEXT NOT NULL DEFAULT '',
|
|
78
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
79
|
+
FOREIGN KEY (contact_id) REFERENCES opc_contacts(id)
|
|
80
|
+
)
|
|
81
|
+
`,
|
|
65
82
|
// ── Phase 2 表 ────────────────────────────────────────────
|
|
66
83
|
|
|
67
84
|
invoices: `
|
|
@@ -108,6 +125,7 @@ export const OPC_TABLES = {
|
|
|
108
125
|
title TEXT NOT NULL,
|
|
109
126
|
counterparty TEXT NOT NULL DEFAULT '',
|
|
110
127
|
contract_type TEXT NOT NULL DEFAULT '',
|
|
128
|
+
direction TEXT NOT NULL DEFAULT 'sales',
|
|
111
129
|
amount REAL NOT NULL DEFAULT 0,
|
|
112
130
|
start_date TEXT NOT NULL DEFAULT '',
|
|
113
131
|
end_date TEXT NOT NULL DEFAULT '',
|
|
@@ -154,6 +172,9 @@ export const OPC_TABLES = {
|
|
|
154
172
|
published_date TEXT NOT NULL DEFAULT '',
|
|
155
173
|
tags TEXT NOT NULL DEFAULT '[]',
|
|
156
174
|
metrics TEXT NOT NULL DEFAULT '{}',
|
|
175
|
+
reviewer TEXT NOT NULL DEFAULT '',
|
|
176
|
+
review_notes TEXT NOT NULL DEFAULT '',
|
|
177
|
+
approved_at TEXT NOT NULL DEFAULT '',
|
|
157
178
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
158
179
|
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
159
180
|
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
@@ -437,6 +458,129 @@ export const OPC_TABLES = {
|
|
|
437
458
|
)
|
|
438
459
|
`,
|
|
439
460
|
|
|
461
|
+
// ── AI 员工任务追踪表 ───────────────────────────────────────────
|
|
462
|
+
|
|
463
|
+
staff_tasks: `
|
|
464
|
+
CREATE TABLE IF NOT EXISTS opc_staff_tasks (
|
|
465
|
+
id TEXT PRIMARY KEY,
|
|
466
|
+
company_id TEXT NOT NULL,
|
|
467
|
+
staff_role TEXT NOT NULL,
|
|
468
|
+
title TEXT NOT NULL,
|
|
469
|
+
description TEXT NOT NULL DEFAULT '',
|
|
470
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
471
|
+
priority TEXT NOT NULL DEFAULT 'normal',
|
|
472
|
+
task_type TEXT NOT NULL DEFAULT 'manual',
|
|
473
|
+
schedule TEXT NOT NULL DEFAULT 'on_demand',
|
|
474
|
+
result_summary TEXT NOT NULL DEFAULT '',
|
|
475
|
+
result_data TEXT NOT NULL DEFAULT '{}',
|
|
476
|
+
session_key TEXT NOT NULL DEFAULT '',
|
|
477
|
+
assigned_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
478
|
+
started_at TEXT NOT NULL DEFAULT '',
|
|
479
|
+
completed_at TEXT NOT NULL DEFAULT '',
|
|
480
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
481
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
482
|
+
)
|
|
483
|
+
`,
|
|
484
|
+
|
|
485
|
+
// ── 主动智能系统表 ─────────────────────────────────────────────
|
|
486
|
+
|
|
487
|
+
insights: `
|
|
488
|
+
CREATE TABLE IF NOT EXISTS opc_insights (
|
|
489
|
+
id TEXT PRIMARY KEY,
|
|
490
|
+
company_id TEXT NOT NULL,
|
|
491
|
+
insight_type TEXT NOT NULL DEFAULT 'data_gap',
|
|
492
|
+
category TEXT NOT NULL DEFAULT 'ops',
|
|
493
|
+
priority INTEGER NOT NULL DEFAULT 50,
|
|
494
|
+
title TEXT NOT NULL,
|
|
495
|
+
message TEXT NOT NULL DEFAULT '',
|
|
496
|
+
action_hint TEXT NOT NULL DEFAULT '',
|
|
497
|
+
staff_role TEXT NOT NULL DEFAULT '',
|
|
498
|
+
status TEXT NOT NULL DEFAULT 'active',
|
|
499
|
+
expires_at TEXT NOT NULL DEFAULT '',
|
|
500
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
501
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
502
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
503
|
+
)
|
|
504
|
+
`,
|
|
505
|
+
|
|
506
|
+
celebrations: `
|
|
507
|
+
CREATE TABLE IF NOT EXISTS opc_celebrations (
|
|
508
|
+
id TEXT PRIMARY KEY,
|
|
509
|
+
company_id TEXT NOT NULL,
|
|
510
|
+
celebration_type TEXT NOT NULL,
|
|
511
|
+
title TEXT NOT NULL,
|
|
512
|
+
message TEXT NOT NULL DEFAULT '',
|
|
513
|
+
metric_value REAL NOT NULL DEFAULT 0,
|
|
514
|
+
shown INTEGER NOT NULL DEFAULT 0,
|
|
515
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
516
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
517
|
+
)
|
|
518
|
+
`,
|
|
519
|
+
|
|
520
|
+
company_stage: `
|
|
521
|
+
CREATE TABLE IF NOT EXISTS opc_company_stage (
|
|
522
|
+
company_id TEXT PRIMARY KEY,
|
|
523
|
+
stage TEXT NOT NULL DEFAULT 'idea',
|
|
524
|
+
stage_label TEXT NOT NULL DEFAULT '构想阶段',
|
|
525
|
+
confidence REAL NOT NULL DEFAULT 0,
|
|
526
|
+
factors_json TEXT NOT NULL DEFAULT '{}',
|
|
527
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
528
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
529
|
+
)
|
|
530
|
+
`,
|
|
531
|
+
|
|
532
|
+
briefings: `
|
|
533
|
+
CREATE TABLE IF NOT EXISTS opc_briefings (
|
|
534
|
+
id TEXT PRIMARY KEY,
|
|
535
|
+
company_id TEXT NOT NULL,
|
|
536
|
+
briefing_date TEXT NOT NULL DEFAULT (date('now')),
|
|
537
|
+
stage TEXT NOT NULL DEFAULT '',
|
|
538
|
+
health_score REAL NOT NULL DEFAULT 0,
|
|
539
|
+
summary_json TEXT NOT NULL DEFAULT '{}',
|
|
540
|
+
insights_json TEXT NOT NULL DEFAULT '[]',
|
|
541
|
+
next_steps_json TEXT NOT NULL DEFAULT '[]',
|
|
542
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
543
|
+
UNIQUE(company_id, briefing_date),
|
|
544
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
545
|
+
)
|
|
546
|
+
`,
|
|
547
|
+
|
|
548
|
+
// ── 文档生成表 ─────────────────────────────────────────────────
|
|
549
|
+
|
|
550
|
+
documents: `
|
|
551
|
+
CREATE TABLE IF NOT EXISTS opc_documents (
|
|
552
|
+
id TEXT PRIMARY KEY,
|
|
553
|
+
company_id TEXT NOT NULL,
|
|
554
|
+
doc_type TEXT NOT NULL DEFAULT 'contract',
|
|
555
|
+
title TEXT NOT NULL,
|
|
556
|
+
template_key TEXT NOT NULL DEFAULT '',
|
|
557
|
+
content TEXT NOT NULL DEFAULT '',
|
|
558
|
+
variables TEXT NOT NULL DEFAULT '{}',
|
|
559
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
560
|
+
status TEXT NOT NULL DEFAULT 'draft',
|
|
561
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
562
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
563
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
564
|
+
)
|
|
565
|
+
`,
|
|
566
|
+
|
|
567
|
+
// ── 发票明细行表 ───────────────────────────────────────────────
|
|
568
|
+
|
|
569
|
+
invoice_items: `
|
|
570
|
+
CREATE TABLE IF NOT EXISTS opc_invoice_items (
|
|
571
|
+
id TEXT PRIMARY KEY,
|
|
572
|
+
invoice_id TEXT NOT NULL,
|
|
573
|
+
description TEXT NOT NULL DEFAULT '',
|
|
574
|
+
quantity REAL NOT NULL DEFAULT 1,
|
|
575
|
+
unit_price REAL NOT NULL DEFAULT 0,
|
|
576
|
+
amount REAL NOT NULL DEFAULT 0,
|
|
577
|
+
tax_rate REAL NOT NULL DEFAULT 0,
|
|
578
|
+
tax_amount REAL NOT NULL DEFAULT 0,
|
|
579
|
+
sort_order INTEGER NOT NULL DEFAULT 0,
|
|
580
|
+
FOREIGN KEY (invoice_id) REFERENCES opc_invoices(id)
|
|
581
|
+
)
|
|
582
|
+
`,
|
|
583
|
+
|
|
440
584
|
// ── OPB 画布表 ───────────────────────────────────────────────
|
|
441
585
|
|
|
442
586
|
opb_canvas: `
|
|
@@ -464,6 +608,45 @@ export const OPC_TABLES = {
|
|
|
464
608
|
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
465
609
|
)
|
|
466
610
|
`,
|
|
611
|
+
|
|
612
|
+
// ── 财务期间表 ─────────────────────────────────────────────────
|
|
613
|
+
|
|
614
|
+
financial_periods: `
|
|
615
|
+
CREATE TABLE IF NOT EXISTS opc_financial_periods (
|
|
616
|
+
id TEXT PRIMARY KEY,
|
|
617
|
+
company_id TEXT NOT NULL,
|
|
618
|
+
period_type TEXT NOT NULL,
|
|
619
|
+
start_date TEXT NOT NULL,
|
|
620
|
+
end_date TEXT NOT NULL,
|
|
621
|
+
revenue REAL NOT NULL DEFAULT 0,
|
|
622
|
+
cost REAL NOT NULL DEFAULT 0,
|
|
623
|
+
profit REAL NOT NULL DEFAULT 0,
|
|
624
|
+
cash_flow REAL NOT NULL DEFAULT 0,
|
|
625
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
626
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
627
|
+
UNIQUE(company_id, period_type, start_date),
|
|
628
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
629
|
+
)
|
|
630
|
+
`,
|
|
631
|
+
|
|
632
|
+
// ── 付款记录表 ─────────────────────────────────────────────────
|
|
633
|
+
|
|
634
|
+
payments: `
|
|
635
|
+
CREATE TABLE IF NOT EXISTS opc_payments (
|
|
636
|
+
id TEXT PRIMARY KEY,
|
|
637
|
+
company_id TEXT NOT NULL,
|
|
638
|
+
invoice_id TEXT NOT NULL DEFAULT '',
|
|
639
|
+
type TEXT NOT NULL,
|
|
640
|
+
amount REAL NOT NULL DEFAULT 0,
|
|
641
|
+
status TEXT NOT NULL DEFAULT 'pending',
|
|
642
|
+
due_date TEXT NOT NULL DEFAULT '',
|
|
643
|
+
paid_date TEXT NOT NULL DEFAULT '',
|
|
644
|
+
notes TEXT NOT NULL DEFAULT '',
|
|
645
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
646
|
+
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
647
|
+
FOREIGN KEY (company_id) REFERENCES opc_companies(id)
|
|
648
|
+
)
|
|
649
|
+
`,
|
|
467
650
|
} as const;
|
|
468
651
|
|
|
469
652
|
export const OPC_INDEXES = [
|
|
@@ -513,6 +696,34 @@ export const OPC_INDEXES = [
|
|
|
513
696
|
"CREATE INDEX IF NOT EXISTS idx_financing_fees_transfer ON opc_financing_fees(transfer_id)",
|
|
514
697
|
"CREATE INDEX IF NOT EXISTS idx_financing_fees_status ON opc_financing_fees(status)",
|
|
515
698
|
"CREATE INDEX IF NOT EXISTS idx_staff_config_company ON opc_staff_config(company_id)",
|
|
699
|
+
// AI 员工任务
|
|
700
|
+
"CREATE INDEX IF NOT EXISTS idx_staff_tasks_company ON opc_staff_tasks(company_id)",
|
|
701
|
+
"CREATE INDEX IF NOT EXISTS idx_staff_tasks_role ON opc_staff_tasks(staff_role)",
|
|
702
|
+
"CREATE INDEX IF NOT EXISTS idx_staff_tasks_status ON opc_staff_tasks(status)",
|
|
703
|
+
// session_key 索引由 migration v9 创建(旧库此时列尚不存在)
|
|
704
|
+
// CRM(新表索引可在此创建,contacts 列索引由 migration v10 创建,旧库此时列尚不存在)
|
|
705
|
+
"CREATE INDEX IF NOT EXISTS idx_interactions_contact ON opc_contact_interactions(contact_id)",
|
|
706
|
+
// Documents
|
|
707
|
+
"CREATE INDEX IF NOT EXISTS idx_documents_company ON opc_documents(company_id)",
|
|
708
|
+
"CREATE INDEX IF NOT EXISTS idx_documents_type ON opc_documents(doc_type)",
|
|
709
|
+
// Invoice Items
|
|
710
|
+
"CREATE INDEX IF NOT EXISTS idx_invoice_items_invoice ON opc_invoice_items(invoice_id)",
|
|
516
711
|
// OPB Canvas
|
|
517
712
|
"CREATE INDEX IF NOT EXISTS idx_opb_canvas_company ON opc_opb_canvas(company_id)",
|
|
713
|
+
// 主动智能系统
|
|
714
|
+
"CREATE INDEX IF NOT EXISTS idx_insights_company ON opc_insights(company_id)",
|
|
715
|
+
"CREATE INDEX IF NOT EXISTS idx_insights_status ON opc_insights(status)",
|
|
716
|
+
"CREATE INDEX IF NOT EXISTS idx_insights_type ON opc_insights(insight_type)",
|
|
717
|
+
"CREATE INDEX IF NOT EXISTS idx_insights_expires ON opc_insights(expires_at)",
|
|
718
|
+
"CREATE INDEX IF NOT EXISTS idx_celebrations_company ON opc_celebrations(company_id)",
|
|
719
|
+
"CREATE INDEX IF NOT EXISTS idx_celebrations_shown ON opc_celebrations(shown)",
|
|
720
|
+
"CREATE INDEX IF NOT EXISTS idx_briefings_company_date ON opc_briefings(company_id, briefing_date)",
|
|
721
|
+
// 财务期间表索引
|
|
722
|
+
"CREATE INDEX IF NOT EXISTS idx_financial_periods_company ON opc_financial_periods(company_id)",
|
|
723
|
+
"CREATE INDEX IF NOT EXISTS idx_financial_periods_dates ON opc_financial_periods(start_date, end_date)",
|
|
724
|
+
// 付款记录表索引
|
|
725
|
+
"CREATE INDEX IF NOT EXISTS idx_payments_company ON opc_payments(company_id)",
|
|
726
|
+
"CREATE INDEX IF NOT EXISTS idx_payments_invoice ON opc_payments(invoice_id)",
|
|
727
|
+
"CREATE INDEX IF NOT EXISTS idx_payments_status ON opc_payments(status)",
|
|
728
|
+
"CREATE INDEX IF NOT EXISTS idx_payments_due_date ON opc_payments(due_date)",
|
|
518
729
|
];
|
package/src/db/sqlite-adapter.ts
CHANGED
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 星环OPC中心 — 自主行动边界定义
|
|
3
|
+
*
|
|
4
|
+
* AI 员工在定义好的边界内自主行动,超出边界时升级给老板。
|
|
5
|
+
*
|
|
6
|
+
* needsBossApproval:
|
|
7
|
+
* false → 直接创建 staff_task(status='pending'),cron 触发时自动执行
|
|
8
|
+
* true → 创建 staff_task(status='pending_approval')+ 写入 insight 告知老板
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export interface AutonomyRule {
|
|
12
|
+
trigger: string;
|
|
13
|
+
action: string;
|
|
14
|
+
needsBossApproval: boolean;
|
|
15
|
+
escalationMsg?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface AutonomyResult {
|
|
19
|
+
needsBossApproval: boolean;
|
|
20
|
+
escalationMsg?: string;
|
|
21
|
+
action: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** 每个 AI 岗位的自主权限定义 */
|
|
25
|
+
const AUTONOMY_RULES: Record<string, AutonomyRule[]> = {
|
|
26
|
+
finance: [
|
|
27
|
+
{
|
|
28
|
+
trigger: "invoice_overdue_7d",
|
|
29
|
+
action: "create_reminder_task",
|
|
30
|
+
needsBossApproval: false,
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
trigger: "invoice_overdue_30d",
|
|
34
|
+
action: "create_urgent_task",
|
|
35
|
+
needsBossApproval: true,
|
|
36
|
+
escalationMsg: "有一笔逾期30天的应收款需要决策:是否发送正式催收函?",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
trigger: "monthly_close",
|
|
40
|
+
action: "create_monthly_report",
|
|
41
|
+
needsBossApproval: false,
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
trigger: "cashflow_anomaly",
|
|
45
|
+
action: "create_analysis_task",
|
|
46
|
+
needsBossApproval: false,
|
|
47
|
+
},
|
|
48
|
+
],
|
|
49
|
+
legal: [
|
|
50
|
+
{
|
|
51
|
+
trigger: "contract_expiry_30d",
|
|
52
|
+
action: "create_review_task",
|
|
53
|
+
needsBossApproval: false,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
trigger: "contract_expiry_7d",
|
|
57
|
+
action: "create_urgent_task",
|
|
58
|
+
needsBossApproval: true,
|
|
59
|
+
escalationMsg: "合同即将到期(7天内),需要续签决策",
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
marketing: [
|
|
63
|
+
{
|
|
64
|
+
trigger: "weekly_content",
|
|
65
|
+
action: "create_content_task",
|
|
66
|
+
needsBossApproval: false,
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
trigger: "competitor_change",
|
|
70
|
+
action: "create_analysis_task",
|
|
71
|
+
needsBossApproval: false,
|
|
72
|
+
},
|
|
73
|
+
],
|
|
74
|
+
ops: [
|
|
75
|
+
{
|
|
76
|
+
trigger: "project_overdue",
|
|
77
|
+
action: "create_followup_task",
|
|
78
|
+
needsBossApproval: false,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
trigger: "task_blocked_3d",
|
|
82
|
+
action: "create_escalation_task",
|
|
83
|
+
needsBossApproval: true,
|
|
84
|
+
escalationMsg: "有任务阻塞超过3天,需要老板协调解决",
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
hr: [
|
|
88
|
+
{
|
|
89
|
+
trigger: "contract_expiry_30d",
|
|
90
|
+
action: "create_renewal_task",
|
|
91
|
+
needsBossApproval: false,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
admin: [
|
|
95
|
+
{
|
|
96
|
+
trigger: "general_alert",
|
|
97
|
+
action: "create_handling_task",
|
|
98
|
+
needsBossApproval: false,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* 检查指定岗位 + 触发器的自主权限。
|
|
105
|
+
* 返回是否需要老板审批,以及升级消息。
|
|
106
|
+
*/
|
|
107
|
+
export function checkAutonomy(staffRole: string, trigger: string): AutonomyResult {
|
|
108
|
+
const rules = AUTONOMY_RULES[staffRole];
|
|
109
|
+
if (!rules) {
|
|
110
|
+
// 未定义的岗位,默认不需要审批
|
|
111
|
+
return { needsBossApproval: false, action: "create_task" };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const rule = rules.find(r => r.trigger === trigger);
|
|
115
|
+
if (!rule) {
|
|
116
|
+
// 未定义的触发器,默认不需要审批
|
|
117
|
+
return { needsBossApproval: false, action: "create_task" };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
needsBossApproval: rule.needsBossApproval,
|
|
122
|
+
escalationMsg: rule.escalationMsg,
|
|
123
|
+
action: rule.action,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* 获取所有自主行动规则(用于管理界面展示)。
|
|
129
|
+
*/
|
|
130
|
+
export function getAllAutonomyRules(): Record<string, AutonomyRule[]> {
|
|
131
|
+
return AUTONOMY_RULES;
|
|
132
|
+
}
|