Skip to content

开发资产:物业报修巡检系统

← 上一阶段:方案设计 | 下一阶段:系统落地 →


概述

在开发这个场景的过程中,我们沉淀了以下可复用的开发资产:

  1. Cursor Skill - 智能派单业务规则
  2. PROMPT 模板 - 工单状态流转逻辑生成
  3. 实施指南 - 如何快速复现这个场景

这些资产可以帮助快速复用这个场景的开发经验。


1. Cursor Skill:智能派单规则

使用场景

当你需要开发类似的"任务分配/派单"场景时,可以使用这个 Skill 让 AI 理解业务规则。

Skill 内容

markdown
# 智能派单业务规则

## 业务场景
物业报修、维修服务、上门服务等场景中,需要根据多个维度智能分配任务给最合适的工作人员。

## 核心业务规则

### 1. 派单维度

派单需要考虑以下维度:
- **类型匹配**:任务类型与工作人员技能匹配
- **地理位置**:优先分配给距离最近的工作人员
- **工作量均衡**:优先分配给当前工作量较少的工作人员
- **紧急程度**:紧急任务优先分配给在线且有时间的员工

### 2. 评分算法

```typescript
// 派单评分计算
function calculateDispatchScore(
  worker: Worker,
  task: Task,
  options: DispatchOptions
): number {
  // 1. 类型匹配度(0-100分)
  const typeMatchScore = worker.skills.includes(task.type) ? 100 : 0;
  
  // 2. 距离得分(0-100分,距离越近得分越高)
  const distance = calculateDistance(worker.location, task.location);
  const distanceScore = Math.max(0, 100 - (distance / 1000) * 10); // 每公里扣10分
  
  // 3. 工作量得分(0-100分,工作量越少得分越高)
  const currentWorkload = worker.currentTasks.length;
  const maxWorkload = worker.maxConcurrentTasks || 5;
  const workloadScore = Math.max(0, 100 - (currentWorkload / maxWorkload) * 100);
  
  // 4. 响应速度得分(0-100分,历史平均响应时间越短得分越高)
  const avgResponseTime = worker.avgResponseTime || 30; // 分钟
  const responseScore = Math.max(0, 100 - (avgResponseTime / 60) * 100);
  
  // 5. 加权计算总分
  const totalScore = 
    typeMatchScore * 0.3 +
    distanceScore * 0.3 +
    workloadScore * 0.2 +
    responseScore * 0.2;
  
  return totalScore;
}

3. 派单流程

typescript
async function dispatchTask(task: Task): Promise<Worker> {
  // 1. 筛选候选工作人员
  const candidates = await getAvailableWorkers({
    projectId: task.projectId,
    skills: [task.type],
    status: 'online'
  });
  
  // 2. 计算每个候选人的评分
  const scoredWorkers = candidates.map(worker => ({
    worker,
    score: calculateDispatchScore(worker, task, {})
  }));
  
  // 3. 按评分排序
  scoredWorkers.sort((a, b) => b.score - a.score);
  
  // 4. 选择评分最高的
  const selectedWorker = scoredWorkers[0].worker;
  
  // 5. 分配任务
  await assignTask(task.id, selectedWorker.id);
  
  // 6. 通知工作人员
  await notifyWorker(selectedWorker.id, {
    type: 'NEW_TASK',
    taskId: task.id,
    taskInfo: task
  });
  
  return selectedWorker;
}

4. 紧急任务处理

typescript
// 紧急任务优先处理
if (task.urgency === 'urgent') {
  // 紧急任务:优先分配给在线且有时间的员工
  const urgentCandidates = candidates.filter(worker => 
    worker.status === 'online' && 
    worker.currentTasks.length < worker.maxConcurrentTasks
  );
  
  if (urgentCandidates.length > 0) {
    // 从在线员工中选择评分最高的
    const urgentScored = urgentCandidates.map(worker => ({
      worker,
      score: calculateDispatchScore(worker, task, {})
    }));
    urgentScored.sort((a, b) => b.score - a.score);
    return urgentScored[0].worker;
  }
}

5. 超时处理

typescript
// 任务超时自动升级
async function checkTaskTimeout() {
  const overdueTasks = await getOverdueTasks();
  
  for (const task of overdueTasks) {
    if (task.urgency === 'urgent') {
      // 紧急任务超时:通知管理员
      await notifyAdmin({
        type: 'URGENT_TASK_TIMEOUT',
        taskId: task.id
      });
    } else {
      // 普通任务超时:自动升级为紧急
      await updateTask(task.id, { urgency: 'urgent' });
      await notifyWorker(task.assignedWorkerId, {
        type: 'TASK_UPGRADED',
        taskId: task.id
      });
    }
  }
}

数据模型

任务(Task)

typescript
interface Task {
  id: string;
  type: string;              // 任务类型
  urgency: 'urgent' | 'normal' | 'low';
  location: Location;         // 任务位置
  assignedWorkerId?: string;  // 分配的工作人员
  status: string;            // 任务状态
  createdAt: Date;
  deadline?: Date;           // 截止时间
}

工作人员(Worker)

typescript
interface Worker {
  id: string;
  name: string;
  skills: string[];          // 技能列表
  location: Location;        // 当前位置
  currentTasks: Task[];      // 当前任务列表
  maxConcurrentTasks: number; // 最大并发任务数
  avgResponseTime: number;   // 平均响应时间(分钟)
  status: 'online' | 'offline' | 'busy';
}

开发注意事项

  1. 评分权重可配置:不要硬编码权重,支持运营人员配置
  2. 距离计算优化:使用缓存或地理编码服务优化距离计算性能
  3. 实时位置更新:工作人员位置需要实时更新(GPS/手动更新)
  4. 任务状态同步:任务状态变更需要实时通知相关人员
  5. 超时监控:需要定时任务监控任务超时情况

相似场景复用

这个规则可以复用到:

  • 维修服务派单:家电维修、设备维修
  • 上门服务派单:家政服务、护理服务
  • 配送任务分配:外卖配送、物流配送
  • 巡检任务分配:安全巡检、设备巡检

### 如何使用这个 Skill

**步骤 1:保存为文件**

将上述内容保存为 `.cursorrules` 文件或在项目中创建 `docs/business-rules/smart-dispatch.md`

**步骤 2:在 Cursor 中引用**

在开发派单功能时,告诉 AI: "参考 smart-dispatch.md 中的业务规则, 实现智能派单逻辑"


**步骤 3:AI 会理解并生成代码**

AI 会基于这个规则生成准确的派单逻辑、评分算法等。

---

## 2. PROMPT 模板:工单状态流转逻辑

### 使用场景

当需要快速生成类似的"工单状态流转"代码时,使用这个 PROMPT 模板。

### PROMPT 模板

```text
你是一个业务逻辑开发专家。请根据以下业务规则,生成完整的工单状态流转逻辑代码。

