Skip to content

SCHED-001: 作业调度

优先级: 🔴 高 (17.0分) | 实施周期: 2-3周

客户原话

"我们合作社有30台农机,每天接到几十个订单,不知道该派哪台机器去哪个地块。有时候派远了,机器空跑几十公里,油费都不够。有时候派的机器不合适,耕地的机器派去收割,到了现场才发现不对。机手也有意见,说派活不公平,有的人忙死,有的人闲着。想要个系统能自动派单,根据机器位置、机器类型、机手技能这些,自动匹配最合适的机器和机手,既省油又高效。"

—— 某农机合作社调度员

客户类型需求差异

农机合作社(10-50台,本地作业)

需求程度: ⭐⭐⭐⭐⭐ 必需

核心需求:

  • 订单自动分配
  • 就近派单,减少空驶
  • 机器类型匹配
  • 机手技能匹配
  • 派单公平性

关键功能:

  • 智能派单算法
  • 距离计算
  • 机器状态查询
  • 机手接单确认
  • 派单记录查询

农机服务站(跨区作业)

需求程度: ⭐⭐⭐⭐⭐ 必需

核心需求:

  • 跨区域订单调度
  • 转场路线规划
  • 多地协同调度
  • 订单优先级管理
  • 调度数据分析

关键功能:

  • 跨区域派单
  • 路线规划
  • 多地协同
  • 优先级排序
  • 调度报表

大型农场(自有机队)

需求程度: ⭐⭐⭐⭐⭐ 必需

核心需求:

  • 机队统一调度
  • 作业计划排程
  • 资源优化配置
  • 调度效率分析
  • 与生产计划集成

关键功能:

  • 机队调度
  • 计划排程
  • 资源优化
  • 效率分析
  • 系统集成

农机租赁公司(租赁+作业)

需求程度: ⭐⭐⭐⭐ 重要

核心需求:

  • 租赁设备调度
  • 租赁方和承租方协同
  • 设备利用率优化
  • 调度数据作为结算依据
  • 调度记录可追溯

关键功能:

  • 设备调度
  • 多方协同
  • 利用率优化
  • 数据导出
  • 记录追溯

业务场景描述

典型场景

场景1: 新订单自动派单

  • 客户下单:耕地作业,50亩,明天上午
  • 系统自动筛选:可用的耕地机
  • 计算距离:选择距离最近的3台机器
  • 检查状态:机器空闲,机手有空
  • 自动派单:派给距离最近的机器
  • 机手确认:收到通知,确认接单

场景2: 手动调整派单

  • 系统自动派单后,调度员查看
  • 发现机手A连续作业3天,比较累
  • 手动调整:改派给机手B
  • 系统重新计算:B距离稍远,但可接受
  • 通知机手:A取消派单,B接收新单
  • 记录调整原因:平衡工作量

场景3: 紧急订单插队

  • 接到紧急订单:暴雨前抢收
  • 设置高优先级:紧急订单
  • 系统重新调度:暂停低优先级订单
  • 派最近的收割机:立即出发
  • 通知原订单客户:延后作业
  • 完成紧急订单后:恢复原计划

场景4: 多订单批量调度

  • 早上接到20个订单
  • 系统批量调度:综合考虑距离、时间、优先级
  • 生成调度方案:每台机器的作业路线
  • 调度员审核:微调个别订单
  • 一键下发:所有机手收到任务
  • 开始作业:按计划执行

场景5: 调度冲突处理

  • 两个订单时间冲突
  • 系统提示:机器A同时被派两个单
  • 调度员处理:调整其中一个订单时间
  • 或者改派:派另一台机器
  • 通知客户:协商调整时间
  • 重新派单:冲突解决

核心痛点

  1. 派单效率低 - 人工派单慢,容易出错
  2. 派单不合理 - 距离远,机器不匹配,浪费资源
  3. 派单不公平 - 机手工作量不均,影响积极性
  4. 调度冲突多 - 时间冲突,资源冲突,难以协调
  5. 调度数据缺失 - 无法分析调度效率,优化调度策略

业务流程图

当前人工流程

系统化流程

用户故事

故事1: 调度员快速派单

作为 调度员 我想要 系统自动派单 以便 提高派单效率,减少人工工作

