e3bd32a(base,上一版本)→ 4eb1d79(head,v0.1.44)codescan_issues_diff(真实对比 修复 10 / 新增 18)、codescan_git_diff、源码复核本版本是「员工端接口缺口清零」收尾批,代码变更面较小(6 个源/测试文件 + 1 个文档):
| 文件 | 类型 | 变更摘要 |
|---|---|---|
src/modules/app/appointments.rs | 生产 | 新增 GET /app/appointments(预约列表,日历/列表双维度;scope=mine|store + 北京日区间 from/to,≤62 天,恒会话门店,手机号恒脱敏)。新增 AppAppointmentItemDto / AppAppointmentListDto 与 list_inner |
src/modules/org/staffs.rs | 生产 | 新增 GET /staffs/{id}(show / service_show,staff.manage 权限、域校验);StaffDto 增 wx_bound / wx_bound_at(列表/详情同口径,不下发 openid),create/update/leave/reinstate/transfer 回包同步补齐两字段 |
src/modules/sale/query.rs | 生产 | OrderDetailDto 增 draft_pay_intent(建单支付意向快照,空串归一为 null) |
功能结论:变更以「新增只读/动作端点 + DTO 字段」为主,方向正确、权限与脱敏口径一致(预约域 appointment.register、员工域 staff.manage、手机号脱敏、openid 不外泄)。未发现阻断性功能缺陷。
GET /app/appointments(list_inner)
scope 枚举、from/to 必填、from<=to、MAX_RANGE_DAYS=62 上限(防全表扫描);缺参/倒置 → 1001。app_store(ctx)? 恒会话门店(不接收 store_id),StoreId.eq(store_id) 过滤,无跨店越权面。scope=mine:StaffId==me OR OriginalStaffId==me(覆盖改派历史,口径正确)。mask_mobile 恒脱敏、客户/项目/护理师姓名批量回填(N+1 已规避为 is_in 批量查)。AppFuncGuard(appointment.register),OpenAPI 已登记。GET /staffs/{id}(service_show)
find_alive + ensure_staff_in_scope(与写操作同作用域口径);路由 FuncGuard(STAFF_MANAGE)。StaffDto 不含 wx_openid,仅 wx_bound 布尔 + wx_bound_at 时点,符合「明文只经 /wx-binding 脱敏出口」设计。⚠️ 重要判读:本次
issues_diff呈报的「修复 10 条」绝大多数不是真实修复,而是行号漂移(line-shift)重锚——同一问题因上方新增代码/函数插入导致行号变化,被工具当成「旧位置修复 + 新位置新增」。逐条核实如下:
| 原位置(修复) | 对应新位置(新增) | 判读 |
|---|---|---|
staffs.rs:373 函数过长 | staffs.rs:433 service_create | 同一函数,行号下移 → 非真实修复 |
staffs.rs:461 圈复杂度 | staffs.rs:523 service_update | 同一函数,行号下移 → 非真实修复 |
staffs.rs:461 函数过长 | staffs.rs:523 service_update | 同一函数,行号下移 → 非真实修复 |
staffs.rs:556 函数过长 | staffs.rs:620 service_leave | 同一函数,行号下移 → 非真实修复 |
tests:5814 SQL 注入 | tests:5883 SQL 注入 | 同一测试 helper(format! 传数值 id),行号下移 → 非真实修复 |
| unwrap |
结论:真实意义上无一条「缺陷被修复」;staffs.rs 三个大函数(create/update/leave)与测试 helper 的历史问题依旧存在,仅位置变化。报告不应将本节计为「减债」。
按「真实新增 vs 行号漂移」分类:
| 严重度 / 类别 | 位置 | 说明 |
|---|---|---|
| Medium / Complexity | appointments.rs:306 list_inner 圈复杂度 12 | 单函数承担:参数校验 + 三张表批量回填 + 行映射 + 改派/脱敏/时长计算,分支偏多 |
| Medium / Complexity | appointments.rs:306 list_inner 函数过长 131 行 | 建议按「解析校验 / 批量取数 / 行装配」拆分 |
| Medium / Dependency | appointments.rs:306 list_inner 直接依赖 73 个函数(阈值 10) | 高耦合、扇入 1/扇出 73 |
| Low / Dependency | appointments.rs:236 AppAppointmentItemDto 公开字段过多(17 个) | DTO 宽表,属契约本身需要,可接受 |
| Medium / Complexity | staffs.rs:433/523/620 create/update/leave | 见 §三:实为行号漂移重锚,非本轮新引入 |
真正的「本轮新代码引入」复杂度问题仅集中在
list_inner。staffs.rs三条是旧函数被重新锚定,不应算作本版新增技术债。
tests/app_employee.rs)| 严重度 / 类别 | 位置 | 判读 |
|---|---|---|
| Medium / Security | 5883/5814 SQL 字符串拼接 | 测试专用 sql_opt_col/sql_one_i64 helper,拼接值为测试夹具生成的 i64(app_staff_id/admin_id),非用户输入 → 实际为误报/低风险 |
| Medium / Complexity | 6064 app_appointment_detail_arrive_about_flow 过长(491 行) | 本轮新增 ①b 断言块致其继续变长;测试函数,优先级低 |
| Medium / ErrorHandling | 6075/6078/6081/6157/6220/6222/6231 无注释 unwrap | 均为测试内 serde_json 取值 / .as_array() / as_i64() 的 unwrap,测试场景可接受 → 误报级别 |
说明:测试文件中的 SQL 拼接与
unwrap属测试夹具惯用写法,known_false_positives为空未做抑制,故被计入。建议后续在测试模块统一#![allow(clippy::unwrap_used)]或在质检规则中排除tests/**,避免长期噪声。
list_inner 复杂度与耦合list_inner(src/modules/app/appointments.rs:306,131 行、圈复杂度 12、扇出 73)是本次唯一实质新增的生产复杂度热点。其职责链:
scope 校验 + from/to 解析 + 区间上限(约 12 行)Condition::all + scope=mine 的 any 分支)is_in map,各带空判分支,约 60 行)reassigned_to 改派判定、start_minutes/duration_minutes/time_range 计算、mask_mobile)评价:功能正确、无越权/脱敏缺陷,但可维护性偏弱。扇出 73 主要来自 sea_orm 链式调用与 chrono 格式化,属框架调用噪声,非真正业务耦合,故「高耦合」告警可适度降级看待。
建议(非阻断):
fn build_list_cond(...)、fn load_names(...)(三表回填合并为一个 helper)、fn to_item(r, maps) -> AppAppointmentItemDto,可将单函数压到 ~40 行、复杂度降到阈值内;if empty { default } else { query...collect })可提取泛型 helper 复用。| 级别 | 事项 | 建议 |
|---|---|---|
| 中 | list_inner 无分页,62 天全店预约一次性载入内存 | 当前门店量级可接受;如单店预约量增长,考虑加可选 limit/cursor 或仅按日历周查询 |
| 低 | 测试文件 SQL 拼接 / 大量 unwrap 持续产生噪声告警 | 在 tests/** 增加 lint allow 或质检规则排除,减少误报干扰 |
| 低 | draft_pay_intent.clone() 无必要克隆 | 可改为借用或 filter 前 as_deref,微优化 |
| 提示 | 报告「修复 10 条」实为行号漂移,非真实减债 | 版本复盘时勿将其计入质量改善 |
功能正确性:未发现内存安全、越权、脱敏泄漏、事务一致性等实质缺陷。新增端点权限守卫、门店隔离、手机号脱敏、openid 不外泄均到位,测试覆盖了正/反向与参数校验。
list_inner 一处复杂度/耦合热点(Medium,可维护性),其余 17 条新增告警中约 15 条为行号漂移重锚或测试代码误报。list_inner;在 tests/** 抑制 unwrap/SQL 拼接噪声。src/router.rs| 生产 |
挂载 app/appointments(AppFuncGuard(APPOINTMENT_REGISTER))、staffs/{id} 的 GET(FuncGuard(STAFF_MANAGE)) |
tests/app_employee.rs | 测试 | 新增预约列表(①b)、员工详情/列表 wx_bound(③b/⑤b)断言;OpenAPI 路径登记 |
tests/order_split.rs | 测试 | draft_alloc_intent_in_detail 增 draft_pay_intent 断言 |
docs/员工端接口缺口.md | 文档 | 缺口 10→0 状态更新、按 mp EP 表复核(§10) |
draft_pay_intent:clone().filter(!trim empty) 归一空串为 null,前端「—」显示语义正确。
tests:5967/5970/5973tests:6075/6078/6081 unwrap |
同一登录段 .as_str().unwrap(),行号下移 → 非真实修复 |
tests:6049 unwrap | tests:6157 unwrap | 同一处,行号下移 → 非真实修复 |
tests:5956 函数过长 | tests:6064 函数过长(491 行) | 同函数,且本轮确有新增测试块使其继续变长 → 半真实 |