Commit ffabc22401a0ef0ef942b72b5dde984ba53e52d7

Authored by 徐烜
1 parent 4e501eed

Update

src/main/java/com/bsth/service/schedule/impl/SchedulePlanServiceImpl.java
... ... @@ -15,6 +15,7 @@ import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;
15 15 import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
16 16 import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;
17 17 import com.bsth.service.schedule.rules.strategy.IStrategy;
  18 +import com.bsth.service.schedule.rules.ttinfo.LpInfoResults_output;
18 19 import com.bsth.service.schedule.rules.ttinfo.TTInfoCalcuParam_input;
19 20 import com.bsth.service.schedule.rules.ttinfo.TTInfoResults_output;
20 21 import com.bsth.service.schedule.rules.ttinfo.TTInfo_input;
... ... @@ -156,6 +157,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
156 157 );
157 158 // 规则输出数据
158 159 TTInfoResults_output ttInfoResults_output = new TTInfoResults_output();
  160 + LpInfoResults_output lpInfoResults_output = new LpInfoResults_output();
159 161  
160 162 // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
161 163 // 创建session,内部配置的是stateful
... ... @@ -163,8 +165,11 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
163 165  
164 166 // 设置gloable对象,在drl中通过别名使用
165 167 session.setGlobal("results", ttInfoResults_output);
  168 + session.setGlobal("lpInfoResults_output", lpInfoResults_output);
166 169 session.setGlobal("log", logger); // 设置日志
167 170  
  171 + session.setGlobal("tTInfoDetailService", ttInfoDetailService);
  172 +
