05
全部数据表字段说明
37 张表 · 按业务域分组
D1
系统管理域
7 张表 · 用户/角色/菜单/字典/日志
sys_user— 系统用户表(鑫潼内部人员)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
username | VARCHAR(64) | UNIQUE | 登录用户名 |
password_hash | VARCHAR(256) | | 密码哈希值 |
real_name | VARCHAR(64) | | 真实姓名 |
phone | VARCHAR(20) | | 手机号 |
email | VARCHAR(128) | | 邮箱 |
status | SMALLINT | | 状态:1启用 0禁用 |
last_login_at | TIMESTAMPTZ | | 最后登录时间 |
created_at | TIMESTAMPTZ | | 创建时间 |
updated_at | TIMESTAMPTZ | | 更新时间 |
sys_role— 角色表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
role_code | VARCHAR(32) | UNIQUE | 角色编码 |
role_name | VARCHAR(64) | | 角色名称 |
description | TEXT | | 描述 |
sort_order | INT | | 排序号 |
created_at | TIMESTAMPTZ | | 创建时间 |
sys_user_role— 用户角色关联表
| 字段 | 类型 | 键 | 说明 |
user_id | BIGINT | PKFK | 用户 ID(→ sys_user) |
role_id | BIGINT | PKFK | 角色 ID(→ sys_role) |
sys_menu— 菜单表(RBAC 权限)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
parent_id | BIGINT | FK | 父菜单 ID(自关联) |
menu_name | VARCHAR(64) | | 菜单名称 |
menu_path | VARCHAR(256) | | 路由路径 |
component | VARCHAR(256) | | 前端组件路径 |
icon | VARCHAR(64) | | 图标 |
sort_order | INT | | 排序号 |
menu_type | SMALLINT | | 类型:1目录 2菜单 3按钮 |
permission | VARCHAR(128) | | 权限标识,如 customer:list |
visible | SMALLINT | | 是否可见:1是 0否 |
created_at | TIMESTAMPTZ | | 创建时间 |
sys_role_menu— 角色菜单关联表
| 字段 | 类型 | 键 | 说明 |
role_id | BIGINT | PKFK | 角色 ID(→ sys_role) |
menu_id | BIGINT | PKFK | 菜单 ID(→ sys_menu) |
sys_dict— 数据字典表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
dict_type | VARCHAR(64) | IDX | 字典类型 |
dict_label | VARCHAR(128) | | 字典标签 |
dict_value | VARCHAR(128) | | 字典值 |
sort_order | INT | | 排序号 |
status | SMALLINT | | 状态:1启用 0禁用 |
created_at | TIMESTAMPTZ | | 创建时间 |
sys_operation_log— 操作日志表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
user_id | BIGINT | IDX | 操作用户 ID |
module | VARCHAR(64) | | 操作模块 |
action | VARCHAR(64) | | 操作动作 |
method | VARCHAR(256) | | 请求方法 |
params | TEXT | | 请求参数 |
ip | VARCHAR(64) | | 操作 IP |
created_at | TIMESTAMPTZ | IDX | 操作时间 |
D2
客户域
7 张表 · 客户/部门/建筑/房间/设备/账号
customer— 客户信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
customer_name | VARCHAR(128) | IDX | 客户名称 |
province | VARCHAR(64) | | 省 |
city | VARCHAR(64) | | 市 |
district | VARCHAR(64) | | 区/县 |
address | VARCHAR(256) | | 地址 |
contact_person | VARCHAR(64) | | 联系人 |
contact_phone | VARCHAR(20) | | 电话 |
postal_code | VARCHAR(10) | | 邮编 |
fax | VARCHAR(20) | | 传真 |
customer_level | VARCHAR(32) | | 客户级别(学校/医院等) |
status | SMALLINT | | 状态:1意向 2签约 3运维中 4终止 |
created_at | TIMESTAMPTZ | | 创建时间 |
updated_at | TIMESTAMPTZ | | 更新时间 |
customer_department— 客户部门信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
customer_id | BIGINT | FK | 客户 ID(→ customer) |
dept_name | VARCHAR(128) | | 部门名称 |
contact_person | VARCHAR(64) | | 联系人 |
contact_phone | VARCHAR(20) | | 电话 |
function_desc | TEXT | | 职能 |
created_at | TIMESTAMPTZ | | 创建时间 |
customer_visit— 客户拜访信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
visit_no | VARCHAR(64) | UNIQUE | 拜访单号 |
customer_id | BIGINT | FK | 客户 ID |
visit_person | VARCHAR(64) | | 拜访人 |
visit_phone | VARCHAR(20) | | 拜访人电话 |
visit_content | TEXT | | 拜访内容 |
visit_time | DATE | | 拜访时间 |
salesman_id | BIGINT | IDX | 业务员 |
will_plan | SMALLINT | | 是否做方案:0不同意 1同意 |
created_at | TIMESTAMPTZ | | 创建时间 |
customer_building— 客户智电改造建筑信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
customer_id | BIGINT | FK | 客户 ID |
building_name | VARCHAR(128) | | 建筑名称 |
basic_info | TEXT | | 基本情况 |
purpose | VARCHAR(128) | | 用途 |
floor_count | INT | | 层数 |
created_at | TIMESTAMPTZ | | 创建时间 |
customer_room— 客户建筑房间信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
room_code | VARCHAR(64) | | 房间编码 |
customer_id | BIGINT | FK | 客户 ID |
room_name | VARCHAR(128) | | 房间名称 |
building_id | BIGINT | FK | 所属建筑 ID(→ customer_building) |
floor_no | VARCHAR(16) | | 所在楼层 |
room_purpose | VARCHAR(128) | | 房间用途 |
dept_id | BIGINT | FK | 房间所属客户部门(→ customer_department) |
created_at | TIMESTAMPTZ | | 创建时间 |
customer_equipment— 客户智电改造设备信息表(配电间/井/箱)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
equip_code | VARCHAR(64) | UNIQUE | 客户设备编码 |
customer_id | BIGINT | FK | 客户 ID |
equip_name | VARCHAR(128) | | 客户设备名称 |
equip_type | VARCHAR(32) | | 设备类型:配电间/配电井/配电箱 |
building_id | BIGINT | FK | 所属建筑 ID |
floor_no | VARCHAR(16) | | 所在楼层 |
location | VARCHAR(256) | | 所在位置 |
description | TEXT | | 设备描述 |
remark | TEXT | | 备注 |
photo_url | VARCHAR(512) | | 未改造前设备照片 |
created_at | TIMESTAMPTZ | | 创建时间 |
customer_account— 客户访问账号表(小程序登录)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
customer_id | BIGINT | FK | 客户 ID |
phone | VARCHAR(20) | UNIQUE | 登录电话 |
password_hash | VARCHAR(256) | | 密码哈希 |
wx_openid | VARCHAR(128) | | 微信 openid |
status | SMALLINT | | 状态:1启用 0禁用 |
last_login_at | TIMESTAMPTZ | | 最后登录时间 |
created_at | TIMESTAMPTZ | | 创建时间 |
D3
智电设备域
1 张表 · 产品目录
smart_device— 鑫潼智电设备信息表(产品目录)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
device_model | VARCHAR(64) | | 智电设备型号 |
device_name | VARCHAR(128) | | 智电设备名称 |
device_spec | VARCHAR(256) | | 智电设备规格 |
device_type | VARCHAR(32) | | 设备类型:网关/采集器/探测器等 |
device_function | TEXT | | 智电设备功能 |
supplier | VARCHAR(128) | | 供应商 |
created_at | TIMESTAMPTZ | | 创建时间 |
D4
项目方案与合同域
3 张表 · 方案/明细/合同
project_plan— 智电改造方案信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
plan_no | VARCHAR(64) | UNIQUE | 方案单号 |
customer_id | BIGINT | FK | 客户 ID |
registrar | VARCHAR(64) | | 方案登记人(业务员) |
register_time | DATE | | 方案登记时间 |
plan_desc | TEXT | | 方案说明 |
plan_file_url | VARCHAR(512) | | 方案最终文件 |
status | SMALLINT | | 状态:0草稿 1已确认 |
created_at | TIMESTAMPTZ | | 创建时间 |
project_plan_detail— 项目方案智电设备明细表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
plan_id | BIGINT | FK | 方案 ID(→ project_plan) |
customer_id | BIGINT | FK | 客户 ID |
equip_id | BIGINT | FK | 客户设备 ID(→ customer_equipment) |
smart_device_id | BIGINT | FK | 智电设备型号 ID(→ smart_device) |
quantity | NUMERIC(10,2) | | 数量 |
remark | TEXT | | 备注 |
created_at | TIMESTAMPTZ | | 创建时间 |
contract— 智电项目合同信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
contract_no | VARCHAR(64) | UNIQUE | 合同单号 |
xt_contract_no | VARCHAR(64) | IDX | 鑫潼合同号(XT+年份+序号) |
customer_id | BIGINT | FK | 客户 ID |
contract_amount | NUMERIC(14,2) | | 合同金额 |
pay_cycle | VARCHAR(32) | | 支付周期:按月/按年 |
salesman_id | BIGINT | | 业务员 |
sign_date | DATE | | 签订日期 |
contract_desc | TEXT | | 合同说明 |
start_date | DATE | | 开始日期 |
end_date | DATE | | 结束日期 |
plan_id | BIGINT | FK | 方案 ID(→ project_plan) |
contract_file_url | VARCHAR(512) | | 签字盖章电子合同 |
status | SMALLINT | | 状态:1有效 0终止 |
created_at | TIMESTAMPTZ | | 创建时间 |
D5
线路与设备关联域
2 张表 · ICC 同步 + 房间关联
electric_line— 智电改造线路表(ICC 同步)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
line_code | VARCHAR(64) | UNIQUE | 线路编码(唯一) |
equip_id | BIGINT | FK | 客户设备 ID(→ customer_equipment) |
icc_device_code | VARCHAR(128) | IDX | ICC 智电设备编号 |
line_name | VARCHAR(128) | | 线路名称(ICC 同步) |
customer_id | BIGINT | FK | 客户 ID(逻辑隔离键) |
building_id | BIGINT | FK | 所属建筑 ID |
floor_no | VARCHAR(16) | | 所在楼层 |
location | VARCHAR(256) | | 所在位置 |
status | SMALLINT | | 状态:1在线 0离线 |
synced_at | TIMESTAMPTZ | | ICC 同步时间 |
created_at | TIMESTAMPTZ | | 创建时间 |
line_room— 线路所属房间关联表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
line_id | BIGINT | FK | 线路 ID(→ electric_line) |
room_id | BIGINT | FK | 房间 ID(→ customer_room) |
customer_id | BIGINT | FK | 客户 ID |
created_at | TIMESTAMPTZ | | 创建时间 |
D6
派单域
4 张表 · 勘察/安装/验收/回访
survey_order— 客户勘察派单信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
survey_no | VARCHAR(64) | UNIQUE | 勘察单号 |
customer_id | BIGINT | FK | 客户 ID |
surveyor | VARCHAR(64) | | 勘察人(共享电工) |
worker_id | BIGINT | | 共享电工 ID |
survey_time | TIMESTAMPTZ | | 勘察时间 |
remark | TEXT | | 备注 |
status | SMALLINT | | 状态:0已派发 1已接单 2已完成 |
created_at | TIMESTAMPTZ | | 创建时间 |
install_order— 项目安装任务派单信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
install_no | VARCHAR(64) | UNIQUE | 安装单号 |
customer_id | BIGINT | FK | 客户 ID |
installer | VARCHAR(64) | | 安装人(共享电工) |
worker_id | BIGINT | | 共享电工 ID |
dispatch_date | DATE | | 派单日期 |
start_date | DATE | | 开始日期 |
end_date | DATE | | 结束日期 |
plan_id | BIGINT | FK | 方案 ID(→ project_plan) |
remark | TEXT | | 备注 |
status | SMALLINT | | 状态:0已派发 1已完成 |
created_at | TIMESTAMPTZ | | 创建时间 |
acceptance— 项目验收信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
accept_no | VARCHAR(64) | UNIQUE | 验收单号 |
customer_id | BIGINT | FK | 客户 ID |
acceptor | VARCHAR(64) | | 验收人 |
accept_opinion | TEXT | | 验收意见 |
accept_date | DATE | | 验收日期 |
installer | VARCHAR(64) | | 安装人 |
accept_file_url | VARCHAR(512) | | 验收文件电子版 |
contract_id | BIGINT | FK | 合同 ID(→ contract) |
created_at | TIMESTAMPTZ | | 创建时间 |
visit_record— 客户回访信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
visit_no | VARCHAR(64) | UNIQUE | 回访单号 |
customer_id | BIGINT | FK | 客户 ID |
contact_person | VARCHAR(64) | | 联系人 |
contact_phone | VARCHAR(20) | | 电话 |
visitor | VARCHAR(64) | | 回访人 |
visit_time | DATE | | 回访时间 |
customer_opinion | TEXT | | 客户意见 |
photos | JSONB | | 回访照片 |
created_at | TIMESTAMPTZ | | 创建时间 |
D7
报警域
4 张表 · 故障类型/设备报警/报警派单
fault_type— 报警故障类型信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
fault_type_code | VARCHAR(64) | UNIQUE | 故障类型编码 |
fault_type_name | VARCHAR(128) | | 故障类型名称 |
description | TEXT | | 故障类型说明 |
remark | TEXT | | 备注 |
created_at | TIMESTAMPTZ | | 创建时间 |
fault_type_detail— 报警故障类型明细表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
fault_type_id | BIGINT | FK | 故障类型 ID(→ fault_type) |
detail_category | VARCHAR(32) | | 明细分类:故障原因/处理流程 |
detail_desc | TEXT | | 明细说明 |
remark | TEXT | | 备注 |
created_at | TIMESTAMPTZ | | 创建时间 |
device_alarm— 设备报警信息表(ICC 拉取)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
alarm_code | VARCHAR(128) | UNIQUE | 报警编码 |
line_id | BIGINT | IDX | 线路 ID |
equip_id | BIGINT | | 客户设备 ID |
icc_device_code | VARCHAR(128) | | ICC 设备编号 |
line_name | VARCHAR(128) | | 线路名称 |
customer_id | BIGINT | IDX | 客户 ID |
building_id | BIGINT | | 所属建筑 ID |
floor_no | VARCHAR(16) | | 所在楼层 |
location | VARCHAR(256) | | 所在位置 |
alarm_date | DATE | IDX | 报警日期 |
fault_type | VARCHAR(128) | | ICC 预警类型 |
alarm_value | NUMERIC(14,2) | | 报警数值 |
history_count | INT | | 历史出现次数 |
synced_at | TIMESTAMPTZ | | ICC 同步时间 |
alarm_dispatch— 报警派单信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
dispatch_no | VARCHAR(64) | UNIQUE | 报警派单号 |
alarm_id | BIGINT | FK | 报警 ID(→ device_alarm) |
line_id | BIGINT | | 线路 ID |
equip_id | BIGINT | | 客户设备 ID |
icc_device_code | VARCHAR(128) | | ICC 设备编号 |
line_name | VARCHAR(128) | | 线路名称 |
customer_id | BIGINT | FK | 客户 ID |
contact_person | VARCHAR(64) | | 联系人 |
contact_phone | VARCHAR(20) | | 电话 |
building_id | BIGINT | | 建筑 ID |
floor_no | VARCHAR(16) | | 所在楼层 |
location | VARCHAR(256) | | 所在位置 |
fault_type_id | BIGINT | FK | 故障类型 ID(→ fault_type) |
fault_desc | TEXT | | 故障事项(类型+数值) |
dispatcher | VARCHAR(64) | | 派发人 |
fault_reason | TEXT | | 故障原因(来自明细) |
process_flow | TEXT | | 处理流程(来自明细) |
worker_id | BIGINT | IDX | 共享电工 ID |
status | SMALLINT | IDX | 状态:0已派发 1已处理 |
process_photos | JSONB | | 报警处理照片(多张) |
rating | SMALLINT | | 派单处理评分 |
created_at | TIMESTAMPTZ | | 创建时间 |
completed_at | TIMESTAMPTZ | | 完成时间 |
D8
报修域
2 张表 · 报修单/报修派单
repair_request— 报修单信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
repair_no | VARCHAR(64) | UNIQUE | 报修单号 |
customer_id | BIGINT | FK | 客户 ID |
requester | VARCHAR(64) | | 报修人 |
requester_phone | VARCHAR(20) | | 报修电话 |
request_time | TIMESTAMPTZ | | 报修时间 |
building_id | BIGINT | | 所属建筑 ID |
floor_no | VARCHAR(16) | | 所在楼层 |
location | VARCHAR(256) | | 所在位置 |
repair_content | TEXT | | 报修内容 |
photos | JSONB | | 报修照片 |
status | SMALLINT | IDX | 状态:0待处理 1已派单 2已完成 |
created_at | TIMESTAMPTZ | | 创建时间 |
repair_dispatch— 报修派单信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
dispatch_no | VARCHAR(64) | UNIQUE | 报修派单号 |
repair_id | BIGINT | FK | 报修单 ID(→ repair_request) |
customer_id | BIGINT | FK | 客户 ID |
requester | VARCHAR(64) | | 报修人 |
requester_phone | VARCHAR(20) | | 报修电话 |
request_time | TIMESTAMPTZ | | 报修时间 |
building_id | BIGINT | | 建筑 ID |
floor_no | VARCHAR(16) | | 所在楼层 |
location | VARCHAR(256) | | 所在位置 |
repair_content | TEXT | | 报修内容 |
dispatcher | VARCHAR(64) | | 派发人 |
worker_id | BIGINT | IDX | 共享电工 ID |
status | SMALLINT | | 状态:0已派发 1已处理 |
process_photos | JSONB | | 处理完成照片 |
rating | SMALLINT | | 报修派单处理评分(客户评) |
created_at | TIMESTAMPTZ | | 创建时间 |
completed_at | TIMESTAMPTZ | | 完成时间 |
D9
维保域
2 张表 · 维保单/维保明细
maintenance_order— 维保单信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
maintenance_no | VARCHAR(64) | UNIQUE | 维保单号(录入,不自动生成) |
customer_id | BIGINT | FK | 客户 ID |
maintainer | VARCHAR(64) | | 维保人(共享电工) |
worker_id | BIGINT | | 共享电工 ID |
maintenance_date | DATE | | 维保日期 |
remark | TEXT | | 备注 |
status | SMALLINT | | 状态:0已派发 1已完成 |
created_at | TIMESTAMPTZ | | 创建时间 |
maintenance_detail— 维保单明细表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
maintenance_id | BIGINT | FK | 维保单 ID(→ maintenance_order) |
equip_id | BIGINT | | 客户设备 ID |
customer_id | BIGINT | FK | 客户 ID |
equip_name | VARCHAR(128) | | 客户设备名称 |
equip_type | VARCHAR(32) | | 设备类型:配电间/井/箱 |
building_id | BIGINT | | 建筑 ID |
floor_no | VARCHAR(16) | | 所在楼层 |
location | VARCHAR(256) | | 所在位置 |
panel_condition | TEXT | | 配电间或电箱情况 |
circuit_condition | TEXT | | 回路情况 |
terminal_condition | TEXT | | 终端情况 |
maintenance_desc | TEXT | | 维保情况说明 |
photos | JSONB | | 维保现场照片(水印) |
created_at | TIMESTAMPTZ | | 创建时间 |
D10
共享电工域
4 张表 · 电工/价格/收入/明细
worker— 共享电工信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
worker_name | VARCHAR(64) | | 电工姓名 |
phone | VARCHAR(20) | IDX | 手机号 |
id_card | VARCHAR(18) | | 身份证号 |
status | SMALLINT | | 状态:1在岗 0离职 |
created_at | TIMESTAMPTZ | | 创建时间 |
updated_at | TIMESTAMPTZ | | 更新时间 |
dispatch_price— 共享电工派单价格信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
price_code | VARCHAR(64) | UNIQUE | 派单价格编码 |
dispatch_type | VARCHAR(32) | | 派单类型:勘察/安装/预警/维修/维保 |
price_type | VARCHAR(32) | | 价格类型:单价/总价提成 |
unit_price | NUMERIC(10,2) | | 服务单价 |
created_at | TIMESTAMPTZ | | 创建时间 |
worker_income— 共享电工派单收入信息表(月度汇总)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
income_code | VARCHAR(64) | UNIQUE | 派单收入编码 |
worker_id | BIGINT | FK | 共享电工 ID(→ worker) |
income_month | VARCHAR(7) | IDX | 收入月份(YYYY-MM) |
monthly_total | NUMERIC(14,2) | | 月度收入合计 |
rating_summary | NUMERIC(5,2) | | 评分综合统计 |
final_total | NUMERIC(14,2) | | 月度最终收入合计 |
created_at | TIMESTAMPTZ | | 创建时间 |
worker_income_detail— 共享电工派单收入明细信息表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
income_id | BIGINT | FK | 收入 ID(→ worker_income) |
worker_id | BIGINT | FK | 共享电工 ID |
income_month | VARCHAR(7) | | 收入月份 |
dispatch_type | VARCHAR(32) | | 派单类型 |
dispatch_no | VARCHAR(64) | | 各类型派单单号 |
income_amount | NUMERIC(10,2) | | 本单收入 |
rating_level | VARCHAR(16) | | 评价等级 |
final_income | NUMERIC(10,2) | | 本单最终收入合计 |
created_at | TIMESTAMPTZ | | 创建时间 |
D11
用电采集域(分区表)
1 张表 · 按月分区
electricity_data— 线路用电信息表(按月 RANGE 分区)
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增(复合主键含 collect_time) |
line_id | BIGINT | FKIDX | 线路 ID(→ electric_line) |
line_code | VARCHAR(64) | | 线路编码(冗余,加速查询) |
equip_id | BIGINT | | 客户设备 ID |
icc_device_code | VARCHAR(128) | | ICC 设备编号 |
line_name | VARCHAR(128) | | 线路名称 |
customer_id | BIGINT | IDX | 客户 ID(逻辑隔离键) |
electricity | NUMERIC(14,4) | | 用电量 |
collect_time | TIMESTAMPTZ | PKIDX | 采集时间(分区键) |
分区键:collect_time。主键为复合主键 (id, collect_time)。已预建分区:electricity_data_2026_08 ~ electricity_data_2026_12。组合索引:(customer_id, collect_time) 用于月报统计。
D12
辅助域
2 张表 · ICC 日志/文件记录
icc_sync_log— ICC 数据同步日志表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
sync_type | VARCHAR(32) | IDX | 同步类型:客户/设备/用电/报警 |
start_time | TIMESTAMPTZ | | 开始时间 |
end_time | TIMESTAMPTZ | | 结束时间 |
record_count | INT | | 同步记录数 |
status | SMALLINT | | 状态:1成功 0失败 |
error_message | TEXT | | 错误信息 |
created_at | TIMESTAMPTZ | IDX | 创建时间 |
file_record— 文件存储记录表
| 字段 | 类型 | 键 | 说明 |
id | BIGSERIAL | PK | 自增主键 |
file_name | VARCHAR(256) | | 文件名 |
file_url | VARCHAR(512) | | 文件 URL |
file_type | VARCHAR(32) | | 文件类型:取证/合同/验收/方案/月报 |
file_size | BIGINT | | 文件大小(字节) |
business_type | VARCHAR(64) | IDX | 关联业务类型 |
business_id | BIGINT | | 关联业务 ID |
uploaded_by | BIGINT | | 上传人 ID |
created_at | TIMESTAMPTZ | | 创建时间 |
08
自动分区管理
pg_cron 定时调度 · 数据库自治
设计背景
PostgreSQL 声明式分区不会自动创建子分区。若数据写入时对应月份的分区不存在,INSERT 会直接报错:no partition of relation found for row。因此需要一套自动化的分区管理机制,确保未来月份的分区始终提前就绪。
为什么不用触发器兜底?
PostgreSQL 分区表的 BEFORE INSERT 触发器在分区路由之后才执行——即数据库先判断数据该落入哪个子分区,如果子分区不存在直接报错,触发器根本没有机会执行。因此触发器无法在写入时动态创建分区,必须通过定时预创建 + 应用层调用来保证分区就绪。
管理函数一览
| 函数名 | 参数 | 返回 | 用途 |
ensure_electricity_partition |
p_date DATE |
VOID |
确保指定日期所在月的分区存在(不存在则创建)。应用层在写入数据前调用此函数兜底。 |
run_electricity_partition_maintenance |
p_premake INT(默认 3) |
TABLE(created_month, action) |
批量预创建当前月 + 未来 N 个月的分区。Midway.js cron 每月调用一次,返回各分区状态(CREATED / EXISTS)。 |
refresh_electricity_monthly |
无 |
VOID |
刷新月度汇总物化视图。自动处理首次初始化(非并发),后续刷新用 CONCURRENTLY 不阻塞查询。 |
分区生命周期
flowchart LR
subgraph P1 ["阶段一:预创建(pg_cron 自动执行)"]
A1["pg_cron 定时调度
每月25号 03:00"] --> A2["run_electricity_partition_maintenance(3)"]
A2 --> A3{"分区是否
已存在?"}
A3 --"不存在"--> A4["CREATE TABLE ... PARTITION OF"]
A3 --"已存在"--> A5["跳过"]
end
subgraph P2 ["阶段二:写入数据"]
B1["ICC 数据拉取
服务写入数据"] --> B2["ensure_electricity_partition
(collect_time)"]
B2 --> B3{"分区是否
已存在?"}
B3 --"不存在"--> B4["自动创建分区"]
B3 --"已存在"--> B5["直接写入"]
B4 --> B5
end
subgraph P3 ["阶段三:归档"]
C1["超过 24 个月的
分区"] --> C2["DETACH PARTITION
从父表分离"]
C2 --> C3["冷数据存档
或直接查询子表"]
C3 --> C4["如需分析
ATTACH 临时挂回"]
end
P1 --> P2
P2 --> P3
style A4 fill:#e8f1ff,stroke:#1d6fff
style A5 fill:#f0fdf4,stroke:#0d9488
style B4 fill:#e8f1ff,stroke:#1d6fff
style B5 fill:#f0fdf4,stroke:#0d9488
style C2 fill:#fef3e8,stroke:#e0852b
style C4 fill:#fef3e8,stroke:#e0852b
双重保障机制
| 保障层 | 触发源 | 调用函数 | 频率 | 角色 |
| 第一层:定时预创建 |
pg_cron(数据库自治) |
run_electricity_partition_maintenance(3) |
每月 25 号 03:00 |
主动保障 — 提前创建未来 3 个月分区 |
| 第一层:物化视图刷新 |
pg_cron(数据库自治) |
refresh_electricity_monthly() |
每月 1 号 02:00 |
月度汇总数据刷新 |
| 第二层:写入兜底 |
Midway.js(应用层) |
ensure_electricity_partition(collect_time) |
每次 ICC 拉取批次 |
被动兜底 — 万一分区不存在时写入前自动创建 |
pg_cron 定时任务配置
两个定时任务已在 db_init.sql 中通过 cron.schedule() 自动注册,数据库重启后任务仍然有效:
-- 每月25号凌晨3点:预创建未来3个月分区
SELECT cron.schedule('electricity_partition_maintenance', '0 3 25 * *', 'SELECT run_electricity_partition_maintenance(3)');
-- 每月1号凌晨2点:刷新物化视图
SELECT cron.schedule('electricity_monthly_refresh', '0 2 1 * *', 'SELECT refresh_electricity_monthly()');
Midway.js 应用层兜底示例
pg_cron 负责定时预创建,后端无需配置 @Cron。但 ICC 数据拉取服务在写入前仍建议调用 ensure_electricity_partition() 做兜底:
// ICC 数据写入前兜底(在 ICC 同步服务中)
async saveElectricityData(items: ElectricityData[]) {
for (const item of items) {
// 写入前确保分区存在(99.9%的情况下什么都不做直接返回)
await this.entityManager.query(
'SELECT ensure_electricity_partition($1)',
[item.collectTime]
);
}
// 批量写入
await this.electricityRepo.save(items);
}
月度汇总物化视图
物化视图 mv_electricity_monthly 按客户 + 线路 + 月份预聚合用电数据,用于历史数据分析和月报生成。每月初刷新一次,查询走预聚合数据,极快。
| 字段 | 类型 | 说明 |
customer_id | BIGINT | 客户 ID(逻辑隔离键) |
line_id | BIGINT | 线路 ID |
month | TEXT | 月份(YYYY-MM 格式) |
total_usage | NUMERIC | 月度总用电量 |
avg_usage | NUMERIC | 平均用电量 |
peak_usage | NUMERIC | 峰值用电量 |
min_usage | NUMERIC | 最低用电量 |
record_count | BIGINT | 采集记录数 |
first_collect | TIMESTAMPTZ | 最早采集时间 |
last_collect | TIMESTAMPTZ | 最晚采集时间 |
刷新策略
首次初始化:脚本执行时自动 REFRESH MATERIALIZED VIEW(非并发模式)。后续刷新:通过 refresh_electricity_monthly() 函数,使用 CONCURRENTLY 不阻塞查询,函数内部自动处理异常回退。
历史分区归档策略
| 分区年龄 | 操作 | 原因 |
| 0 ~ 12 个月 | 保持在父表上 | 热数据,查询频繁 |
| 12 ~ 24 个月 | 保持在父表上 | 温数据,偶尔查询 |
| 超过 24 个月 | DETACH PARTITION 分离 | 冷数据,减少父表子分区数量,加速分区裁剪 |
| 需要分析冷数据 | 直接查子表 或 ATTACH 临时挂回 | 按需分析,分析完再 DETACH |
| 确定不再需要 | DROP TABLE | 释放磁盘空间(需确认) |