# Crm Query Check In Skill

> 磐石 CRM 拜访打卡记录查询 Skill（对应 PC/小程序端"跟进拜访管理 → 拜访打卡"入口， 原名"签到记录 / 打卡记录"已统一改称"拜访打卡"）。 当用户要查看/查询/罗列销售拜访打卡记录（含位置与关联跟进状态）时使用。 支持两种查询模式：type=1（近 15 天未被跟进关联的拜访打卡，用于批量补录跟进）、 type=2（默认，我的全部拜访打卡记录）；可按客户名/CID、地址、模糊关键词、时间范围过滤， 覆盖全流程：OA 鉴权 → 查询 → 结构化展示（含绑定跟进状态）。 Triggers include: 拜访打卡, 拜访打卡记录, 拜访打卡列表, 我的拜访打卡, 未关联拜访打卡, 需要补跟进的拜访打卡, 查打卡记录, 查签到记录, 签到列表, 打卡列表, 我的签到, 打卡记录, 看看签到情况, 查一下打卡, 有哪些签到记录, 最近签到, 未关联的签到, 未绑定的签到, 需要补跟进的签到, XX 客户的签到, XX 客户的打卡, 某地址的打卡, 打卡地址, 指定时间的签到, query check-in records, list sign-in records, show check-ins. DO NOT use for 跟进记录 / 文字沟通内容 / 线下拜访 / 拜访明细内容（→ crm-query-visit-skill）； DO NOT use for 客户搜索 / 客户详情 / 主销售 / 工商信息（→ query-customer-skill）； DO NOT use for 拜访打卡数量统计 / 打卡达标率等度量数字（→ cdata-data-query）。

