feat: add Go backend

This commit is contained in:
richjohnrambo
2026-10-10 20:56:17 +08:00
parent 50fcfd2d3d
commit f6024f0964
1040 changed files with 107169 additions and 0 deletions
@@ -0,0 +1,518 @@
-- Olons Admin 业务演示数据
-- 适用:MySQL 8.0+,本地开发环境。
-- 特征:所有业务编号使用 DEMO 前缀;脚本可重复执行,不覆盖用户已有数据。
SET NAMES utf8mb4;
SET @tenant_id = 0;
SET @admin_id = COALESCE((SELECT id FROM hg_admin_member ORDER BY id LIMIT 1), 1);
SET @reviewer_id = COALESCE((SELECT id FROM hg_admin_member WHERE id <> @admin_id ORDER BY id LIMIT 1), @admin_id);
SET @now = NOW(3);
-- --------------------------------------------------------------------------
-- 1. 基础治理:审批、审批动作、敏感查看、审计、幂等、Outbox、看板汇总
-- --------------------------------------------------------------------------
INSERT INTO hg_approval_request
(`tenant_id`,`approval_no`,`approval_type`,`target_type`,`target_id`,`action`,`title`,`payload_json`,`diff_json`,`risk_level`,`required_approvals`,`approval_status`,`applicant_id`,`submitted_at`,`decided_at`,`executed_at`,`expire_at`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id, CONCAT('DEMO-AP-', LPAD(x.status,2,'0')), 'demo_flow', 'demo_target', x.status,
'demo_action', CONCAT('演示审批状态-',x.status), JSON_OBJECT('demo',TRUE,'status',x.status),
JSON_OBJECT('status',JSON_OBJECT('before',1,'after',x.status)), x.risk_level, 2, x.status,
@admin_id,
IF(x.status=1,NULL,DATE_SUB(@now,INTERVAL x.status HOUR)),
IF(x.status IN (4,5,6,7,8),DATE_SUB(@now,INTERVAL 20 MINUTE),NULL),
IF(x.status IN (7,8),DATE_SUB(@now,INTERVAL 10 MINUTE),NULL),
DATE_ADD(@now,INTERVAL 7 DAY), x.status-1, CONCAT('本地演示:审批状态 ',x.status),
@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,1 risk_level UNION ALL SELECT 2,2 UNION ALL SELECT 3,3 UNION ALL SELECT 4,4
UNION ALL SELECT 5,1 UNION ALL SELECT 6,2 UNION ALL SELECT 7,3 UNION ALL SELECT 8,4
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_approval_request a WHERE a.approval_no=CONCAT('DEMO-AP-',LPAD(x.status,2,'0')));
INSERT INTO hg_approval_action
(`tenant_id`,`approval_request_id`,`step_no`,`actor_id`,`action`,`reason_code`,`comment`,`snapshot_json`,`actor_ip_cipher`,`mfa_verified`,`created_at`)
SELECT @tenant_id,a.id,x.action,@reviewer_id,x.action,CONCAT('demo_action_',x.action),
CONCAT('本地演示审批动作 ',x.action),JSON_OBJECT('approvalNo',a.approval_no,'action',x.action),
'DEMO_IP_CIPHER',MOD(x.action,2),DATE_SUB(@now,INTERVAL (7-x.action) HOUR)
FROM (
SELECT 1 action UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) x
JOIN hg_approval_request a ON a.approval_no=CONCAT('DEMO-AP-',LPAD(x.action+1,2,'0'))
WHERE NOT EXISTS (
SELECT 1 FROM hg_approval_action aa
WHERE aa.approval_request_id=a.id AND aa.step_no=x.action AND aa.actor_id=@reviewer_id
);
INSERT INTO hg_sensitive_access_log
(`tenant_id`,`access_no`,`actor_id`,`target_type`,`target_id`,`field_set`,`purpose_code`,`purpose_text`,`authorization_no`,`mfa_verified`,`result`,`trace_id`,`created_at`)
SELECT @tenant_id,CONCAT('DEMO-SA-',x.result),@admin_id,'app_member',x.result,
JSON_ARRAY('mobile','realName','idNo'),CONCAT('demo_purpose_',x.result),
IF(x.result=1,'客服核验会员身份','无授权查看被拒绝'),CONCAT('DEMO-AUTH-',x.result),x.result-1,x.result,
CONCAT('demo-trace-sensitive-',x.result),DATE_SUB(@now,INTERVAL x.result HOUR)
FROM (SELECT 1 result UNION ALL SELECT 2) x
WHERE NOT EXISTS (SELECT 1 FROM hg_sensitive_access_log l WHERE l.access_no=CONCAT('DEMO-SA-',x.result));
INSERT INTO hg_biz_audit_log
(`tenant_id`,`audit_no`,`actor_type`,`actor_id`,`module`,`action`,`target_type`,`target_id`,`before_digest`,`after_digest`,`change_json`,`reason`,`approval_no`,`trace_id`,`prev_hash`,`row_hash`,`created_at`)
SELECT @tenant_id,CONCAT('DEMO-AU-',x.seq),1,@admin_id,x.module,x.action_name,x.target_type,x.seq,
SHA2(CONCAT('before-',x.seq),256),SHA2(CONCAT('after-',x.seq),256),
JSON_OBJECT('demo',TRUE,'sequence',x.seq),'本地演示审计数据',CONCAT('DEMO-AP-',LPAD(x.seq+1,2,'0')),
CONCAT('demo-trace-audit-',x.seq),IF(x.seq=1,'',SHA2(CONCAT('audit-',x.seq-1),256)),
SHA2(CONCAT('audit-',x.seq),256),DATE_SUB(@now,INTERVAL x.seq HOUR)
FROM (
SELECT 1 seq,'member' module,'member.edit' action_name,'app_member' target_type
UNION ALL SELECT 2,'wallet','wallet.adjust','wallet_account'
UNION ALL SELECT 3,'content','content.publish','content'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_biz_audit_log l WHERE l.audit_no=CONCAT('DEMO-AU-',x.seq));
INSERT INTO hg_idempotency_record
(`tenant_id`,`scope`,`idempotency_key`,`request_digest`,`resource_type`,`resource_id`,`process_status`,`response_code`,`response_digest`,`expire_at`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('demo_scope_',x.status),CONCAT('DEMO-IDEMPOTENCY-',x.status),
SHA2(CONCAT('request-',x.status),256),'demo_resource',x.status,x.status,
IF(x.status=1,NULL,IF(x.status=2,0,500)),IF(x.status=1,NULL,SHA2(CONCAT('response-',x.status),256)),
DATE_ADD(@now,INTERVAL 1 DAY),DATE_SUB(@now,INTERVAL x.status HOUR),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_idempotency_record i
WHERE i.tenant_id=@tenant_id AND i.scope=CONCAT('demo_scope_',x.status) AND i.idempotency_key=CONCAT('DEMO-IDEMPOTENCY-',x.status)
);
INSERT INTO hg_outbox_event
(`tenant_id`,`event_no`,`aggregate_type`,`aggregate_id`,`event_type`,`payload_json`,`publish_status`,`retry_count`,`next_retry_at`,`last_error`,`created_at`,`published_at`)
SELECT @tenant_id,CONCAT('DEMO-EV-',x.status),'demo_aggregate',x.status,CONCAT('demo.event.',x.status),
JSON_OBJECT('demo',TRUE,'status',x.status),x.status,IF(x.status=3,3,0),
IF(x.status=3,DATE_ADD(@now,INTERVAL 10 MINUTE),NULL),IF(x.status=3,'演示:等待重试',NULL),
DATE_SUB(@now,INTERVAL x.status HOUR),IF(x.status=2,DATE_SUB(@now,INTERVAL 1 HOUR),NULL)
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3) x
WHERE NOT EXISTS (SELECT 1 FROM hg_outbox_event e WHERE e.event_no=CONCAT('DEMO-EV-',x.status));
INSERT INTO hg_dashboard_daily_stat
(`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`,`metric_count`,`metric_amount`,`calculated_at`,`created_at`,`updated_at`)
SELECT @tenant_id,CURDATE(),x.dimension_type,x.dimension_value,x.metric_code,x.metric_count,x.metric_amount,@now,@now,@now
FROM (
SELECT 'all' dimension_type,'all' dimension_value,'member_new' metric_code,28 metric_count,0 metric_amount
UNION ALL SELECT 'all','all','trade_order',156,1286500
UNION ALL SELECT 'channel','wechat','recharge_success',43,586000
UNION ALL SELECT 'channel','bank','withdrawal_success',18,236000
UNION ALL SELECT 'task','all','task_settled',67,33500
) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_dashboard_daily_stat s
WHERE s.tenant_id=@tenant_id AND s.stat_date=CURDATE() AND s.dimension_type=x.dimension_type
AND s.dimension_value=x.dimension_value AND s.metric_code=x.metric_code
);
-- --------------------------------------------------------------------------
-- 2. 门户:站点配置、文本及版本、Banner、商品与分类
-- --------------------------------------------------------------------------
INSERT INTO hg_site_config_version
(`tenant_id`,`config_no`,`config_group`,`schema_version`,`config_json`,`config_digest`,`publish_status`,`effective_at`,`published_at`,`approval_request_id`,`base_version_id`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-CFG-',LPAD(x.status,2,'0')),'demo_site','1.0',
JSON_OBJECT('siteName',CONCAT('演示站点-',x.status),'customerService','400-800-0000','status',x.status),
SHA2(CONCAT('demo-config-',x.status),256),x.status,DATE_ADD(@now,INTERVAL x.status DAY),
IF(x.status=3,DATE_SUB(@now,INTERVAL 1 DAY),NULL),
COALESCE((SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(LEAST(x.status+1,8),2,'0'))),0),
0,x.status-1,CONCAT('本地演示配置状态 ',x.status),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
WHERE NOT EXISTS (SELECT 1 FROM hg_site_config_version v WHERE v.config_no=CONCAT('DEMO-CFG-',LPAD(x.status,2,'0')));
-- 门户文本不使用演示占位数据,正式初始化见 20261008_portal_content_initial.sql。
INSERT INTO hg_banner
(`tenant_id`,`name`,`position`,`image_attachment_id`,`image_url`,`alt_text`,`target_type`,`target_value`,`start_at`,`end_at`,`publish_status`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO Banner-',x.status),IF(MOD(x.status,2)=1,'home_top','home_popup'),0,
CONCAT('https://picsum.photos/seed/banner-',x.status,'/1200/360'),CONCAT('演示 Banner 状态 ',x.status),
1+MOD(x.status-1,3),IF(MOD(x.status,3)=0,'https://example.com',CONCAT('/demo/banner/',x.status)),
DATE_SUB(@now,INTERVAL 2 DAY),DATE_ADD(@now,INTERVAL 30 DAY),x.status,x.status*10,x.status-1,
'本地演示数据',@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
WHERE NOT EXISTS (SELECT 1 FROM hg_banner b WHERE b.name=CONCAT('DEMO Banner-',x.status));
INSERT INTO hg_product_category
(`tenant_id`,`pid`,`level`,`tree`,`category_code`,`name`,`status`,`sort`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,0,1,'',x.code,x.name,x.status,x.sort,@admin_id,@admin_id,@now,@now
FROM (
SELECT 'DEMO_DAILY' code,'演示日用百货' name,1 status,20 sort
UNION ALL SELECT 'DEMO_DIGITAL','演示数码家电',1,30
UNION ALL SELECT 'DEMO_DISABLED','演示停用分类',2,99
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_product_category c WHERE c.tenant_id=@tenant_id AND c.category_code=x.code);
SET @demo_category_id = (SELECT id FROM hg_product_category WHERE tenant_id=@tenant_id AND category_code='DEMO_DAILY' LIMIT 1);
INSERT INTO hg_product
(`tenant_id`,`product_no`,`category_id`,`product_type`,`payment_type`,`name`,`shop_name`,`price_amount`,`currency`,`cover_attachment_id`,`cover_url`,`detail_html`,`is_recommended`,`publish_status`,`start_at`,`end_at`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-P-',LPAD(x.status,2,'0')),@demo_category_id,IF(MOD(x.status,2)=0,1,2),'balance',
CONCAT(x.label,'演示商品'),'Olons 演示店',9900+x.status*1000,'CNY',0,
CONCAT('https://picsum.photos/seed/product-',x.status,'/640/480'),
CONCAT('<h3>',x.label,'演示商品</h3><p>用于后台状态展示。</p>'),IF(MOD(x.status,2)=1,1,2),x.status,
DATE_SUB(@now,INTERVAL 3 DAY),DATE_ADD(@now,INTERVAL 30 DAY),x.status*10,x.status-1,'本地演示数据',
@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,'草稿' label UNION ALL SELECT 2,'待审' UNION ALL SELECT 3,'已发布'
UNION ALL SELECT 4,'已下线' UNION ALL SELECT 5,'已归档'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_product p WHERE p.tenant_id=@tenant_id AND p.product_no=CONCAT('DEMO-P-',LPAD(x.status,2,'0')));
-- --------------------------------------------------------------------------
-- 3. 会员、等级、隐私资料、钱包、通知和任务大厅
-- --------------------------------------------------------------------------
INSERT INTO hg_app_member_level
(`tenant_id`,`level_code`,`name`,`icon_attachment_id`,`icon_url`,`current_version_id`,`member_count`,`status`,`sort`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.code,x.name,0,CONCAT('https://picsum.photos/seed/level-',x.sort,'/128/128'),0,x.member_count,x.status,x.sort,
'本地演示等级',@admin_id,@admin_id,@now,@now
FROM (
SELECT 'DEMO_VIP2' code,'白银VIP' name,26 member_count,1 status,20 sort
UNION ALL SELECT 'DEMO_VIP3','黄金VIP',12,1,30
UNION ALL SELECT 'DEMO_VIP_DISABLED','停用等级',0,2,99
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member_level l WHERE l.tenant_id=@tenant_id AND l.level_code=x.code);
SET @level_normal_id = COALESCE((SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id AND level_code='VIP1' LIMIT 1),(SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id ORDER BY id LIMIT 1));
SET @level_silver_id = (SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP2' LIMIT 1);
SET @level_gold_id = (SELECT id FROM hg_app_member_level WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP3' LIMIT 1);
INSERT INTO hg_app_member_level_version
(`tenant_id`,`level_id`,`version_no`,`upgrade_amount`,`gift_amount`,`daily_order_limit`,`commission_rate`,`daily_withdraw_limit`,`rule_json`,`publish_status`,`effective_at`,`published_at`,`approval_request_id`,`base_version_id`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,@level_silver_id,100+x.status,x.status*100000,x.status*1000,5+x.status,100+x.status*25,1+x.status,
JSON_OBJECT('demo',TRUE,'status',x.status,'dailyOrderLimit',5+x.status),x.status,
DATE_ADD(@now,INTERVAL x.status DAY),IF(x.status=3,DATE_SUB(@now,INTERVAL 1 DAY),NULL),
COALESCE((SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(LEAST(x.status+1,8),2,'0'))),0),
0,x.status-1,CONCAT('演示等级版本状态 ',x.status),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (SELECT 1 status UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_level_version v WHERE v.level_id=@level_silver_id AND v.version_no=100+x.status
);
UPDATE hg_app_member_level l
JOIN hg_app_member_level_version v ON v.level_id=l.id AND v.publish_status=3 AND v.version_no=103
SET l.current_version_id=v.id
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`)
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')),
@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,
IF(x.member_status=3,DATE_SUB(@now,INTERVAL 1 DAY),NULL)
FROM (
SELECT 1 seq,@level_normal_id level_id,1 member_status,1 risk_status
UNION ALL SELECT 2,@level_silver_id,1,2
UNION ALL SELECT 3,@level_gold_id,2,3
UNION ALL SELECT 4,@level_normal_id,3,1
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member m WHERE m.tenant_id=@tenant_id AND m.member_no=CONCAT('DEMO-MB-',LPAD(x.seq,2,'0')));
SET @member_1 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-01' LIMIT 1);
SET @member_2 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-02' LIMIT 1);
SET @member_3 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-03' LIMIT 1);
SET @member_4 = (SELECT id FROM hg_app_member WHERE tenant_id=@tenant_id AND member_no='DEMO-MB-04' LIMIT 1);
INSERT INTO hg_app_member_profile
(`tenant_id`,`member_id`,`real_name_cipher`,`real_name_mask`,`id_no_cipher`,`id_no_hash`,`id_no_mask`,`avatar_attachment_id`,`kyc_status`,`kyc_verified_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,CONCAT('DEMO_NAME_CIPHER_',x.seq),CONCAT('演示',x.seq,'*'),
CONCAT('DEMO_ID_CIPHER_',x.seq),SHA2(CONCAT('3101011990010100',x.seq),256),CONCAT('310101********00',x.seq),0,
x.kyc_status,IF(x.kyc_status=2,DATE_SUB(@now,INTERVAL x.seq DAY),NULL),@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 seq,@member_1 member_id,1 kyc_status UNION ALL SELECT 2,@member_2,2 UNION ALL SELECT 3,@member_3,3 UNION ALL SELECT 4,@member_4,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member_profile p WHERE p.member_id=x.member_id);
INSERT INTO hg_app_member_address
(`tenant_id`,`member_id`,`receiver_cipher`,`receiver_mask`,`mobile_cipher`,`mobile_mask`,`province`,`city`,`district`,`address_cipher`,`address_mask`,`is_default`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,CONCAT('DEMO_RECEIVER_CIPHER_',x.seq),CONCAT('演示',x.seq,'*'),
CONCAT('DEMO_ADDRESS_MOBILE_',x.seq),CONCAT('138****20',LPAD(x.seq,2,'0')),'上海市','上海市',IF(x.seq=1,'浦东新区','徐汇区'),
CONCAT('DEMO_ADDRESS_CIPHER_',x.seq),CONCAT('演示路 ',x.seq,'** 号'),x.is_default,@admin_id,@admin_id,@now,@now
FROM (SELECT 1 seq,@member_1 member_id,1 is_default UNION ALL SELECT 2,@member_2,2 UNION ALL SELECT 3,@member_3,1) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_address a WHERE a.member_id=x.member_id AND a.address_mask=CONCAT('演示路 ',x.seq,'** 号')
);
INSERT INTO hg_app_member_payment_account
(`tenant_id`,`member_id`,`account_type`,`bank_code`,`bank_name`,`holder_cipher`,`holder_mask`,`mobile_cipher`,`mobile_mask`,`account_no_cipher`,`account_no_hash`,`account_no_mask`,`qr_attachment_id`,`verify_status`,`is_default`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,x.account_type,CONCAT('BANK',x.account_type),x.bank_name,
CONCAT('DEMO_HOLDER_CIPHER_',x.account_type),CONCAT('演示',x.account_type,'*'),CONCAT('DEMO_PAY_MOBILE_',x.account_type),
CONCAT('138****30',LPAD(x.account_type,2,'0')),CONCAT('DEMO_ACCOUNT_CIPHER_',x.account_type),
SHA2(CONCAT('demo-account-',x.account_type),256),CONCAT('**** **** **** ',LPAD(1000+x.account_type,4,'0')),0,
IF(x.account_type IN (1,3,5),2,1),IF(x.account_type=1,1,2),@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 account_type,@member_1 member_id,'演示银行' bank_name UNION ALL
SELECT 2,@member_2,'数字钱包' UNION ALL SELECT 3,@member_3,'云闪付' UNION ALL
SELECT 4,@member_1,'支付宝' UNION ALL SELECT 5,@member_2,'微信'
) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_payment_account a WHERE a.tenant_id=@tenant_id AND a.account_no_hash=SHA2(CONCAT('demo-account-',x.account_type),256)
);
SET @payment_account_id = (SELECT id FROM hg_app_member_payment_account WHERE tenant_id=@tenant_id AND account_no_hash=SHA2('demo-account-1',256) LIMIT 1);
INSERT INTO hg_app_member_status_log
(`tenant_id`,`member_id`,`from_status`,`to_status`,`reason_code`,`reason_text`,`effective_at`,`expire_at`,`approval_request_id`,`operator_id`,`created_at`)
SELECT @tenant_id,x.member_id,x.from_status,x.to_status,CONCAT('demo_status_',x.seq),x.reason_text,
DATE_SUB(@now,INTERVAL x.seq DAY),IF(x.to_status=2,DATE_ADD(@now,INTERVAL 30 DAY),NULL),
(SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(x.seq+3,2,'0')) LIMIT 1),@reviewer_id,@now
FROM (
SELECT 1 seq,@member_3 member_id,1 from_status,2 to_status,'风控审核后禁用' reason_text
UNION ALL SELECT 2,@member_2,2,1,'复核后恢复正常'
UNION ALL SELECT 3,@member_4,1,3,'用户申请注销'
) x
WHERE NOT EXISTS (
SELECT 1 FROM hg_app_member_status_log l WHERE l.member_id=x.member_id AND l.reason_code=CONCAT('demo_status_',x.seq)
);
INSERT INTO hg_wallet_account
(`tenant_id`,`member_id`,`currency`,`available_amount`,`frozen_amount`,`total_income`,`total_expense`,`account_status`,`version`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,'CNY',x.available_amount,x.frozen_amount,x.total_income,x.total_expense,x.account_status,x.seq,@now,@now
FROM (
SELECT 1 seq,@member_1 member_id,880000 available_amount,20000 frozen_amount,1200000 total_income,300000 total_expense,1 account_status
UNION ALL SELECT 2,@member_2,356000,44000,700000,300000,1
UNION ALL SELECT 3,@member_3,0,0,120000,120000,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_account a WHERE a.tenant_id=@tenant_id AND a.member_id=x.member_id AND a.currency='CNY');
SET @wallet_1 = (SELECT id FROM hg_wallet_account WHERE tenant_id=@tenant_id AND member_id=@member_1 AND currency='CNY' LIMIT 1);
SET @wallet_2 = (SELECT id FROM hg_wallet_account WHERE tenant_id=@tenant_id AND member_id=@member_2 AND currency='CNY' LIMIT 1);
INSERT INTO hg_wallet_ledger
(`tenant_id`,`ledger_no`,`account_id`,`member_id`,`biz_type`,`biz_no`,`entry_type`,`direction`,`amount`,`before_amount`,`after_amount`,`currency`,`reversal_of`,`idempotency_key`,`remark`,`operator_id`,`occurred_at`,`created_at`)
SELECT @tenant_id,CONCAT('DEMO-LG-',LPAD(x.seq,2,'0')),x.account_id,x.member_id,x.biz_type,CONCAT('DEMO-BIZ-',LPAD(x.seq,2,'0')),
x.entry_type,x.direction,x.amount,x.before_amount,x.after_amount,'CNY',0,CONCAT('DEMO-LEDGER-IDEMP-',x.seq),x.remark,@admin_id,
DATE_SUB(@now,INTERVAL x.seq HOUR),DATE_SUB(@now,INTERVAL x.seq HOUR)
FROM (
SELECT 1 seq,@wallet_1 account_id,@member_1 member_id,'recharge' biz_type,'recharge_credit' entry_type,1 direction,100000 amount,500000 before_amount,600000 after_amount,'充值入账' remark
UNION ALL SELECT 2,@wallet_1,@member_1,'withdrawal','withdrawal_debit',2,50000,600000,550000,'提现扣款'
UNION ALL SELECT 3,@wallet_2,@member_2,'task','task_commission',1,3000,300000,303000,'任务佣金'
UNION ALL SELECT 4,@wallet_2,@member_2,'adjustment','manual_deduct',2,2000,303000,301000,'人工扣回'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_ledger l WHERE l.tenant_id=@tenant_id AND l.ledger_no=CONCAT('DEMO-LG-',LPAD(x.seq,2,'0')));
SET @ledger_recharge = (SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-01' LIMIT 1);
SET @ledger_withdraw = (SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-02' LIMIT 1);
SET @ledger_task = (SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-03' LIMIT 1);
INSERT INTO hg_wallet_ledger
(`tenant_id`,`ledger_no`,`account_id`,`member_id`,`biz_type`,`biz_no`,`entry_type`,`direction`,`amount`,`before_amount`,`after_amount`,`currency`,`reversal_of`,`idempotency_key`,`remark`,`operator_id`,`occurred_at`,`created_at`)
SELECT @tenant_id,'DEMO-LG-05',@wallet_2,@member_2,'task','DEMO-BIZ-03','task_commission_reversal',2,3000,301000,298000,'CNY',@ledger_task,
'DEMO-LEDGER-IDEMP-5','任务佣金冲正演示',@admin_id,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-05');
INSERT INTO hg_wallet_adjustment_request
(`tenant_id`,`request_no`,`member_id`,`account_id`,`adjust_type`,`direction`,`amount`,`reason_code`,`reason_text`,`evidence_json`,`idempotency_key`,`request_status`,`approval_request_id`,`ledger_id`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-WA-',LPAD(x.status,2,'0')),x.member_id,x.account_id,x.adjust_type,x.direction,1000*x.status,
CONCAT('demo_adjust_',x.status),CONCAT('演示资金调账状态 ',x.status),JSON_ARRAY(),CONCAT('DEMO-WA-IDEMP-',x.status),x.status,
COALESCE((SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(x.status+1,2,'0'))),0),
IF(x.status=4,COALESCE((SELECT id FROM hg_wallet_ledger WHERE ledger_no='DEMO-LG-04'),0),0),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@wallet_1 account_id,1 adjust_type,1 direction
UNION ALL SELECT 2,@member_2,@wallet_2,2,1
UNION ALL SELECT 3,@member_1,@wallet_1,3,2
UNION ALL SELECT 4,@member_2,@wallet_2,4,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_wallet_adjustment_request r WHERE r.request_no=CONCAT('DEMO-WA-',LPAD(x.status,2,'0')));
INSERT INTO hg_app_member_notice
(`tenant_id`,`member_id`,`title`,`content`,`source_type`,`start_at`,`end_at`,`notice_status`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,x.member_id,CONCAT('DEMO 通知-',x.seq),x.content,x.source_type,DATE_SUB(@now,INTERVAL 1 DAY),
DATE_ADD(@now,INTERVAL 30 DAY),x.notice_status,@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 seq,0 member_id,'系统维护通知(真实)' content,1 source_type,1 notice_status
UNION ALL SELECT 2,@member_1,'运营活动效果模拟',2,1
UNION ALL SELECT 3,@member_2,'已撤回的真实通知',1,2
UNION ALL SELECT 4,0,'已撤回的运营模拟',2,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_app_member_notice n WHERE n.title=CONCAT('DEMO 通知-',x.seq));
INSERT INTO hg_task_hall
(`tenant_id`,`hall_code`,`name`,`icon_attachment_id`,`icon_url`,`summary`,`commission_rate`,`rate_unit`,`client_route`,`publish_status`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO_HALL_',x.status),CONCAT(x.label,'任务大厅'),0,
CONCAT('https://picsum.photos/seed/hall-',x.status,'/256/256'),CONCAT('用于展示',x.label,'状态'),100+x.status*20,
'basis_point',CONCAT('/task-hall/demo-',x.status),x.status,x.status*10,x.status-1,'本地演示数据',@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,'草稿' label UNION ALL SELECT 2,'待审' UNION ALL SELECT 3,'已发布'
UNION ALL SELECT 4,'已下线' UNION ALL SELECT 5,'已归档'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_task_hall h WHERE h.tenant_id=@tenant_id AND h.hall_code=CONCAT('DEMO_HALL_',x.status));
INSERT INTO hg_task_hall_level (`tenant_id`,`hall_id`,`level_id`,`created_at`)
SELECT @tenant_id,h.id,l.id,@now
FROM hg_task_hall h
JOIN hg_app_member_level l ON l.level_code IN ('VIP1','DEMO_VIP2','DEMO_VIP3') AND l.tenant_id=@tenant_id
WHERE h.hall_code LIKE 'DEMO_HALL_%' AND h.tenant_id=@tenant_id
AND NOT EXISTS (SELECT 1 FROM hg_task_hall_level hl WHERE hl.tenant_id=@tenant_id AND hl.hall_id=h.id AND hl.level_id=l.id);
-- --------------------------------------------------------------------------
-- 4. 商品任务、交易订单、充值、提现、财务复核和客服
-- --------------------------------------------------------------------------
SET @demo_hall_id = (SELECT id FROM hg_task_hall WHERE tenant_id=@tenant_id AND hall_code='DEMO_HALL_3' LIMIT 1);
INSERT INTO hg_task
(`tenant_id`,`task_no`,`hall_id`,`title`,`description`,`detail_html`,`cover_attachment_id`,`cover_url`,`commission_amount`,`commission_rate`,`daily_limit`,`per_member_limit`,`start_at`,`end_at`,`publish_status`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-TK-',LPAD(x.status,2,'0')),@demo_hall_id,CONCAT(x.label,'演示任务'),
CONCAT('这是',x.label,'状态的任务数据'),CONCAT('<h3>',x.label,'任务</h3><p>请按要求提交演示凭证。</p>'),0,
CONCAT('https://picsum.photos/seed/task-',x.status,'/640/360'),500+x.status*100,50*x.status,100,1,
DATE_SUB(@now,INTERVAL 3 DAY),DATE_ADD(@now,INTERVAL 30 DAY),x.status,x.status*10,x.status-1,
'本地演示数据',@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,'草稿' label UNION ALL SELECT 2,'待审' UNION ALL SELECT 3,'已发布'
UNION ALL SELECT 4,'已下线' UNION ALL SELECT 5,'已归档'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_task t WHERE t.tenant_id=@tenant_id AND t.task_no=CONCAT('DEMO-TK-',LPAD(x.status,2,'0')));
INSERT INTO hg_task_level (`tenant_id`,`task_id`,`level_id`,`created_at`)
SELECT @tenant_id,t.id,l.id,@now
FROM hg_task t
JOIN hg_app_member_level l ON l.level_code IN ('VIP1','DEMO_VIP2','DEMO_VIP3') AND l.tenant_id=@tenant_id
WHERE t.task_no LIKE 'DEMO-TK-%' AND t.tenant_id=@tenant_id
AND NOT EXISTS (SELECT 1 FROM hg_task_level tl WHERE tl.tenant_id=@tenant_id AND tl.task_id=t.id AND tl.level_id=l.id);
SET @task_published_id = (SELECT id FROM hg_task WHERE tenant_id=@tenant_id AND task_no='DEMO-TK-03' LIMIT 1);
SET @product_published_id = (SELECT id FROM hg_product WHERE tenant_id=@tenant_id AND product_no='DEMO-P-03' LIMIT 1);
INSERT INTO hg_trade_order
(`tenant_id`,`order_no`,`member_id`,`task_id`,`product_id`,`product_name`,`order_type`,`quantity`,`unit_price_amount`,`total_amount`,`commission_amount`,`currency`,`member_level_id`,`rule_snapshot`,`message`,`order_status`,`freeze_status`,`approval_request_id`,`matched_at`,`completed_at`,`unfrozen_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-ORD-',LPAD(x.status,2,'0')),x.member_id,
IF(x.order_type=2,@task_published_id,0),IF(x.order_type<>2,@product_published_id,0),CONCAT(x.label,'演示订单'),x.order_type,
1,10000+x.status*100,10000+x.status*100,500+x.status*10,'CNY',x.level_id,
JSON_OBJECT('demo',TRUE,'orderStatus',x.status,'commissionRate',200),CONCAT('演示订单状态:',x.label),x.status,
1+MOD(x.status-1,3),IF(x.status IN (6,7,8),(SELECT id FROM hg_approval_request WHERE approval_no='DEMO-AP-04' LIMIT 1),0),
IF(x.status>=2,DATE_SUB(@now,INTERVAL x.status HOUR),NULL),IF(x.status=4,DATE_SUB(@now,INTERVAL 1 HOUR),NULL),
IF(x.status=2,DATE_SUB(@now,INTERVAL 30 MINUTE),NULL),@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@level_normal_id level_id,1 order_type,'匹配中' label
UNION ALL SELECT 2,@member_2,@level_silver_id,2,'待处理'
UNION ALL SELECT 3,@member_1,@level_normal_id,3,'处理中'
UNION ALL SELECT 4,@member_2,@level_silver_id,1,'已完成'
UNION ALL SELECT 5,@member_1,@level_normal_id,2,'已超时'
UNION ALL SELECT 6,@member_2,@level_silver_id,1,'已冻结'
UNION ALL SELECT 7,@member_1,@level_normal_id,3,'已取消'
UNION ALL SELECT 8,@member_2,@level_silver_id,2,'失败'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_trade_order o WHERE o.tenant_id=@tenant_id AND o.order_no=CONCAT('DEMO-ORD-',LPAD(x.status,2,'0')));
-- 任务审核需要独立订单,避免 trade_order_id 唯一索引冲突。
INSERT INTO hg_trade_order
(`tenant_id`,`order_no`,`member_id`,`task_id`,`product_id`,`product_name`,`order_type`,`quantity`,`unit_price_amount`,`total_amount`,`commission_amount`,`currency`,`member_level_id`,`rule_snapshot`,`message`,`order_status`,`freeze_status`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-TS-ORD-',x.status),x.member_id,@task_published_id,0,'任务审核关联订单',2,1,0,0,500+x.status*100,
'CNY',x.level_id,JSON_OBJECT('demo',TRUE,'submissionStatus',x.status),'任务审核关联订单',4,1,@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@level_normal_id level_id UNION ALL SELECT 2,@member_2,@level_silver_id
UNION ALL SELECT 3,@member_1,@level_normal_id UNION ALL SELECT 4,@member_2,@level_silver_id
UNION ALL SELECT 5,@member_1,@level_normal_id
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_trade_order o WHERE o.tenant_id=@tenant_id AND o.order_no=CONCAT('DEMO-TS-ORD-',x.status));
INSERT INTO hg_task_submission
(`tenant_id`,`submission_no`,`trade_order_id`,`task_id`,`member_id`,`member_level_id`,`evidence_text`,`evidence_attachment_ids`,`submission_status`,`commission_amount`,`success_rate`,`reviewed_by`,`reviewed_at`,`review_reason_code`,`review_reason`,`allow_resubmit`,`ledger_id`,`settled_at`,`reversal_approval_id`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-TS-',LPAD(x.status,2,'0')),o.id,@task_published_id,x.member_id,x.level_id,
CONCAT('演示任务凭证,审核状态:',x.label),JSON_ARRAY(CONCAT('https://picsum.photos/seed/evidence-',x.status,'/800/600')),
x.status,500+x.status*100,7000+x.status*300,IF(x.status=1,0,@reviewer_id),IF(x.status=1,NULL,DATE_SUB(@now,INTERVAL 1 HOUR)),
IF(x.status=3,'evidence_invalid',''),IF(x.status=3,'凭证不符合要求',IF(x.status>1,'演示审核意见','')),
IF(x.status=3,1,2),IF(x.status IN (4,5),@ledger_task,0),IF(x.status IN (4,5),DATE_SUB(@now,INTERVAL 2 HOUR),NULL),
IF(x.status=5,(SELECT id FROM hg_approval_request WHERE approval_no='DEMO-AP-07' LIMIT 1),0),@admin_id,@admin_id,
DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,@level_normal_id level_id,'待审核' label UNION ALL
SELECT 2,@member_2,@level_silver_id,'已通过' UNION ALL SELECT 3,@member_1,@level_normal_id,'已驳回' UNION ALL
SELECT 4,@member_2,@level_silver_id,'已结算' UNION ALL SELECT 5,@member_1,@level_normal_id,'已冲正'
) x
JOIN hg_trade_order o ON o.order_no=CONCAT('DEMO-TS-ORD-',x.status) AND o.tenant_id=@tenant_id
WHERE NOT EXISTS (SELECT 1 FROM hg_task_submission s WHERE s.submission_no=CONCAT('DEMO-TS-',LPAD(x.status,2,'0')));
INSERT INTO hg_payment_channel
(`tenant_id`,`channel_code`,`name`,`channel_type`,`direction`,`config_cipher`,`min_amount`,`max_amount`,`fee_type`,`fee_fixed_amount`,`fee_rate`,`status`,`sort`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,'demo_disabled','演示停用通道',1,3,'DEMO_CONFIG_CIPHER',100,1000000,1,0,30,2,99,@admin_id,@admin_id,@now,@now
WHERE NOT EXISTS (SELECT 1 FROM hg_payment_channel c WHERE c.tenant_id=@tenant_id AND c.channel_code='demo_disabled');
SET @payment_channel_id = COALESCE((SELECT id FROM hg_payment_channel WHERE tenant_id=@tenant_id AND channel_code='wechat' LIMIT 1),(SELECT id FROM hg_payment_channel WHERE tenant_id=@tenant_id ORDER BY id LIMIT 1));
INSERT INTO hg_recharge_order
(`tenant_id`,`recharge_no`,`member_id`,`channel_id`,`request_amount`,`paid_amount`,`currency`,`external_no`,`voucher_attachment_ids`,`recharge_type`,`recharge_status`,`remark`,`review_reason_code`,`review_reason`,`approval_request_id`,`ledger_id`,`paid_at`,`reviewed_at`,`credited_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-RC-',LPAD(x.status,2,'0')),x.member_id,@payment_channel_id,10000*x.status,
IF(x.status=3,10000*x.status,0),'CNY',IF(x.status=3,CONCAT('EXT-DEMO-RC-',x.status),''),JSON_ARRAY(),
IF(MOD(x.status,2)=1,1,2),x.status,CONCAT('演示充值状态:',x.label),IF(x.status=4,'risk_rejected',''),
IF(x.status=4,'演示风控驳回',''),IF(x.status IN (2,3,4),(SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(x.status+2,2,'0')) LIMIT 1),0),
IF(x.status=3,@ledger_recharge,0),IF(x.status IN (2,3),DATE_SUB(@now,INTERVAL 3 HOUR),NULL),
IF(x.status IN (3,4),DATE_SUB(@now,INTERVAL 2 HOUR),NULL),IF(x.status=3,DATE_SUB(@now,INTERVAL 1 HOUR),NULL),
@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,'用户未支付' label UNION ALL SELECT 2,@member_2,'手动审核'
UNION ALL SELECT 3,@member_1,'已入账' UNION ALL SELECT 4,@member_2,'手动驳回'
UNION ALL SELECT 5,@member_1,'已过期' UNION ALL SELECT 6,@member_2,'已取消'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_recharge_order r WHERE r.tenant_id=@tenant_id AND r.recharge_no=CONCAT('DEMO-RC-',LPAD(x.status,2,'0')));
INSERT INTO hg_withdrawal_order
(`tenant_id`,`withdrawal_no`,`member_id`,`payment_account_id`,`channel_id`,`request_amount`,`fee_amount`,`actual_amount`,`currency`,`account_snapshot_cipher`,`account_mask`,`bank_name`,`holder_mask`,`risk_result`,`withdrawal_status`,`review_reason_code`,`review_reason`,`approval_request_id`,`external_no`,`freeze_ledger_id`,`final_ledger_id`,`reviewed_at`,`processed_at`,`completed_at`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO-WD-',LPAD(x.status,2,'0')),x.member_id,@payment_account_id,@payment_channel_id,
20000+x.status*1000,100,19900+x.status*1000,'CNY','DEMO_ACCOUNT_SNAPSHOT','**** **** **** 1001','演示银行','演示*',
JSON_OBJECT('riskLevel',IF(x.status=6,'high','low'),'demo',TRUE),x.status,
IF(x.status=6,'risk_rejected',''),IF(x.status=6,'演示风控驳回',''),
IF(x.status IN (2,3,4,5,6),(SELECT id FROM hg_approval_request WHERE approval_no=CONCAT('DEMO-AP-',LPAD(LEAST(x.status+1,8),2,'0')) LIMIT 1),0),
IF(x.status IN (4,5),CONCAT('EXT-DEMO-WD-',x.status),''),IF(x.status>=2,@ledger_withdraw,0),IF(x.status IN (4,5,6),@ledger_withdraw,0),
IF(x.status>=2,DATE_SUB(@now,INTERVAL 3 HOUR),NULL),IF(x.status>=3,DATE_SUB(@now,INTERVAL 2 HOUR),NULL),
IF(x.status IN (4,5,6,7),DATE_SUB(@now,INTERVAL 1 HOUR),NULL),@admin_id,@admin_id,DATE_SUB(@now,INTERVAL x.status DAY),@now
FROM (
SELECT 1 status,@member_1 member_id,'待初审' label UNION ALL SELECT 2,@member_2,'复核中'
UNION ALL SELECT 3,@member_1,'付款中' UNION ALL SELECT 4,@member_2,'已到账'
UNION ALL SELECT 5,@member_1,'付款失败' UNION ALL SELECT 6,@member_2,'已驳回'
UNION ALL SELECT 7,@member_1,'已取消'
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_withdrawal_order w WHERE w.tenant_id=@tenant_id AND w.withdrawal_no=CONCAT('DEMO-WD-',LPAD(x.status,2,'0')));
INSERT INTO hg_finance_review
(`tenant_id`,`approval_request_id`,`biz_type`,`biz_id`,`review_stage`,`reviewer_id`,`decision`,`reason_code`,`reason_text`,`snapshot_json`,`created_at`)
SELECT @tenant_id,a.id,x.biz_type,x.biz_id,x.stage,@reviewer_id,x.decision,CONCAT('demo_finance_',x.seq),
IF(x.decision=1,'演示审核通过','演示审核驳回'),JSON_OBJECT('demo',TRUE,'decision',x.decision),DATE_SUB(@now,INTERVAL x.seq HOUR)
FROM (
SELECT 1 seq,'recharge' biz_type,(SELECT id FROM hg_recharge_order WHERE recharge_no='DEMO-RC-03' LIMIT 1) biz_id,1 stage,1 decision,'DEMO-AP-04' approval_no
UNION ALL SELECT 2,'recharge',(SELECT id FROM hg_recharge_order WHERE recharge_no='DEMO-RC-04' LIMIT 1),2,2,'DEMO-AP-05'
UNION ALL SELECT 3,'withdrawal',(SELECT id FROM hg_withdrawal_order WHERE withdrawal_no='DEMO-WD-04' LIMIT 1),1,1,'DEMO-AP-07'
UNION ALL SELECT 4,'withdrawal',(SELECT id FROM hg_withdrawal_order WHERE withdrawal_no='DEMO-WD-06' LIMIT 1),2,2,'DEMO-AP-06'
) x
JOIN hg_approval_request a ON a.approval_no=x.approval_no
WHERE NOT EXISTS (
SELECT 1 FROM hg_finance_review f WHERE f.approval_request_id=a.id AND f.review_stage=x.stage AND f.reviewer_id=@reviewer_id
);
INSERT INTO hg_customer_service
(`tenant_id`,`service_code`,`name`,`avatar_url`,`work_time`,`online_status`,`service_url`,`backup_contact`,`session_mapping`,`status`,`sort`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,CONCAT('DEMO_CS_',x.seq),CONCAT('演示客服-',x.seq),CONCAT('https://picsum.photos/seed/cs-',x.seq,'/128/128'),
IF(x.seq=1,'周一至周日 09:00-22:00','工作日 09:00-18:00'),x.online_status,CONCAT('https://example.com/customer-service/',x.seq),
CONCAT('400-800-000',x.seq),JSON_OBJECT('channel','demo','seat',x.seq),x.status,x.seq*10,'本地演示客服',
@admin_id,@admin_id,@now,@now
FROM (
SELECT 1 seq,1 online_status,1 status UNION ALL SELECT 2,2,1 UNION ALL SELECT 3,1,2 UNION ALL SELECT 4,2,2
) x
WHERE NOT EXISTS (SELECT 1 FROM hg_customer_service c WHERE c.tenant_id=@tenant_id AND c.service_code=CONCAT('DEMO_CS_',x.seq));
-- 修正统计字段,保持演示列表与关联数据一致。
UPDATE hg_app_member_level l
SET l.member_count=(SELECT COUNT(*) FROM hg_app_member m WHERE m.level_id=l.id AND m.deleted_at IS NULL)
WHERE l.tenant_id=@tenant_id AND l.level_code IN ('VIP1','DEMO_VIP2','DEMO_VIP3','DEMO_VIP_DISABLED');
-- 输出导入后的表行数,便于核对。
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema=DATABASE()
AND table_name IN (
'hg_approval_request','hg_approval_action','hg_sensitive_access_log','hg_biz_audit_log','hg_idempotency_record','hg_outbox_event','hg_dashboard_daily_stat',
'hg_site_config_version','hg_content','hg_content_version','hg_banner','hg_product','hg_product_category',
'hg_app_member','hg_app_member_profile','hg_app_member_address','hg_app_member_payment_account','hg_app_member_status_log',
'hg_wallet_account','hg_wallet_ledger','hg_wallet_adjustment_request','hg_app_member_notice','hg_app_member_level','hg_app_member_level_version',
'hg_task_hall','hg_task_hall_level','hg_task','hg_task_level','hg_task_submission','hg_trade_order','hg_payment_channel',
'hg_recharge_order','hg_withdrawal_order','hg_finance_review','hg_customer_service'
)
ORDER BY table_name;
@@ -0,0 +1,128 @@
-- Olons Admin 商城看板演示数据
-- 适用:MySQL 8.0+ 本地开发环境。
-- 范围:仅写入 hg_dashboard_daily_stat,生成最近 61 天数据。
-- 特征:可重复执行;相同租户、日期、维度和指标会更新为本脚本的演示值。
SET NAMES utf8mb4;
SET @tenant_id = 0;
-- 数据库容器使用 UTC;看板按 Asia/Shanghai 解析 DATETIME,因此写入本地当前时间。
SET @calculated_at = DATE_ADD(UTC_TIMESTAMP(3), INTERVAL 8 HOUR);
-- 全局指标:数量型、金额型以及期末快照。
INSERT INTO hg_dashboard_daily_stat
(`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`,`metric_count`,`metric_amount`,`calculated_at`,`created_at`,`updated_at`)
SELECT
@tenant_id,
DATE_SUB(CURDATE(), INTERVAL days.day_offset DAY),
'global',
'all',
metrics.metric_code,
CASE metrics.metric_code
WHEN 'member_total' THEN 5068 - days.day_offset * 4 - MOD(days.day_offset, 3)
WHEN 'member_new' THEN 28 + MOD(days.day_offset * 7, 25)
WHEN 'recharge_member' THEN 192 + MOD(days.day_offset * 11, 76)
WHEN 'product_total' THEN 368 - FLOOR(days.day_offset / 7)
WHEN 'trade_order' THEN 813 + MOD(days.day_offset * 37, 240)
ELSE 0
END,
CASE metrics.metric_code
WHEN 'trade_order' THEN 128650000 + MOD(days.day_offset * 1379000, 42000000)
WHEN 'recharge_success' THEN 58600000 + MOD(days.day_offset * 731000, 17000000)
WHEN 'recharge_pending' THEN 4600000 + MOD(days.day_offset * 139000, 1800000)
WHEN 'withdrawal_success' THEN 23600000 + MOD(days.day_offset * 511000, 8000000)
WHEN 'withdrawal_pending' THEN 2350000 + MOD(days.day_offset * 97000, 1200000)
WHEN 'commission' THEN 8640000 + MOD(days.day_offset * 173000, 3200000)
WHEN 'referral_commission' THEN 18000000 + MOD(days.day_offset * 241000, 6200000)
WHEN 'interest_transfer' THEN 33000000 + MOD(days.day_offset * 359000, 9600000)
WHEN 'wallet_available' THEN 895643025 - days.day_offset * 125000 + MOD(days.day_offset * 17003, 90000)
WHEN 'wallet_frozen' THEN 154680000 + MOD(days.day_offset * 223000, 3600000)
ELSE 0
END,
@calculated_at,
@calculated_at,
@calculated_at
FROM (
SELECT ones.n + tens.n * 10 AS day_offset
FROM (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) ones
CROSS JOIN (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) tens
WHERE ones.n + tens.n * 10 <= 60
) days
CROSS JOIN (
SELECT 'member_total' metric_code UNION ALL
SELECT 'member_new' UNION ALL
SELECT 'recharge_member' UNION ALL
SELECT 'product_total' UNION ALL
SELECT 'trade_order' UNION ALL
SELECT 'recharge_success' UNION ALL
SELECT 'recharge_pending' UNION ALL
SELECT 'withdrawal_success' UNION ALL
SELECT 'withdrawal_pending' UNION ALL
SELECT 'commission' UNION ALL
SELECT 'referral_commission' UNION ALL
SELECT 'interest_transfer' UNION ALL
SELECT 'wallet_available' UNION ALL
SELECT 'wallet_frozen'
) metrics
WHERE TRUE
ON DUPLICATE KEY UPDATE
`metric_count` = VALUES(`metric_count`),
`metric_amount` = VALUES(`metric_amount`),
`calculated_at` = VALUES(`calculated_at`),
`updated_at` = VALUES(`updated_at`);
-- 渠道指标:今日基准值合计与全局充值、提现金额保持一致。
INSERT INTO hg_dashboard_daily_stat
(`tenant_id`,`stat_date`,`dimension_type`,`dimension_value`,`metric_code`,`metric_count`,`metric_amount`,`calculated_at`,`created_at`,`updated_at`)
SELECT
@tenant_id,
DATE_SUB(CURDATE(), INTERVAL days.day_offset DAY),
'channel',
channels.channel,
channels.metric_code,
channels.base_count + MOD(days.day_offset * channels.count_step, channels.count_range),
channels.base_amount + MOD(days.day_offset * channels.amount_step, channels.amount_range),
@calculated_at,
@calculated_at,
@calculated_at
FROM (
SELECT ones.n + tens.n * 10 AS day_offset
FROM (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4
UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9
) ones
CROSS JOIN (
SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) tens
WHERE ones.n + tens.n * 10 <= 60
) days
CROSS JOIN (
SELECT 'wechat' channel, 'recharge_success' metric_code, 236 base_count, 28800000 base_amount, 13 count_step, 58 count_range, 373000 amount_step, 6800000 amount_range
UNION ALL SELECT 'wechat', 'withdrawal_success', 31, 4600000, 5, 17, 127000, 1700000
UNION ALL SELECT 'alipay', 'recharge_success', 169, 19800000, 11, 46, 281000, 5200000
UNION ALL SELECT 'alipay', 'withdrawal_success', 42, 7200000, 7, 23, 163000, 2100000
UNION ALL SELECT 'bank', 'recharge_success', 87, 10000000, 7, 31, 199000, 3600000
UNION ALL SELECT 'bank', 'withdrawal_success', 78, 11800000, 9, 34, 221000, 3200000
) channels
WHERE TRUE
ON DUPLICATE KEY UPDATE
`metric_count` = VALUES(`metric_count`),
`metric_amount` = VALUES(`metric_amount`),
`calculated_at` = VALUES(`calculated_at`),
`updated_at` = VALUES(`updated_at`);
SELECT
COUNT(*) AS dashboard_rows,
MIN(stat_date) AS start_date,
MAX(stat_date) AS end_date,
MAX(calculated_at) AS calculated_at
FROM hg_dashboard_daily_stat
WHERE tenant_id = @tenant_id
AND dimension_type IN ('global', 'channel')
AND stat_date BETWEEN DATE_SUB(CURDATE(), INTERVAL 60 DAY) AND CURDATE();
@@ -0,0 +1,205 @@
-- Olons Admin 门户文本正式初始化
-- 来源:admin.olons.top「文本管理」,同步日期:2026-10-08。
-- 适用:MySQL 8.0+ 本地开发环境。
-- 行为:替换 tenant_id=0 的全部门户文本及版本,仅保留下列 12 条正式内容。
-- 注意:文本管理不保存图片,来源正文中的 img 标签已移除。
SET NAMES utf8mb4;
SET @tenant_id = 0;
SET @admin_id = COALESCE((SELECT id FROM hg_admin_member ORDER BY id LIMIT 1), 1);
SET @now = DATE_ADD(UTC_TIMESTAMP(3), INTERVAL 8 HOUR);
DROP TEMPORARY TABLE IF EXISTS tmp_portal_content_seed;
CREATE TEMPORARY TABLE tmp_portal_content_seed (
content_key varchar(64) NOT NULL,
content_type varchar(32) NOT NULL,
title varchar(200) NOT NULL,
summary varchar(500) NOT NULL,
body_html longtext NOT NULL,
sort int NOT NULL,
PRIMARY KEY (content_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
INSERT INTO tmp_portal_content_seed
(`content_key`,`content_type`,`title`,`summary`,`body_html`,`sort`)
VALUES
(
'platform_announcement',
'notice',
'平台公告',
'平台充值时间及安全提醒',
'<p>尊敬的会员,您好!关于微信转卡/支付宝转卡,异地转账出现风控问题。由于支付宝,微信属于三方支付软件,公信部为防止洗黑钱,有此类问题均属于正常现象,请您不用担心,建议您使用手机银行进行充值,简单快捷,祝您生活愉快!</p><p><br></p><p><span style="color: rgb(225, 60, 57);">特别通知!!!</span></p><p><span style="color: rgb(225, 60, 57);">平台充值时间,早上9:00—21:00。期间任何联系您充值的人都是冒充平台客服,为避免资金损失,请在9:00—21:00进行充值。</span></p>',
10
),
(
'platform_introduction',
'about',
'平台简介',
'平台服务协议、使用规则与常见问题说明',
'<p>本协议阐述适用于您使用本平台所提供的各种工具和服务(下称“服务”)的条款和条件。</p><h3>一、接受条款</h3><p>通过网站或 APP 进入即表示您同意与平台订立本协议,并受本协议条款约束。平台可依法调整服务条款;修订内容公布后生效。如您不同意相关变更,应停止使用服务。</p><h3>二、谁可使用本平台</h3><p>服务仅供能够根据相关法律订立具有法律约束力合约的个人或公司使用。使用者应年满十八周岁。平台有权依法拒绝或中止向不符合条件的用户提供服务。</p><h3>三、费用说明</h3><p>平台不会以押金、保证金等名义私下联系用户索取费用。涉及充值、提现等操作时,请认准平台官方入口与在线客服。</p><h3>四、用户资料</h3><p>用户应保证注册、交易及使用服务过程中提交的数据、文本和其他资料真实、准确、完整,并对所提交资料承担相应责任。用户不得提交侵犯他人合法权益或违反法律法规的内容。</p><h3>五、注册义务</h3><p>用户应按要求提供真实、准确、完整且反映当前情况的信息,并及时维护更新。若资料不真实、不准确或不完整,平台有权暂停或终止相关服务。</p><h3>六、账号、密码和保密</h3><p>用户应妥善保管账号和密码,并对账号下发生的活动负责。如发现账号被未经授权使用,应立即通知平台,并在每次使用结束后正确退出。</p><h3>七、信息发布规则</h3><p>用户提供的信息不得包含欺诈、侵权、违法、淫秽、恶意程序、骚扰、虚假身份或其他不适合发布的内容,不得利用服务收集他人信息或发送垃圾信息。</p><h3>八、禁止事项</h3><p>用户不得通过平台发布、购买或销售可能使平台违反法律法规的物品或服务,也不得发布平台认为不适合展示或交易的内容。</p><h3>九、隐私保护</h3><p>平台将按照隐私规则处理用户提供的信息。用户主动公开的信息可能被其他用户获取和使用,请谨慎披露个人资料。</p><h3>十、服务终止</h3><p>对于违反协议、长期未登录或存在安全风险的账号,平台可依法暂停或终止部分或全部服务,并对相关信息采取必要措施。</p><h3>十一、责任说明</h3><p>服务按现状提供。因网络、系统维护、不可抗力或第三方服务造成的中断,平台将在合理范围内及时处理。用户通过服务获取信息或进行操作时,应自行判断并承担相应风险。</p><h3>十二、订单规则</h3><p>不同订单类型适用人群及结算规则可能不同。用户接取任务前应阅读订单说明,并在规定时间内完成。团队任务需团队成员按要求共同完成。</p><h3>十三、常见问题</h3><p><strong>1. 关于充值:</strong>请在“我的—我的钱包”中发起充值,核对转账信息,并按页面要求提交到账凭证。如遇问题请联系在线客服。</p><p><strong>2. 关于提现:</strong>请先绑定本人有效的提现账户,再在钱包页面提交申请。实际到账时间以支付渠道和平台审核结果为准。</p><p><strong>3. 关于任务:</strong>请完善真实资料和收货地址,按会员等级、任务规则及系统提示完成订单。</p><p><strong>4. 关于订单冻结:</strong>未按要求完成的订单可能进入冻结状态,具体处理方式以订单页面和客服说明为准。</p><p><strong>5. 关于代理:</strong>邀请关系及返佣比例以平台当前规则为准,可在代理页面或联系在线客服查询。</p><h3>十四、法律适用</h3><p>用户使用服务时应遵守中华人民共和国大陆地区相关法律法规。本协议部分条款无效的,不影响其他条款的效力。</p><h3>十五、不可抗力</h3><p>因自然灾害、战争、政府行为、通信设施故障或其他平台合理控制范围以外的原因导致延迟或无法履约的,平台将在法律允许范围内处理。</p>',
20
),
(
'task_order_rules',
'rule',
'抢单规则',
'充值赠送、会员等级及抢单佣金规则',
'<p>充值赠送金:</p><p><span style="color: rgb(255, 77, 79);">充值500赠送20元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值1888元以上,平台赠送永久白银会员,佣金比例0.02,每天代购20单,额外奖励88元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值10000元以上,平台赠送永久黄金会员,佣金比例0.022,每天代购30单,额外奖励188元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值30000元以上,平台赠送永久铂金会员,佣金比例0.03,每天代购40单,额外奖励388元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值50000元以上,平台赠送永久钻石会员,佣金比例0.035,每天代购50单,额外奖励588元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值88888元以上,平台赠送永久星耀会员,每天代购50单,额外奖励1888元。</span></p><p><span style="color: rgb(255, 77, 79);">单次充值188888元以上,平台赠送永久至尊会员,每天代购1000单,额外奖励2888元。</span></p>',
30
),
(
'agent_cooperation',
'about',
'代理合作',
'平台代理合作与三级返佣说明',
'<h3>平台代理模式</h3><p>平台用户可以通过推荐新人成为平台代理,并获得额外的动态奖励。直推一级用户奖励为一级用户每天所得佣金的16%,二级用户奖励为二级用户每天所得佣金的8%,三级用户奖励为三级用户每天所得佣金的4%。</p>',
40
),
(
'frequently_asked_questions',
'faq',
'常见问题',
'充值、提现、任务、订单冻结及代理常见问题',
'<p>温馨提示:同一个人银行卡信息请勿重复注册抢单,经发现将会冻结账号。平台禁止一卡绑定多账户,请勿使用个人多账号。</p><h3>1. 关于充值</h3><p>充值请在“我的—我的钱包”界面操作。填写转账人姓名和转账金额,按平台提供的账户完成汇款后,提交转账到账凭证。充值前请仔细核对账户信息,每次充值请以页面或客服提供的最新信息为准。</p><h3>2. 关于提现</h3><p>提现前请绑定本人有效的提现信息,在平台工作时间内通过“我的—我的钱包”提交提现申请。实际到账时间以支付渠道及审核结果为准。</p><h3>3. 关于领取</h3><p>请在 APP 内完善真实资料和收货地址,并绑定本人有效的银行卡。充值到账后可按会员等级及系统提示参与任务。</p><h3>4. 关于订单冻结</h3><p>系统会根据账户情况匹配订单。订单未按要求完成时可能被冻结,具体解冻和处理规则以订单页面及客服说明为准。</p><h3>5. 关于代理</h3><p>平台用户推荐新人后可获得相应等级的动态奖励,具体比例以平台当前代理规则为准。</p><h3>6. 关于运营时间</h3><p>平台运营时间为每天9:00—21:00,用户可在运营时间内参与任务。订单应在规定时间内完成,如遇问题请及时联系在线客服。</p>',
50
),
(
'beginner_guide',
'guide',
'新手指南',
'新用户使用指引',
'<p>详情请咨询在线客服。充值、提现及平台使用问题均可通过在线客服获取帮助,客服24小时在线。</p>',
60
),
(
'interest_treasure_rules',
'interest_rule',
'利息宝规则',
'利息宝转入、收益与转出规则',
'<p>利息宝用于管理符合条件的账户余额。转入金额、收益计算、可转出时间及限额,以利息宝页面实时展示的规则为准。</p><p>操作前请仔细核对金额;如遇收益或转出问题,请联系在线客服处理。</p>',
70
),
(
'home_ticker_content',
'home_ticker',
'首页滚动内容',
'首页滚动公告文案',
'<p>平台充值福利大放送</p>',
80
),
(
'task_order_notes',
'order_tip',
'抢单备注',
'抢单时间、资金与信用分注意事项',
'<p>1. 平台运营时间为每天上午9:00至晚上21:00。</p><p>2. 每次充值前请通过官方入口核对最新账户信息,如有疑问请联系在线客服。</p><p>3. 领取匹配订单后,请以系统显示“排队成功”为准。</p><p>4. 匹配订单时间会根据会员等级有所不同,正常会员通常为0至20分钟。</p><p>5. 会员账户需满足页面展示的最低启动资金要求后方可参与。</p><p>6. 订单需要在规定时间内完成,请勿超时。</p><p>7. 提现需满足平台当前信用分要求,请妥善维护账户信用。</p><p>8. 信用分下降时请联系在线客服了解恢复规则。</p>',
90
),
(
'recharge_campaign',
'activity',
'充值活动',
'充值赠送与会员奖励活动说明',
'<p><span style="color: rgb(255, 0, 0);">充值赠送金:</span></p><p><span style="color: rgb(255, 0, 0);">充值500元赠送20元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值3000元以上,赠送会员7天并额外奖励58元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值5000元以上,赠送白银会员7天并额外奖励88元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值10000元以上,赠送黄金会员7天并额外奖励188元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值30000元以上,赠送铂金会员7天并额外奖励388元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值50000元以上,赠送钻石会员7天并额外奖励588元。</span></p><p><span style="color: rgb(255, 0, 0);">单次充值88888元以上,赠送星耀会员7天并额外奖励1888元。</span></p><p>活动期间的充值时间、任务时间、会员激活条件和奖励到账规则,以活动页面及平台最新公告为准。</p>',
100
),
(
'home_popup_content',
'popup',
'首页弹窗内容',
'首页特别公告及充值安全提醒',
'<h2><span style="color: rgb(225, 60, 57);">特别公告通知</span></h2><p>最新推出线下购买充值卡福利。线下购买指定充值卡券后,可在平台按流程兑换;符合活动条件的用户可获得相应奖励。</p><p>指定商家包括:<span style="color: rgb(225, 60, 57);">大润发、永辉、沃尔玛、中国石化、天虹商场、麦德龙、盒马鲜生、世纪华联、华润万家等。</span></p><p><span style="color: rgb(225, 60, 57);">特别通知:平台充值时间为早上8:00至20:00。期间如有人通过非官方渠道联系您充值,请提高警惕,避免资金损失。</span></p>',
110
),
(
'company_qualification',
'qualification',
'公司资质',
'平台业务模式及合作品牌介绍',
'<h3><span style="color: rgb(231, 76, 60);">多实惠,多乐趣</span></h3><p>平台商品大数据中心每天会将需要提高曝光度的优质商家产品发布到平台商城,提供给平台用户进行代购抢单。平台商城货源以主流电商平台商品为主,为商家和用户带来更多优惠与便利。</p><h3><span style="color: rgb(231, 76, 60);">新国潮,新消费</span></h3><p>通过创新的交互体验,将娱乐与商品交易融合,优化传统电商的消费者触达和交互形式,降低营销与交易成本。平台通过产品创新、数据分析和资源支持,与中小企业共同成长,为用户提供更多品质、实惠的国货选择。</p><h3><span style="color: rgb(231, 76, 60);">合作品牌</span></h3><p>平台将持续引入符合业务要求的合作品牌和优质商家,具体合作信息以平台公示为准。</p>',
120
);
START TRANSACTION;
-- 先删除当前租户的全部旧版本和文本,避免演示数据或废弃标识残留。
DELETE v
FROM hg_content_version v
JOIN hg_content c ON c.id = v.content_id
WHERE c.tenant_id = @tenant_id;
DELETE FROM hg_content WHERE tenant_id = @tenant_id;
COMMIT;
-- 初始化环境中重置编号,避免删除演示数据后从旧 ID 继续递增。
ALTER TABLE hg_content_version AUTO_INCREMENT = 1;
ALTER TABLE hg_content AUTO_INCREMENT = 1;
START TRANSACTION;
INSERT INTO hg_content
(`tenant_id`,`content_key`,`content_type`,`title`,`published_version_id`,`publish_status`,`published_at`,`sort`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT
@tenant_id,
seed.content_key,
seed.content_type,
seed.title,
0,
3,
@now,
seed.sort,
0,
'原后台文本正式初始化',
@admin_id,
@admin_id,
@now,
@now
FROM tmp_portal_content_seed seed
ORDER BY seed.sort;
INSERT INTO hg_content_version
(`tenant_id`,`content_id`,`version_no`,`title`,`summary`,`body_html`,`body_text`,`cover_url`,`asset_ids`,`publish_status`,`effective_at`,`approval_request_id`,`created_by`,`created_at`)
SELECT
@tenant_id,
content.id,
1,
seed.title,
seed.summary,
seed.body_html,
TRIM(REPLACE(REGEXP_REPLACE(seed.body_html, '<[^>]+>', ' '), '&nbsp;', ' ')),
'',
JSON_ARRAY(),
3,
@now,
0,
@admin_id,
@now
FROM tmp_portal_content_seed seed
JOIN hg_content content
ON content.tenant_id = @tenant_id
AND content.content_key = seed.content_key;
UPDATE hg_content c
JOIN hg_content_version v
ON v.content_id = c.id
AND v.version_no = 1
SET c.published_version_id = v.id
WHERE c.tenant_id = @tenant_id;
COMMIT;
DROP TEMPORARY TABLE IF EXISTS tmp_portal_content_seed;
SELECT
c.id,
c.content_key,
c.content_type,
c.title,
c.publish_status,
v.version_no,
CHAR_LENGTH(v.body_text) AS body_text_length
FROM hg_content c
JOIN hg_content_version v ON v.id = c.published_version_id
WHERE c.tenant_id = @tenant_id
ORDER BY c.sort, c.id;
@@ -0,0 +1,66 @@
-- 会员等级初始化数据
-- 来源:admin.olons.top 会员等级列表(2026-10-09)
-- 金额统一转换为分;佣金比例统一转换为万分比。
-- 脚本可重复执行,并兼容早期本地演示等级编码。
SET NAMES utf8mb4;
SET @tenant_id = 0;
SET @admin_id = COALESCE((SELECT id FROM hg_admin_member ORDER BY id LIMIT 1), 1);
SET @now = NOW(3);
START TRANSACTION;
-- 复用已有演示等级,避免会员、任务等关联关系失效。
UPDATE hg_app_member_level SET level_code='VIP2',name='白银会员' WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP2';
UPDATE hg_app_member_level SET level_code='VIP3',name='黄金会员' WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP3';
UPDATE hg_app_member_level SET level_code='VIP4',name='铂金会员' WHERE tenant_id=@tenant_id AND level_code='DEMO_VIP_DISABLED';
INSERT INTO hg_app_member_level
(`tenant_id`,`level_code`,`name`,`icon_attachment_id`,`icon_url`,`current_version_id`,`member_count`,`status`,`sort`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`,`deleted_at`)
SELECT @tenant_id,x.level_code,x.name,0,'',0,0,1,x.sort,'原管理系统会员等级初始化',@admin_id,@admin_id,@now,@now,NULL
FROM (
SELECT 'VIP1' level_code,'普通会员' name,10 sort
UNION ALL SELECT 'VIP2','白银会员',20
UNION ALL SELECT 'VIP3','黄金会员',30
UNION ALL SELECT 'VIP4','铂金会员',40
UNION ALL SELECT 'VIP5','钻石会员',50
UNION ALL SELECT 'VIP6','星耀会员',60
UNION ALL SELECT 'VIP7','至尊会员',70
) x
ON DUPLICATE KEY UPDATE
`name`=VALUES(`name`),`icon_attachment_id`=0,`icon_url`='',`status`=1,`sort`=VALUES(`sort`),
`remark`=VALUES(`remark`),`updated_by`=@admin_id,`updated_at`=@now,`deleted_at`=NULL,`deleted_by`=0;
INSERT INTO hg_app_member_level_version
(`tenant_id`,`level_id`,`version_no`,`upgrade_amount`,`gift_amount`,`daily_order_limit`,`commission_rate`,`daily_withdraw_limit`,`rule_json`,`publish_status`,`effective_at`,`published_at`,`approval_request_id`,`base_version_id`,`version`,`remark`,`created_by`,`updated_by`,`created_at`,`updated_at`)
SELECT @tenant_id,l.id,1,x.upgrade_amount,x.gift_amount,x.daily_order_limit,x.commission_rate,x.daily_withdraw_limit,
JSON_OBJECT('source','admin.olons.top','initialized',TRUE),3,NULL,@now,0,0,0,'原管理系统会员等级初始化',@admin_id,@admin_id,@now,@now
FROM hg_app_member_level l
JOIN (
SELECT 'VIP1' level_code,50000 upgrade_amount,2000 gift_amount,10 daily_order_limit,180 commission_rate,4 daily_withdraw_limit
UNION ALL SELECT 'VIP2',188800,8800,20,200,5
UNION ALL SELECT 'VIP3',1000000,18800,30,220,10
UNION ALL SELECT 'VIP4',3000000,38800,40,300,15
UNION ALL SELECT 'VIP5',5000000,58800,50,350,20
UNION ALL SELECT 'VIP6',8888800,188800,80,400,100
UNION ALL SELECT 'VIP7',18888800,288800,1000,500,100
) x ON x.level_code=l.level_code
WHERE l.tenant_id=@tenant_id
ON DUPLICATE KEY UPDATE
`upgrade_amount`=VALUES(`upgrade_amount`),`gift_amount`=VALUES(`gift_amount`),
`daily_order_limit`=VALUES(`daily_order_limit`),`commission_rate`=VALUES(`commission_rate`),
`daily_withdraw_limit`=VALUES(`daily_withdraw_limit`),`rule_json`=VALUES(`rule_json`),
`publish_status`=3,`effective_at`=NULL,`published_at`=@now,`approval_request_id`=0,
`remark`=VALUES(`remark`),`updated_by`=@admin_id,`updated_at`=@now;
UPDATE hg_app_member_level l
JOIN hg_app_member_level_version v ON v.level_id=l.id AND v.version_no=1
SET l.current_version_id=v.id,l.updated_by=@admin_id,l.updated_at=@now
WHERE l.tenant_id=@tenant_id AND l.level_code IN ('VIP1','VIP2','VIP3','VIP4','VIP5','VIP6','VIP7');
UPDATE hg_app_member_level l
SET l.member_count=(SELECT COUNT(*) FROM hg_app_member m WHERE m.level_id=l.id AND m.deleted_at IS NULL)
WHERE l.tenant_id=@tenant_id AND l.level_code IN ('VIP1','VIP2','VIP3','VIP4','VIP5','VIP6','VIP7');
COMMIT;