Commit 5f7c99a85a7e8db6165f1b331bde50738d901b20

Authored by 徐烜
1 parent 5681d089

Update

src/main/java/com/bsth/service/schedule/rules/MyDroolsConfiguration.java
... ... @@ -58,9 +58,9 @@ public class MyDroolsConfiguration {
58 58 kfs.write("src/main/resources/HelloWorld.drl", kieServices.getResources()
59 59 .newInputStreamResource(this.getClass().getResourceAsStream(
60 60 "/rules/HelloWorld.drl"), "UTF-8"));
61   - kfs.write("src/main/resources/shiftloop.drl", kieServices.getResources()
  61 + kfs.write("src/main/resources/shiftloop_fb.drl", kieServices.getResources()
62 62 .newInputStreamResource(this.getClass().getResourceAsStream(
63   - "/rules/shiftloop.drl"), "UTF-8"));
  63 + "/rules/shiftloop_fb.drl"), "UTF-8"));
64 64 kfs.write("src/main/resources/ttinfo.drl", kieServices.getResources()
65 65 .newInputStreamResource(this.getClass().getResourceAsStream(
66 66 "/rules/ttinfo.drl"), "UTF-8"));
... ...
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleRule_input.java
... ... @@ -59,7 +59,8 @@ public class ScheduleRule_input {
59 59 if (StringUtils.isEmpty(scheduleRule1Flat.getFbgs()) || "1".equals(scheduleRule1Flat.getFbgs())) {
60 60 fbgs_temp = "1,1,1,1,1,1,1";
61 61 } else {
62   - fbgs_temp = scheduleRule1Flat.getFbgs();
  62 + fbgs_temp = "1,1,1,1,1,0,0";
  63 +// fbgs_temp = scheduleRule1Flat.getFbgs();
63 64 }
64 65 String[] days = fbgs_temp.split(",");
65 66 for (int i = 0; i < 7; i++) {
... ...
src/main/resources/rules/shiftloop.drl
... ... @@ -145,6 +145,7 @@ rule &quot;calcu_guideboard_index_1&quot;
145 145 insert(cgir);
146 146 end
147 147  
  148 +// 启用日期大于开始日期
148 149 rule "calcu_guideboard_index_2"
149 150 when
150 151 $calcu_days_result : Calcu_days_result($ruleId: ruleId, $qyrq_days: qyrq_days , qyrq_days > 0)
... ...
src/main/resources/rules/shiftloop_fb.drl 0 → 100644
  1 +package com.bsth.service.schedule.shiftloop;
  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 +import org.slf4j.Logger;
  12 +
  13 +global Logger log;
  14 +
  15 +/*
  16 + 存在(翻班格式)
  17 +*/
  18 +
  19 +//------------------------- 第一阶段、计算规则准备数据(天数) ----------------------------//
  20 +
  21 +declare Calcu_days_result
  22 + ruleId : String // 规则Id
  23 + qyrq_days : Integer // 开始日期离启用日期的天数
  24 + sdays : Integer // 总共需要排班的天数
  25 + calcu_start_date : DateTime // 开始计算日期
  26 + calcu_end_date : DateTime // 结束计算日期
  27 +end
  28 +
  29 +/*
  30 + 计算启用日期,开始计算日期,结束计算日期,相差天数
  31 + 1、规则启用日期小于开始计算日期
  32 + 2、规则启用日期大于等于开始日期,小于等于结束日期
  33 +*/
  34 +rule "calcu_days_1"
  35 + salience 100
  36 + when
  37 + ScheduleCalcuParam_input(
  38 + fromDate.isBefore(toDate) || fromDate.isEqual(toDate),
  39 + $fromDate : fromDate,
  40 + $toDate : toDate
  41 + )
  42 + ScheduleRule_input($ruleId : ruleId, $qyrq : qyrq)
  43 + eval($qyrq.isBefore($fromDate))
  44 + then
  45 + // 构造Calcu_days_result对象,进行下一阶段计算
  46 + Calcu_days_result cdr = new Calcu_days_result();
  47 + cdr.setRuleId($ruleId);
  48 + Period p1 = new Period($qyrq, $fromDate, PeriodType.days());
  49 + cdr.setQyrq_days(p1.getDays());
  50 + Period p2 = new Period($fromDate, $toDate, PeriodType.days());
  51 + cdr.setSdays(p2.getDays() + 1);
  52 + cdr.setCalcu_start_date($fromDate);
  53 + cdr.setCalcu_end_date($toDate);
  54 +
  55 + log.info("开始日期离启用日期的天数 qyrq_days={}", p1.getDays());
  56 + log.info("总共需要排班的天数 sdays={}", (p2.getDays() + 1));
  57 +
  58 + insert(cdr); // 插入fact数据,进入下一个阶段
  59 +end
  60 +
  61 +rule "calcu_days_2"
  62 + salience 100
  63 + when
  64 + ScheduleCalcuParam_input(
  65 + fromDate.isBefore(toDate) || fromDate.isEqual(toDate),
  66 + $fromDate : fromDate,
  67 + $toDate : toDate
  68 + )
  69 + ScheduleRule_input($ruleId : ruleId, $qyrq : qyrq)
  70 + eval((!$qyrq.isBefore($fromDate)) && (!$qyrq.isAfter($toDate)))
  71 + then
  72 + // 构造Calcu_days_result对象,进行下一阶段计算
  73 + Calcu_days_result cdr = new Calcu_days_result();
  74 + cdr.setRuleId($ruleId);
  75 + cdr.setQyrq_days(0);
  76 + Period p2 = new Period($qyrq, $toDate, PeriodType.days());
  77 + cdr.setSdays(Integer.valueOf(p2.getDays() + 1));
  78 + cdr.setCalcu_start_date($qyrq);
  79 + cdr.setCalcu_end_date($toDate);
  80 +
  81 + log.info("开始日期离启用日期的天数 qyrq_days=0");
  82 + log.info("总共需要排班的天数 sdays={}", (p2.getDays() + 1));
  83 +
  84 + insert(cdr); // 插入fact数据,进入下一个阶段
  85 +end
  86 +
  87 +//------------------------- 第二阶段、计算规则准备数据2(起始索引) ----------------------------//
  88 +
  89 +//----------------------- 路牌范围循环计算 ------------------------//
  90 +
  91 +declare Calcu_guideboard_index_result
  92 + ruleId : String // 规则Id
  93 + calcu_index : Integer // 计算之后的起始索引
  94 +end
  95 +
  96 +// 启用日期等于开始日期
  97 +rule "calcu_guideboard_index_qyrq_eq_startrq"
  98 + when
  99 + $calcu_days_result : Calcu_days_result(
  100 + qyrq_days == 0,
  101 + $ruleId: ruleId
  102 + )
  103 + $scheduleRule_input : ScheduleRule_input(
  104 + ruleId == $ruleId,
  105 + $oindex : startGbdIndex
  106 + )
  107 + then
  108 + Calcu_guideboard_index_result cgir = new Calcu_guideboard_index_result();
  109 + cgir.setRuleId($ruleId);
  110 + cgir.setCalcu_index($oindex);
  111 +
  112 + log.info("calcu_guideboard_index_qyrq_eq_startrq ruleId={}, calcu_index={}", $ruleId, cgir.getCalcu_index());
  113 +
  114 + insert(cgir);
  115 +end
  116 +
  117 +// 开始日期大于启用日期
  118 +rule "calcu_guideboard_index_startrq_gt_qyrq"
  119 + when
  120 + $calcu_days_result : Calcu_days_result(
  121 + qyrq_days > 0,
  122 + $ruleId: ruleId, $qyrq_days: qyrq_days,
  123 + $calcu_start_date: calcu_start_date
  124 + )
  125 + $scheduleRule_input : ScheduleRule_input(
  126 + ruleId == $ruleId,
  127 + $qyrq: qyrq,
  128 + $rangesize : guideboardIds.size(),
  129 + $oindex : startGbdIndex,
  130 + $weekdays: weekdays
  131 + )
  132 + then
  133 + // 开始时间
  134 + DateTime initDate = $qyrq;
  135 + int index = $oindex;
  136 + int resultIndex = index;
  137 +
  138 + while (!initDate.isAfter($calcu_start_date)) {
  139 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue()) {
  140 + resultIndex = index;
  141 + index = (index + 1) % $rangesize;
  142 + }
  143 + initDate = initDate.plusDays(1);
  144 + }
  145 +
  146 + Calcu_guideboard_index_result cgir = new Calcu_guideboard_index_result();
  147 + cgir.setRuleId($ruleId);
  148 + cgir.setCalcu_index(resultIndex);
  149 +
  150 + log.info("calcu_guideboard_index_startrq_gt_qyrq ruleId={}, calcu_index={}", $ruleId, cgir.getCalcu_index());
  151 +
  152 + insert(cgir);
  153 +end
  154 +
  155 +//----------------------- 人员范围循环计算 ------------------------//
  156 +
  157 +declare Calcu_employee_index_result
  158 + ruleId : String // 规则Id
  159 + calcu_index : Integer // 计算之后的起始索引
  160 +end
  161 +
  162 +// 启用日期等于开始日期
  163 +rule "calcu_employee_index_qyrq_eq_startrq"
  164 + when
  165 + $calcu_days_result : Calcu_days_result(
  166 + qyrq_days == 0,
  167 + $ruleId: ruleId)
  168 + $scheduleRule_input : ScheduleRule_input(
  169 + ruleId == $ruleId,
  170 + $oindex : startEIndex)
  171 + then
  172 + Calcu_employee_index_result cgir = new Calcu_employee_index_result();
  173 + cgir.setRuleId($ruleId);
  174 + cgir.setCalcu_index($oindex);
  175 +
  176 + log.info("calcu_employee_index_qyrq_eq_startrq ruleId={}, calcu_index={}", $ruleId, cgir.getCalcu_index());
  177 +
  178 + insert(cgir);
  179 +end
  180 +
  181 +// 开始日期大于启用日期
  182 +rule "calcu_employee_index_startrq_gt_qyrq"
  183 + when
  184 + $calcu_days_result : Calcu_days_result(
  185 + qyrq_days > 0,
  186 + $ruleId: ruleId, $qyrq_days: qyrq_days,
  187 + $calcu_start_date: calcu_start_date
  188 + )
  189 + $scheduleRule_input : ScheduleRule_input(
  190 + ruleId == $ruleId,
  191 + $qyrq: qyrq,
  192 + $rangesize : employeeConfigIds.size(),
  193 + $oindex : startEIndex,
  194 + $weekdays: weekdays
  195 + )
  196 + then
  197 + // 开始时间
  198 + DateTime initDate = $qyrq;
  199 + int index = $oindex;
  200 + int resultIndex = index;
  201 +
  202 + while (!initDate.isAfter($calcu_start_date)) {
  203 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue()) {
  204 + resultIndex = index;
  205 + index = (index + 1) % $rangesize;
  206 + }
  207 + initDate = initDate.plusDays(1);
  208 + }
  209 +
  210 + Calcu_employee_index_result cgir = new Calcu_employee_index_result();
  211 + cgir.setRuleId($ruleId);
  212 + cgir.setCalcu_index(resultIndex);
  213 +
  214 + log.info("calcu_employee_index_startrq_gt_qyrq ruleId={}, calcu_index={}", $ruleId, cgir.getCalcu_index());
  215 +
  216 + insert(cgir);
  217 +
  218 +end
  219 +
  220 +//------------------------- 第三阶段、循环计算 ------------------------//
  221 +
  222 +//----------------------- 路牌范围循环计算 ------------------------//
  223 +declare loop_guideboard_result
  224 + ruleId : String // 规则id
  225 + go_list : List // 路牌循环的列表
  226 +end
  227 +
  228 +// 循环路牌计算
  229 +rule "Calcu_loop_guideboard_result"
  230 + when
  231 + Calcu_days_result(
  232 + $ruleId: ruleId,
  233 + $startDate : calcu_start_date,
  234 + $calcu_end_date: calcu_end_date
  235 + )
  236 + $ruleData : ScheduleRule_input(
  237 + ruleId == $ruleId,
  238 + $rangesize : guideboardIds.size(),
  239 + $weekdays: weekdays
  240 + )
  241 + $indexData : Calcu_guideboard_index_result(
  242 + ruleId == $ruleId
  243 + )
  244 + then
  245 + DateTime initDate = $startDate; // 开始时间
  246 + DateTime endDate = $calcu_end_date; // 结束实际
  247 + List<ScheduleResult_output> scheduleResult_outputs =
  248 + new ArrayList<ScheduleResult_output>();
  249 +
  250 + int i = $indexData.getCalcu_index();
  251 + while (!initDate.isAfter(endDate)) {
  252 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue()) {
  253 + ScheduleResult_output ro = new ScheduleResult_output();
  254 + ro.setRuleId($ruleId);
  255 + ro.setSd(initDate);
  256 + ro.setGuideboardId($ruleData.getGuideboardIds().get(i));
  257 + ro.setCarConfigId($ruleData.getCarConfigId());
  258 + scheduleResult_outputs.add(ro);
  259 +
  260 + i = (i + 1) % $rangesize;
  261 + }
  262 +
  263 + initDate = initDate.plusDays(1);
  264 + }
  265 +
  266 + loop_guideboard_result clgr = new loop_guideboard_result();
  267 + clgr.setRuleId($ruleId);
  268 + clgr.setGo_list(scheduleResult_outputs);
  269 +
  270 + log.info(String.valueOf(scheduleResult_outputs.size()));
  271 +
  272 + insert(clgr);
  273 +
  274 +end
  275 +
  276 +//----------------------- 人员范围循环计算 ------------------------//
  277 +declare loop_employee_result
  278 + ruleId : String // 规则id
  279 + eo_list : List // 人员循环的列表
  280 +end
  281 +
  282 +// 循环人员计算
  283 +rule "Calcu_loop_employee_result"
  284 + when
  285 + Calcu_days_result(
  286 + $ruleId: ruleId,
  287 + $startDate : calcu_start_date,
  288 + $calcu_end_date: calcu_end_date
  289 + )
  290 + $ruleData : ScheduleRule_input(
  291 + ruleId == $ruleId,
  292 + $rangesize : employeeConfigIds.size(),
  293 + $weekdays: weekdays
  294 + )
  295 + $indexData : Calcu_employee_index_result(
  296 + ruleId == $ruleId
  297 + )
  298 + then
  299 + DateTime initDate = $startDate; // 开始时间
  300 + DateTime endDate = $calcu_end_date; // 结束实际
  301 + List<ScheduleResult_output> scheduleResult_outputs =
  302 + new ArrayList<ScheduleResult_output>();
  303 +
  304 + int i = $indexData.getCalcu_index();
  305 + while (!initDate.isAfter(endDate)) {
  306 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue()) {
  307 + ScheduleResult_output ro = new ScheduleResult_output();
  308 + ro.setRuleId($ruleId);
  309 + ro.setSd(initDate);
  310 + ro.setEmployeeConfigId($ruleData.getEmployeeConfigIds().get(i));
  311 + ro.setCarConfigId($ruleData.getCarConfigId());
  312 + scheduleResult_outputs.add(ro);
  313 +
  314 + i = (i + 1) % $rangesize;
  315 + }
  316 +
  317 + initDate = initDate.plusDays(1);
  318 + }
  319 +
  320 + loop_employee_result clgr = new loop_employee_result();
  321 + clgr.setRuleId($ruleId);
  322 + clgr.setEo_list(scheduleResult_outputs);
  323 +
  324 + log.info(String.valueOf(scheduleResult_outputs.size()));
  325 +
  326 + insert(clgr);
  327 +end
  328 +
  329 +//------------------------- 第四阶段、范围组循环计算 ----------------------------//
  330 +
  331 +global ScheduleResults_output scheduleResult;
  332 +
  333 +rule "output"
  334 + when
  335 + loop_guideboard_result(
  336 + go_list.size() > 0,
  337 + $ruleId : ruleId, $go_list : go_list
  338 + )
  339 + loop_employee_result(
  340 + ruleId == $ruleId,
  341 + eo_list.size() == $go_list.size(),
  342 + $eo_list : eo_list
  343 + )
  344 + then
  345 + for (int i = 0; i < $go_list.size(); i++) {
  346 + ScheduleResult_output go = (ScheduleResult_output) $go_list.get(i);
  347 + ScheduleResult_output eo = (ScheduleResult_output) $eo_list.get(i);
  348 + go.setEmployeeConfigId(eo.getEmployeeConfigId());
  349 + scheduleResult.getResults().add(go);
  350 + }
  351 +
  352 +end
  353 +
  354 +
  355 +
  356 +
  357 +
  358 +
  359 +
  360 +
  361 +
  362 +
  363 +
  364 +
  365 +
  366 +
  367 +
  368 +
... ...