初始化天卡开放平台后端项目

包含完整功能模块:
- 设备激活(直销激活码模式 + 代销免激活码模式)
- 微信支付 + 天卡订单
- 天卡池管理 + 异步橘视厅SDK激活
- 第三方合作伙伴接口(代销模式)
  - 签名鉴权(appKey/appSecret + nonce防重放)
  - 天卡消耗(事务 + 幂等 + 并发控制)
  - 媒资接口(三级授权过滤)
  - 审计日志
- 定价策略(3层:门店 > 渠道 > 平台)
- 分账(微信分账 + 分润规则)
- Docker部署(含Redis容器)
This commit is contained in:
zhaogd
2026-07-26 12:34:13 +08:00
commit 30198c7191
349 changed files with 28837 additions and 0 deletions

View File

@@ -0,0 +1,7 @@
-- 设备表增加来源标识字段(在云服务器数据库 jstopenapi 上执行)
ALTER TABLE device ADD COLUMN source VARCHAR(20) DEFAULT 'DIRECT' COMMENT '设备来源: DIRECT(直销)/PARTNER(代销)';
ALTER TABLE device ADD COLUMN partner_id VARCHAR(32) DEFAULT NULL COMMENT '合作伙伴ID(代销模式)';
-- 验证
DESCRIBE device;

22
db/audit_log_rebuild.sql Normal file
View File