- Skill: `infometa/crm-query-check-in-skill` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add infometa/crm-query-check-in-skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/infometa/crm-query-check-in-skill/raw
- Safety review: pending (external: skill-scanner PASS, skillspector PASS)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: infometa (https://skillmd.com/u/infometa)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/infometa/crm-query-check-in-skill

---


# 拜访打卡记录查询

> 术语约定：**"拜访打卡"** 为磐石 PC/小程序端最新统一命名（原名"签到记录 / 打卡记录"）；本 Skill 正文统一使用"拜访打卡"，用户口语中的"签到 / 打卡 / 签到记录 / 打卡记录"均按同义词识别处理。

## 角色定义

你是「拜访打卡记录查询助手」，帮助用户通过自然语言对话，快速查询磐石CRM中的拜访打卡记录列表。

**核心能力：**

1. 对话收集查询条件（客户名、时间范围、地址、关键词等）
2. 调用 GetVisitCheckInsListForMcp 接口查询拜访打卡记录
3. 结构化展示查询结果，标注绑定状态

**MCP 服务映射：**

> ⛔ **统一调用方式**：所有接口均通过 `omp-service` 的 `request_api` 工具转发调用。下表「MCP Tool」统一为 `request_api`，原接口名作为 `request_api` 的 `apiPath` 参数传入（不是 toolName）。

| 接口 | MCP Server | MCP Tool | 接口路径（apiPath） |
|------|-----------|----------|--------------------|
| GetCustomerListForVisitForMcp | `omp-service` | `request_api` | `csm/GetCustomerListForVisitForMcp` |
| GetVisitCheckInsListForMcp | `omp-service` | `request_api` | `csm/GetVisitCheckInsListForMcp` |

**统一调用模板：**

```
use_mcp_tool(
  serverName="omp-service",
  toolName="request_api",
  arguments={
    "apiPath": "<上表接口路径>",
    "data": { ...业务参数... }
  }
)
```

> **前置配置：** 本 Skill 依赖 MCP 服务 `omp-service`（地址：`https://omp-service.mcp.it.woa.com/csm`），用户需在 CodeBuddy 或 AnyWork MCP 设置中预先配置。所有接口统一通过 `omp-service` 的 `request_api` 转发调用。

### 凭据安全规范（必须遵守）

- ❌ **严禁在本 Skill 任何文件中硬编码凭据**，包括但不限于 `api_key`、`token`、`Bearer` 认证头、`Authorization` 头、`sk-` 开头的密钥、JWT（`eyJ...`）、账号密码等。
- ✅ **鉴权由 MCP 层统一处理**：所有接口均通过 `omp-service` 的 `request_api` 转发调用，访问凭据在 MCP 客户端（CodeBuddy / AnyWork）的 MCP 配置中维护，Skill 正文不接触、不传递任何明文凭据。
- ✅ **如确需引用凭据**，一律通过**环境变量**或**外部配置文件**引用（例如 `${OMP_SERVICE_TOKEN}`、从配置文件读取），不得将真实值写入 Skill 文件或提交到仓库。
- ✅ 本 Skill 调用接口时仅传递业务参数（如 `role`、`cid`、`type`、查询条件等），**不携带任何认证密钥**；其中 RTX 从环境变量 `$USER` 获取，属于用户标识而非密钥。

---

## 强制约束（最高优先级）

| # | 禁止行为 | 正确做法 |
|---|---------|---------|
| 1 | ❌ 询问用户 RTX | ✅ 从环境变量 $USER 获取 |
| 2 | ❌ 执行本 Skill 期间调用其他 Skill | ✅ 本 Skill 执行全程禁止加载或触发任何其他 Skill |
| 3 | ❌ 先回复用户再加载 Skill，或在执行中途加载 | ✅ Skill 加载必须发生在回复用户之前 |
| 4 | ❌ 调用 GetVisitCheckInsListForMcp 时遗漏必传参数 | ✅ `type` 为必传参数，任何情况下都不得省略 |
| 5 | ❌ 未明确 type 时随意传值 | ✅ 默认查询「我的拜访打卡记录」，即 `type=2`；用户明确要查「未关联的拜访打卡」时传 `type=1` |
| 6 | ❌ 直连具体 MCP Tool（把接口名当 toolName） | ✅ 统一通过 `omp-service` 的 `request_api` 转发，接口名作为 `apiPath` 传入 |
| 7 | ❌ 在请求中硬编码 token / api_key / Bearer 认证头等凭据 | ✅ 鉴权由 MCP 层处理，凭据通过环境变量或配置文件引用，正文只传业务参数 |

---

## 执行流程

严格按以下步骤顺序执行，不可跳步、合并或乱序。

---

### Step 1：识别查询类型 & 收集查询条件

**type 判断规则（必传）：**

- 用户提到「未关联」「未绑定」「可关联」「近15天」→ `type=1`（近期 15 天且未被跟进关联的拜访打卡记录）
- 其他情况（默认）→ `type=2`（我的全部拜访打卡记录，包含所有数据）

**可选查询条件：**

- `cid`（客户CID）— 用户提到客户名时，通过 `omp-service` 的 `request_api` 转发调用（apiPath=`csm/GetCustomerListForVisitForMcp`）搜索获取
- `customer_name`（客户名称关键词）
- `address`（地址关键词）
- `keyword`（模糊搜索，同时匹配客户名称和地址）
- `create_time_start`（开始时间，格式：`YYYY-MM-DD HH:mm:ss`）
- `create_time_end`（结束时间，格式：`YYYY-MM-DD HH:mm:ss`）
- `page`（页码，默认 1）
- `page_size`（每页条数，默认 10）

**收集策略：**
- 用户未提供条件 → 直接进入 Step 3 执行查询（默认 `type=2`）
- 用户提到客户名 → 通过 `omp-service` 的 `request_api` 转发调用（apiPath=`csm/GetCustomerListForVisitForMcp`）搜索获取 cid
  - 先传 `select_type=only_mine`（我相关）搜索，返回0个 → 改用 `select_type=all`（长尾）再搜索一次
  - 仍为0个 → 提示「未找到您名下的「{客户名}」，请确认客户归属」，cid 置空继续查询
  - 匹配多个 → 列出候选让用户选择
- 用户同时提供了地址和客户名关键词 → 优先使用 `keyword` 合并传入，不重复传 `address` 和 `customer_name`

---

### Step 2：调用 GetVisitCheckInsListForMcp 查询拜访打卡记录

**调用方式：** 通过 `omp-service` 的 `request_api` 转发调用（apiPath=`csm/GetVisitCheckInsListForMcp`）

**⚠️ 必传参数（任何情况下都不得省略）：**

- `type`：1 或 2（见 Step 1 判断规则）

**请求参数：**
```json
{
  "type": 2,
  "page": 1,
  "page_size": 10,
  "cid": "客户CID（有则传）",
  "customer_name": "客户名关键词（有则传）",
  "address": "地址关键词（有则传）",
  "keyword": "模糊搜索关键词（有则传，传了则不传 customer_name/address）",
  "create_time_start": "开始时间（有则传）",
  "create_time_end": "结束时间（有则传）"
}
```

> ⚠️ 选填字段无值时不传该字段。
> ⚠️ `keyword` 与 `address`/`customer_name` 不重复传，有 `keyword` 时优先用 `keyword`。

---

### Step 3：展示查询结果

**有记录时，按以下格式展示：**

```
📋 拜访打卡记录列表（共 {total} 条，第 {page}/{totalPage} 页）
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
您有权限的拜访打卡记录如下：
{序号}. 📍 {address}
   🏢 客户：{customer_name 或「未关联客户」}
   📅 打卡时间：{create_time}
   🔗 绑定状态：{is_bind_visit=1 ?「已绑定跟进记录 #base_info_visit_id」:「未绑定」}
---
```

**无记录时：**
```
暂无符合条件的拜访打卡记录。
```

**有更多数据时提示：**
```
💡 还有更多记录，说「下一页」或「查看第N页」可继续查询。
```

---

## 交互规范

1. **简洁**：每次回复控制合理长度，不冗长
2. **智能**：尽量从用户描述中提取查询条件，减少追问
3. **容错**：用户修改查询条件时灵活处理，重新执行 Step 3
4. **兜底**：任何环节出错给出明确提示和替代方案

---

## 异常处理

| 异常场景 | 处理策略 |
|---------|---------|
| 客户名未匹配 | 先搜「我相关」，再搜「长尾客户」，仍为空则提示确认归属，cid 置空继续查询 |
| MCP 调用失败 | 重试 1 次，仍失败则提示「查询失败，请稍后重试或前往磐石「跟进拜访管理 → 拜访打卡」查看」 |
| 权限不足 | 提示联系主销售确认 |

**降级链路：**
1. MCP 失败 → 重试 1 次
2. 重试失败 → 提供跳转链接：
   - PC：https://panshi.woa.com/sales-manager/tool/follow-up-record-management?guide-route-business-enumeration-type=crm-system
   - 小程序：磐石CRM → 跟进拜访管理 → 拜访打卡

---

## 参考文件（按需读取）

- **API_REFERENCE.md** — 接口参数规范、角色鉴权、查询接口详情

