Commit Graph
82 Commits
Author SHA1 Message Date
adminandClaude Fable 5 bf1e881a8c feat(mobile): rebuild SOP ask page as WeChat-style chat (batch 1)
客户 2026-07-18 新要求:语音文字交互改为微信聊天式,替代表单式操作
(客户原话 > Figma,已记入版本对比冲突表)。

新增 components/chat/ChatComposer.vue(可复用,练页批次二直接使用):
- 微信式输入条:⊕功能面板(图片/视频、选音频转文字、训练概况)、
  按住说话(touch+mouse,松开即发送/滑出取消)、麦克风⇄键盘切换、
  文本发送;录音兜底:环境不支持自动转选音频
- 快捷问题 chips 横向滚动置于输入条上方;附件以可移除 chip 展示

pages/user/sop/index.vue 重构为消息流模型:
- user/master/system/pending 四类消息;答案气泡内含要点/提醒/无依据提示,
  操作行=播报、引用N条(折叠展开)、总结卡、有帮助/没解决(逐条反馈)
- 语音松开即发送(按用户决策):转写成功直接成为消息(带🎤标),
  失败以系统气泡提示;选音频同语义
- 登录守卫、pending query/tool、主管学员态、生成计数取消、
  onHide/onUnload 清理全部保留;总结卡弹窗(下载/播报)原样保留

验证:
- 本地(构建产物+生产API)9 张截图人工目检:空态/快捷词问答/引用展开/
  键盘输入发送/按住录音/语音失败系统气泡/⊕面板/总结卡/超大字号档
- 生产冒烟:composer 存在 + 完整问答回合渲染通过
- H5 已发布(备份 h5-before-20260718044611)

批次二(待办):练页会话化(复用 ChatComposer)、web-ai 页统一、
旧表单样式清理。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 04:47:33 +08:00
adminandClaude Fable 5 dfd82e1886 fix: unify all aihr collations, stop silent logout on biz 403, enable knowledge apps
线上现象:「问」页语音提问报 401(请求不带 token),用户观察为
「点了几个页面后登录状态失效」。

根因链(逐环生产验证):
1. 问师傅 /api/knowledge/query 对真实登录返回业务 403
   「当前登录端未启用知识问答应用」——生产 aihr_knowledge_app 为空表,
   多租户知识平台的应用注册/空间绑定/角色授权从未在生产配置(P1 遗留)。
2. 前端 readPayload 把 403 也视为认证失败并 clearAuth() —— 业务 403
   触发静默登出,localStorage token 被清。
3. 之后语音 ASR 请求裸奔 -> 401「未能读取到有效 token」。

同期回归:凌晨对 aihr_practice_assignment.ext_party_id 的单列 collation
热修复,使其与 aihr_practice_session(仍 0900_ai_ci)的 JOIN 反向失配,
/practice/mistakes 500。

修复:
- backend/script/sql/update/aihr_20260718_unify_all_collations_mysql8.sql:
  47 张 aihr 表全部 CONVERT 到运行时基准 collation(生产=general_ci),
  终结 collation 打地鼠;本地验证后已在生产执行
  (schema 备份 /opt/wygj/backups/aihr-schema-before-unify-20260718041407.sql),
  13 项移动端接口回归全 200(含 mistakes)。
- api.ts/auth.ts:本地登录态仅在真正 401(HTTP 或业务码)时清除,并经
  redirectToLoginForAuthLoss 记住当前页自动回登录(2s 防抖,登录页内不跳);
  业务 403(权限拒绝,如录音归属/知识空间)只报错不登出;
  authenticatedFileUrl 同步收紧(403 不再清登录态)。
- 生产数据配置(幂等 INSERT,业务范围保守):
  · aihr_knowledge_app 注册 yc_admin(pc)/yc_mobile(app) SESSION 应用
  · yc_mobile 绑定 SOP 域 5 库(1001/1002/1003/1201/1202),
    employee/supervisor ROLE READ;yc_admin 绑定全部 13 库,
    hr_operator/superadmin MANAGE
  · 财务/销售/行政等大库(1004-1010)暂仅管理端,待业务确认再放开