@@ -0,0 +1,22 @@
DROP TABLE IF EXISTS audit_log;
CREATE TABLE audit_log (
id BIGINT NOT NULL AUTO_INCREMENT,
actor_user_id BIGINT DEFAULT NULL COMMENT '操作人用户ID',
head VARCHAR(256) DEFAULT NULL COMMENT '操作标题(中文描述)',
method VARCHAR(128) DEFAULT NULL COMMENT '动作类型(如ACTCODE_GENERATE)',
api VARCHAR(256) DEFAULT NULL COMMENT 'API路径(类名#方法名)',
param VARCHAR(2000) DEFAULT NULL COMMENT '入参JSON',
result VARCHAR(500) DEFAULT NULL COMMENT '返回结果/异常',
`before` TEXT DEFAULT NULL COMMENT '变更前数据',
`after` TEXT DEFAULT NULL COMMENT '变更后数据',
reason VARCHAR(512) DEFAULT NULL COMMENT '操作原因',
ip VARCHAR(64) DEFAULT NULL COMMENT '请求IP',
device_info VARCHAR(255) DEFAULT NULL COMMENT 'User-Agent/设备信息',
ticket_no VARCHAR(64) DEFAULT NULL COMMENT '工单号',
created_at DATETIME DEFAULT NULL COMMENT '创建时间',
updated_at DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (id),
KEY idx_actor_user_id (actor_user_id),
KEY idx_created_at (created_at),
KEY idx_method (method)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='审计日志';

12
db/device-info-fields.sql Normal file
View File

@@ -0,0 +1,12 @@
-- ===========================================================
-- device-info-fields.sql
-- init 接口扩展设备信息字段(对齐 App 端 20260716 需求)
-- 新增 android_id / manufacturer / model / brand
-- ===========================================================
ALTER TABLE `device`
ADD COLUMN `android_id` VARCHAR(64) DEFAULT NULL COMMENT 'Android ID(重装不变,工厂重置才变)' AFTER `device_uid`,
ADD COLUMN `manufacturer` VARCHAR(64) DEFAULT NULL COMMENT '设备厂商 Build.MANUFACTURER' AFTER `android_id`,
ADD COLUMN `model` VARCHAR(128) DEFAULT NULL COMMENT '设备型号 Build.MODEL' AFTER `manufacturer`,
ADD COLUMN `brand` VARCHAR(64) DEFAULT NULL COMMENT '设备品牌 Build.BRAND' AFTER `model`,
ADD INDEX `idx_android_id` (`android_id`);

51
db/device-tables.sql Normal file
View File

@@ -0,0 +1,51 @@
-- ============================================================
-- 补建 device + card_device_binding 表(mysql.sql 遗漏,含扩展字段)
-- 全新部署时执行此文件后,无需再执行 device-info-fields.sql
-- ============================================================
CREATE TABLE IF NOT EXISTS `device` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`store_org_id` BIGINT DEFAULT NULL COMMENT '门店组织ID',
`mac` VARCHAR(64) DEFAULT NULL COMMENT '设备MAC',
`device_sn` VARCHAR(64) DEFAULT NULL COMMENT '设备序列号',
`wifi_mac` VARCHAR(64) DEFAULT NULL COMMENT 'WiFi MAC',
`device_uid` VARCHAR(64) DEFAULT NULL COMMENT '设备唯一标识',
`android_id` VARCHAR(64) DEFAULT NULL COMMENT 'Android ID(重装不变,工厂重置才变)',
`manufacturer` VARCHAR(64) DEFAULT NULL COMMENT '设备厂商 Build.MANUFACTURER',
`model` VARCHAR(128) DEFAULT NULL COMMENT '设备型号 Build.MODEL',
`brand` VARCHAR(64) DEFAULT NULL COMMENT '设备品牌 Build.BRAND',
`identifier_strategy` VARCHAR(32) DEFAULT NULL COMMENT '标识匹配策略',
`device_name` VARCHAR(128) DEFAULT NULL COMMENT '设备名称',
`device_model` VARCHAR(128) DEFAULT NULL COMMENT '设备型号(详细)',
`ver_code` VARCHAR(32) DEFAULT NULL COMMENT '版本号',
`ver_name` VARCHAR(64) DEFAULT NULL COMMENT '版本名',
`android_version` VARCHAR(32) DEFAULT NULL COMMENT '安卓版本',
`room_no` VARCHAR(32) DEFAULT NULL COMMENT '房间号',
`last_heartbeat` DATETIME DEFAULT NULL COMMENT '最后心跳时间',
`remark` VARCHAR(256) DEFAULT NULL COMMENT '备注',
`status` VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE/DISABLED',
`delete_flag` VARCHAR(8) NOT NULL DEFAULT 'UNDEL' COMMENT '删除标记:UNDEL/DEL',
`created_at` DATETIME DEFAULT NULL COMMENT '创建时间',
`updated_at` DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_mac` (`mac`),
KEY `idx_device_uid` (`device_uid`),
KEY `idx_device_sn` (`device_sn`),
KEY `idx_android_id` (`android_id`),
KEY `idx_store_org_id` (`store_org_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备表';
CREATE TABLE IF NOT EXISTS `card_device_binding` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`card_id` BIGINT DEFAULT NULL COMMENT '卡ID',
`device_id` BIGINT DEFAULT NULL COMMENT '设备ID',
`bind_source` VARCHAR(32) DEFAULT NULL COMMENT '绑定来源',
`bind_at` DATETIME DEFAULT NULL COMMENT '绑定时间',
`unbind_at` DATETIME DEFAULT NULL COMMENT '解绑时间',
`status` VARCHAR(16) NOT NULL DEFAULT 'BOUND' COMMENT '绑定状态:BOUND/UNBOUND/STANDBY/FAILURE',
`created_at` DATETIME DEFAULT NULL COMMENT '创建时间',
`updated_at` DATETIME DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `idx_device_id` (`device_id`),
KEY `idx_card_id` (`card_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='卡与设备绑定';

1013
db/full-schema.sql Normal file

File diff suppressed because it is too large Load Diff

63
db/init-sys-data.sql Normal file
View File

@@ -0,0 +1,63 @@
-- 系统初始化数据(菜单 + 角色 + 超管用户)
-- 在服务器执行:mysql -ujstopenapi -p'MAe8pALGWjE6jCwi' jstopenapi < db/init-sys-data.sql
-- 菜单
INSERT INTO `sys_menu` (`id`, `parent_id`, `name`, `url`, `perms`, `type`, `icon`, `show`, `order_num`, `created_at`, `updated_at`) VALUES
(1,0,'系统管理',NULL,NULL,0,'system','10',0,NULL,NULL),
(2,1,'管理员列表','sys/user',NULL,1,'admin','10',1,NULL,NULL),
(3,1,'角色管理','sys/role',NULL,1,'role','10',2,NULL,NULL),
(4,1,'菜单管理','sys/menu',NULL,1,'menu','10',3,NULL,NULL),
(15,2,'查看',NULL,'sys:user:list,sys:user:info',2,NULL,'10',0,NULL,NULL),
(16,2,'新增',NULL,'sys:user:save,sys:role:select',2,NULL,'10',0,NULL,NULL),
(17,2,'修改',NULL,'sys:user:update,sys:role:select',2,NULL,'10',0,NULL,NULL),
(18,2,'删除',NULL,'sys:user:delete',2,NULL,'10',0,NULL,NULL),
(19,3,'查看',NULL,'sys:role:list,sys:role:info',2,NULL,'10',0,NULL,NULL),
(20,3,'新增',NULL,'sys:role:save,sys:menu:list',2,NULL,'10',0,NULL,NULL),
(21,3,'修改',NULL,'sys:role:update,sys:menu:list',2,NULL,'10',0,NULL,NULL),
(22,3,'删除',NULL,'sys:role:delete',2,NULL,'10',0,NULL,NULL),
(23,4,'查看',NULL,'sys:menu:list,sys:menu:info',2,NULL,'10',0,NULL,NULL),
(24,4,'新增',NULL,'sys:menu:save,sys:menu:select',2,NULL,'10',0,NULL,NULL),
(25,4,'修改',NULL,'sys:menu:update,sys:menu:select',2,NULL,'10',0,NULL,NULL),
(26,4,'删除',NULL,'sys:menu:delete',2,NULL,'10',0,NULL,NULL),
(100,0,'业务管理',NULL,NULL,0,'el-icon-menu','10',1,'2026-07-12 15:57:45','2026-07-22 12:56:21'),
(101,100,'渠道管理','org/org',NULL,1,'el-icon-share','10',1,'2026-07-12 15:57:45','2026-07-12 15:57:45'),
(102,100,'门店管理','org/shop',NULL,1,'el-icon-shop','10',2,'2026-07-12 15:57:45','2026-07-12 15:57:45'),
(103,100,'设备管理','manage/device',NULL,1,'el-icon-monitor','10',3,'2026-07-12 15:57:45','2026-07-12 15:57:45'),
(104,100,'支付配置','manage/pay-config',NULL,1,'el-icon-wallet','10',4,'2026-07-12 15:57:45','2026-07-12 15:57:45'),
(105,100,'定价策略','manage/price',NULL,1,'el-icon-price-tag','10',5,'2026-07-12 15:57:45','2026-07-12 15:57:45'),
(106,100,'统计概览','manage/stats-overview',NULL,1,'el-icon-data-line','10',6,'2026-07-12 15:57:45','2026-07-12 15:57:45'),
(109,100,'天卡池管理','manage/card-pool',NULL,1,'el-icon-box','10',9,'2026-07-13 20:22:01','2026-07-13 20:22:01'),
(110,100,'天卡订单','manage/card-order',NULL,1,'el-icon-document','10',10,'2026-07-13 20:22:01','2026-07-13 20:22:01'),
(111,100,'分账接收方','manage/profit-receiver',NULL,1,'el-icon-connection','10',11,'2026-07-14 10:03:59','2026-07-14 10:03:59'),
(112,100,'退款管理','manage/refund',NULL,1,'el-icon-refresh-left','10',12,'2026-07-14 10:03:59','2026-07-14 10:03:59'),
(113,100,'天卡激活码','manage/activation-code','',1,'Ticket','10',13,'2026-07-14 15:59:35','2026-07-14 15:59:35'),
(114,100,'分润规则','manage/profit-rule','',1,'Coin','10',14,'2026-07-14 15:59:35','2026-07-14 15:59:35'),
(115,100,'分账记录','manage/profit-sharing','',1,'Wallet','10',15,'2026-07-14 15:59:35','2026-07-14 15:59:35'),
(116,0,'媒资管理',NULL,'',0,'Film','10',2,'2026-07-21 18:00:28','2026-07-21 18:00:28'),
(117,116,'橘视厅媒资','jetsen-media/list','',1,'Film','10',1,'2026-07-21 18:00:28','2026-07-21 18:00:28'),
(118,121,'合作伙伴管理','manage/partner','',1,'Connection','10',16,'2026-07-22 12:56:21','2026-07-22 13:43:39'),
(119,121,'内容包配置','manage/content-package','',1,'Files','10',17,'2026-07-22 12:56:21','2026-07-22 13:43:39'),
(120,121,'天卡库存','manage/partner-card','',1,'ShoppingCart','10',18,'2026-07-22 12:56:21','2026-07-22 14:59:52'),
(121,0,'第三方接口管理',NULL,'',0,'Setting','10',19,'2026-07-22 13:43:39','2026-07-22 13:43:39');
-- 角色
INSERT INTO `sys_role` (`id`, `role_name`, `remark`, `status`, `created_at`, `updated_at`) VALUES
(1,'超级管理员','平台超级管理员','1','2026-07-12 15:25:13',NULL),
(2,'渠道','渠道角色','1','2026-07-12 15:25:13',NULL),
(3,'代理商','代理商角色','1','2026-07-12 15:25:13',NULL),
(4,'门店','门店角色','1','2026-07-12 15:25:13',NULL);
-- 超管用户(admin/admin,org_id=NULL 即超管)
INSERT INTO `sys_user` (`id`, `username`, `password`, `salt`, `email`, `mobile`, `status`, `org_id`, `created_at`) VALUES
(1,'admin','9ec9750e709431dad22365cabc5c625482e574c74adaebba7dd02f1129e4ce1d','YzcmCZNvbXocrsz9dm8e','admin@as.io','13612345678',1,NULL,'2026-07-12 15:25:13');
-- 用户角色关联
INSERT INTO `sys_user_role` (`id`, `user_id`, `role_id`) VALUES
(1,1,1);
-- 角色菜单关联(超管通过 org_id=NULL 已绕过,此数据仅备份)
INSERT INTO `sys_role_menu` (`id`, `role_id`, `menu_id`) VALUES
(1,1,1),(2,1,2),(3,1,3),(4,1,4),(5,1,15),(6,1,16),(7,1,17),(8,1,18),
(9,1,19),(10,1,20),(11,1,21),(12,1,22),(13,1,23),(14,1,24),(15,1,25),(16,1,26),
(32,1,100),(33,1,101),(34,1,102),(35,1,103),(36,1,104),(37,1,105),(38,1,106),
(41,1,109),(42,1,110),(43,1,111),(44,1,112);

146
db/mysql.sql Normal file
View File

@@ -0,0 +1,146 @@
-- ============================================================
-- 天卡 OpenAPI 数据库 DDL 脚本
-- 数据库: MySQL 8.0+
-- 字符集: utf8mb4
-- 说明: 字段命名与 Entity/Service 代码严格对齐
-- 通用字段: created_at/updated_at/delete_flag
-- 状态值: 大写英文枚举字符串
-- ============================================================
-- -----------------------------------------------------------
-- 1. 合作伙伴表
-- Entity: OpenApiPartnerEntity
-- 对应 Service 列名: partner_id, app_key, name, status, delete_flag, created_at
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS `open_api_partner` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`partner_id` VARCHAR(64) NOT NULL COMMENT '合作伙伴ID',
`app_key` VARCHAR(64) NOT NULL COMMENT '应用Key',
`app_secret` VARCHAR(128) NOT NULL COMMENT '应用密钥',
`name` VARCHAR(100) DEFAULT NULL COMMENT '合作伙伴名称',
`status` VARCHAR(20) NOT NULL DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE/DISABLED',
`api_permissions` TEXT DEFAULT NULL COMMENT 'API权限(JSON)',
`rate_limit` INT NOT NULL DEFAULT 100 COMMENT '速率限制(每秒请求数)',
`delete_flag` VARCHAR(10) NOT NULL DEFAULT 'UNDEL' COMMENT '删除标记:UNDEL/DEL',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_key` (`app_key`),
UNIQUE KEY `uk_partner_id` (`partner_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开放API合作伙伴';
-- -----------------------------------------------------------
-- 2. 天卡池表
-- Entity: DayCardPoolEntity
-- 对应 Service 列名: card_code, partner_id, status, order_no, device_id, delete_flag, created_at, updated_at
-- 对应 Mapper XML: selectOneForUpdateSkipLocked (status, delete_flag, partner_id)
-- 状态枚举: UNUSED/RESERVED/USED
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS `day_card_pool` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`card_code` VARCHAR(128) NOT NULL COMMENT '卡密(导入的激活码)',
`third_party_ref` VARCHAR(128) DEFAULT NULL COMMENT '第三方引用标识',
`third_card_no` VARCHAR(128) DEFAULT NULL COMMENT '传第三方的唯一卡号',
`card_type` VARCHAR(20) NOT NULL DEFAULT 'DAY' COMMENT '卡类型:DAY',
`partner_id` BIGINT DEFAULT NULL COMMENT '所属合作伙伴ID',
`status` VARCHAR(20) NOT NULL DEFAULT 'UNUSED' COMMENT '状态:UNUSED/RESERVED/USED',
`order_no` VARCHAR(32) DEFAULT NULL COMMENT '关联订单号',
`device_id` BIGINT DEFAULT NULL COMMENT '关联设备ID',
`import_batch_id` BIGINT DEFAULT NULL COMMENT '导入批次ID',
`expire_at` DATETIME DEFAULT NULL COMMENT '卡过期时间',
`used_at` DATETIME DEFAULT NULL COMMENT '使用时间',
`delete_flag` VARCHAR(10) NOT NULL DEFAULT 'UNDEL' COMMENT '删除标记:UNDEL/DEL',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_card_code` (`card_code`),
KEY `idx_partner_status` (`partner_id`, `status`),
KEY `idx_order_no` (`order_no`),
KEY `idx_device_id` (`device_id`),
KEY `idx_import_batch_id` (`import_batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='天卡池';
-- -----------------------------------------------------------
-- 3. 天卡订单表
-- Entity: DayCardOrderEntity
-- 对应 Service 列名: order_no, partner_id, device_id, status, amount, pay_no, pay_amount, pay_time, expire_time, cancel_time, delete_flag, created_at, updated_at
-- 状态枚举: CREATED/PAYING/PAID/PAY_FAILED/CANCELLED
-- MediaServiceImpl SQL: device_id, status, expire_time
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS `day_card_order` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`order_no` VARCHAR(32) NOT NULL COMMENT '订单号',
`partner_id` BIGINT DEFAULT NULL COMMENT '合作伙伴ID',
`device_id` BIGINT DEFAULT NULL COMMENT '设备ID',
`card_no` VARCHAR(128) DEFAULT NULL COMMENT '卡号(支付后写入,关联day_card_pool.card_code)',
`status` VARCHAR(20) NOT NULL DEFAULT 'CREATED' COMMENT '订单状态:CREATED/PAYING/PAID/PAY_FAILED/CANCELLED',
`amount` DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '订单金额(元)',
`pay_no` VARCHAR(64) DEFAULT NULL COMMENT '支付流水号',
`pay_amount` DECIMAL(10,2) DEFAULT NULL COMMENT '实际支付金额(元)',
`pay_time` DATETIME DEFAULT NULL COMMENT '支付时间',
`expire_time` DATETIME DEFAULT NULL COMMENT '订单过期时间(15分钟)',
`cancel_time` DATETIME DEFAULT NULL COMMENT '取消时间',
`delete_flag` VARCHAR(10) NOT NULL DEFAULT 'UNDEL' COMMENT '删除标记:UNDEL/DEL',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_order_no` (`order_no`),
KEY `idx_device_status` (`device_id`, `status`),
KEY `idx_status_expire` (`status`, `expire_time`),
KEY `idx_partner_status` (`partner_id`, `status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='天卡订单表';
-- -----------------------------------------------------------
-- 4. 天卡导入批次表
-- Entity: DayCardImportBatchEntity
-- 状态枚举: PROCESSING/SUCCEEDED/PARTIAL_FAILED/FAILED
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS `day_card_import_batch` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`batch_no` VARCHAR(64) NOT NULL COMMENT '批次号',
`partner_id` BIGINT DEFAULT NULL COMMENT '合作伙伴ID',
`status` VARCHAR(20) NOT NULL DEFAULT 'PROCESSING' COMMENT '状态:PROCESSING/SUCCEEDED/PARTIAL_FAILED/FAILED',
`total_count` INT NOT NULL DEFAULT 0 COMMENT '总数量',
`success_count` INT NOT NULL DEFAULT 0 COMMENT '成功数量',
`fail_count` INT NOT NULL DEFAULT 0 COMMENT '失败数量',
`result_report_url` VARCHAR(500) DEFAULT NULL COMMENT '结果报告URL',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`created_by` BIGINT DEFAULT NULL COMMENT '创建人',
`delete_flag` VARCHAR(10) NOT NULL DEFAULT 'UNDEL' COMMENT '删除标记:UNDEL/DEL',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_batch_no` (`batch_no`),
KEY `idx_partner_id` (`partner_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='天卡导入批次';
-- -----------------------------------------------------------
-- 5. 天卡设备激活码表
-- Entity: DayCardActivationCodeEntity
-- 用途: 管理后台按门店生成激活码,App 端 init 时输入激活码完成设备注册绑定
-- 状态枚举: ACTIVE/DISABLED
-- -----------------------------------------------------------
CREATE TABLE IF NOT EXISTS `day_card_activation_code` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`code` VARCHAR(32) NOT NULL COMMENT '激活码(唯一)',
`channel_org_id` BIGINT NOT NULL COMMENT '渠道组织ID',
`store_org_id` BIGINT NOT NULL COMMENT '门店组织ID',
`status` VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT '状态:ACTIVE/DISABLED',
`max_device_count` INT NOT NULL DEFAULT 0 COMMENT '最大可激活设备数(0=不限)',
`activated_count` INT NOT NULL DEFAULT 0 COMMENT '已激活设备数',
`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
`delete_flag` VARCHAR(10) NOT NULL DEFAULT 'UNDEL' COMMENT '删除标记:UNDEL/DEL',
`created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_code` (`code`),
KEY `idx_store_org_id` (`store_org_id`),
KEY `idx_channel_org_id` (`channel_org_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='天卡设备激活码';

31
db/openapi_media.sql Normal file
View File

@@ -0,0 +1,31 @@
-- 内容包授权配置(一个partner一条记录,三级fallback:content_codes > catalog_ids > 全量)
CREATE TABLE IF NOT EXISTS open_api_content_package (
id BIGINT NOT NULL AUTO_INCREMENT,
partner_id VARCHAR(32) NOT NULL COMMENT '合作伙伴ID',
name VARCHAR(128) DEFAULT NULL COMMENT '内容包名称',
catalog_ids VARCHAR(2000) DEFAULT NULL COMMENT '授权栏目ID列表(逗号分隔,二级栏目id如472)',
content_codes TEXT DEFAULT NULL COMMENT '授权内容code列表(逗号分隔),非空时优先按内容过滤',
status VARCHAR(16) NOT NULL DEFAULT 'ACTIVE' COMMENT 'ACTIVE/DISABLED',
delete_flag VARCHAR(8) NOT NULL DEFAULT 'UNDEL',
created_at DATETIME DEFAULT NULL,
updated_at DATETIME DEFAULT NULL,
PRIMARY KEY (id),
KEY idx_partner_id (partner_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开放API内容包授权';
-- 第三方调用日志(可溯源)
CREATE TABLE IF NOT EXISTS open_api_call_log (
id BIGINT NOT NULL AUTO_INCREMENT,
partner_id VARCHAR(32) DEFAULT NULL COMMENT '合作伙伴ID',
app_key VARCHAR(32) DEFAULT NULL,
api VARCHAR(256) DEFAULT NULL COMMENT '请求路径',
http_method VARCHAR(16) DEFAULT NULL,
params VARCHAR(2000) DEFAULT NULL COMMENT '请求参数',
result_code INT DEFAULT NULL COMMENT '返回业务code',
ip VARCHAR(64) DEFAULT NULL,
cost_ms INT DEFAULT NULL COMMENT '耗时毫秒',
created_at DATETIME DEFAULT NULL,
PRIMARY KEY (id),
KEY idx_partner_id (partner_id),
KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='开放API调用日志';

View File

@@ -0,0 +1,20 @@
-- 合作伙伴天卡池(代销模式:第三方采购的天卡存这里,消耗时绑定设备)
CREATE TABLE IF NOT EXISTS open_api_partner_card_pool (
id BIGINT NOT NULL AUTO_INCREMENT,
partner_id VARCHAR(32) NOT NULL COMMENT '合作伙伴ID(open_api_partner.partner_id)',
pool_id BIGINT NOT NULL COMMENT 'day_card_pool.id 天卡池主键',
card_code VARCHAR(64) DEFAULT NULL COMMENT '天卡卡密',
third_card_no VARCHAR(64) DEFAULT NULL COMMENT '橘视厅第三方卡号',
status VARCHAR(16) NOT NULL DEFAULT 'AVAILABLE' COMMENT 'AVAILABLE可用/CONSUMED已消耗/DISABLED已禁用',
device_id BIGINT DEFAULT NULL COMMENT '消耗后绑定的设备ID',
channel_org_id BIGINT DEFAULT NULL COMMENT '渠道组织ID(sys_org.org_id)',
purchase_batch VARCHAR(32) DEFAULT NULL COMMENT '采购批次号',
consumed_at DATETIME DEFAULT NULL COMMENT '消耗时间',
delete_flag VARCHAR(8) NOT NULL DEFAULT 'UNDEL',
created_at DATETIME DEFAULT NULL,
updated_at DATETIME DEFAULT NULL,
PRIMARY KEY (id),
KEY idx_partner_id (partner_id),
KEY idx_partner_status (partner_id, status),
KEY idx_pool_id (pool_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='合作伙伴天卡池(代销模式)';

View File

@@ -0,0 +1,13 @@
-- ===========================================================
-- price-config-3layer.sql
-- 定价策略升级为 3 层维度:门店配置价 > 渠道配置价 > 平台默认价兜底
-- 同时取消时长约束(天卡固定 24 小时,不再按配置存时长)
-- ===========================================================
-- 1. 新增门店组织ID列(空=渠道级或平台级)
ALTER TABLE `day_card_price_config`
ADD COLUMN `store_org_id` BIGINT DEFAULT NULL COMMENT '门店组织ID(空=渠道级/平台级)' AFTER `channel_org_id`,
ADD INDEX `idx_store_org_id` (`store_org_id`);
-- 2. 取消时长约束,删除 duration_hours 列
ALTER TABLE `day_card_price_config` DROP COLUMN `duration_hours`;

View File

@@ -0,0 +1,61 @@
-- ============================================================
-- 1. 还原测试卡(在云服务器数据库 jstopenapi 上执行)
-- ============================================================
-- 1.1 重置平台天卡池:USED -> RESERVED,清除激活状态和设备绑定
UPDATE day_card_pool
SET status = 'RESERVED',
activate_status = NULL,
activate_error = NULL,
device_id = NULL,
used_at = NULL,
expire_at = NULL,
activated_at = NULL,
updated_at = NOW()
WHERE third_card_no = 'DKMMqjJKgpdwUahip5l4hGzjS'
AND status = 'USED';
-- 1.2 重置partner天卡池:CONSUMED -> AVAILABLE,清除设备绑定
UPDATE open_api_partner_card_pool
SET status = 'AVAILABLE',
device_id = NULL,
channel_org_id = NULL,
consumed_at = NULL,
updated_at = NOW()
WHERE third_card_no = 'DKMMqjJKgpdwUahip5l4hGzjS'
AND status = 'CONSUMED';
-- 1.3 验证还原结果
SELECT 'day_card_pool' AS tbl, id, card_code, third_card_no, status, activate_status, device_id
FROM day_card_pool WHERE third_card_no = 'DKMMqjJKgpdwUahip5l4hGzjS';
SELECT 'partner_card_pool' AS tbl, id, partner_id, pool_id, card_code, third_card_no, status, device_id
FROM open_api_partner_card_pool WHERE third_card_no = 'DKMMqjJKgpdwUahip5l4hGzjS';
-- 1.4 清除Redis缓存(在服务器上执行,防止Token缓存和激活锁干扰重试)
-- docker exec daycard-redis redis-cli DEL "api:thirdparty:activate:DKMMqjJKgpdwUahip5l4hGzjS"
-- docker exec daycard-redis redis-cli KEYS "api:thirdparty:activate:lock:*" | xargs -I{} docker exec daycard-redis redis-cli DEL {}
-- docker exec daycard-redis redis-cli KEYS "daycard:partner:consume:*" | xargs -I{} docker exec daycard-redis redis-cli DEL {}
-- ============================================================
-- 2. 导入橘视厅配置(在云服务器数据库 jstopenapi 上执行)
-- ============================================================
-- sys_config 表结构: id(PK), param_key(UNIQUE), param_value(varchar2000), status(tinyint default 1), remark(varchar500)
-- param_key 有 UNIQUE 约束,ON DUPLICATE KEY UPDATE 自动处理已存在情况
INSERT INTO sys_config (param_key, param_value, status, remark)
VALUES (
'JST_PLATFORM_CONFIG',
'{"jushitingBaseUrl":"https://api.future.jetsentv.com","vipQueryBaseUrl":"https://api.future.jetsentv.com","jushitingTenant":"huashitv","jushitingAccesser":"JSTASJD","jushitingBusinessLine":"4100450011381755998420012","jushitingServiceComboCode":"1100121010200494755850172","jushitingLoginRsaPublicKey":"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtlfaNsJwQ8wuVdITMLJPrXMeD9idJ0aTziOgkZZhigwzhyPNDAqw+nCKeJGGoTJyhbjPXKtnyI8eNpj+xhCCMXUD3BxOVMFWBhFxzIl83IQJG43mPRXwsJrI4oCYDaKv5aeZZBqF0OLPglXU+q19/28ltONvxcKp8YxXagmixzz1SDgLITM3s3ExqiaScK1dcpPtXbCpI4GXPP9l0ekkCBAo/d1oQqbxHvdE5ufAhEZ042k5tVHUgX9cUoedA9F2JcPhc+zUNCJUAQLvfVXxqNdhwxA4TY+64OX2iSje/cTqxp+4RcrX4rbUIYZitVQCRexZjKz7Yd/KXp8CKCho6wIDAQAB","jushitingActivateSignKey":"hhDEHY1qC4r","vipQuerySignKey":"c25svtwbTyCE"}',
1,
'聚视厅/橘视厅第三方平台配置(JSON)'
)
ON DUPLICATE KEY UPDATE
param_value = VALUES(param_value),
status = 1,
remark = VALUES(remark);
-- 验证
SELECT param_key, param_value, remark FROM sys_config WHERE param_key = 'JST_PLATFORM_CONFIG';

View File

@@ -0,0 +1,21 @@
-- ===========================================================
-- schedule-timeout-task.sql
-- 修复:天卡订单超时取消任务未被调度,导致 RESERVED 卡永不释放
-- 1) 注册 dayCardOrderTimeoutTask 到 schedule_job(每 2 分钟)
-- 2) 清理当前卡死的 RESERVED 卡与对应过期 PENDING 订单
-- 注:新增调度任务需重启后端才会被 Quartz 加载生效
-- ===========================================================
-- 1. 注册超时取消任务(status=0 正常运行)
INSERT INTO schedule_job (bean_name, params, cron_expression, status, remark, create_time)
VALUES ('dayCardOrderTimeoutTask', '', '0 */2 * * * ?', 0, '天卡订单超时取消-释放预占卡', NOW());
-- 2. 释放卡死的 RESERVED 卡 -> UNUSED
UPDATE day_card_pool
SET status = 'UNUSED', order_no = NULL, device_id = NULL, updated_at = NOW()
WHERE status = 'RESERVED' AND delete_flag = 'UNDEL';
-- 3. 取消过期未支付订单 PENDING -> CANCELLED
UPDATE day_card_order
SET status = 'CANCELLED', cancel_time = NOW(), updated_at = NOW()
WHERE status = 'PENDING' AND delete_flag = 'UNDEL' AND expire_time < NOW();