验收标准:

  • 新订单自动触发派单
  • 系统自动筛选可用机器
  • 计算距离和成本
  • 推荐最优派单方案
  • 一键确认派单
  • 机手立即收到通知

故事2: 机手接收派单

作为 机手 我想要 在手机上接收派单 以便 及时了解任务,准备作业

验收标准:

  • 收到派单通知
  • 查看订单详情(地块、面积、时间)
  • 查看地块位置和导航
  • 确认或拒绝派单
  • 拒绝需要说明原因

故事3: 调度员手动调整

作为 调度员 我想要 手动调整派单 以便 处理特殊情况,优化调度

验收标准:

  • 查看系统推荐的派单方案
  • 可以手动改派其他机器
  • 系统提示改派的影响(距离、成本)
  • 记录调整原因
  • 通知相关机手

故事4: 系统处理调度冲突

作为 系统 我想要 自动检测调度冲突 以便 避免重复派单,确保调度合理

验收标准:

  • 检测时间冲突
  • 检测资源冲突
  • 提示调度员
  • 提供解决方案
  • 记录冲突处理

故事5: 管理员分析调度数据

作为 管理员 我想要 分析调度数据 以便 优化调度策略,提高效率

验收标准:

  • 查看调度统计报表
  • 分析派单合理性
  • 分析机器利用率
  • 分析空驶率
  • 识别优化空间

数据模型

核心实体

1. 调度任务 (DispatchTask)

typescript
interface DispatchTask {
  id: string
  taskNo: string
  orderId: string
  
  customerId: string
  customerName: string
  fieldId: string
  fieldName: string
  fieldLocation: Coordinate
  area: number
  operationType: string
  
  requiredStartTime: Date
  requiredEndTime: Date
  priority: 'urgent' | 'high' | 'normal' | 'low'
  
  dispatchedMachineId?: string
  dispatchedOperatorId?: string
  dispatchedAt?: Date
  dispatchedBy: string
  dispatchMethod: 'auto' | 'manual'
  
  distance?: number
  estimatedTravelTime?: number
  estimatedFuelCost?: number
  estimatedDuration?: number
  
  status: 'pending' | 'dispatched' | 'accepted' | 'rejected' | 'completed' | 'cancelled'
  
  operatorAccepted: boolean
  operatorAcceptedAt?: Date
  rejectReason?: string
  
  adjustments: DispatchAdjustment[]
  
  createdAt: Date
  updatedAt: Date
}

2. 调度规则 (DispatchRule)

typescript
interface DispatchRule {
  id: string
  name: string
  priority: number
  
  conditions: {
    operationType?: string[]
    priority?: string[]
    timeRange?: {
      start: string
      end: string
    }
    region?: string[]
  }
  
  strategy: {
    type: 'nearest' | 'balanced' | 'skilled' | 'custom'
    maxDistance?: number
    maxTravelTime?: number
    preferredOperators?: string[]
    excludedOperators?: string[]
    balanceWeight?: number
  }
  
  isActive: boolean
  effectiveDate: Date
  expiryDate?: Date
  
  createdAt: Date
  updatedAt: Date
}

接口设计

1. 创建调度任务

typescript
POST /api/dispatch-tasks

Request:
{
  orderId: string,
  priority: string,
  requiredStartTime: Date
}

Response:
{
  code: 0,
  message: "success",
  data: {
    taskId: string,
    taskNo: string,
    recommendations: [
      {
        machineId: string,
        machineName: string,
        operatorName: string,
        distance: number,
        estimatedCost: number,
        score: number
      }
    ]
  }
}

2. 自动派单

typescript
POST /api/dispatch-tasks/{taskId}/auto-dispatch

Request:
{
  ruleId?: string
}

Response:
{
  code: 0,
  message: "success",
  data: {
    taskId: string,
    dispatchedMachineId: string,
    dispatchedOperatorId: string,
    distance: number,
    estimatedCost: number
  }
}

3. 手动派单

typescript
POST /api/dispatch-tasks/{taskId}/manual-dispatch

Request:
{
  machineId: string,
  operatorId: string,
  reason?: string
}

Response:
{
  code: 0,
  message: "success",
  data: {
    taskId: string,
    status: "dispatched"
  }
}

