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 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 &quot;calcu_days&quot;
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 &quot;calcu_ttinfo_special_day&quot;
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 &quot;calcu_ttinfo_normal_day&quot;
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 &quot;calcu_ttinfo_other_day&quot;
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  
... ...