-- ============================================
-- SPA管理系统 - 财务报表统计SQL
-- ============================================

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- 1. 财务账户表
DROP TABLE IF EXISTS `spa_financial_account`;
CREATE TABLE `spa_financial_account` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `deleted_at` datetime(3) DEFAULT NULL,
  `account_name` varchar(100) NOT NULL COMMENT '账户名称',
  `account_type` tinyint NOT NULL COMMENT '账户类型 1现金 2银行 3支付宝 4微信',
  `account_no` varchar(100) DEFAULT NULL COMMENT '账号',
  `balance` decimal(12,2) DEFAULT 0.00 COMMENT '账户余额',
  `status` tinyint DEFAULT 1 COMMENT '状态 1正常 2冻结',
  PRIMARY KEY (`id`),
  KEY `idx_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='财务账户表';

-- 2. 资金流水表
DROP TABLE IF EXISTS `spa_financial_flow`;
CREATE TABLE `spa_financial_flow` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `flow_no` varchar(50) NOT NULL COMMENT '流水号',
  `account_id` bigint unsigned NOT NULL COMMENT '账户ID',
  `flow_type` tinyint NOT NULL COMMENT '流水类型 1收入 2支出',
  `amount` decimal(10,2) NOT NULL COMMENT '金额',
  `before_balance` decimal(12,2) NOT NULL COMMENT '变动前余额',
  `after_balance` decimal(12,2) NOT NULL COMMENT '变动后余额',
  `business_type` tinyint NOT NULL COMMENT '业务类型 1订单收入 2提现支出 3工资支出 4采购支出 5其他',
  `related_id` bigint unsigned DEFAULT NULL COMMENT '关联业务ID',
  `related_no` varchar(50) DEFAULT NULL COMMENT '关联业务单号',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_flow_no` (`flow_no`),
  KEY `idx_account_id` (`account_id`),
  KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资金流水表';

-- 3. 对账记录表
DROP TABLE IF EXISTS `spa_reconciliation`;
CREATE TABLE `spa_reconciliation` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `reconciliation_date` date NOT NULL COMMENT '对账日期',
  `account_id` bigint unsigned NOT NULL COMMENT '账户ID',
  `system_balance` decimal(12,2) NOT NULL COMMENT '系统余额',
  `actual_balance` decimal(12,2) NOT NULL COMMENT '实际余额',
  `difference` decimal(12,2) DEFAULT 0.00 COMMENT '差额',
  `status` tinyint DEFAULT 1 COMMENT '状态 1待对账 2已对账 3有差异',
  `operator_id` bigint unsigned DEFAULT NULL COMMENT '操作人ID',
  `remark` text COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_account_id` (`account_id`),
  KEY `idx_reconciliation_date` (`reconciliation_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='对账记录表';