4. 机手确认接单

typescript
POST /api/dispatch-tasks/{taskId}/accept

Request:
{
  operatorId: string
}

Response:
{
  code: 0,
  message: "success",
  data: {
    taskId: string,
    status: "accepted",
    navigation: {
      startLocation: Coordinate,
      endLocation: Coordinate,
      distance: number,
      duration: number,
      route: Coordinate[]
    }
  }
}

5. 机手拒绝接单

typescript
POST /api/dispatch-tasks/{taskId}/reject

Request:
{
  operatorId: string,
  reason: string
}

Response:
{
  code: 0,
  message: "success",
  data: {
    taskId: string,
    status: "rejected",
    needRedispatch: true
  }
}

6. 查询调度任务

typescript
GET /api/dispatch-tasks?status={status}&date={date}

Response:
{
  code: 0,
  message: "success",
  data: {
    total: number,
    list: DispatchTask[]
  }
}

7. 批量调度

typescript
POST /api/dispatch-tasks/batch-dispatch

Request:
{
  taskIds: string[],
  strategy: 'nearest' | 'balanced' | 'optimal'
}

Response:
{
  code: 0,
  message: "success",
  data: {
    plan: {
      totalTasks: number,
      totalDistance: number,
      totalCost: number,
      allocations: [
        {
          machineId: string,
          tasks: string[],
          totalDistance: number
        }
      ]
    }
  }
}

关键业务规则

1. 任务编号规则

  • 格式: DT-YYYYMMDD-XXXX
  • 每天从0001开始编号

2. 自动派单规则

  • 优先级: 紧急 > 高 > 普通 > 低
  • 距离: 优先派距离最近的机器
  • 类型: 机器类型必须匹配作业类型
  • 状态: 机器和机手必须空闲
  • 技能: 机手必须具备相应技能

3. 派单冲突规则

  • 时间冲突: 同一机器同一时间只能派一个单
  • 资源冲突: 同一机手同一时间只能接一个单
  • 冲突检测: 派单前自动检测冲突
  • 冲突处理: 提示调度员,提供解决方案

4. 派单公平性规则

  • 工作量平衡: 优先派给工作量少的机手
  • 收入平衡: 考虑机手收入情况
  • 技能匹配: 优先派给技能匹配的机手
  • 距离优先: 在公平的前提下,优先就近派单

5. 派单调整规则

  • 调整原因: 必须记录调整原因
  • 通知机手: 调整后立即通知相关机手
  • 影响评估: 评估调整对成本和效率的影响
  • 调整限制: 已接单的任务调整需机手同意

技术实现要点

1. 智能派单算法

算法说明:

  • 综合考虑距离、成本、公平性、技能匹配
  • 使用加权评分模型
  • 支持多种派单策略
typescript
function calculateDispatchScore(
  task: DispatchTask,
  machine: Machine,
  operator: Operator
): number {
  // 距离评分 (0-100)
  const distanceScore = calculateDistanceScore(task.fieldLocation, machine.location);
  
  // 技能匹配评分 (0-100)
  const skillScore = calculateSkillScore(task.operationType, operator.skills);
  
  // 工作量平衡评分 (0-100)
  const balanceScore = calculateBalanceScore(operator.workload);
  
  // 综合评分
  const totalScore = 
    distanceScore * 0.4 +
    skillScore * 0.3 +
    balanceScore * 0.3;
  
  return totalScore;
}

function calculateDistanceScore(fieldLocation: Coordinate, machineLocation: Coordinate): number {
  const distance = calculateDistance(fieldLocation, machineLocation);
  
  // 距离越近,评分越高
  if (distance < 5) return 100;
  if (distance < 10) return 90;
  if (distance < 20) return 80;
  if (distance < 30) return 70;
  if (distance < 50) return 60;
  return 50;
}

2. 批量调度优化

算法说明:

  • 使用贪心算法或遗传算法
  • 目标: 最小化总距离和总成本
  • 约束: 时间约束、资源约束
