liujie
昨天 c983a0a398504697a777ffae48e59961b5ee2bd7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
-- ----------------------------
-- 服务商模块:示例数据(仅用于开发联调)
--
-- 前置:先跑 hugray_account_provider_20261012.sql(建 account_provider 与 account_user.provider_flag)。
--
-- 目标库 hugray-account(库名含连字符,引用必须用反引号)。
--
-- 【号段】本脚本只占两段,且都与既有数据错开:
--   账号 user_id   :126~145(服务商账号 126~128 + 被授权会员 130~143)
--   服务商 id      :33141000 起(表 AUTO_INCREMENT 设为 33141000,空表首次插入即取该值;
--                    删完重置故每轮编号恒定)
--   会员演示脚本占 100~125,城市公司档案占 33140001 起——三者互不重叠,可任意子集共存。
--   脚本用带号段的 WHERE 做清理,绝不出现无号段的 DELETE,可重复执行。
--
-- 【统一密码】所有服务商账号密码为 admin123,BCrypt 值与会员演示脚本一致:
-- $2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2
--
-- 【绝不改动的既有数据】
-- 会员 100~125 的 supplier_id 一律不动。库里现存的供货关系只有三条
-- (102->103、110->104、113->112,供货人都是会员而非服务商),
-- 一旦被改写,已验收的会员详情页就会多出别的「供货人」昵称/手机号,等于改了别处的输出。
-- 已授权数靠**新增**会员行来表达,见 §4。
--
-- 【特意构造的边界数据】
--   服务商 127(西安恒盛):provider.status='1' 已禁用,而它的**账号 status 仍是 '0'**——
--     用来验证「禁用服务商资格」不会连带禁用会员账号(列表的禁用/启用只改 account_provider.status)。
--   服务商 128(西宁蓝天):region='西宁',而 account_city 里西宁的 status='1' 已禁用,
--     /options 下拉不含它,但详情页必须仍原样显示「西宁」且能正常保存。
--   服务商 128:L1 权益给 1 但**一条授权都没有**,用来验证「已授权数」恒渲染 L1:0 L2:0 L3:0 三段。
-- ----------------------------
 
USE `hugray-account`;
 
-- ---------- 1. 清理本脚本的号段 ----------
-- 先删子表(服务商配置)再删主表(账号):反过来的话中途失败会留下挂空 user_id 的服务商行。
DELETE FROM `account_provider` WHERE `id`      BETWEEN 33141000 AND 33141099;
DELETE FROM `account_user`     WHERE `user_id` BETWEEN 126 AND 145;
-- 号段外的行一概不碰:西宁的临时测试市(account_city id=132)等数据不归本脚本管。
 
-- 服务商号是自增主键,删完不重置的话每跑一次编号都往后飘,
-- 联调时按上轮记下的编号去调接口会 404(会员演示脚本在申请号上吃过这个亏)。
ALTER TABLE `account_provider` AUTO_INCREMENT = 33141000;
 
-- ---------- 2. 服务商账号(account_user,provider_flag='1') ----------
-- 服务商不是另一套用户体系:登录账号/密码就是本表的 username/password(BCrypt),
-- 「L1/L2/L3 虚拟账号权益」用的也是本表的 system_level 等级体系,故只多一个标识列。
-- system_level 一律保持建表默认 'C':等级是权限,不能建档即白送
-- (selectL4MemberOptions 的准入条件就是 system_level='L4',赋了会让服务商灌满
--  城市公司档案表单的「关联用户」下拉池)。
-- subject_type='3'(企业)、auth_status='0'(未认证)仅作展示,不参与任何权限判定。
-- city 与 §3 的 region 写同一个值:两处同口径,会员列表与详情页看到的城市才一致。
INSERT INTO `account_user`
(`user_id`, `username`, `phone`, `password`, `nickname`, `gender`, `status`,
 `system_level`, `subject_type`, `auth_status`, `city`, `provider_flag`,
 `create_by`, `create_time`, `del_flag`)
VALUES
-- 127 的账号 status 刻意保持 '0':被禁用掉的是服务商资格,不是会员账号(见 §3)
(126, 'provider126', '13800000126', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '张三', '0', '0', 'C', '3', '0', '成都', '1', 'admin', '2026-06-01 10:00:00', '0'),
(127, 'provider127', '13800000127', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '李四', '0', '0', 'C', '3', '0', '西安', '1', 'admin', '2026-06-10 10:00:00', '0'),
(128, 'provider128', '13800000128', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '王五', '0', '0', 'C', '3', '0', '西宁', '1', 'admin', '2026-06-18 10:00:00', '0');
 
