规则引擎是一种软件工具,能够在规则库中存储、管理和自动执行规则以快速决策。机场地勤人员排班系统需要根据多种因素进行自动排班。
基于规则引擎实现规则可配置的机场地勤人员排班系统的功能设计如下:
-
规则库管理功能:建立、维护、更新规则库,包括规则库的导入、导出、备份、分享等。
-
规则制定功能:对规则库中的各项规则进行制定、修改、删除、查询、审核等,包括规则的名称、描述、策略、优先级、参考数据等信息。
-
数据输入功能:包括数据源的接口设计、数据采集、数据存储、数据整理、数据计算等,能够自动或手动地输入各类数据,包括人员、工作信息、航班信息、机场设施等。
-
规则匹配功能:将输入的数据与规则库中的规则进行匹配,进行规则引擎的计算和处理,产生优化的排班方案。
-
排班结果提供功能:提供人员列表、工作时间信息、任务分配等结果信息,同时可生成相关的报表、图表等,便于管理者进行跟踪和监控。
-
优化规则功能:对排班结果进行评估和反馈,不断优化规则库,以适应不断变化的环境和需求,保持最大的灵活性和效率。
-
系统配置功能:提供系统配置、安装、升级、维护等功能,保证系统稳定性和安全性。
通过以上功能设计,规则可配置的机场地勤人员排班系统能够实现自动化排班,减少排班成本和时间,提高效率和准确性,同时为机场地勤人员和航班安全保障提供了重要保障。
关键属性字段和基础数据如下:
关键属性字段:
- 规则名称
- 规则描述
- 规则类型(例如:任务分配规则、航班调度规则、人员轮班规则等)
- 规则的条件和动作(例如:条件是机场人员的数量和工作时间,动作是分配任务)
- 规则优先级
- 参考数据(例如:机场设施、航班信息、人员信息)
基础数据:
- 人员信息:包括地勤人员的姓名、岗位、技能、工作经验等信息。
- 航班信息:包括航班号、起降时间、机型等信息。
- 机场设施信息:包括机场停车场、航站楼、跑道、机位等设施的信息。
- 工作任务信息:包括地勤人员需要完成的各项任务信息。
- 工作时间信息:包括地勤人员的工作起止时间、轮休时间等信息。
- 规则数据:包括规则库中的各项规则和参考数据。
以下是一个实际的场景,以航班地面服务为例:
关键属性字段:
- 规则名称:航班对接任务分配规则
- 规则描述:基于航班信息和机场设施情况,将该航班的对接任务分配给相应的地勤人员。
- 规则类型:任务分配规则
- 规则的条件和动作:当某个航班到达机场时,根据机场停车场、航站楼、机位等信息,以及地勤人员的技能情况,将适合该任务的地勤人员分配到该航班的对接任务中。
- 规则优先级:高
- 参考数据:机场设施信息、航班信息、人员信息
基础数据:
- 人员信息:包括地勤人员的姓名、岗位、技能、工作经验等信息。
- 航班信息:包括航班号、起降时间、机型、停靠机位等信息。
- 机场设施信息:包括机场停车场、航站楼、跑道、机位等设施的信息。
- 工作任务信息:包括地勤人员需要完成的各项任务信息,如驾驶飞机牵引车、协助开舱门等。
- 工作时间信息:包括地勤人员的工作起止时间、轮休时间等信息。
- 规则数据:包括规则库中的各项规则和参考数据,比如地勤人员与对接任务之间的技能对应表、对接任务的时限和要求等。
以下是一个可以基于上述设计提供的具体模拟数据:
航班信息:
航班号:CA123 起降时间:2021-10-01 12:00:00 机型:B777 停靠机位:A101
人员信息:
姓名:张三 岗位:地勤一级 技能:驾驶飞机牵引车 工作经验:3年
姓名:李四 岗位:地勤二级 技能:协助开舱门 工作经验:2年
规则信息:
规则名称:航班对接任务分配规则 规则描述:基于航班信息和机场设施情况,将该航班的对接任务分配给相应的地勤人员。 规则类型:任务分配规则 规则的条件和动作:当某个航班到达机场时,根据机场停车场、航站楼、机位等信息,以及地勤人员的技能情况,将适合该任务的地勤人员分配到该航班的对接任务中。 规则优先级:高 参考数据:机场设施信息、航班信息、人员信息
分配结果:
当航班CA123到达机场时,系统将根据机场设施信息,航班信息和人员信息,以及规则库中的分配规则,自动为其分配地勤任务。根据分配规则,张三的技能符合驾驶飞机牵引车的要求,而李四的技能符合协助开舱门的要求。同时,系统还将考虑到地勤人员的工作经验和工作时间,选择合适的人员执行任务。最终的分配结果为:
地勤人员:张三 分配任务:驾驶飞机牵引车
地勤人员:李四 分配任务:协助开舱门
这样就成功地将地勤任务分配给了合适的地勤人员,保证了航班的顺利对接。
基于drool的规则表达式和编码逻辑
规则表达式:
rule "航班对接任务分配规则"
when
$flight: Flight($flightNo: flightNo, $departureTime: departureTime, $aircraftModel: aircraftModel, $parkingPosition: parkingPosition)
// 获取停机位信息
$parkingInfo: ParkingInfo(parkingPosition == $parkingPosition)
// 获取可用的地勤人员列表
$staffs: List<Staff>(size > 0) from accumulate (
$staff: Staff(skill in ("驾驶飞机牵引车", "协助开舱门"), experienceYears > 0, status == "ready", assignedFlightNo == null);
collectList($staff)
)
then
// 按照工作经验和工作时间对地勤人员列表进行排序
$staffs.sort((s1, s2) -> {
int result = s2.getExperienceYears() - s1.getExperienceYears();
if (result != 0) {
return result;
} else {
return s1.getWorkTime().compareTo(s2.getWorkTime());
}
});
// 选择最佳的地勤人员执行任务,并更新其任务状态和航班任务信息
Staff bestStaff = $staffs.get(0);
bestStaff.setStatus("working");
bestStaff.setAssignedFlightNo($flightNo);
FlightTask task = new FlightTask("对接任务", $flightNo, $departureTime);
bestStaff.setAssignedTask(task);
// 通知调度员任务分配情况
System.out.println("任务分配完成,航班号为:" + $flightNo + ",地勤人员为:" + bestStaff.getName());
end
编码逻辑:
在 Java 代码中,我们可以使用规则的名称、条件、动作、优先级等信息预先定义出一个规则类。例如,上述规则可以定义为如下类:
public class FlightDockingTaskRule {
public static final String RULE_NAME = "航班对接任务分配规则";
public static final String RULE_DESCRIPTION = "基于航班信息和机场设施情况,将该航班的对接任务分配给相应的地勤人员。";
public static final int RULE_PRIORITY = 1;
public static final String RULE_CONDITION = "$flight: Flight($flightNo: flightNo, $departureTime: departureTime, $aircraftModel: aircraftModel, $parkingPosition: parkingPosition)\n"
+ "$parkingInfo: ParkingInfo(parkingPosition == $parkingPosition)\n"
+ "$staffs: List<Staff>(size > 0) from accumulate (\n"
+ " $staff: Staff(skill in (\"驾驶飞机牵引车\", \"协助开舱门\"), experienceYears > 0, status == \"ready\", assignedFlightNo == null);\n"
+ " collectList($staff)\n"
+ ")";
public static final String RULE_ACTION = "$staffs.sort((s1, s2) -> {\n"
+ " int result = s2.getExperienceYears() - s1.getExperienceYears();\n"
+ " if (result != 0) {\n"
+ " return result;\n"
+ " } else {\n"
+ " return s1.getWorkTime().compareTo(s2.getWorkTime());\n"
+ " }\n"
+ "});\n"
+ "Staff bestStaff = $staffs.get(0);\n"
+ "bestStaff.setStatus(\"working\");\n"
+ "bestStaff.setAssignedFlightNo($flightNo);\n"
+ "FlightTask task = new FlightTask(\"对接任务\", $flightNo, $departureTime);\n"
+ "bestStaff.setAssignedTask(task);\n"
+ "System.out.println(\"任务分配完成,航班号为:\" + $flightNo + \",地勤人员为:\" + bestStaff.getName());";
public static Rule buildRule() {
return new RuleBuilder()
.name(RULE_NAME)
.description(RULE_DESCRIPTION)
.priority(RULE_PRIORITY)
.when(RULE_CONDITION)
.then(RULE_ACTION)
.build();
}
}
然后,在实际业务中,我们可以将此规则放入规则库中,并在需要调用的时候执行相应的规则引擎。例如:
// 创建 KieSession,并将规则库中的规则加载进来
KieSession kieSession = createKieSession();
kieSession.insert(Flight flight); // 将航班信息插入到规则引擎中
kieSession.fireAllRules(); // 执行规则引擎,进行任务分配