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. 调度任务 (DispatchTask)
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)
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. 创建调度任务
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. 自动派单
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. 手动派单
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. 机手确认接单
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. 机手拒绝接单
POST /api/dispatch-tasks/{taskId}/reject
Request:
{
operatorId: string,
reason: string
}
Response:
{
code: 0,
message: "success",
data: {
taskId: string,
status: "rejected",
needRedispatch: true
}
}6. 查询调度任务
GET /api/dispatch-tasks?status={status}&date={date}
Response:
{
code: 0,
message: "success",
data: {
total: number,
list: DispatchTask[]
}
}7. 批量调度
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. 智能派单算法
算法说明:
- 综合考虑距离、成本、公平性、技能匹配
- 使用加权评分模型
- 支持多种派单策略
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. 批量调度优化
算法说明:
- 使用贪心算法或遗传算法
- 目标: 最小化总距离和总成本
- 约束: 时间约束、资源约束
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. 冲突检测
技术方案:
- 时间冲突检测
- 资源冲突检测
- 提供解决方案
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