# 任务放弃功能改进 - 快速参考

## 核心改进

### 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
<!-- 已放弃任务：显示"取消放弃" -->
<block wx:if="{{contextMenuTarget.isAbandoned}}">
  <view class="ctx-item" bindtap="onCtxCancelAbandon">
    <text class="ctx-emoji">↩️</text>
    <text class="ctx-text">取消放弃</text>
  </view>
</block>
<!-- 一般/置顶任务：显示标准菜单 -->
<block wx:else>
  <!-- 置顶/备注/问问AI/放弃任务 -->
</block>
```

### 键盘高度管理
```typescript
// 键盘弹出
onAbandonTextareaFocus(e: WechatMiniprogram.InputEvent) {
  const height = (e as any).detail?.height ?? 0
  this.setData({ keyboardHeight: height })
}

// 键盘收起
onAbandonTextareaBlur() {
  this.setData({ keyboardHeight: 0 })
}
```

### 动态样式绑定
```xml
<view class="abandon-overlay {{keyboardHeight > 0 ? 'abandon-overlay--keyboard-open' : ''}}">
  <view class="abandon-actions {{keyboardHeight > 0 ? 'abandon-actions--float' : ''}}" 
        style="{{keyboardHeight > 0 ? 'bottom: ' + keyboardHeight + 'px;' : ''}}">
  </view>
</view>
```

## 测试检查清单

- [ ] 长按已放弃任务显示"取消放弃"
- [ ] 点击"取消放弃"直接执行
- [ ] 任务移回一般任务区域
- [ ] 输入放弃原因时键盘不遮挡内容
- [ ] 按钮固定在键盘上方
- [ ] 输入框边框变蓝
- [ ] 任务列表页和详情页行为一致

## 相关概念

### 任务类型 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`
