e38fd89425
线上(162,v1.2.160,userId=1490)实测两类报错:
提交销假失败: 缺少请假类型(projectId)
学工系统登录失败: 登录失败: 参数解码错误,刷新页面后尝试
且伴随 WARN「获取销假表单字段失败: 未找到数据」——因为 projectId 为空,
form_fields_for_add 查不到任何东西。
1) projectId 为空
projectId 是销假提交必传项,但前端销假请求体未必带(TypeWid 在列表里,
不一定回传到执行接口)。原实现直接拿 req.ProjectID 用,为空即报错。
修复:
- 为空时按 leaveId 调 leave_detail 回查补齐,补到后记 INFO;
- 回查仍拿不到则明确报「无法确定该请假记录所属的请假类型,
请返回列表刷新后重试」,而不是发出注定失败的提交。
- 同时修 XsgzFetchLeaveDetail 的解析:前端取的是
`c.value?.project?.id || c.value?.projectId`,项目 id 可能嵌在
project 对象里;原先只读顶层 projectId,现按「顶层优先、
回落 project.id」处理,项目名同样回落到 project.text。
2) CAS 参数解码错误
前端 getOAuthToken 的 body 是 `ticket=${s}` 直接拼接,**不做 URL 编码**。
我们原先用 url.QueryEscape,而密文由多块小写 hex 以**空格**连接
(实测长 ticket 分 2 块),QueryEscape 会把空格变成 '+';
服务端按原始 body 解析时还原不回空格,逐块解密失败,
正好对应「参数解码错误,刷新页面后尝试」。
修复:改为与前端一致的直接拼接。
测试:
- 回查补齐 projectId 的两条路径(嵌套 project.id、顶层优先);
- CAS body 保留原始空格、不得出现 '+';
- 反例固化 QueryEscape 会破坏 ticket,说明为何不能用它。