## 业务场景
[描述你的具体场景,例如:物业报修工单状态流转]

## 工单状态定义
[列出所有状态,例如:
- 待受理
- 待派单
- 待接单
- 待到达
- 处理中
- 待确认
- 已完成
- 已拒绝
- 已取消
]

## 状态流转规则
[描述状态之间的流转规则,例如:
1. 待受理 → 待派单(客服受理)
2. 待派单 → 待接单(系统/手动派单)
3. 待接单 → 待到达(维修工接单)
4. 待到达 → 处理中(维修工到达现场)
5. 处理中 → 待确认(维修工完成维修)
6. 待确认 → 已完成(业主确认)
7. 待确认 → 待派单(业主不满意,重新派单)
]

## 权限控制
[描述不同角色的操作权限,例如:
- 客服:可以受理、派单
- 维修工:可以接单、到达、完成
- 业主:可以确认、评价
]

## 输出要求
1. TypeScript 代码实现
2. 包含完整的状态机逻辑
3. 包含权限验证
4. 包含状态变更通知
5. 包含单元测试用例
6. 包含注释说明

请生成代码。

使用示例

输入 PROMPT:

text
你是一个业务逻辑开发专家。请根据以下业务规则,生成完整的工单状态流转逻辑代码。

## 业务场景
物业报修工单状态流转

