Commit 3f6370649624c53967cb9d916142d9b6f5ec5922

Authored by 潘钊
2 parents 38ccacfd 43b6ac5d

Merge branch 'minhang' of http://222.66.0.204:8090/panzhaov5/bsth_control into minhang

src/main/java/com/bsth/service/schedule/rules/MyDroolsConfiguration.java
@@ -58,9 +58,9 @@ public class MyDroolsConfiguration { @@ -58,9 +58,9 @@ public class MyDroolsConfiguration {
58 kfs.write("src/main/resources/HelloWorld.drl", kieServices.getResources() 58 kfs.write("src/main/resources/HelloWorld.drl", kieServices.getResources()
59 .newInputStreamResource(this.getClass().getResourceAsStream( 59 .newInputStreamResource(this.getClass().getResourceAsStream(
60 "/rules/HelloWorld.drl"), "UTF-8")); 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 .newInputStreamResource(this.getClass().getResourceAsStream( 62 .newInputStreamResource(this.getClass().getResourceAsStream(
63 - "/rules/shiftloop.drl"), "UTF-8")); 63 + "/rules/shiftloop_fb.drl"), "UTF-8"));
64 kfs.write("src/main/resources/ttinfo.drl", kieServices.getResources() 64 kfs.write("src/main/resources/ttinfo.drl", kieServices.getResources()
65 .newInputStreamResource(this.getClass().getResourceAsStream( 65 .newInputStreamResource(this.getClass().getResourceAsStream(
66 "/rules/ttinfo.drl"), "UTF-8")); 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,7 +59,8 @@ public class ScheduleRule_input {
59 if (StringUtils.isEmpty(scheduleRule1Flat.getFbgs()) || "1".equals(scheduleRule1Flat.getFbgs())) { 59 if (StringUtils.isEmpty(scheduleRule1Flat.getFbgs()) || "1".equals(scheduleRule1Flat.getFbgs())) {
60 fbgs_temp = "1,1,1,1,1,1,1"; 60 fbgs_temp = "1,1,1,1,1,1,1";
61 } else { 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 String[] days = fbgs_temp.split(","); 65 String[] days = fbgs_temp.split(",");
65 for (int i = 0; i < 7; i++) { 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,6 +145,7 @@ rule &quot;calcu_guideboard_index_1&quot;
145 insert(cgir); 145 insert(cgir);
146 end 146 end
147 147
  148 +// 启用日期大于开始日期
148 rule "calcu_guideboard_index_2" 149 rule "calcu_guideboard_index_2"
149 when 150 when
150 $calcu_days_result : Calcu_days_result($ruleId: ruleId, $qyrq_days: qyrq_days , qyrq_days > 0) 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 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue() == false) {
  252 + i = (i + 1) % $rangesize;
  253 + }
  254 +
  255 + while (!initDate.isAfter(endDate)) {
  256 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue()) {
  257 + ScheduleResult_output ro = new ScheduleResult_output();
  258 + ro.setRuleId($ruleId);
  259 + ro.setSd(initDate);
  260 + ro.setGuideboardId($ruleData.getGuideboardIds().get(i));
  261 + ro.setCarConfigId($ruleData.getCarConfigId());
  262 + scheduleResult_outputs.add(ro);
  263 +
  264 + i = (i + 1) % $rangesize;
  265 + }
  266 +
  267 + initDate = initDate.plusDays(1);
  268 + }
  269 +
  270 + loop_guideboard_result clgr = new loop_guideboard_result();
  271 + clgr.setRuleId($ruleId);
  272 + clgr.setGo_list(scheduleResult_outputs);
  273 +
  274 + log.info(String.valueOf(scheduleResult_outputs.size()));
  275 +
  276 + insert(clgr);
  277 +
  278 +end
  279 +
  280 +//----------------------- 人员范围循环计算 ------------------------//
  281 +declare loop_employee_result
  282 + ruleId : String // 规则id
  283 + eo_list : List // 人员循环的列表
  284 +end
  285 +
  286 +// 循环人员计算
  287 +rule "Calcu_loop_employee_result"
  288 + when
  289 + Calcu_days_result(
  290 + $ruleId: ruleId,
  291 + $startDate : calcu_start_date,
  292 + $calcu_end_date: calcu_end_date
  293 + )
  294 + $ruleData : ScheduleRule_input(
  295 + ruleId == $ruleId,
  296 + $rangesize : employeeConfigIds.size(),
  297 + $weekdays: weekdays
  298 + )
  299 + $indexData : Calcu_employee_index_result(
  300 + ruleId == $ruleId
  301 + )
  302 + then
  303 + DateTime initDate = $startDate; // 开始时间
  304 + DateTime endDate = $calcu_end_date; // 结束实际
  305 + List<ScheduleResult_output> scheduleResult_outputs =
  306 + new ArrayList<ScheduleResult_output>();
  307 +
  308 + int i = $indexData.getCalcu_index();
  309 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue() == false) {
  310 + i = (i + 1) % $rangesize;
  311 + }
  312 +
  313 + while (!initDate.isAfter(endDate)) {
  314 + if (((Boolean) $weekdays.get(initDate.getDayOfWeek() - 1)).booleanValue()) {
  315 + ScheduleResult_output ro = new ScheduleResult_output();
  316 + ro.setRuleId($ruleId);
  317 + ro.setSd(initDate);
  318 + ro.setEmployeeConfigId($ruleData.getEmployeeConfigIds().get(i));
  319 + ro.setCarConfigId($ruleData.getCarConfigId());
  320 + scheduleResult_outputs.add(ro);
  321 +
  322 + i = (i + 1) % $rangesize;
  323 + }
  324 +
  325 + initDate = initDate.plusDays(1);
  326 + }
  327 +
  328 + loop_employee_result clgr = new loop_employee_result();
  329 + clgr.setRuleId($ruleId);
  330 + clgr.setEo_list(scheduleResult_outputs);
  331 +
  332 + log.info(String.valueOf(scheduleResult_outputs.size()));
  333 +
  334 + insert(clgr);
  335 +end
  336 +
  337 +//------------------------- 第四阶段、范围组循环计算 ----------------------------//
  338 +
  339 +global ScheduleResults_output scheduleResult;
  340 +
  341 +rule "output"
  342 + when
  343 + loop_guideboard_result(
  344 + go_list.size() > 0,
  345 + $ruleId : ruleId, $go_list : go_list
  346 + )
  347 + loop_employee_result(
  348 + ruleId == $ruleId,
  349 + eo_list.size() == $go_list.size(),
  350 + $eo_list : eo_list
  351 + )
  352 + then
  353 + for (int i = 0; i < $go_list.size(); i++) {
  354 + ScheduleResult_output go = (ScheduleResult_output) $go_list.get(i);
  355 + ScheduleResult_output eo = (ScheduleResult_output) $eo_list.get(i);
  356 + go.setEmployeeConfigId(eo.getEmployeeConfigId());
  357 + scheduleResult.getResults().add(go);
  358 + }
  359 +
  360 +end
  361 +
  362 +
  363 +
  364 +
  365 +
  366 +
  367 +
  368 +
  369 +
  370 +
  371 +
  372 +
  373 +
  374 +
  375 +
  376 +