-- ---------------------------- -- 服务商模块:示例数据(仅用于开发联调) -- -- 前置:先跑 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`;