-- ===================================================================== -- 为 wl-scrm 后端创建 qqflow 专用服务账号 -- -- 执行库:qqflow 审批引擎库(qqflowengine) -- 用途:wl-scrm 后端内部调用 qqflow(发起/撤回审批、同步进度、 -- 审批人配置页「同步选中」创建审批人账号/绑定企微) -- -- 为什么需要 super_admin: -- · POST /system/user(创建审批人账号)要求 super_admin 或 dept_manager; -- · PUT /system/user/{id}/wecom(给已有账号补绑企微)仅允许 super_admin; -- · 只授 flow_manager 时,「同步选中」会报「权限不足,无法访问」。 -- -- 账号约定: -- username = scrm_service -- password = 自定义强密码(与 wl-scrm 外置配置 qqflow.service.password 一致) -- -- qqflow 密码使用 BCrypt 存储,先生成哈希再替换下面的占位符: -- htpasswd -bnBC 10 "" '你的密码' | tr -d ':\n' -- -- 注意: -- · 本脚本创建的是高权限服务账号,密码只放 wl-scrm 服务端外置配置, -- 不要提交仓库、不要发到群里; -- · 脚本幂等:重复执行会重置该账号密码并补齐 super_admin 角色; -- · 如果 username 已被无关账号占用,第 0 步会先查出来,切勿直接覆盖。 -- ===================================================================== -- 执行前确认当前库:必须是 qqflowengine。 -- 如果在 wlscrmcenter 或测试库执行,生产 qqflow 里不会出现这个账号。 SELECT DATABASE() AS current_database; SET @service_username = 'scrm_service'; -- 替换为 htpasswd 生成的 BCrypt 哈希(60 位,$2a$/$2b$/$2y$ 开头) SET @service_password_hash = '<替换为 BCrypt 哈希>'; SET @super_admin_role_code = 'super_admin'; -- 0) 执行前检查:用户名是否已被占用 -- 有结果时先确认是不是本次要重置的账号;如果是别人在用的账号,请换一个 username。 SELECT id, username, real_name, employee_type, status FROM sys_user WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci; -- 1) 校验 super_admin 角色存在且启用 -- 生产当前应有 id=1 的 super_admin;若没有,请先确认 qqflow 角色模型,不要继续。 SELECT id, role_code, role_name, role_scope, status FROM sys_role WHERE role_code COLLATE utf8mb4_general_ci = @super_admin_role_code COLLATE utf8mb4_general_ci; -- 2.1) 更新已有账号(仅限本脚本管理的账号) -- 只有 real_name 或 employee_type 对得上才更新,避免误改同名但无关的账号 UPDATE sys_user SET password = @service_password_hash, real_name = 'SCRM 服务账号', employee_type = @super_admin_role_code, status = 0, wecom_user_id = NULL, wecom_remind_enabled = 0, update_time = NOW() WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci AND (real_name = 'SCRM 服务账号' OR employee_type = @super_admin_role_code); -- 2.2) 不存在则创建 -- 若 username 已被无关账号占用,这里不会插入;第 0 步/第 4 步会显示 -- 该账号的原状态,此时不要继续,换一个 username 后重跑。 INSERT INTO sys_user (username, password, real_name, dept_id, employee_type, status, wecom_remind_enabled) SELECT @service_username, @service_password_hash, 'SCRM 服务账号', NULL, @super_admin_role_code, 0, 0 FROM DUAL WHERE NOT EXISTS ( SELECT 1 FROM sys_user WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci ); -- 3) 绑定 super_admin 角色(接口鉴权使用) -- 只取「本脚本管理的账号」:如果 username 被无关账号占用,这里取不到 id, -- 不会给无关账号误绑 super_admin;校验结果会显示该账号仍是原 employee_type。 SET @service_user_id = ( SELECT id FROM sys_user WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci AND (real_name = 'SCRM 服务账号' OR employee_type = @super_admin_role_code) LIMIT 1 ); SET @super_admin_role_id = ( SELECT id FROM sys_role WHERE role_code COLLATE utf8mb4_general_ci = @super_admin_role_code COLLATE utf8mb4_general_ci LIMIT 1 ); INSERT INTO sys_user_role (user_id, role_id) SELECT @service_user_id, @super_admin_role_id WHERE @service_user_id IS NOT NULL AND @super_admin_role_id IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM sys_user_role WHERE user_id = @service_user_id AND role_id = @super_admin_role_id ); -- 4) 校验:应返回 1 行: -- employee_type=super_admin、role_code=super_admin、 -- pwd_len=60、pwd_prefix=$2a$/$2b$/$2y$(不是 60 位说明哈希没替换/复制错) SELECT u.id AS user_id, u.username, u.employee_type, u.status AS user_status, CHAR_LENGTH(u.password) AS pwd_len, LEFT(u.password, 4) AS pwd_prefix, r.id AS role_id, r.role_code, r.role_name, r.status AS role_status FROM sys_user u LEFT JOIN sys_user_role ur ON ur.user_id = u.id LEFT JOIN sys_role r ON r.id = ur.role_id WHERE u.username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci; -- ===================================================================== -- 执行后还需要在 wl-scrm 生产外置配置(config/application-prod.properties -- 或环境变量)中配置,并重启 wl-scrm: -- -- qqflow.service.username=scrm_service -- qqflow.service.password=<与上面的明文密码一致> -- -- 如果之前用过其它服务账号,清掉 wl-scrm Redis 中的旧 token(JWT 角色是 -- 登录时写入的,缓存 23 小时;改密码/改角色后必须清): -- -- redis-cli DEL "TOKEN:QQFLOW:SERVICE:default:scrm_service" -- redis-cli DEL "TOKEN:QQFLOW:SERVICE:default:<旧账号>" -- =====================================================================