168 173 // 载入数据
169 174 session.insert(ttInfoCalcuParam_input);
170 175 for (TTInfo ttInfo : ttInfos) {
... ... @@ -225,18 +230,18 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
225 230  
226 231 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
227 232 public SchedulePlan save2(SchedulePlan schedulePlan) {
228   - // 1、循环规则计算输出
229   - ScheduleResults_output scheduleResults_output = loopRuleOutput(schedulePlan);
  233 +// // 1、循环规则计算输出
  234 +// ScheduleResults_output scheduleResults_output = loopRuleOutput(schedulePlan);
230 235 // 2、时刻表选择
231 236 TTInfoResults_output ttInfoResults_output = ttInfoOutput(schedulePlan);
232   - // 3、计划输出
233   - PlanResult planResult = planResultOutput(schedulePlan, scheduleResults_output, ttInfoResults_output);
234   -
235   - schedulePlan.getSchedulePlanInfoList().addAll(planResult.getSchedulePlanInfos());
236   - schedulePlan.setTtInfoId("todo"); // TODO:待修正
237   - schedulePlan.setTtInfoNames("todo"); // TODO:待修正
238   -
239   - super.save(schedulePlan);
  237 +// // 3、计划输出
  238 +// PlanResult planResult = planResultOutput(schedulePlan, scheduleResults_output, ttInfoResults_output);
  239 +//
  240 +// schedulePlan.getSchedulePlanInfoList().addAll(planResult.getSchedulePlanInfos());
  241 +// schedulePlan.setTtInfoId("todo"); // TODO:待修正
  242 +// schedulePlan.setTtInfoNames("todo"); // TODO:待修正
  243 +//
  244 +// super.save(schedulePlan);
240 245  
241 246 return new SchedulePlan();
242 247 }
... ...
src/main/java/com/bsth/service/schedule/rules/ttinfo/LpInfoResult_output.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.ttinfo;
  2 +
  3 +import org.joda.time.DateTime;
  4 +
  5 +/**
  6 + * 每日路爬信息。
  7 + */
  8 +public class LpInfoResult_output {
  9 + /** 具体日期 */
  10 + private DateTime dateTime;
  11 + /** 路牌Id */
  12 + private String lpId;
  13 + /** 线路Id */
  14 + private String xlId;
  15 + /** 时刻表Id */
  16 + private String ttInfoId;
  17 +
  18 + public DateTime getDateTime() {
  19 + return dateTime;
  20 + }
  21 +
  22 + public void setDateTime(DateTime dateTime) {
  23 + this.dateTime = dateTime;
  24 + }
  25 +
  26 + public String getLpId() {
  27 + return lpId;
  28 + }
  29 +
  30 + public void setLpId(String lpId) {
  31 + this.lpId = lpId;
  32 + }
  33 +
  34 + public String getXlId() {
  35 + return xlId;
  36 + }
  37 +
  38 + public void setXlId(String xlId) {
  39 + this.xlId = xlId;
  40 + }
  41 +
  42 + public String getTtInfoId() {
  43 + return ttInfoId;
  44 + }
  45 +
  46 + public void setTtInfoId(String ttInfoId) {
  47 + this.ttInfoId = ttInfoId;
  48 + }
  49 +}
... ...
src/main/java/com/bsth/service/schedule/rules/ttinfo/LpInfoResultsFunction.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.ttinfo;
  2 +
  3 +import com.bsth.entity.schedule.TTInfoDetail;
  4 +import org.kie.api.runtime.rule.AccumulateFunction;
  5 +
  6 +import java.io.*;
  7 +import java.util.ArrayList;
  8 +import java.util.HashMap;
  9 +import java.util.List;
  10 +import java.util.Map;
  11 +
  12 +/**
  13 + * 路牌信息统计函数。
  14 + */
  15 +public class LpInfoResultsFunction implements AccumulateFunction {
  16 + @Override
  17 + public void writeExternal(ObjectOutput out) throws IOException {
  18 +
  19 + }
  20 +
  21 + @Override
  22 + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
  23 +
  24 + }
  25 +
  26 + protected static class LpInfoResultsData implements Externalizable {
  27 + public List<LpInfoResult_output> lpInfoResult_outputs = new ArrayList<>();
  28 + public Map<Long, LpInfoResult_output> lpInfoResult_outputMap = new HashMap<>();
  29 + public TTInfoDetail ttInfoDetail;
  30 +
  31 + public LpInfoResultsData() {}
  32 +
  33 + @Override
  34 + public void writeExternal(ObjectOutput out) throws IOException {
  35 + out.writeObject(lpInfoResult_outputs);
  36 + out.writeObject(ttInfoDetail);
  37 + }
  38 +
  39 + @Override
  40 + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
  41 + lpInfoResult_outputs = (List<LpInfoResult_output>) in.readObject();
  42 + ttInfoDetail = (TTInfoDetail) in.readObject();
  43 + }
  44 + }
  45 +
  46 + @Override
  47 + public Serializable createContext() {
  48 + return new LpInfoResultsData();
  49 + }
  50 +
  51 + @Override
  52 + public void init(Serializable context) throws Exception {
  53 + LpInfoResultsData lpInfoResultsData = (LpInfoResultsData) context;
  54 + lpInfoResultsData.lpInfoResult_outputs = new ArrayList<>();
  55 + lpInfoResultsData.lpInfoResult_outputMap = new HashMap<>();
  56 + }
  57 +
  58 + @Override
  59 + public void accumulate(Serializable context, Object value) {
  60 + LpInfoResultsData lpInfoResultsData = (LpInfoResultsData) context;
  61 + TTInfoDetail ttInfoDetail = (TTInfoDetail) value;
  62 +
  63 + if (ttInfoDetail.getLp() != null) {
  64 + if (lpInfoResultsData.lpInfoResult_outputMap.get(ttInfoDetail.getLp().getId()) == null) {
  65 + LpInfoResult_output lpInfoResult_output = new LpInfoResult_output();
  66 + lpInfoResult_output.setLpId(String.valueOf(ttInfoDetail.getLp().getId()));
  67 + lpInfoResult_output.setXlId(String.valueOf(ttInfoDetail.getXl().getId()));
  68 + lpInfoResult_output.setTtInfoId(String.valueOf(ttInfoDetail.getTtinfo().getId()));
  69 +
  70 + lpInfoResultsData.lpInfoResult_outputMap.put(
  71 + ttInfoDetail.getLp().getId(),
  72 + lpInfoResult_output);
  73 + }
  74 + }
  75 +
  76 + lpInfoResultsData.lpInfoResult_outputs.clear();
  77 + lpInfoResultsData.lpInfoResult_outputs.addAll(
  78 + lpInfoResultsData.lpInfoResult_outputMap.values());
  79 + }
  80 +
  81 + @Override
  82 + public boolean supportsReverse() {
  83 + return true;
  84 + }
  85 +
  86 + @Override
  87 + public void reverse(Serializable context, Object value) throws Exception {
  88 + LpInfoResultsData lpInfoResultsData = (LpInfoResultsData) context;
  89 + TTInfoDetail ttInfoDetail = (TTInfoDetail) value;
  90 +
  91 + lpInfoResultsData.lpInfoResult_outputMap.remove(ttInfoDetail.getLp().getId());
  92 +
  93 + lpInfoResultsData.lpInfoResult_outputs.clear();
  94 + lpInfoResultsData.lpInfoResult_outputs.addAll(
  95 + lpInfoResultsData.lpInfoResult_outputMap.values());
  96 +
  97 + }
  98 +
  99 + @Override
  100 + public Object getResult(Serializable context) throws Exception {
  101 + LpInfoResultsData lpInfoResultsData = (LpInfoResultsData) context;
  102 + return lpInfoResultsData.lpInfoResult_outputs;
  103 + }
  104 +
  105 + @Override
  106 + public Class<?> getResultType() {
  107 + return List.class;
  108 + }
  109 +}