生产验证:
- 问师傅 query 200,真实回答+引用「投诉处理 SOP v1.0」
- E2E:登录后全 tab 浏览+语音+文字提问,token 全程稳定(storage 打桩零触发)
- 无效 token 点语音提问 -> 自动回登录页(原为死胡同 toast)
- H5 已发布(备份 h5-before-20260718042238)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 04:24:45 +08:00
adminandClaude Fable 5 a4bbfc2222 fix: stop snowflake ossId precision loss and daily-drill audio identity mismatch
线上现象:对练页录音转写后提交回应,报「录音不属于当前账号,请重新录音后提交」。

根因A(前端,截图直接原因):OSS 编号是雪花 ID(如 2078204068457525249),
超出 JS Number 安全整数范围,后端按 RuoYi 规范序列化为字符串,但前端 4 处
用 Number() 强转(对练 ASR、每日题 ASR、每日题恢复列表、候选人面试 ASR),
精度丢失成 …5200,后端按错误 oss_id 查归属 COUNT=0 → 误报。
生产铁证:同一暂存行,正确 id 查得 1 行,JS 强转后的 id 查得 0 行;
用损坏 id 提交 turn 复现原报错,用字符串正确 id 提交成功。

修复A:speech.ts 新增 normalizeOssId(纯字符串校验透传,禁止 Number 强转),
4 处调用点改为字符串保存,practice/candidate 服务签名与状态类型放宽为
number|string(types/api.ts 本就是 number|string,Jackson 字符串转 Long 无损)。

根因B(后端,潜伏):answerDailyDrill 用组织 extPartyId(如 1003)做录音
归属身份校验,而暂存写入的是登录手机号——每日题语音提交必失败。
修复B:新增 validateAudioOwnershipByUser,按服务端登录 owner_user_id
(与暂存同源、不可伪造)校验,对练路径(身份一致)保持原校验不变。

发布与验证:
- H5 已发布(备份 /opt/wygj/backups/h5-before-20260718035416)
- 后端 jar 已发布重启(备份 /opt/wygj/app/ruoyi-admin.jar.bak-20260718035552),
  15s 恢复,重启后对练 turn+字符串 ossId 生产复核通过
- 每日题语音路径为逻辑级+数据级验证(该账号今日无待训练每日题,
  业务级复验待下一次每日题窗口)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 03:57:47 +08:00
adminandClaude Fable 5 0ec0e585f7 fix(mobile): distinguish auth failure from HR mismatch on position sync page
问题:登录态失效(token 冻结/无效,后端返 401)时,同步岗位页把认证错误
误显示成「人力系统中未匹配到当前手机号的在职岗位,请联系 HR」,员工被
困在该页无路可退。

修复:
- api.ts: 新增 ApiError(statusCode/bizCode) 类型化错误与 isAuthApiError,
  readPayload/parsePayloadText/XHR 路径统一抛出带状态码的错误,消息不变
- position.ts: fetchOrgPositionResult 返回四态判别结果
  matched/unmatched/unauthorized/error;hydratePositionFromOrg 行为不变
- position/index.vue: 按四态分支处理——
  · unauthorized -> 清除登录态并自动回登录页(保留 redirect)
  · error -> 提示「网络异常…请重试」,保留重试按钮
  · unmatched -> 才显示联系 HR 文案
  并新增「退出重新登录」链接(确认弹窗后清登录态回登录页),
  避免任何异常场景下用户被困无退出路径

