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
-- ----------------------------
-- 员工管理(账号)页:sys_user 扩两列 —— 职务 + 客服企微二维码
--
-- 目标库 hugray(sys_user 属系统库,与 sys_menu/sys_dict 同库;
-- 带连字符的 `hugray-account` 才是 C 端会员库,两者别搞混)。
-- sys_user 表里已有数据,故用幂等过程做存在性判断,绝不 DROP;脚本可重复执行。
--
-- 【sys_user 就是「后台员工」】
-- 本项目里后台员工 = sys_user,C 端会员 = account_user,是两套用户体系。
-- 本脚本只动 sys_user,与会员表无关。
--
-- 【职务为什么新开一列,而不是复用 sys_post 岗位】
-- 库里 sys_post 有 4 条(董事长/项目经理/人力资源/普通员工)、sys_user_post 有 2 条关联,
-- 编辑弹窗也有「岗位」多选;但业务口径上「职务」是该员工档案上的自由文本描述
-- (如"华东区招商负责人"),与全公司共用的岗位名单不是一回事,
-- 硬塞进岗位表会把描述性文本污染成枚举项。故新开一列。
--
-- 【客服微信为什么存图片地址】
-- 存的是企微加好友二维码图片,不是微信号文本,列表里以缩略图展示、可点击放大。
-- 上传走项目既有的 /file/upload(ruoyi-file 独立服务,网关 /file/** → 9300),
-- 存接口返回的绝对地址(http://<file.domain>/statics/...);换环境后旧值会指向老主机,
-- 故给足 500(与 account_provider.license_url、account_certification.license_image 同宽)。
--
-- 【写入收口】这两列是员工档案的普通可编辑字段,**刻意**进 SysUserMapper 的
-- 通用 insert/update 动态列(编辑弹窗要能改);判定条件写成 `<if test="xxx != null">`
-- 而非 `!= ''`,否则把二维码删掉(置空串)时会被跳过、库里删不掉。
-- 与服务商标识 provider_flag 的处置不同:那个是权限标识,进了通用动态列就等于
-- 请求体带个值即可越权提权,必须单开 UPDATE 语句(见 hugray_account_provider_20261012.sql)。
-- ----------------------------
 
USE `hugray`;
 
-- ---------- 幂等辅助过程(末尾删掉,不在库里留痕) ----------
-- 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. 职务(自由文本) ----------
-- 默认空串而非 NULL:列表里空职务显示为空,不需要前端多做一层判空;
-- 与 nick_name 等既有 varchar 列的 DEFAULT '' 风格一致。
CALL `hugray_add_column`('sys_user', 'job_title', "varchar(64) DEFAULT '' COMMENT '职务(自由文本,不复用 sys_post 岗位)'");
 
-- ---------- 2. 客服企微二维码图片地址 ----------
-- 默认 NULL 而非 '':没有二维码与「有二维码但地址为空」在业务上是同一件事,
-- 用 NULL 表达"没有",前端 v-if 一眼可判。
CALL `hugray_add_column`('sys_user', 'service_qrcode_url', "varchar(500) DEFAULT NULL COMMENT '客服企微二维码图片地址(上传接口返回的绝对地址)'");
 
-- ---------- 3. 收尾:删掉临时过程 ----------
DROP PROCEDURE IF EXISTS `hugray_add_column`;
 
-- ---------- 4. 结果核对 ----------
-- 应回两行,列类型分别是 varchar(64) / varchar(500)
SELECT `ordinal_position`, `column_name`, `column_type`, `is_nullable`, `column_default`, `column_comment`
FROM `information_schema`.`columns`
WHERE `table_schema` = 'hugray' AND `table_name` = 'sys_user'
  AND `column_name` IN ('job_title', 'service_qrcode_url')
ORDER BY `ordinal_position`;
 
-- 存量两行(admin/ry)无需回填:job_title 走 DEFAULT '',service_qrcode_url 走 NULL
SELECT `user_id`, `user_name`, `nick_name`, `job_title`, `service_qrcode_url` FROM `sys_user`;
 
-- 临时过程必须已经删掉,应返回 0 行
SELECT `routine_name` FROM `information_schema`.`routines`
WHERE `routine_schema` = 'hugray' AND `routine_name` = 'hugray_add_column';