- 新增 deploy/docker/:Docker 本机模拟部署,含 Dockerfile、docker-compose、deploy.sh 一键脚本 - 新增 deploy/remote/:远程服务器部署,含 SSH 自动上传、重启、回滚脚本 - 新增 deploy/README.md:完整使用手册,含现状分析、落地调整工作清单、命令速查 - 新增 build.sh/start.sh:本地构建和启动脚本(含飞书通知) - 新增前端 .env.docker 环境配置,API 指向测试服务器 - 前端 package.json 新增 build-docker 命令 - 更新 .gitignore:排除 IDE 配置、SQL 数据、Docker 敏感文件 - 前端 UI 样式优化(多个页面组件) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1457 lines
51 KiB
Markdown
1457 lines
51 KiB
Markdown
# AI 辅助开发九大核心问题:深度解析与解决方案
|
||
|
||
> SmartClean 智慧清洁 SaaS 平台 — AI 辅助开发实践指南
|
||
> 创建日期:2026-04-15
|
||
> 适用范围:开发团队、产品团队、项目管理
|
||
|
||
---
|
||
|
||
## 目录
|
||
|
||
- [问题 1:AI 辅助开发文档保存](#问题-1ai-辅助开发文档保存)
|
||
- [问题 2:选择 Java 的深层分析](#问题-2选择-java-的深层分析)
|
||
- [问题 3:避免 AI 修改业务逻辑](#问题-3避免-ai-修改业务逻辑)
|
||
- [问题 4:人工/AI 开发边界划分](#问题-4人工ai-开发边界划分)
|
||
- [问题 5:产品手册与用户培训](#问题-5产品手册与用户培训)
|
||
- [问题 6:打卡身份校验与代操作拦截](#问题-6打卡身份校验与代操作拦截)
|
||
- [问题 7:开放问题与逻辑安全](#问题-7开放问题与逻辑安全)
|
||
- [问题 8:手机端数据展示方案](#问题-8手机端数据展示方案)
|
||
- [问题 9:国内 AI 编程现状与成本管理](#问题-9国内-ai-编程现状与成本管理)
|
||
- [综合实施路线图](#综合实施路线图)
|
||
|
||
---
|
||
|
||
## 问题 1:AI 辅助开发文档保存
|
||
|
||
### 1.1 为什么传统文档体系在 AI 时代失效
|
||
|
||
传统软件开发的知识链条是:
|
||
|
||
```
|
||
需求文档 → 设计文档 → 代码 → 代码注释 → 测试用例
|
||
```
|
||
|
||
每一环都有人类参与,知识自然沉淀在参与者脑中。即使文档不全,"问写这段代码的人"就能解决。
|
||
|
||
AI 辅助开发打破了这个链条:
|
||
|
||
```
|
||
需求文档 → Prompt → AI 黑盒处理 → 代码 → 人工微调
|
||
↑
|
||
这里的决策过程消失了
|
||
```
|
||
|
||
消失的信息包括:
|
||
- AI 为什么选择这个实现方案而不是另一个?
|
||
- AI 理解的需求和实际需求有没有偏差?人工微调修正了什么偏差?
|
||
- AI 生成的初始版本是什么样?人工改了哪些地方?为什么改?
|
||
- Prompt 是什么?下次类似需求能否复用这个 Prompt?
|
||
- AI 遗漏了什么?哪些边界条件是后来人工补上的?
|
||
|
||
如果不记录这些,三个月后你看到一段代码,无法判断:
|
||
- 这是经过深思熟虑的设计,还是 AI 随机生成的?
|
||
- 改了安全吗?会不会破坏 AI 当初设计的某个巧妙之处?
|
||
- 出了 Bug,是 AI 的问题还是人工微调引入的?
|
||
|
||
### 1.2 文档体系设计(四层架构)
|
||
|
||
#### 第一层:代码级标注体系
|
||
|
||
**标注分类标准:**
|
||
|
||
| 标注 | 含义 | 审核要求 | 示例场景 |
|
||
|------|------|----------|----------|
|
||
| `[AI-Generated]` | AI 生成,人工审核未改 | 必须审核 | CRUD 接口、UI 页面 |
|
||
| `[AI-Assisted]` | AI 辅助,人工大量修改 | 必须审核 | 业务逻辑、复杂查询 |
|
||
| `[AI-Suggested]` | AI 建议方案,人工重写 | 自审 | 算法、架构方案 |
|
||
| `[Human-Only]` | 纯人工编写 | 同行审核 | 核心业务、安全相关 |
|
||
| `[AI-Test]` | AI 生成的测试代码 | 抽查 | 单元测试、集成测试 |
|
||
|
||
**Java 注释模板:**
|
||
|
||
```java
|
||
/**
|
||
* [AI-Generated] 2026-04-15
|
||
*
|
||
* @ai-model Claude Opus 4.6
|
||
* @ai-prompt "实现保洁员月度出勤汇总查询接口,支持按项目、班组筛选,
|
||
* 返回出勤天数、迟到次数、早退次数、缺勤天数"
|
||
* @ai-confidence 高(标准 CRUD 查询,逻辑简单)
|
||
* @human-review 通过 — Tony 2026-04-15
|
||
* @human-changes 无
|
||
* @business-rule 出勤统计以自然月为周期,跨月打卡归属到打卡开始时间所在月
|
||
*/
|
||
```
|
||
|
||
```java
|
||
/**
|
||
* [AI-Assisted] 2026-04-15
|
||
*
|
||
* @ai-model Claude Opus 4.6
|
||
* @ai-prompt "实现保洁员排班冲突检测算法"
|
||
* @ai-confidence 中(AI 初始版本有缺陷)
|
||
* @human-review Tony 2026-04-15
|
||
* @human-changes
|
||
* 1. AI 原始版本未考虑夜班跨天场景(22:00-06:00),
|
||
* 人工添加了跨天时间段重叠检测
|
||
* 2. AI 使用了简单的 start/end 比较,
|
||
* 人工改为支持"开区间"(排班结束时间=下一排班开始时间不算冲突)
|
||
* 3. AI 遗漏了"法定假日不检测冲突"的业务规则
|
||
* @business-rule
|
||
* - 同一保洁员同一时段只能分配到一个区域
|
||
* - 夜班跨天算一个排班,不拆分
|
||
* - 排班结束时间 = 下一排班开始时间,不算冲突(交接班)
|
||
* - 法定假日排班不参与冲突检测
|
||
*/
|
||
```
|
||
|
||
**`@ai-confidence` 说明:**
|
||
- 高置信度(标准 CRUD):未来修改时可以放心让 AI 继续处理
|
||
- 中置信度(AI 有部分错误):未来修改时需要特别注意 AI 可能犯同样的错
|
||
- 低置信度(AI 严重偏差):这类代码应标记为人工维护,不再让 AI 碰
|
||
|
||
**`@human-changes` 的核心价值:**
|
||
- 记录了 AI 的能力边界
|
||
- 反复出现相同类型的 human-changes,说明需要优化 Prompt 或调整 AI 使用策略
|
||
- 新人入职时读这些注释,能快速了解"AI 在哪些地方容易犯错"
|
||
|
||
#### 第二层:Git Commit 规范体系
|
||
|
||
**Commit Message 格式:**
|
||
|
||
```
|
||
<类型>(<模块>): <描述> [<AI参与度>]
|
||
|
||
<详细说明>
|
||
|
||
AI-Context:
|
||
Model: <模型名>
|
||
Prompt-Summary: <核心 prompt 摘要>
|
||
AI-Contribution: <AI 具体完成了什么>
|
||
Human-Contribution: <人工具体做了什么>
|
||
AI-Errors-Fixed: <修正了 AI 的哪些错误>
|
||
|
||
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
||
```
|
||
|
||
**实际示例:**
|
||
|
||
```
|
||
feat(attendance): 实现打卡地理围栏校验 [AI-Assisted]
|
||
|
||
基于 Haversine 公式实现经纬度距离计算,支持可配置围栏半径。
|
||
当 GPS 信号弱时降级到 WiFi 定位辅助校验。
|
||
|
||
AI-Context:
|
||
Model: Claude Opus 4.6
|
||
Prompt-Summary: 实现基于经纬度的打卡地理围栏校验,支持配置围栏半径
|
||
AI-Contribution: 生成了基础的地理围栏校验框架、Haversine 公式实现、
|
||
Controller/Service/Mapper 三层代码
|
||
Human-Contribution:
|
||
- 添加 WiFi 辅助定位降级方案(AI 未考虑 GPS 不可用场景)
|
||
- 修正距离计算精度(AI 用 float,改为 double)
|
||
- 添加"围栏半径按项目可配置"功能(AI 硬编码了 200 米)
|
||
AI-Errors-Fixed:
|
||
- AI 初始版本用欧氏距离代替 Haversine,在高纬度地区误差大
|
||
- AI 未处理经纬度为 null 的情况(GPS 获取失败)
|
||
|
||
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
||
```
|
||
|
||
**利用 Git 进行 AI 代码追溯的命令:**
|
||
|
||
```bash
|
||
# 查看所有 AI 参与的提交
|
||
git log --grep="AI-Generated\|AI-Assisted" --oneline
|
||
|
||
# 查看某个文件中 AI 贡献的部分
|
||
git log --grep="AI-" -p -- src/service/AttendanceService.java
|
||
|
||
# 统计 AI 参与度
|
||
git log --grep="AI-Generated" --oneline | wc -l # AI 完全生成
|
||
git log --grep="AI-Assisted" --oneline | wc -l # AI 辅助
|
||
|
||
# 查看 AI 犯过的错误
|
||
git log --grep="AI-Errors-Fixed" --format="%H %s"
|
||
```
|
||
|
||
#### 第三层:需求级开发日志
|
||
|
||
每个需求完成后,创建一份开发日志,存在 `docs/dev-logs/` 或飞书文档中:
|
||
|
||
```markdown
|
||
# 开发日志:REQ-042 保洁员排班管理
|
||
|
||
## 基本信息
|
||
- 需求编号:REQ-042
|
||
- 开发周期:2026-04-10 ~ 2026-04-18
|
||
- 开发者:Tony
|
||
- AI 工具:Claude Code (Opus 4.6)
|
||
|
||
## 开发过程时间线
|
||
|
||
### Day 1:数据库设计 + 基础 CRUD
|
||
- Prompt: "设计保洁员排班管理的数据库表..."
|
||
- AI 输出质量:良好
|
||
- 人工调整:
|
||
- AI 用 VARCHAR(20) 存排班类型,改为 TINYINT + 枚举类
|
||
- AI 未创建复合索引 (user_id + schedule_date),手动添加
|
||
|
||
### Day 2:排班冲突检测算法
|
||
- Prompt: "实现排班冲突检测..."
|
||
- AI 输出质量:中等
|
||
- AI 遗漏的关键点:夜班跨天、交接班衔接、法定假日、临时调班
|
||
- 决策:核心冲突算法改为人工编写,让 AI 只生成测试用例
|
||
|
||
### Day 3-4:前端排班页面
|
||
- AI 输出质量:良好
|
||
- 人工调整:拖拽组件替换、CSS 与设计体系对齐、全局组件使用
|
||
|
||
## 效率分析
|
||
| 阶段 | 传统开发预估 | AI 辅助实际 | 效率提升 |
|
||
|------|-------------|------------|---------|
|
||
| 数据库设计 | 4h | 1.5h | 63% |
|
||
| 后端 CRUD | 8h | 2h | 75% |
|
||
| 冲突算法 | 4h | 3.5h | 12%(AI 反而拖慢了) |
|
||
| 前端页面 | 16h | 6h | 63% |
|
||
| 联调测试 | 8h | 6h | 25% |
|
||
| **总计** | **40h** | **19h** | **52%** |
|
||
|
||
## AI 经验总结
|
||
1. 数据库设计:必须在 Prompt 中明确字段类型规范、索引要求
|
||
2. 复杂算法:AI 生成初版参考,但核心逻辑人工编写更可靠
|
||
3. 前端开发:要在 Prompt 中告知项目的全局组件、CSS 规范
|
||
4. 前后端联调:前后端代码最好在同一个对话中生成,避免接口不一致
|
||
5. 测试:AI 生成测试框架很快,但边界条件测试必须人工补充
|
||
```
|
||
|
||
#### 第四层:AI 开发经验知识库
|
||
|
||
将所有开发日志中的共性问题汇总,持续积累:
|
||
|
||
**数据库设计类常见错误:**
|
||
|
||
| ID | 错误模式 | 出现频率 | 防范措施 |
|
||
|----|---------|---------|---------|
|
||
| DB-001 | 时间字段用 VARCHAR | 高 | Prompt 中明确"时间用 DATETIME 类型" |
|
||
| DB-002 | 缺少索引 | 高 | Prompt 中明确要求设计索引 |
|
||
| DB-003 | 物理删除 | 高 | CLAUDE.md 中写明软删除规范 |
|
||
| DB-004 | 缺少审计字段 | 中 | 要求所有表包含 create_time/update_time |
|
||
| DB-005 | 类型字段用字符串 | 中 | 要求用 TINYINT + 代码枚举 |
|
||
| DB-006 | 缺少字段注释 | 高 | 明确要求每个字段加 COMMENT |
|
||
|
||
**Java 后端常见错误:**
|
||
|
||
| ID | 错误模式 | 出现频率 | 防范措施 |
|
||
|----|---------|---------|---------|
|
||
| BE-001 | 忽略并发 | 高 | 涉及写操作的接口必须考虑并发 |
|
||
| BE-002 | 空指针不防御 | 中 | 要求对外部数据做空值检查 |
|
||
| BE-003 | 事务边界错误 | 中 | 涉及多表写入时提醒加 @Transactional |
|
||
| BE-004 | 硬编码配置 | 高 | 要求可配置项读取配置中心 |
|
||
| BE-005 | 异常吞没 | 中 | 要求异常必须记录日志或抛出 |
|
||
| BE-006 | 权限校验遗漏 | 高 | Prompt 中明确权限要求 |
|
||
| BE-007 | 分页不设上限 | 高 | 要求分页大小有最大值限制 |
|
||
|
||
**Vue 前端常见错误:**
|
||
|
||
| ID | 错误模式 | 出现频率 | 防范措施 |
|
||
|----|---------|---------|---------|
|
||
| FE-001 | 不用全局组件 | 高 | Prompt 中列出全局组件清单 |
|
||
| FE-002 | 样式不统一 | 高 | 要求使用项目 CSS 变量 |
|
||
| FE-003 | API 路径硬编码 | 中 | 要求使用 api.js 中定义的端点 |
|
||
| FE-004 | 权限控制遗漏 | 高 | 要求使用 fetchButtons/fetchFields |
|
||
| FE-005 | 内存泄漏 | 低 | 提醒在 onUnmounted 中清理 |
|
||
| FE-006 | 请求不防重 | 中 | 要求提交按钮加 loading 状态 |
|
||
|
||
**业务逻辑常见错误(最危险):**
|
||
|
||
| ID | 错误模式 | 出现频率 | 防范措施 |
|
||
|----|---------|---------|---------|
|
||
| BL-001 | 跨天场景遗漏 | 高 | 涉及时间的业务必须说明跨天 |
|
||
| BL-002 | 边界条件 >= 和 > 混淆 | 中 | 工资相关逻辑必须有精确测试 |
|
||
| BL-003 | 角色权限假设错误 | 中 | Prompt 中明确涉及的角色 |
|
||
| BL-004 | 状态机不完整 | 高 | 画状态图后再让 AI 编码 |
|
||
| BL-005 | 数据归属判断错 | 中 | 明确多租户隔离要求 |
|
||
| BL-006 | 计算精度丢失 | 中 | 金额计算强制使用 BigDecimal |
|
||
|
||
### 1.3 文档维护的成本控制
|
||
|
||
| 文档层级 | 维护频率 | 维护方式 | 耗时 |
|
||
|---------|---------|---------|------|
|
||
| 代码注释 | 每次 AI 开发时 | 开发时随手写 | 2-3 分钟/文件 |
|
||
| Git Commit | 每次提交 | 遵循模板 | 3-5 分钟/提交 |
|
||
| 需求开发日志 | 每个需求完成后 | 让 AI 根据对话生成初稿,人工补充 | 15-20 分钟/需求 |
|
||
| 经验知识库 | 每月汇总 | 从开发日志中提取共性问题 | 1-2 小时/月 |
|
||
|
||
**关键技巧:让 AI 帮你写文档。** 每个需求完成后,让 AI 回顾对话生成开发日志初稿:
|
||
|
||
```
|
||
请回顾我们这次对话,生成一份开发日志,包括:
|
||
1. 你完成了哪些部分
|
||
2. 我人工修改了哪些地方
|
||
3. 你犯了哪些错误,我是怎么修正的
|
||
4. 下次类似需求的 Prompt 优化建议
|
||
```
|
||
|
||
这样文档工作量下降 60-70%,人工只需审核和补充。
|
||
|
||
---
|
||
|
||
## 问题 2:选择 Java 的深层分析
|
||
|
||
### 2.1 编程语言在 AI 协作中的五个评估维度
|
||
|
||
#### 维度一:类型安全——AI 错误的拦截率
|
||
|
||
```
|
||
AI 犯错后的发现时机
|
||
─────────────────────────────────────
|
||
编译期 运行期 生产环境
|
||
│ │ │
|
||
Java ████████████ ██ █
|
||
Go ████████████ ██ █
|
||
TS █████████ ███ ██
|
||
Python █ █████████ ████████
|
||
JS █ █████████ ████████
|
||
```
|
||
|
||
Java/Go(强类型):AI 传错参数类型、返回值类型不匹配、方法调用参数数量错误——全部在编译期报错。不需要运行代码就能发现 AI 的低级错误。
|
||
|
||
Python/JS(弱类型):AI 的类型错误会悄悄通过,直到运行时才暴露,甚至可能在特定条件下才触发。
|
||
|
||
**具体例子:**
|
||
|
||
```java
|
||
// Java —— AI 写错类型,编译器立刻报错
|
||
public BigDecimal calculateOvertime(Long userId, int hours) {
|
||
return baseSalary.multiply(new BigDecimal(hours)); // 类型正确才能编译
|
||
}
|
||
|
||
// 如果 AI 写成:
|
||
public BigDecimal calculateOvertime(Long userId, int hours) {
|
||
return baseSalary * hours; // 编译错误!BigDecimal 不能用 * 运算符
|
||
}
|
||
```
|
||
|
||
```python
|
||
# Python —— AI 写错类型,运行时才发现
|
||
def calculate_overtime(user_id, hours):
|
||
return base_salary * hours # 如果 base_salary 是字符串 "5000"
|
||
# Python 不报错,返回 "500050005000..."(字符串重复)
|
||
# 这个 Bug 可能到月底算工资时才被发现
|
||
```
|
||
|
||
#### 维度二:框架约束力——AI 行为的规范性
|
||
|
||
框架越有"约定",AI 生成的代码越规范:
|
||
|
||
```
|
||
框架约束力排名:
|
||
Spring Boot (Java) ★★★★★ 注解驱动,结构高度规范
|
||
NestJS (TypeScript) ★★★★☆ 借鉴 Spring,较规范
|
||
Django (Python) ★★★★☆ MTV 模式明确
|
||
Gin (Go) ★★★☆☆ 轻量灵活,约束少
|
||
Express (Node.js) ★★☆☆☆ 过于灵活,AI 容易写出混乱代码
|
||
Flask (Python) ★★☆☆☆ 同上
|
||
```
|
||
|
||
Spring Boot 的约束力体现——AI 生成代码时框架约定自然引导分层:
|
||
|
||
```java
|
||
@RestController // 框架约定:这是接口层
|
||
@RequestMapping("/api/attendance")
|
||
public class AttendanceController {
|
||
|
||
@Autowired // 框架约定:依赖注入
|
||
private AttendanceService attendanceService;
|
||
|
||
@PostMapping("/punch") // 框架约定:HTTP 方法映射
|
||
@RequiresPermission("attendance:punch") // 框架约定:权限控制
|
||
public Result<PunchRecord> punch(
|
||
@Valid @RequestBody PunchDTO dto) { // 框架约定:参数校验
|
||
return Result.ok(attendanceService.punch(dto));
|
||
}
|
||
}
|
||
```
|
||
|
||
AI 在 Spring Boot 项目中生成代码,即使不给额外提示,也会自然遵循 Controller → Service → Mapper 分层。而在 Express/Flask 中,AI 可能把所有逻辑塞进路由里。
|
||
|
||
#### 维度三:AI 训练数据量——生成质量
|
||
|
||
```
|
||
AI 训练数据量(GitHub 企业级项目):
|
||
Java ★★★★★ 海量 Spring Boot 企业项目
|
||
Python ★★★★★ 数量最多但质量参差不齐
|
||
TypeScript ★★★★☆ 近年增长快
|
||
Go ★★★★☆ 质量高但数量相对少
|
||
Rust ★★★☆☆ 数量较少
|
||
```
|
||
|
||
Java + Spring Boot 是 AI 生成质量最稳定的企业级组合之一。
|
||
|
||
#### 维度四:调试与排查能力
|
||
|
||
Java 的堆栈跟踪信息详细,异常类型明确,IDE 支持强大(IDEA 的断点调试、代码导航),当 AI 生成的代码出问题时,排查效率最高。
|
||
|
||
#### 维度五:团队交接与维护
|
||
|
||
AI 生成的 Java 代码,不同开发者读起来差异不大(框架约束)。AI 生成的 Python/JS 代码,可能每次风格都不同,维护成本高。
|
||
|
||
### 2.2 SmartClean 项目的具体选择建议
|
||
|
||
```
|
||
核心业务后端:Java + Spring Boot ← 不变
|
||
理由:类型安全、框架约束、团队熟悉、AI 生成质量高
|
||
|
||
前端:Vue 3 + TypeScript(建议渐进迁移)
|
||
理由:TypeScript 给前端加了类型安全,AI 生成 TS 代码的质量 > JS
|
||
渐进迁移:新页面用 TS,老页面不动
|
||
|
||
NLP/AI 服务(龙虾助手):Python 微服务 ← 独立部署
|
||
理由:ML/NLP 生态在 Python,通过 HTTP API 隔离,与主业务系统语言无关
|
||
|
||
脚本/工具:Python 或 Shell
|
||
理由:一次性脚本不需要类型安全
|
||
|
||
不建议:
|
||
- 核心业务改用 Go/Rust(团队学习成本、现有代码迁移)
|
||
- 全部用 Python(失去类型安全,长期维护风险)
|
||
- 微服务过度拆分(当前规模不需要)
|
||
```
|
||
|
||
### 2.3 Java 8 是否需要升级
|
||
|
||
当前项目用 Java 8,在 AI 辅助开发中有微妙影响:AI 模型训练数据中包含大量 Java 11/17 代码,AI 生成代码时倾向于使用 var、Records、switch 表达式等新特性,导致编译失败。
|
||
|
||
**当前做法:** 在 CLAUDE.md 中明确标注 Java 版本约束。
|
||
|
||
**长远建议:** 可以考虑升级到 Java 17(LTS),既能获得新特性带来的开发效率提升,又能减少 AI 生成代码的适配成本。
|
||
|
||
---
|
||
|
||
## 问题 3:避免 AI 修改业务逻辑
|
||
|
||
### 3.1 AI 篡改业务逻辑的真实风险场景
|
||
|
||
AI 修改业务逻辑的危险性在于:**不报错、不告警、看起来完全正常,但业务含义已经改变。**
|
||
|
||
#### 场景 1:悄悄改变比较运算符
|
||
|
||
```java
|
||
// 原始代码:加班费按工作超过 8 小时(含)计算
|
||
if (workHours >= 8) {
|
||
overtimePay = calculateOvertime(workHours - 8);
|
||
}
|
||
|
||
// AI 在"优化"代码时,悄悄改成了:
|
||
if (workHours > 8) { // >= 变成了 > !
|
||
overtimePay = calculateOvertime(workHours - 8);
|
||
}
|
||
// 后果:恰好工作 8 小时的员工,少算加班费
|
||
// 金额差异不大,可能存在数月才被发现
|
||
```
|
||
|
||
#### 场景 2:简化权限校验
|
||
|
||
```java
|
||
// 原始代码:完整的权限校验
|
||
public Result deleteSchedule(Long scheduleId) {
|
||
Schedule schedule = scheduleMapper.selectById(scheduleId);
|
||
if (schedule == null) return Result.fail("排班记录不存在");
|
||
if (!schedule.getProjectId().equals(getCurrentUserProjectId()))
|
||
return Result.fail("无权操作其他项目的排班");
|
||
if (schedule.getStatus() == ScheduleStatus.ACTIVE)
|
||
return Result.fail("已生效的排班不能直接删除,请先取消");
|
||
schedule.setDeleted(1);
|
||
scheduleMapper.updateById(schedule);
|
||
return Result.ok();
|
||
}
|
||
|
||
// AI "重构优化"后:
|
||
public Result deleteSchedule(Long scheduleId) {
|
||
scheduleMapper.deleteById(scheduleId); // 物理删除!权限校验全部丢失!
|
||
return Result.ok();
|
||
}
|
||
```
|
||
|
||
#### 场景 3:改变数据精度
|
||
|
||
```java
|
||
// 原始代码
|
||
BigDecimal hourlyRate = baseSalary.divide(
|
||
new BigDecimal("21.75"), 6, RoundingMode.HALF_UP);
|
||
|
||
// AI 修改后("简化")
|
||
double hourlyRate = baseSalary.doubleValue() / 21.75;
|
||
// 浮点精度丢失,涉及工资这种敏感数据,1 分钱的差异都可能引起投诉
|
||
```
|
||
|
||
### 3.2 五层防护体系
|
||
|
||
#### 防线一:代码分区制度(最重要)
|
||
|
||
将代码库分为三个区域,写入 CLAUDE.md:
|
||
|
||
**红区(AI 禁入)——AI 只可阅读和建议,不可直接修改:**
|
||
|
||
```
|
||
工资与财务:
|
||
- **/service/salary/**
|
||
- **/service/finance/**
|
||
- 所有包含 "calculate" + "salary/wage/pay" 的方法
|
||
|
||
权限与安全:
|
||
- **/config/security/**
|
||
- **/service/auth/**
|
||
- **/interceptor/**、**/filter/**
|
||
|
||
打卡与考勤核心:
|
||
- AttendanceService.punch()
|
||
- AttendanceService.calculateOvertime()
|
||
- PunchRecordService 中的防重复逻辑
|
||
|
||
数据删除:
|
||
- 所有 DELETE 语句(物理删除)
|
||
- 所有 mapper.xml 中的 delete 标签
|
||
```
|
||
|
||
修改红区文件的流程:
|
||
1. AI 提供修改建议和代码片段
|
||
2. 开发者理解建议后手动修改
|
||
3. 必须有对应的单元测试覆盖
|
||
4. 需要至少一人 Code Review
|
||
|
||
**黄区(AI 可写,必须审核):**
|
||
|
||
```
|
||
- **/service/**(除红区外的所有 Service)
|
||
- **/mapper/xml/**(复杂查询语句)
|
||
- **/job/**、**/task/**(定时任务)
|
||
- **/integration/**、**/client/**(第三方集成)
|
||
```
|
||
|
||
**绿区(AI 自主操作):**
|
||
|
||
```
|
||
- frontend/**(UI 组件和页面)
|
||
- **/controller/**(接口层)
|
||
- **/dto/**、**/vo/**、**/entity/**(数据传输对象)
|
||
- **/test/**(测试代码)
|
||
- docs/**(文档)
|
||
```
|
||
|
||
#### 防线二:业务规则断言
|
||
|
||
将核心业务规则集中定义为常量,系统启动时自动校验:
|
||
|
||
```java
|
||
public final class BusinessRules {
|
||
// 工资规则
|
||
public static final BigDecimal MONTHLY_WORK_DAYS = new BigDecimal("21.75");
|
||
public static final BigDecimal WEEKDAY_OVERTIME_RATE = new BigDecimal("1.5");
|
||
public static final BigDecimal WEEKEND_OVERTIME_RATE = new BigDecimal("2.0");
|
||
public static final BigDecimal HOLIDAY_OVERTIME_RATE = new BigDecimal("3.0");
|
||
|
||
// 打卡规则
|
||
public static final int DEFAULT_FENCE_RADIUS_METERS = 200;
|
||
public static final int DUPLICATE_PUNCH_WINDOW_MINUTES = 30;
|
||
public static final int LATE_THRESHOLD_MINUTES = 15;
|
||
|
||
// 启动时校验
|
||
public static void validateAll() {
|
||
assert WEEKDAY_OVERTIME_RATE.compareTo(new BigDecimal("1.5")) == 0
|
||
: "BR-SALARY-002 被篡改: 加班费率=" + WEEKDAY_OVERTIME_RATE;
|
||
// ... 其他校验
|
||
}
|
||
}
|
||
```
|
||
|
||
业务代码引用此处常量,禁止硬编码。任何值被篡改,系统启动时立刻报警。
|
||
|
||
#### 防线三:核心逻辑单元测试
|
||
|
||
核心业务测试必须做到:**修改任何一个运算符、任何一个常量、任何一个判断条件,至少一个测试会失败。**
|
||
|
||
```java
|
||
@Test
|
||
public void 加班费_恰好8小时_包含边界() {
|
||
// 这个测试专门防止 >= 被改成 >
|
||
// 恰好 8 小时不算加班(正常工时)
|
||
assertEquals(BigDecimal.ZERO, result.getOvertimePay());
|
||
}
|
||
|
||
@Test
|
||
public void 精度_不使用浮点类型() {
|
||
// 通过反射检查 Service 中没有使用 double/float
|
||
}
|
||
```
|
||
|
||
#### 防线四:Git Hook 自动检查
|
||
|
||
提交前自动检测红区文件变更并告警:
|
||
|
||
```bash
|
||
#!/bin/bash
|
||
# .git/hooks/pre-commit
|
||
|
||
RED_ZONE_PATTERNS=("service/salary" "service/auth" "BusinessRules.java")
|
||
STAGED_FILES=$(git diff --cached --name-only)
|
||
|
||
for pattern in "${RED_ZONE_PATTERNS[@]}"; do
|
||
MATCHES=$(echo "$STAGED_FILES" | grep "$pattern")
|
||
if [ -n "$MATCHES" ]; then
|
||
echo "⚠️ 红区文件变更警告:$MATCHES"
|
||
echo "需要:1.人工逐行审查 2.单元测试通过 3.至少一人 Code Review"
|
||
read -p "确认已完成以上检查?(yes/no): " confirm
|
||
[ "$confirm" != "yes" ] && exit 1
|
||
fi
|
||
done
|
||
```
|
||
|
||
#### 防线五:定期业务逻辑巡检
|
||
|
||
每两周执行一次自动巡检脚本,检查:
|
||
- 红区文件近期变更
|
||
- 新增的物理删除语句
|
||
- 工资模块中的浮点类型使用
|
||
- 缺少权限注解的写接口
|
||
|
||
---
|
||
|
||
## 问题 4:人工/AI 开发边界划分
|
||
|
||
### 4.1 按代码层级划分
|
||
|
||
```
|
||
┌─────────────────────────────────────────────┐
|
||
│ 前端 UI 层 │ AI 为主(80%)
|
||
│ 列表页、表单页、详情页、组件搭建 │
|
||
├─────────────────────────────────────────────┤
|
||
│ API 接口层(Controller) │ AI 为主(70%)
|
||
│ 参数接收、参数校验、调用 Service、返回结果 │
|
||
├─────────────────────────────────────────────┤
|
||
│ 业务逻辑层(Service) │ 人机协作(50/50)
|
||
│ 业务规则实现、流程编排、事务管理 │
|
||
├─────────────────────────────────────────────┤
|
||
│ 数据访问层(Mapper/DAO) │ AI 辅助(60%简单/40%复杂)
|
||
│ SQL 编写、数据查询、数据持久化 │
|
||
├─────────────────────────────────────────────┤
|
||
│ 基础设施层 │ 人工为主(80%)
|
||
│ 安全、缓存、消息队列、第三方集成 │
|
||
└─────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 4.2 按业务风险划分(最关键)
|
||
|
||
```
|
||
业务风险
|
||
高
|
||
│
|
||
┌───────────────┼───────────────┐
|
||
│ 人工编写 │ 人工编写 │
|
||
│ AI 写测试 │ AI 禁入 │
|
||
│ │ │
|
||
│ 工资计算 │ 资金流转 │
|
||
│ 排班算法 │ 权限认证 │
|
||
│ 考勤规则 │ 数据安全 │
|
||
低 ──┼───────────────┼───────────────┼── 高 技术复杂度
|
||
│ │ │
|
||
│ AI 自主完成 │ AI 生成 │
|
||
│ 人工抽查 │ 人工审核 │
|
||
│ │ │
|
||
│ CRUD 页面 │ 复杂报表 │
|
||
│ 简单列表 │ 数据迁移 │
|
||
│ 表单提交 │ 第三方对接 │
|
||
└───────────────┼───────────────┘
|
||
低
|
||
```
|
||
|
||
**原则:越接近钱和权限的代码,人工参与度越高。**
|
||
|
||
### 4.3 按 SmartClean 业务模块的详细边界
|
||
|
||
#### 用户管理模块
|
||
|
||
- **绿区(AI 自主):** 用户列表/详情/表单页面、团队/标签/技能 CRUD、用户导入导出、Controller 接口
|
||
- **黄区(AI 辅助):** 用户状态管理、用户与角色关联、数据权限、批量操作
|
||
- **红区(人工):** 用户认证(登录/Token/Session)、密码加密、权限计算与缓存、敏感信息脱敏
|
||
|
||
#### 打卡考勤模块
|
||
|
||
- **绿区:** 打卡记录列表/详情页面、考勤报表页面、查询接口、导出 Excel
|
||
- **黄区:** 考勤月度汇总统计 SQL、打卡异常检测定时任务、考勤与排班关联查询
|
||
- **红区:** 打卡核心逻辑(身份校验、地理围栏、防重、迟到/早退判定)、补卡审批、数据防篡改
|
||
|
||
#### 任务调度模块
|
||
|
||
- **绿区:** 任务列表/详情/表单页面、任务记录查询接口、数据导出
|
||
- **黄区:** 任务分配算法、计划任务生成、状态流转、巡检路线规划
|
||
- **红区:** 任务与工资联动计算、任务完成验证(照片/GPS)、紧急任务推送
|
||
|
||
#### 人效分析模块
|
||
|
||
- **绿区:** 统计页面、图表组件、数据导出
|
||
- **黄区:** 统计 SQL、效率评分算法、数据缓存策略
|
||
- **红区:** 工资积分计算公式、绩效评定规则、数据权限隔离
|
||
|
||
### 4.4 开发流程中的分工
|
||
|
||
```
|
||
1. 需求分析 → 100% 人工(产品+开发+测试)
|
||
2. 技术方案设计 → 人工主导,AI 辅助出初稿
|
||
3. 数据库设计 → AI 出初稿 → 人工审核字段类型、索引、关联关系
|
||
4. API 接口设计 → AI 出初稿 → 人工审核接口粒度、参数设计
|
||
5. 后端 CRUD 开发 → AI 为主(Controller + 简单 Service + Mapper)
|
||
6. 核心业务逻辑 → 人工为主,AI 辅助写辅助函数
|
||
7. 前端页面开发 → AI 为主
|
||
8. 前后端联调 → AI 辅助排查参数不匹配问题
|
||
9. 单元测试 → AI 生成测试用例 → 人工补充边界条件
|
||
10. Code Review → 人工审核 AI 代码 + AI 辅助审核人工代码
|
||
11. 部署上线 → 人工操作
|
||
12. 线上验证 → 人工验证
|
||
```
|
||
|
||
---
|
||
|
||
## 问题 5:产品手册与用户培训
|
||
|
||
### 5.1 用户画像分析
|
||
|
||
#### 保洁员画像
|
||
|
||
```
|
||
年龄分布:35-55 岁为主
|
||
教育背景:初中到高中为主
|
||
手机使用:
|
||
- 会发微信、看短视频
|
||
- 偏好语音 > 打字
|
||
- 对新 APP 有抵触心理("又要学新东西")
|
||
工作特点:
|
||
- 早班 5:00-6:00 到岗,没时间"研究"系统
|
||
- 手可能湿/脏,不方便精细操作
|
||
- 手机可能是低端安卓机
|
||
- 流动性高,平均在职 6-12 个月
|
||
核心诉求:
|
||
- 打卡不要麻烦,任务看得懂就行,工资算对就行
|
||
```
|
||
|
||
#### 班组长画像
|
||
|
||
```
|
||
年龄分布:30-45 岁
|
||
手机使用:熟练使用微信、钉钉,能接受学习新工具
|
||
核心诉求:
|
||
- 快速知道谁没来、谁没干完
|
||
- 简单地安排和调整任务
|
||
- 处理异常(补卡、调班)
|
||
```
|
||
|
||
#### 项目经理画像
|
||
|
||
```
|
||
年龄分布:28-40 岁
|
||
核心诉求:
|
||
- 数据驾驶舱(全局概览)
|
||
- 人力成本分析、月度报告数据支撑
|
||
```
|
||
|
||
### 5.2 分角色产品手册设计
|
||
|
||
#### 保洁员手册(极简版——一页纸、大字体、有图示、零术语)
|
||
|
||
```
|
||
设计规格:
|
||
- A4 双面彩打,覆膜(防水防脏)
|
||
- 字体最小 16px,关键词 20px 加粗
|
||
- 左边图/截图,右边文字说明
|
||
- 纯口语化
|
||
|
||
内容:
|
||
上班时说: "我要上班打卡"
|
||
下班时说: "我要下班打卡"
|
||
看任务说: "今天有什么任务"
|
||
干完了说: "XX区域打扫完了"
|
||
请假时说: "我要请假"
|
||
看工资说: "查看本月工资"
|
||
有问题说: "我有问题要反馈"
|
||
|
||
注意:
|
||
- 打卡必须本人操作,不能帮别人打卡
|
||
- 打卡时要在工作区域范围内
|
||
- 不确定怎么说,直接说你想做什么就行
|
||
遇到问题找:班组长 XXX(电话)
|
||
```
|
||
|
||
#### 班组长手册(功能更全)
|
||
|
||
**日常管理操作:**
|
||
|
||
| 你想做什么 | 怎么说 | 备注 |
|
||
|-----------|--------|------|
|
||
| 查看团队出勤 | "今天谁没打卡" | 可加时间,如"本周出勤情况" |
|
||
| 安排临时任务 | "给张三安排清扫3号楼大厅" | 需指定人员和区域 |
|
||
| 查看任务进度 | "今天的任务完成情况" | 可按区域查 |
|
||
| 审批请假 | "查看待审批的请假" | |
|
||
| 查看巡检结果 | "今天的巡检报告" | 可指定区域 |
|
||
|
||
**常见问题处理:**
|
||
|
||
- 新员工第一天:班组长花 2 分钟教"上班打卡""看任务""下班打卡"三句话
|
||
- 龙虾听不懂:换个说法试试,不行就打开 APP 手动操作
|
||
- GPS 不准:连工作区域 WiFi,或到室外信号好的地方
|
||
- 临时借调:说"临时借调XX到我的班组"
|
||
|
||
### 5.3 系统内引导设计
|
||
|
||
#### 新手引导流程
|
||
|
||
```
|
||
第1屏(欢迎):"你好!我是龙虾助手,从今天起帮你处理工作上的事"
|
||
第2屏(打卡演示):"来,试试跟我说'上班打卡'" → 用户说后 → "太棒了!就是这么简单!"
|
||
第3屏(任务演示):"再试试说'今天有什么任务'" → 展示任务列表 → "干完了跟我说一声"
|
||
```
|
||
|
||
#### 智能引导与纠错
|
||
|
||
```
|
||
高置信度(>90%)→ 直接执行
|
||
"我要上班打卡" → 执行打卡
|
||
|
||
中置信度(60-90%)→ 确认后执行
|
||
"打卡" → "你是要上班打卡还是下班打卡?"
|
||
|
||
低置信度(30-60%)→ 猜测 + 引导
|
||
"考勤" → "关于考勤,你想:上班打卡/下班打卡/查看出勤记录?"
|
||
|
||
极低置信度(<30%)→ 通用引导
|
||
"吃饭了吗" → "我暂时只能帮你处理工作相关的事情。你可以问我:..."
|
||
|
||
无法识别 → 兜底 + 学习
|
||
同时将消息记录到"未识别日志"中,用于后续优化
|
||
```
|
||
|
||
### 5.4 培训方案(零集中培训)
|
||
|
||
```
|
||
培训金字塔:
|
||
|
||
运营团队(2人) ← 深度培训 1 天
|
||
↓ 培训
|
||
班组长 ← 中度培训 2 小时
|
||
↓ 带教
|
||
保洁员 ← 现场带教 10 分钟(只学打卡、看任务、完成任务)
|
||
```
|
||
|
||
**为什么不做集中培训:**
|
||
1. 保洁员分散在各项目点,集中成本高
|
||
2. 人员流动大,每月都有新人
|
||
3. 学习能力参差不齐,集中培训效果差
|
||
4. 学了不马上用就忘
|
||
|
||
**辅助手段:**
|
||
- 微信群钉 3 个 30 秒短视频(打卡、看任务、完成任务)
|
||
- 每周微信群发一个"你知道吗?你还可以说'查看本月工资'"小贴士
|
||
- 月度工资提醒:"本月工资已发放,跟龙虾说'看工资'查看工资条"
|
||
|
||
**应对抵触心理:**
|
||
- "我不会用手机" → 班组长当面教,只教打卡
|
||
- "以前不用打卡也没事" → 强调打卡是算工资的依据
|
||
- "手机里装太多东西了" → 基于微信,不需要装新 APP
|
||
|
||
### 5.5 持续优化闭环
|
||
|
||
```
|
||
数据收集 → 分析 → 优化 → 验证
|
||
|
||
1. 记录所有用户输入和系统响应,特别关注:
|
||
- 系统无法识别的消息
|
||
- 用户放弃的对话
|
||
- 用户重复说相同内容(说明第一次没成功)
|
||
|
||
2. 每周分析:
|
||
- Top 20 未识别消息 → 添加意图/话术映射
|
||
- 高放弃率的对话流程 → 优化引导
|
||
|
||
3. 持续更新:
|
||
- 每周更新话术库
|
||
- 每月更新引导流程
|
||
- 每季度更新手册
|
||
```
|
||
|
||
---
|
||
|
||
## 问题 6:打卡身份校验与代操作拦截
|
||
|
||
### 6.1 威胁模型分析
|
||
|
||
| 威胁类型 | 典型场景 | 风险级别 |
|
||
|---------|---------|---------|
|
||
| 直接代打 | "帮李四打卡" | 高 |
|
||
| 间接代打 | "李四让我帮他说一下,他今天到了" | 高 |
|
||
| 身份伪装 | "我是李四"(用张三账号说) | 高 |
|
||
| 模糊描述 | "李四也到了" | 中 |
|
||
| 多人同时 | "我和李四都打卡" | 中 |
|
||
| 位置作弊 | 使用虚拟定位 APP | 高 |
|
||
| 时间作弊 | "我7点就到了,手机没电" | 中 |
|
||
| 社会工程 | "班组长帮我打个卡吧" | 中 |
|
||
|
||
### 6.2 身份认证方案
|
||
|
||
| 级别 | 方案 | 适用场景 |
|
||
|------|------|----------|
|
||
| Level 1 | 微信 OpenID 绑定 | 低安全要求(基础方案) |
|
||
| Level 2 | 微信 + 设备指纹(推荐) | 标准安全要求 |
|
||
| Level 3 | 微信 + 人脸识别 | 高安全要求(如金融物业) |
|
||
|
||
**建议 SmartClean 采用 Level 2:微信 OpenID + 设备指纹 + 地理围栏三重验证。**
|
||
|
||
### 6.3 代操作检测逻辑
|
||
|
||
**检测规则:**
|
||
|
||
| 规则 | 模式 | 示例 | 处理 |
|
||
|------|------|------|------|
|
||
| 规则1 | 代操作介词 + 他人名字 + 动词 | "帮李四打卡" | 拦截 |
|
||
| 规则2 | 第三人称 + 操作动词 | "李四要打卡" | 拦截 |
|
||
| 规则3 | 身份伪装 | "我是李四" | 拦截,提示以登录账号为准 |
|
||
| 规则4 | 多人操作 | "我和李四一起打卡" | 拦截,只为当前用户打卡 |
|
||
| 查询例外 | 他人名字 + 疑问 | "李四打卡了吗?" | 允许(需权限),当做查询 |
|
||
|
||
**代操作检测核心逻辑(伪代码):**
|
||
|
||
```java
|
||
public ProxyDetectResult detect(String message, Long currentUserId) {
|
||
String currentUserName = getNameById(currentUserId);
|
||
|
||
// 规则1:代操作介词检测
|
||
// "帮/替/给 + 他人名字 + 操作动词"
|
||
if (包含代操作介词 && 包含他人名字 && 包含操作动词) {
|
||
return 拦截("打卡只能本人操作,请让对方用自己的手机");
|
||
}
|
||
|
||
// 规则2:第三人称操作请求
|
||
// "李四要打卡"(不是"李四打卡了吗?")
|
||
if (提到他人名字 && 包含操作动词 && 不是查询语气) {
|
||
return 拦截("不能帮他人操作,每个人需要用自己的手机");
|
||
}
|
||
|
||
// 规则3:身份伪装
|
||
// "我是李四"
|
||
if (包含身份声明 && 声明的名字不是当前用户) {
|
||
return 拦截("系统已通过手机识别你的身份,不需要报名字");
|
||
}
|
||
|
||
// 规则4:多人操作
|
||
// "我和李四一起打卡"
|
||
if (包含"和/一起/我们" && 提到他人名字 && 包含操作动词) {
|
||
return 拦截("我先帮你打卡,其他人请用自己的手机");
|
||
}
|
||
|
||
return 通过();
|
||
}
|
||
```
|
||
|
||
### 6.4 打卡全流程
|
||
|
||
```
|
||
用户发送消息
|
||
│
|
||
▼
|
||
1. 意图识别 → "我要上班打卡" → PUNCH_IN
|
||
│
|
||
▼
|
||
2. 代操作检测 → 检查是否涉及他人 → 拦截或通过
|
||
│
|
||
▼
|
||
3. 身份确认 → Session 获取 userId + 设备指纹校验
|
||
│
|
||
▼
|
||
4. 地理围栏校验 → GPS 定位(降级到 WiFi)→ 计算距离
|
||
│
|
||
▼
|
||
5. 防重复打卡 → 30 分钟内同类型已打过 → 提示
|
||
│
|
||
▼
|
||
6. 考勤判定 → 与排班时间比对 → 正常/迟到/早退
|
||
│
|
||
▼
|
||
7. 写入记录 + 审计日志
|
||
│
|
||
▼
|
||
8. 返回结果
|
||
正常:"上班打卡成功!08:01,全勤继续保持!"
|
||
迟到:"上班打卡成功!08:18,迟到 3 分钟。"
|
||
```
|
||
|
||
### 6.5 审计日志设计
|
||
|
||
每次打卡请求(无论成功失败)都记录:
|
||
|
||
```json
|
||
{
|
||
"timestamp": "2026-04-15T08:32:15",
|
||
"userId": 10086,
|
||
"userName": "张三",
|
||
"rawMessage": "我要上班打卡",
|
||
"intent": "PUNCH_IN",
|
||
"proxyDetected": false,
|
||
"geoLocation": {"lat": 31.2304, "lng": 121.4737},
|
||
"withinFence": true,
|
||
"result": "SUCCESS",
|
||
"attendanceStatus": "NORMAL"
|
||
}
|
||
```
|
||
|
||
代操作拦截记录:
|
||
|
||
```json
|
||
{
|
||
"timestamp": "2026-04-15T08:35:22",
|
||
"userId": 10086,
|
||
"userName": "张三",
|
||
"rawMessage": "帮李四打个卡吧",
|
||
"intent": "PUNCH_IN",
|
||
"proxyDetected": true,
|
||
"proxyTarget": "李四",
|
||
"result": "BLOCKED",
|
||
"blockReason": "代操作拦截"
|
||
}
|
||
```
|
||
|
||
审计日志的价值:
|
||
- 员工投诉"我打了卡但系统没记录" → 查审计日志
|
||
- 发现疑似作弊行为 → 分析异常模式
|
||
- 优化 NLP → 分析被拦截的消息
|
||
- 法律纠纷 → 作为电子证据
|
||
|
||
---
|
||
|
||
## 问题 7:开放问题与逻辑安全
|
||
|
||
### 7.1 两个层面分析
|
||
|
||
#### 层面 A:AI 辅助开发中的开放问题
|
||
|
||
开发者和 Claude Code 对话时,问分析性问题,AI 可能"好心地"顺便改代码。
|
||
|
||
**防护措施(写入 CLAUDE.md):**
|
||
|
||
```
|
||
1. 分析性问题("你觉得""你看看""合不合理")→ 只输出文字分析,不修改文件
|
||
2. 明确指令("修改""添加""删除""重构")→ 执行修改
|
||
3. 模糊指令("处理一下""搞一下")→ 先确认意图,等待确认
|
||
4. 修改红区文件 → 必须先列出完整修改方案,等待确认
|
||
5. 不可在回答问题时顺便修改不相关的文件
|
||
6. 不可"优化"未被要求修改的代码
|
||
7. 不可修改测试用例中的预期值来让测试通过
|
||
```
|
||
|
||
**额外安全网:Git 习惯**
|
||
- 每次让 AI 开始新任务前,先 commit 当前状态
|
||
- AI 做完后,`git diff` 审核所有变更
|
||
- 不满意 → `git checkout` 回退
|
||
|
||
#### 层面 B:终端用户对话的逻辑安全(龙虾助手)
|
||
|
||
面向保洁员的对话系统,必须做到**绝对的读写隔离**。
|
||
|
||
**核心设计:意图白名单制**
|
||
|
||
```
|
||
所有允许的操作穷举列出:
|
||
|
||
写操作(需二次确认):
|
||
- PUNCH_IN / PUNCH_OUT(打卡)
|
||
- LEAVE_REQUEST(请假)
|
||
- TASK_COMPLETE(完成任务)
|
||
- SUPPLEMENT_PUNCH(补卡申请)
|
||
|
||
读操作(直接返回):
|
||
- QUERY_MY_TASKS(查看我的任务)
|
||
- QUERY_MY_ATTENDANCE(查看我的考勤)
|
||
- QUERY_MY_SALARY(查看我的工资)
|
||
|
||
管理操作(仅班组长+):
|
||
- QUERY_TEAM_ATTENDANCE(查看团队考勤)
|
||
- ASSIGN_TEMP_TASK(安排临时任务)
|
||
|
||
不在白名单 → 当做闲聊,只返回文字,绝不触发数据库操作
|
||
```
|
||
|
||
**写操作二次确认:**
|
||
|
||
```
|
||
用户:"我要请假三天"
|
||
龙虾:"确认请假信息:
|
||
请假人:张三
|
||
时间:2026-04-16 至 2026-04-18(3天)
|
||
类型:事假
|
||
确认提交吗?[确认] [取消]"
|
||
```
|
||
|
||
**危险操作完全拦截:**
|
||
|
||
```
|
||
用户:"把我上个月的打卡记录删了"
|
||
龙虾:"抱歉,删除数据需要管理员在后台操作。
|
||
如果你的考勤记录有问题,可以跟班组长说明情况。"
|
||
|
||
以下操作不能通过对话执行:
|
||
- 删除数据
|
||
- 修改工资配置
|
||
- 修改权限设置
|
||
- 批量操作
|
||
```
|
||
|
||
**注入防护:**
|
||
- 用户消息永远作为纯文本处理,不参与任何代码执行
|
||
- 意图识别输出的是枚举值,不是用户原文
|
||
- 数据库操作使用参数化查询
|
||
- 如果用 LLM 做意图识别,用户消息放在独立标签中,与系统 prompt 严格隔离
|
||
|
||
---
|
||
|
||
## 问题 8:手机端数据展示方案
|
||
|
||
### 8.1 核心设计原则
|
||
|
||
```
|
||
保洁员 ≠ 办公室白领
|
||
|
||
设计原则:
|
||
1. 首屏 = 最重要的一个数字/状态
|
||
2. 操作 ≤ 3 次点击完成
|
||
3. 文字大、按钮大、间距大
|
||
4. 支持弱网/离线基础功能
|
||
5. 绝不要求用电脑
|
||
```
|
||
|
||
### 8.2 各类数据的适配方案
|
||
|
||
#### 工资条:卡片化 + 渐进展开
|
||
|
||
**第一级:摘要卡片(龙虾助手直接返回)**
|
||
|
||
```
|
||
2026年4月 工资条
|
||
|
||
实发工资
|
||
¥ 5,680.00
|
||
|
||
基本工资 ¥4,500.00
|
||
加班费 ¥ 750.00
|
||
全勤奖 ¥ 200.00
|
||
───────────────────
|
||
社保 -¥ 520.00
|
||
个税 -¥ 250.00
|
||
|
||
[查看完整明细] [有疑问]
|
||
```
|
||
|
||
**第二级:完整明细(H5 页面,不是 Web 后台)**
|
||
- 所有收入项 + 计算过程(如"平日加班费:10小时 × ¥28.74 × 1.5 = ¥431.03")
|
||
- 所有扣除项
|
||
- 出勤信息汇总
|
||
- 底部有"工资有疑问?点击反馈"入口
|
||
|
||
关键设计:加班费后标注计算过程,让员工看懂怎么算的。不用横向表格,全部纵向列表。
|
||
|
||
#### 考勤记录
|
||
|
||
```
|
||
龙虾返回:
|
||
"你4月的考勤情况:
|
||
出勤 21 天(全勤)
|
||
迟到 0 次 / 早退 0 次
|
||
加班 15.22 小时
|
||
全勤奖 ¥200 到手!继续保持!
|
||
[查看每日打卡详情]"
|
||
```
|
||
|
||
#### 任务清单
|
||
|
||
```
|
||
"今天你有 3 个任务:
|
||
1. A栋大厅清扫 [08:00-10:00]
|
||
2. B栋卫生间清洁 [10:00-11:30]
|
||
3. 外围道路保洁 [13:00-16:00]
|
||
干完了跟我说'XX干完了'就行!"
|
||
```
|
||
|
||
#### 排班表
|
||
|
||
```
|
||
"这周你的排班:
|
||
周一 07:00-16:00 A区
|
||
周二 07:00-16:00 A区
|
||
周三 07:00-16:00 B区 ← 注意换区了
|
||
周四 07:00-16:00 B区
|
||
周五 07:00-16:00 A区
|
||
周六 休息 / 周日 休息"
|
||
```
|
||
|
||
### 8.3 各数据类型的双端分工
|
||
|
||
| 数据 | 手机端展示 | Web 端附加能力 |
|
||
|------|-----------|---------------|
|
||
| 工资条 | 卡片摘要 + H5 详情 | 导出 Excel、历史对比 |
|
||
| 考勤 | 出勤天数 + 异常标记 | 完整日历视图 |
|
||
| 排班 | 我的本周排班 | 全员排班甘特图 |
|
||
| 任务统计 | 今日/本周完成数 | 多维度图表分析 |
|
||
| 巡检报告 | 最近一次结果 | 历史趋势、照片汇总 |
|
||
|
||
### 8.4 Web 端定位
|
||
|
||
Web 端不是给保洁员用的,而是给管理层用的:
|
||
|
||
```
|
||
Web 端用户:项目经理、区域经理、公司管理层
|
||
Web 端功能:
|
||
- 数据驾驶舱(全局概览)
|
||
- 多维度报表(可筛选、可导出)
|
||
- 排班管理(甘特图、批量操作)
|
||
- 人员管理(入职、离职、调动)
|
||
- 薪资管理(批量算薪、审核、发放)
|
||
- 系统配置(权限、围栏、规则配置)
|
||
|
||
设计原则:
|
||
- Web 端面向"管理+分析"场景
|
||
- 手机端面向"执行+查询"场景
|
||
- 两端数据实时同步
|
||
- 不强制任何人必须用 Web 端
|
||
```
|
||
|
||
---
|
||
|
||
## 问题 9:国内 AI 编程现状与成本管理
|
||
|
||
### 9.1 工具能力对比(以 SmartClean 典型任务为基准)
|
||
|
||
**任务 1:生成完整的排班 CRUD**
|
||
|
||
| 工具 | 评分 | 说明 |
|
||
|------|------|------|
|
||
| Claude Code (Opus) | ★★★★★ | 一次生成完整代码,分层规范 |
|
||
| Cursor (Claude) | ★★★★☆ | IDE 内生成,需分步操作 |
|
||
| GitHub Copilot | ★★★☆☆ | 补全好,无法一次生成完整模块 |
|
||
| 通义灵码 | ★★★☆☆ | 能生成框架,细节需调整 |
|
||
| DeepSeek Coder | ★★★☆☆ | Java 代码质量不错,上下文理解弱 |
|
||
| 豆包 MarsCode | ★★☆☆☆ | 简单补全可以,复杂力不足 |
|
||
|
||
**任务 2:排查跨天排班冲突 Bug**
|
||
|
||
| 工具 | 评分 | 说明 |
|
||
|------|------|------|
|
||
| Claude Code (Opus) | ★★★★★ | 能理解业务上下文,精确定位 |
|
||
| Cursor (Claude) | ★★★★☆ | 需手动指定相关文件 |
|
||
| DeepSeek Coder | ★★★☆☆ | 推理不错但上下文窗口小 |
|
||
| 通义灵码 | ★★☆☆☆ | 简单 Bug 可以,复杂推理弱 |
|
||
|
||
**任务 3:设计打卡防作弊方案**
|
||
|
||
| 工具 | 评分 | 说明 |
|
||
|------|------|------|
|
||
| Claude Code (Opus) | ★★★★★ | 方案完整、考虑全面 |
|
||
| DeepSeek (Chat) | ★★★★☆ | 推理能力强,方案有深度 |
|
||
| 通义灵码 | ★★★☆☆ | 中文好,方案深度一般 |
|
||
|
||
### 9.2 推荐的任务分流策略
|
||
|
||
| 任务类型 | 推荐工具 | 原因 |
|
||
|---------|---------|------|
|
||
| 日常代码补全 | 通义灵码/Copilot | 实时补全,免费/低价 |
|
||
| 简单 CRUD | DeepSeek/通义 | 够用且便宜 |
|
||
| Vue 页面开发 | DeepSeek/通义 | 前端代码质量可以 |
|
||
| 复杂业务逻辑 | Claude Code | 推理能力最强 |
|
||
| 架构设计 | Claude Code | 长上下文 + 深度推理 |
|
||
| Bug 排查 | Claude Code | 跨文件理解能力最强 |
|
||
| 代码重构 | Claude Code/Cursor | 需要理解全局上下文 |
|
||
| 文档生成 | DeepSeek/通义 | 中文好,成本低 |
|
||
| 单元测试 | 通义/DeepSeek | 模板化工作 |
|
||
| SQL 编写优化 | Claude/DeepSeek | 需要理解表关系 |
|
||
|
||
### 9.3 Token 消耗深度分析
|
||
|
||
**为什么对话越长越贵:**
|
||
|
||
```
|
||
轮次 单轮 token 累计 token 累计成本(Opus 估算)
|
||
1 15,000 15,000 $0.30
|
||
5 25,000 115,000 $2.10
|
||
10 40,000 315,000 $5.70
|
||
20 70,000 1,015,000 $17.50
|
||
30 100,000 2,015,000 $34.00
|
||
50 150,000 5,015,000 $82.00
|
||
|
||
因为每轮对话都携带之前的完整历史!
|
||
```
|
||
|
||
**Token 优化策略:**
|
||
|
||
**策略 1:优化 CLAUDE.md(节省 30-40%)**
|
||
在 CLAUDE.md 中写清楚代码生成规范(Java 版本、字段类型、全局组件等),每条规范能减少一轮返工对话。
|
||
|
||
**策略 2:任务拆分(节省 40-60%)**
|
||
|
||
```
|
||
错误:一个大对话完成整个需求 → ~3,000,000-5,000,000 token
|
||
正确:拆成 6 个小对话 → ~1,000,000 token(节省 60-70%)
|
||
```
|
||
|
||
10 个各 5 轮的小对话,比 1 个 50 轮的大对话便宜得多。
|
||
|
||
**策略 3:精准 Prompt(节省 20-30%)**
|
||
|
||
```
|
||
错误(引发 3-5 轮追问):
|
||
"帮我写个打卡接口"
|
||
|
||
正确(一次到位):
|
||
"在 AttendanceController 中新增 POST /api/attendance/punch 接口:
|
||
接收 PunchDTO(type: IN/OUT, latitude, longitude),
|
||
校验地理围栏 200 米,防重复 30 分钟,
|
||
判定迟到/早退 15 分钟,需要权限注解"
|
||
```
|
||
|
||
**策略 4:善用 /compact**
|
||
对话进行到 15-20 轮时执行 `/compact`,后续每轮消耗降低 30-50%。
|
||
|
||
**策略 5:分流到国内模型(节省 50-70% 成本)**
|
||
60-70% 的日常任务用国内模型(免费或极低价),30-40% 的复杂任务用 Claude。
|
||
|
||
### 9.4 成本测算
|
||
|
||
```
|
||
假设:2 个开发者,月均开发 12 个需求
|
||
|
||
方案 A:全部使用 Claude Code
|
||
月成本:约 ¥9,000
|
||
|
||
方案 B:混合策略(推荐)
|
||
60% 用 DeepSeek(约 ¥200/月)
|
||
10% 用通义灵码(免费)
|
||
30% 用 Claude Code(约 ¥1,350/月)
|
||
月总成本:约 ¥3,100
|
||
|
||
方案 C:Claude Max 订阅
|
||
$100-200/月/人
|
||
两个开发者:约 ¥1,400-2,800/月
|
||
|
||
对比参考:
|
||
中级 Java 开发者月薪 ¥15,000-25,000
|
||
AI 工具成本 ¥1,500-4,500/月 = 开发者工资的 3-8%
|
||
如果 AI 能提升 30%+ 效率,ROI 非常高
|
||
```
|
||
|
||
### 9.5 数据安全合规
|
||
|
||
**数据分级制度:**
|
||
|
||
| 级别 | 说明 | 处理方式 |
|
||
|------|------|----------|
|
||
| Level 1 公开数据 | 开源代码、公开技术文档 | 可发送给任何 AI |
|
||
| Level 2 内部数据 | 业务代码、表结构、接口定义 | 可发送给付费 AI 服务 |
|
||
| Level 3 敏感数据 | 含用户信息的代码、业务数据 SQL | 脱敏后可发送 |
|
||
| Level 4 机密数据 | 密码、密钥、真实工资、身份证号 | 禁止发送 |
|
||
|
||
**发送代码给 AI 前的检查清单:**
|
||
|
||
- [ ] 代码中没有硬编码的密码/密钥/Token
|
||
- [ ] 代码中没有真实的 IP 地址/域名
|
||
- [ ] 代码中没有真实用户的姓名/手机号
|
||
- [ ] 配置文件中的敏感信息已替换为占位符
|
||
- [ ] SQL 中的 WHERE 条件不包含真实数据
|
||
- [ ] 错误截图中没有敏感信息
|
||
|
||
---
|
||
|
||
## 综合实施路线图
|
||
|
||
### 第一阶段:立即执行(本周)
|
||
|
||
| 行动 | 对应问题 | 负责人 |
|
||
|------|----------|--------|
|
||
| 更新 CLAUDE.md 添加代码生成规范 | 问题 3/9 | 技术负责人 |
|
||
| 更新 CLAUDE.md 添加代码分区规则 | 问题 3 | 技术负责人 |
|
||
| 制定 Git Commit 规范 | 问题 1 | 技术负责人 |
|
||
| 制作保洁员一页纸快速指南 | 问题 5 | 产品经理 |
|
||
|
||
### 第二阶段:两周内完成
|
||
|
||
| 行动 | 对应问题 |
|
||
|------|----------|
|
||
| 创建 BusinessRules.java 业务规则断言文件 | 问题 3 |
|
||
| 建立核心业务逻辑的单元测试覆盖 | 问题 3 |
|
||
| 实现打卡代操作检测逻辑 | 问题 6 |
|
||
| 实现意图白名单 + 写操作确认机制 | 问题 7 |
|
||
| 制定人工/AI 开发边界文档并团队对齐 | 问题 4 |
|
||
|
||
### 第三阶段:一个月内完善
|
||
|
||
| 行动 | 对应问题 |
|
||
|------|----------|
|
||
| 建立需求级开发日志模板并执行 | 问题 1 |
|
||
| 沉淀 AI 开发经验知识库初版 | 问题 1 |
|
||
| 完成工资条/考勤移动端卡片化设计 | 问题 8 |
|
||
| 完成班组长操作手册 + 培训视频 | 问题 5 |
|
||
| 确定混合工具策略并跟踪成本 | 问题 9 |
|
||
|
||
### 持续迭代
|
||
|
||
| 行动 | 频率 |
|
||
|------|------|
|
||
| 分析用户未识别消息,优化话术 | 每周 |
|
||
| 更新 AI 经验知识库 | 每月 |
|
||
| 审计红区文件变更 | 每月 |
|
||
| 评估 AI 工具效果与成本 | 每季度 |
|
||
|
||
---
|
||
|
||
## 附录:高效 Prompt 模板库
|
||
|
||
### 新增 CRUD 功能模板
|
||
|
||
```
|
||
在 {模块名} 中新增 {功能名} 的完整 CRUD:
|
||
|
||
数据库:
|
||
- 表名:{table_name}
|
||
- 核心字段:{字段列表及类型}
|
||
- 必须包含:id(BIGINT), create_time, update_time, deleted(TINYINT)
|
||
- 类型/状态字段用 TINYINT,时间字段用 DATETIME
|
||
- 设计查询所需索引
|
||
|
||
后端:
|
||
- Controller: {接口路径前缀}
|
||
- 包含:分页列表、新增、修改、删除(逻辑删除)、详情
|
||
- 分页大小上限 100,参数校验,权限注解
|
||
|
||
前端:
|
||
- 使用 qu-table 全局组件
|
||
- 列和按钮通过 fetchFields/fetchButtons 动态加载
|
||
- API 定义在 Apis/api.js,调用封装在 ApiService/ 下
|
||
- 提交按钮加 loading 防重
|
||
```
|
||
|
||
### 复杂业务逻辑模板
|
||
|
||
```
|
||
实现 {功能描述}
|
||
|
||
业务规则(必须全部遵守,不可简化):
|
||
1. {规则1}
|
||
2. {规则2}
|
||
|
||
边界条件:
|
||
- {如跨天、并发、空值}
|
||
|
||
角色权限:
|
||
- {角色1}可以{操作}
|
||
- {角色2}只能{有限操作}
|
||
|
||
技术约束:
|
||
- 金额用 BigDecimal,多表写入加 @Transactional
|
||
|
||
请先输出实现方案概述,确认后再编写代码。
|
||
```
|