--- comet_change: weapp-fixes-and-schedule-creation role: technical-design canonical_spec: openspec archived-with: 2026-06-25-weapp-fixes-and-schedule-creation status: final --- # 清道夫 App 5 项修复与排班新增设计文档 ## 变更概述 本次变更修复清道夫 App 的 5 个 UI/交互问题,并补全后端缺失的车辆下拉接口: 1. tab 页面 TopBar 出现多余返回按钮。 2. 任务页发布/新增按钮仍被微信胶囊遮挡。 3. 排班页无法新增排班。 4. 自定义 tabBar 切换后高亮不同步。 5. 退出登录无动画、卡顿。 ## 上下文 - 前端:uni-app Vue 3 + TypeScript,自定义导航栏 `navigationStyle: custom`。 - 通用组件:`TopBar.vue`、`CapsuleSafeArea.vue`。 - 自定义 tabBar:`src/custom-tab-bar/index.js`。 - 后端:Java Spring Boot + MyBatis-Plus。 - 用户要求:所有 API 以后端接口为准;缺失则后端补全。 ## 目标与非目标 **目标:** - tab 页面 TopBar 不显示返回按钮。 - 任务页新增/发布按钮完全避开微信胶囊。 - 排班页可按 V21-SOP 原型新增排班并保存到后端。 - tabBar 高亮与当前页面实时同步。 - 退出登录动画流畅、无卡顿。 - 后端补全 `/vehicle/simple-list`。 **非目标:** - 不重构导航/tabBar 整体架构。 - 不改变任务/排班核心业务状态机。 - 不新增排班以外的调度功能。 ## 技术方案 ### 1. TopBar 返回按钮 - 修改 `src/components/common/TopBar.vue`,将 `showBack` 默认值从 `true` 改为 `false`。 - tab 页面无需传入;非 tab 页面若需返回,显式传入 `:showBack="true"`。 - 全局搜索 ``。 - 若 `CapsuleSafeArea` 计算的安全宽度仍不足,检查 `safeWidth` 公式与微信胶囊边界,必要时调整按钮内边距或字体大小,确保按钮完整可见且可点击。 ### 3. 排班页新增排班 在 `ScheduleView.vue` 内实现新增排班弹窗: **表单字段(对齐后端 `DispatchSchedule`):** | 原型字段 | 提交字段 | 说明 | |---|---|---| | 班组 | `teamId` / `teamName` | 下拉 `/team/simple-list` | | 工作日期 | `workDate` | `uni-datetime-picker` 或日期选择器,格式 `yyyy-MM-dd` | | 班次类型 | `shiftType` | 月计划 → `month_plan`;应急 → `emergency` | | 车辆 | `vehicleIds` | 多选,调用 `/vehicle/simple-list` | | 人员 | `staffIds` | 多选,调用 `/staff/simple-list` | | 备注 | `remark` | 文本输入 | | 状态 | `status` | 默认 `idle` 或 `0`,与后端约定 | **API 调整:** - 更新 `src/api/schedule.ts` 的 `createSchedule` 参数,改为接收 `DispatchSchedule` 对象。 - 更新 `src/api/vehicle.ts`,新增/复用 `getVehicleSimpleList()` 调用 `/vehicle/simple-list`。 **后端补全:** - `VehicleController.java` 新增 `GET /vehicle/simple-list`,返回 `List>`,结构 `{ value: vehicleId, label: plateNo }`。 - `VehicleService.java` 新增 `simpleList()` 查询未删除车辆列表。 ### 4. 自定义 tabBar 高亮同步 - 在每个 tab 页面的 `onShow` 生命周期中调用 `this.getTabBar()?.setData({ selected: })`。 - `custom-tab-bar/index.js` 保持 `selected` 数据字段响应式,无需额外逻辑。 - tab 索引映射:home=0,task=1,schedule=2,my=3(以当前代码为准)。 ### 5. 退出登录卡顿 - 调整 `ProfileView.vue` 中 `logout` 方法顺序: 1. 先调用 `uni.reLaunch({ url: '/pages/login/login' })` 触发页面切换动画。 2. 再调用 `authStore.doLogout()` 清理 token、用户信息。 3. toast 提示在跳转后可选显示或省略,避免阻塞主线程。 ## 数据流 ``` [ScheduleView] 打开弹窗 ├── GET /team/simple-list → 班组下拉 ├── GET /vehicle/simple-list → 车辆多选 ├── GET /staff/simple-list → 人员多选 └── POST /schedule → 保存排班 └── GET /schedule/date/{workDate} → 刷新列表 ``` ## 测试策略 - `npm run type-check` 无 TS 错误。 - `npm run build:mp-weixin` 构建通过。 - 微信开发者工具真机预览: - tab 页面无返回按钮。 - 任务页发布按钮可点击、不与胶囊重叠。 - 排班新增完整流程:选择班组/日期/类型/车辆/人员 → 保存 → 列表刷新。 - 切换 tab 时 tabBar 高亮即时更新。 - 退出登录动画流畅。 - 后端:`mvn compile` 通过,`/vehicle/simple-list` 返回正确格式。 ## 风险与缓解 | 风险 | 缓解 | |---|---| | `TopBar` 默认关闭返回后,非 tab 页面遗漏补充 | 全局搜索使用处并逐一确认 | | 车辆下拉后端接口未部署 | 本次同时修改前端与后端,按用户要求后端补全 | | tabBar `getTabBar()` 在页面未挂载时为 null | 使用可选链 `?.setData` | | 退出登录清理逻辑在跳转后执行失败 | 确保 `authStore.doLogout()` 不依赖当前页面上下文 | ## Spec Patch 无。delta spec `schedule-creation` 已覆盖新增排班需求;其余修复为既有能力实现层修正,未改变 spec 级需求。