feat: 新增虚拟支付订单与网盘链接检测功能

This commit is contained in:
王鹏
2026-07-28 13:42:30 +08:00
parent 4070179f46
commit 2250f744d1
60 changed files with 3668 additions and 106 deletions

View File

@@ -0,0 +1,8 @@
-- 资源详情页会同时按用户和资源判断积分兑换权限。
-- 缺少下面两个索引时,带登录态的详情请求会在 JOIN 子查询中反复全表扫描。
ALTER TABLE `app_integral_record`
ADD INDEX `idx_integral_record_user_resource` (`user_id`, `resource_id`);
ALTER TABLE `app_resource_list`
ADD INDEX `idx_resource_list_resource` (`app_resource_id`);

View File

@@ -0,0 +1,19 @@
-- 项目清单:百度网盘、夸克网盘链接检测结果
-- 部署本功能前执行一次。
CREATE TABLE IF NOT EXISTS `tt_project_link_check` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
`project_id` int NOT NULL COMMENT '项目ID',
`disk_type` varchar(16) NOT NULL COMMENT '网盘类型QUARK/BAIDU',
`link_url` varchar(1000) NOT NULL COMMENT '本次检测的链接快照',
`check_status` varchar(20) NOT NULL COMMENT 'VALID/INVALID/NEED_CODE/CODE_ERROR/FORMAT_ERROR/UNKNOWN',
`provider_code` varchar(32) DEFAULT NULL COMMENT '平台状态码或HTTP状态码',
`check_message` varchar(255) DEFAULT NULL COMMENT '检测结果说明',
`response_time_ms` bigint DEFAULT NULL COMMENT '检测耗时(毫秒)',
`checked_at` datetime NOT NULL COMMENT '检测时间',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_project_disk_type` (`project_id`, `disk_type`),
KEY `idx_check_status_time` (`check_status`, `checked_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目网盘链接检测结果';

View File

@@ -0,0 +1,50 @@
-- 虚拟支付订单管理菜单(可重复执行)
-- 默认放在现有“支付订单”菜单的同级目录下;若未找到,则作为一级菜单显示。
SET @virtual_order_parent_id := COALESCE(
(SELECT parent_id FROM sys_menu WHERE perms = 'app:order:list' LIMIT 1),
0
);
SET @virtual_order_order_num := COALESCE(
(SELECT MAX(order_num) + 1 FROM sys_menu WHERE parent_id = @virtual_order_parent_id),
1
);
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT
'虚拟支付订单', @virtual_order_parent_id, @virtual_order_order_num,
'virtualOrder', 'app/virtualOrder/index', '', 1, 0,
'C', '0', '0', 'app:virtualOrder:list', 'money', 'admin', NOW(), '', NULL,
'虚拟支付订单只读查询菜单'
WHERE NOT EXISTS (
SELECT 1 FROM sys_menu WHERE perms = 'app:virtualOrder:list'
);
SET @virtual_order_menu_id := (
SELECT menu_id FROM sys_menu WHERE perms = 'app:virtualOrder:list' LIMIT 1
);
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT
'虚拟订单查询', @virtual_order_menu_id, 1, '', '', '', 1, 0,
'F', '0', '0', 'app:virtualOrder:query', '#', 'admin', NOW(), '', NULL, ''
WHERE @virtual_order_menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE perms = 'app:virtualOrder:query'
);
INSERT INTO sys_menu
(menu_name, parent_id, order_num, path, component, query, is_frame, is_cache,
menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark)
SELECT
'虚拟订单导出', @virtual_order_menu_id, 2, '', '', '', 1, 0,
'F', '0', '0', 'app:virtualOrder:export', '#', 'admin', NOW(), '', NULL, ''
WHERE @virtual_order_menu_id IS NOT NULL
AND NOT EXISTS (
SELECT 1 FROM sys_menu WHERE perms = 'app:virtualOrder:export'
);

View File

@@ -0,0 +1,79 @@
-- 资源直购虚拟支付改造
-- 执行前请先备份数据库。适用于当前项目的 MySQL 数据库。
ALTER TABLE app_resource
ADD COLUMN price_fen INT NOT NULL DEFAULT 0 COMMENT '虚拟支付价格,单位分' AFTER ad_number;
-- 兼容已有“is_ad=3 且 ad_number 表示人民币元”的资源。
UPDATE app_resource
SET price_fen = ad_number * 100
WHERE is_ad = 3 AND price_fen = 0 AND ad_number > 0;
CREATE TABLE app_virtual_product (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
product_id VARCHAR(64) NOT NULL COMMENT '微信虚拟道具productId',
price_fen INT NOT NULL COMMENT '价格档位,单位分',
product_name VARCHAR(100) NOT NULL COMMENT '档位名称',
status TINYINT NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_virtual_product_id (product_id),
UNIQUE KEY uk_virtual_product_price (price_fen)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='微信虚拟道具价格档位';
CREATE TABLE app_virtual_order (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
order_no VARCHAR(32) NOT NULL COMMENT '业务订单号',
user_id BIGINT NOT NULL COMMENT '用户ID',
resource_id BIGINT NOT NULL COMMENT '资源ID',
product_id VARCHAR(64) NOT NULL COMMENT '微信虚拟道具ID',
price_fen INT NOT NULL COMMENT '支付金额,单位分',
open_id VARCHAR(64) NOT NULL COMMENT '微信OpenID',
status TINYINT NOT NULL DEFAULT 0 COMMENT '0待支付 1已支付发货 2已退款 3已关闭',
wx_order_no VARCHAR(64) NULL COMMENT '微信内部订单号',
transaction_id VARCHAR(64) NULL COMMENT '微信支付交易单号',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
pay_time DATETIME NULL,
provide_time DATETIME NULL,
refund_time DATETIME NULL,
last_query_time DATETIME NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_virtual_order_no (order_no),
KEY idx_virtual_order_user (user_id, create_time),
KEY idx_virtual_order_resource (resource_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='资源虚拟支付订单';
CREATE TABLE app_resource_entitlement (
id BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键',
user_id BIGINT NOT NULL COMMENT '用户ID',
resource_id BIGINT NOT NULL COMMENT '资源ID',
order_no VARCHAR(32) NOT NULL COMMENT '来源虚拟支付订单号',
status TINYINT NOT NULL DEFAULT 1 COMMENT '1有效 0已撤销',
granted_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
revoked_time DATETIME NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_resource_entitlement_order (order_no),
UNIQUE KEY uk_resource_entitlement_user_resource (user_id, resource_id),
KEY idx_resource_entitlement_resource (resource_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='付费资源访问权益';
-- 执行迁移后:
-- 1. 在微信公众平台创建各价格档位的道具并发布;
-- 2. 在若依后台编辑付费资源,填写“价格(分)”和对应的 productId
-- 3. 同一价格填写同一个 productId后台会自动维护 app_virtual_product 映射。
-- 当前小程序已发布的微信虚拟道具价格映射。
-- product_id 必须与微信后台保持完全一致(包括 resourse 的现有拼写)。
INSERT INTO app_virtual_product
(product_id, price_fen, product_name, status, create_time)
VALUES
('resourse_1', 100, '1元资源', 1, NOW()),
('resourse_10', 1000, '10元资源', 1, NOW()),
('resourse_50', 5000, '50元资源', 1, NOW()),
('resourse_99', 9900, '99元资源', 1, NOW()),
('resourse_300', 30000, '300元资源', 1, NOW())
ON DUPLICATE KEY UPDATE
product_name = VALUES(product_name),
status = 1,
update_time = NOW();