-- ============================================
-- RentEase 租房管理系统 - 数据库表结构
-- 生成时间: 2025-01-11
-- ============================================

-- 设置字符集
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ============================================
-- 1. 租户相关表
-- ============================================

-- 租户表 (SaaS系统租户)
DROP TABLE IF EXISTS `tenants`;
CREATE TABLE `tenants` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '租户ID',
  `code` varchar(50) NOT NULL COMMENT '租户编码（唯一标识）',
  `contactName` varchar(50) DEFAULT NULL COMMENT '联系人姓名',
  `contactPhone` varchar(20) DEFAULT NULL COMMENT '联系人电话',
  `contactEmail` varchar(100) DEFAULT NULL COMMENT '联系人邮箱',
  `status` enum('active','suspended') NOT NULL DEFAULT 'active' COMMENT '租户状态：active-正常，suspended-暂停',
  `billingStatus` enum('trial_active','trial_expired','paid_active','paid_expired','suspended') NOT NULL DEFAULT 'trial_active' COMMENT '计费状态',
  `planId` int(11) DEFAULT NULL COMMENT '当前套餐ID',
  `trialStartDate` datetime DEFAULT NULL COMMENT '试用期开始日期',
  `trialEndDate` datetime DEFAULT NULL COMMENT '试用期结束日期',
  `paidStartDate` datetime DEFAULT NULL COMMENT '付费期开始日期',
  `paidEndDate` datetime DEFAULT NULL COMMENT '付费期结束日期',
  `currentPeriodStart` datetime DEFAULT NULL COMMENT '当前计费周期开始',
  `currentPeriodEnd` datetime DEFAULT NULL COMMENT '当前计费周期结束',
  `maxUsers` int(11) NOT NULL DEFAULT '10' COMMENT '最大用户数',
  `maxApartments` int(11) NOT NULL DEFAULT '5' COMMENT '最大公寓数',
  `maxRooms` int(11) NOT NULL DEFAULT '50' COMMENT '最大房间数',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`),
  KEY `idx_status` (`status`),
  KEY `idx_billing_status` (`billingStatus`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户表';

-- ============================================
-- 2. 用户权限相关表
-- ============================================

-- 用户表
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(255) NOT NULL COMMENT '密码（加密存储）',
  `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
  `avatar` varchar(255) DEFAULT NULL COMMENT '头像URL',
  `roleId` int(11) DEFAULT NULL COMMENT '角色ID',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `userType` enum('super_admin','tenant_admin','user') NOT NULL DEFAULT 'user' COMMENT '用户类型：super_admin-系统管理员，tenant_admin-租户管理员，user-普通用户',
  `status` enum('active','inactive') NOT NULL DEFAULT 'active' COMMENT '状态：active-启用，inactive-禁用',
  `lastLoginTime` datetime DEFAULT NULL COMMENT '最后登录时间',
  `lastLoginIp` varchar(50) DEFAULT NULL COMMENT '最后登录IP',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_role` (`roleId`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';

-- 角色表
DROP TABLE IF EXISTS `roles`;
CREATE TABLE `roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色ID',
  `name` varchar(50) NOT NULL COMMENT '角色名称',
  `code` varchar(50) NOT NULL COMMENT '角色编码',
  `description` varchar(255) DEFAULT NULL COMMENT '角色描述',
  `permissions` json DEFAULT NULL COMMENT '权限列表（JSON格式）',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `status` enum('active','inactive') NOT NULL DEFAULT 'active' COMMENT '状态：active-启用，inactive-禁用',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_code` (`code`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表';

-- 菜单表
DROP TABLE IF EXISTS `menus`;
CREATE TABLE `menus` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单ID',
  `parentId` int(11) DEFAULT NULL COMMENT '父菜单ID',
  `name` varchar(50) NOT NULL COMMENT '菜单名称',
  `code` varchar(50) NOT NULL COMMENT '菜单编码',
  `type` enum('menu','button') NOT NULL DEFAULT 'menu' COMMENT '类型：menu-菜单，button-按钮',
  `path` varchar(100) DEFAULT NULL COMMENT '路由路径',
  `component` varchar(100) DEFAULT NULL COMMENT '组件路径',
  `icon` varchar(50) DEFAULT NULL COMMENT '图标',
  `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序号',
  `visible` enum('show','hide') NOT NULL DEFAULT 'show' COMMENT '是否可见：show-显示，hide-隐藏',
  `status` enum('active','inactive') NOT NULL DEFAULT 'active' COMMENT '状态：active-启用，inactive-禁用',
  `isBasic` int(11) NOT NULL DEFAULT '0' COMMENT '是否基础菜单（0：否，1：是），新租户默认分配基础菜单',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_parent` (`parentId`),
  KEY `idx_code` (`code`),
  KEY `idx_type` (`type`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表';

-- 角色菜单关联表
DROP TABLE IF EXISTS `role_menus`;
CREATE TABLE `role_menus` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `roleId` int(11) NOT NULL COMMENT '角色ID',
  `menuId` int(11) NOT NULL COMMENT '菜单ID',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_role_menu` (`roleId`,`menuId`),
  KEY `idx_menu` (`menuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关联表';

-- 操作日志表
DROP TABLE IF EXISTS `operation_logs`;
CREATE TABLE `operation_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志ID',
  `userId` int(11) DEFAULT NULL COMMENT '用户ID',
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `module` varchar(50) NOT NULL DEFAULT '' COMMENT '操作模块',
  `action` varchar(50) NOT NULL DEFAULT '' COMMENT '操作类型',
  `description` text COMMENT '操作描述',
  `method` varchar(10) DEFAULT NULL COMMENT '请求方法',
  `url` varchar(500) DEFAULT NULL COMMENT '请求URL',
  `ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
  `params` text COMMENT '请求参数',
  `result` text COMMENT '操作结果',
  `status` enum('success','fail') NOT NULL DEFAULT 'success' COMMENT '操作状态',
  `duration` int(11) DEFAULT NULL COMMENT '执行时长(毫秒)',
  `tenantId` int(11) DEFAULT NULL COMMENT '租户ID',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user` (`userId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_createTime` (`createTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日志表';

-- 登录日志表
DROP TABLE IF EXISTS `login_logs`;
CREATE TABLE `login_logs` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '日志ID',
  `userId` int(11) DEFAULT NULL COMMENT '用户ID',
  `username` varchar(50) DEFAULT NULL COMMENT '用户名',
  `loginType` enum('login','logout') NOT NULL DEFAULT 'login' COMMENT '登录类型',
  `ip` varchar(50) DEFAULT NULL COMMENT 'IP地址',
  `userAgent` text COMMENT '浏览器信息',
  `status` enum('success','fail') NOT NULL DEFAULT 'success' COMMENT '登录状态',
  `message` varchar(255) DEFAULT NULL COMMENT '登录信息/失败原因',
  `tenantId` int(11) DEFAULT NULL COMMENT '租户ID',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_user` (`userId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_createTime` (`createTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='登录日志表';

-- ============================================
-- 3. 房源相关表
-- ============================================

-- 公寓表
DROP TABLE IF EXISTS `apartments`;
CREATE TABLE `apartments` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '公寓ID',
  `name` varchar(100) NOT NULL COMMENT '公寓名称',
  `address` varchar(200) DEFAULT NULL COMMENT '地址',
  `description` text COMMENT '描述',
  `status` enum('active','inactive') NOT NULL DEFAULT 'active' COMMENT '状态：active-启用，inactive-禁用',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='公寓表';

-- 房间表
DROP TABLE IF EXISTS `rooms`;
CREATE TABLE `rooms` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '房间ID',
  `apartmentId` int(11) NOT NULL COMMENT '所属公寓ID',
  `roomNumber` varchar(50) NOT NULL COMMENT '房间号',
  `floor` int(11) DEFAULT NULL COMMENT '楼层',
  `roomType` varchar(50) DEFAULT NULL COMMENT '户型（如一室一厅、两室一厅等）',
  `area` decimal(10,2) DEFAULT NULL COMMENT '面积（平方米）',
  `orientation` varchar(20) DEFAULT NULL COMMENT '朝向',
  `monthlyPrice` decimal(10,2) DEFAULT NULL COMMENT '月租金',
  `yearlyPrice` decimal(10,2) DEFAULT NULL COMMENT '年租金',
  `deposit` decimal(10,2) DEFAULT NULL COMMENT '押金',
  `description` text COMMENT '描述',
  `sortOrder` int(11) NOT NULL DEFAULT '0' COMMENT '排序字段',
  `status` enum('empty','reserved','rented') NOT NULL DEFAULT 'empty' COMMENT '状态：empty-空置，reserved-预定，rented-已租',
  `rentalStatus` enum('normal','soon_expire','expired') DEFAULT 'normal' COMMENT '租约状态',
  `tenantId` int(11) NOT NULL COMMENT '所属租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_apartment` (`apartmentId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_status` (`status`),
  KEY `idx_rental_status` (`rentalStatus`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='房间表';

-- ============================================
-- 4. 租赁相关表
-- ============================================

-- 租赁表
DROP TABLE IF EXISTS `rentals`;
CREATE TABLE `rentals` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '租赁ID',
  `roomId` int(11) NOT NULL COMMENT '房间ID',
  `renterId` int(11) NOT NULL COMMENT '租客ID',
  `startDate` date NOT NULL COMMENT '开始日期',
  `endDate` date NOT NULL COMMENT '结束日期',
  `rent` decimal(10,2) NOT NULL COMMENT '租金',
  `deposit` decimal(10,2) DEFAULT NULL COMMENT '押金',
  `paymentType` enum('monthly','quarterly','half_year','yearly') NOT NULL DEFAULT 'monthly' COMMENT '付租方式',
  `status` enum('active','expired','terminated') NOT NULL DEFAULT 'active' COMMENT '状态：active-有效，expired-到期，terminated-提前终止',
  `operator` varchar(50) DEFAULT NULL COMMENT '经办人',
  `remark` text COMMENT '备注',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_room` (`roomId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_status` (`status`),
  KEY `idx_dates` (`startDate`,`endDate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租赁表';

-- 租客表
DROP TABLE IF EXISTS `renters`;
CREATE TABLE `renters` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '租客ID',
  `name` varchar(50) NOT NULL COMMENT '姓名',
  `phone` varchar(20) DEFAULT NULL COMMENT '电话',
  `idCard` varchar(18) DEFAULT NULL COMMENT '身份证号',
  `status` enum('active','inactive') NOT NULL DEFAULT 'active' COMMENT '状态：active-正常，inactive-已退房',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_phone` (`phone`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租客表';

-- ============================================
-- 5. 财务相关表
-- ============================================

-- 账单表（统一账单管理）
DROP TABLE IF EXISTS `bills`;
CREATE TABLE `bills` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '账单ID',
  `billNo` varchar(50) NOT NULL COMMENT '账单编号',
  `roomId` int(11) DEFAULT NULL COMMENT '房间ID（可选）',
  `renterId` int(11) DEFAULT NULL COMMENT '租客ID（可选）',
  `rentalId` int(11) DEFAULT NULL COMMENT '租赁ID（可选）',
  `type` enum('income','expense') NOT NULL COMMENT '账单类型：income-收入，expense-支出',
  `category` varchar(50) NOT NULL COMMENT '分类：rent-租金, water-水费, electricity-电费, gas-燃气费, deposit-押金, maintenance-维修费, property_fee-物业费, agency_fee-中介费, penalty-违约金, other_income-其他收入, other_expense-其他支出',
  `receivableAmount` decimal(10,2) NOT NULL COMMENT '应收金额',
  `receivedAmount` decimal(10,2) DEFAULT '0.00' COMMENT '已收金额',
  `status` enum('unpaid','partial','paid','cancelled') NOT NULL DEFAULT 'unpaid' COMMENT '状态：unpaid-未收, partial-部分收款, paid-已收清, cancelled-已取消',
  `billMonth` varchar(7) DEFAULT NULL COMMENT '账单月份（格式：YYYY-MM）',
  `billDate` date NOT NULL COMMENT '账单日期',
  `sourceType` varchar(50) DEFAULT NULL COMMENT '来源类型：meter_reading-抄表记录',
  `sourceId` int(11) DEFAULT NULL COMMENT '来源ID',
  `paymentMethod` varchar(50) DEFAULT NULL COMMENT '支付方式：cash-现金, bank_transfer-银行转账, alipay-支付宝, wechat-微信支付',
  `remark` text COMMENT '备注',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `billNo` (`billNo`),
  KEY `idx_room` (`roomId`),
  KEY `idx_renter` (`renterId`),
  KEY `idx_rental` (`rentalId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_status` (`status`),
  KEY `idx_type` (`type`),
  KEY `idx_category` (`category`),
  KEY `idx_bill_month` (`billMonth`),
  KEY `idx_source` (`sourceType`,`sourceId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='统一账单表';

-- 账单支付流水表
DROP TABLE IF EXISTS `bill_payments`;
CREATE TABLE `bill_payments` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '支付流水ID',
  `billId` int(11) NOT NULL COMMENT '账单ID',
  `amount` decimal(10,2) NOT NULL COMMENT '本次支付金额',
  `paymentMethod` enum('cash','bank_transfer','alipay','wechat','other') NOT NULL COMMENT '支付方式：cash-现金, bank_transfer-银行转账, alipay-支付宝, wechat-微信支付, other-其他',
  `paymentTime` datetime NOT NULL COMMENT '支付时间',
  `transactionNo` varchar(100) DEFAULT NULL COMMENT '交易流水号/凭证号',
  `remark` text COMMENT '备注',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  KEY `idx_bill` (`billId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_payment_time` (`paymentTime`),
  KEY `idx_payment_method` (`paymentMethod`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='账单支付流水表';

-- 抄表记录表（水电气）
DROP TABLE IF EXISTS `meter_readings`;
CREATE TABLE `meter_readings` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '记录ID',
  `roomId` int(11) NOT NULL COMMENT '房间ID',
  `renterId` int(11) DEFAULT NULL COMMENT '租客ID（可选）',
  `rentalId` int(11) DEFAULT NULL COMMENT '租赁ID（可选）',
  `meterType` enum('water','electricity','gas') NOT NULL COMMENT '表类型：water-水表, electricity-电表, gas-燃气表',
  `previousReading` decimal(10,2) NOT NULL COMMENT '上期读数',
  `currentReading` decimal(10,2) NOT NULL COMMENT '本期读数',
  `usage` decimal(10,2) NOT NULL COMMENT '用量',
  `unitPrice` decimal(10,2) NOT NULL COMMENT '单价',
  `amount` decimal(10,2) NOT NULL COMMENT '金额',
  `billMonth` varchar(7) NOT NULL COMMENT '账单月份（格式：YYYY-MM）',
  `readingDate` date NOT NULL COMMENT '抄表日期',
  `billId` int(11) DEFAULT NULL COMMENT '关联账单ID',
  `remark` text COMMENT '备注',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_room` (`roomId`),
  KEY `idx_renter` (`renterId`),
  KEY `idx_rental` (`rentalId`),
  KEY `idx_meter_type` (`meterType`),
  KEY `idx_bill_month` (`billMonth`),
  KEY `idx_bill` (`billId`),
  KEY `idx_tenant` (`tenantId`),
  UNIQUE KEY `uk_room_type_month` (`roomId`, `meterType`, `billMonth`, `tenantId`, `isDeleted`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='抄表记录表（水电气）';

-- 交易记录表
DROP TABLE IF EXISTS `transactions`;
CREATE TABLE `transactions` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '交易ID',
  `billId` int(11) DEFAULT NULL COMMENT '账单ID',
  `roomId` int(11) DEFAULT NULL COMMENT '房间ID',
  `renterId` int(11) DEFAULT NULL COMMENT '租客ID',
  `type` enum('income','expense') NOT NULL COMMENT '类型：income-收入，expense-支出',
  `category` varchar(50) NOT NULL COMMENT '分类',
  `amount` decimal(10,2) NOT NULL COMMENT '金额',
  `paymentMethod` enum('cash','bank_transfer','alipay','wechat') DEFAULT NULL COMMENT '支付方式',
  `transactionDate` date NOT NULL COMMENT '交易日期',
  `remark` text COMMENT '备注',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_bill` (`billId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_type` (`type`),
  KEY `idx_date` (`transactionDate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='交易记录表';

-- ============================================
-- 6. 订阅计费相关表
-- ============================================

-- 订阅套餐表
DROP TABLE IF EXISTS `subscription_plans`;
CREATE TABLE `subscription_plans` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '套餐ID',
  `code` varchar(50) NOT NULL COMMENT '套餐编码',
  `name` varchar(100) NOT NULL COMMENT '套餐名称',
  `description` text COMMENT '套餐描述',
  `maxApartments` int(11) NOT NULL DEFAULT '0' COMMENT '最大公寓数（0表示无限制）',
  `maxRooms` int(11) NOT NULL DEFAULT '0' COMMENT '最大房间数（0表示无限制）',
  `maxUsers` int(11) NOT NULL DEFAULT '0' COMMENT '最大用户数（0表示无限制）',
  `monthlyPrice` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '月价格',
  `yearlyPrice` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '年价格',
  `isDefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认套餐（0：否，1：是）',
  `status` enum('active','inactive') NOT NULL DEFAULT 'active' COMMENT '状态',
  `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `code` (`code`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订阅套餐表';

-- 租户资源使用表
DROP TABLE IF EXISTS `tenant_resource_usage`;
CREATE TABLE `tenant_resource_usage` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `currentApartments` int(11) NOT NULL DEFAULT '0' COMMENT '当前公寓数',
  `currentRooms` int(11) NOT NULL DEFAULT '0' COMMENT '当前房间数',
  `currentUsers` int(11) NOT NULL DEFAULT '0' COMMENT '当前用户数',
  `recordDate` date NOT NULL COMMENT '记录日期',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_tenant_date` (`tenantId`,`recordDate`),
  KEY `idx_tenant` (`tenantId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户资源使用表';

-- 租户计费明细表
DROP TABLE IF EXISTS `tenant_billing_details`;
CREATE TABLE `tenant_billing_details` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `billingPeriod` varchar(7) NOT NULL COMMENT '计费周期（格式：YYYY-MM）',
  `planId` int(11) DEFAULT NULL COMMENT '套餐ID',
  `baseAmount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '基础费用',
  `extraAmount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '超额费用',
  `discountAmount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '优惠金额',
  `totalAmount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '总计金额',
  `status` enum('pending','paid','overdue') NOT NULL DEFAULT 'pending' COMMENT '状态',
  `paidTime` datetime DEFAULT NULL COMMENT '支付时间',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_tenant_period` (`tenantId`,`billingPeriod`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='租户计费明细表';

-- 订单表
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单ID',
  `orderNo` varchar(50) NOT NULL COMMENT '订单编号',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `planId` int(11) NOT NULL COMMENT '套餐ID',
  `planName` varchar(100) NOT NULL COMMENT '套餐名称',
  `months` int(11) NOT NULL DEFAULT '1' COMMENT '购买月数',
  `amount` decimal(10,2) NOT NULL COMMENT '订单金额',
  `discountAmount` decimal(10,2) DEFAULT '0.00' COMMENT '优惠金额',
  `actualAmount` decimal(10,2) NOT NULL COMMENT '实付金额',
  `status` enum('pending','paid','cancelled') NOT NULL DEFAULT 'pending' COMMENT '状态：pending-待支付，paid-已支付，cancelled-已取消',
  `paidTime` datetime DEFAULT NULL COMMENT '支付时间',
  `expireTime` datetime NOT NULL COMMENT '过期时间',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `orderNo` (`orderNo`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单表';

-- 支付记录表
DROP TABLE IF EXISTS `payments`;
CREATE TABLE `payments` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '支付ID',
  `orderId` int(11) NOT NULL COMMENT '订单ID',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `amount` decimal(10,2) NOT NULL COMMENT '支付金额',
  `paymentMethod` enum('alipay','wechat','bank','other') DEFAULT 'other' COMMENT '支付方式：alipay-支付宝，wechat-微信支付，bank-银行转账，other-其他（线下转账）',
  `transactionId` varchar(100) DEFAULT NULL COMMENT '第三方交易号',
  `status` enum('pending','success','failed') NOT NULL DEFAULT 'pending' COMMENT '状态：pending-处理中，success-成功，failed-失败',
  `paidAt` datetime DEFAULT NULL COMMENT '支付时间',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_order` (`orderId`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付记录表';

-- 定价配置表
DROP TABLE IF EXISTS `pricing_configs`;
CREATE TABLE `pricing_configs` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `overageApartmentPrice` decimal(10,2) NOT NULL DEFAULT '10.00' COMMENT '超额公寓单价(每栋/月)',
  `overageRoomPrice` decimal(10,2) NOT NULL DEFAULT '2.00' COMMENT '超额房间单价(每间/月)',
  `overageUserPrice` decimal(10,2) NOT NULL DEFAULT '5.00' COMMENT '超额用户单价(每人/月)',
  `currency` varchar(10) NOT NULL DEFAULT 'CNY' COMMENT '货币',
  `effectiveDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '生效日期',
  `isActive` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否生效',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_is_active` (`isActive`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定价配置表';

-- 支付设置表
DROP TABLE IF EXISTS `payment_settings`;
CREATE TABLE `payment_settings` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `alipayAccount` varchar(100) DEFAULT NULL COMMENT '支付宝收款账号',
  `alipayName` varchar(50) DEFAULT '支付宝' COMMENT '支付宝显示名称',
  `wechatId` varchar(50) DEFAULT NULL COMMENT '客服微信号',
  `wechatText` varchar(100) DEFAULT '请添加客服微信' COMMENT '微信显示文字',
  `bankName` varchar(100) DEFAULT NULL COMMENT '开户行',
  `bankAccount` varchar(50) DEFAULT NULL COMMENT '银行账号',
  `bankHolder` varchar(100) DEFAULT NULL COMMENT '户名',
  `servicePhone` varchar(20) DEFAULT NULL COMMENT '客服电话',
  `serviceTime` varchar(50) DEFAULT '9:00-18:00' COMMENT '工作时间',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付设置表';

SET FOREIGN_KEY_CHECKS = 1;

-- ============================================
-- 7. 参数设置相关表
-- ============================================

-- 系统设置表
DROP TABLE IF EXISTS `settings`;
CREATE TABLE `settings` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '设置ID',
  `key` varchar(100) NOT NULL COMMENT '设置键名',
  `value` text COMMENT '设置值',
  `description` varchar(255) DEFAULT NULL COMMENT '设置描述',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_key_tenant` (`key`, `tenantId`),
  KEY `idx_tenant` (`tenantId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='系统设置表';

-- 收支类目表
DROP TABLE IF EXISTS `categories`;
CREATE TABLE `categories` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '类目ID',
  `name` varchar(50) NOT NULL COMMENT '类目名称',
  `code` varchar(50) NOT NULL COMMENT '类目编码',
  `type` enum('income','expense') NOT NULL COMMENT '类型：income-收入，expense-支出',
  `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序号',
  `status` enum('active','inactive') NOT NULL DEFAULT 'active' COMMENT '状态：active-启用，inactive-禁用',
  `isDefault` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认类目（0：否，1：是）',
  `tenantId` int(11) NOT NULL COMMENT '租户ID',
  `createBy` int(11) DEFAULT NULL COMMENT '创建人ID',
  `updateBy` int(11) DEFAULT NULL COMMENT '修改人ID',
  `isDeleted` int(11) NOT NULL DEFAULT '0' COMMENT '删除状态（0：未删除，1：已删除）',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updateTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `idx_tenant` (`tenantId`),
  KEY `idx_type` (`type`),
  KEY `idx_status` (`status`),
  KEY `idx_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收支类目表';
