feat: add caller connection and answer rate analytics
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
CREATE TABLE caller_analysis_calls (
|
||||
id CHAR(64) NOT NULL PRIMARY KEY, payload JSON NULL, updated_at DATETIME(3) NOT NULL
|
||||
);
|
||||
CREATE TABLE caller_analysis_events (
|
||||
id CHAR(64) NOT NULL PRIMARY KEY, call_key CHAR(64) NOT NULL, occurred_at DATETIME(3) NOT NULL,
|
||||
payload JSON NOT NULL, created_at DATETIME(3) NOT NULL,
|
||||
INDEX caller_events_call (call_key, occurred_at), INDEX caller_events_retention (created_at)
|
||||
);
|
||||
CREATE TABLE caller_analysis_states (
|
||||
id CHAR(64) NOT NULL PRIMARY KEY, call_key CHAR(64) NOT NULL, view VARCHAR(16) NOT NULL,
|
||||
started_at DATETIME(3) NOT NULL, customer_id VARCHAR(32) NOT NULL, customer_gateway_id VARCHAR(32) NOT NULL,
|
||||
vendor_id VARCHAR(32) NOT NULL, vendor_gateway_id VARCHAR(32) NOT NULL, caller VARCHAR(64) NOT NULL,
|
||||
callee VARCHAR(64) NOT NULL, city VARCHAR(12) NOT NULL, carrier VARCHAR(20) NOT NULL,
|
||||
counts JSON NOT NULL, payload JSON NOT NULL, updated_at DATETIME(3) NOT NULL,
|
||||
INDEX caller_states_window (view, started_at), INDEX caller_states_customer (customer_id, view, started_at),
|
||||
INDEX caller_states_number (view, caller, started_at), INDEX caller_states_call (call_key)
|
||||
);
|
||||
CREATE TABLE caller_analysis_minute_buckets (
|
||||
id CHAR(64) NOT NULL PRIMARY KEY, started_at DATETIME(3) NOT NULL, view VARCHAR(16) NOT NULL,
|
||||
customer_id VARCHAR(32) NOT NULL, customer_gateway_id VARCHAR(32) NOT NULL,
|
||||
vendor_id VARCHAR(32) NOT NULL, vendor_gateway_id VARCHAR(32) NOT NULL, caller VARCHAR(64) NOT NULL,
|
||||
city VARCHAR(12) NOT NULL, carrier VARCHAR(20) NOT NULL, counts JSON NOT NULL,
|
||||
INDEX caller_buckets_window (view, started_at), INDEX caller_buckets_customer (customer_id, view, started_at),
|
||||
INDEX caller_buckets_number (view, caller, started_at)
|
||||
);
|
||||
CREATE TABLE caller_analysis_access (
|
||||
user_id VARCHAR(32) NOT NULL, customer_id VARCHAR(32) NOT NULL, PRIMARY KEY(user_id, customer_id)
|
||||
);
|
||||
CREATE TABLE caller_analysis_health (
|
||||
id VARCHAR(64) NOT NULL PRIMARY KEY, payload JSON NOT NULL, updated_at DATETIME(3) NOT NULL
|
||||
);
|
||||
CREATE TABLE caller_analysis_alerts (
|
||||
id CHAR(64) NOT NULL PRIMARY KEY, customer_id VARCHAR(32) NOT NULL, view VARCHAR(16) NOT NULL,
|
||||
caller VARCHAR(64) NOT NULL, status VARCHAR(20) NOT NULL, payload JSON NOT NULL,
|
||||
updated_at DATETIME(3) NOT NULL, INDEX caller_alerts_customer (customer_id, status, updated_at)
|
||||
);
|
||||
INSERT INTO permissions (id, module, action, description, created_at, updated_at)
|
||||
VALUES ('caller_analytics.view', 'caller_analytics', 'view', '查看授权客户的主叫分析', NOW(3), NOW(3)),
|
||||
('caller_analytics.view_all', 'caller_analytics', 'view_all', '查看全部客户的主叫分析', NOW(3), NOW(3));
|
||||
INSERT INTO role_permissions (role_id, permission_id, created_at)
|
||||
SELECT id, 'caller_analytics.view', NOW(3) FROM roles WHERE id='ROLE_SUPER_ADMIN';
|
||||
INSERT INTO role_permissions (role_id, permission_id, created_at)
|
||||
SELECT id, 'caller_analytics.view_all', NOW(3) FROM roles WHERE id='ROLE_SUPER_ADMIN';
|
||||
@@ -960,6 +960,91 @@ model OutboxEvent {
|
||||
@@map("outbox_events")
|
||||
}
|
||||
|
||||
model CallerAnalysisCall {
|
||||
id String @id @db.Char(64)
|
||||
payload Json?
|
||||
updatedAt DateTime @map("updated_at") @db.DateTime(3)
|
||||
@@map("caller_analysis_calls")
|
||||
}
|
||||
|
||||
model CallerAnalysisEvent {
|
||||
id String @id @db.Char(64)
|
||||
callKey String @map("call_key") @db.Char(64)
|
||||
occurredAt DateTime @map("occurred_at") @db.DateTime(3)
|
||||
payload Json
|
||||
createdAt DateTime @map("created_at") @db.DateTime(3)
|
||||
@@index([callKey, occurredAt], map: "caller_events_call")
|
||||
@@index([createdAt], map: "caller_events_retention")
|
||||
@@map("caller_analysis_events")
|
||||
}
|
||||
|
||||
model CallerAnalysisState {
|
||||
id String @id @db.Char(64)
|
||||
callKey String @map("call_key") @db.Char(64)
|
||||
view String @db.VarChar(16)
|
||||
startedAt DateTime @map("started_at") @db.DateTime(3)
|
||||
customerId String @map("customer_id") @db.VarChar(32)
|
||||
customerGatewayId String @map("customer_gateway_id") @db.VarChar(32)
|
||||
vendorId String @map("vendor_id") @db.VarChar(32)
|
||||
vendorGatewayId String @map("vendor_gateway_id") @db.VarChar(32)
|
||||
caller String @db.VarChar(64)
|
||||
callee String @db.VarChar(64)
|
||||
city String @db.VarChar(12)
|
||||
carrier String @db.VarChar(20)
|
||||
counts Json
|
||||
payload Json
|
||||
updatedAt DateTime @map("updated_at") @db.DateTime(3)
|
||||
@@index([view, startedAt], map: "caller_states_window")
|
||||
@@index([customerId, view, startedAt], map: "caller_states_customer")
|
||||
@@index([view, caller, startedAt], map: "caller_states_number")
|
||||
@@index([callKey], map: "caller_states_call")
|
||||
@@map("caller_analysis_states")
|
||||
}
|
||||
|
||||
model CallerAnalysisMinuteBucket {
|
||||
id String @id @db.Char(64)
|
||||
startedAt DateTime @map("started_at") @db.DateTime(3)
|
||||
view String @db.VarChar(16)
|
||||
customerId String @map("customer_id") @db.VarChar(32)
|
||||
customerGatewayId String @map("customer_gateway_id") @db.VarChar(32)
|
||||
vendorId String @map("vendor_id") @db.VarChar(32)
|
||||
vendorGatewayId String @map("vendor_gateway_id") @db.VarChar(32)
|
||||
caller String @db.VarChar(64)
|
||||
city String @db.VarChar(12)
|
||||
carrier String @db.VarChar(20)
|
||||
counts Json
|
||||
@@index([view, startedAt], map: "caller_buckets_window")
|
||||
@@index([customerId, view, startedAt], map: "caller_buckets_customer")
|
||||
@@index([view, caller, startedAt], map: "caller_buckets_number")
|
||||
@@map("caller_analysis_minute_buckets")
|
||||
}
|
||||
|
||||
model CallerAnalysisAccess {
|
||||
userId String @map("user_id") @db.VarChar(32)
|
||||
customerId String @map("customer_id") @db.VarChar(32)
|
||||
@@id([userId, customerId])
|
||||
@@map("caller_analysis_access")
|
||||
}
|
||||
|
||||
model CallerAnalysisHealth {
|
||||
id String @id @db.VarChar(64)
|
||||
payload Json
|
||||
updatedAt DateTime @map("updated_at") @db.DateTime(3)
|
||||
@@map("caller_analysis_health")
|
||||
}
|
||||
|
||||
model CallerAnalysisAlert {
|
||||
id String @id @db.Char(64)
|
||||
customerId String @map("customer_id") @db.VarChar(32)
|
||||
view String @db.VarChar(16)
|
||||
caller String @db.VarChar(64)
|
||||
status String @db.VarChar(20)
|
||||
payload Json
|
||||
updatedAt DateTime @map("updated_at") @db.DateTime(3)
|
||||
@@index([customerId, status, updatedAt], map: "caller_alerts_customer")
|
||||
@@map("caller_analysis_alerts")
|
||||
}
|
||||
|
||||
model IdempotencyKey {
|
||||
id String @id @db.VarChar(40)
|
||||
key String @unique @db.VarChar(128)
|
||||
|
||||
@@ -3,6 +3,8 @@ import { PrismaClient } from '@prisma/client';
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
const permissions = [
|
||||
['caller_analytics.view', 'caller_analytics', 'view', '查看授权客户的主叫分析'],
|
||||
['caller_analytics.view_all', 'caller_analytics', 'view_all', '查看全部客户的主叫分析'],
|
||||
['dashboard.view', 'dashboard', 'view', '查看 Dashboard 指标'],
|
||||
['active_calls.view', 'active_calls', 'view', '查看当前通话'],
|
||||
['active_calls.manage', 'active_calls', 'manage', '强制挂断当前通话'],
|
||||
|
||||
Reference in New Issue
Block a user