## 工单状态定义
- 待受理:业主已提交,等待客服受理
- 待派单:已受理,等待派单
- 待接单:已派单,等待维修工接单
- 待到达:已接单,维修工前往现场
- 处理中:维修工正在维修
- 待确认:维修完成,等待业主确认
- 已完成:业主确认,工单完成
- 已拒绝:工单被拒绝
- 已取消:工单被取消

## 状态流转规则
1. 待受理 → 待派单(客服受理)
2. 待派单 → 待接单(系统/手动派单)
3. 待接单 → 待到达(维修工接单)
4. 待到达 → 处理中(维修工到达现场)
5. 处理中 → 待确认(维修工完成维修)
6. 待确认 → 已完成(业主确认)
7. 待确认 → 待派单(业主不满意,重新派单)

## 权限控制
- 客服:可以受理、派单
- 维修工:可以接单、到达、完成
- 业主:可以确认、评价

## 输出要求
1. TypeScript 代码实现
2. 包含完整的状态机逻辑
3. 包含权限验证
4. 包含状态变更通知
5. 包含单元测试用例
6. 包含注释说明

请生成代码。

3. 实施指南

快速复现步骤

如果你需要在新项目中实现类似的场景,按照以下步骤:

步骤 1:需求确认(1 小时)

  • [ ] 确认任务类型和工作人员技能要求
  • [ ] 确认派单规则(评分权重、紧急处理)
  • [ ] 确认工单状态流转规则
  • [ ] 确认通知方式(微信/短信/系统内消息)

步骤 2:数据库设计(30 分钟)

sql
-- 工单表
CREATE TABLE repair_orders (
  id VARCHAR(50) PRIMARY KEY,
  order_no VARCHAR(50) UNIQUE,
  project_id VARCHAR(50),
  building VARCHAR(100),
  room VARCHAR(100),
  contact_name VARCHAR(100),
  contact_phone VARCHAR(20),
  repair_type VARCHAR(50),
  urgency VARCHAR(20),
  description TEXT,
  status VARCHAR(30),
  assigned_worker_id VARCHAR(50),
  accept_time TIMESTAMP,
  arrive_time TIMESTAMP,
  start_time TIMESTAMP,
  complete_time TIMESTAMP,
  confirm_time TIMESTAMP,
  created_at TIMESTAMP,
  updated_at TIMESTAMP
);

-- 工作人员表
CREATE TABLE workers (
  id VARCHAR(50) PRIMARY KEY,
  name VARCHAR(100),
  phone VARCHAR(20),
  skills JSON,  -- 技能列表
  location_lat DECIMAL(10,6),
  location_lng DECIMAL(10,6),
  max_concurrent_tasks INT DEFAULT 5,
  avg_response_time INT,  -- 平均响应时间(分钟)
  status VARCHAR(20),
  created_at TIMESTAMP,
  updated_at TIMESTAMP
);

步骤 3:开发派单逻辑(2 小时)

使用上述 Cursor Skill 和 PROMPT 模板,快速生成派单逻辑代码。

步骤 4:开发状态流转(2 小时)

使用 PROMPT 模板生成状态流转逻辑。

步骤 5:集成通知(1 小时)

  • 微信公众号模板消息
  • 企业微信机器人
  • 短信通知(备用)

步骤 6:测试(2 小时)

  • 派单逻辑测试
  • 状态流转测试
  • 通知功能测试
  • 边界值测试

总开发时间:约 8-10 小时

关键代码片段

后端 API 示例:

typescript
// POST /api/repair-orders/dispatch
router.post('/dispatch', async (req, res) => {
  const { orderId } = req.body;
  
  // 1. 获取工单信息
  const order = await getRepairOrder(orderId);
  
  // 2. 智能派单
  const worker = await dispatchTask(order);
  
  // 3. 更新工单状态
  await updateOrder(orderId, {
    status: '待接单',
    assignedWorkerId: worker.id
  });
  
  // 4. 通知维修工
  await notifyWorker(worker.id, {
    type: 'NEW_ORDER',
    orderId: order.id,
    orderInfo: order
  });
  
  res.json({ success: true, worker });
});

下一步

查看 系统落地 → 了解这个场景在完整系统中的实现。


相关链接

基于 AI 辅助开发,快速、灵活、可靠