# 任务放弃功能改进 - 快速参考
## 核心改进
### 1️⃣ 已放弃任务长按菜单
- **位置**:任务列表页 → 已放弃区域 → 长按任务
- **显示**:单个选项"↩️ 取消放弃"
- **行为**:点击直接执行,无需二次确认
### 2️⃣ 取消放弃流程
```
已放弃任务 → 长按 → 点击"取消放弃" → 直接移回一般任务区域
```
**状态变化**:
- `status`: `abandoned` → `pending`
- `is_pinned`: 保持 `false`
- `abandonReason`: 清除
### 3️⃣ 键盘交互优化
- **输入框激活**:键盘弹出时弹窗自动上移
- **内容保护**:添加占位区域防止被键盘遮挡
- **按钮位置**:固定在键盘上方
- **视觉反馈**:输入框获得焦点时边框变蓝
## 文件修改清单
| 文件 | 修改内容 |
|------|--------|
| `P4-miniapp-core-business.md` | 补充任务类型与状态关系说明 |
| `task-list.wxml` | 长按菜单条件渲染 + 键盘事件 |
| `task-list.ts` | 新增 `onCtxCancelAbandon` + 键盘处理 |
| `task-list.wxss` | 键盘交互样式 |
| `task-detail.wxml` | 键盘事件 + 占位区域 |
| `task-detail.ts` | 键盘处理 + 取消放弃逻辑 |
| `task-detail.wxss` | 键盘交互样式 |
## 关键代码片段
### 长按菜单条件渲染
```xml
↩️
取消放弃
```
### 键盘高度管理
```typescript
// 键盘弹出
onAbandonTextareaFocus(e: WechatMiniprogram.InputEvent) {
const height = (e as any).detail?.height ?? 0
this.setData({ keyboardHeight: height })
}
// 键盘收起
onAbandonTextareaBlur() {
this.setData({ keyboardHeight: 0 })
}
```
### 动态样式绑定
```xml
```
## 测试检查清单
- [ ] 长按已放弃任务显示"取消放弃"
- [ ] 点击"取消放弃"直接执行
- [ ] 任务移回一般任务区域
- [ ] 输入放弃原因时键盘不遮挡内容
- [ ] 按钮固定在键盘上方
- [ ] 输入框边框变蓝
- [ ] 任务列表页和详情页行为一致
## 相关概念
### 任务类型 vs 任务状态
- **任务类型**(task_type):业务性质,系统自动分配
- `high_priority_recall` / `priority_recall` / `follow_up_visit` / `relationship_building`
- **任务状态**(status):生命周期,用户或系统操作改变
- `active` / `inactive` / `completed` / `abandoned`
- **置顶状态**(is_pinned):独立标记,用户手动操作
### 前端展示规则
- **置顶区域**:`is_pinned=true` && `status=active`
- **一般任务**:`is_pinned=false` && `status=active`
- **已放弃区域**:`status=abandoned`(任务类型保留但灰化)
## 常见问题
**Q: 取消放弃后任务会回到原来的位置吗?**
A: 不会。取消放弃后任务会移到一般任务区域的最后,不会回到原来的位置。
**Q: 取消放弃需要输入原因吗?**
A: 不需要。取消放弃是直接操作,无需任何确认或输入。
**Q: 键盘弹出时弹窗会完全隐藏吗?**
A: 不会。弹窗会自动上移,确保内容可见,按钮固定在键盘上方。
**Q: 备注弹窗的键盘交互是否相同?**
A: 是的。备注弹窗组件已经实现了相同的键盘交互,无需额外修改。
---
**更新日期**:2026-03-14
**相关文档**:`docs/TASK_ABANDON_IMPROVEMENTS.md`