... ...
src/main/java/com/bsth/service/schedule/rules/ttinfo/LpInfoResults_output.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.ttinfo;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.List;
  5 +
  6 +/**
  7 + * Created by xu on 17/3/21.
  8 + */
  9 +public class LpInfoResults_output {
  10 +
  11 + private List<LpInfoResult_output> lpInfoResult_outputs = new ArrayList<>();
  12 +
  13 + public List<LpInfoResult_output> getLpInfoResult_outputs() {
  14 + return lpInfoResult_outputs;
  15 + }
  16 +
  17 + public void setLpInfoResult_outputs(List<LpInfoResult_output> lpInfoResult_outputs) {
  18 + this.lpInfoResult_outputs = lpInfoResult_outputs;
  19 + }
  20 +}
... ...
src/main/resources/rules/functions.drl
... ... @@ -2,4 +2,5 @@ package com.bsth.service.schedule;
2 2  
3 3 import accumulate com.bsth.service.schedule.rules.ttinfo2.ErrorBcCountFunction ecount;
4 4 import accumulate com.bsth.service.schedule.rules.shiftloop.GidsCountFunction gidscount;
5   -import accumulate com.bsth.service.schedule.rules.shiftloop.GidFbTimeFunction gidfbtime;
6 5 \ No newline at end of file
  6 +import accumulate com.bsth.service.schedule.rules.shiftloop.GidFbTimeFunction gidfbtime;
  7 +import accumulate com.bsth.service.schedule.rules.ttinfo.LpInfoResultsFunction lpinforesult;
7 8 \ No newline at end of file
... ...
src/main/resources/rules/ttinfo.drl
... ... @@ -7,13 +7,31 @@ import com.bsth.service.schedule.rules.ttinfo.TTInfoCalcuParam_input;
7 7 import com.bsth.service.schedule.rules.ttinfo.TTInfo_input;
8 8 import com.bsth.service.schedule.rules.ttinfo.TTInfoResult_output;
9 9 import com.bsth.service.schedule.rules.ttinfo.TTInfoResults_output;
  10 +import com.bsth.service.schedule.rules.ttinfo.LpInfoResult_output;
  11 +import com.bsth.service.schedule.rules.ttinfo.LpInfoResults_output;
10 12  
11   -import org.slf4j.Logger;
  13 +import com.bsth.service.schedule.TTInfoDetailService;
  14 +
  15 +import com.bsth.entity.schedule.TTInfo;
  16 +import com.bsth.entity.schedule.TTInfoDetail;
  17 +
  18 +import org.slf4j.Logger
