feat: 完善会员交易与任务管理流程

This commit is contained in:
richjohnrambo
2026-10-13 14:20:27 +08:00
parent df95801672
commit 40bfa4cba0
25 changed files with 1198 additions and 297 deletions
@@ -1,14 +1,12 @@
-- 第六章:会员、敏感资料、团队、钱包调账与会员通知。
-- MySQL 8.0+;金额统一使用分,敏感字段仅保存密文、检索哈希和脱敏值。
-- MySQL 8.0+;金额统一使用分。
CREATE TABLE IF NOT EXISTS `hg_app_member` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`member_no` varchar(32) NOT NULL COMMENT '会员编号',
`username` varchar(64) NOT NULL COMMENT '用户名',
`mobile_cipher` text NOT NULL COMMENT '手机号密文(AES-GCM)',
`mobile_hash` char(64) NOT NULL COMMENT '手机号检索哈希(HMAC-SHA256)',
`mobile_mask` varchar(32) NOT NULL COMMENT '手机号脱敏值',
`mobile` varchar(20) NOT NULL COMMENT '手机号',
`password_hash` varchar(100) NOT NULL COMMENT '登录密码哈希(bcrypt)',
`trade_password_hash` varchar(100) NOT NULL DEFAULT '' COMMENT '交易密码哈希',
`level_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '会员等级ID',
@@ -34,7 +32,7 @@ CREATE TABLE IF NOT EXISTS `hg_app_member` (
PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_member_no` (`tenant_id`,`member_no`),
UNIQUE KEY `uk_app_member_username` (`tenant_id`,`username`),
UNIQUE KEY `uk_app_member_mobile_hash` (`tenant_id`,`mobile_hash`),
UNIQUE KEY `uk_app_member_mobile` (`tenant_id`,`mobile`),
UNIQUE KEY `uk_app_member_invite_code` (`tenant_id`,`invite_code`),
KEY `idx_app_member_team` (`tenant_id`,`parent_id`,`level`,`created_at`),
KEY `idx_app_member_status` (`tenant_id`,`member_status`,`auto_dispatch`,`created_at`),
@@ -96,13 +94,18 @@ CREATE TABLE IF NOT EXISTS `hg_app_member_payment_account` (
`bank_name` varchar(100) NOT NULL DEFAULT '' COMMENT '银行名称',
`holder_cipher` text NOT NULL COMMENT '持有人密文',
`holder_mask` varchar(64) NOT NULL COMMENT '持有人脱敏值',
`identity_no_cipher` text COMMENT '身份证号密文',
`identity_no_hash` char(64) NOT NULL DEFAULT '' COMMENT '身份证号检索哈希',
`identity_no_mask` varchar(32) NOT NULL DEFAULT '' COMMENT '身份证号脱敏值',
`mobile_cipher` text COMMENT '预留手机号密文',
`mobile_mask` varchar(32) NOT NULL DEFAULT '' COMMENT '预留手机号脱敏值',
`account_no_cipher` text NOT NULL COMMENT '账号密文',
`account_no_hash` char(64) NOT NULL COMMENT '账号检索哈希',
`account_no_mask` varchar(80) NOT NULL COMMENT '账号脱敏值',
`qr_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '收款码附件ID',
`verify_status` tinyint NOT NULL DEFAULT 1 COMMENT '核验状态',
`wechat_qr_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '微信二维码附件ID',
`alipay_qr_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付宝二维码附件ID',
`verify_status` tinyint NOT NULL DEFAULT 2 COMMENT '核验状态',
`is_default` tinyint NOT NULL DEFAULT 2 COMMENT '默认账户',
`created_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '创建者',
`updated_by` bigint unsigned NOT NULL DEFAULT 0 COMMENT '更新者',
@@ -0,0 +1,9 @@
-- 当前产品没有银行卡后台审核流程,绑定成功后直接核验通过。
ALTER TABLE `hg_app_member_payment_account`
MODIFY COLUMN `verify_status` tinyint NOT NULL DEFAULT 2 COMMENT '核验状态';
UPDATE `hg_app_member_payment_account`
SET `verify_status` = 2,
`updated_at` = CURRENT_TIMESTAMP(3)
WHERE `verify_status` = 1
AND `deleted_at` IS NULL;
@@ -0,0 +1,7 @@
-- 按移动端原型补齐身份证号和微信/支付宝双二维码字段。
ALTER TABLE `hg_app_member_payment_account`
ADD COLUMN `identity_no_cipher` text NULL COMMENT '身份证号密文' AFTER `holder_mask`,
ADD COLUMN `identity_no_hash` char(64) NOT NULL DEFAULT '' COMMENT '身份证号检索哈希' AFTER `identity_no_cipher`,
ADD COLUMN `identity_no_mask` varchar(32) NOT NULL DEFAULT '' COMMENT '身份证号脱敏值' AFTER `identity_no_hash`,
ADD COLUMN `wechat_qr_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '微信二维码附件ID' AFTER `qr_attachment_id`,
ADD COLUMN `alipay_qr_attachment_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '支付宝二维码附件ID' AFTER `wechat_qr_attachment_id`;
@@ -0,0 +1,2 @@
ALTER TABLE `hg_app_member`
MODIFY COLUMN `auto_dispatch` tinyint NOT NULL DEFAULT 1 COMMENT '派单模式:1自动派单 2人工匹配';
@@ -0,0 +1,11 @@
CREATE TABLE IF NOT EXISTS `hg_app_member_notice_read` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`tenant_id` bigint unsigned NOT NULL DEFAULT 0 COMMENT '租户ID',
`notice_id` bigint unsigned NOT NULL COMMENT '通知ID',
`member_id` bigint unsigned NOT NULL COMMENT '会员ID',
`read_at` datetime(3) NOT NULL COMMENT '阅读时间',
`created_at` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_notice_read` (`tenant_id`,`notice_id`,`member_id`),
KEY `idx_member_notice_read_member` (`tenant_id`,`member_id`,`read_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='会员_通知阅读记录';
@@ -197,9 +197,9 @@ WHERE l.id=@level_silver_id AND l.current_version_id=0;
SET @demo_password_hash = COALESCE((SELECT password_hash FROM hg_app_member ORDER BY id LIMIT 1),'$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2uheWG/igi.');
INSERT INTO hg_app_member
(`tenant_id`,`member_no`,`username`,`mobile_cipher`,`mobile_hash`,`mobile_mask`,`password_hash`,`trade_password_hash`,`level_id`,`parent_id`,`level`,`tree`,`invite_code`,`member_status`,`risk_status`,`auto_dispatch`,`credit_score`,`is_test_account`,`last_login_at`,`last_login_ip_cipher`,`last_login_ip_mask`,`last_login_region`,`created_by`,`updated_by`,`deleted_by`,`created_at`,`updated_at`,`deleted_at`)
(`tenant_id`,`member_no`,`username`,`mobile`,`password_hash`,`trade_password_hash`,`level_id`,`parent_id`,`level`,`tree`,`invite_code`,`member_status`,`risk_status`,`auto_dispatch`,`credit_score`,`is_test_account`,`last_login_at`,`last_login_ip_cipher`,`last_login_ip_mask`,`last_login_region`,`created_by`,`updated_by`,`deleted_by`,`created_at`,`updated_at`,`deleted_at`)
SELECT @tenant_id,CONCAT('DEMO-MB-',LPAD(x.seq,2,'0')),CONCAT('demo_user_',LPAD(x.seq,2,'0')),
CONCAT('DEMO_MOBILE_CIPHER_',x.seq),SHA2(CONCAT('1380000100',x.seq),256),CONCAT('138****10',LPAD(x.seq,2,'0')),
CONCAT('138000010',LPAD(x.seq,2,'0')),
@demo_password_hash,'',x.level_id,0,1,'',CONCAT('DM',LPAD(x.seq,6,'0')),x.member_status,x.risk_status,
IF(MOD(x.seq,2)=1,1,2),100-x.seq*5,1,DATE_SUB(@now,INTERVAL x.seq HOUR),'DEMO_IP_CIPHER','127.0.*.*','中国 上海',
@admin_id,@admin_id,IF(x.member_status=3,@admin_id,0),DATE_SUB(@now,INTERVAL x.seq*3 DAY),@now,