-- 4. 发票管理表
DROP TABLE IF EXISTS `spa_invoice`;
CREATE TABLE `spa_invoice` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `deleted_at` datetime(3) DEFAULT NULL,
  `invoice_no` varchar(50) NOT NULL COMMENT '发票号码',
  `order_id` bigint unsigned NOT NULL COMMENT '订单ID',
  `customer_id` bigint unsigned NOT NULL COMMENT '客户ID',
  `invoice_type` tinyint NOT NULL COMMENT '发票类型 1普通 2专用',
  `invoice_title` varchar(200) NOT NULL COMMENT '发票抬头',
  `tax_no` varchar(50) DEFAULT NULL COMMENT '税号',
  `amount` decimal(10,2) NOT NULL COMMENT '开票金额',
  `status` tinyint DEFAULT 1 COMMENT '状态 1待开票 2已开票 3已作废',
  `issue_time` datetime DEFAULT NULL COMMENT '开票时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_invoice_no` (`invoice_no`),
  KEY `idx_order_id` (`order_id`),
  KEY `idx_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='发票管理表';

-- 5. 日统计表
DROP TABLE IF EXISTS `spa_daily_statistics`;
CREATE TABLE `spa_daily_statistics` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `stat_date` date NOT NULL COMMENT '统计日期',
  `store_id` bigint unsigned DEFAULT NULL COMMENT '店铺ID 0表示全部',
  `order_count` int DEFAULT 0 COMMENT '订单数',
  `order_amount` decimal(12,2) DEFAULT 0.00 COMMENT '订单金额',
  `paid_count` int DEFAULT 0 COMMENT '支付订单数',
  `paid_amount` decimal(12,2) DEFAULT 0.00 COMMENT '支付金额',
  `refund_count` int DEFAULT 0 COMMENT '退款订单数',
  `refund_amount` decimal(12,2) DEFAULT 0.00 COMMENT '退款金额',
  `new_customer_count` int DEFAULT 0 COMMENT '新增客户数',
  `active_customer_count` int DEFAULT 0 COMMENT '活跃客户数',
  `technician_count` int DEFAULT 0 COMMENT '在职技师数',
  `service_count` int DEFAULT 0 COMMENT '服务次数',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_store_date` (`store_id`, `stat_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日统计表';

-- 6. 月统计表
DROP TABLE IF EXISTS `spa_monthly_statistics`;
CREATE TABLE `spa_monthly_statistics` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `stat_month` varchar(7) NOT NULL COMMENT '统计月份 YYYY-MM',
  `store_id` bigint unsigned DEFAULT NULL COMMENT '店铺ID 0表示全部',
  `order_count` int DEFAULT 0 COMMENT '订单数',
  `order_amount` decimal(12,2) DEFAULT 0.00 COMMENT '订单金额',
  `paid_count` int DEFAULT 0 COMMENT '支付订单数',
  `paid_amount` decimal(12,2) DEFAULT 0.00 COMMENT '支付金额',
  `refund_count` int DEFAULT 0 COMMENT '退款订单数',
  `refund_amount` decimal(12,2) DEFAULT 0.00 COMMENT '退款金额',
  `new_customer_count` int DEFAULT 0 COMMENT '新增客户数',
  `total_customer_count` int DEFAULT 0 COMMENT '累计客户数',
  `commission_amount` decimal(12,2) DEFAULT 0.00 COMMENT '分佣总额',
  `withdrawal_amount` decimal(12,2) DEFAULT 0.00 COMMENT '提现总额',
  `profit_amount` decimal(12,2) DEFAULT 0.00 COMMENT '利润',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_store_month` (`store_id`, `stat_month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='月统计表';

-- 7. 技师绩效表
DROP TABLE IF EXISTS `spa_technician_performance`;
CREATE TABLE `spa_technician_performance` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `technician_id` bigint unsigned NOT NULL COMMENT '技师ID',
  `stat_month` varchar(7) NOT NULL COMMENT '统计月份 YYYY-MM',
  `service_count` int DEFAULT 0 COMMENT '服务次数',
  `service_amount` decimal(12,2) DEFAULT 0.00 COMMENT '服务金额',
  `commission_amount` decimal(12,2) DEFAULT 0.00 COMMENT '提成金额',
  `avg_rating` decimal(3,2) DEFAULT 0.00 COMMENT '平均评分',
  `complaint_count` int DEFAULT 0 COMMENT '投诉次数',
  `attendance_days` int DEFAULT 0 COMMENT '出勤天数',
  `rank` int DEFAULT 0 COMMENT '排名',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_tech_month` (`technician_id`, `stat_month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='技师绩效表';

-- 8. 店铺绩效表
DROP TABLE IF EXISTS `spa_store_performance`;
CREATE TABLE `spa_store_performance` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  `created_at` datetime(3) DEFAULT NULL,
  `updated_at` datetime(3) DEFAULT NULL,
  `store_id` bigint unsigned NOT NULL COMMENT '店铺ID',
  `stat_month` varchar(7) NOT NULL COMMENT '统计月份 YYYY-MM',
  `order_count` int DEFAULT 0 COMMENT '订单数',
  `order_amount` decimal(12,2) DEFAULT 0.00 COMMENT '订单金额',
  `customer_count` int DEFAULT 0 COMMENT '客户数',
  `technician_count` int DEFAULT 0 COMMENT '技师数',
  `avg_rating` decimal(3,2) DEFAULT 0.00 COMMENT '平均评分',
  `profit_amount` decimal(12,2) DEFAULT 0.00 COMMENT '利润',
  `rank` int DEFAULT 0 COMMENT '排名',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_store_month` (`store_id`, `stat_month`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='店铺绩效表';

SET FOREIGN_KEY_CHECKS = 1;