12 19  
13 20 // 全局日志
14 21 global Logger log;
  22 +// service
  23 +global TTInfoDetailService tTInfoDetailService;
15 24 // return输出
16 25 global TTInfoResults_output results
  26 +global LpInfoResults_output lpInfoResults_output
  27 +
  28 +function Map ttidParams(List ttinfolist) {
  29 + // 获取第一张时刻表id
  30 + TTInfo_input ttInfo_input = (TTInfo_input) ttinfolist.get(0);
  31 + Map param = new HashMap();
  32 + param.put("ttinfo.id_eq", Long.parseLong(ttInfo_input.getTtInfoId()));
  33 + return param;
  34 +}
17 35  
18 36  
19 37 /*
... ... @@ -91,6 +109,7 @@ rule &quot;calcu_ttinfo_special_day&quot; // 特殊日期匹配
91 109 $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
92 110 $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day)
93 111 $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays contains $calcu_date) from $ttInfo_input_list)
  112 + $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailService.list(ttidParams($ttinfolist)), lpinforesult($ttd))
94 113 then
95 114 // 更新Calcu_days_result对象
96 115 int new_calcu_day = $calcu_day + 1;
... ... @@ -105,6 +124,13 @@ rule &quot;calcu_ttinfo_special_day&quot; // 特殊日期匹配
105 124 Collections.sort($ttinfolist);
106 125 results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);
107 126  
  127 + // lp输出
  128 + for (int i = 0; i < $lpInfoResults.size(); i++) {
  129 + LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
  130 + lpInfoResult_output.setDateTime($calcu_date); // 设定时间
  131 + lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
  132 + }
  133 +
108 134 update($calcu_days_result);
109 135 end
110 136  
... ... @@ -114,6 +140,7 @@ rule &quot;calcu_ttinfo_normal_day&quot; // 平日匹配
114 140 $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
115 141 $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
116 142 $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == true) from $ttInfo_input_list)
  143 + $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailService.list(ttidParams($ttinfolist)), lpinforesult($ttd))
117 144 then
118 145 // 更新Calcu_days_result对象
119 146 int new_calcu_day = $calcu_day + 1;
... ... @@ -122,12 +149,19 @@ rule &quot;calcu_ttinfo_normal_day&quot; // 平日匹配
122 149 $calcu_days_result.setCalcu_date(new_calcu_date);
123 150 $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());
124 151  
125   - log.info("启用常规日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday);
  152 + log.info("启用常规日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={} 路牌size={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday, $lpInfoResults.size());
126 153  
127 154 // $ttinfolist按时间倒排序,result输出
128 155 Collections.sort($ttinfolist);
129 156 results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);
130 157  
  158 + // lp输出
  159 + for (int i = 0; i < $lpInfoResults.size(); i++) {
  160 + LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
  161 + lpInfoResult_output.setDateTime($calcu_date); // 设定时间
  162 + lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
  163 + }
  164 +
131 165 update($calcu_days_result);
132 166 end
133 167  
... ... @@ -137,6 +171,7 @@ rule &quot;calcu_ttinfo_other_day&quot; // 都没有的情况下,匹配
137 171 $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
138 172 $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
139 173 $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == false) from $ttInfo_input_list)
  174 + $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailService.list(ttidParams($ttinfolist)), lpinforesult($ttd))
140 175 then
141 176 // 更新Calcu_days_result对象
142 177 int new_calcu_day = $calcu_day + 1;
... ... @@ -151,6 +186,13 @@ rule &quot;calcu_ttinfo_other_day&quot; // 都没有的情况下,匹配
151 186 Collections.sort($ttinfolist);
152 187 results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);
153 188  
  189 + // lp输出
  190 + for (int i = 0; i < $lpInfoResults.size(); i++) {
  191 + LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
  192 + lpInfoResult_output.setDateTime($calcu_date); // 设定时间
  193 + lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
  194 + }
  195 +
154 196 update($calcu_days_result);
155 197  
156 198 end
157 199 \ No newline at end of file
... ...