初始化天卡开放平台后端项目
包含完整功能模块: - 设备激活(直销激活码模式 + 代销免激活码模式) - 微信支付 + 天卡订单 - 天卡池管理 + 异步橘视厅SDK激活 - 第三方合作伙伴接口(代销模式) - 签名鉴权(appKey/appSecret + nonce防重放) - 天卡消耗(事务 + 幂等 + 并发控制) - 媒资接口(三级授权过滤) - 审计日志 - 定价策略(3层:门店 > 渠道 > 平台) - 分账(微信分账 + 分润规则) - Docker部署(含Redis容器)
This commit is contained in:
7
db/add_device_source_field.sql
Normal file
7
db/add_device_source_field.sql
Normal 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
22
db/audit_log_rebuild.sql
Normal 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
12
db/device-info-fields.sql
Normal 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
51
db/device-tables.sql
Normal 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
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
63
db/init-sys-data.sql
Normal 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
146
db/mysql.sql
Normal 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
31
db/openapi_media.sql
Normal 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调用日志';
|
||||
20
db/openapi_partner_card_pool.sql
Normal file
20
db/openapi_partner_card_pool.sql
Normal 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='合作伙伴天卡池(代销模式)';
|
||||
13
db/price-config-3layer.sql
Normal file
13
db/price-config-3layer.sql
Normal 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`;
|
||||
61
db/restore_test_card_and_jst_config.sql
Normal file
61
db/restore_test_card_and_jst_config.sql
Normal 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';
|
||||
21
db/schedule-timeout-task.sql
Normal file
21
db/schedule-timeout-task.sql
Normal 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();
|
||||
Reference in New Issue
Block a user