保险前后端,养殖端和保险端小程序

This commit is contained in:
xuqiuyun
2025-09-17 19:01:52 +08:00
parent e4287b83fe
commit 473891163c
218 changed files with 109331 additions and 14103 deletions

View File

@@ -0,0 +1,250 @@
-- 保险端口系统数据库表结构
-- 创建时间: 2025-01-01
-- 数据库: MySQL 8.0+
-- 创建数据库
CREATE DATABASE IF NOT EXISTS insurance_data
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
USE insurance_data;
-- 1. 角色表
CREATE TABLE IF NOT EXISTS roles (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '角色ID',
name VARCHAR(50) NOT NULL UNIQUE COMMENT '角色名称',
description VARCHAR(255) NULL COMMENT '角色描述',
permissions JSON NOT NULL COMMENT '权限配置',
status ENUM('active', 'inactive') NOT NULL DEFAULT 'active' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_roles_name (name),
INDEX idx_roles_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- 2. 用户表
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(255) NOT NULL COMMENT '密码',
real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
phone VARCHAR(20) NOT NULL COMMENT '手机号',
role_id INT NOT NULL COMMENT '角色ID',
status ENUM('active', 'inactive', 'suspended') NOT NULL DEFAULT 'active' COMMENT '状态',
last_login TIMESTAMP NULL COMMENT '最后登录时间',
avatar VARCHAR(255) NULL COMMENT '头像URL',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_users_username (username),
INDEX idx_users_email (email),
INDEX idx_users_phone (phone),
INDEX idx_users_role_id (role_id),
INDEX idx_users_status (status),
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 3. 保险类型表
CREATE TABLE IF NOT EXISTS insurance_types (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '保险类型ID',
name VARCHAR(100) NOT NULL UNIQUE COMMENT '保险类型名称',
description TEXT NULL COMMENT '保险类型描述',
coverage_amount_min DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '最低保额',
coverage_amount_max DECIMAL(15,2) NOT NULL DEFAULT 1000000.00 COMMENT '最高保额',
premium_rate DECIMAL(5,4) NOT NULL DEFAULT 0.001 COMMENT '保险费率',
status ENUM('active', 'inactive') NOT NULL DEFAULT 'active' COMMENT '状态',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_insurance_type_name (name),
INDEX idx_insurance_type_status (status),
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险类型表';
-- 4. 保险申请表
CREATE TABLE IF NOT EXISTS insurance_applications (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '申请ID',
application_no VARCHAR(50) NOT NULL UNIQUE COMMENT '申请编号',
customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
customer_id_card VARCHAR(18) NOT NULL COMMENT '客户身份证号',
customer_phone VARCHAR(20) NOT NULL COMMENT '客户手机号',
customer_address VARCHAR(255) NOT NULL COMMENT '客户地址',
insurance_type_id INT NOT NULL COMMENT '保险类型ID',
application_amount DECIMAL(15,2) NOT NULL COMMENT '申请金额',
status ENUM('pending', 'approved', 'rejected', 'under_review') NOT NULL DEFAULT 'pending' COMMENT '状态',
application_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请日期',
review_notes TEXT NULL COMMENT '审核备注',
reviewer_id INT NULL COMMENT '审核人ID',
review_date TIMESTAMP NULL COMMENT '审核日期',
documents JSON NULL COMMENT '申请文档',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_applications_application_no (application_no),
INDEX idx_applications_customer_id_card (customer_id_card),
INDEX idx_applications_customer_phone (customer_phone),
INDEX idx_applications_status (status),
INDEX idx_applications_application_date (application_date),
INDEX idx_applications_insurance_type_id (insurance_type_id),
INDEX idx_applications_reviewer_id (reviewer_id),
FOREIGN KEY (insurance_type_id) REFERENCES insurance_types(id) ON DELETE RESTRICT,
FOREIGN KEY (reviewer_id) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险申请表';
-- 5. 保单表
CREATE TABLE IF NOT EXISTS policies (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '保单ID',
policy_no VARCHAR(50) NOT NULL UNIQUE COMMENT '保单编号',
application_id INT NOT NULL COMMENT '关联的保险申请ID',
insurance_type_id INT NOT NULL COMMENT '保险类型ID',
customer_id INT NOT NULL COMMENT '客户ID',
coverage_amount DECIMAL(15,2) NOT NULL COMMENT '保额',
premium_amount DECIMAL(15,2) NOT NULL COMMENT '保费金额',
start_date DATE NOT NULL COMMENT '保险开始日期',
end_date DATE NOT NULL COMMENT '保险结束日期',
policy_status ENUM('active', 'expired', 'cancelled', 'suspended') NOT NULL DEFAULT 'active' COMMENT '保单状态',
payment_status ENUM('paid', 'unpaid', 'partial') NOT NULL DEFAULT 'unpaid' COMMENT '支付状态',
payment_date DATE NULL COMMENT '支付日期',
policy_document_url VARCHAR(500) NULL COMMENT '保单文件URL',
terms_and_conditions TEXT NULL COMMENT '条款和条件',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE INDEX idx_policy_no (policy_no),
INDEX idx_policy_customer (customer_id),
INDEX idx_policy_application (application_id),
INDEX idx_policy_status (policy_status),
INDEX idx_policy_payment_status (payment_status),
INDEX idx_policy_dates (start_date, end_date),
FOREIGN KEY (application_id) REFERENCES insurance_applications(id) ON DELETE RESTRICT,
FOREIGN KEY (insurance_type_id) REFERENCES insurance_types(id) ON DELETE RESTRICT,
FOREIGN KEY (customer_id) REFERENCES users(id) ON DELETE RESTRICT,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保单表';
-- 6. 理赔表
CREATE TABLE IF NOT EXISTS claims (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '理赔ID',
claim_no VARCHAR(50) NOT NULL UNIQUE COMMENT '理赔编号',
policy_id INT NOT NULL COMMENT '关联的保单ID',
customer_id INT NOT NULL COMMENT '客户ID',
claim_amount DECIMAL(15,2) NOT NULL COMMENT '理赔金额',
claim_date DATE NOT NULL COMMENT '理赔发生日期',
incident_description TEXT NOT NULL COMMENT '事故描述',
claim_status ENUM('pending', 'approved', 'rejected', 'processing', 'paid') NOT NULL DEFAULT 'pending' COMMENT '理赔状态',
review_notes TEXT NULL COMMENT '审核备注',
reviewer_id INT NULL COMMENT '审核人ID',
review_date DATE NULL COMMENT '审核日期',
payment_date DATE NULL COMMENT '支付日期',
supporting_documents JSON NULL COMMENT '支持文件',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE INDEX idx_claim_no (claim_no),
INDEX idx_claim_policy (policy_id),
INDEX idx_claim_customer (customer_id),
INDEX idx_claim_status (claim_status),
INDEX idx_claim_date (claim_date),
FOREIGN KEY (policy_id) REFERENCES policies(id) ON DELETE RESTRICT,
FOREIGN KEY (customer_id) REFERENCES users(id) ON DELETE RESTRICT,
FOREIGN KEY (reviewer_id) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='理赔表';
-- 7. 系统配置表
CREATE TABLE IF NOT EXISTS system_configs (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID',
config_key VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键',
config_value JSON NOT NULL COMMENT '配置值',
description VARCHAR(255) NULL COMMENT '配置描述',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_system_config_key (config_key),
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';
-- 8. 系统日志表
CREATE TABLE IF NOT EXISTS system_logs (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',
level ENUM('info', 'warning', 'error', 'debug') NOT NULL DEFAULT 'info' COMMENT '日志级别',
message TEXT NOT NULL COMMENT '日志消息',
module VARCHAR(100) NOT NULL COMMENT '模块名称',
user_id INT NULL COMMENT '用户ID',
ip_address VARCHAR(45) NULL COMMENT 'IP地址',
user_agent TEXT NULL COMMENT '用户代理',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
INDEX idx_system_logs_level (level),
INDEX idx_system_logs_module (module),
INDEX idx_system_logs_user_id (user_id),
INDEX idx_system_logs_created_at (created_at),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统日志表';
-- 插入初始数据
-- 插入默认角色
INSERT INTO roles (name, description, permissions, status) VALUES
('admin', '系统管理员', '["user:read","user:create","user:update","user:delete","insurance:read","insurance:create","insurance:update","insurance:delete","insurance:review","policy:read","policy:create","policy:update","policy:delete","claim:read","claim:create","claim:update","claim:review","system:read","system:update","system:admin"]', 'active'),
('agent', '保险代理人', '["insurance:read","insurance:create","policy:read","policy:create","claim:read","claim:create"]', 'active'),
('customer', '客户', '["insurance:read","policy:read","claim:read","claim:create"]', 'active');
-- 插入默认保险类型
INSERT INTO insurance_types (name, description, coverage_amount_min, coverage_amount_max, premium_rate, status) VALUES
('人寿保险', '提供生命保障的保险产品', 10000.00, 1000000.00, 0.0025, 'active'),
('健康保险', '提供医疗保障的保险产品', 5000.00, 500000.00, 0.0030, 'active'),
('意外伤害保险', '提供意外伤害保障的保险产品', 1000.00, 200000.00, 0.0015, 'active'),
('财产保险', '提供财产保障的保险产品', 5000.00, 1000000.00, 0.0020, 'active'),
('车险', '提供车辆保障的保险产品', 1000.00, 500000.00, 0.0040, 'active');
-- 插入默认系统配置
INSERT INTO system_configs (config_key, config_value, description) VALUES
('system_name', '"保险端口系统"', '系统名称'),
('company_name', '"XX保险公司"', '公司名称'),
('contact_email', '"support@insurance.com"', '联系邮箱'),
('contact_phone', '"400-123-4567"', '联系电话'),
('max_file_size', '10485760', '最大文件上传大小(字节)'),
('allowed_file_types', '["jpg", "jpeg", "png", "pdf", "doc", "docx"]', '允许上传的文件类型');
-- 创建管理员用户(密码需要在前端加密后存储)
-- 默认密码: admin123 (需要在前端使用bcrypt加密)
INSERT INTO users (username, password, real_name, email, phone, role_id, status) VALUES
('admin', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '系统管理员', 'admin@insurance.com', '13800138000', 1, 'active');
COMMIT;
-- 显示表结构信息
SHOW TABLES;
-- 显示各表注释
SELECT
TABLE_NAME,
TABLE_COMMENT
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = 'nxxmdata';
-- 显示表创建语句示例
SHOW CREATE TABLE users;

View File

@@ -0,0 +1,113 @@
const { sequelize } = require('../config/database');
const { User, Role, InsuranceApplication, InsuranceType, Policy, Claim } = require('../models');
async function initDatabase() {
try {
console.log('🔄 开始初始化数据库...');
// 测试数据库连接
console.log('🔗 测试数据库连接...');
await sequelize.authenticate();
console.log('✅ 数据库连接成功');
// 先删除所有表(如果存在)
console.log('🗑️ 清理现有表结构...');
// 禁用外键约束
await sequelize.query('SET FOREIGN_KEY_CHECKS = 0');
await Claim.drop();
await Policy.drop();
await InsuranceApplication.drop();
await InsuranceType.drop();
await User.drop();
await Role.drop();
// 启用外键约束
await sequelize.query('SET FOREIGN_KEY_CHECKS = 1');
console.log('✅ 现有表结构清理完成');
// 按顺序创建表
console.log('🗄️ 创建角色表...');
await Role.sync();
console.log('🗄️ 创建用户表...');
await User.sync();
console.log('🗄️ 创建保险类型表...');
await InsuranceType.sync();
console.log('🗄️ 创建保险申请表...');
await InsuranceApplication.sync();
console.log('🗄️ 创建保单表...');
await Policy.sync();
console.log('🗄️ 创建理赔表...');
await Claim.sync();
console.log('✅ 所有表创建完成');
// 创建默认角色
console.log('👥 创建默认角色...');
const roles = await Role.bulkCreate([
{ name: 'admin', description: '系统管理员', permissions: JSON.stringify(['*']) },
{ name: 'agent', description: '保险代理人', permissions: JSON.stringify(['insurance:read', 'insurance:create', 'policy:read']) },
{ name: 'customer', description: '客户', permissions: JSON.stringify(['insurance:create', 'policy:read:self', 'claim:create:self']) },
{ name: 'reviewer', description: '审核员', permissions: JSON.stringify(['insurance:review', 'claim:review']) }
]);
console.log('✅ 默认角色创建完成');
// 创建默认保险类型
console.log('📋 创建默认保险类型...');
const insuranceTypes = await InsuranceType.bulkCreate([
{
name: '人寿保险',
description: '提供生命保障的保险产品',
coverage_amount_min: 10000,
coverage_amount_max: 1000000,
premium_rate: 0.0025,
status: 'active'
},
{
name: '健康保险',
description: '提供医疗保障的保险产品',
coverage_amount_min: 5000,
coverage_amount_max: 500000,
premium_rate: 0.003,
status: 'active'
},
{
name: '财产保险',
description: '提供财产保障的保险产品',
coverage_amount_min: 1000,
coverage_amount_max: 2000000,
premium_rate: 0.0015,
status: 'active'
},
{
name: '车险',
description: '提供车辆保障的保险产品',
coverage_amount_min: 500,
coverage_amount_max: 1000000,
premium_rate: 0.002,
status: 'active'
}
]);
console.log('✅ 默认保险类型创建完成');
console.log('🎉 数据库初始化完成!');
} catch (error) {
console.error('❌ 数据库初始化失败:', error);
process.exit(1);
} finally {
await sequelize.close();
}
}
// 如果是直接运行此脚本
if (require.main === module) {
initDatabase();
}
module.exports = initDatabase;

View File

@@ -0,0 +1,37 @@
SET NAMES utf8mb4;
SET CHARACTER SET utf8mb4;
-- 更新默认角色权限
UPDATE roles SET
description = '系统管理员',
permissions = '["user:read","user:create","user:update","user:delete","insurance:read","insurance:create","insurance:update","insurance:delete","insurance:review","policy:read","policy:create","policy:update","policy:delete","claim:read","claim:create","claim:update","claim:review","system:read","system:update","system:admin"]'
WHERE name = 'admin';
-- 插入其他角色(如果不存在)
INSERT IGNORE INTO roles (name, description, permissions, status) VALUES
('agent', '保险代理人', '["insurance:read","insurance:create","policy:read","policy:create","claim:read","claim:create"]', 'active'),
('customer', '客户', '["insurance:read","policy:read","claim:read","claim:create"]', 'active');
-- 插入默认保险类型
INSERT IGNORE INTO insurance_types (name, description, coverage_amount_min, coverage_amount_max, premium_rate, status) VALUES
('人寿保险', '提供生命保障的保险产品', 10000.00, 1000000.00, 0.0025, 'active'),
('健康保险', '提供医疗保障的保险产品', 5000.00, 500000.00, 0.0030, 'active'),
('意外伤害保险', '提供意外伤害保障的保险产品', 1000.00, 200000.00, 0.0015, 'active'),
('财产保险', '提供财产保障的保险产品', 5000.00, 1000000.00, 0.0020, 'active'),
('车险', '提供车辆保障的保险产品', 1000.00, 500000.00, 0.0040, 'active');
-- 插入默认系统配置
INSERT IGNORE INTO system_configs (config_key, config_value, description) VALUES
('system_name', '"保险端口系统"', '系统名称'),
('company_name', '"XX保险公司"', '公司名称'),
('contact_email', '"support@insurance.com"', '联系邮箱'),
('contact_phone', '"400-123-4567"', '联系电话'),
('max_file_size', '10485760', '最大文件上传大小(字节)'),
('allowed_file_types', '["jpg", "jpeg", "png", "pdf", "doc", "docx"]', '允许上传的文件类型');
-- 创建管理员用户(密码需要在前端加密后存储)
-- 默认密码: admin123 (需要在前端使用bcrypt加密)
INSERT IGNORE INTO users (username, password, real_name, email, phone, role_id, status) VALUES
('admin', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '系统管理员', 'admin@insurance.com', '13800138000', 1, 'active');
COMMIT;

View File

@@ -0,0 +1,34 @@
-- 更新默认角色权限
UPDATE roles SET
description = 'Admin',
permissions = '["user:read","user:create","user:update","user:delete","insurance:read","insurance:create","insurance:update","insurance:delete","insurance:review","policy:read","policy:create","policy:update","policy:delete","claim:read","claim:create","claim:update","claim:review","system:read","system:update","system:admin"]'
WHERE name = 'admin';
-- 插入其他角色(如果不存在)
INSERT IGNORE INTO roles (name, description, permissions, status) VALUES
('agent', 'Agent', '["insurance:read","insurance:create","policy:read","policy:create","claim:read","claim:create"]', 'active'),
('customer', 'Customer', '["insurance:read","policy:read","claim:read","claim:create"]', 'active');
-- 插入默认保险类型
INSERT INTO insurance_types (name, description, coverage_amount_min, coverage_amount_max, premium_rate, status) VALUES
('人寿保险', '提供生命保障的保险产品', 10000.00, 1000000.00, 0.0025, 'active'),
('健康保险', '提供医疗保障的保险产品', 5000.00, 500000.00, 0.0030, 'active'),
('意外伤害保险', '提供意外伤害保障的保险产品', 1000.00, 200000.00, 0.0015, 'active'),
('财产保险', '提供财产保障的保险产品', 5000.00, 1000000.00, 0.0020, 'active'),
('车险', '提供车辆保障的保险产品', 1000.00, 500000.00, 0.0040, 'active');
-- 插入默认系统配置
INSERT INTO system_configs (config_key, config_value, description) VALUES
('system_name', '"保险端口系统"', '系统名称'),
('company_name', '"XX保险公司"', '公司名称'),
('contact_email', '"support@insurance.com"', '联系邮箱'),
('contact_phone', '"400-123-4567"', '联系电话'),
('max_file_size', '10485760', '最大文件上传大小(字节)'),
('allowed_file_types', '["jpg", "jpeg", "png", "pdf", "doc", "docx"]', '允许上传的文件类型');
-- 创建管理员用户(密码需要在前端加密后存储)
-- 默认密码: admin123 (需要在前端使用bcrypt加密)
INSERT INTO users (username, password, real_name, email, phone, role_id, status) VALUES
('admin', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '系统管理员', 'admin@insurance.com', '13800138000', 1, 'active');
COMMIT;

View File

@@ -0,0 +1,81 @@
const { sequelize } = require('../config/database');
const { User, Role, InsuranceApplication, InsuranceType, Policy, Claim } = require('../models');
async function migrate() {
try {
console.log('🔄 开始数据库迁移...');
// 测试数据库连接
console.log('🔗 测试数据库连接...');
await sequelize.authenticate();
console.log('✅ 数据库连接成功');
// 同步所有模型到数据库(安全模式)
console.log('🗄️ 同步数据库表结构...');
await sequelize.sync({ force: false, alter: false });
console.log('✅ 数据库表结构同步完成');
// 创建默认角色
console.log('👥 创建默认角色...');
const roles = await Role.bulkCreate([
{ name: 'admin', description: '系统管理员', permissions: JSON.stringify(['*']) },
{ name: 'agent', description: '保险代理人', permissions: JSON.stringify(['insurance:read', 'insurance:create', 'policy:read']) },
{ name: 'customer', description: '客户', permissions: JSON.stringify(['insurance:create', 'policy:read:self', 'claim:create:self']) },
{ name: 'reviewer', description: '审核员', permissions: JSON.stringify(['insurance:review', 'claim:review']) }
], { ignoreDuplicates: true });
console.log('✅ 默认角色创建完成');
// 创建默认保险类型
console.log('📋 创建默认保险类型...');
const insuranceTypes = await InsuranceType.bulkCreate([
{
name: '人寿保险',
description: '提供生命保障的保险产品',
coverage_amount_min: 10000,
coverage_amount_max: 1000000,
premium_rate: 0.0025,
status: 'active'
},
{
name: '健康保险',
description: '提供医疗保障的保险产品',
coverage_amount_min: 5000,
coverage_amount_max: 500000,
premium_rate: 0.003,
status: 'active'
},
{
name: '财产保险',
description: '提供财产保障的保险产品',
coverage_amount_min: 1000,
coverage_amount_max: 2000000,
premium_rate: 0.0015,
status: 'active'
},
{
name: '车险',
description: '提供车辆保障的保险产品',
coverage_amount_min: 500,
coverage_amount_max: 1000000,
premium_rate: 0.002,
status: 'active'
}
], { ignoreDuplicates: true });
console.log('✅ 默认保险类型创建完成');
console.log('🎉 数据库迁移完成!');
} catch (error) {
console.error('❌ 数据库迁移失败:', error);
process.exit(1);
} finally {
await sequelize.close();
}
}
// 如果是直接运行此脚本
if (require.main === module) {
migrate();
}
module.exports = migrate;

View File

@@ -0,0 +1,215 @@
-- 保险端口系统数据库表结构(仅表结构)- 添加insurance_前缀避免冲突
-- 创建时间: 2025-01-01
-- 数据库: MySQL 8.0+
-- 使用现有数据库
USE nxxmdata;
-- 1. 保险角色表添加insurance_前缀避免与现有roles表冲突
CREATE TABLE IF NOT EXISTS insurance_roles (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '角色ID',
name VARCHAR(50) NOT NULL UNIQUE COMMENT '角色名称',
description VARCHAR(255) NULL COMMENT '角色描述',
permissions JSON NOT NULL COMMENT '权限配置',
status ENUM('active', 'inactive') NOT NULL DEFAULT 'active' COMMENT '状态',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_roles_name (name),
INDEX idx_roles_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- 2. 保险用户表添加insurance_前缀避免与现有users表冲突
CREATE TABLE IF NOT EXISTS insurance_users (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户ID',
username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
password VARCHAR(255) NOT NULL COMMENT '密码',
real_name VARCHAR(50) NOT NULL COMMENT '真实姓名',
email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
phone VARCHAR(20) NOT NULL COMMENT '手机号',
role_id INT NOT NULL COMMENT '角色ID',
status ENUM('active', 'inactive', 'suspended') NOT NULL DEFAULT 'active' COMMENT '状态',
last_login TIMESTAMP NULL COMMENT '最后登录时间',
avatar VARCHAR(255) NULL COMMENT '头像URL',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_users_username (username),
INDEX idx_users_email (email),
INDEX idx_users_phone (phone),
INDEX idx_users_role_id (role_id),
INDEX idx_users_status (status),
FOREIGN KEY (role_id) REFERENCES insurance_roles(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险用户表';
-- 3. 保险类型表
CREATE TABLE IF NOT EXISTS insurance_types (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '保险类型ID',
name VARCHAR(100) NOT NULL UNIQUE COMMENT '保险类型名称',
description TEXT NULL COMMENT '保险类型描述',
coverage_amount_min DECIMAL(15,2) NOT NULL DEFAULT 0.00 COMMENT '最低保额',
coverage_amount_max DECIMAL(15,2) NOT NULL DEFAULT 1000000.00 COMMENT '最高保额',
premium_rate DECIMAL(5,4) NOT NULL DEFAULT 0.001 COMMENT '保险费率',
status ENUM('active', 'inactive') NOT NULL DEFAULT 'active' COMMENT '状态',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_insurance_type_name (name),
INDEX idx_insurance_type_status (status),
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险类型表';
-- 4. 保险申请表
CREATE TABLE IF NOT EXISTS insurance_applications (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '申请ID',
application_no VARCHAR(50) NOT NULL UNIQUE COMMENT '申请编号',
customer_name VARCHAR(100) NOT NULL COMMENT '客户姓名',
customer_id_card VARCHAR(18) NOT NULL COMMENT '客户身份证号',
customer_phone VARCHAR(20) NOT NULL COMMENT '客户手机号',
customer_address VARCHAR(255) NOT NULL COMMENT '客户地址',
insurance_type_id INT NOT NULL COMMENT '保险类型ID',
application_amount DECIMAL(15,2) NOT NULL COMMENT '申请金额',
status ENUM('pending', 'approved', 'rejected', 'under_review') NOT NULL DEFAULT 'pending' COMMENT '状态',
application_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '申请日期',
review_notes TEXT NULL COMMENT '审核备注',
reviewer_id INT NULL COMMENT '审核人ID',
review_date TIMESTAMP NULL COMMENT '审核日期',
documents JSON NULL COMMENT '申请文档',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_applications_application_no (application_no),
INDEX idx_applications_customer_id_card (customer_id_card),
INDEX idx_applications_customer_phone (customer_phone),
INDEX idx_applications_status (status),
INDEX idx_applications_application_date (application_date),
INDEX idx_applications_insurance_type_id (insurance_type_id),
INDEX idx_applications_reviewer_id (reviewer_id),
FOREIGN KEY (insurance_type_id) REFERENCES insurance_types(id) ON DELETE RESTRICT,
FOREIGN KEY (reviewer_id) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险申请表';
-- 5. 保单表
CREATE TABLE IF NOT EXISTS insurance_policies (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '保单ID',
policy_no VARCHAR(50) NOT NULL UNIQUE COMMENT '保单编号',
application_id INT NOT NULL COMMENT '关联的保险申请ID',
insurance_type_id INT NOT NULL COMMENT '保险类型ID',
customer_id INT NOT NULL COMMENT '客户ID',
coverage_amount DECIMAL(15,2) NOT NULL COMMENT '保额',
premium_amount DECIMAL(15,2) NOT NULL COMMENT '保费金额',
start_date DATE NOT NULL COMMENT '保险开始日期',
end_date DATE NOT NULL COMMENT '保险结束日期',
policy_status ENUM('active', 'expired', 'cancelled', 'suspended') NOT NULL DEFAULT 'active' COMMENT '保单状态',
payment_status ENUM('paid', 'unpaid', 'partial') NOT NULL DEFAULT 'unpaid' COMMENT '支付状态',
payment_date DATE NULL COMMENT '支付日期',
policy_document_url VARCHAR(500) NULL COMMENT '保单文件URL',
terms_and_conditions TEXT NULL COMMENT '条款和条件',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE INDEX idx_policy_no (policy_no),
INDEX idx_policy_customer (customer_id),
INDEX idx_policy_application (application_id),
INDEX idx_policy_status (policy_status),
INDEX idx_policy_payment_status (payment_status),
INDEX idx_policy_dates (start_date, end_date),
FOREIGN KEY (application_id) REFERENCES insurance_applications(id) ON DELETE RESTRICT,
FOREIGN KEY (insurance_type_id) REFERENCES insurance_types(id) ON DELETE RESTRICT,
FOREIGN KEY (customer_id) REFERENCES insurance_users(id) ON DELETE RESTRICT,
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保单表';
-- 6. 理赔表
CREATE TABLE IF NOT EXISTS insurance_claims (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '理赔ID',
claim_no VARCHAR(50) NOT NULL UNIQUE COMMENT '理赔编号',
policy_id INT NOT NULL COMMENT '关联的保单ID',
customer_id INT NOT NULL COMMENT '客户ID',
claim_amount DECIMAL(15,2) NOT NULL COMMENT '理赔金额',
claim_date DATE NOT NULL COMMENT '理赔发生日期',
incident_description TEXT NOT NULL COMMENT '事故描述',
claim_status ENUM('pending', 'approved', 'rejected', 'processing', 'paid') NOT NULL DEFAULT 'pending' COMMENT '理赔状态',
review_notes TEXT NULL COMMENT '审核备注',
reviewer_id INT NULL COMMENT '审核人ID',
review_date DATE NULL COMMENT '审核日期',
payment_date DATE NULL COMMENT '支付日期',
supporting_documents JSON NULL COMMENT '支持文件',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE INDEX idx_claim_no (claim_no),
INDEX idx_claim_policy (policy_id),
INDEX idx_claim_customer (customer_id),
INDEX idx_claim_status (claim_status),
INDEX idx_claim_date (claim_date),
FOREIGN KEY (policy_id) REFERENCES insurance_policies(id) ON DELETE RESTRICT,
FOREIGN KEY (customer_id) REFERENCES insurance_users(id) ON DELETE RESTRICT,
FOREIGN KEY (reviewer_id) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='理赔表';
-- 7. 保险系统配置表添加insurance_前缀避免与现有system_configs表冲突
CREATE TABLE IF NOT EXISTS insurance_system_configs (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '配置ID',
config_key VARCHAR(100) NOT NULL UNIQUE COMMENT '配置键',
config_value JSON NOT NULL COMMENT '配置值',
description VARCHAR(255) NULL COMMENT '配置描述',
created_by INT NULL COMMENT '创建人ID',
updated_by INT NULL COMMENT '更新人ID',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_system_config_key (config_key),
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险系统配置表';
-- 8. 保险系统日志表
CREATE TABLE IF NOT EXISTS insurance_system_logs (
id INT AUTO_INCREMENT PRIMARY KEY COMMENT '日志ID',
level ENUM('info', 'warning', 'error', 'debug') NOT NULL DEFAULT 'info' COMMENT '日志级别',
message TEXT NOT NULL COMMENT '日志消息',
module VARCHAR(100) NOT NULL COMMENT '模块名称',
user_id INT NULL COMMENT '用户ID',
ip_address VARCHAR(45) NULL COMMENT 'IP地址',
user_agent TEXT NULL COMMENT '用户代理',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
INDEX idx_system_logs_level (level),
INDEX idx_system_logs_module (module),
INDEX idx_system_logs_user_id (user_id),
INDEX idx_system_logs_created_at (created_at),
FOREIGN KEY (user_id) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='保险系统日志表';
COMMIT;
-- 显示表结构信息
SHOW TABLES LIKE 'insurance_%';
-- 显示各保险相关表注释
SELECT
TABLE_NAME,
TABLE_COMMENT
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_SCHEMA = 'nxxmdata'
AND TABLE_NAME LIKE 'insurance_%';

View File

@@ -0,0 +1,202 @@
-- Insurance System Database Schema with insurance_ prefix
-- Created: 2025-01-01
-- Database: MySQL 5.7+
USE nxxmdata;
-- 1. Insurance roles table
CREATE TABLE IF NOT EXISTS insurance_roles (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE,
description VARCHAR(255) NULL,
permissions JSON NOT NULL,
status ENUM('active', 'inactive') NOT NULL DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_roles_name (name),
INDEX idx_roles_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 2. Insurance users table
CREATE TABLE IF NOT EXISTS insurance_users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
real_name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
phone VARCHAR(20) NOT NULL,
role_id INT NOT NULL,
status ENUM('active', 'inactive', 'suspended') NOT NULL DEFAULT 'active',
last_login TIMESTAMP NULL,
avatar VARCHAR(255) NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_users_username (username),
INDEX idx_users_email (email),
INDEX idx_users_phone (phone),
INDEX idx_users_role_id (role_id),
INDEX idx_users_status (status),
FOREIGN KEY (role_id) REFERENCES insurance_roles(id) ON DELETE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 3. Insurance types table
CREATE TABLE IF NOT EXISTS insurance_types (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE,
description TEXT NULL,
coverage_amount_min DECIMAL(15,2) NOT NULL DEFAULT 0.00,
coverage_amount_max DECIMAL(15,2) NOT NULL DEFAULT 1000000.00,
premium_rate DECIMAL(5,4) NOT NULL DEFAULT 0.001,
status ENUM('active', 'inactive') NOT NULL DEFAULT 'active',
created_by INT NULL,
updated_by INT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_insurance_type_name (name),
INDEX idx_insurance_type_status (status),
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 4. Insurance applications table
CREATE TABLE IF NOT EXISTS insurance_applications (
id INT AUTO_INCREMENT PRIMARY KEY,
application_no VARCHAR(50) NOT NULL UNIQUE,
customer_name VARCHAR(100) NOT NULL,
customer_id_card VARCHAR(18) NOT NULL,
customer_phone VARCHAR(20) NOT NULL,
customer_address VARCHAR(255) NOT NULL,
insurance_type_id INT NOT NULL,
application_amount DECIMAL(15,2) NOT NULL,
status ENUM('pending', 'approved', 'rejected', 'under_review') NOT NULL DEFAULT 'pending',
application_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
review_notes TEXT NULL,
reviewer_id INT NULL,
review_date TIMESTAMP NULL,
documents JSON NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_applications_application_no (application_no),
INDEX idx_applications_customer_id_card (customer_id_card),
INDEX idx_applications_customer_phone (customer_phone),
INDEX idx_applications_status (status),
INDEX idx_applications_application_date (application_date),
INDEX idx_applications_insurance_type_id (insurance_type_id),
INDEX idx_applications_reviewer_id (reviewer_id),
FOREIGN KEY (insurance_type_id) REFERENCES insurance_types(id) ON DELETE RESTRICT,
FOREIGN KEY (reviewer_id) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 5. Insurance policies table
CREATE TABLE IF NOT EXISTS insurance_policies (
id INT AUTO_INCREMENT PRIMARY KEY,
policy_no VARCHAR(50) NOT NULL UNIQUE,
application_id INT NOT NULL,
insurance_type_id INT NOT NULL,
customer_id INT NOT NULL,
coverage_amount DECIMAL(15,2) NOT NULL,
premium_amount DECIMAL(15,2) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
policy_status ENUM('active', 'expired', 'cancelled', 'suspended') NOT NULL DEFAULT 'active',
payment_status ENUM('paid', 'unpaid', 'partial') NOT NULL DEFAULT 'unpaid',
payment_date DATE NULL,
policy_document_url VARCHAR(500) NULL,
terms_and_conditions TEXT NULL,
created_by INT NULL,
updated_by INT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE INDEX idx_policy_no (policy_no),
INDEX idx_policy_customer (customer_id),
INDEX idx_policy_application (application_id),
INDEX idx_policy_status (policy_status),
INDEX idx_policy_payment_status (payment_status),
INDEX idx_policy_dates (start_date, end_date),
FOREIGN KEY (application_id) REFERENCES insurance_applications(id) ON DELETE RESTRICT,
FOREIGN KEY (insurance_type_id) REFERENCES insurance_types(id) ON DELETE RESTRICT,
FOREIGN KEY (customer_id) REFERENCES insurance_users(id) ON DELETE RESTRICT,
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 6. Insurance claims table
CREATE TABLE IF NOT EXISTS insurance_claims (
id INT AUTO_INCREMENT PRIMARY KEY,
claim_no VARCHAR(50) NOT NULL UNIQUE,
policy_id INT NOT NULL,
customer_id INT NOT NULL,
claim_amount DECIMAL(15,2) NOT NULL,
claim_date DATE NOT NULL,
incident_description TEXT NOT NULL,
claim_status ENUM('pending', 'approved', 'rejected', 'processing', 'paid') NOT NULL DEFAULT 'pending',
review_notes TEXT NULL,
reviewer_id INT NULL,
review_date DATE NULL,
payment_date DATE NULL,
supporting_documents JSON NULL,
created_by INT NULL,
updated_by INT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE INDEX idx_claim_no (claim_no),
INDEX idx_claim_policy (policy_id),
INDEX idx_claim_customer (customer_id),
INDEX idx_claim_status (claim_status),
INDEX idx_claim_date (claim_date),
FOREIGN KEY (policy_id) REFERENCES insurance_policies(id) ON DELETE RESTRICT,
FOREIGN KEY (customer_id) REFERENCES insurance_users(id) ON DELETE RESTRICT,
FOREIGN KEY (reviewer_id) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 7. Insurance system configs table
CREATE TABLE IF NOT EXISTS insurance_system_configs (
id INT AUTO_INCREMENT PRIMARY KEY,
config_key VARCHAR(100) NOT NULL UNIQUE,
config_value JSON NOT NULL,
description VARCHAR(255) NULL,
created_by INT NULL,
updated_by INT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_system_config_key (config_key),
FOREIGN KEY (created_by) REFERENCES insurance_users(id) ON DELETE SET NULL,
FOREIGN KEY (updated_by) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- 8. Insurance system logs table
CREATE TABLE IF NOT EXISTS insurance_system_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
level ENUM('info', 'warning', 'error', 'debug') NOT NULL DEFAULT 'info',
message TEXT NOT NULL,
module VARCHAR(100) NOT NULL,
user_id INT NULL,
ip_address VARCHAR(45) NULL,
user_agent TEXT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_system_logs_level (level),
INDEX idx_system_logs_module (module),
INDEX idx_system_logs_user_id (user_id),
INDEX idx_system_logs_created_at (created_at),
FOREIGN KEY (user_id) REFERENCES insurance_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
-- Show all insurance tables
SHOW TABLES LIKE 'insurance_%';

View File

@@ -0,0 +1,147 @@
-- 保险端口系统测试数据脚本
-- 创建时间: 2025-01-01
-- 数据库: MySQL 8.0+
-- 使用现有数据库
USE nxxmdata;
-- 1. 插入更多角色数据
INSERT INTO roles (name, description, permissions, status) VALUES
('super_admin', '超级管理员', '["user:read","user:create","user:update","user:delete","insurance:read","insurance:create","insurance:update","insurance:delete","insurance:review","policy:read","policy:create","policy:update","policy:delete","claim:read","claim:create","claim:update","claim:review","system:read","system:update","system:admin"]', 1),
('finance', '财务人员', '["policy:read","claim:read","claim:review","claim:update"]', 1),
('auditor', '审计人员', '["insurance:read","policy:read","claim:read","system:read"]', 1);
-- 2. 插入更多用户数据密码都是123456的bcrypt加密
INSERT INTO users (username, password, real_name, email, phone, role_id, status, avatar) VALUES
('agent1', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '张三', 'zhangsan@insurance.com', '13800138001', 2, 'active', '/avatars/agent1.jpg'),
('agent2', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '李四', 'lisi@insurance.com', '13800138002', 2, 'active', '/avatars/agent2.jpg'),
('finance1', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '王五', 'wangwu@insurance.com', '13800138003', 4, 'active', '/avatars/finance1.jpg'),
('auditor1', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '赵六', 'zhaoliu@insurance.com', '13800138004', 5, 'active', '/avatars/auditor1.jpg'),
('customer1', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '陈小明', 'chenxiaoming@example.com', '13800138005', 3, 'active', '/avatars/customer1.jpg'),
('customer2', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '李小华', 'lixiaohua@example.com', '13800138006', 3, 'active', '/avatars/customer2.jpg'),
('customer3', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '王小红', 'wangxiaohong@example.com', '13800138007', 3, 'active', '/avatars/customer3.jpg'),
('customer4', '$2b$12$r6KcJ3V9q8wY7hLmNpQZ0uBf3dG7hJ2kL9mNpQr3tY6zX8vB1cF4', '刘小刚', 'liuxiaogang@example.com', '13800138008', 3, 'active', '/avatars/customer4.jpg');
-- 3. 插入更多保险类型数据
INSERT INTO insurance_types (name, description, coverage_amount_min, coverage_amount_max, premium_rate, status, created_by, updated_by) VALUES
('重疾保险', '提供重大疾病保障的保险产品', 50000.00, 500000.00, 0.0035, 'active', 1, 1),
('养老保险', '提供养老保障的保险产品', 10000.00, 300000.00, 0.0028, 'active', 1, 1),
('教育保险', '提供教育金保障的保险产品', 20000.00, 200000.00, 0.0022, 'active', 1, 1),
('旅游保险', '提供旅游期间保障的保险产品', 1000.00, 50000.00, 0.0050, 'active', 1, 1),
('家庭财产保险', '提供家庭财产保障的保险产品', 10000.00, 1000000.00, 0.0018, 'active', 1, 1);
-- 4. 插入保险申请数据
INSERT INTO insurance_applications (application_no, customer_name, customer_id_card, customer_phone, customer_address, insurance_type_id, application_amount, status, application_date, review_notes, reviewer_id, review_date, documents) VALUES
('APP2024010001', '陈小明', '110101199001011234', '13800138005', '北京市朝阳区建国路100号', 1, 500000.00, 'approved', '2024-01-15 09:30:00', '资料齐全,符合要求', 1, '2024-01-16 14:20:00', '["身份证复印件", "健康证明", "收入证明"]'),
('APP2024010002', '李小华', '110101199002022345', '13800138006', '上海市浦东新区陆家嘴金融中心', 2, 200000.00, 'approved', '2024-01-16 10:15:00', '客户健康状况良好', 1, '2024-01-17 11:30:00', '["身份证复印件", "体检报告"]'),
('APP2024010003', '王小红', '110101199003033456', '13800138007', '广州市天河区体育西路', 3, 100000.00, 'rejected', '2024-01-17 14:45:00', '高风险职业,不符合投保要求', 1, '2024-01-18 16:00:00', '["身份证复印件", "职业证明"]'),
('APP2024010004', '刘小刚', '110101199004044567', '13800138008', '深圳市南山区科技园', 4, 300000.00, 'pending', '2024-01-18 16:20:00', NULL, NULL, NULL, '["身份证复印件", "财产证明"]'),
('APP2024020001', '张大山', '110101198501015678', '13800138009', '杭州市西湖区文三路', 5, 150000.00, 'under_review', '2024-02-10 11:30:00', '需要补充医疗检查报告', 1, '2024-02-11 09:00:00', '["身份证复印件", "初步体检报告"]'),
('APP2024020002', '李小花', '110101198602026789', '13800138010', '南京市鼓楼区中山路', 6, 80000.00, 'approved', '2024-02-12 14:20:00', '资料完整,审批通过', 2, '2024-02-13 15:30:00', '["身份证复印件", "收入证明"]'),
('APP2024020003', '王大河', '110101198703037890', '13800138011', '武汉市江汉区解放大道', 7, 250000.00, 'approved', '2024-02-14 09:45:00', '优质客户,快速审批', 2, '2024-02-14 16:00:00', '["身份证复印件", "资产证明"]'),
('APP2024030001', '刘小海', '110101198804048901', '13800138012', '成都市锦江区春熙路', 8, 120000.00, 'pending', '2024-03-01 13:15:00', NULL, NULL, NULL, '["身份证复印件"]'),
('APP2024030002', '陈小云', '110101198905059012', '13800138013', '重庆市渝中区解放碑', 1, 400000.00, 'under_review', '2024-03-02 15:30:00', '需要核实收入情况', 1, '2024-03-03 10:00:00', '["身份证复印件", "银行流水"]'),
('APP2024030003', '李小山', '110101199006069123', '13800138014', '西安市雁塔区小寨', 2, 180000.00, 'approved', '2024-03-03 11:45:00', '审批通过,等待签约', 2, '2024-03-04 14:20:00', '["身份证复印件", "健康证明"]');
-- 5. 插入保单数据
INSERT INTO policies (policy_no, application_id, insurance_type_id, customer_id, coverage_amount, premium_amount, start_date, end_date, policy_status, payment_status, payment_date, policy_document_url, terms_and_conditions, created_by, updated_by) VALUES
('POL2024010001', 1, 1, 5, 500000.00, 1250.00, '2024-01-17', '2034-01-16', 'active', 'paid', '2024-01-17', '/policies/POL2024010001.pdf', '保险期限10年包含重大疾病保障', 1, 1),
('POL2024010002', 2, 2, 6, 200000.00, 600.00, '2024-01-18', '2029-01-17', 'active', 'paid', '2024-01-18', '/policies/POL2024010002.pdf', '保险期限5年健康医疗保障', 1, 1),
('POL2024020001', 6, 6, 7, 80000.00, 176.00, '2024-02-14', '2029-02-13', 'active', 'paid', '2024-02-14', '/policies/POL2024020001.pdf', '保险期限5年教育金保障', 2, 2),
('POL2024020002', 7, 7, 8, 250000.00, 1000.00, '2024-02-15', '2025-02-14', 'active', 'paid', '2024-02-15', '/policies/POL2024020002.pdf', '保险期限1年旅游意外保障', 2, 2),
('POL2024030001', 10, 2, 9, 180000.00, 504.00, '2024-03-05', '2029-03-04', 'active', 'unpaid', NULL, '/policies/POL2024030001.pdf', '保险期限5年健康医疗保障', 2, 2),
('POL2024030002', 3, 3, 10, 100000.00, 150.00, '2024-03-06', '2025-03-05', 'active', 'paid', '2024-03-06', '/policies/POL2024030002.pdf', '保险期限1年意外伤害保障', 1, 1),
('POL2024030003', 4, 4, 11, 300000.00, 600.00, '2024-03-07', '2029-03-06', 'active', 'partial', '2024-03-07', '/policies/POL2024030003.pdf', '保险期限5年财产保障', 1, 1),
('POL2024030004', 5, 5, 12, 150000.00, 525.00, '2024-03-08', '2025-03-07', 'active', 'paid', '2024-03-08', '/policies/POL2024030004.pdf', '保险期限1年车险保障', 2, 2);
-- 6. 插入理赔数据
INSERT INTO claims (claim_no, policy_id, customer_id, claim_amount, claim_date, incident_description, claim_status, review_notes, reviewer_id, review_date, payment_date, supporting_documents, created_by, updated_by) VALUES
('CLM2024020001', 3, 7, 50000.00, '2024-02-20', '被保险人因意外事故导致医疗费用支出', 'paid', '医疗费用单据齐全,符合理赔条件', 4, '2024-02-21', '2024-02-22', '["医疗费用发票", "诊断证明", "事故报告"]', 7, 4),
('CLM2024030001', 1, 5, 200000.00, '2024-03-10', '被保险人确诊重大疾病,需要手术治疗', 'processing', '医疗诊断明确,正在核实医疗费用', 4, '2024-03-11', NULL, '["诊断证明", "医疗费用预估"]', 5, 4),
('CLM2024030002', 2, 6, 8000.00, '2024-03-15', '门诊医疗费用报销', 'approved', '门诊费用符合保险条款', 4, '2024-03-16', '2024-03-17', '["门诊发票", "处方单"]', 6, 4),
('CLM2024030003', 4, 8, 15000.00, '2024-03-20', '旅行期间行李丢失赔偿', 'pending', '等待警方报案证明', NULL, NULL, NULL, '["行李清单", "酒店证明"]', 8, NULL),
('CLM2024030004', 6, 10, 30000.00, '2024-03-25', '意外伤害导致伤残赔偿', 'rejected', '伤残等级不符合理赔标准', 4, '2024-03-26', NULL, '["伤残鉴定报告", "医疗记录"]', 10, 4),
('CLM2024040001', 5, 9, 5000.00, '2024-04-01', '疾病门诊医疗费用', 'paid', '门诊医疗费用合理', 4, '2024-04-02', '2024-04-03', '["门诊发票", "诊断证明"]', 9, 4),
('CLM2024040002', 7, 11, 80000.00, '2024-04-05', '家庭财产火灾损失赔偿', 'processing', '正在评估财产损失价值', 4, '2024-04-06', NULL, '["火灾报告", "财产清单"]', 11, 4),
('CLM2024040003', 8, 12, 20000.00, '2024-04-10', '车辆事故维修费用', 'approved', '车辆维修费用合理', 4, '2024-04-11', '2024-04-12', '["事故报告", "维修报价单"]', 12, 4);
-- 7. 插入更多系统配置数据
INSERT INTO system_configs (config_key, config_value, description, created_by, updated_by) VALUES
('auto_approval_threshold', '100000', '自动审批金额阈值', 1, 1),
('max_application_per_day', '10', '每日最大申请数量', 1, 1),
('claim_processing_days', '7', '理赔处理最大天数', 1, 1),
('premium_due_reminder_days', '15', '保费到期提醒天数', 1, 1),
('policy_renewal_notice_days', '30', '保单续保通知天数', 1, 1),
('default_currency', '"CNY"', '默认货币', 1, 1),
('tax_rate', '0.06', '税率', 1, 1),
('interest_rate', '0.035', '默认利率', 1, 1);
-- 8. 插入系统日志数据
INSERT INTO system_logs (level, message, module, user_id, ip_address, user_agent, created_at) VALUES
('info', '用户登录成功', 'auth', 1, '192.168.1.100', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', '2024-01-15 09:00:00'),
('info', '创建新保险申请: APP2024010001', 'application', 1, '192.168.1.100', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', '2024-01-15 09:30:00'),
('info', '审批保险申请: APP2024010001', 'review', 1, '192.168.1.101', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', '2024-01-16 14:20:00'),
('info', '生成保单: POL2024010001', 'policy', 1, '192.168.1.101', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', '2024-01-17 10:15:00'),
('warning', '保险申请被拒绝: APP2024010003', 'review', 1, '192.168.1.102', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', '2024-01-18 16:00:00'),
('error', '数据库连接超时', 'system', NULL, '192.168.1.103', NULL, '2024-01-19 03:30:00'),
('info', '理赔申请提交: CLM2024020001', 'claim', 7, '192.168.1.104', 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15', '2024-02-20 15:45:00'),
('info', '理赔审核通过: CLM2024020001', 'claim', 4, '192.168.1.105', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', '2024-02-21 11:20:00'),
('info', '理赔支付完成: CLM2024020001', 'finance', 4, '192.168.1.106', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', '2024-02-22 09:30:00'),
('info', '用户注册成功: customer5', 'auth', 8, '192.168.1.107', 'Mozilla/5.0 (Android 10; Mobile; rv:91.0) Gecko/91.0 Firefox/91.0', '2024-03-01 14:15:00');
COMMIT;
-- 显示测试数据统计信息
SELECT
'用户数量' as category,
COUNT(*) as count
FROM
users
UNION ALL
SELECT
'保险申请数量',
COUNT(*)
FROM
insurance_applications
UNION ALL
SELECT
'保单数量',
COUNT(*)
FROM
policies
UNION ALL
SELECT
'理赔数量',
COUNT(*)
FROM
claims
UNION ALL
SELECT
'系统日志数量',
COUNT(*)
FROM
system_logs;
-- 显示各状态保险申请统计
SELECT
status,
COUNT(*) as count,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM insurance_applications), 2) as percentage
FROM
insurance_applications
GROUP BY
status
ORDER BY
count DESC;
-- 显示各状态理赔统计
SELECT
claim_status,
COUNT(*) as count,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM claims), 2) as percentage
FROM
claims
GROUP BY
claim_status
ORDER BY
count DESC;