Commit 65d2e6478bf4a8d2122b048a615cf00f028fc4ea

Authored by 徐烜
1 parent ae363739

update

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 &quot;calcu_days&quot; @@ -45,8 +46,9 @@ rule &quot;calcu_days&quot;
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 &quot;calcu_ttinfo_special_day&quot; @@ -92,20 +95,21 @@ rule &quot;calcu_ttinfo_special_day&quot;
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 &quot;calcu_ttinfo_normal_day&quot; @@ -114,20 +118,21 @@ rule &quot;calcu_ttinfo_normal_day&quot;
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 &quot;calcu_ttinfo_other_day&quot; @@ -136,10 +141,11 @@ rule &quot;calcu_ttinfo_other_day&quot;
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