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 | 117 | session.setGlobal("results", ttInfoResults_output); |
| 118 | 118 | |
| 119 | 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 | 121 | session.insert(ttInfoCalcuParam_input); |
| 122 | 122 | for (TTInfo ttInfo : ttInfos) { |
| 123 | 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 | 10 | private DateTime fromDate; |
| 11 | 11 | /** 结束计算日期 */ |
| 12 | 12 | private DateTime toDate; |
| 13 | + /** 线路Id */ | |
| 14 | + private String xlId; | |
| 13 | 15 | |
| 14 | 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 | 19 | this.fromDate = fromDate; |
| 18 | 20 | this.toDate = toDate; |
| 21 | + this.xlId = xlId; | |
| 19 | 22 | } |
| 20 | 23 | |
| 21 | 24 | public DateTime getFromDate() { |
| ... | ... | @@ -33,4 +36,12 @@ public class TTInfoCalcuParam_input { |
| 33 | 36 | public void setToDate(DateTime toDate) { |
| 34 | 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 | 10 | /** |
| 11 | 11 | * 时刻表_输入 |
| 12 | 12 | */ |
| 13 | -public class TTInfo_input { | |
| 13 | +public class TTInfo_input implements Comparable<TTInfo_input> { | |
| 14 | 14 | /** 时刻表id */ |
| 15 | 15 | private String ttInfoId; |
| 16 | 16 | /** 线路Id */ |
| ... | ... | @@ -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 | 42 | public TTInfo_input(TTInfo ttInfo) { |
| 34 | 43 | this.ttInfoId = String.valueOf(ttInfo.getId()); |
| 35 | 44 | this.xlId = String.valueOf(ttInfo.getXl().getId()); | ... | ... |
src/main/resources/rules/ttinfo.drl
| ... | ... | @@ -29,11 +29,12 @@ declare Calcu_days_result |
| 29 | 29 | calcu_days : Integer // 总共需要计算的天数 |
| 30 | 30 | calcu_start_date : DateTime // 开始计算日期 |
| 31 | 31 | calcu_end_date : DateTime // 结束计算日期 |
| 32 | + xlId : String // 线路Id | |
| 32 | 33 | end |
| 33 | 34 | |
| 34 | 35 | rule "calcu_days" |
| 35 | 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 | 38 | then |
| 38 | 39 | // 构造Calcu_days_result对象,进行下一阶段计算 |
| 39 | 40 | Calcu_days_result cdr = new Calcu_days_result(); |
| ... | ... | @@ -45,8 +46,9 @@ rule "calcu_days" |
| 45 | 46 | cdr.setCalcu_weekday($fromDate.getDayOfWeek()); |
| 46 | 47 | cdr.setCalcu_start_date($fromDate); |
| 47 | 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 | 53 | insert(cdr); // 插入fact数据,进入下一个阶段 |
| 52 | 54 | end |
| ... | ... | @@ -54,36 +56,37 @@ end |
| 54 | 56 | //----------------- 第二阶段、判定时刻表是否启用 ----------------// |
| 55 | 57 | |
| 56 | 58 | declare Calcu_ttinfo_enable_result |
| 57 | - xlid : String // 线路id | |
| 58 | - ttid : String // 时刻表id | |
| 59 | + xlId : String // 线路id | |
| 60 | + ttInfo_input_list : ArrayList // 可用时刻表列表 | |
| 59 | 61 | calcu_date : DateTime // 计算日期 |
| 60 | 62 | end |
| 61 | 63 | |
| 62 | 64 | rule "calcu_ttinfo_enable" |
| 63 | 65 | salience 900 |
| 64 | 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 | 69 | then |
| 68 | 70 | // 构造Calcu_ttinfo_enable_result对象,进行下一步计算 |
| 69 | 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 | 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 | 80 | end |
| 78 | 81 | |
| 79 | -//----------------- 第三阶段 -------------------// | |
| 82 | +//----------------- 第三阶段、时刻表的日期匹配 -------------------// | |
| 80 | 83 | |
| 81 | -rule "calcu_ttinfo_special_day" | |
| 84 | +rule "calcu_ttinfo_special_day" // 特殊日期匹配 | |
| 82 | 85 | salience 800 |
| 83 | 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 | 90 | then |
| 88 | 91 | // 更新Calcu_days_result对象 |
| 89 | 92 | int new_calcu_day = $calcu_day + 1; |
| ... | ... | @@ -92,20 +95,21 @@ rule "calcu_ttinfo_special_day" |
| 92 | 95 | $calcu_days_result.setCalcu_date(new_calcu_date); |
| 93 | 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 | 104 | update($calcu_days_result); |
| 101 | 105 | end |
| 102 | 106 | |
| 103 | -rule "calcu_ttinfo_normal_day" | |
| 107 | +rule "calcu_ttinfo_normal_day" // 平日匹配 | |
| 104 | 108 | salience 700 |
| 105 | 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 | 113 | then |
| 110 | 114 | // 更新Calcu_days_result对象 |
| 111 | 115 | int new_calcu_day = $calcu_day + 1; |
| ... | ... | @@ -114,20 +118,21 @@ rule "calcu_ttinfo_normal_day" |
| 114 | 118 | $calcu_days_result.setCalcu_date(new_calcu_date); |
| 115 | 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 | 127 | update($calcu_days_result); |
| 123 | 128 | end |
| 124 | 129 | |
| 125 | -rule "calcu_ttinfo_other_day" | |
| 130 | +rule "calcu_ttinfo_other_day" // 都没有的情况下,匹配 | |
| 126 | 131 | salience 500 |
| 127 | 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 | 136 | then |
| 132 | 137 | // 更新Calcu_days_result对象 |
| 133 | 138 | int new_calcu_day = $calcu_day + 1; |
| ... | ... | @@ -136,10 +141,11 @@ rule "calcu_ttinfo_other_day" |
| 136 | 141 | $calcu_days_result.setCalcu_date(new_calcu_date); |
| 137 | 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 | 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 | 75 | // 2、创建fact对象 |
| 76 | 76 | TTInfoCalcuParam_input ttInfoCalcuParam_input = new TTInfoCalcuParam_input( |
| 77 | 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 | 83 | TTInfo_input ttInfo_input1 = new TTInfo_input(); |
| 82 | 84 | ttInfo_input1.setTtInfoId("1"); |
| 83 | 85 | ttInfo_input1.setXlId("1"); |
| ... | ... | @@ -87,9 +89,25 @@ public class DroolsRulesTest { |
| 87 | 89 | ttInfo_input1.setIsEnable(true); |
| 88 | 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 | 108 | TTInfo_input ttInfo_input2 = new TTInfo_input(); |
| 91 | 109 | ttInfo_input2.setTtInfoId("2"); |
| 92 | - ttInfo_input2.setXlId("1"); | |
| 110 | + ttInfo_input2.setXlId("2"); | |
| 93 | 111 | ttInfo_input2.setWeekdays(Arrays.asList(true, false, false, false, false, true, false)); |
| 94 | 112 | ttInfo_input2.getSpecialDays().add(new DateTime(2016, 8, 11, 0, 0)); |
| 95 | 113 | ttInfo_input2.setUpdateDate(new DateTime(2016, 1, 1, 0, 0)); |
| ... | ... | @@ -98,6 +116,8 @@ public class DroolsRulesTest { |
| 98 | 116 | |
| 99 | 117 | session.insert(ttInfoCalcuParam_input); |
| 100 | 118 | session.insert(ttInfo_input1); |
| 119 | + session.insert(ttInfo_input1_2); | |
| 120 | + session.insert(ttInfoCalcuParam_inpu2); | |
| 101 | 121 | session.insert(ttInfo_input2); |
| 102 | 122 | |
| 103 | 123 | ... | ... |