---
title: "01_Database_Design"
author: "系统设计团队"
date: "2024年12月19日"
documentclass: article
geometry: margin=1in
fontsize: 11pt
mainfont: "PingFang SC"
CJKmainfont: "PingFang SC"
---
---
doc_id: TC-01-DB
doc_role: master_document
authority: primary
scope: 数据库设计
source_of_truth: true
last_reviewed: 2026-03-12
retrieval_priority: P0
---
# 福建水务营收系统数据库设计说明书
## 章节导航(精简)
- [前言](#sec-preface)
- [外部设计](#sec-external-design)
- [数据库设计说明](#sec-database-design-note)
- [表结构设计](#sec-table-design)
- [METER/INST 专题表边界](#sec-meter-inst-topic)
- [移动端表设计优化说明](#sec-mobile-table-optimization)
- [视图的设计](#sec-view-design)
- [索引设计与性能优化](#sec-index-performance)
- [安全保密设计](#sec-security-design)
| 文件状态: | 文档密级: | 公开 |
| :--- | :--- | :--- |
| 【 】草稿 | | |
| 【 】修改稿 | | |
| 【√】正式发布 | | |
| | **当前版本:** | **V1.6** |
| | **作者:** | **唐伟杰** |
| | **完成日期:** | **2025-08-01** |
## 版本历史
| **日期** | **版本号** | **作者** | **备注** |
| :--- | :--- | :--- | :--- |
| 2025-07-17 | V1.0 | 唐伟杰 | 初稿 |
| 2025-07-17 | V1.1 | 唐伟杰 | 根据用户要求,严格对齐SQL文件,确保所有表和字段的完整性。 |
| 2025-08-01 | V1.2 | 唐伟杰 | 1. 根据详细设计说明书调整目录结构,按6个子系统重新组织表结构。
2. 补充移动端表设计优化说明,明确移动端与Web端表复用策略。
3. 新增5个移动端特有表的详细设计,符合表设计优化原则。 |
| 2025-08-01 | V1.3 | 唐伟杰 | 数据库系统变更:将OpenGauss替换为达梦数据库 8.0+,作为主力国产数据库方案。 |
| 2025-08-01 | V1.4 | 唐伟杰 | 单点登录采用OAuth2.0协议:新增OAuth2.0相关数据表设计,包括客户端信息表、访问令牌表、刷新令牌表、授权码表。 |
| 2026-03-12 | V1.6 | 唐伟杰 | 补充旧系统历史台账迁移与只读查询口径,明确在线主模型承接范围、历史最小保留集与迁移验收对账基线。 |
# 前言
本文档详细描述了福建水务营收系统的数据库设计,包括总体架构、E-R图、数据表结构、字段定义和索引策略。旨在为开发和运维人员提供清晰的数据结构参考。
# 外部设计
- **数据库系统**: 主力采用国产数据库 **达梦数据库 8.0+**。系统设计上兼容 **MySQL 8.x** 或 **MariaDB 10.x**。
- **数据库工具**: 使用 Navicat, DBeaver, DataGrip 等主流数据库管理工具。
- **约定**:
- **表名**: 全部小写,单词间使用下划线 `_` 分隔。业务表以 `biz_` 开头,系统管理表以 `system_` 开头。
- **字段名**: 全部小写,单词间使用下划线 `_` 分隔(如 `user_id`),与当前数据库主文档及主表命名口径保持一致。
- **主键**: 统一命名为 `id`,类型为 `bigint`,自增。
- **通用字段**: 所有表必须包含 `id`, `creator`, `create_time`, `updater`, `update_time`, `deleted`, `tenant_id` 字段。
- **字符集**: 统一使用 `utf8mb4` 字符集。
# 数据库设计说明
数据库设计遵循第三范式(3NF),并采用基于`tenant_id`字段隔离的SaaS多租户架构。
# 表结构设计
## 数据表总体概览
> 说明:本次重点对齐 `SYS-002` 相关数据库口径。`SYS-002` 的核心表命名已统一收敛为 `biz_*` 与 `bk_*`,并已清理旧稿中分散的历史表模型。对于旧数据字典中仍未在 backend 识别到独立实体表的对象,本文以“业务对象/处理场景”描述,不强行拆分为真实表。
| 模块 | 表前缀 | 主要功能 | 当前口径 |
| :--- | :--- | :--- | :--- |
| 系统公共 | `system_` | 用户、角色、权限、部门、租户、字典、日志、OAuth2 等统一平台能力 | 保持现稿 |
| SYS-002 基础配置与价格体系 | `biz_community`, `biz_company_*`, `biz_meter_*`, `biz_price_*`, `biz_template_*` | 小区、水司账户、水表参数、价格体系、调价快照、优惠方案、模板关系等 | 已按真实表对齐 |
| SYS-002 客户主数据与账户关系 | `biz_cust*`, `biz_account` | 客户主档、联系人、客户组、水表绑定、开票信息、托收/代扣关系、编号规则等 | 已按真实表对齐 |
| SYS-002 抄表开账与账单 | `biz_meter`, `biz_meter_book`, `biz_meter_read`, `biz_reading_*`, `biz_charge*` | 抄表册本、抄表状态、读数留痕、开账主单与明细 | 已按真实表对齐 |
| SYS-002 收费票据与操作留痕 | `biz_collection`, `biz_withholding`, `biz_invoice*`, `biz_operat_log*` | 收费、托收/代扣、发票、操作留痕与审计支撑 | 已按真实表对齐 |
| SYS-002 业务办理与资料 | `biz_process*`, `biz_business_*`, `biz_content*` | 业务办理流程、流转、装表资料、附件与扩展数据 | 已按真实表对齐 |
| SYS-002 银行代收与结算 | `bk_*` | 渠道路由、交易回调、代扣签约、批次、对账、结算 | 已按真实表对齐 |
| SYS-003 手机抄表 APP | `mobile_*` | 移动作业缓存、登录日志、离线任务与现场上报 | 保持现稿 |
| METER/INST 专题表 | `biz_meter_*`、`installation_*`、历史 `water_meter_*` | 表务专题与报装签章专题扩展 | 已纳入专题边界(见 `METER/INST 专题表边界`) |
## 系统公共表 (system_*)
(基于 `sw_system_publcli.sql`)
点击展开/折叠系统表详情
### system_dept (部门表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 部门id |
| name | varchar(30) | Y | | 部门名称 |
| parent_id | int8 | N | 0 | 父部门id |
| sort | int4 | N | 0 | 显示顺序 |
| leader_user_id | int8 | Y | | 负责人 |
| phone | varchar(11) | Y | | 联系电话 |
| email | varchar(50) | Y | | 邮箱 |
| type | varchar(10) | Y | | 部门类型 |
| code | varchar(50) | Y | | 部门代码 |
| status | int2 | N | | 部门状态(0正常 1停用) |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
| longitude | numeric(10,7) | Y | | 经度 |
| latitude | numeric(10,7) | Y | | 纬度 |
| remark | varchar(500) | Y | | 备注 |
### system_dict_data (字典数据表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 字典编码 |
| sort | int4 | N | 0 | 字典排序 |
| label | varchar(100) | Y | | 字典标签 |
| value | varchar(100) | Y | | 字典键值 |
| dict_type | varchar(100) | Y | | 字典类型 |
| status | int2 | N | 0 | 状态(0正常 1停用) |
| color_type | varchar(100) | Y | | 颜色类型 |
| css_class | varchar(100) | Y | | css 样式 |
| remark | varchar(500) | Y | | 备注 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
### system_dict_type (字典类型表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 字典主键 |
| name | varchar(100) | Y | | 字典名称 |
| type | varchar(100) | Y | | 字典类型 |
| status | int2 | N | 0 | 状态(0正常 1停用) |
| remark | varchar(500) | Y | | 备注 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| deleted_time | timestamp(6) | Y | | 删除时间 |
### system_login_log (系统访问记录)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 访问ID |
| log_type | int8 | N | | 日志类型 |
| trace_id | varchar(64) | Y | | 链路追踪编号 |
| user_id | int8 | N | 0 | 用户编号 |
| user_type | int2 | N | 0 | 用户类型 |
| username | varchar(50) | Y | | 用户账号 |
| result | int2 | N | | 登陆结果 |
| user_ip | varchar(50) | N | | 用户 IP |
| user_agent | varchar(512) | N | | 浏览器 UA |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_mail_account (邮箱账号表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 主键 |
| mail | varchar(255) | N | | 邮箱 |
| username | varchar(255) | N | | 用户名 |
| password | varchar(255) | N | | 密码 |
| host | varchar(255) | N | | SMTP 服务器域名 |
| port | int4 | N | | SMTP 服务器端口 |
| ssl_enable | bool | N | false | 是否开启 SSL |
| starttls_enable | bool | N | false | 是否开启 STARTTLS |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
### system_mail_log (邮件日志表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 编号 |
| user_id | int8 | Y | | 用户编号 |
| user_type | int2 | Y | | 用户类型 |
| to_mail | varchar(255) | N | | 接收邮箱地址 |
| account_id | int8 | N | | 邮箱账号编号 |
| from_mail | varchar(255) | N | | 发送邮箱地址 |
| template_id | int8 | N | | 模板编号 |
| template_code | varchar(63) | N | | 模板编码 |
| template_nickname | varchar(255) | Y | | 模版发送人名称 |
| template_title | varchar(255) | N | | 邮件标题 |
| template_content | varchar(10240) | N | | 邮件内容 |
| template_params | varchar(255) | N | | 邮件参数 |
| send_status | int2 | N | 0 | 发送状态 |
| send_time | timestamp(6) | Y | | 发送时间 |
| send_message_id | varchar(255) | Y | | 发送返回的消息 ID |
| send_exception | varchar(4096) | Y | | 发送异常 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
### system_mail_template (邮件模版表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 编号 |
| name | varchar(63) | N | | 模板名称 |
| code | varchar(63) | N | | 模板编码 |
| account_id | int8 | N | | 发送的邮箱账号编号 |
| nickname | varchar(255) | Y | | 发送人名称 |
| title | varchar(255) | N | | 模板标题 |
| content | varchar(10240) | N | | 模板内容 |
| params | varchar(255) | N | | 参数数组 |
| status | int2 | N | | 开启状态 |
| remark | varchar(255) | Y | | 备注 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
### system_users (用户表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 用户ID |
| username | varchar(30) | N | | 用户账号 |
| password | varchar(100) | N | | 密码 |
| nickname | varchar(30) | N | | 用户昵称 |
| remark | varchar(500) | Y | | 备注 |
| dept_id | int8 | Y | | 部门ID |
| post_ids | varchar(255) | Y | | 岗位编号数组 |
| email | varchar(50) | Y | | 用户邮箱 |
| mobile | varchar(11) | Y | | 手机号码 |
| sex | int2 | Y | | 用户性别 |
| avatar | varchar(512) | Y | | 头像地址 |
| status | int2 | N | | 帐号状态(0正常 1停用) |
| login_ip | varchar(50) | Y | | 最后登录IP |
| login_date | timestamp(6) | Y | | 最后登录时间 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_role (角色信息表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 角色ID |
| name | varchar(30) | N | | 角色名称 |
| code | varchar(100) | N | | 角色权限字符串 |
| sort | int4 | N | | 显示顺序 |
| data_scope | int2 | N | 1 | 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) |
| data_scope_dept_ids | varchar(500) | N | | 数据范围(指定部门数组) |
| status | int2 | N | | 角色状态(0正常 1停用) |
| type | int2 | N | | 角色类型 |
| remark | varchar(500) | Y | | 备注 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_menu (菜单权限表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 菜单ID |
| name | varchar(50) | N | | 菜单名称 |
| permission | varchar(100) | N | | 权限标识 |
| type | int2 | N | | 菜单类型 |
| sort | int4 | N | 0 | 显示顺序 |
| parent_id | int8 | N | 0 | 父菜单ID |
| path | varchar(200) | Y | | 路由地址 |
| icon | varchar(100) | Y | | 菜单图标 |
| component | varchar(255) | Y | | 组件路径 |
| component_name | varchar(255) | Y | | 组件名 |
| status | int2 | N | | 菜单状态 |
| visible | bool | N | true | 是否可见 |
| keep_alive | bool | N | true | 是否缓存 |
| always_show | bool | N | true | 是否总是显示 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
### system_tenant (租户表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 租户编号 |
| name | varchar(30) | N | | 租户名 |
| contact_user_id | int8 | Y | | 联系人的用户编号 |
| contact_name | varchar(30) | N | | 联系人 |
| contact_mobile | varchar(500) | Y | | 联系手机 |
| status | int2 | N | | 租户状态(0正常 1停用) |
| website | varchar(256) | Y | | 绑定域名 |
| package_id | int8 | N | | 租户套餐编号 |
| expire_time | timestamp(6) | N | | 过期时间 |
| account_count | int4 | N | | 账号数量 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
### system_user_session (用户会话表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 会话ID |
| user_id | int8 | N | | 用户ID |
| session_id | varchar(100) | N | | 会话标识 |
| token | varchar(500) | N | | 访问令牌 |
| refresh_token | varchar(500) | Y | | 刷新令牌 |
| login_ip | varchar(50) | N | | 登录IP |
| login_location | varchar(100) | Y | | 登录地点 |
| user_agent | varchar(500) | Y | | 用户代理 |
| session_timeout | int4 | N | 1800 | 会话超时时间(秒) |
| last_access_time | timestamp(6) | N | pg_systimestamp() | 最后访问时间 |
| is_active | int2 | N | 1 | 是否活跃:0-否,1-是 |
| logout_time | timestamp(6) | Y | | 登出时间 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_user_role (用户角色关联表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| user_id | int8 | N | | 用户ID |
| role_id | int8 | N | | 角色ID |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_role_menu (角色菜单关联表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| role_id | int8 | N | | 角色ID |
| menu_id | int8 | N | | 菜单ID |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
## 子系统1: 统一平台数据表
统一平台主要负责系统基础功能,包括用户管理、权限管理、部门管理等。这些表主要为system_*系列,已在上一节详细描述。
### OAuth2.0单点登录相关表
为支持OAuth2.0协议的单点登录功能,系统新增以下OAuth2.0相关数据表:
点击展开/折叠OAuth2.0表详情
### system_oauth2_client (OAuth2客户端表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 编号 |
| client_id | varchar(255) | N | | 客户端编号 |
| secret | varchar(255) | N | | 客户端密钥 |
| name | varchar(255) | N | | 应用名 |
| logo | varchar(255) | N | | 应用图标 |
| description | varchar(255) | Y | | 应用描述 |
| status | int2 | N | | 状态 |
| access_token_validity_seconds | int4 | N | | 访问令牌的有效期 |
| refresh_token_validity_seconds | int4 | N | | 刷新令牌的有效期 |
| redirect_uris | varchar(255) | N | | 可重定向的 URI 地址 |
| authorized_grant_types | varchar(255) | N | | 授权类型 |
| scopes | varchar(255) | Y | | 授权范围 |
| auto_approve_scopes | varchar(255) | Y | | 自动通过的授权范围 |
| authorities | varchar(255) | Y | | 权限 |
| resource_ids | varchar(255) | Y | | 资源 |
| additional_information | varchar(4096) | Y | | 附加信息 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
### system_oauth2_access_token (OAuth2访问令牌表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 编号 |
| user_id | int8 | N | | 用户编号 |
| user_type | int2 | N | | 用户类型 |
| user_info | varchar(512) | N | | 用户信息 |
| access_token | varchar(255) | N | | 访问令牌 |
| refresh_token | varchar(32) | N | | 刷新令牌 |
| client_id | varchar(255) | N | | 客户端编号 |
| scopes | varchar(255) | Y | | 授权范围 |
| expires_time | timestamp(6) | N | | 过期时间 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_oauth2_refresh_token (OAuth2刷新令牌表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 编号 |
| user_id | int8 | N | | 用户编号 |
| refresh_token | varchar(32) | N | | 刷新令牌 |
| user_type | int2 | N | | 用户类型 |
| client_id | varchar(255) | N | | 客户端编号 |
| scopes | varchar(255) | Y | | 授权范围 |
| expires_time | timestamp(6) | N | | 过期时间 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_oauth2_code (OAuth2授权码表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 编号 |
| user_id | int8 | N | | 用户编号 |
| user_type | int2 | N | | 用户类型 |
| code | varchar(32) | N | | 授权码 |
| client_id | varchar(255) | N | | 客户端编号 |
| scopes | varchar(255) | Y | | 授权范围 |
| expires_time | timestamp(6) | N | | 过期时间 |
| redirect_uri | varchar(255) | Y | | 可重定向的 URI 地址 |
| state | varchar(255) | Y | | 状态 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### system_oauth2_approve (OAuth2批准表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | | 编号 |
| user_id | int8 | N | | 用户编号 |
| user_type | int2 | N | | 用户类型 |
| client_id | varchar(255) | N | | 客户端编号 |
| scope | varchar(255) | Y | | 授权范围 |
| approved | bool | N | false | 是否接受 |
| expires_time | timestamp(6) | N | | 过期时间 |
| creator | varchar(64) | Y | | 创建者 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新者 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
## 子系统2: 营收系统数据表
营收系统是核心业务系统,包括客户管理、抄表管理、账务管理、发票管理等核心业务功能。
点击展开/折叠营收系统表详情
### biz_community (所属小区表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(200) | N | | 小区名称 |
| code | varchar(100) | N | | 小区代码 |
| address | varchar(500) | Y | | 小区地址 |
| contact_number | varchar(100) | Y | | 联系号码 |
| dept_code | varchar(50) | N | | 部门代码,关联系统部门表 |
| parent_id | int8 | Y | | 父级小区id,支持小区层级管理 |
| ancestor_list | varchar(1000) | Y | | 祖级列表,格式:1,2,3表示祖级小区id列表 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### system_user_form_config (用户表单字段配置表-标准)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键ID |
| obj_id | int8 | Y | | 对象ID(用户id/角色id等) |
| config_type | int2 | N | | 配置类型:1-个人配置,2-角色配置 |
| code | varchar(100) | N | | 表格标识/模版号(与菜单或功能标识关联) |
| column_key | varchar(100) | N | | 列字段标识 |
| column_title | varchar(100) | Y | | 自定义列标题 |
| column_width | int4 | Y | | 列宽度 |
| is_visible | int2 | N | 0 | 是否显示:0-显示,1-隐藏 |
| is_printable | int2 | N | 0 | 是否可打印:0-是,1-否 |
| sort_order | int4 | N | 0 | 排序序号 |
| creator | varchar(64) | Y | | 创建人 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| updater | varchar(64) | Y | | 更新人 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户编号 |
### biz_company_account (水司账户表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| account_name | varchar(200) | N | | 账户名称 |
| account_address | varchar(500) | Y | | 账户地址 |
| bank_name | varchar(200) | N | | 开户行名称 |
| bank_code | varchar(100) | N | | 开户行代码 |
| bank_account | varchar(100) | N | | 开户行账户 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_cost_component (费用组成表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(100) | Y | | 费用名称 |
| code | varchar(100) | N | | 费用代码 |
| penalty_coefficient | numeric(10,4) | Y | | 违约金系数,违约金计算系数,默认为0表示不收取违约金 |
| zero_usage_calculation | int2 | N | 0 | 零用量是否计算,0-不计算,1-计算 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_dept_account_rel (部门和水司账户关系表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| dept_code | varchar(50) | N | | 部门代码,关联系统部门表 |
| account_id | int8 | N | | 水司账户id,关联水司账户表 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_meter_caliber (水表口径表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(100) | Y | | 口径名称 |
| code | varchar(100) | N | | 口径代码 |
| value | numeric(10,2) | Y | | 口径值(单位:毫米) |
| check_period | int4 | Y | | 强检周期(单位:年) |
| replace_period | int4 | Y | | 定换周期(单位:年) |
| high_coefficient | numeric(10,4) | Y | | 量高系数,抄表量高提醒系数 |
| low_coefficient | numeric(10,4) | Y | | 量低系数,抄表量低提醒系数 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_meter_maker (水表厂家表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(100) | Y | | 厂家名称 |
| code | varchar(100) | N | | 厂家代码 |
| recharge_type | varchar(10) | Y | | 充值类型 |
| address | varchar(500) | Y | | 地址 |
| contact | varchar(100) | Y | | 联系人 |
| contact_number | varchar(100) | Y | | 联系号码 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_meter_model (水表型号表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| maker_code | varchar(100) | N | | 厂家代码,关联水表厂家表 |
| name | varchar(100) | Y | | 型号名称 |
| code | varchar(100) | N | | 型号代码 |
| caliber_range | varchar(200) | Y | | 口径范围,如:DN15-DN200 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_meter_range (水表量程表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(100) | Y | | 量程名称 |
| code | varchar(100) | N | | 量程代码 |
| value | numeric(15,3) | Y | | 量程值 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_category (水价归属表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(100) | Y | | 归属名称 |
| code | varchar(100) | N | | 归属代码 |
| parent_id | int8 | Y | | 父级归属id |
| ancestor_list | varchar(1000) | Y | | 祖级列表,格式:1,2,3表示祖级归属id列表 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_adjustment_history (水价调整历史表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| adjustment_id | int8 | N | | 调整id,关联水价调整表 |
| before_value | numeric(15,4) | Y | | 调整前价格 |
| after_value | numeric(15,4) | Y | | 调整后价格 |
| adjustment_reason | varchar(500) | Y | | 调整原因 |
| effective_date | timestamp(6) | Y | | 生效日期 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_cost_adjustment (价格成本调整表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| cost_component_code | varchar(100) | N | | 费用组成代码,关联费用组成表 |
| price_category_code | varchar(100) | N | | 价格归属代码,关联价格归属表 |
| price_value | numeric(15,4) | Y | | 价格值 |
| effective_date | timestamp(6) | Y | | 生效日期 |
| expire_date | timestamp(6) | Y | | 失效日期 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_dept_rel (价格部门关系表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| price_category_code | varchar(100) | N | | 价格归属代码,关联价格归属表 |
| dept_code | varchar(50) | N | | 部门代码,关联系统部门表 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_discount_cost (价格折扣成本表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| scheme_id | int8 | N | | 折扣方案id,关联价格折扣方案表 |
| cost_component_code | varchar(100) | N | | 费用组成代码,关联费用组成表 |
| discount_rate | numeric(10,4) | Y | | 折扣率,0-1之间的小数 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_discount_scheme (价格折扣方案表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(100) | Y | | 方案名称 |
| code | varchar(100) | N | | 方案代码 |
| price_category_code | varchar(100) | N | | 价格归属代码,关联价格归属表 |
| discount_type | varchar(20) | Y | | 折扣类型,如:百分比、固定金额等 |
| effective_date | timestamp(6) | Y | | 生效日期 |
| expire_date | timestamp(6) | Y | | 失效日期 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_discount_tier (价格折扣阶梯表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| scheme_id | int8 | N | | 折扣方案id,关联价格折扣方案表 |
| tier_level | int4 | Y | | 阶梯级别 |
| start_value | numeric(15,3) | Y | | 起始值 |
| end_value | numeric(15,3) | Y | | 结束值 |
| discount_rate | numeric(10,4) | Y | | 折扣率 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_tier_adjustment (价格阶梯调整表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| cost_component_code | varchar(100) | N | | 费用组成代码,关联费用组成表 |
| price_category_code | varchar(100) | N | | 价格归属代码,关联价格归属表 |
| tier_level | int4 | Y | | 阶梯级别 |
| start_value | numeric(15,3) | Y | | 起始值 |
| end_value | numeric(15,3) | Y | | 结束值 |
| price_value | numeric(15,4) | Y | | 价格值 |
| effective_date | timestamp(6) | Y | | 生效日期 |
| expire_date | timestamp(6) | Y | | 失效日期 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_adjustment_snap (水价调整快照表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| code | int4 | N | | 快照编号/版本号,1->2->3递增 |
| effective_date | timestamp(6) | N | | 生效日期 |
| expiry_date | timestamp(6) | Y | | 失效日期,为空表示长期有效 |
| adjuster | varchar(100) | Y | | 调价人 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间/调价时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_template (水价调整模版表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| name | varchar(100) | Y | | 用水性质名称 |
| code | varchar(100) | N | | 模版代码/简号 |
| price_category_code | varchar(100) | N | | 水价归属代码,关联价格归属表 |
| adjustment_snap_code | varchar(100) | N | | 调价快照code,关联水价调整快照表 |
| meter_start | int4 | Y | | 起开量 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_template_dept_rel (模版部门关系表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| dept_code | varchar(50) | N | | 部门代码,关联系统部门表 |
| template_code | varchar(100) | N | | 水价调整模版代码 |
| adjustment_snap_code | varchar(100) | N | | 调价快照code |
| is_default | int2 | N | 0 | 是否默认:0-否,1-是 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_tier_adjustment (水价阶梯调整表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| cost_adjustment_id | int8 | N | | 水价费用调整id |
| cost_component_code | varchar(100) | N | | 费用组成代码 |
| tier_level | int4 | N | 0 | 阶梯级别,如1、2、3等 |
| start_volume | numeric(15,3) | Y | | 开始水量,单位:立方米 |
| end_volume | numeric(15,3) | Y | | 结束水量,为空表示无上限 |
| price | numeric(10,4) | N | | 价格,单位:元/立方米或元 |
| volume_coefficient | numeric(10,4) | N | 1 | 水量系数,用于特殊计算场景 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_discount_scheme (水价优惠方案表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| scheme_name | varchar(200) | N | | 方案名称,如:居民用户优惠方案2024 |
| scheme_code | varchar(100) | N | | 方案代码 |
| template_code | varchar(100) | N | | 水价模版代码 |
| discount_type | int4 | N | | 优惠方式:1-按水量,2-按比例 |
| effective_date | date | N | | 生效日期 |
| expiry_date | date | Y | | 失效日期,为空表示长期有效 |
| scheme_description | varchar(1000) | Y | | 方案描述 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_discount_tier (水价优惠阶梯表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| scheme_id | int8 | N | | 优惠方案id |
| tier_level | int4 | N | 0 | 阶梯级别,如1、2、3等 |
| start_volume | numeric(15,3) | Y | | 开始水量,单位:立方米 |
| end_volume | numeric(15,3) | Y | | 结束水量,为空表示无上限 |
| include_in_tier | int2 | N | 1 | 是否计入阶梯:0-不计入,1-计入 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### biz_price_discount_cost (水价优惠费用表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| tier_id | int8 | N | | 优惠阶梯id |
| cost_component_code | varchar(100) | N | | 费用组成代码 |
| discount_price | numeric(10,4) | N | | 优惠价格,单位:元/立方米或元 |
| sort | int4 | N | 0 | 排序 |
| remark | varchar(500) | Y | | 备注 |
| status | int2 | N | 0 | 状态:0-否,1-是 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
## SYS-002 客户与账户关系表 (`biz_cust*` / `biz_account`)
> 说明:以下内容按 `sql/lhc_数据库设计.md`、`docs/guides/BACKEND_TABLE_MAPPING.md` 与当前 backend 真实表名进行整编,字段以“数据库专项设计阶段需重点关注的核心字段”为主,不再延续旧稿中的 `customer_*` 系列表命名。
### biz_cust (客户主档表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `code` | 客户编号 |
| `name` | 客户名称 |
| `cust_type` | 客户类型 |
| `id_type` / `id_no` | 证件类型 / 证件号码 |
| `mobile` / `address` | 联系电话 / 地址 |
| `dept_code` | 所属营业部门 |
| `status` | 客户状态 |
| `tenant_id` | 租户编号 |
### biz_account (客户账户表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `code` | 账户编号 |
| `cust_id` | 客户主档 ID |
| `balance` | 账户余额 |
| `arrears_amount` | 欠费金额 |
| `account_status` | 账户状态 |
| `tenant_id` | 租户编号 |
### biz_cust_contact (客户联系人表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `cust_id` | 客户主档 ID |
| `name` | 联系人姓名 |
| `mobile` | 联系电话 |
| `contact_type` | 联系人类型 |
| `is_default` | 是否默认联系人 |
### biz_cust_group (客户分组表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `code` | 分组编码 |
| `name` | 分组名称 |
| `parent_id` | 上级分组 |
| `status` | 状态 |
### biz_cust_meter (客户与水表关系表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `cust_id` | 客户主档 ID |
| `meter_id` | 水表主档 ID |
| `bind_type` | 绑定类型 |
| `is_main` | 是否主表 |
| `status` | 关系状态 |
### biz_cust_invoice (客户开票信息表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `cust_id` | 客户主档 ID |
| `invoice_title` | 开票抬头 |
| `tax_no` | 纳税人识别号 |
| `email` | 发票接收邮箱 |
| `mobile` | 联系手机号 |
### biz_cust_app_binds (客户应用绑定表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `cust_id` | 客户主档 ID |
| `app_type` | 应用类型 |
| `app_user_id` | 外部应用用户标识 |
| `status` | 绑定状态 |
### biz_cust_collection_rel / biz_cust_withholding_rel (托收/代扣关系表)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_cust_collection_rel` | `cust_id`, `collection_id`, `status` | 客户与托收关系 |
| `biz_cust_withholding_rel` | `cust_id`, `withholding_id`, `status` | 客户与代扣关系 |
### biz_cust_water_use_scheme / biz_cust_water_scheme_rel (用水方案关系表)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_cust_water_use_scheme` | `cust_id`, `scheme_code`, `effective_date` | 客户用水方案 |
| `biz_cust_water_scheme_rel` | `cust_id`, `template_code`, `status` | 客户与价格模板关系 |
### biz_cust_no_rule / biz_cust_hub_marks (客户编号与集抄标识表)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_cust_no_rule` | `rule_code`, `prefix`, `dept_code`, `status` | 客户编号规则 |
| `biz_cust_hub_marks` | `cust_id`, `hub_code`, `mark_type` | 集抄/枢纽标识 |
## SYS-002 抄表、水表与价格支撑表 (`biz_meter*` / `biz_reading_*` / `biz_price_*`)
### biz_meter (水表主档表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `code` | 水表编号 |
| `meter_no` | 出厂表号 |
| `maker_code` / `model_code` | 厂家 / 型号 |
| `caliber_code` / `range_code` | 口径 / 量程 |
| `install_address` | 安装地址 |
| `meter_status` | 水表状态 |
| `tenant_id` | 租户编号 |
### biz_meter_book (抄表册本表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `code` | 册本编号 |
| `name` | 册本名称 |
| `dept_code` | 所属部门 |
| `reader_user` | 抄表员 |
| `reading_cycle` | 抄表周期 |
| `status` | 册本状态 |
### biz_meter_read (抄表任务/状态表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `book_id` | 册本 ID |
| `cust_id` | 客户 ID |
| `meter_id` | 水表 ID |
| `read_period` | 抄表期间 |
| `read_status` | 抄表状态 |
| `read_type` | 抄表方式 |
### biz_reading_data (抄表数据表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `meter_read_id` | 抄表任务 ID |
| `last_reading` | 上次读数 |
| `current_reading` | 本次读数 |
| `water_usage` | 用水量 |
| `read_time` | 抄见时间 |
| `photo_url` | 抄表照片 |
### biz_last_reading / biz_reading_logs (上次读数与抄表日志)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_last_reading` | `meter_id`, `last_reading`, `last_read_time` | 水表最近有效读数 |
| `biz_reading_logs` | `meter_id`, `operate_type`, `operator`, `operate_time` | 抄表处理留痕 |
### 价格与模板支撑表
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_price_category` | `code`, `name`, `parent_id` | 水价归属 |
| `biz_price_template` | `code`, `price_category_code`, `adjustment_snap_code` | 水价模板 |
| `biz_price_adjustment_snap` | `code`, `effective_date`, `expiry_date` | 调价快照 |
| `biz_price_cost_adjustment` | `price_category_code`, `cost_component_code`, `price_value` | 费用调价 |
| `biz_price_tier_adjustment` | `cost_component_code`, `tier_level`, `start_volume`, `end_volume`, `price` | 阶梯价格 |
| `biz_cost_component` | `code`, `name`, `penalty_coefficient` | 费用组成 |
| `biz_water_use_scheme` | `code`, `name`, `status` | 用水方案 |
| `biz_water_use_scheme_tier` | `scheme_code`, `tier_level`, `start_volume`, `end_volume` | 用水阶梯 |
| `biz_exceed_water_use_scheme` | `scheme_code`, `exceed_type`, `price_rule` | 超计划规则 |
## SYS-002 开账、收费与票据表 (`biz_charge*` / `biz_collection` / `biz_withholding` / `biz_invoice*`)
### biz_charge (营业账主表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `code` | 账单编号 |
| `cust_id` | 客户 ID |
| `record_id` | 抄表记录或开账来源 ID |
| `bill_period` | 账单期间 |
| `total_amount` | 账单总金额 |
| `charge_status` | 收费状态 |
| `due_date` | 应缴日期 |
### biz_charge_detail (营业账明细表)
| 字段名 | 说明 |
| :--- | :--- |
| `id` | 主键 |
| `charge_id` | 营业账主表 ID |
| `cost_component_code` | 费用组成代码 |
| `usage_amount` | 用量 |
| `unit_price` | 单价 |
| `detail_amount` | 明细金额 |
#### REV-002 账单生成承接口径
| 对象 | 正式口径 | 承接说明 |
| :--- | :--- | :--- |
| `biz_charge` | 账单生成主结果对象 | 统一表达客户、账期、抄表/开账来源、账单总金额、收费状态与应缴日期,不单独发明新的在线账单主模型 |
| `biz_charge_detail` | 账单生成明细对象 | 统一表达费用组成、用量、单价、明细金额,与主表通过 `charge_id` 建立主明细关系 |
| `biz_price_category`、`biz_price_template`、`biz_price_adjustment_snap`、`biz_price_tier_adjustment` | 计费规则来源对象 | 用于表达价格归属、基础价格、调价快照与阶梯规则来源,支撑账单金额计算与追溯 |
| `biz_cost_component` | 费用组成定义对象 | 用于表达水费、污水费、附加费、罚款类费用等明细分类,不将费用组成直接硬编码到主表 |
| `biz_water_use_scheme`、`biz_water_use_scheme_tier`、`biz_exceed_water_use_scheme` | 计划用水与超计划规则对象 | 用于承接计划用水、超计划与阶梯类扩展规则,不额外发明平行的特殊开账规则表 |
| 历史开账记录、特殊开账 | 历史只读 / 同模型承接对象 | 统一纳入 `biz_charge`、`biz_charge_detail` 与操作留痕承接,通过来源类型、业务类型、依据说明区分,不单设“特殊开账表” |
> REV-002 承接口径:账单生成结果统一由 `biz_charge`、`biz_charge_detail` 承接,关键规则来源继续由 `biz_price_*`、`biz_cost_component` 与计划用水相关对象提供;当价格模板、费用组成或规则关系不完整时,应按“阻断生成”口径处理。
>
> 当前 backend 证据:`ChargeServiceImpl.generateSingleChargeWithCache` 成功路径已执行 `chargeMapper.insert(charge)`、`chargeDetailService.insertChargeDetail(detail)` 与 `updateReadingDataCheckState(readingDataId, 1)`,说明现有实现已能把按 `readingDataIds` 复核/开账的结果落入 `biz_charge`、`biz_charge_detail`。
>
> 当前承接缺口:接口层返回仍为成功条数字符串,失败阻断主要依赖日志与布尔值,且仅支持 `ACTUAL_USAGE` 结算方式;`biz_charge` / `biz_charge_detail` 的主明细结果、失败对象范围和结构化原因尚未提升为正式 `IF-REV-005` 契约返回。
>
> REV-004 承接口径:水量调整、金额调整、退款、冲正、坏账申请统一以 `biz_charge`、`biz_charge_detail` 作为账单主明细承接对象;当前数据库主文档不新增独立账务细表来承接一期场景。
### biz_collection / biz_withholding (托收与代扣主表)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_collection` | `code`, `cust_id`, `charge_id`, `collection_status` | 托收主表 |
| `biz_withholding` | `code`, `cust_id`, `charge_id`, `withholding_status` | 代扣主表 |
### biz_invoice / biz_invoice_taxrate (发票主表与税率表)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_invoice` | `code`, `cust_id`, `charge_id`, `invoice_status`, `invoice_amount` | 发票主表,统一承接申请单号、账单关联、受理号、开票结果与电子票地址等核心状态 |
| `biz_invoice_taxrate` | `tax_code`, `tax_name`, `tax_rate`, `status` | 税率基础配置 |
#### REV-005 发票承接口径
| 对象 | 已有字段 | 待补字段 | 仅快照/历史只读字段 |
| :--- | :--- | :--- | :--- |
| `biz_invoice` 发票申请/结果主对象 | `code`、`cust_id`、`charge_id`、`invoice_status`、`invoice_amount` | `application_no`、`sys_request_no`、`invoice_type`、`invoice_title`、`tax_no`、`email`、`mobile`、`source_channel`、`fail_reason`、`invoice_code`、`invoice_number`、`file_url`、`last_try_time`、`next_try_time`、`try_count`、`push_status`、`charge_ids_snapshot`、`charge_bind_status`、作废原因/备注、红冲原因/备注、原票/红票关联标识、作废/红冲申请来源、补偿查询/结果回写上下文 | 旧开票批次号、旧配置版本号、旧平台扩展回执 |
| `biz_cust_invoice` 客户开票信息 | `cust_id`、`invoice_title`、`tax_no`、`email`、`mobile` | 企业/个人抬头类型、默认推送方式等扩展属性按后续实现补齐 | 旧抬头版本、历史修改快照 |
| `biz_invoice_taxrate` 税率配置 | `tax_code`、`tax_name`、`tax_rate`、`status` | 税率生效区间、适用票种范围等扩展控制字段 | 旧税率版本快照 |
| 账单-发票关系快照 | 当前主模型通过 `biz_invoice` 与 `biz_charge*` 关联承接 | `charge_ids_snapshot`、账单集合来源、客户侧身份匹配结果、操作留痕标识 | 旧营业账开票关系表、旧发票明细表 |
### biz_operat_log / biz_operat_log_detail (操作留痕表)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_operat_log` | `biz_type`, `biz_id`, `operate_user`, `operate_time` | 业务操作主日志 |
| `biz_operat_log_detail` | `log_id`, `field_name`, `before_value`, `after_value` | 字段级变更留痕 |
> REV-004 留痕口径:`biz_operat_log*` 统一承接账务处理的一期留痕,至少覆盖处理类型、目标账单、原交易引用、处理前后差异、原因说明、附件依据与操作人。
>
> 边界说明:旧数据字典中的“跨周期水量、特账、红冲、已销调整、呆坏账、实时收费日志”等对象,在当前 backend 范围内未全部识别到独立实体表,数据库专项中统一按业务处理场景描述,不误写为已明确落地的真实表。
### 旧系统历史台账迁移与只读查询口径
#### 在线主模型承接范围
| 旧对象/旧菜单 | 当前主口径 | 承接方式 | 数据策略 |
| :--- | :--- | :--- | :--- |
| 开账记录、特殊开账 | `biz_charge`、`biz_charge_detail`、`biz_operat_log*` | 统一纳入营业账主表与明细表,特殊开账按来源类型、业务类型、依据说明留痕,不单设平行“特殊开账表” | 在线保留 |
| 柜台收费、实时收费、代收代扣 | `biz_collection`、`biz_withholding`、`bk_transaction*`、`bk_withholding_*` | 统一纳入收费主模型与渠道交易模型,柜台班结/实时收费日志按交易结果和操作留痕归并 | 在线保留 |
| 发票申请、开票结果、票据税率 | `biz_invoice`、`biz_invoice_taxrate`、`biz_cust_invoice` | 统一纳入发票主表、税率表和客户开票信息,不为旧“营业账开票表”机械复制新在线表 | 在线保留 |
| 微网厅业务字段、页面配置、微信参数 | `biz_business_types`、`biz_business_datas`、`biz_page_settings*`、`biz_parameter_settings`、`sys_wechat_app_settings` | 统一归并为业务类型、页面配置和渠道参数模型 | 在线保留 |
| 办理附件、电子档案 | `biz_content`、`biz_content_attach` | 当前新增与迁移后新增资料统一按资料主表与附件表承接 | 在线保留 |
#### 历史只读保留范围
| 历史对象 | 当前正式口径 | 保留策略 | 查询要求 |
| :--- | :--- | :--- | :--- |
| 红冲记录、红冲原因、红冲前后账务快照 | 账单状态 + 账务处理场景 + 操作留痕 | 保留历史只读,不强制拆为新主库独立实体表 | 至少支持原单号、红冲单号、金额、原因、经办人、时间查询 |
| 预存退款、已销调整、价差调整、分账调整、违约金减免、呆坏账明细 | `REV-004` 账务处理业务场景 | 旧细粒度台账以历史只读方式保留;新发生业务由流程与日志承接 | 至少支持汇总、明细、状态、审批结果和关联账单查询 |
| 柜台结账、打印记录、补打记录 | 收费结果 + 打印/操作留痕 | 旧查询菜单作为历史只读能力保留,不单独建设新结账台账表 | 至少支持班次、营业所、柜员、打印类型、结账状态查询 |
| 发票明细、营业账开票关系、开票配置快照 | 发票主模型 + 历史关系快照 | 旧细表和配置快照按历史只读保留;新在线模型只保留开票必需主数据 | 至少支持发票号、账单号、开票批次、配置版本和结果状态查询 |
| 催缴记录、停水记录、预存短信记录 | 催缴/停复水/消息联动业务场景 | 旧记录菜单按历史只读保留,与 `IF-REV-013` 的任务结果、通知链路和工单处置引用分层承接,不新增同名在线主表 | 至少支持客户、账期、催缴方式、执行结果、发送对象、发送时间、关联账单、处置引用查询 |
| 水表检定、领用、出库、退库、报废单据 | `METER-003` 生命周期场景 | 当前在线主表承接水表状态,旧单据与检定证书按历史只读保留 | 至少支持表号、仓库、单据类型、检定结论、证书编号查询 |
#### 迁移验收最低对账口径
| 对账主题 | 最低核对维度 | 主口径来源 | 验收要求 |
| :--- | :--- | :--- | :--- |
| 开账记录 | 客户数、账单数、账期、应收金额 | `biz_charge`、`biz_charge_detail` + 历史账单来源 | 支持按账期、营业所、客户类型汇总比对 |
| 缴费记录 | 收费笔数、实收金额、渠道、核销状态 | `biz_collection`、`bk_transaction*` | 支持按渠道、日期、营业所汇总比对 |
| 发票记录 | 开票笔数、金额、状态、票据类型 | `biz_invoice*` + 历史开票关系 | 支持按发票状态、开票日期比对 |
| 红冲与账务调整 | 调整笔数、调整金额、处理结果 | 账务处理结果 + 历史台账 | 支持汇总与单据级差异定位 |
| 催缴与停复水 | 通知笔数、执行结果、停复水状态 | `IF-REV-013` 任务结果 + 历史记录 | 支持按账期、客户、执行状态、处置引用比对 |
| 电子档案 | 附件数、附件类型、关联业务单数 | `biz_content_attach` + 历史档案目录 | 支持按业务类型、上传时间、来源系统比对 |
#### 设计约束
- 不以“旧菜单一项对应一张新表”为原则,优先复用当前已确认的 `biz_*`、`bk_*` 在线主模型。
- 对 backend 当前未识别到独立实体表的旧细粒度台账,仅写为“历史只读查询对象”,不误写为“已存在新在线表”。
- 历史只读对象必须保留原系统关键标识(原单号、原客户号、原批次号或原附件标识)以支撑迁移验收与问题追溯。
- 涉及历史附件、影像、高拍仪资料时,正式数据库设计只约束“资料元数据 + 文件引用”口径,不在本轮臆造新的文件表族。
- `REV-006` 的正式结果状态按 `PENDING`、`SUCCESS`、`FAIL`、`MANUAL_VERIFIED` 四态统一,数据库设计仅约束查询与追溯口径,不反推为已存在独立催缴结果主表。
- 停复水、复水和工单处置在本轮仅保留“关联引用 + 状态摘要 + 建链时间”三类追溯字段要求,不展开下游业务表设计。
## SYS-002 业务办理与资料表 (`biz_process*` / `biz_business_*` / `biz_content*`)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `biz_process` | `code`, `biz_type_code`, `cust_id`, `process_status` | 业务办理流程主表 |
| `biz_process_transfer` | `process_id`, `from_user`, `to_user`, `transfer_time` | 流转/转办记录 |
| `biz_process_cust_contact` | `process_id`, `contact_name`, `mobile` | 办理过程联系人信息 |
| `biz_process_meter_install` | `process_id`, `meter_id`, `install_addr` | 装表安装信息 |
| `biz_process_invoice_modifys` | `process_id`, `invoice_id`, `modify_type` | 发票变更记录 |
| `biz_business_types` | `code`, `name`, `status` | 业务类型定义 |
| `biz_business_datas` | `biz_id`, `data_key`, `data_value` | 业务扩展数据 |
| `biz_content` | `biz_id`, `content_type`, `content_title` | 办理资料主表 |
| `biz_content_attach` | `content_id`, `file_name`, `file_url` | 办理附件表 |
## SYS-002 银行代收与结算表 (`bk_*`)
| 表名 | 关键字段 | 说明 |
| :--- | :--- | :--- |
| `bk_payment_channel` | `channel_code`, `channel_name`, `channel_type`, `status` | 支付渠道主表 |
| `bk_channel_api_config` | `channel_code`, `api_type`, `endpoint`, `crypto_type` | 渠道接口配置 |
| `bk_channel_route_rule` | `channel_code`, `route_type`, `priority`, `status` | 渠道路由规则 |
| `bk_channel_statistics` | `channel_code`, `stat_date`, `success_count`, `success_amount` | 渠道统计 |
| `bk_transaction` | `trade_no`, `biz_order_no`, `channel_code`, `trade_amount`, `trade_status` | 渠道交易流水 |
| `bk_transaction_callback` | `trade_no`, `callback_time`, `callback_status`, `raw_message` | 回调留痕 |
| `bk_transaction_exception` | `trade_no`, `exception_code`, `exception_desc`, `handle_status` | 异常处理 |
> REV-004 原交易校验口径:退款、冲正场景统一依赖 `bk_transaction*` 校验原交易存在性、状态、回调结果与异常处理状态,数据库专项不再为一期新增平行退款交易表。
| `bk_withholding_agreement` | `agreement_no`, `cust_id`, `channel_code`, `sign_status` | 代扣签约 |
| `bk_withholding_batch` | `batch_no`, `channel_code`, `batch_date`, `batch_status` | 代扣批次 |
| `bk_withholding_item` | `batch_id`, `cust_id`, `charge_id`, `item_status` | 代扣明细 |
| `bk_reconcile_batch` | `batch_no`, `channel_code`, `bill_date`, `reconcile_status` | 对账批次 |
| `bk_reconcile_diff` | `batch_id`, `trade_no`, `diff_type`, `diff_amount` | 对账差异 |
| `bk_settlement_batch` | `batch_no`, `channel_code`, `settlement_date`, `settlement_status` | 结算批次 |
> 当前实现边界说明:`bk_*` 表族已形成较完整的对象承接口径,且签约、解约、交易流水与后台资源管理具备明确实现证据;但送盘、回盘、对账、结算等业务编排仍缺少完整闭环与统一迁移证据,数据库专项不得据此倒推出“银行协同已全部落地”。
## METER/INST 专题表边界
本章节用于收敛 `SYS-002` 主表之外、但在详细设计与附录中反复出现的表务与报装签章专题表口径,避免“主文档未覆盖、分文档各写一套”。
### METER 专题(表务管理)
#### 实现态(当前主库口径)
| 表名 | 角色定位 | 说明 |
| :--- | :--- | :--- |
| `biz_meter` | 水表主档 | 水表基础信息、状态、型号、口径、量程等主数据入口 |
| `biz_meter_read` / `biz_reading_data` / `biz_last_reading` | 抄表与读数 | 支撑抄表任务、读数提交、最新读数维护 |
| `biz_meter_log` | 表务留痕 | 记录换表、移表、校表、维修等过程动作 |
| `biz_meter_in_out` / `biz_meter_in_out_rel` | 库存与出入库 | 支撑领用、退库、报废及批次追踪 |
| `biz_process` / `biz_process_transfer` | 工单协同 | 与业务办理流程共享工单流转和处理状态 |
#### 历史命名映射(存量资料口径)
| 历史命名(存量) | 当前主口径(建议对齐) | 说明 |
| :--- | :--- | :--- |
| `water_meter_workorder` | `biz_meter_log` + `biz_process*` | 旧稿“工单”能力在主文档统一并入表务日志与流程流转模型 |
| `water_meter_stock` / `water_meter_inventory` | `biz_meter_in_out` + `biz_meter_in_out_rel` | 旧稿库存/出入库能力按 `biz_meter_*` 专题表收敛 |
| `water_meter_archive` | `biz_meter` + `biz_last_reading` | 旧稿档案口径统一并入水表主档与读数状态模型 |
> 说明:`water_meter_*` 仅用于历史资料追溯,不作为当前正式交付主口径。
### INST 专题(报装与签章)
#### 实现态(当前主库口径)
| 表名 | 角色定位 | 说明 |
| :--- | :--- | :--- |
| `biz_process` / `biz_process_transfer` | 报装流程主线 | 报装申请受理、节点流转、办理状态 |
| `biz_process_meter_install` | 装表落地信息 | 记录安装位置、装表结果等现场信息 |
| `biz_business_datas` | 业务扩展数据 | 踏勘、方案、审批扩展字段 |
| `biz_content` / `biz_content_attach` | 资料与附件 | 报装材料、验收资料、影像与附件管理 |
#### 设计态(专项扩展口径)
| 表名 | 角色定位 | 说明 |
| :--- | :--- | :--- |
| `installation_contract` | 报装合同主表 | 合同主数据、合同状态、文件地址 |
| `installation_signature` | 签章记录表 | 签署方、签章任务、签署状态与时间 |
| `installation_evidence` | 电子存证表 | 存证凭证、哈希、存证状态 |
| `installation_ca_config` | CA 配置表 | 泛微 CA 对接配置参数 |
| `installation_signature_template` | 签章模板表 | 签章模板与签署位置配置 |
| `installation_application` | 报装申请映射 | 与报装申请主线对象的关联映射(设计态) |
> 边界说明:`installation_*` 来源于报装签章专项设计与附录,当前在数据库主文档按“专题扩展”纳管。若实施库落地结构与本表不一致,以实施库与主详设联合评审结果为准。
## 子系统5: 客户服务数据表(复用 SYS-002 主数据)
客户服务模块本身不再单独维护旧稿中分散的平行表模型,而是以 `SYS-002` 主数据和交易表为主,按场景复用客户、账单、支付、发票与业务办理数据。
点击展开/折叠客户服务系统表详情
### 客户服务主要复用表
| 场景 | 复用表 | 说明 |
| :--- | :--- | :--- |
| 账户绑定管理 | `biz_cust`, `biz_cust_app_binds`, `biz_account` | 支撑账户绑定、默认客户切换与账号关联 |
| 信息查询服务 | `biz_cust`, `biz_cust_meter`, `biz_meter`, `biz_charge`, `biz_charge_detail` | 支撑客户档案、表计信息、账单与费用查询 |
| 在线缴费服务 | `biz_charge`, `biz_collection`, `biz_withholding`, `bk_transaction`, `bk_transaction_callback` | 支撑缴费下单、支付回写与异步回调 |
| 电子发票服务 | `biz_invoice`, `biz_invoice_taxrate`, `biz_cust_invoice` | 支撑发票申请、税率匹配与抬头信息 |
| 业务办理服务 | `biz_process`, `biz_process_transfer`, `biz_business_datas`, `biz_content_attach` | 支撑业务申请、进度查询与附件资料 |
> 说明:客户服务模块与 `SYS-008`、`SYS-009`、`SYS-010` 的协同在数据库层主要表现为复用 `SYS-002` 主业务表并接收外部服务回写结果,不再单列一套平行客户服务数据库模型。
## 子系统6: 手机抄表APP数据表
手机抄表APP为抄表员和外勤人员提供移动作业工具,支持离线操作,提升现场工作效率。
点击展开/折叠手机抄表APP表详情
### 移动端表 (mobile_*)
### mobile_user_session (移动端用户会话表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| user_id | int8 | N | | 用户ID |
| device_id | varchar(100) | N | | 设备ID |
| device_type | varchar(20) | N | | 设备类型:Android、iOS |
| app_version | varchar(20) | Y | | 应用版本 |
| login_type | varchar(20) | N | | 登录类型:在线、离线 |
| session_token | varchar(500) | N | | 会话令牌 |
| login_time | timestamp(6) | N | pg_systimestamp() | 登录时间 |
| last_active_time | timestamp(6) | Y | | 最后活跃时间 |
| logout_time | timestamp(6) | Y | | 登出时间 |
| session_duration | int4 | Y | 0 | 会话时长(分钟) |
| login_ip | varchar(50) | Y | | 登录IP |
| login_location | varchar(100) | Y | | 登录位置 |
| network_type | varchar(20) | Y | | 网络类型:WiFi、4G、5G |
| session_status | int2 | N | 1 | 会话状态:0-已结束,1-活跃 |
| sync_status | int2 | N | 0 | 同步状态:0-未同步,1-已同步 |
| last_sync_time | timestamp(6) | Y | | 最后同步时间 |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_user_cache (移动端用户缓存表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| user_id | int8 | N | | 用户ID |
| device_id | varchar(100) | N | | 设备ID |
| cache_key | varchar(200) | N | | 缓存键 |
| cache_value | text | Y | | 缓存值 |
| cache_type | varchar(20) | N | | 缓存类型:用户信息、权限、配置、数据 |
| cache_size | int4 | Y | 0 | 缓存大小(字节) |
| expire_time | timestamp(6) | Y | | 过期时间 |
| access_count | int4 | Y | 0 | 访问次数 |
| last_access_time | timestamp(6) | Y | | 最后访问时间 |
| cache_status | int2 | N | 1 | 缓存状态:0-已过期,1-有效 |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_login_log (移动端登录日志表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| user_id | int8 | N | | 用户ID |
| username | varchar(50) | N | | 用户名 |
| device_id | varchar(100) | N | | 设备ID |
| device_type | varchar(20) | N | | 设备类型:Android、iOS |
| device_model | varchar(100) | Y | | 设备型号 |
| app_version | varchar(20) | Y | | 应用版本 |
| login_type | varchar(20) | N | | 登录类型:在线、离线 |
| login_time | timestamp(6) | N | pg_systimestamp() | 登录时间 |
| login_result | int2 | N | | 登录结果:0-成功,1-失败 |
| login_ip | varchar(50) | Y | | 登录IP |
| login_location | varchar(100) | Y | | 登录位置 |
| network_type | varchar(20) | Y | | 网络类型:WiFi、4G、5G |
| failure_reason | varchar(200) | Y | | 失败原因 |
| user_agent | varchar(500) | Y | | 用户代理 |
| screen_resolution | varchar(20) | Y | | 屏幕分辨率 |
| operating_system | varchar(50) | Y | | 操作系统 |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_reading_task (移动端抄表任务表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| task_no | varchar(32) | N | | 任务编号 |
| book_id | int8 | N | | 册本ID |
| reader_id | int8 | N | | 抄表员ID |
| task_date | date | N | | 任务日期 |
| total_meters | int4 | Y | 0 | 总表数 |
| completed_meters | int4 | Y | 0 | 已完成表数 |
| task_status | int2 | N | 0 | 任务状态:0-待开始,1-进行中,2-已完成 |
| download_time | timestamp(6) | Y | | 下载时间 |
| upload_time | timestamp(6) | Y | | 上传时间 |
| sync_status | int2 | N | 0 | 同步状态:0-未同步,1-已同步 |
| completion_rate | numeric(5,2) | Y | 0 | 完成率 |
| start_time | timestamp(6) | Y | | 开始时间 |
| end_time | timestamp(6) | Y | | 结束时间 |
| work_duration | int4 | Y | 0 | 工作时长(分钟) |
| exception_count | int4 | Y | 0 | 异常数量 |
| photo_count | int4 | Y | 0 | 照片数量 |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_reading_record (移动端抄表记录表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| task_id | int8 | N | | 任务ID |
| customer_id | int8 | N | | 客户ID |
| meter_id | int8 | N | | 水表ID |
| reading_value | numeric(15,3) | Y | 0 | 抄表读数 |
| reading_time | timestamp(6) | N | pg_systimestamp() | 抄表时间 |
| reading_type | varchar(20) | N | | 抄表类型:正常、异常、估读 |
| exception_code | varchar(10) | Y | | 异常代码 |
| exception_description | varchar(500) | Y | | 异常描述 |
| photo_path | varchar(500) | Y | | 照片路径 |
| gps_longitude | numeric(10,6) | Y | | GPS经度 |
| gps_latitude | numeric(10,6) | Y | | GPS纬度 |
| location_accuracy | numeric(8,2) | Y | | 位置精度 |
| reading_method | varchar(20) | Y | | 抄表方式:手工、扫码、拍照识别 |
| sync_status | int2 | N | 0 | 同步状态:0-未同步,1-已同步 |
| sync_time | timestamp(6) | Y | | 同步时间 |
| network_type | varchar(20) | Y | | 网络类型:WiFi、4G、5G、离线 |
| device_id | varchar(100) | Y | | 设备ID |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_task_progress (移动端任务进度表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| task_id | int8 | N | | 任务ID |
| user_id | int8 | N | | 用户ID |
| progress_time | timestamp(6) | N | pg_systimestamp() | 进度时间 |
| completed_count | int4 | Y | 0 | 已完成数量 |
| total_count | int4 | Y | 0 | 总数量 |
| completion_rate | numeric(5,2) | Y | 0 | 完成率 |
| current_location | varchar(200) | Y | | 当前位置 |
| working_status | varchar(20) | Y | | 工作状态:工作中、休息中、结束 |
| progress_description | varchar(500) | Y | | 进度描述 |
| device_id | varchar(100) | Y | | 设备ID |
| battery_level | int4 | Y | 0 | 电池电量 |
| network_status | varchar(20) | Y | | 网络状态:在线、离线 |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_data_cache (移动端数据缓存表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| user_id | int8 | N | | 用户ID |
| device_id | varchar(100) | N | | 设备ID |
| data_type | varchar(20) | N | | 数据类型:抄表、收费、工单 |
| data_key | varchar(200) | N | | 数据键 |
| data_value | text | Y | | 数据值 |
| data_size | int4 | Y | 0 | 数据大小(字节) |
| cache_time | timestamp(6) | N | pg_systimestamp() | 缓存时间 |
| sync_status | int2 | N | 0 | 同步状态:0-未同步,1-已同步,2-同步失败 |
| sync_time | timestamp(6) | Y | | 同步时间 |
| sync_error | varchar(500) | Y | | 同步错误 |
| retry_count | int4 | Y | 0 | 重试次数 |
| priority | int4 | Y | 0 | 优先级 |
| expire_time | timestamp(6) | Y | | 过期时间 |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_problem_report (移动端问题上报表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| report_no | varchar(32) | N | | 上报编号 |
| reporter_id | int8 | N | | 上报人ID |
| problem_type | varchar(20) | N | | 问题类型:水表故障、管道漏水、水质问题 |
| problem_description | text | N | | 问题描述 |
| problem_location | varchar(200) | Y | | 问题位置 |
| gps_longitude | numeric(10,6) | Y | | GPS经度 |
| gps_latitude | numeric(10,6) | Y | | GPS纬度 |
| urgency_level | varchar(20) | N | | 紧急程度:普通、紧急、特急 |
| report_time | timestamp(6) | N | pg_systimestamp() | 上报时间 |
| problem_photos | text | Y | | 问题照片 |
| problem_status | int2 | N | 0 | 问题状态:0-待处理,1-处理中,2-已处理 |
| handler | varchar(100) | Y | | 处理人 |
| handle_time | timestamp(6) | Y | | 处理时间 |
| handle_result | varchar(500) | Y | | 处理结果 |
| customer_id | int8 | Y | | 客户ID |
| meter_id | int8 | Y | | 水表ID |
| device_id | varchar(100) | Y | | 设备ID |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### mobile_work_order (移动端工单表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | int8 | N | nextval() | 主键 |
| work_order_no | varchar(32) | N | | 工单编号 |
| problem_report_id | int8 | Y | | 问题上报ID |
| work_order_type | varchar(20) | N | | 工单类型:维修、更换、检查 |
| assigned_user | varchar(100) | Y | | 指派人员 |
| assignment_time | timestamp(6) | Y | | 指派时间 |
| work_description | text | Y | | 工作描述 |
| work_location | varchar(200) | Y | | 工作位置 |
| scheduled_time | timestamp(6) | Y | | 预约时间 |
| start_time | timestamp(6) | Y | | 开始时间 |
| end_time | timestamp(6) | Y | | 结束时间 |
| work_duration | int4 | Y | 0 | 工作时长(分钟) |
| work_status | int2 | N | 0 | 工单状态:0-待处理,1-处理中,2-已完成 |
| work_result | varchar(500) | Y | | 工作结果 |
| completion_photos | text | Y | | 完成照片 |
| customer_signature | varchar(500) | Y | | 客户签名 |
| satisfaction_rating | int2 | Y | | 满意度评分:1-5分 |
| device_id | varchar(100) | Y | | 设备ID |
| sync_status | int2 | N | 0 | 同步状态:0-未同步,1-已同步 |
| sync_time | timestamp(6) | Y | | 同步时间 |
| remark | varchar(500) | Y | | 备注 |
| create_time | timestamp(6) | N | pg_systimestamp() | 创建时间 |
| update_time | timestamp(6) | N | pg_systimestamp() | 更新时间 |
| creator | varchar(100) | Y | | 创建人id |
| updater | varchar(100) | Y | | 更新人id |
| deleted | int2 | N | 0 | 是否删除 |
| tenant_id | int8 | N | 0 | 租户id |
### 移动端特有表(优化后)
根据移动端表设计优化原则,以下为移动端特有的5个表:
### mobile_user_cache (移动端用户缓存表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | bigint | N | AUTO_INCREMENT | 主键 |
| user_id | bigint | N | | 用户ID,关联system_users.id |
| device_id | varchar(100) | N | | 设备唯一标识 |
| cache_data | longtext | Y | | 缓存数据(JSON格式) |
| cache_type | varchar(50) | N | | 缓存类型:user_info、task_data、config_data |
| expire_time | datetime | Y | | 过期时间 |
| version | int | N | 1 | 版本号,用于数据同步 |
| create_time | datetime | N | CURRENT_TIMESTAMP | 创建时间 |
| update_time | datetime | N | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
| creator | varchar(64) | Y | | 创建者 |
| updater | varchar(64) | Y | | 更新者 |
| deleted | tinyint | N | 0 | 是否删除:0-未删除,1-已删除 |
| tenant_id | bigint | N | 0 | 租户ID |
### mobile_search_history (移动端搜索历史表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | bigint | N | AUTO_INCREMENT | 主键 |
| user_id | bigint | N | | 用户ID,关联system_users.id |
| search_keyword | varchar(200) | N | | 搜索关键词 |
| search_type | varchar(50) | N | | 搜索类型:customer、meter、address |
| search_result_count | int | N | 0 | 搜索结果数量 |
| search_time | datetime | N | CURRENT_TIMESTAMP | 搜索时间 |
| device_id | varchar(100) | Y | | 设备ID |
| create_time | datetime | N | CURRENT_TIMESTAMP | 创建时间 |
| update_time | datetime | N | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
| creator | varchar(64) | Y | | 创建者 |
| updater | varchar(64) | Y | | 更新者 |
| deleted | tinyint | N | 0 | 是否删除:0-未删除,1-已删除 |
| tenant_id | bigint | N | 0 | 租户ID |
### mobile_task_sync (移动端任务同步表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | bigint | N | AUTO_INCREMENT | 主键 |
| user_id | bigint | N | | 用户ID,关联system_users.id |
| task_id | bigint | N | | 任务ID,关联biz_meter_book.id |
| sync_status | varchar(20) | N | pending | 同步状态:pending、syncing、completed、failed |
| sync_type | varchar(20) | N | | 同步类型:download、upload |
| data_size | int | N | 0 | 数据大小(字节) |
| sync_progress | decimal(5,2) | N | 0.00 | 同步进度(百分比) |
| error_message | text | Y | | 错误信息 |
| last_sync_time | datetime | Y | | 最后同步时间 |
| retry_count | int | N | 0 | 重试次数 |
| device_id | varchar(100) | Y | | 设备ID |
| create_time | datetime | N | CURRENT_TIMESTAMP | 创建时间 |
| update_time | datetime | N | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
| creator | varchar(64) | Y | | 创建者 |
| updater | varchar(64) | Y | | 更新者 |
| deleted | tinyint | N | 0 | 是否删除:0-未删除,1-已删除 |
| tenant_id | bigint | N | 0 | 租户ID |
### mobile_work_attachment (移动端工单附件表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | bigint | N | AUTO_INCREMENT | 主键 |
| work_order_id | bigint | N | | 工单ID,关联biz_process.id 或 biz_content.id |
| attachment_type | varchar(20) | N | | 附件类型:image、video、document |
| attachment_name | varchar(200) | N | | 附件名称 |
| attachment_path | varchar(500) | N | | 附件存储路径 |
| attachment_size | bigint | N | 0 | 附件大小(字节) |
| mime_type | varchar(100) | Y | | MIME类型 |
| upload_status | varchar(20) | N | pending | 上传状态:pending、uploading、completed、failed |
| upload_progress | decimal(5,2) | N | 0.00 | 上传进度(百分比) |
| gps_longitude | decimal(10,6) | Y | | GPS经度 |
| gps_latitude | decimal(10,6) | Y | | GPS纬度 |
| capture_time | datetime | Y | | 拍摄/录制时间 |
| device_id | varchar(100) | Y | | 设备ID |
| create_time | datetime | N | CURRENT_TIMESTAMP | 创建时间 |
| update_time | datetime | N | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
| creator | varchar(64) | Y | | 创建者 |
| updater | varchar(64) | Y | | 更新者 |
| deleted | tinyint | N | 0 | 是否删除:0-未删除,1-已删除 |
| tenant_id | bigint | N | 0 | 租户ID |
### mobile_app_config (移动端应用配置表)
| 字段名 | 类型 | 是否可空 | 默认值 | 注释 |
| :--- | :--- | :--- | :--- | :--- |
| id | bigint | N | AUTO_INCREMENT | 主键 |
| user_id | bigint | N | | 用户ID,关联system_users.id |
| config_key | varchar(100) | N | | 配置项键名 |
| config_value | text | Y | | 配置项值 |
| config_type | varchar(50) | N | | 配置类型:system、user、app |
| config_description | varchar(500) | Y | | 配置描述 |
| is_active | tinyint | N | 1 | 是否启用:0-禁用,1-启用 |
| device_id | varchar(100) | Y | | 设备ID |
| create_time | datetime | N | CURRENT_TIMESTAMP | 创建时间 |
| update_time | datetime | N | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
| creator | varchar(64) | Y | | 创建者 |
| updater | varchar(64) | Y | | 更新者 |
| deleted | tinyint | N | 0 | 是否删除:0-未删除,1-已删除 |
| tenant_id | bigint | N | 0 | 租户ID |
# 移动端表设计优化说明
## 设计原则
根据系统架构设计原则,移动端优先使用Web端已有的数据表,避免重复建表,确保数据一致性和降低维护成本。
## 表复用策略
### 复用Web端表(10个)
移动端直接复用以下Web端已有表:
| 表名 | 用途说明 | 备注 |
|------|----------|------|
| `system_users` | 用户基本信息表 | 复用Web端用户管理 |
| `system_login_log` | 登录日志表 | 扩展设备类型字段记录移动端登录 |
| `biz_cust` | 客户主档表 | 复用 Web 端客户档案 |
| `biz_meter` | 水表主档表 | 复用 Web 端水表档案 |
| `biz_meter_book` | 抄表册本表 | 复用 Web 端抄表任务 |
| `biz_reading_data` | 抄表数据表 | 复用 Web 端抄表数据 |
| `biz_meter_read` | 抄表任务/状态表 | 复用 Web 端抄表过程状态 |
| `biz_process` | 业务办理流程表 | 复用 Web 端现场业务工单/办理数据 |
| `biz_content_attach` | 办理附件表 | 复用 Web 端附件资料 |
| `biz_account` | 客户账户表 | 复用 Web 端账务信息 |
### 移动端特有表(5个)
仅保留移动端特有的功能表:
| 表名 | 用途说明 | 特有原因 |
|------|----------|----------|
| `mobile_user_cache` | 移动端用户缓存表 | 用于离线缓存,移动端特有需求 |
| `mobile_search_history` | 移动端搜索历史表 | 移动端搜索记录管理 |
| `mobile_task_sync` | 移动端任务同步表 | 离线任务管理,移动端特有 |
| `mobile_work_attachment` | 移动端工单附件表 | 现场附件管理,移动端特有 |
| `mobile_app_config` | 移动端应用配置表 | 个性化设置,移动端特有 |
## 优化效果
1. **减少冗余**:避免了15+个重复表的创建
2. **提升一致性**:移动端和Web端共享核心业务数据
3. **降低维护成本**:统一的数据模型减少维护复杂度
4. **符合架构原则**:遵循DRY(Don't Repeat Yourself)原则
## 数据同步策略
- **实时同步**:共用表自然保证数据一致性
- **离线缓存**:移动端特有表支持离线操作
- **冲突处理**:通过时间戳和版本控制处理数据冲突
# 视图的设计
## 数据库ER图设计
### 系统核心表关系图
```mermaid
erDiagram
system_tenant ||--o{ system_users : "租户关系"
system_users ||--o{ system_user_role : "用户角色"
system_role ||--o{ system_user_role : "角色用户"
system_role ||--o{ system_role_menu : "角色权限"
system_menu ||--o{ system_role_menu : "菜单权限"
system_dept ||--o{ system_users : "部门用户"
system_tenant {
int8 id PK
varchar name
varchar contact_name
varchar contact_mobile
int2 status
timestamp expire_time
}
system_users {
int8 id PK
varchar username
varchar nickname
varchar password
int8 dept_id FK
int8 tenant_id FK
int2 status
}
system_role {
int8 id PK
varchar name
varchar code
int2 data_scope
int8 tenant_id FK
}
system_dept {
int8 id PK
varchar name
int8 parent_id
varchar code
int8 tenant_id FK
}
```
### 业务核心表关系图
```mermaid
erDiagram
BIZ_CUST ||--|| BIZ_ACCOUNT : 对应账户
BIZ_CUST ||--o{ BIZ_CUST_CONTACT : 联系人
BIZ_CUST ||--o{ BIZ_CUST_METER : 绑定水表
BIZ_METER ||--o{ BIZ_CUST_METER : 被绑定
BIZ_METER_BOOK ||--o{ BIZ_METER_READ : 生成任务
BIZ_METER_READ ||--o{ BIZ_READING_DATA : 采集读数
BIZ_METER ||--o{ BIZ_LAST_READING : 最新读数
BIZ_READING_DATA ||--o{ BIZ_CHARGE : 触发开账
BIZ_CHARGE ||--o{ BIZ_CHARGE_DETAIL : 明细拆分
BIZ_CHARGE ||--o{ BIZ_INVOICE : 开票关联
BIZ_CHARGE ||--o{ BK_TRANSACTION : 支付核销
BIZ_PRICE_CATEGORY ||--o{ BIZ_PRICE_TEMPLATE : 模板归属
BIZ_PRICE_TEMPLATE ||--o{ BIZ_WATER_USE_SCHEME : 计费方案
BIZ_PRICE_CATEGORY ||--o{ BIZ_PRICE_COST_ADJUSTMENT : 费用调整
BIZ_PRICE_COST_ADJUSTMENT ||--o{ BIZ_PRICE_TIER_ADJUSTMENT : 阶梯规则
BK_WITHHOLDING_BATCH ||--o{ BK_WITHHOLDING_ITEM : 批次明细
BK_RECONCILE_BATCH ||--o{ BK_RECONCILE_DIFF : 对账差异
BIZ_CUST {
int8 id PK
varchar code
varchar name
varchar cust_type
varchar mobile
int8 tenant_id FK
}
BIZ_ACCOUNT {
int8 id PK
varchar code
int8 cust_id FK
numeric balance
numeric arrears_amount
}
BIZ_METER {
int8 id PK
varchar code
varchar meter_no
varchar maker_code
varchar model_code
}
BIZ_CHARGE {
int8 id PK
varchar code
int8 cust_id FK
varchar bill_period
numeric total_amount
int2 charge_status
}
BK_TRANSACTION {
int8 id PK
varchar trade_no
varchar biz_order_no
varchar channel_code
numeric trade_amount
int2 trade_status
}
```
## 业务视图设计
为简化复杂查询和报表统计,设计以下视图:
### v_price_info (价格信息视图)
综合展示价格体系信息,包含价格归属、费用组成、调整历史等。
```sql
CREATE VIEW v_price_info AS
SELECT
pc.id as category_id,
pc.name as category_name,
pc.code as category_code,
cc.name as cost_name,
cc.code as cost_code,
pca.price_value,
pca.effective_date,
pca.expire_date
FROM biz_price_category pc
LEFT JOIN biz_price_cost_adjustment pca ON pc.code = pca.price_category_code
LEFT JOIN biz_cost_component cc ON pca.cost_component_code = cc.code
WHERE pc.deleted = 0 AND pca.deleted = 0 AND cc.deleted = 0;
```
### v_meter_info (水表信息视图)
整合水表主档、厂家、型号、口径等基础信息,服务于册本分配、现场抄表和档案查询。
```sql
CREATE VIEW v_meter_info AS
SELECT
m.id AS meter_id,
m.code AS meter_code,
m.meter_no,
m.maker_code,
maker.name AS maker_name,
m.model_code,
model.name AS model_name,
m.caliber_code,
caliber.name AS caliber_name,
caliber.value AS caliber_value,
m.range_code,
range_cfg.name AS range_name,
m.install_address,
m.meter_status
FROM biz_meter m
LEFT JOIN biz_meter_maker maker ON m.maker_code = maker.code AND maker.deleted = 0
LEFT JOIN biz_meter_model model ON m.model_code = model.code AND model.deleted = 0
LEFT JOIN biz_meter_caliber caliber ON m.caliber_code = caliber.code AND caliber.deleted = 0
LEFT JOIN biz_meter_range range_cfg ON m.range_code = range_cfg.code AND range_cfg.deleted = 0
WHERE m.deleted = 0;
```
### v_dept_hierarchy (部门层级视图)
展示完整的组织架构层级关系。
```sql
CREATE VIEW v_dept_hierarchy AS
WITH RECURSIVE dept_tree AS (
SELECT id, name, code, parent_id, 0 as level, name as path
FROM system_dept
WHERE parent_id = 0 AND deleted = 0
UNION ALL
SELECT d.id, d.name, d.code, d.parent_id, dt.level + 1,
CONCAT(dt.path, ' > ', d.name)
FROM system_dept d
INNER JOIN dept_tree dt ON d.parent_id = dt.id
WHERE d.deleted = 0
)
SELECT * FROM dept_tree;
```
## 统计分析视图
### v_tenant_summary (租户汇总视图)
按租户维度统计各类数据。
```sql
CREATE VIEW v_tenant_summary AS
SELECT
t.id as tenant_id,
t.name as tenant_name,
COUNT(DISTINCT u.id) as user_count,
COUNT(DISTINCT d.id) as dept_count,
COUNT(DISTINCT c.id) as community_count
FROM system_tenant t
LEFT JOIN system_users u ON t.id = u.tenant_id AND u.deleted = 0
LEFT JOIN system_dept d ON t.id = d.tenant_id AND d.deleted = 0
LEFT JOIN biz_community c ON t.id = c.tenant_id AND c.deleted = 0
WHERE t.deleted = 0
GROUP BY t.id, t.name;
```
### REV-007 统计承接口径
#### 设计定位
- `REV-007` 以在线业务主数据聚合、视图或汇总口径支撑经营统计查询,不在本轮确认独立统计仓库、离线批处理表或专题分析表族。
- 统计结果必须能够追溯到现有客户、账单、收费、交易、抄表和组织维度数据来源。
- 当前数据库主文档仅约束“统计查询如何承接”,不反推 backend 已存在专门统计模块或已固化全部统计视图。
#### 最小统计主题承接口径
| 统计主题 | 主数据来源 | 最低维度要求 | 最低指标要求 | 承接方式 |
| :--- | :--- | :--- | :--- | :--- |
| 营收汇总 | `biz_charge`、`biz_charge_detail` | 时间、账期、营业所、客户类别 | 应收金额、账单数、用水量 | 在线聚合 / 汇总口径 |
| 收费与实收统计 | `biz_collection`、`bk_transaction` | 时间、渠道、营业所、收费状态 | 实收金额、收费笔数、成功率 | 在线聚合 / 汇总口径 |
| 欠费规模与账龄统计 | `biz_charge`、`biz_charge_detail` | 账期、账龄、客户类别、区域 | 欠费余额、欠费户数、账龄分布 | 在线聚合 / 汇总口径 |
| 客户结构统计 | `biz_cust`、`biz_account` | 客户类别、区域、状态 | 客户数、账户数、活跃状态分布 | 在线聚合 / 视图口径 |
| 渠道交易统计 | `bk_transaction`、`bk_payment_channel` | 渠道、日期、结果状态 | 交易笔数、交易金额、渠道占比 | 在线聚合 / 汇总口径 |
| 抄表完成率统计 | `biz_meter_book`、`biz_reading_data`、`biz_last_reading` | 抄表周期、册本、片区、人员 | 应抄户数、已抄户数、完成率 | 在线聚合 / 汇总口径 |
#### 设计约束
- 统计查询可以由视图、临时汇总结果或聚合 SQL 承接,但未确认存在的 `stat_*`、`report_*` 或专题报表表不得写成正式已实现对象。
- 若某类统计仅在历史资料中出现而当前主文档未形成正式口径,应先作为后续专题保留项,不直接扩写为当前正式范围。
- 涉及历史迁移核查的统计比对时,历史来源只承担补充核对职责,不替代在线主数据统计结果。
- 导出能力属于查询扩展能力,数据库设计不单独为导出动作臆造新的物理表。
# 索引设计与性能优化
## 核心索引设计
### 系统表索引
```sql
-- 用户表核心索引
CREATE INDEX idx_system_users_username ON system_users(username);
CREATE INDEX idx_system_users_dept_tenant ON system_users(dept_id, tenant_id);
CREATE INDEX idx_system_users_status_tenant ON system_users(status, tenant_id);
-- 部门表索引
CREATE INDEX idx_system_dept_parent_tenant ON system_dept(parent_id, tenant_id);
CREATE INDEX idx_system_dept_code ON system_dept(code);
-- 角色权限索引
CREATE INDEX idx_system_user_role_user_tenant ON system_user_role(user_id, tenant_id);
CREATE INDEX idx_system_role_menu_role_id ON system_role_menu(role_id);
-- 日志表索引(支持时间范围查询)
CREATE INDEX idx_system_login_log_user_time ON system_login_log(user_id, create_time);
CREATE INDEX idx_system_login_log_ip_time ON system_login_log(user_ip, create_time);
```
### 业务表索引
```sql
-- 客户主数据索引
CREATE INDEX idx_biz_cust_code ON biz_cust(code);
CREATE INDEX idx_biz_cust_mobile ON biz_cust(mobile);
CREATE INDEX idx_biz_account_cust_status ON biz_account(cust_id, account_status);
-- 水表与抄表索引
CREATE INDEX idx_biz_meter_code ON biz_meter(code);
CREATE INDEX idx_biz_meter_book_dept_status ON biz_meter_book(dept_code, status);
CREATE INDEX idx_biz_meter_read_book_period ON biz_meter_read(book_id, read_period);
CREATE INDEX idx_biz_reading_data_read_time ON biz_reading_data(meter_read_id, read_time);
-- 开账收费索引
CREATE INDEX idx_biz_charge_cust_period ON biz_charge(cust_id, bill_period);
CREATE INDEX idx_biz_charge_status_due ON biz_charge(charge_status, due_date);
CREATE INDEX idx_biz_charge_detail_charge_cost ON biz_charge_detail(charge_id, cost_component_code);
-- 价格体系索引
CREATE INDEX idx_biz_price_category_code ON biz_price_category(code);
CREATE INDEX idx_biz_price_template_category ON biz_price_template(price_category_code, adjustment_snap_code);
CREATE INDEX idx_biz_price_cost_adj_category_cost ON biz_price_cost_adjustment(price_category_code, cost_component_code);
CREATE INDEX idx_biz_price_tier_adj_cost_tier ON biz_price_tier_adjustment(cost_component_code, tier_level);
-- 银行代收与对账索引
CREATE INDEX idx_bk_transaction_trade_no ON bk_transaction(trade_no);
CREATE INDEX idx_bk_transaction_biz_order ON bk_transaction(biz_order_no, trade_status);
CREATE INDEX idx_bk_withholding_batch_date ON bk_withholding_batch(batch_date, batch_status);
CREATE INDEX idx_bk_reconcile_batch_bill_date ON bk_reconcile_batch(bill_date, reconcile_status);
```
## 分区表设计
### 日志表分区策略
```sql
-- 登录日志按月分区
CREATE TABLE system_login_log_partition (
LIKE system_login_log INCLUDING ALL
) PARTITION BY RANGE (create_time);
-- 创建月度分区
CREATE TABLE system_login_log_y2024m01 PARTITION OF system_login_log_partition
FOR VALUES FROM ('2024-01-01') TO ('2024-02-01');
CREATE TABLE system_login_log_y2024m02 PARTITION OF system_login_log_partition
FOR VALUES FROM ('2024-02-01') TO ('2024-03-01');
```
### 历史数据分区策略
```sql
-- 价格调整历史按年分区
CREATE TABLE biz_price_adjustment_history_partition (
LIKE biz_price_adjustment_history INCLUDING ALL
) PARTITION BY RANGE (create_time);
-- 按年度分区
CREATE TABLE biz_price_adjustment_history_y2024 PARTITION OF biz_price_adjustment_history_partition
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
```
## 查询优化建议
### 多租户查询优化
```sql
-- 建议查询模式:始终带上租户ID
SELECT * FROM system_users
WHERE tenant_id = ? AND status = 0 AND dept_id = ?;
-- 使用覆盖索引减少回表
CREATE INDEX idx_system_users_cover ON system_users(tenant_id, status, dept_id)
INCLUDE (username, nickname, email);
```
### 层级查询优化
```sql
-- 使用递归CTE查询部门层级
WITH RECURSIVE dept_tree AS (
SELECT id, name, parent_id, 1 as level
FROM system_dept
WHERE id = ? AND tenant_id = ?
UNION ALL
SELECT d.id, d.name, d.parent_id, dt.level + 1
FROM system_dept d
INNER JOIN dept_tree dt ON d.parent_id = dt.id
WHERE d.tenant_id = ? AND dt.level < 10 -- 防止无限递归
)
SELECT * FROM dept_tree;
```
## 数据归档策略
### 日志数据归档
- **保留策略**: 在线保留3个月,历史数据转移到归档表
- **归档周期**: 每月执行一次归档作业
- **存储方式**: 使用列式存储优化查询性能
### 历史数据处理
```sql
-- 创建归档表
CREATE TABLE system_login_log_archive (
LIKE system_login_log INCLUDING ALL
);
-- 归档脚本示例
INSERT INTO system_login_log_archive
SELECT * FROM system_login_log
WHERE create_time < CURRENT_DATE - INTERVAL '3 months';
DELETE FROM system_login_log
WHERE create_time < CURRENT_DATE - INTERVAL '3 months';
```
# 安全保密设计
- **用户认证**: 所有数据库连接均需通过应用层的身份认证,禁止数据库密码在配置文件中明文存储。
- **权限控制**: 数据库用户权限遵循最小权限原则。应用层根据用户角色(RBAC)动态构建SQL,并通过行级安全(RLS)策略限制数据访问范围。
- **数据加密**: 对数据库中的密码、密钥等敏感信息,采用BCrypt或SM3等算法进行加密存储。
- **审计日志**: 启用数据库审计功能,记录所有DDL和DML操作,特别是对敏感数据的访问和修改。