-- ============================================================================ -- 用途:清理手机号 17307866134 的重复用户(同一微信 openid 的并发注册副本), -- 解除后台"认证审核通过"时报"手机号已存在"的拦截。 -- 日期:2026-10-20 -- 背景: -- 小程序登录 /wx-login/loginByMpWxPhone 是"先按手机号查、查不到再注册"的逻辑, -- 且注册分支只校验 username(addUser 里 phone 为空,saveUser 拦不住)。 -- 2026-10-11 17:20:33 同一 openid 的两个并发请求各自走完"查不到"→插入, -- 于是在 sys_user 生成两条同 openid、同手机号的账号: -- user_id=971 闭炎丽 auth_status=1(待审核) 已传身份证 有 yxe_visit_list 记录 -- user_id=972 (空壳) auth_status=0(未提交) 无任何业务数据 -- shop_user_oauth 同样生成两条 oauth_id 相同的记录。 -- 后台审核"通过"调用 PUT /api/system/user → UserServiceImpl.updateUser, -- 手机号唯一性校验 ne(user_id, 971) 命中 972 → 抛"手机号已存在",审核永远失败。 -- 另外 getByPhone 用 limit 1,可能随机取到空壳 972,导致该用户登录后仍是未认证状态。 -- 影响行数:sys_user 1 行、shop_user_oauth 1 行(均为软删除) -- 是否幂等:是,带 WHERE 限定,可重复执行 -- 配套代码改动:无(本次仅数据清理);接口幂等改造与唯一索引见后续 issue -- -- 说明:972 无订单/余额/积分/任务/填报/地址/子级等任何引用,软删不影响业务; -- 971 保留全部资料与业务数据,软删后即成为该手机号的唯一有效账号。 -- ============================================================================ -- ---------- 1. 执行前核对 ---------- SELECT user_id, username, phone, open_id, auth_status, real_name, deleted, create_time FROM sys_user WHERE user_id IN (971, 972); SELECT id, user_id, oauth_type, oauth_id, deleted, create_time FROM shop_user_oauth WHERE user_id IN (971, 972) OR oauth_id = 'ocS6D110zS65-AdOafsUz7QnkiMM'; -- 期望:971 为有资料、待审核的有效账号;972 为同 openid/同手机号的空壳副本 -- ---------- 2. 变更 ---------- -- 2.1 软删除空壳用户 972 UPDATE sys_user SET deleted = 1, update_time = NOW() WHERE user_id = 972 AND deleted = 0 AND phone = '17307866134'; -- 2.2 软删除 972 对应的第三方授权记录,避免 shop_user_oauth 同 oauth_id 两条 UPDATE shop_user_oauth SET deleted = 1, update_time = NOW() WHERE user_id = 972 AND oauth_id = 'ocS6D110zS65-AdOafsUz7QnkiMM' AND deleted = 0; -- ---------- 3. 执行后核对 ---------- -- 3.1 该手机号的有效账号应只剩 971 一条 SELECT user_id, username, phone, auth_status, deleted FROM sys_user WHERE phone = '17307866134' AND deleted = 0; -- 期望:1 行,user_id=971 -- 3.2 该 openid 的有效授权记录应只剩 1 条 SELECT id, user_id, oauth_id, deleted FROM shop_user_oauth WHERE oauth_id = 'ocS6D110zS65-AdOafsUz7QnkiMM' AND deleted = 0; -- 期望:1 行,user_id=971 -- 3.3 模拟 updateUser 的手机号校验:结果应为 0,即审核可正常提交 SELECT COUNT(*) AS conflict_count FROM sys_user WHERE phone = '17307866134' AND user_id <> 971 AND deleted = 0; -- 期望:0