验证(构建产物 + 生产 API,Playwright 五场景全过,截图见
.data/visual-audit-20260718/position-fix/):
S1 固定码真实登录->今日页(保洁岗匹配) S2 无效token->自动回登录
S3 断网->网络异常提示留在本页 S4 有效token->自动通过
S5 退出链接->确认->回登录且登录态已清

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 03:39:20 +08:00
admin 6bdc86e3fc feat: restore learning feedback and knowledge capabilities 2026-07-18 00:50:11 +08:00
admin eacf1a0aea feat(mobile): align employee practice screens for release 2026-07-15 11:23:08 +08:00
admin 82d93a1af1 feat(aihr): allow employees to complete onboarding tasks 2026-07-15 02:49:40 +08:00
admin 2f21895597 feat(aihr): add candidate voice interview answers 2026-07-15 02:45:00 +08:00
admin 40574c204d fix(aihr): separate onboarding and candidate review states 2026-07-15 02:39:29 +08:00
admin 747112910c feat(aihr): read formal position SOP mappings 2026-07-15 02:08:51 +08:00
admin 2f44e6b7d1 fix(aihr): close practice audio URL exposure 2026-07-15 01:32:02 +08:00
admin 09c3cbecb0 fix(aihr): protect case media playback 2026-07-15 01:23:41 +08:00
admin e01378d9ad fix(aihr): align case learning status copy 2026-07-14 23:46:27 +08:00
admin 0bfaee7d22 feat(aihr): complete case learning review loop 2026-07-14 23:41:59 +08:00
admin 493fd5361e fix(mobile): align sop position label 2026-07-14 20:44:47 +08:00
admin 857092c2c6 fix(mobile): align practice position label 2026-07-14 20:35:28 +08:00
admin a7938a77e4 fix(mobile): close employee supervisor deep links 2026-07-14 20:28:41 +08:00
admin 4d4d911bad fix(aihr): add semantic daily drill scoring fallback 2026-07-14 15:53:04 +08:00
admin 77ef3c90f6 fix(aihr): bind review evidence to operator 2026-07-14 14:21:29 +08:00
admin 8bb43a2394 fix(aihr): align task labels and training duration 2026-07-14 14:15:02 +08:00
admin 23328f66ff fix(aihr): clarify growth evidence labels 2026-07-14 14:09:45 +08:00
admin ac7dfbe8a7 fix(aihr): preserve assignment source labels 2026-07-14 14:08:13 +08:00
admin 750e546e47 fix(aihr): align supervisor scenario options 2026-07-14 14:04:35 +08:00
admin 91544943d6 test(aihr): guard supervisor scenario coverage 2026-07-14 13:55:44 +08:00
admin f0662bedcd fix(aihr): expose enabled scenarios to supervisors 2026-07-14 13:55:09 +08:00
admin 1c0c47a757 fix(aihr): expose reviewed promotion evidence scores 2026-07-14 13:23:25 +08:00
admin e834546d23 fix(aihr): clear stale candidate records on fetch failure 2026-07-14 12:44:44 +08:00
admin 9c35949984 fix(aihr): persist daily drill scores 2026-07-14 11:35:57 +08:00
admin b8be1bb6e4 fix(aihr): align app case permissions with brd 2026-07-14 11:15:07 +08:00
admin 2cae83ff1b fix(aihr): scope mobile home metrics by identity 2026-07-14 10:23:56 +08:00
admin 4cccf66f16 fix(aihr): clarify competency score semantics 2026-07-14 09:12:51 +08:00
admin ac8cddbbee feat(aihr): align competency profile with brd dimensions 2026-07-14 09:11:45 +08:00
admin 9832caa437 fix(aihr): clarify reference rating semantics 2026-07-14 07:29:41 +08:00
admin 9ace0cb5c9 feat(case): persist source audio for learning detail 2026-07-14 05:51:45 +08:00
admin 9bbfd575a3 feat(aihr): add voice answers to daily drills 2026-07-14 05:44:26 +08:00
admin 39352f1dec fix(mobile): clarify ai score review boundary 2026-07-14 05:25:00 +08:00
admin cd4e930832 fix(case): restrict mobile case writes 2026-07-14 05:16:42 +08:00
admin 153382cb57 feat(aihr): add scoped case detail view 2026-07-14 05:04:01 +08:00
admin e4931753a3 fix(mobile): refresh official position on login 2026-07-14 04:59:30 +08:00
admin afa99f1fec docs(aihr): record mistake retry state 2026-07-14 04:50:24 +08:00
admin 75f0f0615f fix(mobile): reflect completed mistake retries 2026-07-14 04:49:17 +08:00
admin c5a6e677dd feat(aihr): persist sop prompt version 2026-07-14 04:32:21 +08:00
admin cd2c7fdd45 feat(aihr): add supervisor mistake aggregation 2026-07-14 04:27:10 +08:00
admin 07ab28fd7b feat(aihr): trace sop feedback to search review 2026-07-14 04:18:09 +08:00
admin d3552cc22d feat(aihr): add pilot satisfaction evidence loop 2026-07-14 04:13:02 +08:00
admin c392bb3768 feat(mobile): filter practice mistakes by cause 2026-07-14 03:38:20 +08:00
admin 5e3dfd0085 fix(mobile): fail closed on org role lookup errors 2026-07-14 03:32:44 +08:00
admin f9bce8f0ef feat(aihr): expose position SOP learning scope 2026-07-14 03:29:59 +08:00
admin d98ff0ff8b feat(aihr): add employee mistake book audit 2026-07-14 03:23:49 +08:00
admin 5c0f792f37 fix(mobile): prioritize supervisor dashboard alerts 2026-07-14 03:09:32 +08:00