Commit 65d2e6478bf4a8d2122b048a615cf00f028fc4ea
1 parent
ae363739
update
Showing
5 changed files
with
83 additions
and
37 deletions
src/main/java/com/bsth/service/schedule/rules/strategy/IStrategyImpl.java
| @@ -117,7 +117,7 @@ public class IStrategyImpl implements IStrategy { | @@ -117,7 +117,7 @@ public class IStrategyImpl implements IStrategy { | ||
| 117 | session.setGlobal("results", ttInfoResults_output); | 117 | session.setGlobal("results", ttInfoResults_output); |
| 118 | 118 | ||
| 119 | TTInfoCalcuParam_input ttInfoCalcuParam_input = new TTInfoCalcuParam_input( | 119 | TTInfoCalcuParam_input ttInfoCalcuParam_input = new TTInfoCalcuParam_input( |
| 120 | - new DateTime(fromDate), new DateTime(toDate)); | 120 | + new DateTime(fromDate), new DateTime(toDate), String.valueOf(xlId)); |
| 121 | session.insert(ttInfoCalcuParam_input); | 121 | session.insert(ttInfoCalcuParam_input); |
| 122 | for (TTInfo ttInfo : ttInfos) { | 122 | for (TTInfo ttInfo : ttInfos) { |
| 123 | TTInfo_input ttInfo_input = new TTInfo_input(ttInfo); | 123 | TTInfo_input ttInfo_input = new TTInfo_input(ttInfo); |
src/main/java/com/bsth/service/schedule/rules/ttinfo/TTInfoCalcuParam_input.java
| @@ -10,12 +10,15 @@ public class TTInfoCalcuParam_input { | @@ -10,12 +10,15 @@ public class TTInfoCalcuParam_input { | ||
| 10 | private DateTime fromDate; | 10 | private DateTime fromDate; |
| 11 | /** 结束计算日期 */ | 11 | /** 结束计算日期 */ |
| 12 | private DateTime toDate; | 12 | private DateTime toDate; |
| 13 | + /** 线路Id */ | ||
| 14 | + private String xlId; | ||
| 13 | 15 | ||
| 14 | public TTInfoCalcuParam_input() {} | 16 | public TTInfoCalcuParam_input() {} |
| 15 | 17 | ||
| 16 | - public TTInfoCalcuParam_input(DateTime fromDate, DateTime toDate) { | 18 | + public TTInfoCalcuParam_input(DateTime fromDate, DateTime toDate, String xlId) { |
| 17 | this.fromDate = fromDate; | 19 | this.fromDate = fromDate; |
| 18 | this.toDate = toDate; | 20 | this.toDate = toDate; |
| 21 | + this.xlId = xlId; | ||
| 19 | } | 22 | } |
| 20 | 23 | ||
| 21 | public DateTime getFromDate() { | 24 | public DateTime getFromDate() { |
| @@ -33,4 +36,12 @@ public class TTInfoCalcuParam_input { | @@ -33,4 +36,12 @@ public class TTInfoCalcuParam_input { | ||
| 33 | public void setToDate(DateTime toDate) { | 36 | public void setToDate(DateTime toDate) { |
| 34 | this.toDate = toDate; | 37 | this.toDate = toDate; |
| 35 | } | 38 | } |
| 39 | + | ||
| 40 | + public String getXlId() { | ||
| 41 | + return xlId; | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + public void setXlId(String xlId) { | ||
| 45 | + this.xlId = xlId; | ||
| 46 | + } | ||
| 36 | } | 47 | } |
src/main/java/com/bsth/service/schedule/rules/ttinfo/TTInfo_input.java
| @@ -10,7 +10,7 @@ import java.util.List; | @@ -10,7 +10,7 @@ import java.util.List; | ||
| 10 | /** | 10 | /** |
| 11 | * 时刻表_输入 | 11 | * 时刻表_输入 |
| 12 | */ | 12 | */ |
| 13 | -public class TTInfo_input { | 13 | +public class TTInfo_input implements Comparable<TTInfo_input> { |
| 14 | /** 时刻表id */ | 14 | /** 时刻表id */ |
| 15 | private String ttInfoId; | 15 | private String ttInfoId; |
| 16 | /** 线路Id */ | 16 | /** 线路Id */ |
| @@ -30,6 +30,15 @@ public class TTInfo_input { | @@ -30,6 +30,15 @@ public class TTInfo_input { | ||
| 30 | 30 | ||
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | + @Override | ||
| 34 | + public int compareTo(TTInfo_input ttInfo_input) { | ||
| 35 | + if (ttInfo_input != null) { | ||
| 36 | + if (ttInfo_input.updateDate != null && this.updateDate != null) | ||
| 37 | + return - this.updateDate.compareTo(ttInfo_input.updateDate); | ||
| 38 | + } | ||
| 39 | + return -1; | ||
| 40 | + } | ||
| 41 | + | ||
| 33 | public TTInfo_input(TTInfo ttInfo) { | 42 | public TTInfo_input(TTInfo ttInfo) { |
| 34 | this.ttInfoId = String.valueOf(ttInfo.getId()); | 43 | this.ttInfoId = String.valueOf(ttInfo.getId()); |
| 35 | this.xlId = String.valueOf(ttInfo.getXl().getId()); | 44 | this.xlId = String.valueOf(ttInfo.getXl().getId()); |
src/main/resources/rules/ttinfo.drl
| @@ -29,11 +29,12 @@ declare Calcu_days_result | @@ -29,11 +29,12 @@ declare Calcu_days_result | ||
| 29 | calcu_days : Integer // 总共需要计算的天数 | 29 | calcu_days : Integer // 总共需要计算的天数 |
| 30 | calcu_start_date : DateTime // 开始计算日期 | 30 | calcu_start_date : DateTime // 开始计算日期 |
| 31 | calcu_end_date : DateTime // 结束计算日期 | 31 | calcu_end_date : DateTime // 结束计算日期 |
| 32 | + xlId : String // 线路Id | ||
| 32 | end | 33 | end |
| 33 | 34 | ||
| 34 | rule "calcu_days" | 35 | rule "calcu_days" |
| 35 | when | 36 | when |
| 36 | - TTInfoCalcuParam_input($fromDate : fromDate, $toDate : toDate, $fromDate.isBefore($toDate)) | 37 | + TTInfoCalcuParam_input($fromDate : fromDate, $toDate : toDate, $fromDate.isBefore($toDate), $xlId : xlId) |
| 37 | then | 38 | then |
| 38 | // 构造Calcu_days_result对象,进行下一阶段计算 | 39 | // 构造Calcu_days_result对象,进行下一阶段计算 |
| 39 | Calcu_days_result cdr = new Calcu_days_result(); | 40 | Calcu_days_result cdr = new Calcu_days_result(); |
| @@ -45,8 +46,9 @@ rule "calcu_days" | @@ -45,8 +46,9 @@ rule "calcu_days" | ||
| 45 | cdr.setCalcu_weekday($fromDate.getDayOfWeek()); | 46 | cdr.setCalcu_weekday($fromDate.getDayOfWeek()); |
| 46 | cdr.setCalcu_start_date($fromDate); | 47 | cdr.setCalcu_start_date($fromDate); |
| 47 | cdr.setCalcu_end_date(($toDate)); | 48 | cdr.setCalcu_end_date(($toDate)); |
| 49 | + cdr.setXlId($xlId); | ||
| 48 | 50 | ||
| 49 | - log.info("总共塑腰计算的天数 calcu_days={} 之后的计算从第1天开始 ", p.getDays() + 1); | 51 | + log.info("总共需要计算的天数 calcu_days={} 之后的计算从第1天开始 ", p.getDays() + 1); |
| 50 | 52 | ||
| 51 | insert(cdr); // 插入fact数据,进入下一个阶段 | 53 | insert(cdr); // 插入fact数据,进入下一个阶段 |
| 52 | end | 54 | end |
| @@ -54,36 +56,37 @@ end | @@ -54,36 +56,37 @@ end | ||
| 54 | //----------------- 第二阶段、判定时刻表是否启用 ----------------// | 56 | //----------------- 第二阶段、判定时刻表是否启用 ----------------// |
| 55 | 57 | ||
| 56 | declare Calcu_ttinfo_enable_result | 58 | declare Calcu_ttinfo_enable_result |
| 57 | - xlid : String // 线路id | ||
| 58 | - ttid : String // 时刻表id | 59 | + xlId : String // 线路id |
| 60 | + ttInfo_input_list : ArrayList // 可用时刻表列表 | ||
| 59 | calcu_date : DateTime // 计算日期 | 61 | calcu_date : DateTime // 计算日期 |
| 60 | end | 62 | end |
| 61 | 63 | ||
| 62 | rule "calcu_ttinfo_enable" | 64 | rule "calcu_ttinfo_enable" |
| 63 | salience 900 | 65 | salience 900 |
| 64 | when | 66 | when |
| 65 | - $calcu_days_result : Calcu_days_result($calcu_date : calcu_date, calcu_day <= calcu_days) | ||
| 66 | - $tTInfo_input : TTInfo_input($xlid : xlId, $ttid : ttInfoId, isEnable == true) | 67 | + $calcu_days_result : Calcu_days_result($calcu_date : calcu_date, calcu_day <= calcu_days, $xlId : xlId) |
| 68 | + $ttInfo_input_list : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlId, isEnable == true)) | ||
| 67 | then | 69 | then |
| 68 | // 构造Calcu_ttinfo_enable_result对象,进行下一步计算 | 70 | // 构造Calcu_ttinfo_enable_result对象,进行下一步计算 |
| 69 | Calcu_ttinfo_enable_result cter = new Calcu_ttinfo_enable_result(); | 71 | Calcu_ttinfo_enable_result cter = new Calcu_ttinfo_enable_result(); |
| 70 | - cter.setXlid($xlid); | ||
| 71 | - cter.setTtid($ttid); | 72 | + cter.setXlId($xlId); |
| 73 | + cter.setTtInfo_input_list($ttInfo_input_list); | ||
| 72 | cter.setCalcu_date($calcu_date); | 74 | cter.setCalcu_date($calcu_date); |
| 73 | 75 | ||
| 74 | - log.info("启用的时刻表:xlid={} ttid={} 计算日期={}", $xlid, $ttid, $calcu_date); | 76 | + log.info("启用的时刻表:xlId={} 时刻表个数={}", $xlId, $ttInfo_input_list.size()); |
| 77 | + | ||
| 78 | + insert (cter); | ||
| 75 | 79 | ||
| 76 | - insert(cter); | ||
| 77 | end | 80 | end |
| 78 | 81 | ||
| 79 | -//----------------- 第三阶段 -------------------// | 82 | +//----------------- 第三阶段、时刻表的日期匹配 -------------------// |
| 80 | 83 | ||
| 81 | -rule "calcu_ttinfo_special_day" | 84 | +rule "calcu_ttinfo_special_day" // 特殊日期匹配 |
| 82 | salience 800 | 85 | salience 800 |
| 83 | when | 86 | when |
| 84 | - $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlid : xlid, $calcu_date : calcu_date) | ||
| 85 | - $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, $calcu_day : calcu_day) | ||
| 86 | - $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlid, isEnable == true, specialDays contains $calcu_date)) | 87 | + $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list) |
| 88 | + $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day) | ||
| 89 | + $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays contains $calcu_date) from $ttInfo_input_list) | ||
| 87 | then | 90 | then |
| 88 | // 更新Calcu_days_result对象 | 91 | // 更新Calcu_days_result对象 |
| 89 | int new_calcu_day = $calcu_day + 1; | 92 | int new_calcu_day = $calcu_day + 1; |
| @@ -92,20 +95,21 @@ rule "calcu_ttinfo_special_day" | @@ -92,20 +95,21 @@ rule "calcu_ttinfo_special_day" | ||
| 92 | $calcu_days_result.setCalcu_date(new_calcu_date); | 95 | $calcu_days_result.setCalcu_date(new_calcu_date); |
| 93 | $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek()); | 96 | $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek()); |
| 94 | 97 | ||
| 95 | - log.info("启用特殊日期时刻表:xlid={} 时刻表个数={} 特殊日期={}", $xlid, $ttinfolist.size(), $calcu_date); | 98 | + log.info("启用特殊日期时刻表:xlId={} 时刻表个数={} 特殊日期={}", $xlId, $ttinfolist.size(), $calcu_date); |
| 96 | 99 | ||
| 97 | - // result输出 | ||
| 98 | - results.addXlTTInfos($xlid, $calcu_date, $ttinfolist); | 100 | + // $ttinfolist按时间倒排序,result输出 |
| 101 | + Collections.sort($ttinfolist); | ||
| 102 | + results.addXlTTInfos($xlId, $calcu_date, $ttinfolist); | ||
| 99 | 103 | ||
| 100 | update($calcu_days_result); | 104 | update($calcu_days_result); |
| 101 | end | 105 | end |
| 102 | 106 | ||
| 103 | -rule "calcu_ttinfo_normal_day" | 107 | +rule "calcu_ttinfo_normal_day" // 平日匹配 |
| 104 | salience 700 | 108 | salience 700 |
| 105 | when | 109 | when |
| 106 | - $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlid : xlid, $calcu_date : calcu_date) | ||
| 107 | - $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday) | ||
| 108 | - $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlid, isEnable == true, specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == true)) | 110 | + $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list) |
| 111 | + $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday) | ||
| 112 | + $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == true) from $ttInfo_input_list) | ||
| 109 | then | 113 | then |
| 110 | // 更新Calcu_days_result对象 | 114 | // 更新Calcu_days_result对象 |
| 111 | int new_calcu_day = $calcu_day + 1; | 115 | int new_calcu_day = $calcu_day + 1; |
| @@ -114,20 +118,21 @@ rule "calcu_ttinfo_normal_day" | @@ -114,20 +118,21 @@ rule "calcu_ttinfo_normal_day" | ||
| 114 | $calcu_days_result.setCalcu_date(new_calcu_date); | 118 | $calcu_days_result.setCalcu_date(new_calcu_date); |
| 115 | $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek()); | 119 | $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek()); |
| 116 | 120 | ||
| 117 | - log.info("启用常规日期时刻表:xlid={} 时刻表个数={} 常规日期={} 星期几={}", $xlid, $ttinfolist.size(), $calcu_date, $calcu_weekday); | 121 | + log.info("启用常规日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday); |
| 118 | 122 | ||
| 119 | - // result输出 | ||
| 120 | - results.addXlTTInfos($xlid, $calcu_date, $ttinfolist); | 123 | + // $ttinfolist按时间倒排序,result输出 |
| 124 | + Collections.sort($ttinfolist); | ||
| 125 | + results.addXlTTInfos($xlId, $calcu_date, $ttinfolist); | ||
| 121 | 126 | ||
| 122 | update($calcu_days_result); | 127 | update($calcu_days_result); |
| 123 | end | 128 | end |
| 124 | 129 | ||
| 125 | -rule "calcu_ttinfo_other_day" | 130 | +rule "calcu_ttinfo_other_day" // 都没有的情况下,匹配 |
| 126 | salience 500 | 131 | salience 500 |
| 127 | when | 132 | when |
| 128 | - $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlid : xlid, $calcu_date : calcu_date) | ||
| 129 | - $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday) | ||
| 130 | - $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlid, isEnable == true, specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == false)) | 133 | + $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list) |
| 134 | + $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday) | ||
| 135 | + $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == false) from $ttInfo_input_list) | ||
| 131 | then | 136 | then |
| 132 | // 更新Calcu_days_result对象 | 137 | // 更新Calcu_days_result对象 |
| 133 | int new_calcu_day = $calcu_day + 1; | 138 | int new_calcu_day = $calcu_day + 1; |
| @@ -136,10 +141,11 @@ rule "calcu_ttinfo_other_day" | @@ -136,10 +141,11 @@ rule "calcu_ttinfo_other_day" | ||
| 136 | $calcu_days_result.setCalcu_date(new_calcu_date); | 141 | $calcu_days_result.setCalcu_date(new_calcu_date); |
| 137 | $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek()); | 142 | $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek()); |
| 138 | 143 | ||
| 139 | - log.info("启用默认日期时刻表:xlid={} 时刻表个数={} 常规日期={} 星期几={}", $xlid, $ttinfolist.size(), $calcu_date, $calcu_weekday); | 144 | + log.info("启用默认日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday); |
| 140 | 145 | ||
| 141 | - // result输出 | ||
| 142 | - results.addXlTTInfos($xlid, $calcu_date, $ttinfolist); | 146 | + // $ttinfolist按时间倒排序,result输出 |
| 147 | + Collections.sort($ttinfolist); | ||
| 148 | + results.addXlTTInfos($xlId, $calcu_date, $ttinfolist); | ||
| 143 | 149 | ||
| 144 | update($calcu_days_result); | 150 | update($calcu_days_result); |
| 145 | 151 |
src/test/java/com/bsth/service/schedule/rules/DroolsRulesTest.java
| @@ -75,9 +75,11 @@ public class DroolsRulesTest { | @@ -75,9 +75,11 @@ public class DroolsRulesTest { | ||
| 75 | // 2、创建fact对象 | 75 | // 2、创建fact对象 |
| 76 | TTInfoCalcuParam_input ttInfoCalcuParam_input = new TTInfoCalcuParam_input( | 76 | TTInfoCalcuParam_input ttInfoCalcuParam_input = new TTInfoCalcuParam_input( |
| 77 | new DateTime(2016, 8, 1, 0, 0), | 77 | new DateTime(2016, 8, 1, 0, 0), |
| 78 | - new DateTime(2016, 8, 10, 0, 0) | 78 | + new DateTime(2016, 8, 10, 0, 0), |
| 79 | + "1" | ||
| 79 | ); | 80 | ); |
| 80 | 81 | ||
| 82 | + | ||
| 81 | TTInfo_input ttInfo_input1 = new TTInfo_input(); | 83 | TTInfo_input ttInfo_input1 = new TTInfo_input(); |
| 82 | ttInfo_input1.setTtInfoId("1"); | 84 | ttInfo_input1.setTtInfoId("1"); |
| 83 | ttInfo_input1.setXlId("1"); | 85 | ttInfo_input1.setXlId("1"); |
| @@ -87,9 +89,25 @@ public class DroolsRulesTest { | @@ -87,9 +89,25 @@ public class DroolsRulesTest { | ||
| 87 | ttInfo_input1.setIsEnable(true); | 89 | ttInfo_input1.setIsEnable(true); |
| 88 | ttInfo_input1.setQyDate(new DateTime(2016, 1, 1, 0, 0)); | 90 | ttInfo_input1.setQyDate(new DateTime(2016, 1, 1, 0, 0)); |
| 89 | 91 | ||
| 92 | + TTInfo_input ttInfo_input1_2 = new TTInfo_input(); | ||
| 93 | + ttInfo_input1_2.setTtInfoId("2"); | ||
| 94 | + ttInfo_input1_2.setXlId("1"); | ||
| 95 | + ttInfo_input1_2.setWeekdays(Arrays.asList(true, false, false, false, false, true, false)); | ||
| 96 | + ttInfo_input1_2.getSpecialDays().add(new DateTime(2016, 8, 11, 0, 0)); | ||
| 97 | + ttInfo_input1_2.setUpdateDate(new DateTime(2015, 2, 1, 0, 0)); | ||
| 98 | + ttInfo_input1_2.setIsEnable(true); | ||
| 99 | + ttInfo_input1_2.setQyDate(new DateTime(2016, 1, 1, 0, 0)); | ||
| 100 | + | ||
| 101 | + | ||
| 102 | + TTInfoCalcuParam_input ttInfoCalcuParam_inpu2 = new TTInfoCalcuParam_input( | ||
| 103 | + new DateTime(2016, 8, 1, 0, 0), | ||
| 104 | + new DateTime(2016, 8, 10, 0, 0), | ||
| 105 | + "2" | ||
| 106 | + ); | ||
| 107 | + | ||
| 90 | TTInfo_input ttInfo_input2 = new TTInfo_input(); | 108 | TTInfo_input ttInfo_input2 = new TTInfo_input(); |
| 91 | ttInfo_input2.setTtInfoId("2"); | 109 | ttInfo_input2.setTtInfoId("2"); |
| 92 | - ttInfo_input2.setXlId("1"); | 110 | + ttInfo_input2.setXlId("2"); |
| 93 | ttInfo_input2.setWeekdays(Arrays.asList(true, false, false, false, false, true, false)); | 111 | ttInfo_input2.setWeekdays(Arrays.asList(true, false, false, false, false, true, false)); |
| 94 | ttInfo_input2.getSpecialDays().add(new DateTime(2016, 8, 11, 0, 0)); | 112 | ttInfo_input2.getSpecialDays().add(new DateTime(2016, 8, 11, 0, 0)); |
| 95 | ttInfo_input2.setUpdateDate(new DateTime(2016, 1, 1, 0, 0)); | 113 | ttInfo_input2.setUpdateDate(new DateTime(2016, 1, 1, 0, 0)); |
| @@ -98,6 +116,8 @@ public class DroolsRulesTest { | @@ -98,6 +116,8 @@ public class DroolsRulesTest { | ||
| 98 | 116 | ||
| 99 | session.insert(ttInfoCalcuParam_input); | 117 | session.insert(ttInfoCalcuParam_input); |
| 100 | session.insert(ttInfo_input1); | 118 | session.insert(ttInfo_input1); |
| 119 | + session.insert(ttInfo_input1_2); | ||
| 120 | + session.insert(ttInfoCalcuParam_inpu2); | ||
| 101 | session.insert(ttInfo_input2); | 121 | session.insert(ttInfo_input2); |
| 102 | 122 | ||
| 103 | 123 |