-- ---------- 3. 服务商配置(account_provider,与账号 1:1) ----------
-- 编号由 AUTO_INCREMENT 生成(33141000/1/2),故不写 id。
-- 三行的填写完整度刻意递降,用来验证详情页的空值一律显示 -:
--   126 成都云链:字段全填(信用代码/法人/注册日期/企业地址都有)
--   127 西安恒盛:企业法人为空,status='1' 已禁用
--   128 西宁蓝天:除公司名/联系人/手机号/地区外全为空,且地区是被禁用城市
--
-- license_url 三行都是 NULL:**刻意不造假地址**。营业执照存的是上传接口返回的绝对地址,
-- 随便填一个不存在的路径,详情页只会显示一张裂图,反而误导联调。
-- 要验「上传 + 回显」,请在页面上真传一张(需先启动 ruoyi-file 服务,见模块说明)。
INSERT INTO `account_provider`
(`user_id`, `company_name`, `contact_name`, `contact_phone`, `credit_code`, `legal_person`,
 `region`, `register_date`, `address`, `license_url`,
 `l1_quota`, `l2_quota`, `l3_quota`, `status`, `del_flag`,
 `create_by`, `create_time`, `update_by`, `update_time`)
VALUES
(126, '成都云链科技有限公司', '张三', '13800000126', '91510100MA6CXXXX1A', '张三',
 '成都', '2020-03-18', '四川省成都市高新区天府大道中段 1388 号 1 栋 5 层', NULL,
 5, 10, 20, '0', '0', 'admin', '2026-06-01 10:00:00', 'admin', '2026-06-22 17:41:12'),
-- 已禁用:账号 provider127 的 status 仍是 '0',两列互不影响
(127, '西安恒盛供应链有限公司', '李四', '13800000127', '91610100MA6XYYYY2B', NULL,
 '西安', '2021-09-06', NULL, NULL,
 0, 2, 0, '1', '0', 'admin', '2026-06-10 10:00:00', 'admin', '2026-07-05 09:20:33'),
-- 地区「西宁」在 account_city 里已被禁用(status='1'):下拉选不到它,
-- 但详情页必须原样显示并允许原值保存
(128, '西宁蓝天商贸有限公司', '王五', '13800000128', NULL, NULL,
 '西宁', NULL, NULL, NULL,
 1, 0, 0, '0', '0', 'admin', '2026-06-18 10:00:00', NULL, NULL);
 
-- ---------- 4. 被授权的会员(列表「已授权数」的数据来源) ----------
-- 「已授权数」不建新表:它就是 account_user 里 supplier_id 指向本服务商的那些行,
-- 按 system_level 分组计数(只数 del_flag='0',口径是「发出去多少」而非「还剩多少有效」)。
-- 故这里新增会员行来表达授权关系,绝不改既有会员(见文件头)。
--
-- 126 成都云链:L1×1 + L2×3 + L3×8 = 12 条(与原型截图里的 L1:1 L2:3 L3:8 对齐)
-- 127 西安恒盛:L2×2(服务商已禁用,但仍持有授权,用来验证禁用不影响已授权数)
-- 128 西宁蓝天:0 条(验证恒渲染 L1:0 L2:0 L3:0)
-- provider_flag 不写,落建表默认 '0':他们是「被授权的会员」,不是服务商(§5 有断言核对)。
INSERT INTO `account_user`
(`user_id`, `username`, `phone`, `password`, `nickname`, `gender`, `status`,
 `system_level`, `subject_type`, `auth_status`, `city`,
 `supplier_id`, `supplier_bind_time`, `create_by`, `create_time`, `del_flag`)
