backend/sql/init.sql
@@ -122,10 +122,10 @@
(2117, 2110, '解绑微信', 'member_user_unbind_wechat', 'B', NULL, NULL, NULL, 7, 1, 1, 'member:user:unbind-wechat', '解绑微信按钮', 0),
(3000, 0, '课程与学习', 'live_root', 'M', '/live', NULL, 'read', 300, 1, 1, NULL, '课程与学习模块', 0),
(3050, 3000, '课程管理', 'live_course_manage_root', 'M', '/live/course', NULL, NULL, 10, 1, 1, NULL, '课程管理目录', 0),
(3060, 3050, '养身直播', 'live_course_broadcast_manage', 'C', '/live/course/broadcast', 'Live/BroadcastList', NULL, 10, 1, 1, 'live:course:view', '养身直播菜单', 0),
(3061, 3060, '直播详情', 'live_course_detail', 'B', NULL, NULL, NULL, 1, 1, 1, 'live:course:detail', '养身直播详情按钮', 0),
(3062, 3060, '编辑直播', 'live_course_edit', 'B', NULL, NULL, NULL, 2, 1, 1, 'live:course:edit', '养身直播编辑按钮', 0),
(3063, 3060, '启用禁用直播', 'live_course_status', 'B', NULL, NULL, NULL, 3, 1, 1, 'live:course:status', '养身直播状态按钮', 0),
(3060, 3050, '养生直播', 'live_course_broadcast_manage', 'C', '/live/course/broadcast', 'Live/BroadcastList', NULL, 10, 1, 1, 'live:course:view', '养生直播菜单', 0),
(3061, 3060, '直播详情', 'live_course_detail', 'B', NULL, NULL, NULL, 1, 1, 1, 'live:course:detail', '养生直播详情按钮', 0),
(3062, 3060, '编辑直播', 'live_course_edit', 'B', NULL, NULL, NULL, 2, 1, 1, 'live:course:edit', '养生直播编辑按钮', 0),
(3063, 3060, '启用禁用直播', 'live_course_status', 'B', NULL, NULL, NULL, 3, 1, 1, 'live:course:status', '养生直播状态按钮', 0),
(3070, 3060, '场次管理', 'live_session_manage', 'B', NULL, NULL, NULL, 10, 1, 1, 'live:session:detail', '直播场次管理权限', 0),
(3071, 3060, '新增场次', 'live_session_add', 'B', NULL, NULL, NULL, 11, 1, 1, 'live:session:add', '直播场次新增按钮', 0),
(3072, 3060, '编辑场次', 'live_session_edit', 'B', NULL, NULL, NULL, 12, 1, 1, 'live:session:edit', '直播场次编辑按钮', 0),
@@ -146,25 +146,41 @@
(3102, 3100, '编辑授课专家', 'live_expert_edit', 'B', NULL, NULL, NULL, 2, 1, 1, 'live:expert:edit', '授课专家编辑按钮', 0),
(3103, 3100, '启用禁用授课专家', 'live_expert_status', 'B', NULL, NULL, NULL, 3, 1, 1, 'live:expert:status', '授课专家状态按钮', 0),
(3104, 3100, '删除授课专家', 'live_expert_delete', 'B', NULL, NULL, NULL, 4, 1, 1, 'live:expert:delete', '授课专家删除按钮', 0),
(3110, 3050, '养身课程', 'live_health_course_manage', 'C', '/live/course/health', 'Live/HealthCourseList', NULL, 40, 1, 1, 'live:health-course:view', '养身课程菜单', 0),
(3111, 3110, '养身课程详情', 'live_health_course_detail', 'B', NULL, NULL, NULL, 1, 1, 1, 'live:health-course:detail', '养身课程详情按钮', 0),
(3112, 3110, '新增养身课程', 'live_health_course_add', 'B', NULL, NULL, NULL, 2, 1, 1, 'live:health-course:add', '养身课程新增按钮', 0),
(3113, 3110, '编辑养身课程', 'live_health_course_edit', 'B', NULL, NULL, NULL, 3, 1, 1, 'live:health-course:edit', '养身课程编辑按钮', 0),
(3114, 3110, '删除养身课程', 'live_health_course_delete', 'B', NULL, NULL, NULL, 4, 1, 1, 'live:health-course:delete', '养身课程删除按钮', 0),
(3115, 3110, '启用禁用养身课程', 'live_health_course_status', 'B', NULL, NULL, NULL, 5, 1, 1, 'live:health-course:status', '养身课程状态按钮', 0),
(3116, 3110, '导出养身课程', 'live_health_course_export', 'B', NULL, NULL, NULL, 6, 1, 1, 'live:health-course:export', '养身课程导出按钮', 0),
(3117, 3110, '新增视频课程', 'live_health_course_video_add', 'B', NULL, NULL, NULL, 7, 1, 1, 'live:health-course:video:add', '养身课程视频新增按钮', 0),
(3118, 3110, '编辑视频课程', 'live_health_course_video_edit', 'B', NULL, NULL, NULL, 8, 1, 1, 'live:health-course:video:edit', '养身课程视频编辑按钮', 0),
(3119, 3110, '删除视频课程', 'live_health_course_video_delete', 'B', NULL, NULL, NULL, 9, 1, 1, 'live:health-course:video:delete', '养身课程视频删除按钮', 0),
(3110, 3050, '养生课程', 'live_health_course_manage', 'C', '/live/course/health', 'Live/HealthCourseList', NULL, 40, 1, 1, 'live:health-course:view', '养生课程菜单', 0),
(3111, 3110, '养生课程详情', 'live_health_course_detail', 'B', NULL, NULL, NULL, 1, 1, 1, 'live:health-course:detail', '养生课程详情按钮', 0),
(3112, 3110, '新增养生课程', 'live_health_course_add', 'B', NULL, NULL, NULL, 2, 1, 1, 'live:health-course:add', '养生课程新增按钮', 0),
(3113, 3110, '编辑养生课程', 'live_health_course_edit', 'B', NULL, NULL, NULL, 3, 1, 1, 'live:health-course:edit', '养生课程编辑按钮', 0),
(3114, 3110, '删除养生课程', 'live_health_course_delete', 'B', NULL, NULL, NULL, 4, 1, 1, 'live:health-course:delete', '养生课程删除按钮', 0),
(3115, 3110, '启用禁用养生课程', 'live_health_course_status', 'B', NULL, NULL, NULL, 5, 1, 1, 'live:health-course:status', '养生课程状态按钮', 0),
(3116, 3110, '导出养生课程', 'live_health_course_export', 'B', NULL, NULL, NULL, 6, 1, 1, 'live:health-course:export', '养生课程导出按钮', 0),
(3117, 3110, '新增视频课程', 'live_health_course_video_add', 'B', NULL, NULL, NULL, 7, 1, 1, 'live:health-course:video:add', '养生课程视频新增按钮', 0),
(3118, 3110, '编辑视频课程', 'live_health_course_video_edit', 'B', NULL, NULL, NULL, 8, 1, 1, 'live:health-course:video:edit', '养生课程视频编辑按钮', 0),
(3119, 3110, '删除视频课程', 'live_health_course_video_delete', 'B', NULL, NULL, NULL, 9, 1, 1, 'live:health-course:video:delete', '养生课程视频删除按钮', 0),
(3120, 3050, '健康科普', 'live_health_popularization_manage', 'C', '/live/course/health-popularization', 'Live/HealthPopularizationList', NULL, 50, 1, 1, 'live:health-popularization:view', '健康科普菜单', 0),
(3121, 3120, '新增健康科普', 'live_health_popularization_add', 'B', NULL, NULL, NULL, 1, 1, 1, 'live:health-popularization:add', '健康科普新增按钮', 0),
(3122, 3120, '编辑健康科普', 'live_health_popularization_edit', 'B', NULL, NULL, NULL, 2, 1, 1, 'live:health-popularization:edit', '健康科普编辑按钮', 0),
(3123, 3120, '删除健康科普', 'live_health_popularization_delete', 'B', NULL, NULL, NULL, 3, 1, 1, 'live:health-popularization:delete', '健康科普删除按钮', 0),
(4000, 0, '交易与财务', 'trade_root', 'M', '/trade', NULL, 'moneyCollect', 400, 1, 1, NULL, '交易与财务模块', 0),
(4100, 4000, '订单', 'trade_order_group', 'M', '/trade/order', NULL, NULL, 10, 1, 1, NULL, '订单目录', 0),
(4130, 4100, '养生课程购买订单', 'trade_health_course_purchase_order', 'C', '/trade/order/course-purchase', 'Trade/CoursePurchase', NULL, 8, 1, 1, 'course:purchase-order:view', '养生课程购买订单菜单', 0),
(4131, 4130, '导出养生课程购买订单', 'trade_health_course_purchase_order_export', 'B', NULL, NULL, NULL, 1, 1, 1, 'course:purchase-order:export', '养生课程购买订单导出按钮', 0),
(4132, 4130, '退款养生课程购买订单', 'trade_health_course_purchase_order_refund', 'B', NULL, NULL, NULL, 2, 1, 1, 'course:purchase-order:refund', '养生课程购买订单退款按钮', 0),
(4133, 4130, '删除养生课程购买订单', 'trade_health_course_purchase_order_delete', 'B', NULL, NULL, NULL, 3, 1, 1, 'course:purchase-order:delete', '养生课程购买订单删除按钮', 0),
(4120, 4100, '会员购买订单', 'trade_member_purchase_order', 'C', '/trade/order/member-purchase', 'Trade/MemberPurchase', NULL, 9, 1, 1, 'member:purchase-order:view', '会员购买订单菜单', 0),
(4121, 4120, '导出会员购买订单', 'trade_member_purchase_order_export', 'B', NULL, NULL, NULL, 1, 1, 1, 'member:purchase-order:export', '会员购买订单导出按钮', 0),
(4122, 4120, '退款会员购买订单', 'trade_member_purchase_order_refund', 'B', NULL, NULL, NULL, 2, 1, 1, 'member:purchase-order:refund', '会员购买订单退款按钮', 0),
(4123, 4120, '删除会员购买订单', 'trade_member_purchase_order_delete', 'B', NULL, NULL, NULL, 3, 1, 1, 'member:purchase-order:delete', '会员购买订单删除按钮', 0),
(4110, 4100, '积分兑换', 'trade_points_exchange', 'C', '/trade/order/points-exchange', 'Trade/PointsExchange', NULL, 10, 1, 1, 'points:exchange:view', '积分兑换菜单', 0),
(4111, 4110, '兑换详情', 'trade_points_exchange_detail', 'B', NULL, NULL, NULL, 1, 1, 1, 'points:exchange:detail', '积分兑换详情按钮', 0),
(4112, 4110, '积分兑换发货', 'trade_points_exchange_ship', 'B', NULL, NULL, NULL, 2, 1, 1, 'points:exchange:ship', '积分兑换发货按钮', 0),
(4113, 4110, '积分兑换删除', 'trade_points_exchange_delete', 'B', NULL, NULL, NULL, 3, 1, 1, 'points:exchange:delete', '积分兑换删除按钮', 0),
(4114, 4110, '积分兑换导出', 'trade_points_exchange_export', 'B', NULL, NULL, NULL, 4, 1, 1, 'points:exchange:export', '积分兑换导出按钮', 0),
(4200, 4000, '财务流水', 'trade_finance_flow_group', 'M', '/trade/flow', NULL, NULL, 20, 1, 1, NULL, '财务流水目录', 0),
(4210, 4200, '积分收支明细', 'trade_points_ledger', 'C', '/trade/flow/points-ledger', 'Trade/PointsLedger', NULL, 10, 1, 1, 'points:ledger:view', '积分收支明细菜单', 0),
(4220, 4200, '支付流水', 'trade_payment_flow', 'C', '/trade/flow/payment-flow', 'Trade/PaymentFlow', NULL, 10, 1, 1, 'payment:flow:view', '支付流水菜单', 0),
(4221, 4220, '导出支付流水', 'trade_payment_flow_export', 'B', NULL, NULL, NULL, 1, 1, 1, 'payment:flow:export', '支付流水导出按钮', 0),
(4230, 4200, '退费流水', 'trade_refund_flow', 'C', '/trade/flow/refund-flow', 'Trade/RefundFlow', NULL, 20, 1, 1, 'refund:flow:view', '退费流水菜单', 0),
(4231, 4230, '导出退费流水', 'trade_refund_flow_export', 'B', NULL, NULL, NULL, 1, 1, 1, 'refund:flow:export', '退费流水导出按钮', 0),
(4210, 4200, '积分收支明细', 'trade_points_ledger', 'C', '/trade/flow/points-ledger', 'Trade/PointsLedger', NULL, 30, 1, 1, 'points:ledger:view', '积分收支明细菜单', 0),
(4211, 4210, '导出积分收支明细', 'trade_points_ledger_export', 'B', NULL, NULL, NULL, 1, 1, 1, 'points:ledger:export', '积分收支明细导出按钮', 0);
INSERT IGNORE INTO `sys_role_menu` (`role_id`, `menu_id`)
@@ -178,8 +194,9 @@
(1, 3080), (1, 3081), (1, 3082), (1, 3090), (1, 3091), (1, 3092), (1, 3093),
(1, 3100), (1, 3101), (1, 3102), (1, 3103), (1, 3104),
(1, 3110), (1, 3111), (1, 3112), (1, 3113), (1, 3114), (1, 3115), (1, 3116), (1, 3117), (1, 3118), (1, 3119),
(1, 4000), (1, 4100), (1, 4110), (1, 4111), (1, 4112), (1, 4113), (1, 4114),
(1, 4200), (1, 4210), (1, 4211);
(1, 3120), (1, 3121), (1, 3122), (1, 3123),
(1, 4000), (1, 4100), (1, 4110), (1, 4111), (1, 4112), (1, 4113), (1, 4114), (1, 4120), (1, 4121), (1, 4122), (1, 4123), (1, 4130), (1, 4131), (1, 4132), (1, 4133),
(1, 4200), (1, 4210), (1, 4211), (1, 4220), (1, 4221), (1, 4230), (1, 4231);
-- ----------------------------
-- 养生直播:专家(最小)
@@ -291,6 +308,132 @@
(1, 69.00, 30, 1, 199.00, 90, 1, 0);
-- ----------------------------
-- 会员购买订单
-- ----------------------------
CREATE TABLE IF NOT EXISTS `tcm_member_purchase_order` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `order_no` VARCHAR(32) NOT NULL COMMENT '订单编号',
  `app_user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
  `user_nickname` VARCHAR(64) DEFAULT NULL COMMENT '用户昵称快照',
  `user_phone` VARCHAR(20) DEFAULT NULL COMMENT '用户手机号快照',
  `member_type` VARCHAR(32) NOT NULL COMMENT '会员类型:MONTH_CARD月卡 QUARTER_CARD季卡',
  `member_days` INT NOT NULL COMMENT '会员时长天数快照',
  `order_amount` DECIMAL(10,2) NOT NULL COMMENT '订单金额快照',
  `payment_method` VARCHAR(32) NOT NULL COMMENT '付款方式:WECHAT微信 ALIPAY支付宝',
  `refund_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '退款金额',
  `refund_remark` VARCHAR(255) DEFAULT NULL COMMENT '退款备注',
  `status` VARCHAR(32) NOT NULL COMMENT '订单状态:WAITING_PAYMENT待支付 PAID已支付 REFUNDED已退款 CANCELLED已取消',
  `paid_at` DATETIME DEFAULT NULL COMMENT '支付时间',
  `refunded_at` DATETIME DEFAULT NULL COMMENT '退款时间',
  `cancelled_at` DATETIME DEFAULT NULL COMMENT '取消时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0,
  `created_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '创建人',
  `updated_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '更新人',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_member_purchase_order_no` (`order_no`),
  KEY `idx_member_purchase_order_user` (`app_user_id`),
  KEY `idx_member_purchase_order_status` (`status`),
  KEY `idx_member_purchase_order_member_type` (`member_type`),
  KEY `idx_member_purchase_order_payment_method` (`payment_method`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员购买订单表';
INSERT IGNORE INTO `tcm_member_purchase_order`
(`id`, `order_no`, `app_user_id`, `user_nickname`, `user_phone`, `member_type`, `member_days`, `order_amount`,
 `payment_method`, `refund_amount`, `refund_remark`, `status`, `paid_at`, `refunded_at`, `cancelled_at`, `deleted`)
VALUES
(1, 'MPO202310130001', 200, '王美丽', '14712346905', 'MONTH_CARD', 30, 251.50, 'ALIPAY', NULL, NULL, 'PAID',
 '2023-10-13 18:00:00', NULL, NULL, 0),
(2, 'MPO202310130002', 200, '王美丽', '14712346905', 'QUARTER_CARD', 90, 251.50, 'WECHAT', 251.50, '用户申请退款',
 'REFUNDED', '2023-10-12 15:20:00', '2023-10-13 09:15:00', NULL, 0),
(3, 'MPO202310130003', 200, '王美丽', '14712346905', 'MONTH_CARD', 30, 69.00, 'WECHAT', NULL, NULL, 'WAITING_PAYMENT',
 NULL, NULL, NULL, 0),
(4, 'MPO202310130004', 200, '王美丽', '14712346905', 'QUARTER_CARD', 90, 199.00, 'ALIPAY', NULL, NULL, 'CANCELLED',
 NULL, NULL, '2023-10-11 08:30:00', 0);
-- ----------------------------
-- 课程购买订单
-- ----------------------------
CREATE TABLE IF NOT EXISTS `tcm_course_purchase_order` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `order_no` VARCHAR(32) NOT NULL COMMENT '订单编号',
  `app_user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
  `user_nickname` VARCHAR(64) DEFAULT NULL COMMENT '用户昵称快照',
  `user_phone` VARCHAR(20) DEFAULT NULL COMMENT '用户手机号快照',
  `course_type` VARCHAR(32) NOT NULL COMMENT '课程类型:HEALTH_COURSE养生课程,可扩展',
  `purchase_target_type` VARCHAR(32) NOT NULL COMMENT '购买对象类型:COURSE整课 COURSE_CHAPTER课程小节',
  `course_id` BIGINT UNSIGNED NOT NULL COMMENT '课程ID',
  `course_video_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '课程小节ID(整课购买为空)',
  `product_name_snapshot` VARCHAR(255) NOT NULL COMMENT '商品名称快照:整课=课程名称 小节=课程名称-小节名称',
  `course_title_snapshot` VARCHAR(128) NOT NULL COMMENT '课程名称快照',
  `chapter_name_snapshot` VARCHAR(128) DEFAULT NULL COMMENT '小节名称快照',
  `cover_img_snapshot` VARCHAR(255) DEFAULT NULL COMMENT '课程封面图快照',
  `order_amount` DECIMAL(10,2) NOT NULL COMMENT '订单金额快照',
  `payment_method` VARCHAR(32) NOT NULL COMMENT '付款方式:WECHAT微信 ALIPAY支付宝',
  `refund_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '退款金额',
  `refund_remark` VARCHAR(255) DEFAULT NULL COMMENT '退款备注',
  `status` VARCHAR(32) NOT NULL COMMENT '订单状态:WAITING_PAYMENT待支付 PAID已支付 REFUNDED已退款 CANCELLED已取消',
  `paid_at` DATETIME DEFAULT NULL COMMENT '支付时间',
  `refunded_at` DATETIME DEFAULT NULL COMMENT '退款时间',
  `cancelled_at` DATETIME DEFAULT NULL COMMENT '取消时间',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0,
  `created_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '创建人',
  `updated_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '更新人',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_course_purchase_order_no` (`order_no`),
  KEY `idx_course_purchase_order_user` (`app_user_id`),
  KEY `idx_course_purchase_order_status` (`status`),
  KEY `idx_course_purchase_order_course_type` (`course_type`),
  KEY `idx_course_purchase_order_target_type` (`purchase_target_type`),
  KEY `idx_course_purchase_order_course` (`course_id`),
  KEY `idx_course_purchase_order_course_video` (`course_video_id`),
  KEY `idx_course_purchase_order_payment_method` (`payment_method`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程购买订单表';
-- ----------------------------
-- 支付流水
-- ----------------------------
CREATE TABLE IF NOT EXISTS `tcm_payment_flow` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `flow_no` VARCHAR(64) NOT NULL COMMENT '平台流水号',
  `business_type` VARCHAR(32) NOT NULL COMMENT '业务类型:COURSE_PURCHASE课程购买 MEMBER_PURCHASE会员购买',
  `business_order_id` BIGINT UNSIGNED NOT NULL COMMENT '业务订单ID',
  `business_order_no` VARCHAR(32) NOT NULL COMMENT '业务订单编号',
  `flow_type` VARCHAR(32) NOT NULL COMMENT '流水类型:PAYMENT支付 REFUND退款',
  `trade_status` VARCHAR(32) NOT NULL COMMENT '交易状态:SUCCESS成功 REFUNDED已退款',
  `app_user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
  `user_nickname` VARCHAR(64) DEFAULT NULL COMMENT '用户昵称快照',
  `user_phone` VARCHAR(20) DEFAULT NULL COMMENT '用户手机号快照',
  `product_name_snapshot` VARCHAR(255) NOT NULL COMMENT '商品名称快照',
  `payment_method` VARCHAR(32) NOT NULL COMMENT '支付方式:WECHAT微信 ALIPAY支付宝',
  `transaction_amount` DECIMAL(10,2) NOT NULL COMMENT '交易金额',
  `third_party_trade_no` VARCHAR(64) DEFAULT NULL COMMENT '第三方支付单号',
  `third_party_refund_no` VARCHAR(64) DEFAULT NULL COMMENT '第三方退款单号',
  `remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
  `trade_time` DATETIME NOT NULL COMMENT '交易时间',
  `source_type` VARCHAR(32) NOT NULL COMMENT '来源类型:COURSE_PAYMENT课程支付 COURSE_REFUND课程退款 MEMBER_PAYMENT会员支付 MEMBER_REFUND会员退款',
  `source_id` BIGINT UNSIGNED NOT NULL COMMENT '来源记录ID',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0,
  `created_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '创建人',
  `updated_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '更新人',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_payment_flow_no` (`flow_no`),
  UNIQUE KEY `uk_payment_flow_source` (`source_type`, `source_id`),
  KEY `idx_payment_flow_business_order` (`business_type`, `business_order_id`),
  KEY `idx_payment_flow_business_order_no` (`business_order_no`),
  KEY `idx_payment_flow_user` (`app_user_id`),
  KEY `idx_payment_flow_flow_type` (`flow_type`),
  KEY `idx_payment_flow_trade_status` (`trade_status`),
  KEY `idx_payment_flow_payment_method` (`payment_method`),
  KEY `idx_payment_flow_trade_time` (`trade_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='支付流水表';
-- ----------------------------
-- 会员介绍配置
-- ----------------------------
CREATE TABLE IF NOT EXISTS `tcm_member_intro_config` (
@@ -359,12 +502,12 @@
(6, 'DIFFICULTY', '困难', 30, 0);
-- ----------------------------
-- 养身课程
-- 养生课程
-- ----------------------------
CREATE TABLE IF NOT EXISTS `tcm_health_course` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '养身课程ID',
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '养生课程ID',
  `title` VARCHAR(128) NOT NULL COMMENT '课程名称',
  `level_category_id` BIGINT UNSIGNED NOT NULL COMMENT '养身等级分类ID',
  `level_category_id` BIGINT UNSIGNED NOT NULL COMMENT '养生等级分类ID',
  `difficulty_category_id` BIGINT UNSIGNED NOT NULL COMMENT '难度分类ID',
  `expert_id` BIGINT UNSIGNED NOT NULL COMMENT '授课专家ID',
  `sale_price` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '课程售价',
@@ -394,12 +537,12 @@
  KEY `idx_health_course_status` (`status`),
  KEY `idx_health_course_home_recommend` (`is_home_recommend`),
  KEY `idx_health_course_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='养身课程表';
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='养生课程表';
INSERT IGNORE INTO `tcm_health_course`
(`id`, `title`, `level_category_id`, `difficulty_category_id`, `expert_id`, `sale_price`, `summary`, `target_users`, `cover_img`, `banner_imgs`, `content`, `base_sales_count`, `real_sales_count`, `learn_user_count`, `favorite_count`, `total_duration_seconds`, `video_count`, `status`, `is_home_recommend`, `sort`, `deleted`)
VALUES
(1, '中医针灸资格证', 1, 4, 10, 599.80, '面向针灸入门与基础提升的系统课程。', '针灸初学者、养身爱好者',
(1, '中医针灸资格证', 1, 4, 10, 599.80, '面向针灸入门与基础提升的系统课程。', '针灸初学者、养生爱好者',
 'https://example.com/health/course-1-cover.png',
 JSON_ARRAY('https://example.com/health/course-1-banner-1.png', 'https://example.com/health/course-1-banner-2.png', 'https://example.com/health/course-1-banner-3.png'),
 '<p>课程介绍:覆盖针灸基础理论、常见穴位与实操思路。</p>',
@@ -407,14 +550,14 @@
CREATE TABLE IF NOT EXISTS `tcm_health_course_video` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '视频小节ID',
  `course_id` BIGINT UNSIGNED NOT NULL COMMENT '所属养身课程ID',
  `course_type` TINYINT NOT NULL DEFAULT 1 COMMENT '课程类型:1养生课程',
  `course_id` BIGINT UNSIGNED NOT NULL COMMENT '所属养生课程ID',
  `chapter_name` VARCHAR(128) NOT NULL COMMENT '小节名称',
  `chapter_remark` VARCHAR(500) DEFAULT NULL COMMENT '小节备注',
  `video_source_type` TINYINT NOT NULL DEFAULT 1 COMMENT '视频来源:1视频地址 2本地上传',
  `video_url` VARCHAR(512) DEFAULT NULL COMMENT '视频地址',
  `video_file_name` VARCHAR(255) DEFAULT NULL COMMENT '本地上传原始文件名',
  `duration_seconds` INT NOT NULL DEFAULT 0 COMMENT '视频时长(秒)',
  `sale_type` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '售价类型:0免费 1收费',
  `sale_price` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '小节售价',
  `play_count` INT NOT NULL DEFAULT 0 COMMENT '播放次数',
  `sort` INT NOT NULL DEFAULT 0 COMMENT '排序值',
  `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态:1启用 0禁用',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0,
@@ -425,15 +568,65 @@
  PRIMARY KEY (`id`),
  KEY `idx_health_course_video_course_sort` (`course_id`, `sort`),
  KEY `idx_health_course_video_status` (`course_id`, `status`),
  KEY `idx_health_course_video_sale_type` (`sale_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='养身课程视频小节表';
  KEY `idx_health_course_video_type_status` (`course_type`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='养生课程视频小节表';
INSERT IGNORE INTO `tcm_health_course_video`
(`id`, `course_id`, `chapter_name`, `chapter_remark`, `video_url`, `duration_seconds`, `sale_type`, `sale_price`, `play_count`, `sort`, `status`, `deleted`)
(`id`, `course_type`, `course_id`, `chapter_name`, `video_source_type`, `video_url`, `video_file_name`, `duration_seconds`, `sale_price`, `sort`, `status`, `deleted`)
VALUES
(1, 1, '方剂学', '赠送添加视频课程页,需自动传入课程', 'https://example.com/health/course-1-video-1.mp4', 238, 0, 0.00, 358, 10, 1, 0),
(2, 1, '药剂学', '系统课程配套讲解', 'https://example.com/health/course-1-video-2.mp4', 238, 1, 5999.99, 358, 20, 1, 0),
(3, 1, '方剂学进阶', '面向基础学习后的专题补充', 'https://example.com/health/course-1-video-3.mp4', 642, 1, 5999.99, 358, 30, 1, 0);
(1, 1, 1, '方剂学', 1, 'https://example.com/health/course-1-video-1.mp4', NULL, 238, 0.00, 10, 1, 0),
(2, 1, 1, '药剂学', 1, 'https://example.com/health/course-1-video-2.mp4', NULL, 238, 5999.99, 20, 1, 0),
(3, 1, 1, '方剂学进阶', 1, 'https://example.com/health/course-1-video-3.mp4', NULL, 642, 5999.99, 30, 1, 0);
CREATE TABLE IF NOT EXISTS `tcm_health_popularization` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '健康科普ID',
  `title` VARCHAR(128) NOT NULL COMMENT '标题',
  `cover_img` VARCHAR(255) NOT NULL COMMENT '封面图',
  `content_type` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '内容类型:1图文 2视频',
  `content` LONGTEXT DEFAULT NULL COMMENT '图文内容',
  `video_url` VARCHAR(512) DEFAULT NULL COMMENT '视频地址',
  `video_file_name` VARCHAR(255) DEFAULT NULL COMMENT '视频文件名',
  `status` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '状态:1启用 0禁用',
  `is_home_recommend` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '首页推荐:1是 0否',
  `click_count` INT NOT NULL DEFAULT 0 COMMENT '点击量',
  `sort` INT NOT NULL DEFAULT 0 COMMENT '排序值',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0,
  `created_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '创建人',
  `updated_by` VARCHAR(64) NOT NULL DEFAULT '系统初始化' COMMENT '更新人',
  `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_health_popularization_type` (`content_type`),
  KEY `idx_health_popularization_status` (`status`),
  KEY `idx_health_popularization_home_recommend` (`is_home_recommend`),
  KEY `idx_health_popularization_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='健康科普表';
INSERT IGNORE INTO `tcm_health_popularization`
(`id`, `title`, `cover_img`, `content_type`, `content`, `video_url`, `video_file_name`, `status`, `is_home_recommend`, `click_count`, `sort`, `deleted`)
VALUES
(1, '春季养肝小常识', 'https://example.com/health/popularization-1-cover.png', 1,
 '<p>春季宜养肝,规律作息、清淡饮食、适度运动有助于保持身体平衡。</p>', NULL, NULL, 1, 1, 153, 10, 0),
(2, '穴位按摩入门视频', 'https://example.com/health/popularization-2-cover.png', 2,
 NULL, 'https://example.com/health/popularization-2-video.mp4', '穴位按摩入门.mp4', 1, 0, 89, 20, 0);
INSERT IGNORE INTO `tcm_course_purchase_order`
(`id`, `order_no`, `app_user_id`, `user_nickname`, `user_phone`, `course_type`, `purchase_target_type`, `course_id`,
 `course_video_id`, `product_name_snapshot`, `course_title_snapshot`, `chapter_name_snapshot`, `cover_img_snapshot`,
 `order_amount`, `payment_method`, `refund_amount`, `refund_remark`, `status`, `paid_at`, `refunded_at`, `cancelled_at`, `deleted`)
VALUES
(1, 'CPO202310130001', 200, '王美丽', '14712346905', 'HEALTH_COURSE', 'COURSE', 1,
 NULL, '中医针灸资格证', '中医针灸资格证', NULL, 'https://example.com/health/course-1-cover.png',
 599.80, 'ALIPAY', NULL, NULL, 'PAID', '2023-10-13 18:00:00', NULL, NULL, 0),
(2, 'CPO202310130002', 200, '王美丽', '14712346905', 'HEALTH_COURSE', 'COURSE_CHAPTER', 1,
 2, '中医针灸资格证-药剂学', '中医针灸资格证', '药剂学', 'https://example.com/health/course-1-cover.png',
 5999.99, 'WECHAT', 5999.99, '用户申请退款', 'REFUNDED', '2023-10-12 15:20:00', '2023-10-13 09:15:00', NULL, 0),
(3, 'CPO202310130003', 200, '王美丽', '14712346905', 'HEALTH_COURSE', 'COURSE_CHAPTER', 1,
 3, '中医针灸资格证-方剂学进阶', '中医针灸资格证', '方剂学进阶', 'https://example.com/health/course-1-cover.png',
 5999.99, 'WECHAT', NULL, NULL, 'WAITING_PAYMENT', NULL, NULL, NULL, 0),
(4, 'CPO202310130004', 200, '王美丽', '14712346905', 'HEALTH_COURSE', 'COURSE', 1,
 NULL, '中医针灸资格证', '中医针灸资格证', NULL, 'https://example.com/health/course-1-cover.png',
 599.80, 'ALIPAY', NULL, NULL, 'CANCELLED', NULL, NULL, '2023-10-11 08:30:00', 0);
CREATE TABLE IF NOT EXISTS `tcm_live_course` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '直播课程ID',