typescript
function batchDispatch(tasks: DispatchTask[], machines: Machine[]): DispatchPlan {
  // 按优先级和时间排序任务
  const sortedTasks = tasks.sort((a, b) => {
    if (a.priority !== b.priority) {
      return priorityValue(a.priority) - priorityValue(b.priority);
    }
    return a.requiredStartTime.getTime() - b.requiredStartTime.getTime();
  });
  
  const plan: DispatchPlan = {
    allocations: []
  };
  
  // 贪心算法:逐个分配任务
  for (const task of sortedTasks) {
    // 找到最优机器
    const bestMatch = findBestMachine(task, machines, plan);
    
    if (bestMatch) {
      // 分配任务
      allocateTask(plan, task, bestMatch.machine);
    }
  }
  
  return plan;
}

3. 冲突检测

技术方案:

  • 时间冲突检测
  • 资源冲突检测
  • 提供解决方案
typescript
function detectConflicts(task: DispatchTask, existingTasks: DispatchTask[]): Conflict[] {
  const conflicts: Conflict[] = [];
  
  for (const existing of existingTasks) {
    // 检测时间冲突
    if (isTimeConflict(task, existing)) {
      conflicts.push({
        type: 'time',
        task1: task,
        task2: existing,
        solutions: [
          { type: 'reschedule', description: '调整任务时间' },
          { type: 'reassign', description: '改派其他机器' }
        ]
      });
    }
    
    // 检测资源冲突
    if (isResourceConflict(task, existing)) {
      conflicts.push({
        type: 'resource',
        task1: task,
        task2: existing,
        solutions: [
          { type: 'reassign', description: '改派其他机器' }
        ]
      });
    }
  }
  
  return conflicts;
}

实施建议

第一阶段: 基础功能(1周)

  • [ ] 调度任务管理
  • [ ] 基础派单功能
  • [ ] 机手接单功能
  • [ ] 派单记录查询

第二阶段: 智能调度(1周)

  • [ ] 智能派单算法
  • [ ] 批量调度功能
  • [ ] 冲突检测
  • [ ] 调度规则配置

第三阶段: 优化完善(持续)

  • [ ] 调度效率分析
  • [ ] 派单策略优化
  • [ ] 用户反馈收集
  • [ ] 持续改进

成功案例

案例1: 某农机合作社智能调度系统

实施前:

  • 人工派单,效率低
  • 派单不合理,空驶率高
  • 机手工作量不均

实施后:

  • 自动派单,效率提升80%
  • 空驶率降低40%
  • 机手工作量均衡

关键数据:

  • 派单时间: 从30分钟降到3分钟
  • 空驶率: 从25%降到15%
  • 机手满意度: 从60分提升到85分

案例2: 某大型农场机队调度优化

实施前:

  • 30台机器,调度混乱
  • 机器利用率低
  • 作业成本高

实施后:

  • 统一调度,井然有序
  • 机器利用率提升30%
  • 作业成本降低20%

关键数据:

  • 机器利用率: 从60%提升到78%
  • 年度节省成本: 80万元

案例3: 某农机服务站跨区调度系统

实施前:

  • 跨区作业,调度困难
  • 转场成本高
  • 订单响应慢

实施后:

  • 跨区调度顺畅
  • 转场成本降低
  • 订单响应快

关键数据:

  • 订单响应时间: 从2小时降到30分钟
  • 转场成本: 降低35%
  • 订单完成率: 提升25%

相关场景

  • OPER-001 订单管理: 订单创建后触发调度
  • SCHED-002 跨区调度: 跨区域订单调度
  • SCHED-003 应急调度: 紧急订单调度
  • SCHED-004 机手调度: 机手排班和调度

常见问题

Q1: 自动派单会不会不合理?

A: 系统综合考虑距离、技能、工作量等多个因素,派单比人工更合理。调度员可以手动调整。

Q2: 机手可以拒绝派单吗?

A: 可以,但需要说明原因。频繁拒单会影响机手评分。

Q3: 如何保证派单公平?

A: 系统自动平衡机手工作量和收入,确保派单公平。

Q4: 紧急订单如何处理?

A: 设置高优先级,系统自动优先调度。可以暂停低优先级订单。

Q5: 调度冲突如何解决?

A: 系统自动检测冲突,提供解决方案。调度员可以手动调整。


本场景文档版本: v2.0 | 最后更新: 2024-03-07

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