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
-- ----------------------------
-- 服务商模块:服务商标识列 + 服务商配置表
--
-- 目标库 hugray-account(库名含连字符,任何引用都必须用反引号)。
-- account_user 是加列(表里已有数据),故用幂等过程做存在性判断,绝不 DROP;
-- account_provider 是新建,用 CREATE TABLE IF NOT EXISTS。脚本可重复执行。
-- 演示数据另见 hugray_provider_demo_20261012.sql。
--
-- 【服务商为什么落在 account_user】
-- 服务商是「会员的另一个身份」,不是另一套用户体系:
--   * 它的「L1/L2/L3 虚拟账号权益」与 account_user.system_level(C<L1<L2<L3<L4)是同一套等级;
--   * 它的登录账号/密码复用该表的 username / password(BCrypt),登的是服务商小程序;
--   * 它的「已授权数」就是该表里 supplier_id 指向自己的那些行按等级分组。
-- 故不另建用户表,只在 account_user 上打一个 provider_flag 标识,
-- 其余公司资质类配置放 account_provider(与 account_user 1:1)。
--
-- 【枚举取值】沿用本库约定,直接存值、不建 sys_dict_type,前端维护同名常量:
--   服务商标识 provider_flag:0非服务商  1服务商
--   状态 status             :0正常     1禁用
--   删除标志 del_flag       :0存在     2删除
-- ----------------------------
 
USE `hugray-account`;
 
-- ---------- 幂等辅助过程(末尾删掉,不在库里留痕) ----------
-- MySQL 的 ALTER TABLE 不支持 ADD COLUMN IF NOT EXISTS,重复执行会因
-- Duplicate column name 中断,故用临时过程做存在性判断。
DROP PROCEDURE IF EXISTS `hugray_add_column`;
 
DELIMITER $$
CREATE PROCEDURE `hugray_add_column`(IN p_table VARCHAR(64), IN p_column VARCHAR(64), IN p_definition TEXT)
BEGIN
  IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS
                 WHERE TABLE_SCHEMA = DATABASE()
                   AND TABLE_NAME   = p_table
                   AND COLUMN_NAME  = p_column) THEN
    SET @ddl = CONCAT('ALTER TABLE `', p_table, '` ADD COLUMN `', p_column, '` ', p_definition);
    PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt;
  END IF;
END$$
DELIMITER ;
 
-- ---------- 1. account_user:服务商标识 ----------
-- 不建索引:目前没有任何按标识筛选的查询(列表筛的是服务商配置表),等真出现再加。
-- 【写入收口】这一列刻意不进 AccountUser 的通用 insert/update 动态列,
-- 否则 POST/PUT /account/user 的请求体里带个 providerFlag=1 就能把任意会员标成服务商。
-- 它的唯一写入点是 AccountUserMapper.updateUserProviderFlag,调用方只有服务商模块
-- (与认证审核模块通过 updateUserAuthStatus 回写认证状态同一个套路)。
CALL `hugray_add_column`('account_user', 'provider_flag', "char(1) DEFAULT '0' COMMENT '服务商标识(0非服务商 1服务商)'");
 
