Commit a4a024c2b2ac72dc4ab786976cf4634365dfc88e

Authored by 徐烜
1 parent 50daf0ec

update

src/main/java/com/bsth/service/schedule/rules/MyDroolsConfiguration.java
... ... @@ -55,6 +55,9 @@ public class MyDroolsConfiguration {
55 55 kfs.write("src/main/resources/HelloWorld.drl", kieServices.getResources()
56 56 .newInputStreamResource(this.getClass().getResourceAsStream(
57 57 "/rules/HelloWorld.drl"), "UTF-8"));
  58 + kfs.write("src/main/resources/shiftloop.drl", kieServices.getResources()
  59 + .newInputStreamResource(this.getClass().getResourceAsStream(
  60 + "/rules/shiftloop.drl"), "UTF-8"));
58 61 // TODO:还有其他drl....
59 62  
60 63 // 4、创建KieBuilder,使用KieFileSystem构建
... ...
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleCalcuParam_input.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.shiftloop;
  2 +
  3 +import org.joda.time.DateTime;
  4 +
  5 +/**
  6 + * 排班计算参数_输入。
  7 + */
  8 +public class ScheduleCalcuParam_input {
  9 + /** 开始计算日期 */
  10 + private DateTime fromDate;
  11 + /** 结束计算日期 */
  12 + private DateTime toDate;
  13 + /** 时刻表id */
  14 + private Long ttinfoId;
  15 +
  16 + public DateTime getFromDate() {
  17 + return fromDate;
  18 + }
  19 +
  20 + public void setFromDate(DateTime fromDate) {
  21 + this.fromDate = fromDate;
  22 + }
  23 +
  24 + public DateTime getToDate() {
  25 + return toDate;
  26 + }
  27 +
  28 + public void setToDate(DateTime toDate) {
  29 + this.toDate = toDate;
  30 + }
  31 +
  32 + public Long getTtinfoId() {
  33 + return ttinfoId;
  34 + }
  35 +
  36 + public void setTtinfoId(Long ttinfoId) {
  37 + this.ttinfoId = ttinfoId;
  38 + }
  39 +}
... ...
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleResult_output.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.shiftloop;
  2 +
  3 +import org.joda.time.DateTime;
  4 +
  5 +/**
  6 + * 规则计算出的结果_输出。
  7 + */
  8 +public class ScheduleResult_output {
  9 + /** 具体日期 */
  10 + private DateTime sd;
  11 + /** 用的是哪一组rule */
  12 + private Long ruleId;
  13 + /** 路牌id */
  14 + private Long guideboardId;
  15 + /** 人员配置id */
  16 + private Long employeeConfigId;
  17 + /** 车辆配置id */
  18 + private Long carConfigId;
  19 +
  20 + public DateTime getSd() {
  21 + return sd;
  22 + }
  23 +
  24 + public void setSd(DateTime sd) {
  25 + this.sd = sd;
  26 + }
  27 +
  28 + public Long getGuideboardId() {
  29 + return guideboardId;
  30 + }
  31 +
  32 + public void setGuideboardId(Long guideboardId) {
  33 + this.guideboardId = guideboardId;
  34 + }
  35 +
  36 + public Long getEmployeeConfigId() {
  37 + return employeeConfigId;
  38 + }
  39 +
  40 + public void setEmployeeConfigId(Long employeeConfigId) {
  41 + this.employeeConfigId = employeeConfigId;
  42 + }
  43 +
  44 + public Long getCarConfigId() {
  45 + return carConfigId;
  46 + }
  47 +
  48 + public void setCarConfigId(Long carConfigId) {
  49 + this.carConfigId = carConfigId;
  50 + }
  51 +
  52 + public Long getRuleId() {
  53 + return ruleId;
  54 + }
  55 +
  56 + public void setRuleId(Long ruleId) {
  57 + this.ruleId = ruleId;
  58 + }
  59 +
  60 +}
... ...
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleResults_output.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.shiftloop;
  2 +
  3 +import org.apache.commons.lang3.StringUtils;
  4 +
  5 +import java.util.*;
  6 +
  7 +/**
  8 + * 输出结果集合。
  9 + */
  10 +public class ScheduleResults_output {
  11 + /** 输出列表 */
  12 + private List<ScheduleResult_output> results = new ArrayList<>();
  13 +
  14 + public List<ScheduleResult_output> getResults() {
  15 + return results;
  16 + }
  17 +
  18 + public void setResults(List<ScheduleResult_output> results) {
  19 + this.results = results;
  20 + }
  21 +
  22 + /**
  23 + * 输出每个规则排出来的路牌id列表
  24 + * @return
  25 + */
  26 + public String showGuideboardDesc1() {
  27 + StringBuilder stringBuilder = new StringBuilder();
  28 + Map<Long, List<ScheduleResult_output>> groupRuleIdGuideBoardMap = new HashMap<>();
  29 + for (ScheduleResult_output s : results) {
  30 + if (groupRuleIdGuideBoardMap.get(s.getRuleId()) == null) {
  31 + groupRuleIdGuideBoardMap.put(s.getRuleId(), new ArrayList<ScheduleResult_output>());
  32 + }
  33 + groupRuleIdGuideBoardMap.get(s.getRuleId()).add(s);
  34 + }
  35 +
  36 + for (Long ruleId : groupRuleIdGuideBoardMap.keySet()) {
  37 + Collections.sort(groupRuleIdGuideBoardMap.get(ruleId), new Comparator<ScheduleResult_output>() {
  38 + @Override
  39 + public int compare(ScheduleResult_output o1, ScheduleResult_output o2) {
  40 + return o1.getSd().compareTo(o2.getSd());
  41 + }
  42 + });
  43 +
  44 + List<Long> gbids = new ArrayList<>();
  45 + List<Long> ecids = new ArrayList<>();
  46 + for (ScheduleResult_output so : groupRuleIdGuideBoardMap.get(ruleId)) {
  47 + gbids.add(so.getGuideboardId());
  48 + ecids.add(so.getEmployeeConfigId());
  49 + }
  50 +
  51 + stringBuilder.append(
  52 + "规则id=" + ruleId + ", " +
  53 + "路牌列表=" + StringUtils.join(gbids, ",") + "\n");
  54 + stringBuilder.append(
  55 + "规则id=" + ruleId + ", " +
  56 + "人员配置列表=" + StringUtils.join(ecids, ",") + "\n");
  57 + }
  58 +
  59 + return stringBuilder.toString();
  60 + }
  61 +
  62 + // TODO:人员输出
  63 +}
... ...
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleRule_input.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.shiftloop;
  2 +
  3 +import org.joda.time.DateTime;
  4 +
  5 +import java.util.ArrayList;
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * 排班规则_输入。
  10 + */
  11 +public class ScheduleRule_input {
  12 + /** 规则Id */
  13 + private Long ruleId;
  14 + /** 规则启用日期 */
  15 + private DateTime qyrq;
  16 +
  17 + /** 路牌范围 */
  18 + private List<Long> guideboardIds = new ArrayList<>();
  19 + /** 起始路牌下标 */
  20 + private int startGbdIndex;
  21 +
  22 + /** 人员范围 */
  23 + private List<Long> employeeConfigIds = new ArrayList<>();
  24 + /** 起始人员下标 */
  25 + private int startEIndex;
  26 +
  27 + /** 车辆配置id */
  28 + private Long carConfigId;
  29 +
  30 + // TODO:车辆翻班暂时不考虑进去
  31 +
  32 +
  33 + public Long getRuleId() {
  34 + return ruleId;
  35 + }
  36 +
  37 + public void setRuleId(Long ruleId) {
  38 + this.ruleId = ruleId;
  39 + }
  40 +
  41 + public DateTime getQyrq() {
  42 + return qyrq;
  43 + }
  44 +
  45 + public void setQyrq(DateTime qyrq) {
  46 + this.qyrq = qyrq;
  47 + }
  48 +
  49 + public List<Long> getGuideboardIds() {
  50 + return guideboardIds;
  51 + }
  52 +
  53 + public void setGuideboardIds(List<Long> guideboardIds) {
  54 + this.guideboardIds = guideboardIds;
  55 + }
  56 +
  57 + public int getStartGbdIndex() {
  58 + return startGbdIndex;
  59 + }
  60 +
  61 + public void setStartGbdIndex(int startGbdIndex) {
  62 + this.startGbdIndex = startGbdIndex;
  63 + }
  64 +
  65 + public List<Long> getEmployeeConfigIds() {
  66 + return employeeConfigIds;
  67 + }
  68 +
  69 + public void setEmployeeConfigIds(List<Long> employeeConfigIds) {
  70 + this.employeeConfigIds = employeeConfigIds;
  71 + }
  72 +
  73 + public int getStartEIndex() {
  74 + return startEIndex;
  75 + }
  76 +
  77 + public void setStartEIndex(int startEIndex) {
  78 + this.startEIndex = startEIndex;
  79 + }
  80 +
  81 + public Long getCarConfigId() {
  82 + return carConfigId;
  83 + }
  84 +
  85 + public void setCarConfigId(Long carConfigId) {
  86 + this.carConfigId = carConfigId;
  87 + }
  88 +}
... ...
src/main/java/com/bsth/service/schedule/rules/shiftloop/readme.txt 0 → 100644
  1 +翻班循环规则
0 2 \ No newline at end of file
... ...
src/main/resources/rules/shiftloop.drl 0 → 100644
  1 +package com.bsth.service.schedule;
  2 +
  3 +import org.joda.time.*;
  4 +import java.util.*;
  5 +
  6 +import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;
  7 +import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;
  8 +import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;
  9 +import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
  10 +
  11 +/*
  12 + TODO:规则说明,以后待说明
  13 +*/
  14 +
  15 +//------------------------- 第一阶段、计算规则准备数据(天数) ----------------------------//
  16 +
  17 +declare Calcu_days_result
  18 + ruleId : Long // 规则Id
  19 + qyrq_days : Integer // 开始日期离启用日期的天数
  20 + sdays : Integer // 总共需要排班的天数
  21 + calcu_start_date : DateTime // 开始计算日期
  22 + calcu_end_date : DateTime // 结束计算日期
  23 +end
  24 +
  25 +/*
  26 + 计算启用日期,开始计算日期,结束计算日期,相差天数
  27 + 1、规则启用日期小于开始计算日期
  28 + 2、规则启用日期大于等于开始日期,小于等于结束日期
  29 +*/
  30 +rule "calcu_days_1"
  31 + salience 100
  32 + when
  33 + ScheduleCalcuParam_input($fromDate : fromDate, $toDate : toDate, $fromDate.isBefore($toDate))
  34 + ScheduleRule_input($ruleId : ruleId, $qyrq : qyrq)
  35 + eval($qyrq.isBefore($fromDate))
  36 + then
  37 + // 构造Calcu_days_result对象,进行下一阶段计算
  38 + Calcu_days_result cdr = new Calcu_days_result();
  39 + cdr.setRuleId($ruleId);
  40 + Period p1 = new Period($qyrq, $fromDate, PeriodType.days());
  41 + cdr.setQyrq_days(p1.getDays());
  42 + Period p2 = new Period($fromDate, $toDate, PeriodType.days());
  43 + cdr.setSdays(p2.getDays());
  44 + cdr.setCalcu_start_date($fromDate);
  45 + cdr.setCalcu_end_date($toDate);
  46 +
  47 + System.out.println("qyrq_days=" + p1.getDays());
  48 + System.out.println("sdays=" + p2.getDays());
  49 +
  50 + insert(cdr); // 插入fact数据,进入下一个阶段
  51 +end
  52 +
  53 +rule "calcu_days_2"
  54 + salience 100
  55 + when
  56 + ScheduleCalcuParam_input($fromDate : fromDate, $toDate : toDate, $fromDate.isBefore($toDate))
  57 + ScheduleRule_input($ruleId : ruleId, $qyrq : qyrq)
  58 + eval((!$qyrq.isBefore($fromDate)) && (!$qyrq.isAfter($toDate)))
  59 + then
  60 + // 构造Calcu_days_result对象,进行下一阶段计算
  61 + Calcu_days_result cdr = new Calcu_days_result();
  62 + cdr.setRuleId($ruleId);
  63 + cdr.setQyrq_days(0);
  64 + Period p2 = new Period($qyrq, $toDate, PeriodType.days());
  65 + cdr.setSdays(p2.getDays());
  66 + cdr.setCalcu_start_date($qyrq);
  67 + cdr.setCalcu_end_date($toDate);
  68 +
  69 + System.out.println("qyrq_days=0");
  70 + System.out.println("sdays=" + p2.getDays());
  71 +
  72 + insert(cdr); // 插入fact数据,进入下一个阶段
  73 +end
  74 +
  75 +//------------------------- 第二阶段、计算规则准备数据2(起始索引) ----------------------------//
  76 +
  77 +/*
  78 + 计算循环起始index
  79 + @param oindex 初始起始index
  80 + @param 循环范围大小
  81 + @days 开始计算日期离启用日期间隔天数
  82 +*/
  83 +//function int calcu_index(int oindex, int rangsize, int days) {
  84 +// if (days == 0) {
  85 +// return oindex;
  86 +// } else {
  87 +// int temp = rangsize - 1 - oindex;
  88 +// int days_temp = days - temp;
  89 +// if (days_temp <= 0) {
  90 +// return oindex + days_temp;
  91 +// } else {
  92 +// int s_value = (int) (days_temp / rangsize); // 商
  93 +// int y_value = days_temp % rangsize; // 余
  94 +//
  95 +// if (s_value > 0) {
  96 +// return y_value - 1;
  97 +// } else {
  98 +// return s_value - 1;
  99 +// }
  100 +// }
  101 +// }
  102 +//}
  103 +
  104 +//----------------------- 路牌范围循环计算 ------------------------//
  105 +declare Calcu_guideboard_index_result
  106 + ruleId : Long // 规则Id
  107 + calcu_index : Integer // 计算之后的起始索引
  108 +end
  109 +declare Calcu_guideboard_index_param_1
  110 + ruleId : Long // 规则Id
  111 + oindex : Integer // 原始起始索引
  112 + range_size : Integer // 范围大小
  113 + temp : Integer // 原始起始索引距离最后一个索引的大小
  114 + days_temp : Integer // 开始日期离启用日期的天数 - temp
  115 +end
  116 +declare Calcu_guideboard_index_param_2
  117 + ruleId : Long // 规则Id
  118 + s_value : Integer // 商
  119 + y_value : Integer // 余
  120 +end
  121 +
  122 +// 启用日期等于开始日期
  123 +rule "calcu_guideboard_index_1"
  124 + when
  125 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days == 0)
  126 + then
  127 + Calcu_guideboard_index_result cgir = new Calcu_guideboard_index_result();
  128 + cgir.setRuleId($ruleId);
  129 + cgir.setCalcu_index(0);
  130 +
  131 + System.out.println("guideboard ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  132 +
  133 + insert(cgir);
  134 +end
  135 +
  136 +rule "calcu_guideboard_index_2"
  137 + when
  138 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, $qyrq_days: qyrq_days , qyrq_days > 0)
  139 + $scheduleRule_input : ScheduleRule_input(ruleId == $ruleId,
  140 + $rangesize : guideboardIds.size(), $oindex : startGbdIndex)
  141 + then
  142 + Calcu_guideboard_index_param_1 cgip_1 = new Calcu_guideboard_index_param_1();
  143 + cgip_1.setRuleId($ruleId);
  144 + cgip_1.setOindex($oindex);
  145 + cgip_1.setRange_size($rangesize);
  146 + cgip_1.setTemp(Integer.valueOf($rangesize) - 1 - $oindex);
  147 + cgip_1.setDays_temp($qyrq_days - cgip_1.getTemp());
  148 +
  149 + System.out.println("guideboard ruleId=" + $ruleId + ", days_temp=" + cgip_1.getDays_temp());
  150 +
  151 + insert(cgip_1);
  152 +end
  153 +
  154 +rule "calcu_guideboard_index_2_1_result"
  155 + when
  156 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  157 + $param1 : Calcu_guideboard_index_param_1(ruleId == $ruleId,
  158 + $oindex : oindex,
  159 + $days_temp : days_temp, days_temp <= 0)
  160 + then
  161 + Calcu_guideboard_index_result cgir = new Calcu_guideboard_index_result();
  162 + cgir.setRuleId($ruleId);
  163 + cgir.setCalcu_index($oindex + $days_temp);
  164 +
  165 + System.out.println("guideboard ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  166 +
  167 + insert(cgir);
  168 +end
  169 +
  170 +rule "calcu_guideboard_index_2_2"
  171 + when
  172 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  173 + $param1 : Calcu_guideboard_index_param_1(ruleId == $ruleId, $rangesize : range_size,
  174 + $days_temp : days_temp, days_temp > 0)
  175 + then
  176 + Calcu_guideboard_index_param_2 cgip_2 = new Calcu_guideboard_index_param_2();
  177 + cgip_2.setRuleId($ruleId);
  178 + cgip_2.setS_value((int) ($days_temp / $rangesize));
  179 + cgip_2.setY_value($days_temp % $rangesize);
  180 +
  181 + insert(cgip_2);
  182 +end
  183 +
  184 +rule "calcu_guideboard_index_2_2_1_result"
  185 + when
  186 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  187 + $param2 : Calcu_guideboard_index_param_2(ruleId == $ruleId,
  188 + $y_value : y_value, y_value > 0)
  189 + then
  190 + Calcu_guideboard_index_result cgir = new Calcu_guideboard_index_result();
  191 + cgir.setRuleId($ruleId);
  192 + cgir.setCalcu_index($y_value - 1);
  193 +
  194 + System.out.println("guideboard ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  195 +
  196 + insert(cgir);
  197 +end
  198 +
  199 +rule "calcu_guideboard_index_2_2_2_result"
  200 + when
  201 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  202 + $param2 : Calcu_guideboard_index_param_2(ruleId == $ruleId,
  203 + $y_value : y_value, y_value == 0)
  204 + Calcu_guideboard_index_param_1(ruleId == $ruleId, $rangesize : range_size)
  205 + then
  206 + Calcu_guideboard_index_result cgir = new Calcu_guideboard_index_result();
  207 + cgir.setRuleId($ruleId);
  208 + cgir.setCalcu_index($rangesize - 1);
  209 +
  210 + System.out.println("guideboard ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  211 +
  212 + insert(cgir);
  213 +end
  214 +
  215 +//----------------------- 人员范围循环计算 ------------------------//
  216 +declare Calcu_employee_index_result
  217 + ruleId : Long // 规则Id
  218 + calcu_index : Integer // 计算之后的起始索引
  219 +end
  220 +declare Calcu_employee_index_param_1
  221 + ruleId : Long // 规则Id
  222 + oindex : Integer // 原始起始索引
  223 + range_size : Integer // 范围大小
  224 + temp : Integer // 原始起始索引距离最后一个索引的大小
  225 + days_temp : Integer // 开始日期离启用日期的天数 - temp
  226 +end
  227 +declare Calcu_employee_index_param_2
  228 + ruleId : Long // 规则Id
  229 + s_value : Integer // 商
  230 + y_value : Integer // 余
  231 +end
  232 +
  233 +// 启用日期等于开始日期
  234 +rule "calcu_employee_index_1"
  235 + when
  236 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days == 0)
  237 + then
  238 + Calcu_employee_index_result cgir = new Calcu_employee_index_result();
  239 + cgir.setRuleId($ruleId);
  240 + cgir.setCalcu_index(0);
  241 +
  242 + System.out.println("employee ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  243 +
  244 + insert(cgir);
  245 +end
  246 +
  247 +rule "calcu_employee_index_2"
  248 + when
  249 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, $qyrq_days: qyrq_days , qyrq_days > 0)
  250 + $scheduleRule_input : ScheduleRule_input(ruleId == $ruleId,
  251 + $rangesize : employeeConfigIds.size(), $oindex : startEIndex)
  252 + then
  253 + Calcu_employee_index_param_1 cgip_1 = new Calcu_employee_index_param_1();
  254 + cgip_1.setRuleId($ruleId);
  255 + cgip_1.setOindex($oindex);
  256 + cgip_1.setRange_size($rangesize);
  257 + cgip_1.setTemp(Integer.valueOf($rangesize) - 1 - $oindex);
  258 + cgip_1.setDays_temp($qyrq_days - cgip_1.getTemp());
  259 +
  260 + System.out.println("employee ruleId=" + $ruleId + ", days_temp=" + cgip_1.getDays_temp());
  261 +
  262 + insert(cgip_1);
  263 +end
  264 +
  265 +rule "calcu_employee_index_2_1_result"
  266 + when
  267 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  268 + $param1 : Calcu_employee_index_param_1(ruleId == $ruleId,
  269 + $oindex : oindex,
  270 + $days_temp : days_temp, days_temp <= 0)
  271 + then
  272 + Calcu_employee_index_result cgir = new Calcu_employee_index_result();
  273 + cgir.setRuleId($ruleId);
  274 + cgir.setCalcu_index($oindex + $days_temp);
  275 +
  276 + System.out.println("employee ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  277 +
  278 + insert(cgir);
  279 +end
  280 +
  281 +rule "calcu_employee_index_2_2"
  282 + when
  283 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  284 + $param1 : Calcu_employee_index_param_1(ruleId == $ruleId, $rangesize : range_size,
  285 + $days_temp : days_temp, days_temp > 0)
  286 + then
  287 + Calcu_employee_index_param_2 cgip_2 = new Calcu_employee_index_param_2();
  288 + cgip_2.setRuleId($ruleId);
  289 + cgip_2.setS_value((int) ($days_temp / $rangesize));
  290 + cgip_2.setY_value($days_temp % $rangesize);
  291 +
  292 + insert(cgip_2);
  293 +end
  294 +
  295 +rule "calcu_employee_index_2_2_1_result"
  296 + when
  297 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  298 + $param2 : Calcu_employee_index_param_2(ruleId == $ruleId,
  299 + $y_value : y_value, y_value > 0)
  300 + then
  301 + Calcu_employee_index_result cgir = new Calcu_employee_index_result();
  302 + cgir.setRuleId($ruleId);
  303 + cgir.setCalcu_index($y_value - 1);
  304 +
  305 + System.out.println("employee ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  306 +
  307 + insert(cgir);
  308 +end
  309 +
  310 +rule "calcu_employee_index_2_2_2_result"
  311 + when
  312 + $calcu_days_result : Calcu_days_result($ruleId: ruleId, qyrq_days > 0)
  313 + $param2 : Calcu_employee_index_param_2(ruleId == $ruleId,
  314 + $y_value : y_value, y_value == 0)
  315 + Calcu_employee_index_param_1(ruleId == $ruleId, $rangesize : range_size)
  316 + then
  317 + Calcu_employee_index_result cgir = new Calcu_employee_index_result();
  318 + cgir.setRuleId($ruleId);
  319 + cgir.setCalcu_index($rangesize - 1);
  320 +
  321 + System.out.println("employee ruleId=" + $ruleId + ", calcu_index=" + cgir.getCalcu_index());
  322 +
  323 + insert(cgir);
  324 +end
  325 +
  326 +//------------------------- 第二阶段、计算规则准备数据3(范围循环数据) ----------------------------//
  327 +
  328 +//----------------------- 路牌范围循环计算 ------------------------//
  329 +declare Calcu_guideboard_range_loop_result
  330 + ruleId : Long // 规则Id
  331 + firstLoopSize : Integer // 初始的范围循环个数
  332 + middelLoopCount : Integer // 中间的范围循环次数
  333 + rangeSize : Integer // 范围大小
  334 + lastLoopSize : Integer // 最后的范围循环个数
  335 +end
  336 +
  337 +declare Calcu_guideboard_range_loop_param
  338 + ruleId : Long // 规则Id
  339 + temp : Integer // 起始索引距离最后一个索引的大小
  340 + sdays : Integer // 总共需要排班的天数
  341 +end
  342 +
  343 +rule "calcu_guideboard_range_loop_1"
  344 + when
  345 + Calcu_guideboard_index_result($ruleId : ruleId, $index : calcu_index)
  346 + Calcu_days_result(ruleId == $ruleId, $sdays : sdays)
  347 + ScheduleRule_input(ruleId == $ruleId, $rangesize : guideboardIds.size())
  348 + then
  349 + Calcu_guideboard_range_loop_param param = new Calcu_guideboard_range_loop_param();
  350 + param.setRuleId($ruleId);
  351 + param.setTemp(new Integer($rangesize) - 1 - $index);
  352 + param.setSdays($sdays);
  353 +
  354 + insert(param);
  355 +end
  356 +
  357 +rule "calcu_guideboard_range_loop_1_1"
  358 + when
  359 + Calcu_guideboard_range_loop_param($ruleId : ruleId, $sdays : sdays, sdays <= temp)
  360 + Calcu_guideboard_index_result(ruleId == $ruleId, $index : calcu_index)
  361 + then
  362 + Calcu_guideboard_range_loop_result cgrlr = new Calcu_guideboard_range_loop_result();
  363 + cgrlr.setRuleId($ruleId);
  364 + cgrlr.setFirstLoopSize($index + $sdays);
  365 + cgrlr.setMiddelLoopCount(0);
  366 + cgrlr.setRangeSize(0);
  367 + cgrlr.setLastLoopSize(0);
  368 +
  369 + System.out.println("guideboard ruleId=" + $ruleId + ", " +
  370 + "f=" + cgrlr.getFirstLoopSize() +
  371 + ", m=" + cgrlr.getMiddelLoopCount() +
  372 + ", m_r=" + cgrlr.getRangeSize() +
  373 + ", l=" + cgrlr.getLastLoopSize());
  374 +
  375 + insert(cgrlr);
  376 +end
  377 +
  378 +rule "calcu_guideboard_range_loop_1_2"
  379 + when
  380 + Calcu_guideboard_range_loop_param($ruleId : ruleId, $sdays : sdays, $temp : temp, sdays > temp)
  381 + Calcu_guideboard_index_result(ruleId == $ruleId, $index : calcu_index)
  382 + ScheduleRule_input(ruleId == $ruleId, $rangesize : guideboardIds.size())
  383 + then
  384 + Calcu_guideboard_range_loop_result cgrlr = new Calcu_guideboard_range_loop_result();
  385 + cgrlr.setRuleId($ruleId);
  386 + cgrlr.setFirstLoopSize($index + $temp);
  387 +
  388 + int gbd_days_temp_minus = $sdays - $temp;
  389 + int gbd_days_temp_minus_svalue = (int) (gbd_days_temp_minus / new Integer($rangesize));
  390 + int gbd_days_temp_minus_yvalue = gbd_days_temp_minus % new Integer($rangesize);
  391 +
  392 + cgrlr.setMiddelLoopCount(gbd_days_temp_minus_svalue);
  393 + cgrlr.setRangeSize(new Integer($rangesize));
  394 + cgrlr.setLastLoopSize(gbd_days_temp_minus_yvalue);
  395 +
  396 + System.out.println("guideboard ruleId=" + $ruleId + ", " +
  397 + "f=" + cgrlr.getFirstLoopSize() +
  398 + ", m=" + cgrlr.getMiddelLoopCount() +
  399 + ", m_r=" + cgrlr.getRangeSize() +
  400 + ", l=" + cgrlr.getLastLoopSize());
  401 +
  402 + insert(cgrlr);
  403 +end
  404 +
  405 +//----------------------- 人员范围循环计算 ------------------------//
  406 +declare Calcu_employee_range_loop_result
  407 + ruleId : Long // 规则Id
  408 + firstLoopSize : Integer // 初始的范围循环个数
  409 + middelLoopCount : Integer // 中间的范围循环次数
  410 + rangeSize : Integer // 范围大小
  411 + lastLoopSize : Integer // 最后的范围循环个数
  412 +end
  413 +
  414 +declare Calcu_employee_range_loop_param
  415 + ruleId : Long // 规则Id
  416 + temp : Integer // 起始索引距离最后一个索引的大小
  417 + sdays : Integer // 总共需要排班的天数
  418 +end
  419 +
  420 +rule "calcu_employee_range_loop_1"
  421 + when
  422 + Calcu_employee_index_result($ruleId : ruleId, $index : calcu_index)
  423 + Calcu_days_result(ruleId == $ruleId, $sdays : sdays)
  424 + ScheduleRule_input(ruleId == $ruleId, $rangesize : employeeConfigIds.size())
  425 + then
  426 + Calcu_employee_range_loop_param param = new Calcu_employee_range_loop_param();
  427 + param.setRuleId($ruleId);
  428 + param.setTemp(new Integer($rangesize) - 1 - $index);
  429 + param.setSdays($sdays);
  430 +
  431 + insert(param);
  432 +end
  433 +
  434 +rule "calcu_employee_range_loop_1_1"
  435 + when
  436 + Calcu_employee_range_loop_param($ruleId : ruleId, $sdays : sdays, sdays <= temp)
  437 + Calcu_employee_index_result(ruleId == $ruleId, $index : calcu_index)
  438 + then
  439 + Calcu_employee_range_loop_result cgrlr = new Calcu_employee_range_loop_result();
  440 + cgrlr.setRuleId($ruleId);
  441 + cgrlr.setFirstLoopSize($index + $sdays);
  442 + cgrlr.setMiddelLoopCount(0);
  443 + cgrlr.setRangeSize(0);
  444 + cgrlr.setLastLoopSize(0);
  445 +
  446 + System.out.println("employee ruleId=" + $ruleId + ", " +
  447 + "f=" + cgrlr.getFirstLoopSize() +
  448 + ", m=" + cgrlr.getMiddelLoopCount() +
  449 + ", m_r=" + cgrlr.getRangeSize() +
  450 + ", l=" + cgrlr.getLastLoopSize());
  451 +
  452 + insert(cgrlr);
  453 +end
  454 +
  455 +rule "calcu_employee_range_loop_1_2"
  456 + when
  457 + Calcu_employee_range_loop_param($ruleId : ruleId, $sdays : sdays, $temp : temp, sdays > temp)
  458 + Calcu_employee_index_result(ruleId == $ruleId, $index : calcu_index)
  459 + ScheduleRule_input(ruleId == $ruleId, $rangesize : employeeConfigIds.size())
  460 + then
  461 + Calcu_employee_range_loop_result cgrlr = new Calcu_employee_range_loop_result();
  462 + cgrlr.setRuleId($ruleId);
  463 + cgrlr.setFirstLoopSize($index + $temp);
  464 +
  465 + int gbd_days_temp_minus = $sdays - $temp;
  466 + int gbd_days_temp_minus_svalue = (int) (gbd_days_temp_minus / new Integer($rangesize));
  467 + int gbd_days_temp_minus_yvalue = gbd_days_temp_minus % new Integer($rangesize);
  468 +
  469 + cgrlr.setMiddelLoopCount(gbd_days_temp_minus_svalue);
  470 + cgrlr.setRangeSize(new Integer($rangesize));
  471 + cgrlr.setLastLoopSize(gbd_days_temp_minus_yvalue);
  472 +
  473 + System.out.println("employee ruleId=" + $ruleId + ", " +
  474 + "f=" + cgrlr.getFirstLoopSize() +
  475 + ", m=" + cgrlr.getMiddelLoopCount() +
  476 + ", m_r=" + cgrlr.getRangeSize() +
  477 + ", l=" + cgrlr.getLastLoopSize());
  478 +
  479 + insert(cgrlr);
  480 +end
  481 +
  482 +
  483 +//------------------------- 第三阶段、范围组循环计算 ----------------------------//
  484 +
  485 +//----------------------- 路牌范围循环计算 ------------------------//
  486 +declare Calcu_loop_guideboard_result
  487 + ruleId : Long // 规则id
  488 + go_list : List // 路牌循环的列表
  489 +end
  490 +
  491 +rule "calcu_loop_guideboard"
  492 + when
  493 + $loopData : Calcu_guideboard_range_loop_result($ruleId : ruleId, rangeSize > 0)
  494 + $indexData : Calcu_guideboard_index_result(ruleId == $ruleId)
  495 + $ruleData : ScheduleRule_input(ruleId == $ruleId)
  496 + Calcu_days_result(ruleId == $ruleId, $startDate : calcu_start_date)
  497 + then
  498 + // 循环计算路牌
  499 + DateTime initDate = $startDate;
  500 + List<ScheduleResult_output> scheduleResult_outputs = new ArrayList<ScheduleResult_output>();
  501 +
  502 + // 1、初始组循环
  503 + for (int i = $indexData.getCalcu_index(); i<= $loopData.getFirstLoopSize(); i++) {
  504 + ScheduleResult_output ro = new ScheduleResult_output();
  505 + ro.setRuleId($ruleId);
  506 + ro.setSd(initDate);
  507 + ro.setGuideboardId($ruleData.getGuideboardIds().get(i));
  508 + ro.setCarConfigId($ruleData.getCarConfigId());
  509 + scheduleResult_outputs.add(ro);
  510 +
  511 + initDate = initDate.plusDays(1);
  512 + }
  513 +
  514 + // 2、组循环
  515 + for (int j = 0; j < $loopData.getMiddelLoopCount(); j++) {
  516 + for (int k = 0; k < $loopData.getRangeSize(); k++) {
  517 + ScheduleResult_output ro2 = new ScheduleResult_output();
  518 + ro2.setRuleId($ruleId);
  519 + ro2.setSd(initDate);
  520 + ro2.setGuideboardId($ruleData.getGuideboardIds().get(k));
  521 + ro2.setCarConfigId($ruleData.getCarConfigId());
  522 + scheduleResult_outputs.add(ro2);
  523 +
  524 + initDate = initDate.plusDays(1);
  525 + }
  526 + }
  527 +
  528 + // 3、余下组循环
  529 + for (int l = 0; l < $loopData.getLastLoopSize(); l++) {
  530 + ScheduleResult_output ro3 = new ScheduleResult_output();
  531 + ro3.setRuleId($ruleId);
  532 + ro3.setSd(initDate);
  533 + ro3.setGuideboardId($ruleData.getGuideboardIds().get(l));
  534 + ro3.setCarConfigId($ruleData.getCarConfigId());
  535 + scheduleResult_outputs.add(ro3);
  536 +
  537 + initDate = initDate.plusDays(1);
  538 + }
  539 +
  540 + Calcu_loop_guideboard_result clgr = new Calcu_loop_guideboard_result();
  541 + clgr.setRuleId($ruleId);
  542 + clgr.setGo_list(scheduleResult_outputs);
  543 +
  544 + insert(clgr);
  545 +end
  546 +
  547 +//----------------------- 人员范围循环计算 ------------------------//
  548 +declare Calcu_loop_employee_result
  549 + ruleId : Long // 规则id
  550 + eo_list : List // 人员循环的列表
  551 +end
  552 +
  553 +rule "calcu_loop_employee"
  554 + when
  555 + $loopData : Calcu_employee_range_loop_result($ruleId : ruleId, rangeSize > 0)
  556 + $indexData : Calcu_employee_index_result(ruleId == $ruleId)
  557 + $ruleData : ScheduleRule_input(ruleId == $ruleId)
  558 + Calcu_days_result(ruleId == $ruleId, $startDate : calcu_start_date)
  559 + then
  560 + // 循环计算路牌
  561 + DateTime initDate = $startDate;
  562 + List<ScheduleResult_output> scheduleResult_outputs = new ArrayList<ScheduleResult_output>();
  563 +
  564 + // 1、初始组循环
  565 + for (int i = $indexData.getCalcu_index(); i<= $loopData.getFirstLoopSize(); i++) {
  566 + ScheduleResult_output ro = new ScheduleResult_output();
  567 + ro.setRuleId($ruleId);
  568 + ro.setSd(initDate);
  569 + ro.setEmployeeConfigId($ruleData.getEmployeeConfigIds().get(i));
  570 + ro.setCarConfigId($ruleData.getCarConfigId());
  571 + scheduleResult_outputs.add(ro);
  572 +
  573 + initDate = initDate.plusDays(1);
  574 + }
  575 +
  576 + // 2、组循环
  577 + for (int j = 0; j < $loopData.getMiddelLoopCount(); j++) {
  578 + for (int k = 0; k < $loopData.getRangeSize(); k++) {
  579 + ScheduleResult_output ro2 = new ScheduleResult_output();
  580 + ro2.setRuleId($ruleId);
  581 + ro2.setSd(initDate);
  582 + ro2.setEmployeeConfigId($ruleData.getEmployeeConfigIds().get(k));
  583 + ro2.setCarConfigId($ruleData.getCarConfigId());
  584 + scheduleResult_outputs.add(ro2);
  585 +
  586 + initDate = initDate.plusDays(1);
  587 + }
  588 + }
  589 +
  590 + // 3、余下组循环
  591 + for (int l = 0; l < $loopData.getLastLoopSize(); l++) {
  592 + ScheduleResult_output ro3 = new ScheduleResult_output();
  593 + ro3.setRuleId($ruleId);
  594 + ro3.setSd(initDate);
  595 + ro3.setEmployeeConfigId($ruleData.getEmployeeConfigIds().get(l));
  596 + ro3.setCarConfigId($ruleData.getCarConfigId());
  597 + scheduleResult_outputs.add(ro3);
  598 +
  599 + initDate = initDate.plusDays(1);
  600 + }
  601 +
  602 + Calcu_loop_employee_result clgr = new Calcu_loop_employee_result();
  603 + clgr.setRuleId($ruleId);
  604 + clgr.setEo_list(scheduleResult_outputs);
  605 +
  606 + insert(clgr);
  607 +end
  608 +
  609 +//------------------------- 第四阶段、范围组循环计算 ----------------------------//
  610 +
  611 +global ScheduleResults_output scheduleResult;
  612 +
  613 +rule "output"
  614 + when
  615 + Calcu_loop_guideboard_result($ruleId : ruleId, $go_list : go_list, go_list.size() > 0)
  616 + Calcu_loop_employee_result(ruleId == $ruleId, $eo_list : eo_list, eo_list.size() == $go_list.size())
  617 + then
  618 + for (int i = 0; i < $go_list.size(); i++) {
  619 + ScheduleResult_output go = (ScheduleResult_output) $go_list.get(i);
  620 + ScheduleResult_output eo = (ScheduleResult_output) $eo_list.get(i);
  621 + go.setEmployeeConfigId(eo.getEmployeeConfigId());
  622 + scheduleResult.getResults().add(go);
  623 + }
  624 +
  625 +end
  626 +
  627 +
  628 +
  629 +//------------------------- 第二阶段、翻班循环规则计算排班 -------------------------//
  630 +
  631 +
  632 +
  633 +
  634 +
  635 +
  636 +
  637 +//------------------------- 第三阶段、计算规则准备数据3(范围循环数据) ----------------------------//
  638 +
  639 +/*
  640 + 计算循环起始index
  641 + @param oindex 初始起始index
  642 + @param 循环范围大小
  643 + @days 开始计算日期离起始日期间隔天数
  644 +*/
  645 +//function int calcu_index(int oindex, int rangsize, int days) {
  646 +// if (days == 0) {
  647 +// return oindex;
  648 +// } else {
  649 +// int temp = rangsize - 1 - oindex;
  650 +// int days_temp = days - temp;
  651 +// if (days_temp <= 0) {
  652 +// return oindex + days_temp;
  653 +// } else {
  654 +// int s_value = (int) (days_temp / rangsize); // 商
  655 +// int y_value = days_temp % rangsize; // 余
  656 +//
  657 +// if (s_value > 0) {
  658 +// return y_value - 1;
  659 +// } else {
  660 +// return s_value - 1;
  661 +// }
  662 +// }
  663 +// }
  664 +//}
  665 +
  666 +/*
  667 + TODO:创建ScheduleResult_output,并插入fact。车,人先不放,以后再考虑重新放值。
  668 +*/
  669 +//function void createResultAndInsert(Long ruleId, Long gId, DateTime sd) {
  670 +// ScheduleResult_output ro = new ScheduleResult_output();
  671 +// ro.setRuleId(ruleId);
  672 +// ro.setGuideboardId(gId);
  673 +// ro.setSd(sd);
  674 +//
  675 +// insert(ro);
  676 +//}
  677 +
  678 +/*
  679 + 翻班循环计算排班数据。
  680 +*/
  681 +//rule "calcu_plan"
  682 +// salience 90
  683 +// when
  684 +// $calcu_days_result : Calcu_days_result($ruleId: ruleId)
  685 +// $scheduleRule_input : ScheduleRule_input(ruleId == $ruleId)
  686 +// then
  687 +// // 计算路牌范围循环的起始index
  688 +// int index_gbd = calcu_index(
  689 +// $scheduleRule_input.getStartGbdIndex(),
  690 +// $scheduleRule_input.getGuideboardIds().size(),
  691 +// $calcu_days_result.getQyrq_days()
  692 +// );
  693 +//// // 计算人员范围循环的起始index
  694 +//// int index_e = calcu_index(
  695 +//// $scheduleRule_input.getStartEIndex(),
  696 +//// $scheduleRule_input.getEmployeeIds().size(),
  697 +//// $calcu_days_result.getQyrq_days()
  698 +//// );
  699 +//
  700 +// // 计算路牌排班
  701 +// // 1、初始组循环
  702 +// int gbd_days_y = $scheduleRule_input.getGuideboardIds().size() - 1 - index_gbd;
  703 +// int gbd_days_temp = $calcu_days_result.getSdays();
  704 +// DateTime startDate = $calcu_days_result.getCalcu_start_date();
  705 +//
  706 +// if (gbd_days_temp <= gbd_days_y) { // 1、初始组循环
  707 +// for (int i = index_gbd; i <= index_gbd + gbd_days_temp; i++) {
  708 +// ScheduleResult_output ro1 = new ScheduleResult_output(
  709 +// $ruleId, $scheduleRule_input.getGuideboardIds().get(i), startDate);
  710 +// insert(ro1);
  711 +//
  712 +// startDate = startDate.plusDays(1);
  713 +// }
  714 +// } else {
  715 +// for (int j = index_gbd; j <= index_gbd + gbd_days_y; j++) { // 1、初始组循环
  716 +// ScheduleResult_output ro2 = new ScheduleResult_output(
  717 +// $ruleId, $scheduleRule_input.getGuideboardIds().get(i), startDate);
  718 +// insert(ro2);
  719 +//
  720 +// startDate = startDate.plusDays(1);
  721 +// }
  722 +//
  723 +// int gbd_days_temp_minus = gbd_days_temp - gbd_days_y;
  724 +// int gbd_days_temp_minus_svalue = (int) (gbd_days_temp_minus / $scheduleRule_input.getGuideboardIds().size());
  725 +// int gbd_days_temp_minus_yvalue = gbd_days_temp_minus % $scheduleRule_input.getGuideboardIds().size();
  726 +//
  727 +// // 2、其余组循环
  728 +// for (int a = 1; a <= gbd_days_temp_minus_svalue; a++) {
  729 +// for (int c = 0; c < $scheduleRule_input.getGuideboardIds().size(); c++) {
  730 +// ScheduleResult_output ro3 = new ScheduleResult_output(
  731 +// $ruleId, $scheduleRule_input.getGuideboardIds().get(i), startDate);
  732 +//
  733 +// insert(ro3);
  734 +// startDate = startDate.plusDays(1);
  735 +// }
  736 +// }
  737 +// // 3、余下组循环
  738 +// for (int b = 0; b < gbd_days_temp_minus_yvalue; b++) {
  739 +// ScheduleResult_output ro4 = new ScheduleResult_output(
  740 +// $ruleId, $scheduleRule_input.getGuideboardIds().get(i), startDate);
  741 +//
  742 +// insert(ro4);
  743 +// startDate = startDate.plusDays(1);
  744 +// }
  745 +//
  746 +// }
  747 +//
  748 +//end
  749 +
  750 +//------------------------- TODO:第三阶段、收集所有result,输出整合数据 -------------------------//
  751 +
  752 +//global ScheduleResults_output scheduleResult;
  753 +//
  754 +//rule "calcu_plan_output"
  755 +// salience 80
  756 +// when
  757 +// $outputlist : ArrayList(size >= 1) from collect (ScheduleResult_output())
  758 +// then
  759 +// scheduleResult.getResults().addAll($outputlist);
  760 +//
  761 +//end
  762 +
  763 +
  764 +
  765 +
  766 +
  767 +
  768 +
  769 +
  770 +
  771 +
  772 +
  773 +
  774 +
  775 +
  776 +
  777 +
  778 +
  779 +
  780 +
  781 +
  782 +
  783 +
... ...
src/test/java/com/bsth/service/schedule/rules/DroolsRulesTest.java
1 1 package com.bsth.service.schedule.rules;
2 2  
3 3 import com.bsth.Application;
  4 +import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;
  5 +import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
  6 +import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;
  7 +import org.joda.time.DateTime;
4 8 import org.junit.Test;
5 9 import org.junit.runner.RunWith;
6 10 import org.kie.api.KieBase;
... ... @@ -10,6 +14,7 @@ import org.springframework.boot.test.SpringApplicationConfiguration;
10 14 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
11 15  
12 16 import java.util.ArrayList;
  17 +import java.util.Arrays;
13 18 import java.util.List;
14 19  
15 20 @RunWith(SpringJUnit4ClassRunner.class)
... ... @@ -44,4 +49,45 @@ public class DroolsRulesTest {
44 49 // 4、执行完毕销毁,有日志的也要关闭
45 50 session.dispose();
46 51 }
  52 +
  53 + @Test
  54 + public void shiftloopDrlTest() throws Exception {
  55 + // 1、创建session,内部配置的是stateful
  56 + KieSession session = kieBase.newKieSession();
  57 +
  58 + // 1.1 设置gloable对象,在drl中通过别名使用
  59 + ScheduleResults_output scheduleResults_output = new ScheduleResults_output();
  60 + session.setGlobal("scheduleResult", scheduleResults_output);
  61 +
  62 + // 1.2 可以设置一些监听器,再议
  63 +
  64 + // 2、创建fact对象
  65 +
  66 + ScheduleCalcuParam_input scheduleCalcuParam_input = new ScheduleCalcuParam_input();
  67 + scheduleCalcuParam_input.setFromDate(new DateTime(2016, 1, 1, 0, 0));
  68 + scheduleCalcuParam_input.setToDate(new DateTime(2016, 1, 17, 0, 0));
  69 + scheduleCalcuParam_input.setTtinfoId(1L);
  70 +
  71 + ScheduleRule_input scheduleRule_input1 = new ScheduleRule_input();
  72 + scheduleRule_input1.setRuleId(1L);
  73 + scheduleRule_input1.setQyrq(new DateTime(2015, 12, 21, 0, 0));
  74 + scheduleRule_input1.getGuideboardIds().addAll(Arrays.asList(1L, 2L, 3L, 4L));
  75 + scheduleRule_input1.setStartGbdIndex(2);
  76 + scheduleRule_input1.getEmployeeConfigIds().addAll(Arrays.asList(1L, 2L));
  77 + scheduleRule_input1.setStartEIndex(0);
  78 + scheduleRule_input1.setCarConfigId(1L);
  79 +
  80 + session.insert(scheduleCalcuParam_input);
  81 + session.insert(scheduleRule_input1);
  82 +
  83 +
  84 + // 3、执行rule
  85 + session.fireAllRules();
  86 +
  87 + // 4、执行完毕销毁,有日志的也要关闭
  88 + session.dispose();
  89 +
  90 + System.out.println(scheduleResults_output.showGuideboardDesc1());
  91 +
  92 + }
47 93 }
... ...