核心修复: - 状态机加 SELECT FOR UPDATE 行锁,消除并发竞态 - hss_md_staff 加 role 列,登录从数据库读取真实角色 - 申请重复校验排除自身,全流程 20 步闭环通过 - 派单 SQL 修复 + 支付状态机过渡 + 完成服务 plan_item_id 修复 并发控制新增: - RedisLockService (SET NX PX + Lua 安全解锁) - RateLimiterService (Redis 滑动窗口 + API 拦截器) - TransactionIsolationConfig (SERIALIZABLE for 支付回调) - MqttPublisher (异步队列 + JDK TCP 探测) - ObjectStorageService (AWS SigV4 预签名, 纯 JDK) 冗余清理: - 删除 6 个死代码文件 (~620 行) - hutool-all → JDK MessageDigest, 去 MapStruct, 去 jsr310 - haversine 提取到 GeoUtil, count/round 提取到 JdbcUtil - 创建 platform layout 组件 前端修复: - 登录页移除角色选择器, 由后端 JWT 返回 - 移除 ClientOnly 包裹, 页面正常渲染 - SPA fallback Nginx 配置修复 Docker: 运行时镜像 eclipse-temurin:17-jre-jammy (缩小 ~300MB) 文档: 新增系统实现与修复报告.md Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
4.8 KiB
4.8 KiB
系统待完善清单
编制日期:2026-05-19
审计范围:后端 94 文件 + 前端 40+ 文件 + Docker/部署 + delivery-miniapp 12 页面
共发现 37 项待完善问题
P0 — 阻碍生产上线的关键缺陷(8项)
| # | 模块 | 文件 | 行 | 问题 | 修复方向 |
|---|---|---|---|---|---|
| 1 | 通知全部空跑 | NotificationSender.java |
93 | doSend() 仅写日志,MQTT/微信/短信完全不发送 |
接入 MQTT Broker + 微信模板消息 + 短信 SDK |
| 2 | MQTT 配置空壳 | MqttConfig.java |
8 | 空 @Configuration,无任何 Bean |
配置 Broker 地址/认证/Topic/客户端 |
| 3 | JWT 认证未启用 | PermissionFilter.java |
26 | 从 Header 读 X-User-Id,不验证 JWT 签名 |
解析 Authorization: Bearer + 验签 |
| 4 | TestAuthFilter 开放所有请求 | TestAuthFilter.java |
21 | dev/docker 模式零验证 | 生产必须禁用此 Filter |
| 5 | 批量结算硬编码 70% 抵扣 | BatchJobService.java |
108 | 固定 * 0.7,不读价目表 |
从 hss_md_price_rules 查询 |
| 6 | 运行时使用 Maven 镜像(非JRE) | Dockerfile |
9 | FROM maven:3.9-eclipse-temurin-17 |
改为 eclipse-temurin:17-jre |
| 7 | 无 CI/CD 管道 | — | — | 无自动构建/测试/部署 | GitHub Actions |
| 8 | 无健康检查端点 | pom.xml |
— | 无 spring-boot-starter-actuator |
添加 actuator |
P1 — 核心功能有缺陷或不完整(15项)
| # | 模块 | 文件 | 行 | 问题 | 修复方向 |
|---|---|---|---|---|---|
| 9 | GPS 距离校验降级 | WorkOrderService.java |
236 | 无坐标时返回 0.0 放行 | 拒绝或标记人工审核 |
| 10 | 调度距离分硬编码 | DispatchAlgorithm.java |
68 | distanceScore = 0.80 |
接入地图 API 计算真实距离 |
| 11 | 调度技能分简化 | DispatchAlgorithm.java |
95 | 仅按 staff_level 给分 | 按工单所需技能 vs 人员证书匹配 |
| 12 | 对象存储未接入 | EvidenceService.java |
28 | 返回本地 URL | MinIO/S3/OSS SDK |
| 13 | 对象存储配置空壳 | ObjectStorageConfig.java |
8 | 空 @Configuration |
@ConfigurationProperties |
| 14 | 平台页面硬编码 IP | work-orders.vue |
47 | 直连 172.31.12.249:18080 |
改为 /api/hss 代理 |
| 15 | 平台页面无认证守卫 | applications.vue, work-orders.vue |
— | fallback 到 ADMIN/uid=1 | 添加 isLoggedIn 检查 |
| 16 | 官网图片全为占位 | 4个组件 | — | loremflickr 随机图 | 替换为真实系统截图 |
| 17 | ICP 备案号缺失 | AppFooter.vue |
40 | "上线前补充" | 填写真实备案号 |
| 18 | 网站 Dockerfile 未被使用 | docker-compose.yml |
— | nginx:alpine + 卷挂载 |
使用 website/Dockerfile |
| 19 | AuthController 硬编码 tenantId | AuthController.java |
42,49,86 | tenantId=1L, orgId=1L |
从注册信息或请求上下文获取 |
| 20 | delivery BASE_URL 硬编码 | delivery-miniapp/api.js |
1 | localhost:18080 |
环境变量或构建时注入 |
| 21 | execute.vue 未持久化状态 | execute.vue |
— | 仅更新内存 | 调用后端 API 持久化 |
| 22 | 拍照无水印 | api.js |
— | addWatermark 未调用 |
在签到和执行中调用 |
| 23 | 轨迹未停止 | api.js |
— | stopTrajectory 未调用 |
在 finish.vue 完成时调用 |
P2 — 可工作但需增强(14项)
| # | 模块 | 问题 | 增强方向 |
|---|---|---|---|
| 24 | ETA 预测 | estimateTravelMinutes 仅按区域码比较 |
接入地图 API 或 Haversine+预估速度 |
| 25 | 调度权重 | 硬编码 25/25/20/15/15 | 配置化 |
| 26 | 绩效权重 | 硬编码 30/15/10/15/15/15 | 配置化 |
| 27 | 熟悉度评分 | count * 0.3 线性增长 |
对数曲线 |
| 28 | 新人员评分 | 默认 0.70 偏袒无评分人员 | 改为 0.50 或冷启动保护 |
| 29 | 申请校验 | 仅检查档案存在 | 按服务类型配置必需附件清单 |
| 30 | Demo 页 | 75% mock 数据 | 全部改为真实 API |
| 31 | Lead 表单 | server/api/lead.post.ts 返回假 200 |
代理到真实后端 |
| 32 | Resources 页 | 下载链接为空 | 上传真实 PDF |
| 33 | 微信支付回调 URL | 硬编码 localhost | 改为公网可访问域名 |
| 34 | 数据库外键 | hss_execution_records 无 FK |
添加 REFERENCES |
| 35 | Flyway 缺失表 | 无消息/配置/离线日志表 | 按需创建 |
| 36 | iOS 权限声明 | manifest.json 中为空 |
补充定位和相机权限描述 |
| 37 | Dockerfile 无 USER | 以 root 运行 | 添加非 root 用户 |
统计
| 级别 | 数量 | 分布 |
|---|---|---|
| P0 | 8 | 通知×2 / 认证×2 / 结算×1 / 镜像×1 / CI/CD×1 / 监控×1 |
| P1 | 15 | GPS×1 / 调度×2 / 存储×2 / 前端×6 / delivery×4 |
| P2 | 14 | ETA×1 / 调参×4 / Mock×3 / 配置×3 / DDL×2 / 安全×1 |
| 共 | 37 |