-- ---------- 2. account_provider:服务商配置(与 account_user 1:1) ----------
-- 不加 UNIQUE(user_id):逻辑删除的残留行会永久占用唯一键,「一会员至多一条」只能应用层保证
-- (与 account_certification、account_user.username、account_city_company 同一个坑)。
--
-- region 存市名文本而不是 city_id:
--   注册地区是公司档案上的描述性字段,不是业务关联;account_city.city_name 本就是应用层唯一键
--   (见 hugray_account_city_20261012.sql 顶部注释);且必须与 account_user.city 同口径
--   (会员表存的就是市名文本),新增服务商时两个字段写同一个值。
--   顺带的好处:城市后被禁用时,下拉框的 value 就是市名本身,即使选项里没有它也会原样显示,
--   城市公司档案那套「boundCity / isBoundCityDisabled」兜底完全不需要。
--
-- status 是「服务商资格」的状态,与 account_user.status(会员账户状态)是两回事:
-- 列表页的禁用/启用只改这一列,不动会员账户,否则会连带影响会员列表与 C 端登录。
--
-- license_url 存的是上传接口返回的绝对地址(http://<file.domain>/statics/...),
-- 换环境后旧值会指向老主机,故给足 500(与 account_certification.license_image 同宽)。
CREATE TABLE IF NOT EXISTS `account_provider` (
  `id`            bigint(20)   NOT NULL AUTO_INCREMENT COMMENT '服务商编号',
  `user_id`       bigint(20)   NOT NULL                COMMENT '关联账号(account_user.user_id,1:1)',
  `company_name`  varchar(128) NOT NULL                COMMENT '公司名称',
  `contact_name`  varchar(64)  NOT NULL                COMMENT '联系人(列表「管理人」列)',
  `contact_phone` varchar(20)  NOT NULL                COMMENT '手机号码',
  `credit_code`   varchar(64)  DEFAULT NULL            COMMENT '统一社会信用代码',
  `legal_person`  varchar(64)  DEFAULT NULL            COMMENT '企业法人',
  `region`        varchar(64)  DEFAULT NULL            COMMENT '注册地区(存市名文本,取自 account_city.city_name)',
  `register_date` date         DEFAULT NULL            COMMENT '注册日期',
  `address`       varchar(255) DEFAULT NULL            COMMENT '企业地址',
  `license_url`   varchar(500) DEFAULT NULL            COMMENT '营业执照图片地址',
  `l1_quota`      int(11)      NOT NULL DEFAULT 0      COMMENT '虚拟账号权益:L1 分配数量',
  `l2_quota`      int(11)      NOT NULL DEFAULT 0      COMMENT '虚拟账号权益:L2 分配数量',
  `l3_quota`      int(11)      NOT NULL DEFAULT 0      COMMENT '虚拟账号权益:L3 分配数量',
  `status`        char(1)      DEFAULT '0'             COMMENT '状态(0正常 1禁用)',
  `del_flag`      char(1)      DEFAULT '0'             COMMENT '删除标志(0存在 2删除)',
  `create_by`     varchar(64)  DEFAULT ''              COMMENT '创建者',
  `create_time`   datetime     DEFAULT NULL            COMMENT '创建时间',
  `update_by`     varchar(64)  DEFAULT ''              COMMENT '更新者',
  `update_time`   datetime     DEFAULT NULL            COMMENT '更新时间',
  `remark`        varchar(500) DEFAULT NULL            COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `idx_provider_user` (`user_id`),
  KEY `idx_provider_status` (`status`)
) ENGINE=InnoDB AUTO_INCREMENT=33141000 DEFAULT CHARSET=utf8mb4 COMMENT='服务商配置表(一个会员至多一条)';
 
-- 起始 33141000 对齐原型里的 8 位编号观感(业务上无特殊含义),
-- 与城市公司档案的 33140000 段错开,两个模块的编号一眼能分辨。
-- 不建 region 索引:没有按注册地区筛选的查询。
 
-- ---------- 3. 收尾:删掉临时过程 ----------
DROP PROCEDURE IF EXISTS `hugray_add_column`;
 
-- ---------- 4. 结果核对 ----------
SELECT `table_name`, `table_comment` FROM `information_schema`.`tables`
WHERE `table_schema` = 'hugray-account' AND `table_name` = 'account_provider';
 
SELECT `ordinal_position`, `column_name`, `column_type`, `is_nullable`, `column_default`, `column_comment`
FROM `information_schema`.`columns`
WHERE `table_schema` = 'hugray-account' AND `table_name` = 'account_provider'
ORDER BY `ordinal_position`;
 
-- 应只回 idx_provider_user / idx_provider_status 两个业务索引
SELECT `index_name`, GROUP_CONCAT(`column_name` ORDER BY `seq_in_index`) AS `columns`
FROM `information_schema`.`statistics`
WHERE `table_schema` = 'hugray-account' AND `table_name` = 'account_provider'
GROUP BY `index_name`;
 
-- 标识列应存在且默认 '0'
SELECT `column_name`, `column_type`, `is_nullable`, `column_default`, `column_comment`
FROM `information_schema`.`columns`
WHERE `table_schema` = 'hugray-account' AND `table_name` = 'account_user' AND `column_name` = 'provider_flag';
 
-- 临时过程必须已经删掉,应返回 0 行
SELECT `routine_name` FROM `information_schema`.`routines`
WHERE `routine_schema` = 'hugray-account' AND `routine_name` = 'hugray_add_column';