VALUES
-- ---- 126 成都云链:L1 ----
(130, 'member130', '13800000130', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '顾伟', '0', '0', 'L1', '1', '2', '成都', 126, '2026-06-25 09:30:00', 'admin', '2026-06-25 09:30:00', '0'),
-- ---- 126 成都云链:L2 ----
(131, 'member131', '13800000131', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '黄丽', '1', '0', 'L2', '2', '0', '成都', 126, '2026-07-02 14:12:00', 'admin', '2026-07-02 14:12:00', '0'),
(132, 'member132', '13800000132', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '曹勇', '0', '0', 'L2', '3', '2', '成都', 126, '2026-07-08 11:05:00', 'admin', '2026-07-08 11:05:00', '0'),
(133, 'member133', '13800000133', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '钱静', '1', '0', 'L2', '1', '3', '成都', 126, '2026-07-15 16:40:00', 'admin', '2026-07-15 16:40:00', '0'),
-- ---- 126 成都云链:L3 ----
(134, 'member134', '13800000134', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '严峰', '0', '0', 'L3', '1', '0', '成都', 126, '2026-07-21 10:18:00', 'admin', '2026-07-21 10:18:00', '0'),
(135, 'member135', '13800000135', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '华敏', '1', '0', 'L3', '2', '2', '成都', 126, '2026-07-26 15:52:00', 'admin', '2026-07-26 15:52:00', '0'),
(136, 'member136', '13800000136', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '金磊', '0', '0', 'L3', '3', '1', '成都', 126, '2026-08-01 09:07:00', 'admin', '2026-08-01 09:07:00', '0'),
(137, 'member137', '13800000137', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '魏芳', '1', '0', 'L3', '1', '3', '成都', 126, '2026-08-06 13:33:00', 'admin', '2026-08-06 13:33:00', '0'),
(138, 'member138', '13800000138', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '陶明', '0', '0', 'L3', '2', '0', '成都', 126, '2026-08-12 17:21:00', 'admin', '2026-08-12 17:21:00', '0'),
(139, 'member139', '13800000139', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '姜雪', '1', '0', 'L3', '3', '2', '成都', 126, '2026-08-18 08:44:00', 'admin', '2026-08-18 08:44:00', '0'),
(140, 'member140', '13800000140', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '谢涛', '0', '0', 'L3', '1', '1', '成都', 126, '2026-08-24 14:59:00', 'admin', '2026-08-24 14:59:00', '0'),
(141, 'member141', '13800000141', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '邹倩', '1', '0', 'L3', '2', '3', '成都', 126, '2026-08-30 11:26:00', 'admin', '2026-08-30 11:26:00', '0'),
-- ---- 127 西安恒盛:L2 ----
(142, 'member142', '13800000142', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '范鹏', '0', '0', 'L2', '3', '2', '西安', 127, '2026-07-11 10:02:00', 'admin', '2026-07-11 10:02:00', '0'),
(143, 'member143', '13800000143', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '贺婷', '1', '0', 'L2', '1', '0', '西安', 127, '2026-07-18 16:15:00', 'admin', '2026-07-18 16:15:00', '0');
 
-- ---------- 5. 结果核对 ----------
-- 5.1 列表视图:照抄列表接口的 join(provider ⋈ user 是 1:1,授权数走的是按 supplier_id
--     分组后的派生关系,也是 1:1),三行的 L1/L2/L3 应分别是 1/3/8、0/2/0、0/0/0。
SELECT p.id AS `编号`, u.username AS `账号`, p.contact_name AS `管理人`,
       p.region AS `城市`, p.company_name AS `公司名称`, p.status AS `状态`,
       CONCAT('L1:', COALESCE(g.l1, 0), ' L2:', COALESCE(g.l2, 0), ' L3:', COALESCE(g.l3, 0)) AS `已授权数`,
       p.update_time AS `更新时间`
FROM `account_provider` p
LEFT JOIN `account_user` u ON u.`user_id` = p.`user_id` AND u.`del_flag` = '0'
LEFT JOIN (
  SELECT `supplier_id`,
         SUM(`system_level` = 'L1') AS l1,
         SUM(`system_level` = 'L2') AS l2,
         SUM(`system_level` = 'L3') AS l3
  FROM `account_user` WHERE `del_flag` = '0' GROUP BY `supplier_id`
) g ON g.`supplier_id` = p.`user_id`
WHERE p.`del_flag` = '0'
ORDER BY p.`id` DESC;
 
-- 5.2 授权数与直接分组计数逐条对齐(等价写法,防止上面那条 SQL 自己写错)
SELECT `supplier_id`, `system_level`, COUNT(1) AS `条数`
FROM `account_user`
WHERE `del_flag` = '0' AND `supplier_id` IN (126, 127)
GROUP BY `supplier_id`, `system_level`
ORDER BY `supplier_id`, `system_level`;
 
-- 5.3 断言:既有会员的供货关系一条没变(应仍只有 102->103、110->104、113->112 三行)
SELECT `user_id`, `supplier_id`, `system_level`
FROM `account_user`
WHERE `supplier_id` IS NOT NULL AND `user_id` BETWEEN 100 AND 125
ORDER BY `user_id`;
 
-- 5.4 断言:本脚本号段内只有 3 个服务商,被授权会员一律不是服务商
SELECT `provider_flag` AS `标识`, COUNT(1) AS `人数`,
       GROUP_CONCAT(`user_id` ORDER BY `user_id`) AS `user_id`
FROM `account_user`
WHERE `user_id` BETWEEN 126 AND 145
GROUP BY `provider_flag` ORDER BY `provider_flag`;
 
-- 5.5 断言:服务商 127 已禁用,但它的账号 status 仍是 '0'(两列互不影响)
SELECT p.`id`, p.`status` AS `服务商状态`, u.`status` AS `账号状态`
FROM `account_provider` p JOIN `account_user` u ON u.`user_id` = p.`user_id`
ORDER BY p.`id`;
 
-- 5.6 断言:地区「西宁」在下拉源里是禁用状态(status='1')——所以 §3 那行是个真实边界样本
SELECT `id`, `province`, `city_name`, `status`, `del_flag`
FROM `account_city` WHERE `city_name` IN ('成都', '西安', '西宁') ORDER BY `id`;