Commit 34547da307897ced161efb4a7c9bd9407d41cc88
1 parent
bbb3ad44
嘉定公交调度系统计划调度功能优化4
1、修正新增排班时的界面,可以提示时刻表冲突和空的信息
Showing
11 changed files
with
250 additions
and
106 deletions
src/main/java/com/bsth/service/schedule/SchedulePlanService.java
| 1 | package com.bsth.service.schedule; | 1 | package com.bsth.service.schedule; |
| 2 | 2 | ||
| 3 | import com.bsth.entity.schedule.SchedulePlan; | 3 | import com.bsth.entity.schedule.SchedulePlan; |
| 4 | -import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult; | ||
| 5 | -import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.Result; | ||
| 6 | -import org.springframework.web.bind.annotation.RequestParam; | 4 | +import com.bsth.service.schedule.plan.process._1_validate._1_timetable.PlanProcessValidateTimetableService; |
| 5 | +import com.bsth.service.schedule.plan.process._1_validate._2_rule.PlanProcessValidateRuleService; | ||
| 7 | 6 | ||
| 8 | import java.util.Date; | 7 | import java.util.Date; |
| 9 | import java.util.Map; | 8 | import java.util.Map; |
| @@ -28,7 +27,7 @@ public interface SchedulePlanService extends BService<SchedulePlan, Long> { | @@ -28,7 +27,7 @@ public interface SchedulePlanService extends BService<SchedulePlan, Long> { | ||
| 28 | * @param to 结束时间 | 27 | * @param to 结束时间 |
| 29 | * @return | 28 | * @return |
| 30 | */ | 29 | */ |
| 31 | - Result validateTTInfo(Integer xlid, Date from, Date to); | 30 | + PlanProcessValidateTimetableService.Result validateTTInfo(Integer xlId, Date from, Date to); |
| 32 | 31 | ||
| 33 | /** | 32 | /** |
| 34 | * 验证规则。 | 33 | * 验证规则。 |
| @@ -37,7 +36,7 @@ public interface SchedulePlanService extends BService<SchedulePlan, Long> { | @@ -37,7 +36,7 @@ public interface SchedulePlanService extends BService<SchedulePlan, Long> { | ||
| 37 | * @param to 排班计划结束时间 | 36 | * @param to 排班计划结束时间 |
| 38 | * @return | 37 | * @return |
| 39 | */ | 38 | */ |
| 40 | - ValidateRuleResult validateRule(Integer xlId, Date from, Date to); | 39 | + PlanProcessValidateRuleService.Result validateRule(Integer xlId, Date from, Date to); |
| 41 | 40 | ||
| 42 | 41 | ||
| 43 | /** | 42 | /** |
| @@ -46,4 +45,4 @@ public interface SchedulePlanService extends BService<SchedulePlan, Long> { | @@ -46,4 +45,4 @@ public interface SchedulePlanService extends BService<SchedulePlan, Long> { | ||
| 46 | * @return | 45 | * @return |
| 47 | */ | 46 | */ |
| 48 | Map<String,Object> listwest(Map map); | 47 | Map<String,Object> listwest(Map map); |
| 49 | -} | ||
| 50 | \ No newline at end of file | 48 | \ No newline at end of file |
| 49 | +} |
src/main/java/com/bsth/service/schedule/impl/SchedulePlanServiceImpl.java
| 1 | package com.bsth.service.schedule.impl; | 1 | package com.bsth.service.schedule.impl; |
| 2 | 2 | ||
| 3 | -import com.bsth.data.gpsdata_v2.entity.StationRoute; | ||
| 4 | -import com.bsth.entity.Line; | ||
| 5 | import com.bsth.entity.schedule.SchedulePlan; | 3 | import com.bsth.entity.schedule.SchedulePlan; |
| 6 | -import com.bsth.entity.schedule.TTInfo; | ||
| 7 | import com.bsth.repository.BusinessRepository; | 4 | import com.bsth.repository.BusinessRepository; |
| 8 | import com.bsth.repository.LineRepository; | 5 | import com.bsth.repository.LineRepository; |
| 9 | import com.bsth.repository.schedule.*; | 6 | import com.bsth.repository.schedule.*; |
| 10 | import com.bsth.service.schedule.SchedulePlanService; | 7 | import com.bsth.service.schedule.SchedulePlanService; |
| 11 | import com.bsth.service.schedule.exception.ScheduleException; | 8 | import com.bsth.service.schedule.exception.ScheduleException; |
| 12 | -import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult; | ||
| 13 | -import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.CalcuParam; | ||
| 14 | -import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.Result; | ||
| 15 | import com.bsth.service.schedule.impl.plan.DroolsSchedulePlan; | 9 | import com.bsth.service.schedule.impl.plan.DroolsSchedulePlan; |
| 16 | import com.bsth.service.schedule.impl.plan.ScheduleRuleService; | 10 | import com.bsth.service.schedule.impl.plan.ScheduleRuleService; |
| 11 | +import com.bsth.service.schedule.plan.process._1_validate._1_timetable.PlanProcessValidateTimetableService; | ||
| 12 | +import com.bsth.service.schedule.plan.process._1_validate._1_timetable.PlanProcessValidateTimetableServiceDroolsImpl; | ||
| 13 | +import com.bsth.service.schedule.plan.process._1_validate._2_rule.PlanProcessValidateRuleService; | ||
| 14 | +import com.bsth.service.schedule.plan.process._1_validate._2_rule.PlanProcessValidateRuleServiceDroolsImpl; | ||
| 17 | import org.joda.time.DateTime; | 15 | import org.joda.time.DateTime; |
| 18 | import org.kie.api.KieBase; | 16 | import org.kie.api.KieBase; |
| 19 | -import org.kie.api.runtime.KieSession; | ||
| 20 | import org.slf4j.Logger; | 17 | import org.slf4j.Logger; |
| 21 | import org.slf4j.LoggerFactory; | 18 | import org.slf4j.LoggerFactory; |
| 22 | import org.springframework.beans.factory.annotation.Autowired; | 19 | import org.springframework.beans.factory.annotation.Autowired; |
| @@ -27,7 +24,6 @@ import org.springframework.stereotype.Service; | @@ -27,7 +24,6 @@ import org.springframework.stereotype.Service; | ||
| 27 | import org.springframework.transaction.annotation.Isolation; | 24 | import org.springframework.transaction.annotation.Isolation; |
| 28 | import org.springframework.transaction.annotation.Propagation; | 25 | import org.springframework.transaction.annotation.Propagation; |
| 29 | import org.springframework.transaction.annotation.Transactional; | 26 | import org.springframework.transaction.annotation.Transactional; |
| 30 | -import org.springframework.web.bind.annotation.RequestParam; | ||
| 31 | 27 | ||
| 32 | import java.sql.ResultSet; | 28 | import java.sql.ResultSet; |
| 33 | import java.sql.SQLException; | 29 | import java.sql.SQLException; |
| @@ -51,10 +47,6 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | @@ -51,10 +47,6 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | ||
| 51 | private KieBase preKBase; | 47 | private KieBase preKBase; |
| 52 | 48 | ||
| 53 | @Autowired | 49 | @Autowired |
| 54 | - @Qualifier("KBase3") | ||
| 55 | - private KieBase validateKBase; | ||
| 56 | - | ||
| 57 | - @Autowired | ||
| 58 | private ScheduleRule1FlatRepository scheduleRule1FlatRepository; | 50 | private ScheduleRule1FlatRepository scheduleRule1FlatRepository; |
| 59 | @Autowired | 51 | @Autowired |
| 60 | private TTInfoRepository ttInfoRepository; | 52 | private TTInfoRepository ttInfoRepository; |
| @@ -160,63 +152,91 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | @@ -160,63 +152,91 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | ||
| 160 | return null; | 152 | return null; |
| 161 | } | 153 | } |
| 162 | 154 | ||
| 155 | + @Autowired | ||
| 156 | + @Qualifier("kBaseValidateTimetable_plus") | ||
| 157 | + private KieBase kBaseValidateTimetable; | ||
| 163 | @Override | 158 | @Override |
| 164 | - public Result validateTTInfo(Integer xlid, Date from, Date to) { | ||
| 165 | - // 构造drools session->载入数据->启动规则->计算->销毁session | ||
| 166 | - // 创建session,内部配置的是stateful | ||
| 167 | - KieSession session = validateKBase.newKieSession(); | ||
| 168 | - // 设置gloable对象,在drl中通过别名使用 | ||
| 169 | - session.setGlobal("log", logger); | ||
| 170 | - session.setGlobal("tTInfoDetailRepository", ttInfoDetailRepository); | ||
| 171 | - | ||
| 172 | - Result rs = new Result(); // 输出gloable对象 | ||
| 173 | - session.setGlobal("rs", rs); | ||
| 174 | - | ||
| 175 | - // 载入数据 | ||
| 176 | - Line line = lineRepository.findOne(xlid); | ||
| 177 | - session.insert(line); | ||
| 178 | - | ||
| 179 | - CalcuParam calcuParam = new CalcuParam( | ||
| 180 | - new DateTime(from), new DateTime(to), xlid); | ||
| 181 | - session.insert(calcuParam); | ||
| 182 | - List<TTInfo> ttInfos = ttInfoRepository.findByXlId(xlid); | ||
| 183 | - for (TTInfo ttInfo: ttInfos) { | ||
| 184 | - session.insert(ttInfo); | ||
| 185 | - } | ||
| 186 | - | ||
| 187 | - // 执行rule | ||
| 188 | - session.fireAllRules(); | ||
| 189 | - | ||
| 190 | - // 执行完毕销毁,有日志的也要关闭 | ||
| 191 | - session.dispose(); | 159 | + public PlanProcessValidateTimetableService.Result validateTTInfo(Integer xlId, Date from, Date to) { |
| 160 | + // 使用builder创建服务 | ||
| 161 | + PlanProcessValidateTimetableService planProcessValidateTimetableService = | ||
| 162 | + PlanProcessValidateTimetableServiceDroolsImpl.getBuilder() | ||
| 163 | + .setkBaseValidateTimetable(kBaseValidateTimetable) | ||
| 164 | + .setJdbcTemplate(jdbcTemplate) | ||
| 165 | + .build(); | ||
| 166 | + PlanProcessValidateTimetableService.Result result = | ||
| 167 | + planProcessValidateTimetableService.validateTTInfovalidateTTInfo(xlId, from, to); | ||
| 168 | + return result; | ||
| 192 | 169 | ||
| 193 | - return rs; | 170 | +// // 构造drools session->载入数据->启动规则->计算->销毁session |
| 171 | +// // 创建session,内部配置的是stateful | ||
| 172 | +// KieSession session = validateKBase.newKieSession(); | ||
| 173 | +// // 设置gloable对象,在drl中通过别名使用 | ||
| 174 | +// session.setGlobal("log", logger); | ||
| 175 | +// session.setGlobal("tTInfoDetailRepository", ttInfoDetailRepository); | ||
| 176 | +// | ||
| 177 | +// Result rs = new Result(); // 输出gloable对象 | ||
| 178 | +// session.setGlobal("rs", rs); | ||
| 179 | +// | ||
| 180 | +// // 载入数据 | ||
| 181 | +// Line line = lineRepository.findOne(xlid); | ||
| 182 | +// session.insert(line); | ||
| 183 | +// | ||
| 184 | +// CalcuParam calcuParam = new CalcuParam( | ||
| 185 | +// new DateTime(from), new DateTime(to), xlid); | ||
| 186 | +// session.insert(calcuParam); | ||
| 187 | +// List<TTInfo> ttInfos = ttInfoRepository.findByXlId(xlid); | ||
| 188 | +// for (TTInfo ttInfo: ttInfos) { | ||
| 189 | +// session.insert(ttInfo); | ||
| 190 | +// } | ||
| 191 | +// | ||
| 192 | +// // 执行rule | ||
| 193 | +// session.fireAllRules(); | ||
| 194 | +// | ||
| 195 | +// // 执行完毕销毁,有日志的也要关闭 | ||
| 196 | +// session.dispose(); | ||
| 197 | +// | ||
| 198 | +// return rs; | ||
| 194 | } | 199 | } |
| 195 | 200 | ||
| 201 | + @Autowired | ||
| 202 | + @Qualifier("kBaseValidateRule_plus") | ||
| 203 | + private KieBase kBaseValidateRule; | ||
| 196 | @Override | 204 | @Override |
| 197 | - public ValidateRuleResult validateRule(Integer xlId, Date from, Date to) { | ||
| 198 | - KieSession session = validateKBase.newKieSession(); | ||
| 199 | - session.setGlobal("LOG", logger); | ||
| 200 | - session.setGlobal("ccRepo", carConfigInfoRepository); | ||
| 201 | - session.setGlobal("lpRepo", guideboardInfoRepository); | ||
| 202 | - session.setGlobal("ecRepo", employeeConfigInfoRepository); | ||
| 203 | - session.setGlobal("ruleRepo", scheduleRule1FlatRepository); | ||
| 204 | - | ||
| 205 | - ValidateRuleResult result = new ValidateRuleResult(); | ||
| 206 | - session.setGlobal("result", result); | ||
| 207 | - | ||
| 208 | - com.bsth.service.schedule.impl.plan.kBase3.validate.rule.CalcuParam calcuParam = | ||
| 209 | - new com.bsth.service.schedule.impl.plan.kBase3.validate.rule.CalcuParam(); | ||
| 210 | - calcuParam.setXlId(xlId); | ||
| 211 | - calcuParam.setFromDate(new DateTime(from)); | ||
| 212 | - calcuParam.setToDate(new DateTime(to)); | ||
| 213 | - session.insert(calcuParam); | ||
| 214 | - | ||
| 215 | - session.fireAllRules(); | 205 | + public PlanProcessValidateRuleService.Result validateRule(Integer xlId, Date from, Date to) { |
| 206 | + // 使用builder创建服务 | ||
| 207 | + PlanProcessValidateRuleService planProcessValidateRuleService = | ||
| 208 | + PlanProcessValidateRuleServiceDroolsImpl.getBuilder() | ||
| 209 | + .setkBaseValidateRule(kBaseValidateRule) | ||
| 210 | + .setJdbcTemplate(jdbcTemplate) | ||
| 211 | + .build(); | ||
| 212 | + | ||
| 213 | + PlanProcessValidateRuleService.Result result = | ||
| 214 | + planProcessValidateRuleService.validateRule(xlId, from, to); | ||
| 215 | + return result; | ||
| 216 | 216 | ||
| 217 | - session.dispose();; | ||
| 218 | 217 | ||
| 219 | - return result; | 218 | +// KieSession session = validateKBase.newKieSession(); |
| 219 | +// session.setGlobal("LOG", logger); | ||
| 220 | +// session.setGlobal("ccRepo", carConfigInfoRepository); | ||
| 221 | +// session.setGlobal("lpRepo", guideboardInfoRepository); | ||
| 222 | +// session.setGlobal("ecRepo", employeeConfigInfoRepository); | ||
| 223 | +// session.setGlobal("ruleRepo", scheduleRule1FlatRepository); | ||
| 224 | +// | ||
| 225 | +// ValidateRuleResult result = new ValidateRuleResult(); | ||
| 226 | +// session.setGlobal("result", result); | ||
| 227 | +// | ||
| 228 | +// com.bsth.service.schedule.impl.plan.kBase3.validate.rule.CalcuParam calcuParam = | ||
| 229 | +// new com.bsth.service.schedule.impl.plan.kBase3.validate.rule.CalcuParam(); | ||
| 230 | +// calcuParam.setXlId(xlId); | ||
| 231 | +// calcuParam.setFromDate(new DateTime(from)); | ||
| 232 | +// calcuParam.setToDate(new DateTime(to)); | ||
| 233 | +// session.insert(calcuParam); | ||
| 234 | +// | ||
| 235 | +// session.fireAllRules(); | ||
| 236 | +// | ||
| 237 | +// session.dispose();; | ||
| 238 | +// | ||
| 239 | +// return result; | ||
| 220 | } | 240 | } |
| 221 | 241 | ||
| 222 | 242 | ||
| @@ -230,7 +250,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | @@ -230,7 +250,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | ||
| 230 | if(map.get("fgsdm")!=null){ | 250 | if(map.get("fgsdm")!=null){ |
| 231 | fgs=map.get("fgsdm").toString(); | 251 | fgs=map.get("fgsdm").toString(); |
| 232 | } | 252 | } |
| 233 | - | 253 | + |
| 234 | String sql ="" + | 254 | String sql ="" + |
| 235 | "SELECT sp.xl as xl,sp.tt_info_names as tt_info_name, " + | 255 | "SELECT sp.xl as xl,sp.tt_info_names as tt_info_name, " + |
| 236 | " sp.schedule_from_time as from_time ,sp.schedule_to_time as to_time, " + | 256 | " sp.schedule_from_time as from_time ,sp.schedule_to_time as to_time, " + |
| @@ -267,17 +287,17 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | @@ -267,17 +287,17 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | ||
| 267 | map.put("businessName", rs.getString("business_name")); | 287 | map.put("businessName", rs.getString("business_name")); |
| 268 | return map; | 288 | return map; |
| 269 | } | 289 | } |
| 270 | - | 290 | + |
| 271 | }); | 291 | }); |
| 272 | - | 292 | + |
| 273 | for (Map m : list) { | 293 | for (Map m : list) { |
| 274 | m.put("updataDate", sfd.format(sfd.parse(m.get("updataDate").toString()))); | 294 | m.put("updataDate", sfd.format(sfd.parse(m.get("updataDate").toString()))); |
| 275 | } | 295 | } |
| 276 | }catch (Exception e){ | 296 | }catch (Exception e){ |
| 277 | e.printStackTrace(); | 297 | e.printStackTrace(); |
| 278 | } | 298 | } |
| 279 | - | ||
| 280 | - | 299 | + |
| 300 | + | ||
| 281 | //分页 | 301 | //分页 |
| 282 | if(page.length() != 0 ){ | 302 | if(page.length() != 0 ){ |
| 283 | int currPage = Integer.valueOf(page); | 303 | int currPage = Integer.valueOf(page); |
| @@ -287,8 +307,8 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | @@ -287,8 +307,8 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im | ||
| 287 | } else { | 307 | } else { |
| 288 | modelMap.put("dataList", list); | 308 | modelMap.put("dataList", list); |
| 289 | } | 309 | } |
| 290 | - | ||
| 291 | - | 310 | + |
| 311 | + | ||
| 292 | return modelMap; | 312 | return modelMap; |
| 293 | } | 313 | } |
| 294 | } | 314 | } |
src/main/java/com/bsth/service/schedule/plan/PlanConfig.java
| @@ -36,7 +36,7 @@ public class PlanConfig { | @@ -36,7 +36,7 @@ public class PlanConfig { | ||
| 36 | * 验证时刻表kieBase。 | 36 | * 验证时刻表kieBase。 |
| 37 | * @return | 37 | * @return |
| 38 | */ | 38 | */ |
| 39 | - @Bean(name = "kBaseValidateTimetable") | 39 | + @Bean(name = "kBaseValidateTimetable_plus") |
| 40 | public KieBase kBaseValidateTimetable() { | 40 | public KieBase kBaseValidateTimetable() { |
| 41 | KieBase kieBase = this.generateKieBase( | 41 | KieBase kieBase = this.generateKieBase( |
| 42 | "kBaseValidateTimetable", | 42 | "kBaseValidateTimetable", |
| @@ -49,7 +49,7 @@ public class PlanConfig { | @@ -49,7 +49,7 @@ public class PlanConfig { | ||
| 49 | * 验证规则kieBase。 | 49 | * 验证规则kieBase。 |
| 50 | * @return | 50 | * @return |
| 51 | */ | 51 | */ |
| 52 | - @Bean(name = "kBaseValidateRule") | 52 | + @Bean(name = "kBaseValidateRule_plus") |
| 53 | public KieBase kBaseValidateRule() { | 53 | public KieBase kBaseValidateRule() { |
| 54 | KieBase kieBase = this.generateKieBase( | 54 | KieBase kieBase = this.generateKieBase( |
| 55 | "kBaseValidateRule", | 55 | "kBaseValidateRule", |
src/main/resources/META-INF/drools.packagebuilder.conf
| @@ -10,3 +10,11 @@ drools.accumulate.function.minruleqyrq = com.bsth.service.schedule.impl.plan.kBa | @@ -10,3 +10,11 @@ drools.accumulate.function.minruleqyrq = com.bsth.service.schedule.impl.plan.kBa | ||
| 10 | drools.accumulate.function.vrb = com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidRepeatBcFunction | 10 | drools.accumulate.function.vrb = com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidRepeatBcFunction |
| 11 | drools.accumulate.function.vwrb = com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWholeRerunBcFunction | 11 | drools.accumulate.function.vwrb = com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWholeRerunBcFunction |
| 12 | drools.accumulate.function.vwlp = com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWantLpFunction | 12 | drools.accumulate.function.vwlp = com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWantLpFunction |
| 13 | + | ||
| 14 | +# kBase_validate_timetable.drl使用 | ||
| 15 | +drools.accumulate.function.ecount2 = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_ErrorBcCount | ||
| 16 | +drools.accumulate.function.as = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateStatInfo | ||
| 17 | +drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateConflict | ||
| 18 | +drools.accumulate.function.ae = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateEmpty | ||
| 19 | +# kBase_validate_rule.drl使用 | ||
| 20 | +drools.accumulate.function.srif2 = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo |
src/main/resources/drools/KBase/validate/rule/KBase_validate_rule.drl
| @@ -54,7 +54,7 @@ rule "calcu_error_info" | @@ -54,7 +54,7 @@ rule "calcu_error_info" | ||
| 54 | $param: KBaseValidateRule_Fact_CalcuParam($xlId: xlId, $fd: fromDate, $td: toDate) | 54 | $param: KBaseValidateRule_Fact_CalcuParam($xlId: xlId, $fd: fromDate, $td: toDate) |
| 55 | $allRuleList: ArrayList() from collect(KBaseValidateRule_Fact_Rule(xl.id == $xlId)) | 55 | $allRuleList: ArrayList() from collect(KBaseValidateRule_Fact_Rule(xl.id == $xlId)) |
| 56 | $allWrapRuleList: ArrayList() from collect(WrapRule(rule.xl.id == $xlId)) | 56 | $allWrapRuleList: ArrayList() from collect(WrapRule(rule.xl.id == $xlId)) |
| 57 | - $errorMap: Map() from accumulate ($wr: WrapRule(rule.xl.id == $xlId), srif($wr)) | 57 | + $errorMap: Map() from accumulate ($wr: WrapRule(rule.xl.id == $xlId), srif2($wr)) |
| 58 | then | 58 | then |
| 59 | rs.setXlId($xlId); | 59 | rs.setXlId($xlId); |
| 60 | rs.setCount($allRuleList.size()); | 60 | rs.setCount($allRuleList.size()); |
src/main/resources/drools/KBase/validate/timetable/KBase_validate_timetable.drl
| @@ -165,7 +165,7 @@ rule "group_statinfo" | @@ -165,7 +165,7 @@ rule "group_statinfo" | ||
| 165 | $inbc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType == "in") from $bcInfoList, count()) | 165 | $inbc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType == "in") from $bcInfoList, count()) |
| 166 | $outbc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType == "out") from $bcInfoList, count()) | 166 | $outbc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType == "out") from $bcInfoList, count()) |
| 167 | $yybc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType != "out", bcType != "in") from $bcInfoList, count()) | 167 | $yybc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType != "out", bcType != "in") from $bcInfoList, count()) |
| 168 | - $errorbc: Long() from accumulate ($ttd: KBaseValidateTimeTable_Fact_TTInfoDetail() from $bcInfoList, ecount($ttd)) | 168 | + $errorbc: Long() from accumulate ($ttd: KBaseValidateTimeTable_Fact_TTInfoDetail() from $bcInfoList, ecount2($ttd)) |
| 169 | then | 169 | then |
| 170 | LOGGER.info("时刻表={},id={},线路版本={},班次数={},进场={},出场={},营运={},错误={}", | 170 | LOGGER.info("时刻表={},id={},线路版本={},班次数={},进场={},出场={},营运={},错误={}", |
| 171 | $statInfo.getTtname(), $statInfo.getTtid(), $lineVersion, $allbc, $inbc, $outbc, $yybc, $errorbc); | 171 | $statInfo.getTtname(), $statInfo.getTtid(), $lineVersion, $allbc, $inbc, $outbc, $yybc, $errorbc); |
src/main/resources/static/pages/scheduleApp/module/common/dts2/scheduleplan/saScpdate.js
| @@ -33,8 +33,12 @@ angular.module('ScheduleApp').directive( | @@ -33,8 +33,12 @@ angular.module('ScheduleApp').directive( | ||
| 33 | // 内部ng-model值,用于和required配对 | 33 | // 内部ng-model值,用于和required配对 |
| 34 | self.$$internalmodel = undefined; | 34 | self.$$internalmodel = undefined; |
| 35 | 35 | ||
| 36 | - // 内部数据源(时刻表的一些信息) | 36 | + // 内部数据源(时刻表的统计信息) |
| 37 | self.$$ds = []; | 37 | self.$$ds = []; |
| 38 | + // 内部数据源(时刻表的冲突信息) | ||
| 39 | + self.$$conflictDs = []; | ||
| 40 | + // 内部数据源(时刻表的空信息) | ||
| 41 | + self.$$emptyDs = []; | ||
| 38 | 42 | ||
| 39 | }, | 43 | }, |
| 40 | compile: function(tElem, tAttrs) { | 44 | compile: function(tElem, tAttrs) { |
| @@ -122,10 +126,11 @@ angular.module('ScheduleApp').directive( | @@ -122,10 +126,11 @@ angular.module('ScheduleApp').directive( | ||
| 122 | var ttinfoids = []; | 126 | var ttinfoids = []; |
| 123 | QClass.val({xlid: xl_id, from: from_date, to: to_date}, | 127 | QClass.val({xlid: xl_id, from: from_date, to: to_date}, |
| 124 | function(result) { | 128 | function(result) { |
| 125 | - scope[ctrlAs].$$ds = []; | 129 | + var errorList = []; |
| 126 | 130 | ||
| 131 | + //---------------- 1、计算时刻表统计信息 ----------------// | ||
| 132 | + scope[ctrlAs].$$ds = []; | ||
| 127 | var errorTTInfos = 0; | 133 | var errorTTInfos = 0; |
| 128 | - | ||
| 129 | if (result && result.data && result.data.infos && result.data.infos.length > 0) { | 134 | if (result && result.data && result.data.infos && result.data.infos.length > 0) { |
| 130 | angular.forEach(result.data.infos, function(obj) { | 135 | angular.forEach(result.data.infos, function(obj) { |
| 131 | scope[ctrlAs].$$ds.push({ | 136 | scope[ctrlAs].$$ds.push({ |
| @@ -154,17 +159,53 @@ angular.module('ScheduleApp').directive( | @@ -154,17 +159,53 @@ angular.module('ScheduleApp').directive( | ||
| 154 | }); | 159 | }); |
| 155 | 160 | ||
| 156 | if (errorTTInfos > 0) { | 161 | if (errorTTInfos > 0) { |
| 157 | - scope[ctrlAs].$$internalmodel = undefined; | ||
| 158 | - scope[ctrlAs].error = "时刻表有错误班次"; | 162 | + errorList.push("时刻表有错误班次"); |
| 159 | } else { | 163 | } else { |
| 160 | - scope[ctrlAs].$$internalmodel = "ok"; | ||
| 161 | scope[ctrlAs].ttinfonames = ttinfonames.join(","); | 164 | scope[ctrlAs].ttinfonames = ttinfonames.join(","); |
| 162 | scope[ctrlAs].ttinfoids = ttinfoids.join(","); | 165 | scope[ctrlAs].ttinfoids = ttinfoids.join(","); |
| 163 | } | 166 | } |
| 164 | 167 | ||
| 165 | } else { | 168 | } else { |
| 169 | + errorList.push("无可用时刻表"); | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + //---------------- 2、计算当天时刻表冲突信息 ----------------// | ||
| 173 | + scope[ctrlAs].$$conflictDs = []; | ||
| 174 | + if (result && result.data && result.data.conflictStatInfos && result.data.conflictStatInfos.length > 0) { | ||
| 175 | + errorList.push("当天时刻表有冲突"); | ||
| 176 | + // 截取前五条数据显示,如果大于五条,加还有更多提示 | ||
| 177 | + var c_temp_list = result.data.conflictStatInfos.splice(0, 5); | ||
| 178 | + angular.forEach(c_temp_list, function(obj) { | ||
| 179 | + scope[ctrlAs].$$conflictDs.push({ | ||
| 180 | + desc: obj.dateDesc + "匹配到" + obj.ttIdList.length + "张时刻表" | ||
| 181 | + }); | ||
| 182 | + }); | ||
| 183 | + if (result.data.conflictStatInfos.length > 5) { | ||
| 184 | + scope[ctrlAs].$$conflictDs.push({desc : "还有更多"}); | ||
| 185 | + } | ||
| 186 | + } | ||
| 187 | + | ||
| 188 | + //---------------- 3、计算当天空时刻表信息 ----------------// | ||
| 189 | + scope[ctrlAs].$$emptyDs = []; | ||
| 190 | + if (result && result.data && result.data.emptyStatInfos && result.data.emptyStatInfos.length > 0) { | ||
| 191 | + // 截取前五条数据显示,如果大于五条,加还有更多提示 | ||
| 192 | + var e_temp_list = result.data.emptyStatInfos.splice(0, 5); | ||
| 193 | + angular.forEach(e_temp_list, function(obj) { | ||
| 194 | + scope[ctrlAs].$$emptyDs.push({ | ||
| 195 | + desc: obj.dateDesc + "没有匹配到时刻表" | ||
| 196 | + }); | ||
| 197 | + }); | ||
| 198 | + if (result.data.emptyStatInfos.length > 5) { | ||
| 199 | + scope[ctrlAs].$$emptyDs.push({desc : "还有更多"}); | ||
| 200 | + } | ||
| 201 | + } | ||
| 202 | + | ||
| 203 | + //---------------- 4、输出错误,计算model ----------------// | ||
| 204 | + if (errorList.length > 0) { | ||
| 166 | scope[ctrlAs].$$internalmodel = undefined; | 205 | scope[ctrlAs].$$internalmodel = undefined; |
| 167 | - scope[ctrlAs].error = "无可用时刻表"; | 206 | + scope[ctrlAs].error = errorList.join(","); |
| 207 | + } else { | ||
| 208 | + scope[ctrlAs].$$internalmodel = "ok"; | ||
| 168 | } | 209 | } |
| 169 | }, | 210 | }, |
| 170 | function() { | 211 | function() { |
| @@ -172,9 +213,6 @@ angular.module('ScheduleApp').directive( | @@ -172,9 +213,6 @@ angular.module('ScheduleApp').directive( | ||
| 172 | scope[ctrlAs].error = "获取时刻表数据失败!"; | 213 | scope[ctrlAs].error = "获取时刻表数据失败!"; |
| 173 | } | 214 | } |
| 174 | ); | 215 | ); |
| 175 | - | ||
| 176 | - | ||
| 177 | - scope[ctrlAs].$$internalmodel = "ok"; | ||
| 178 | }; | 216 | }; |
| 179 | 217 | ||
| 180 | scope[ctrlAs].$$internal_model_refresh(); // 初始执行 | 218 | scope[ctrlAs].$$internal_model_refresh(); // 初始执行 |
| @@ -228,4 +266,4 @@ angular.module('ScheduleApp').directive( | @@ -228,4 +266,4 @@ angular.module('ScheduleApp').directive( | ||
| 228 | }; | 266 | }; |
| 229 | } | 267 | } |
| 230 | ] | 268 | ] |
| 231 | -); | ||
| 232 | \ No newline at end of file | 269 | \ No newline at end of file |
| 270 | +); |
src/main/resources/static/pages/scheduleApp/module/common/dts2/scheduleplan/saScpdateTemplate.html
| @@ -72,10 +72,48 @@ | @@ -72,10 +72,48 @@ | ||
| 72 | <span class="glyphicon glyphicon-remove" aria-hidden="true" ng-if="info.errorbc > 0"></span> | 72 | <span class="glyphicon glyphicon-remove" aria-hidden="true" ng-if="info.errorbc > 0"></span> |
| 73 | </div> | 73 | </div> |
| 74 | </div> | 74 | </div> |
| 75 | + | ||
| 76 | + <script type="text/ng-template" id="$saScpdateCtrl_popover_2.html"> | ||
| 77 | + <div><span>当天时刻表冲突详细信息,如下:</span></div> | ||
| 78 | + <div ng-repeat="info in $saScpdateCtrl.$$conflictDs track by $index"> | ||
| 79 | + <span>{{info.desc}}</span> | ||
| 80 | + </div> | ||
| 81 | + </script> | ||
| 82 | + <div ng-if="$saScpdateCtrl.$$conflictDs.length > 0"> | ||
| 83 | + <div class="alert alert-danger well-sm col-md-12" uib-popover-template="'$saScpdateCtrl_popover_2.html'" | ||
| 84 | + popover-class="increase-popover-width" | ||
| 85 | + popover-trigger="mouseenter"> | ||
| 86 | + <h3 class="col-md-8"> | ||
| 87 | + {{$saScpdateCtrl.$$conflictDs[0].desc}} | ||
| 88 | + </h3> | ||
| 89 | + <span class="glyphicon glyphicon-remove" aria-hidden="true"></span> | ||
| 90 | + </div> | ||
| 91 | + </div> | ||
| 92 | + | ||
| 93 | + <script type="text/ng-template" id="$saScpdateCtrl_popover_3.html"> | ||
| 94 | + <div><span>当天没有时刻表详细信息,如下:</span></div> | ||
| 95 | + <div ng-repeat="info in $saScpdateCtrl.$$emptyDs track by $index"> | ||
| 96 | + <span>{{info.desc}}</span> | ||
| 97 | + </div> | ||
| 98 | + <div><span>业务上确实当天无时刻表,需要调整时刻表或规则适应,方法如下:</span></div> | ||
| 99 | + <div><span>第一种方法:编写一张假的时刻表,使用假路牌(如添加一个假路牌一个假班次的时刻表)</span></div> | ||
| 100 | + <div><span>第二种方法:调整相关规则,指定翻班类型为翻班格式,当天没有时刻表的指定为0</span></div> | ||
| 101 | + </script> | ||
| 102 | + <div ng-if="$saScpdateCtrl.$$emptyDs.length > 0"> | ||
| 103 | + <div class="alert alert-warning well-sm col-md-12" uib-popover-template="'$saScpdateCtrl_popover_3.html'" | ||
| 104 | + popover-class="increase-popover-width" | ||
| 105 | + popover-trigger="mouseenter"> | ||
| 106 | + <h3 class="col-md-8"> | ||
| 107 | + {{$saScpdateCtrl.$$emptyDs[0].desc}} | ||
| 108 | + </h3> | ||
| 109 | + <span class="glyphicon glyphicon-warning-sign" aria-hidden="true"></span> | ||
| 110 | + </div> | ||
| 111 | + </div> | ||
| 112 | + | ||
| 75 | </div> | 113 | </div> |
| 76 | </div> | 114 | </div> |
| 77 | </div> | 115 | </div> |
| 78 | 116 | ||
| 79 | 117 | ||
| 80 | 118 | ||
| 81 | -</div> | ||
| 82 | \ No newline at end of file | 119 | \ No newline at end of file |
| 120 | +</div> |
src/main/resources/static/pages/scheduleApp/module/common/prj-common-directive.js
| @@ -5033,8 +5033,12 @@ angular.module('ScheduleApp').directive( | @@ -5033,8 +5033,12 @@ angular.module('ScheduleApp').directive( | ||
| 5033 | // 内部ng-model值,用于和required配对 | 5033 | // 内部ng-model值,用于和required配对 |
| 5034 | self.$$internalmodel = undefined; | 5034 | self.$$internalmodel = undefined; |
| 5035 | 5035 | ||
| 5036 | - // 内部数据源(时刻表的一些信息) | 5036 | + // 内部数据源(时刻表的统计信息) |
| 5037 | self.$$ds = []; | 5037 | self.$$ds = []; |
| 5038 | + // 内部数据源(时刻表的冲突信息) | ||
| 5039 | + self.$$conflictDs = []; | ||
| 5040 | + // 内部数据源(时刻表的空信息) | ||
| 5041 | + self.$$emptyDs = []; | ||
| 5038 | 5042 | ||
| 5039 | }, | 5043 | }, |
| 5040 | compile: function(tElem, tAttrs) { | 5044 | compile: function(tElem, tAttrs) { |
| @@ -5122,10 +5126,11 @@ angular.module('ScheduleApp').directive( | @@ -5122,10 +5126,11 @@ angular.module('ScheduleApp').directive( | ||
| 5122 | var ttinfoids = []; | 5126 | var ttinfoids = []; |
| 5123 | QClass.val({xlid: xl_id, from: from_date, to: to_date}, | 5127 | QClass.val({xlid: xl_id, from: from_date, to: to_date}, |
| 5124 | function(result) { | 5128 | function(result) { |
| 5125 | - scope[ctrlAs].$$ds = []; | 5129 | + var errorList = []; |
| 5126 | 5130 | ||
| 5131 | + //---------------- 1、计算时刻表统计信息 ----------------// | ||
| 5132 | + scope[ctrlAs].$$ds = []; | ||
| 5127 | var errorTTInfos = 0; | 5133 | var errorTTInfos = 0; |
| 5128 | - | ||
| 5129 | if (result && result.data && result.data.infos && result.data.infos.length > 0) { | 5134 | if (result && result.data && result.data.infos && result.data.infos.length > 0) { |
| 5130 | angular.forEach(result.data.infos, function(obj) { | 5135 | angular.forEach(result.data.infos, function(obj) { |
| 5131 | scope[ctrlAs].$$ds.push({ | 5136 | scope[ctrlAs].$$ds.push({ |
| @@ -5154,17 +5159,53 @@ angular.module('ScheduleApp').directive( | @@ -5154,17 +5159,53 @@ angular.module('ScheduleApp').directive( | ||
| 5154 | }); | 5159 | }); |
| 5155 | 5160 | ||
| 5156 | if (errorTTInfos > 0) { | 5161 | if (errorTTInfos > 0) { |
| 5157 | - scope[ctrlAs].$$internalmodel = undefined; | ||
| 5158 | - scope[ctrlAs].error = "时刻表有错误班次"; | 5162 | + errorList.push("时刻表有错误班次"); |
| 5159 | } else { | 5163 | } else { |
| 5160 | - scope[ctrlAs].$$internalmodel = "ok"; | ||
| 5161 | scope[ctrlAs].ttinfonames = ttinfonames.join(","); | 5164 | scope[ctrlAs].ttinfonames = ttinfonames.join(","); |
| 5162 | scope[ctrlAs].ttinfoids = ttinfoids.join(","); | 5165 | scope[ctrlAs].ttinfoids = ttinfoids.join(","); |
| 5163 | } | 5166 | } |
| 5164 | 5167 | ||
| 5165 | } else { | 5168 | } else { |
| 5169 | + errorList.push("无可用时刻表"); | ||
| 5170 | + } | ||
| 5171 | + | ||
| 5172 | + //---------------- 2、计算当天时刻表冲突信息 ----------------// | ||
| 5173 | + scope[ctrlAs].$$conflictDs = []; | ||
| 5174 | + if (result && result.data && result.data.conflictStatInfos && result.data.conflictStatInfos.length > 0) { | ||
| 5175 | + errorList.push("当天时刻表有冲突"); | ||
| 5176 | + // 截取前五条数据显示,如果大于五条,加还有更多提示 | ||
| 5177 | + var c_temp_list = result.data.conflictStatInfos.splice(0, 5); | ||
| 5178 | + angular.forEach(c_temp_list, function(obj) { | ||
| 5179 | + scope[ctrlAs].$$conflictDs.push({ | ||
| 5180 | + desc: obj.dateDesc + "匹配到" + obj.ttIdList.length + "张时刻表" | ||
| 5181 | + }); | ||
| 5182 | + }); | ||
| 5183 | + if (result.data.conflictStatInfos.length > 5) { | ||
| 5184 | + scope[ctrlAs].$$conflictDs.push({desc : "还有更多"}); | ||
| 5185 | + } | ||
| 5186 | + } | ||
| 5187 | + | ||
| 5188 | + //---------------- 3、计算当天空时刻表信息 ----------------// | ||
| 5189 | + scope[ctrlAs].$$emptyDs = []; | ||
| 5190 | + if (result && result.data && result.data.emptyStatInfos && result.data.emptyStatInfos.length > 0) { | ||
| 5191 | + // 截取前五条数据显示,如果大于五条,加还有更多提示 | ||
| 5192 | + var e_temp_list = result.data.emptyStatInfos.splice(0, 5); | ||
| 5193 | + angular.forEach(e_temp_list, function(obj) { | ||
| 5194 | + scope[ctrlAs].$$emptyDs.push({ | ||
| 5195 | + desc: obj.dateDesc + "没有匹配到时刻表" | ||
| 5196 | + }); | ||
| 5197 | + }); | ||
| 5198 | + if (result.data.emptyStatInfos.length > 5) { | ||
| 5199 | + scope[ctrlAs].$$emptyDs.push({desc : "还有更多"}); | ||
| 5200 | + } | ||
| 5201 | + } | ||
| 5202 | + | ||
| 5203 | + //---------------- 4、输出错误,计算model ----------------// | ||
| 5204 | + if (errorList.length > 0) { | ||
| 5166 | scope[ctrlAs].$$internalmodel = undefined; | 5205 | scope[ctrlAs].$$internalmodel = undefined; |
| 5167 | - scope[ctrlAs].error = "无可用时刻表"; | 5206 | + scope[ctrlAs].error = errorList.join(","); |
| 5207 | + } else { | ||
| 5208 | + scope[ctrlAs].$$internalmodel = "ok"; | ||
| 5168 | } | 5209 | } |
| 5169 | }, | 5210 | }, |
| 5170 | function() { | 5211 | function() { |
| @@ -5172,9 +5213,6 @@ angular.module('ScheduleApp').directive( | @@ -5172,9 +5213,6 @@ angular.module('ScheduleApp').directive( | ||
| 5172 | scope[ctrlAs].error = "获取时刻表数据失败!"; | 5213 | scope[ctrlAs].error = "获取时刻表数据失败!"; |
| 5173 | } | 5214 | } |
| 5174 | ); | 5215 | ); |
| 5175 | - | ||
| 5176 | - | ||
| 5177 | - scope[ctrlAs].$$internalmodel = "ok"; | ||
| 5178 | }; | 5216 | }; |
| 5179 | 5217 | ||
| 5180 | scope[ctrlAs].$$internal_model_refresh(); // 初始执行 | 5218 | scope[ctrlAs].$$internal_model_refresh(); // 初始执行 |
| @@ -5228,7 +5266,8 @@ angular.module('ScheduleApp').directive( | @@ -5228,7 +5266,8 @@ angular.module('ScheduleApp').directive( | ||
| 5228 | }; | 5266 | }; |
| 5229 | } | 5267 | } |
| 5230 | ] | 5268 | ] |
| 5231 | -); | 5269 | +); |
| 5270 | + | ||
| 5232 | /** | 5271 | /** |
| 5233 | * saSrule指令(非通用指令,只在排班计划form中使用)。 | 5272 | * saSrule指令(非通用指令,只在排班计划form中使用)。 |
| 5234 | * 属性如下: | 5273 | * 属性如下: |
src/test/java/com/bsth/service/schedule/PlanValidateTest.java
| @@ -34,11 +34,11 @@ public class PlanValidateTest extends BaseTest_junit4 { | @@ -34,11 +34,11 @@ public class PlanValidateTest extends BaseTest_junit4 { | ||
| 34 | } | 34 | } |
| 35 | 35 | ||
| 36 | @Autowired | 36 | @Autowired |
| 37 | - @Qualifier("kBaseValidateTimetable") | 37 | + @Qualifier("kBaseValidateTimetable_plus") |
| 38 | private KieBase kBaseValidateTimetable; | 38 | private KieBase kBaseValidateTimetable; |
| 39 | 39 | ||
| 40 | @Autowired | 40 | @Autowired |
| 41 | - @Qualifier("kBaseValidateRule") | 41 | + @Qualifier("kBaseValidateRule_plus") |
| 42 | private KieBase kBaseValidateRule; | 42 | private KieBase kBaseValidateRule; |
| 43 | 43 | ||
| 44 | @Autowired | 44 | @Autowired |
| @@ -213,4 +213,6 @@ public class PlanValidateTest extends BaseTest_junit4 { | @@ -213,4 +213,6 @@ public class PlanValidateTest extends BaseTest_junit4 { | ||
| 213 | validateRuleResult.getErrorInfos().size() | 213 | validateRuleResult.getErrorInfos().size() |
| 214 | }); | 214 | }); |
| 215 | } | 215 | } |
| 216 | + | ||
| 217 | + // TODO:有空再把排班的逻辑移植过来 | ||
| 216 | } | 218 | } |
src/test/resources/META-INF/drools.packagebuilder.conf
| 1 | # 貌似用import accumulate报错,使用配置文件方式 | 1 | # 貌似用import accumulate报错,使用配置文件方式 |
| 2 | 2 | ||
| 3 | # kBase_validate_timetable.drl使用 | 3 | # kBase_validate_timetable.drl使用 |
| 4 | -drools.accumulate.function.ecount = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_ErrorBcCount | 4 | +drools.accumulate.function.ecount2 = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_ErrorBcCount |
| 5 | drools.accumulate.function.as = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateStatInfo | 5 | drools.accumulate.function.as = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateStatInfo |
| 6 | drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateConflict | 6 | drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateConflict |
| 7 | drools.accumulate.function.ae = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateEmpty | 7 | drools.accumulate.function.ae = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateEmpty |
| 8 | # kBase_validate_rule.drl使用 | 8 | # kBase_validate_rule.drl使用 |
| 9 | -drools.accumulate.function.srif = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo | 9 | +drools.accumulate.function.srif2 = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo |