Commit cebafb2edccaef36381fc9c7625c96ea14236aa0

Authored by 徐烜
1 parent c965d364

1、排班时,增加规则逻辑错误drool判定,添加相应的规则逻辑,和页面angular指令

2、治理规则代码,将drl文件以kBase1,kBase2,KBase3前缀命名,将所有drools的java代码移动至com.bsth.service.scedule.impl.plan中
3、drl文件名和com.bsth.service.schedule.impl.plan下的包名一级一级对应,前缀kBase1、kBase2、kBase3和MyDroolsConfiguration中的定义对应
Showing 54 changed files with 2727 additions and 1872 deletions

Too many changes to show.

To preserve performance only 54 of 63 files are displayed.

src/main/java/com/bsth/controller/schedule/core/SchedulePlanController.java
@@ -57,4 +57,21 @@ public class SchedulePlanController extends BController<SchedulePlan, Long> { @@ -57,4 +57,21 @@ public class SchedulePlanController extends BController<SchedulePlan, Long> {
57 return rtn; 57 return rtn;
58 } 58 }
59 59
  60 + /**
  61 + * 验证排班计划时间范围内规则的正确性。
  62 + * @return
  63 + * @throws Exception
  64 + */
  65 + @RequestMapping(value = "/valttrule/{xlid}/{from}/{to}", method = RequestMethod.GET)
  66 + public Map<String, Object> validateRule(
  67 + @PathVariable(value = "xlid") Integer xlid,
  68 + @PathVariable(value = "from") Date from,
  69 + @PathVariable(value = "to") Date to
  70 + ) throws Exception {
  71 + Map<String, Object> rtn = new HashMap<>();
  72 + rtn.put("status", ResponseCode.SUCCESS);
  73 + rtn.put("data", schedulePlanService.validateRule(xlid, from, to));
  74 + return rtn;
  75 + }
  76 +
60 } 77 }
src/main/java/com/bsth/entity/schedule/SchedulePlanInfo.java
1 package com.bsth.entity.schedule; 1 package com.bsth.entity.schedule;
2 2
3 import com.bsth.entity.Line; 3 import com.bsth.entity.Line;
4 -import com.bsth.service.schedule.rules.rerun.RerunRule_input;  
5 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;  
6 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_Type; 4 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_input;
  5 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResult_output;
  6 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_Type;
7 7
8 import javax.persistence.*; 8 import javax.persistence.*;
9 import java.sql.PreparedStatement; 9 import java.sql.PreparedStatement;
src/main/java/com/bsth/repository/schedule/GuideboardInfoRepository.java
@@ -43,5 +43,7 @@ public interface GuideboardInfoRepository extends BaseRepository&lt;GuideboardInfo, @@ -43,5 +43,7 @@ public interface GuideboardInfoRepository extends BaseRepository&lt;GuideboardInfo,
43 43
44 @Query(value = "SELECT g FROM GuideboardInfo g where g.xl =?1 and g.lpName = ?2 and g.lpNo = ?3 and lpType =?4 and isCancel = 0") 44 @Query(value = "SELECT g FROM GuideboardInfo g where g.xl =?1 and g.lpName = ?2 and g.lpNo = ?3 and lpType =?4 and isCancel = 0")
45 List<GuideboardInfo> validateLp(Line xl,String lpName , int lpNo,String lpType); 45 List<GuideboardInfo> validateLp(Line xl,String lpName , int lpNo,String lpType);
  46 +
  47 + List<GuideboardInfo> findByXlId(Integer id);
46 48
47 } 49 }
src/main/java/com/bsth/repository/schedule/TTInfoRepository.java
@@ -48,4 +48,6 @@ public interface TTInfoRepository extends BaseRepository&lt;TTInfo, Long&gt; { @@ -48,4 +48,6 @@ public interface TTInfoRepository extends BaseRepository&lt;TTInfo, Long&gt; {
48 "from LineVersions lv where lv.line.id = ?1 and lv.status = ?2 ") 48 "from LineVersions lv where lv.line.id = ?1 and lv.status = ?2 ")
49 List<Map<String, Object>> findLineVersionDescs3(Integer lineId, Integer status); 49 List<Map<String, Object>> findLineVersionDescs3(Integer lineId, Integer status);
50 50
  51 + List<TTInfo> findByXlId(Integer xlId);
  52 +
51 } 53 }
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.rules.ttinfo2.Result; 4 +import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult;
  5 +import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.Result;
5 6
6 import java.util.Date; 7 import java.util.Date;
7 8
@@ -26,4 +27,13 @@ public interface SchedulePlanService extends BService&lt;SchedulePlan, Long&gt; { @@ -26,4 +27,13 @@ public interface SchedulePlanService extends BService&lt;SchedulePlan, Long&gt; {
26 * @return 27 * @return
27 */ 28 */
28 Result validateTTInfo(Integer xlid, Date from, Date to); 29 Result validateTTInfo(Integer xlid, Date from, Date to);
  30 +
  31 + /**
  32 + * 验证规则。
  33 + * @param xlId 线路id
  34 + * @param from 排班计划开始时间
  35 + * @param to 排班计划结束时间
  36 + * @return
  37 + */
  38 + ValidateRuleResult validateRule(Integer xlId, Date from, Date to);
29 } 39 }
30 \ No newline at end of file 40 \ No newline at end of file
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.entity.Line;
3 import com.bsth.entity.schedule.SchedulePlan; 4 import com.bsth.entity.schedule.SchedulePlan;
4 import com.bsth.entity.schedule.TTInfo; 5 import com.bsth.entity.schedule.TTInfo;
5 import com.bsth.repository.BusinessRepository; 6 import com.bsth.repository.BusinessRepository;
@@ -7,10 +8,11 @@ import com.bsth.repository.LineRepository; @@ -7,10 +8,11 @@ import com.bsth.repository.LineRepository;
7 import com.bsth.repository.schedule.*; 8 import com.bsth.repository.schedule.*;
8 import com.bsth.service.schedule.SchedulePlanService; 9 import com.bsth.service.schedule.SchedulePlanService;
9 import com.bsth.service.schedule.exception.ScheduleException; 10 import com.bsth.service.schedule.exception.ScheduleException;
10 -import com.bsth.service.schedule.plan.DroolsSchedulePlan;  
11 -import com.bsth.service.schedule.rules.ScheduleRuleService;  
12 -import com.bsth.service.schedule.rules.ttinfo2.CalcuParam;  
13 -import com.bsth.service.schedule.rules.ttinfo2.Result; 11 +import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult;
  12 +import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.CalcuParam;
  13 +import com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.Result;
  14 +import com.bsth.service.schedule.impl.plan.DroolsSchedulePlan;
  15 +import com.bsth.service.schedule.impl.plan.ScheduleRuleService;
14 import org.joda.time.DateTime; 16 import org.joda.time.DateTime;
15 import org.kie.api.KieBase; 17 import org.kie.api.KieBase;
16 import org.kie.api.runtime.KieSession; 18 import org.kie.api.runtime.KieSession;
@@ -42,6 +44,10 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im @@ -42,6 +44,10 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
42 private KieBase preKBase; 44 private KieBase preKBase;
43 45
44 @Autowired 46 @Autowired
  47 + @Qualifier("KBase3")
  48 + private KieBase validateKBase;
  49 +
  50 + @Autowired
45 private ScheduleRule1FlatRepository scheduleRule1FlatRepository; 51 private ScheduleRule1FlatRepository scheduleRule1FlatRepository;
46 @Autowired 52 @Autowired
47 private TTInfoRepository ttInfoRepository; 53 private TTInfoRepository ttInfoRepository;
@@ -52,6 +58,8 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im @@ -52,6 +58,8 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
52 @Autowired 58 @Autowired
53 private CarConfigInfoRepository carConfigInfoRepository; 59 private CarConfigInfoRepository carConfigInfoRepository;
54 @Autowired 60 @Autowired
  61 + private GuideboardInfoRepository guideboardInfoRepository;
  62 + @Autowired
55 private EmployeeConfigInfoRepository employeeConfigInfoRepository; 63 private EmployeeConfigInfoRepository employeeConfigInfoRepository;
56 @Autowired 64 @Autowired
57 private BusinessRepository businessRepository; 65 private BusinessRepository businessRepository;
@@ -146,22 +154,25 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im @@ -146,22 +154,25 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
146 public Result validateTTInfo(Integer xlid, Date from, Date to) { 154 public Result validateTTInfo(Integer xlid, Date from, Date to) {
147 // 构造drools session->载入数据->启动规则->计算->销毁session 155 // 构造drools session->载入数据->启动规则->计算->销毁session
148 // 创建session,内部配置的是stateful 156 // 创建session,内部配置的是stateful
149 - KieSession session = coreKBase.newKieSession(); 157 + KieSession session = validateKBase.newKieSession();
150 // 设置gloable对象,在drl中通过别名使用 158 // 设置gloable对象,在drl中通过别名使用
151 session.setGlobal("log", logger); 159 session.setGlobal("log", logger);
152 - session.setGlobal("lineRepository", lineRepository);  
153 session.setGlobal("tTInfoDetailRepository", ttInfoDetailRepository); 160 session.setGlobal("tTInfoDetailRepository", ttInfoDetailRepository);
154 161
155 Result rs = new Result(); // 输出gloable对象 162 Result rs = new Result(); // 输出gloable对象
156 session.setGlobal("rs", rs); 163 session.setGlobal("rs", rs);
157 164
158 // 载入数据 165 // 载入数据
  166 + Line line = lineRepository.findOne(xlid);
  167 + session.insert(line);
  168 +
159 CalcuParam calcuParam = new CalcuParam( 169 CalcuParam calcuParam = new CalcuParam(
160 new DateTime(from), new DateTime(to), xlid); 170 new DateTime(from), new DateTime(to), xlid);
161 session.insert(calcuParam); 171 session.insert(calcuParam);
162 - List<TTInfo> ttInfos = (List<TTInfo>) ttInfoRepository.findAll();  
163 - for (TTInfo ttInfo: ttInfos)  
164 - session.insert(ttInfo); 172 + List<TTInfo> ttInfos = ttInfoRepository.findByXlId(xlid);
  173 + for (TTInfo ttInfo: ttInfos) {
  174 + session.insert(ttInfo);
  175 + }
165 176
166 // 执行rule 177 // 执行rule
167 session.fireAllRules(); 178 session.fireAllRules();
@@ -171,4 +182,30 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im @@ -171,4 +182,30 @@ public class SchedulePlanServiceImpl extends BServiceImpl&lt;SchedulePlan, Long&gt; im
171 182
172 return rs; 183 return rs;
173 } 184 }
  185 +
  186 + @Override
  187 + public ValidateRuleResult validateRule(Integer xlId, Date from, Date to) {
  188 + KieSession session = validateKBase.newKieSession();
  189 + session.setGlobal("LOG", logger);
  190 + session.setGlobal("ccRepo", carConfigInfoRepository);
  191 + session.setGlobal("lpRepo", guideboardInfoRepository);
  192 + session.setGlobal("ecRepo", employeeConfigInfoRepository);
  193 + session.setGlobal("ruleRepo", scheduleRule1FlatRepository);
  194 +
  195 + ValidateRuleResult result = new ValidateRuleResult();
  196 + session.setGlobal("result", result);
  197 +
  198 + com.bsth.service.schedule.impl.plan.kBase3.validate.rule.CalcuParam calcuParam =
  199 + new com.bsth.service.schedule.impl.plan.kBase3.validate.rule.CalcuParam();
  200 + calcuParam.setXlId(xlId);
  201 + calcuParam.setFromDate(new DateTime(from));
  202 + calcuParam.setToDate(new DateTime(to));
  203 + session.insert(calcuParam);
  204 +
  205 + session.fireAllRules();
  206 +
  207 + session.dispose();;
  208 +
  209 + return result;
  210 + }
174 } 211 }
src/main/java/com/bsth/service/schedule/plan/DroolsSchedulePlan.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/DroolsSchedulePlan.java
1 -package com.bsth.service.schedule.plan; 1 +package com.bsth.service.schedule.impl.plan;
2 2
3 import com.bsth.entity.Line; 3 import com.bsth.entity.Line;
4 import com.bsth.entity.schedule.SchedulePlan; 4 import com.bsth.entity.schedule.SchedulePlan;
@@ -8,17 +8,16 @@ import com.bsth.entity.schedule.rule.ScheduleRule1Flat; @@ -8,17 +8,16 @@ import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
8 import com.bsth.repository.BusinessRepository; 8 import com.bsth.repository.BusinessRepository;
9 import com.bsth.repository.LineRepository; 9 import com.bsth.repository.LineRepository;
10 import com.bsth.repository.schedule.*; 10 import com.bsth.repository.schedule.*;
11 -import com.bsth.service.schedule.rules.ScheduleRuleService;  
12 -import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input;  
13 -import com.bsth.service.schedule.rules.plan.PlanResult;  
14 -import com.bsth.service.schedule.rules.rerun.RerunRule_input;  
15 -import com.bsth.service.schedule.rules.rerun.RerunRule_param;  
16 -import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;  
17 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;  
18 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;  
19 -import com.bsth.service.schedule.rules.ttinfo.*;  
20 -import com.bsth.service.schedule.rules.validate.ValidateParam;  
21 -import com.bsth.service.schedule.rules.validate.ValidateResults_output; 11 +import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanCalcuParam_input;
  12 +import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanResult;
  13 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_input;
  14 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_param;
  15 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleCalcuParam_input;
  16 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResults_output;
  17 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_input;
  18 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.*;
  19 +import com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidateParam;
  20 +import com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidateResults_output;
22 import org.apache.commons.lang3.StringUtils; 21 import org.apache.commons.lang3.StringUtils;
23 import org.joda.time.DateTime; 22 import org.joda.time.DateTime;
24 import org.kie.api.KieBase; 23 import org.kie.api.KieBase;
src/main/java/com/bsth/service/schedule/rules/MyDroolsConfiguration.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/MyDroolsConfiguration.java
1 -package com.bsth.service.schedule.rules; 1 +package com.bsth.service.schedule.impl.plan;
2 2
3 import org.kie.api.KieBase; 3 import org.kie.api.KieBase;
4 import org.kie.api.KieBaseConfiguration; 4 import org.kie.api.KieBaseConfiguration;
@@ -56,27 +56,24 @@ public class MyDroolsConfiguration { @@ -56,27 +56,24 @@ public class MyDroolsConfiguration {
56 // 3.2、写入drl(写法超多,有点混乱) 56 // 3.2、写入drl(写法超多,有点混乱)
57 // 这里使用文件的形式写入,TODO:以后考虑从数据库中读drl写入 57 // 这里使用文件的形式写入,TODO:以后考虑从数据库中读drl写入
58 // 注意kfs写的时候如果指定path,强制为src/main/resources/加上文件名,还有就是文件名不要重复否则会覆盖的 58 // 注意kfs写的时候如果指定path,强制为src/main/resources/加上文件名,还有就是文件名不要重复否则会覆盖的
59 - kfs.write("src/main/resources/functions.drl", kieServices.getResources() 59 + kfs.write("src/main/resources/kBase1_core_shiftloop.drl", kieServices.getResources()
60 .newInputStreamResource(this.getClass().getResourceAsStream( 60 .newInputStreamResource(this.getClass().getResourceAsStream(
61 - "/rules/functions.drl"), "UTF-8"));  
62 - kfs.write("src/main/resources/shiftloop_fb_2.drl", kieServices.getResources() 61 + "/rules/kBase1_core_shiftloop.drl"), "UTF-8"));
  62 + kfs.write("src/main/resources/kBase1_core_ttinfo.drl", kieServices.getResources()
63 .newInputStreamResource(this.getClass().getResourceAsStream( 63 .newInputStreamResource(this.getClass().getResourceAsStream(
64 - "/rules/shiftloop_fb_2.drl"), "UTF-8"));  
65 - kfs.write("src/main/resources/ttinfo.drl", kieServices.getResources() 64 + "/rules/kBase1_core_ttinfo.drl"), "UTF-8"));
  65 + kfs.write("src/main/resources/kBase1_core_plan.drl", kieServices.getResources()
66 .newInputStreamResource(this.getClass().getResourceAsStream( 66 .newInputStreamResource(this.getClass().getResourceAsStream(
67 - "/rules/ttinfo.drl"), "UTF-8"));  
68 - kfs.write("src/main/resources/ttinfo2.drl", kieServices.getResources() 67 + "/rules/kBase1_core_plan.drl"), "UTF-8"));
  68 + kfs.write("src/main/resources/kBase1_core_rerun.drl", kieServices.getResources()
69 .newInputStreamResource(this.getClass().getResourceAsStream( 69 .newInputStreamResource(this.getClass().getResourceAsStream(
70 - "/rules/ttinfo2.drl"), "UTF-8"));  
71 - kfs.write("src/main/resources/plan.drl", kieServices.getResources() 70 + "/rules/kBase1_core_rerun.drl"), "UTF-8"));
  71 + kfs.write("src/main/resources/kBase1_core_validate.drl", kieServices.getResources()
72 .newInputStreamResource(this.getClass().getResourceAsStream( 72 .newInputStreamResource(this.getClass().getResourceAsStream(
73 - "/rules/plan.drl"), "UTF-8"));  
74 - kfs.write("src/main/resources/rerun.drl", kieServices.getResources() 73 + "/rules/kBase1_core_validate.drl"), "UTF-8"));
  74 + kfs.write("src/main/resources/kBase1_core_functions.drl", kieServices.getResources()
75 .newInputStreamResource(this.getClass().getResourceAsStream( 75 .newInputStreamResource(this.getClass().getResourceAsStream(
76 - "/rules/rerun.drl"), "UTF-8"));  
77 - kfs.write("src/main/resources/validplan.drl", kieServices.getResources()  
78 - .newInputStreamResource(this.getClass().getResourceAsStream(  
79 - "/rules/validplan.drl"), "UTF-8")); 76 + "/rules/kBase1_core_functions.drl"), "UTF-8"));
80 // TODO:还有其他drl.... 77 // TODO:还有其他drl....
81 78
82 // 4、创建KieBuilder,使用KieFileSystem构建 79 // 4、创建KieBuilder,使用KieFileSystem构建
@@ -134,9 +131,9 @@ public class MyDroolsConfiguration { @@ -134,9 +131,9 @@ public class MyDroolsConfiguration {
134 // 这里使用文件的形式写入,TODO:以后考虑从数据库中读drl写入 131 // 这里使用文件的形式写入,TODO:以后考虑从数据库中读drl写入
135 // 注意kfs写的时候如果指定path,强制为src/main/resources/加上文件名,还有就是文件名不要重复否则会覆盖的 132 // 注意kfs写的时候如果指定path,强制为src/main/resources/加上文件名,还有就是文件名不要重复否则会覆盖的
136 133
137 - kfs.write("src/main/resources/ruleWrap.drl", kieServices.getResources() 134 + kfs.write("src/main/resources/kBase2_wrap_rule.drl", kieServices.getResources()
138 .newInputStreamResource(this.getClass().getResourceAsStream( 135 .newInputStreamResource(this.getClass().getResourceAsStream(
139 - "/rules/ruleWrap.drl"), "UTF-8")); 136 + "/rules/kBase2_wrap_rule.drl"), "UTF-8"));
140 137
141 // TODO:还有其他drl.... 138 // TODO:还有其他drl....
142 139
@@ -161,4 +158,52 @@ public class MyDroolsConfiguration { @@ -161,4 +158,52 @@ public class MyDroolsConfiguration {
161 158
162 return kieBase; 159 return kieBase;
163 } 160 }
  161 +
  162 + /**
  163 + * 验证相关的drl知识库。
  164 + * @return
  165 + */
  166 + @Bean(name = "KBase3")
  167 + public KieBase myKieBase3() {
  168 + KieServices kieServices = KieServices.Factory.get();
  169 + KieModuleModel kieModuleModel = kieServices.newKieModuleModel();
  170 + KieBaseModel kieBaseModel = kieModuleModel.newKieBaseModel("KBase3")
  171 + .setDefault(true)
  172 + .setEqualsBehavior(EqualityBehaviorOption.EQUALITY)
  173 + .setEventProcessingMode(EventProcessingOption.STREAM);
  174 + kieBaseModel.newKieSessionModel("KSession1")
  175 + .setDefault(true)
  176 + .setType(KieSessionModel.KieSessionType.STATEFUL)
  177 + .setClockType(ClockTypeOption.get("realtime"));
  178 +
  179 + KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
  180 + kieFileSystem.writeKModuleXML(kieModuleModel.toXML());
  181 +
  182 + kieFileSystem.write(
  183 + "src/main/resources/kBase3_validate_timetable.drl",
  184 + kieServices.getResources().newInputStreamResource(
  185 + this.getClass().getResourceAsStream("/rules/kBase3_validate_timetable.drl"),
  186 + "UTF-8"));
  187 + kieFileSystem.write(
  188 + "src/main/resources/kbase3_validate_rule.drl",
  189 + kieServices.getResources().newInputStreamResource(
  190 + this.getClass().getResourceAsStream("/rules/kBase3_validate_rule.drl"),
  191 + "UTF-8"));
  192 +
  193 + KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem).buildAll();
  194 + Results results = kieBuilder.getResults();
  195 + if (results.hasMessages(Message.Level.ERROR)) {
  196 + throw new IllegalStateException("构建drools6错误:" + results.getMessages());
  197 + }
  198 +
  199 + ReleaseId releaseId = kieServices.getRepository().getDefaultReleaseId();
  200 + KieContainer kieContainer = kieServices.newKieContainer(releaseId);
  201 +
  202 + KieBaseConfiguration kieBaseConfiguration = kieServices.newKieBaseConfiguration();
  203 + KieBase kieBase = kieContainer.newKieBase("KBase3", kieBaseConfiguration);
  204 +
  205 + return kieBase;
  206 +
  207 + }
  208 +
164 } 209 }
src/main/java/com/bsth/service/schedule/rules/ScheduleRuleService.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/ScheduleRuleService.java
1 -package com.bsth.service.schedule.rules; 1 +package com.bsth.service.schedule.impl.plan;
2 2
3 import com.bsth.entity.schedule.SchedulePlan; 3 import com.bsth.entity.schedule.SchedulePlan;
4 import com.bsth.entity.schedule.SchedulePlanInfo; 4 import com.bsth.entity.schedule.SchedulePlanInfo;
5 import com.bsth.entity.schedule.temp.SchedulePlanRuleResult; 5 import com.bsth.entity.schedule.temp.SchedulePlanRuleResult;
6 -import com.bsth.service.schedule.rules.rerun.RerunRule_input; 6 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_input;
7 7
8 import java.util.Date; 8 import java.util.Date;
9 import java.util.List; 9 import java.util.List;
src/main/java/com/bsth/service/schedule/rules/ScheduleRuleServiceImpl.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/ScheduleRuleServiceImpl.java
1 -package com.bsth.service.schedule.rules; 1 +package com.bsth.service.schedule.impl.plan;
2 2
3 import com.bsth.entity.schedule.SchedulePlan; 3 import com.bsth.entity.schedule.SchedulePlan;
4 import com.bsth.entity.schedule.SchedulePlanInfo; 4 import com.bsth.entity.schedule.SchedulePlanInfo;
5 import com.bsth.entity.schedule.temp.SchedulePlanRuleResult; 5 import com.bsth.entity.schedule.temp.SchedulePlanRuleResult;
6 -import com.bsth.service.schedule.rules.rerun.RerunRule_input; 6 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_input;
7 import org.slf4j.Logger; 7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
9 import org.springframework.beans.factory.annotation.Autowired; 9 import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/bsth/service/schedule/rules/plan/PlanCalcuParam_input.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/plan/PlanCalcuParam_input.java
1 -package com.bsth.service.schedule.rules.plan; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.plan;
2 2
3 import com.bsth.entity.schedule.SchedulePlan; 3 import com.bsth.entity.schedule.SchedulePlan;
4 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;  
5 -import com.bsth.service.schedule.rules.ttinfo.TTInfoResults_output; 4 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResults_output;
  5 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResults_output;
6 6
7 /** 7 /**
8 * 排班规则-规则输入参数。 8 * 排班规则-规则输入参数。
src/main/java/com/bsth/service/schedule/rules/plan/PlanResult.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/plan/PlanResult.java
1 -package com.bsth.service.schedule.rules.plan; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.plan;
2 2
3 import com.bsth.entity.schedule.SchedulePlanInfo; 3 import com.bsth.entity.schedule.SchedulePlanInfo;
4 4
src/main/java/com/bsth/service/schedule/rules/plan/readme.txt renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/plan/readme.txt
src/main/java/com/bsth/service/schedule/rules/rerun/RerunRule_input.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/rerun/RerunRule_input.java
1 -package com.bsth.service.schedule.rules.rerun; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.rerun;
2 2
3 /** 3 /**
4 * Created by xu on 17/4/26. 4 * Created by xu on 17/4/26.
src/main/java/com/bsth/service/schedule/rules/rerun/RerunRule_param.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/rerun/RerunRule_param.java
1 -package com.bsth.service.schedule.rules.rerun; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.rerun;
2 2
3 import java.util.Set; 3 import java.util.Set;
4 4
src/main/java/com/bsth/service/schedule/rules/shiftloop/GidFbFcnoFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/GidFbFcnoFunction.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 import com.bsth.entity.schedule.TTInfoDetail; 3 import com.bsth.entity.schedule.TTInfoDetail;
4 import org.kie.api.runtime.rule.AccumulateFunction; 4 import org.kie.api.runtime.rule.AccumulateFunction;
src/main/java/com/bsth/service/schedule/rules/shiftloop/GidFbTimeFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/GidFbTimeFunction.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 import com.bsth.entity.schedule.TTInfoDetail; 3 import com.bsth.entity.schedule.TTInfoDetail;
4 import org.joda.time.LocalTime; 4 import org.joda.time.LocalTime;
src/main/java/com/bsth/service/schedule/rules/shiftloop/GidsCountFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/GidsCountFunction.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 import com.bsth.entity.schedule.TTInfoDetail; 3 import com.bsth.entity.schedule.TTInfoDetail;
4 import org.kie.api.runtime.rule.AccumulateFunction; 4 import org.kie.api.runtime.rule.AccumulateFunction;
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleCalcuParam_input.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/ScheduleCalcuParam_input.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 import com.bsth.entity.schedule.SchedulePlan; 3 import com.bsth.entity.schedule.SchedulePlan;
4 import org.joda.time.DateTime; 4 import org.joda.time.DateTime;
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleResult_output.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/ScheduleResult_output.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 import org.joda.time.DateTime; 3 import org.joda.time.DateTime;
4 4
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleResults_output.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/ScheduleResults_output.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 import com.bsth.entity.schedule.temp.SchedulePlanRuleResult; 3 import com.bsth.entity.schedule.temp.SchedulePlanRuleResult;
4 import org.apache.commons.lang3.StringUtils; 4 import org.apache.commons.lang3.StringUtils;
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleRule_Type.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/ScheduleRule_Type.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 /** 3 /**
4 * 排班规则_输入_输出_类型。 4 * 排班规则_输入_输出_类型。
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleRule_input.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/shiftloop/ScheduleRule_input.java
1 -package com.bsth.service.schedule.rules.shiftloop; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
2 2
3 import com.bsth.entity.schedule.rule.ScheduleRule1Flat; 3 import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
4 import com.google.common.base.Splitter; 4 import com.google.common.base.Splitter;
src/main/java/com/bsth/service/schedule/rules/ttinfo/LpInfoResult_output.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/LpInfoResult_output.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 import org.joda.time.DateTime; 3 import org.joda.time.DateTime;
4 4
src/main/java/com/bsth/service/schedule/rules/ttinfo/LpInfoResultsFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/LpInfoResultsFunction.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 import com.bsth.entity.schedule.TTInfoDetail; 3 import com.bsth.entity.schedule.TTInfoDetail;
4 import org.kie.api.runtime.rule.AccumulateFunction; 4 import org.kie.api.runtime.rule.AccumulateFunction;
src/main/java/com/bsth/service/schedule/rules/ttinfo/LpInfoResults_output.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/LpInfoResults_output.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 import java.util.ArrayList; 3 import java.util.ArrayList;
4 import java.util.List; 4 import java.util.List;
src/main/java/com/bsth/service/schedule/rules/ttinfo/MinRuleQyrqFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/MinRuleQyrqFunction.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input; 3 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_input;
4 import org.joda.time.DateTime; 4 import org.joda.time.DateTime;
5 import org.kie.api.runtime.rule.AccumulateFunction; 5 import org.kie.api.runtime.rule.AccumulateFunction;
6 6
src/main/java/com/bsth/service/schedule/rules/ttinfo/TTInfoCalcuParam_input.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/TTInfoCalcuParam_input.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 import org.joda.time.DateTime; 3 import org.joda.time.DateTime;
4 4
src/main/java/com/bsth/service/schedule/rules/ttinfo/TTInfoResult_output.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/TTInfoResult_output.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 import org.joda.time.DateTime; 3 import org.joda.time.DateTime;
4 4
src/main/java/com/bsth/service/schedule/rules/ttinfo/TTInfoResults_output.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/TTInfoResults_output.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 import com.google.common.collect.ArrayListMultimap; 3 import com.google.common.collect.ArrayListMultimap;
4 import com.google.common.collect.Multimap; 4 import com.google.common.collect.Multimap;
src/main/java/com/bsth/service/schedule/rules/ttinfo/TTInfo_input.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/TTInfo_input.java
1 -package com.bsth.service.schedule.rules.ttinfo; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
2 2
3 import com.bsth.entity.schedule.TTInfo; 3 import com.bsth.entity.schedule.TTInfo;
4 import org.apache.commons.lang3.StringUtils; 4 import org.apache.commons.lang3.StringUtils;
src/main/java/com/bsth/service/schedule/rules/ttinfo/readme.txt renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/ttinfo/readme.txt
src/main/java/com/bsth/service/schedule/rules/validate/ValidRepeatBcFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/validate/ValidRepeatBcFunction.java
1 -package com.bsth.service.schedule.rules.validate; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.validate;
2 2
3 import com.bsth.entity.schedule.SchedulePlanInfo; 3 import com.bsth.entity.schedule.SchedulePlanInfo;
4 import org.kie.api.runtime.rule.AccumulateFunction; 4 import org.kie.api.runtime.rule.AccumulateFunction;
src/main/java/com/bsth/service/schedule/rules/validate/ValidWantLpFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/validate/ValidWantLpFunction.java
1 -package com.bsth.service.schedule.rules.validate; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.validate;
2 2
3 import com.bsth.entity.schedule.SchedulePlanInfo; 3 import com.bsth.entity.schedule.SchedulePlanInfo;
4 -import com.bsth.service.schedule.rules.ttinfo.LpInfoResult_output; 4 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResult_output;
5 import org.kie.api.runtime.rule.AccumulateFunction; 5 import org.kie.api.runtime.rule.AccumulateFunction;
6 6
7 import java.io.*; 7 import java.io.*;
src/main/java/com/bsth/service/schedule/rules/validate/ValidWholeRerunBcFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/validate/ValidWholeRerunBcFunction.java
1 -package com.bsth.service.schedule.rules.validate; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.validate;
2 2
3 import com.bsth.entity.schedule.SchedulePlanInfo; 3 import com.bsth.entity.schedule.SchedulePlanInfo;
4 import org.kie.api.runtime.rule.AccumulateFunction; 4 import org.kie.api.runtime.rule.AccumulateFunction;
src/main/java/com/bsth/service/schedule/rules/validate/ValidateParam.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/validate/ValidateParam.java
1 -package com.bsth.service.schedule.rules.validate; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.validate;
2 2
3 import org.joda.time.DateTime; 3 import org.joda.time.DateTime;
4 import org.joda.time.Period; 4 import org.joda.time.Period;
src/main/java/com/bsth/service/schedule/rules/validate/ValidateResource.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/validate/ValidateResource.java
1 -package com.bsth.service.schedule.rules.validate; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.validate;
2 2
3 import com.bsth.entity.schedule.SchedulePlanInfo; 3 import com.bsth.entity.schedule.SchedulePlanInfo;
4 -import com.bsth.service.schedule.rules.ttinfo.LpInfoResult_output; 4 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResult_output;
5 5
6 import java.util.Date; 6 import java.util.Date;
7 import java.util.List; 7 import java.util.List;
src/main/java/com/bsth/service/schedule/rules/validate/ValidateResults_output.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase1/core/validate/ValidateResults_output.java
1 -package com.bsth.service.schedule.rules.validate; 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.validate;
2 2
3 import java.util.ArrayList; 3 import java.util.ArrayList;
4 import java.util.Date; 4 import java.util.Date;
src/main/java/com/bsth/service/schedule/impl/plan/kBase3/validate/rule/CalcuParam.java 0 → 100644
  1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.rule;
  2 +
  3 +import org.joda.time.DateTime;
  4 +
  5 +/**
  6 + * 计算用参数。
  7 + */
  8 +public class CalcuParam {
  9 + /** 线路Id */
  10 + private Integer xlId;
  11 +
  12 + /** 计划开始计算日期 */
  13 + private DateTime fromDate;
  14 + /** 计划结束计算日期 */
  15 + private DateTime toDate;
  16 +
  17 + public Integer getXlId() {
  18 + return xlId;
  19 + }
  20 +
  21 + public void setXlId(Integer xlId) {
  22 + this.xlId = xlId;
  23 + }
  24 +
  25 + public DateTime getFromDate() {
  26 + return fromDate;
  27 + }
  28 +
  29 + public void setFromDate(DateTime fromDate) {
  30 + this.fromDate = fromDate;
  31 + }
  32 +
  33 + public DateTime getToDate() {
  34 + return toDate;
  35 + }
  36 +
  37 + public void setToDate(DateTime toDate) {
  38 + this.toDate = toDate;
  39 + }
  40 +}
src/main/java/com/bsth/service/schedule/impl/plan/kBase3/validate/rule/ErrorInfoFunction.java 0 → 100644
  1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.rule;
  2 +
  3 +
  4 +import com.bsth.entity.schedule.EmployeeConfigInfo;
  5 +import com.bsth.entity.schedule.GuideboardInfo;
  6 +import org.apache.commons.lang3.StringUtils;
  7 +import org.apache.commons.lang3.math.NumberUtils;
  8 +import org.kie.api.runtime.rule.AccumulateFunction;
  9 +
  10 +import java.io.*;
  11 +import java.util.HashMap;
  12 +import java.util.Map;
  13 +
  14 +/**
  15 + * 查找错误函数。
  16 + */
  17 +public class ErrorInfoFunction implements AccumulateFunction {
  18 + @Override
  19 + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
  20 +
  21 + }
  22 +
  23 + @Override
  24 + public void writeExternal(ObjectOutput out) throws IOException {
  25 +
  26 + }
  27 +
  28 + protected static class ErrorInfoContext implements Externalizable {
  29 + /** 错误数量 */
  30 + public Integer errorCount = 0;
  31 + /** 错误Map,Map<规则id,errorInfo> */
  32 + public Map<Long, ValidateRuleResult.ErrorInfo> errorInfoMap = new HashMap<>();
  33 +
  34 + public ErrorInfoContext() {
  35 +
  36 + }
  37 +
  38 + @Override
  39 + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
  40 + errorCount = in.readInt();
  41 + errorInfoMap = (Map<Long, ValidateRuleResult.ErrorInfo>) in.readObject();
  42 +
  43 + }
  44 +
  45 + @Override
  46 + public void writeExternal(ObjectOutput out) throws IOException {
  47 + out.writeInt(errorCount);
  48 + out.writeObject(errorInfoMap);
  49 + }
  50 +
  51 + }
  52 +
  53 + @Override
  54 + public Serializable createContext() {
  55 + return new ErrorInfoContext();
  56 + }
  57 +
  58 + @Override
  59 + public void init(Serializable serializable) throws Exception {
  60 + ErrorInfoContext errorInfoContext = (ErrorInfoContext) serializable;
  61 + errorInfoContext.errorCount = 0;
  62 + errorInfoContext.errorInfoMap = new HashMap<>();
  63 + }
  64 +
  65 + @Override
  66 + public void accumulate(Serializable serializable, Object o) {
  67 + ErrorInfoContext errorInfoContext = (ErrorInfoContext) serializable;
  68 + WrapInput wrapInput = (WrapInput) o;
  69 +
  70 + ValidateRuleResult.ErrorInfo errorInfo = new ValidateRuleResult.ErrorInfo();
  71 + errorInfo.setRuleId(wrapInput.getRuleId());
  72 + errorInfo.setClZbh(wrapInput.getClZbh());
  73 + errorInfo.setQyrq(wrapInput.getQyrq());
  74 +
  75 + // 1、车辆配置验证
  76 + if (StringUtils.isNotEmpty(wrapInput.getClZbh())) { // 自编号不能为空
  77 + if (wrapInput.getCcInfos().get(wrapInput.getClZbh()) == null) { // 车辆配置不在当前线路上
  78 + errorInfo.getErrorDescList().add("车辆配置不在当前线路,请重新编辑保存!");
  79 + }
  80 + } else {
  81 + errorInfo.getErrorDescList().add("自编号不能为空,请重新编辑保存!");
  82 + }
  83 +
  84 + // 2、路牌id,路牌名字,路牌起始索引验证
  85 + if (StringUtils.isNotEmpty(wrapInput.getLpIds()) &&
  86 + StringUtils.isNotEmpty(wrapInput.getLpNames())) { // 冗余的路牌id和路牌名字都不能为空
  87 + String[] lpIds = wrapInput.getLpIds().split(",");
  88 + String[] lpNames = wrapInput.getLpNames().split(",");
  89 + if (lpIds.length == lpNames.length) { // 路牌id和路牌名字个数一致
  90 + for (int i = 0; i < lpIds.length; i++) {
  91 + if (!NumberUtils.isDigits(lpIds[i])) { // 冗余路牌id必须是数字
  92 + errorInfo.getErrorDescList().add("冗余路牌id必须是数字,请重新编辑保存!");
  93 + break;
  94 + }
  95 +
  96 + GuideboardInfo lpInfo = wrapInput.getLpInfos().get(NumberUtils.toLong(lpIds[i]));
  97 + if (lpInfo == null) { // 路牌不在当前线路上
  98 + errorInfo.getErrorDescList().add("路牌不在当前线路上,请重新编辑保存!");
  99 + } else {
  100 + if (StringUtils.isEmpty(lpNames[i]) ||
  101 + !(lpNames[i].equals(lpInfo.getLpName()))) { // 路牌id和路牌名字不对应
  102 + errorInfo.getErrorDescList().add("路牌id和路牌名字不对应,请重新编辑保存!");
  103 + break;
  104 + }
  105 + }
  106 + }
  107 +
  108 + if (wrapInput.getLpStartIndex() < 1 ||
  109 + wrapInput.getLpStartIndex() > lpIds.length) { // 路牌起始索引溢出
  110 + errorInfo.getErrorDescList().add("路牌起始索引溢出,请重新编辑保存!");
  111 + }
  112 + } else {
  113 + errorInfo.getErrorDescList().add("路牌id和路牌名字个数不一致,请重新编辑保存!");
  114 + }
  115 + } else {
  116 + errorInfo.getErrorDescList().add("冗余的路牌id和路牌名字都不能为空,请重新编辑保存!");
  117 + }
  118 +
  119 + // 3、人员配置,搭班编码,人员起始索引验证
  120 + if (StringUtils.isNotEmpty(wrapInput.getEcIds()) &&
  121 + StringUtils.isNotEmpty(wrapInput.getEcDbbms())) { // 冗余的人员配置id和人员搭班编码都不能为空
  122 + String[] ecIds = wrapInput.getEcIds().split(",");
  123 + String[] ecDbbms = wrapInput.getEcDbbms().split(",");
  124 + if (ecIds.length == ecDbbms.length) { // 人员配置id和搭班编码个数一致
  125 + for (int i = 0; i < ecIds.length; i++) {
  126 + if (ecIds[i].contains("-")) { // 分班标识
  127 + String[] fb_ecIds = ecIds[i].split("-");
  128 + String[] fb_ecDbbms = ecDbbms[i].split("-");
  129 + if (fb_ecIds.length != 2 || fb_ecDbbms.length != 2) { // 只能早晚分班
  130 + errorInfo.getErrorDescList().add("只能早晚分班,请重新编辑保存!");
  131 + break;
  132 + } else {
  133 + EmployeeConfigInfo fb_ecInfo1 = wrapInput.getEcInfos().get(NumberUtils.toLong(fb_ecIds[0]));
  134 + EmployeeConfigInfo fb_ecInfo2 = wrapInput.getEcInfos().get(NumberUtils.toLong(fb_ecIds[1]));
  135 + if (fb_ecInfo1 == null || fb_ecInfo2 == null) { // 分班的人员配置不在当前线路
  136 + errorInfo.getErrorDescList().add("分班的人员配置不在当前线路,请重新编辑保存!");
  137 + break;
  138 + } else {
  139 + if (StringUtils.isEmpty(fb_ecDbbms[0]) ||
  140 + StringUtils.isEmpty(fb_ecDbbms[1]) ||
  141 + !(fb_ecDbbms[0].equals(fb_ecInfo1.getDbbm())) ||
  142 + !(fb_ecDbbms[1].equals(fb_ecInfo2.getDbbm()))) { // 分班人员配置id和搭班编码不对应
  143 + errorInfo.getErrorDescList().add("分班人员配置id和搭班编码不对应,请重新编辑保存!");
  144 + break;
  145 + }
  146 + }
  147 + }
  148 +
  149 + } else {
  150 + if (!NumberUtils.isDigits(ecIds[i])) { // 冗余的人员配置id必须是数字
  151 + errorInfo.getErrorDescList().add("冗余的人员配置id必须是数字,请重新编辑保存!");
  152 + break;
  153 + }
  154 +
  155 + EmployeeConfigInfo ecInfo = wrapInput.getEcInfos().get(NumberUtils.toLong(ecIds[i]));
  156 + if (ecInfo == null) { // 人员配置不在当前线路
  157 + errorInfo.getErrorDescList().add("人员配置不在当前线路,请重新编辑保存!");
  158 + break;
  159 + } else {
  160 + if (StringUtils.isEmpty(ecDbbms[i]) ||
  161 + !(ecDbbms[i].equals(ecInfo.getDbbm()))) { // 人员配置id和搭班编码不对应
  162 + errorInfo.getErrorDescList().add("人员配置id和搭班编码不对应,请重新编辑保存!");
  163 + break;
  164 + }
  165 + }
  166 + }
  167 + }
  168 +
  169 + if (wrapInput.getEcStartIndex() < 1 ||
  170 + wrapInput.getEcStartIndex() > ecIds.length) { // 人员起始索引溢出
  171 + errorInfo.getErrorDescList().add("人员起始索引溢出,请重新编辑保存!");
  172 + }
  173 + } else {
  174 + errorInfo.getErrorDescList().add("人员配置id和搭班编码个数不一致,请重新编辑保存!");
  175 + }
  176 + }
  177 +
  178 + if (errorInfo.getErrorDescList().size() > 0) {
  179 + errorInfoContext.errorCount ++;
  180 + errorInfoContext.errorInfoMap.put(wrapInput.getRuleId(), errorInfo);
  181 + }
  182 +
  183 + }
  184 +
  185 + @Override
  186 + public void reverse(Serializable serializable, Object o) throws Exception {
  187 + ErrorInfoContext errorInfoContext = (ErrorInfoContext) serializable;
  188 + WrapInput wrapInput = (WrapInput) o;
  189 +
  190 + if (errorInfoContext.errorInfoMap.get(wrapInput.getRuleId()) != null) {
  191 + errorInfoContext.errorInfoMap.remove(wrapInput.getRuleId());
  192 + errorInfoContext.errorCount --;
  193 + }
  194 + }
  195 +
  196 + @Override
  197 + public Object getResult(Serializable serializable) throws Exception {
  198 + ErrorInfoContext errorInfoContext = (ErrorInfoContext) serializable;
  199 + return errorInfoContext.errorInfoMap;
  200 + }
  201 +
  202 + @Override
  203 + public boolean supportsReverse() {
  204 + return true;
  205 + }
  206 +
  207 + @Override
  208 + public Class<?> getResultType() {
  209 + return Map.class;
  210 + }
  211 +
  212 +}
src/main/java/com/bsth/service/schedule/impl/plan/kBase3/validate/rule/ValidateRuleResult.java 0 → 100644
  1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.rule;
  2 +
  3 +import java.util.ArrayList;
  4 +import java.util.Date;
  5 +import java.util.List;
  6 +
  7 +/**
  8 + * 输出结果值。
  9 + */
  10 +public class ValidateRuleResult {
  11 + /** 线路id */
  12 + private Integer xlId;
  13 + /** 规则总数量 */
  14 + private Integer count;
  15 + /** 启用的规则数量 */
  16 + private Integer qyCount;
  17 + /** 启用规则中的错误数量 */
  18 + private Integer qyErrorCount;
  19 + /** 错误列表 */
  20 + private List<ErrorInfo> errorInfos = new ArrayList<>();
  21 +
  22 + public Integer getXlId() {
  23 + return xlId;
  24 + }
  25 +
  26 + public void setXlId(Integer xlId) {
  27 + this.xlId = xlId;
  28 + }
  29 +
  30 + public Integer getCount() {
  31 + return count;
  32 + }
  33 +
  34 + public void setCount(Integer count) {
  35 + this.count = count;
  36 + }
  37 +
  38 + public Integer getQyCount() {
  39 + return qyCount;
  40 + }
  41 +
  42 + public void setQyCount(Integer qyCount) {
  43 + this.qyCount = qyCount;
  44 + }
  45 +
  46 + public Integer getQyErrorCount() {
  47 + return qyErrorCount;
  48 + }
  49 +
  50 + public void setQyErrorCount(Integer qyErrorCount) {
  51 + this.qyErrorCount = qyErrorCount;
  52 + }
  53 +
  54 + public List<ErrorInfo> getErrorInfos() {
  55 + return errorInfos;
  56 + }
  57 +
  58 + public void setErrorInfos(List<ErrorInfo> errorInfos) {
  59 + this.errorInfos = errorInfos;
  60 + }
  61 +
  62 + public static class ErrorInfo {
  63 + /** 规则id */
  64 + private Long ruleId;
  65 + /** 车辆自编号 */
  66 + private String clZbh;
  67 + /** 启用日期 */
  68 + private Date qyrq;
  69 + /** 错误描述 */
  70 + private List<String> errorDescList = new ArrayList<>();
  71 +
  72 + public Long getRuleId() {
  73 + return ruleId;
  74 + }
  75 +
  76 + public void setRuleId(Long ruleId) {
  77 + this.ruleId = ruleId;
  78 + }
  79 +
  80 + public String getClZbh() {
  81 + return clZbh;
  82 + }
  83 +
  84 + public void setClZbh(String clZbh) {
  85 + this.clZbh = clZbh;
  86 + }
  87 +
  88 + public Date getQyrq() {
  89 + return qyrq;
  90 + }
  91 +
  92 + public void setQyrq(Date qyrq) {
  93 + this.qyrq = qyrq;
  94 + }
  95 +
  96 + public List<String> getErrorDescList() {
  97 + return errorDescList;
  98 + }
  99 +
  100 + public void setErrorDescList(List<String> errorDescList) {
  101 + this.errorDescList = errorDescList;
  102 + }
  103 + }
  104 +}
src/main/java/com/bsth/service/schedule/impl/plan/kBase3/validate/rule/WrapInput.java 0 → 100644
  1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.rule;
  2 +
  3 +import com.bsth.entity.schedule.CarConfigInfo;
  4 +import com.bsth.entity.schedule.EmployeeConfigInfo;
  5 +import com.bsth.entity.schedule.GuideboardInfo;
  6 +import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
  7 +import org.springframework.util.CollectionUtils;
  8 +
  9 +import java.util.*;
  10 +
  11 +/**
  12 + * 聚合输入的待判定数据。
  13 + */
  14 +public class WrapInput {
  15 + /** 线路Id */
  16 + private Integer xlId;
  17 + /** 车辆自编号 */
  18 + private String clZbh;
  19 + /** 路牌id列表 */
  20 + private String lpIds;
  21 + /** 路牌名字列表 */
  22 + private String lpNames;
  23 + /** 人员配置列表 */
  24 + private String ecIds;
  25 + /** 人员搭班编码列表 */
  26 + private String ecDbbms;
  27 + /** 路牌循环起始索引 */
  28 + private Integer lpStartIndex;
  29 + /** 人员循环起始索引 */
  30 + private Integer ecStartIndex;
  31 + /** 规则id */
  32 + private Long ruleId;
  33 + /** 启用日期 */
  34 + private Date qyrq;
  35 +
  36 + private Map<String, CarConfigInfo> ccInfos = new HashMap<>();
  37 + private Map<Long, GuideboardInfo> lpInfos = new HashMap<>();
  38 + private Map<Long, EmployeeConfigInfo> ecInfos = new HashMap<>();
  39 +
  40 + public WrapInput(ScheduleRule1Flat r,
  41 + Map<String, CarConfigInfo> cc,
  42 + Map<Long, GuideboardInfo> lp,
  43 + Map<Long, EmployeeConfigInfo> ec) {
  44 + this.xlId = r.getXl().getId();
  45 + this.clZbh = r.getCarConfigInfo().getCl().getInsideCode();
  46 + this.lpIds = r.getLpIds();
  47 + this.lpNames = r.getLpNames();
  48 + this.ecIds = r.getRyConfigIds();
  49 + this.ecDbbms = r.getRyDbbms();
  50 + this.lpStartIndex = r.getLpStart();
  51 + this.ecStartIndex = r.getRyStart();
  52 + this.ruleId = r.getId();
  53 + this.qyrq = r.getQyrq();
  54 +
  55 + if (!CollectionUtils.isEmpty(cc)) {
  56 + this.ccInfos.putAll(cc);
  57 + }
  58 + if (!CollectionUtils.isEmpty(lp)) {
  59 + this.lpInfos.putAll(lp);
  60 + }
  61 + if (!CollectionUtils.isEmpty(ec)) {
  62 + this.ecInfos.putAll(ec);
  63 + }
  64 +
  65 + }
  66 +
  67 + public Integer getXlId() {
  68 + return xlId;
  69 + }
  70 +
  71 + public void setXlId(Integer xlId) {
  72 + this.xlId = xlId;
  73 + }
  74 +
  75 + public String getClZbh() {
  76 + return clZbh;
  77 + }
  78 +
  79 + public void setClZbh(String clZbh) {
  80 + this.clZbh = clZbh;
  81 + }
  82 +
  83 + public String getLpIds() {
  84 + return lpIds;
  85 + }
  86 +
  87 + public void setLpIds(String lpIds) {
  88 + this.lpIds = lpIds;
  89 + }
  90 +
  91 + public String getLpNames() {
  92 + return lpNames;
  93 + }
  94 +
  95 + public void setLpNames(String lpNames) {
  96 + this.lpNames = lpNames;
  97 + }
  98 +
  99 + public String getEcIds() {
  100 + return ecIds;
  101 + }
  102 +
  103 + public void setEcIds(String ecIds) {
  104 + this.ecIds = ecIds;
  105 + }
  106 +
  107 + public String getEcDbbms() {
  108 + return ecDbbms;
  109 + }
  110 +
  111 + public void setEcDbbms(String ecDbbms) {
  112 + this.ecDbbms = ecDbbms;
  113 + }
  114 +
  115 + public Integer getLpStartIndex() {
  116 + return lpStartIndex;
  117 + }
  118 +
  119 + public void setLpStartIndex(Integer lpStartIndex) {
  120 + this.lpStartIndex = lpStartIndex;
  121 + }
  122 +
  123 + public Integer getEcStartIndex() {
  124 + return ecStartIndex;
  125 + }
  126 +
  127 + public void setEcStartIndex(Integer ecStartIndex) {
  128 + this.ecStartIndex = ecStartIndex;
  129 + }
  130 +
  131 + public Long getRuleId() {
  132 + return ruleId;
  133 + }
  134 +
  135 + public void setRuleId(Long ruleId) {
  136 + this.ruleId = ruleId;
  137 + }
  138 +
  139 + public Date getQyrq() {
  140 + return qyrq;
  141 + }
  142 +
  143 + public void setQyrq(Date qyrq) {
  144 + this.qyrq = qyrq;
  145 + }
  146 +
  147 + public Map<String, CarConfigInfo> getCcInfos() {
  148 + return ccInfos;
  149 + }
  150 +
  151 + public void setCcInfos(Map<String, CarConfigInfo> ccInfos) {
  152 + this.ccInfos = ccInfos;
  153 + }
  154 +
  155 + public Map<Long, GuideboardInfo> getLpInfos() {
  156 + return lpInfos;
  157 + }
  158 +
  159 + public void setLpInfos(Map<Long, GuideboardInfo> lpInfos) {
  160 + this.lpInfos = lpInfos;
  161 + }
  162 +
  163 + public Map<Long, EmployeeConfigInfo> getEcInfos() {
  164 + return ecInfos;
  165 + }
  166 +
  167 + public void setEcInfos(Map<Long, EmployeeConfigInfo> ecInfos) {
  168 + this.ecInfos = ecInfos;
  169 + }
  170 +}
src/main/java/com/bsth/service/schedule/rules/ttinfo2/CalcuParam.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase3/validate/timetable/CalcuParam.java
1 -package com.bsth.service.schedule.rules.ttinfo2; 1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.timetable;
2 2
3 import org.joda.time.DateTime; 3 import org.joda.time.DateTime;
4 4
src/main/java/com/bsth/service/schedule/rules/ttinfo2/ErrorBcCountFunction.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase3/validate/timetable/ErrorBcCountFunction.java
1 -package com.bsth.service.schedule.rules.ttinfo2; 1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.timetable;
2 2
3 import com.bsth.entity.schedule.TTInfoDetail; 3 import com.bsth.entity.schedule.TTInfoDetail;
4 import org.apache.commons.lang3.StringUtils; 4 import org.apache.commons.lang3.StringUtils;
src/main/java/com/bsth/service/schedule/rules/ttinfo2/Result.java renamed to src/main/java/com/bsth/service/schedule/impl/plan/kBase3/validate/timetable/Result.java
1 -package com.bsth.service.schedule.rules.ttinfo2; 1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.timetable;
2 2
3 import java.util.ArrayList; 3 import java.util.ArrayList;
4 import java.util.List; 4 import java.util.List;
src/main/resources/rules/functions.drl deleted 100644 → 0
1 -package com.bsth.service.schedule;  
2 -  
3 -import accumulate com.bsth.service.schedule.rules.ttinfo2.ErrorBcCountFunction ecount;  
4 -import accumulate com.bsth.service.schedule.rules.shiftloop.GidsCountFunction gidscount;  
5 -import accumulate com.bsth.service.schedule.rules.shiftloop.GidFbTimeFunction gidfbtime;  
6 -import accumulate com.bsth.service.schedule.rules.shiftloop.GidFbFcnoFunction gidfbfcno;  
7 -import accumulate com.bsth.service.schedule.rules.ttinfo.LpInfoResultsFunction lpinforesult;  
8 -import accumulate com.bsth.service.schedule.rules.ttinfo.MinRuleQyrqFunction minruleqyrq;  
9 -import accumulate com.bsth.service.schedule.rules.validate.ValidRepeatBcFunction vrb;  
10 -import accumulate com.bsth.service.schedule.rules.validate.ValidWholeRerunBcFunction vwrb;  
11 -import accumulate com.bsth.service.schedule.rules.validate.ValidWantLpFunction vwlp;  
src/main/resources/rules/kBase1_core_functions.drl 0 → 100644
  1 +package com.bsth.service.schedule.impl.plan.kBase1.core;
  2 +
  3 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.GidsCountFunction gidscount;
  4 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.GidFbTimeFunction gidfbtime;
  5 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.GidFbFcnoFunction gidfbfcno;
  6 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResultsFunction lpinforesult;
  7 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.MinRuleQyrqFunction minruleqyrq;
  8 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidRepeatBcFunction vrb;
  9 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWholeRerunBcFunction vwrb;
  10 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWantLpFunction vwlp;
src/main/resources/rules/plan.drl renamed to src/main/resources/rules/kBase1_core_plan.drl
1 -package com.bsth.service.schedule.plan;  
2 -  
3 -import org.joda.time.*;  
4 -import java.util.*;  
5 -  
6 -import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input;  
7 -import com.bsth.service.schedule.rules.plan.PlanResult;  
8 -  
9 -import com.bsth.repository.schedule.TTInfoDetailRepository;  
10 -import com.bsth.repository.schedule.CarConfigInfoRepository;  
11 -import com.bsth.repository.schedule.EmployeeConfigInfoRepository;  
12 -import com.bsth.repository.LineRepository;  
13 -import com.bsth.repository.BusinessRepository;  
14 -  
15 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;  
16 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;  
17 -import com.bsth.service.schedule.rules.ttinfo.TTInfoResult_output;  
18 -import com.bsth.service.schedule.rules.ttinfo.TTInfoResults_output;  
19 -import com.bsth.entity.Line;  
20 -import com.bsth.entity.Business;  
21 -  
22 -import com.bsth.entity.schedule.CarConfigInfo;  
23 -import com.bsth.entity.schedule.EmployeeConfigInfo;  
24 -import com.bsth.entity.schedule.TTInfo;  
25 -import com.bsth.entity.schedule.TTInfoDetail;  
26 -import com.bsth.entity.schedule.SchedulePlanInfo;  
27 -  
28 -import org.slf4j.Logger  
29 -import org.joda.time.format.DateTimeFormat  
30 -import org.apache.commons.lang3.StringUtils  
31 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_Type;  
32 -  
33 -  
34 -// 全局日志类(一般使用调用此规则的service类)  
35 -global Logger log;  
36 -  
37 -global TTInfoDetailRepository tTInfoDetailRepository;  
38 -global CarConfigInfoRepository carConfigInfoRepository;  
39 -global EmployeeConfigInfoRepository employeeConfigInfoRepository;  
40 -global LineRepository lineRepository;  
41 -global BusinessRepository businessRepository;  
42 -  
43 -// 输出  
44 -global PlanResult planResult;  
45 -  
46 -function Map xlidParams(String xlid) {  
47 - Map param = new HashMap();  
48 - param.put("xl.id_eq", Integer.valueOf(xlid));  
49 - return param;  
50 -}  
51 -  
52 -function List ecList(EmployeeConfigInfoRepository repo, String ecids) {  
53 - List<String> ids = Arrays.asList(ecids.split("-"));  
54 - List rst = new ArrayList();  
55 - for (int i = 0; i < ids.size(); i++) {  
56 - rst.add(repo.findOne(Long.parseLong(ids.get(i))));  
57 - }  
58 - return rst;  
59 -}  
60 -  
61 -function LocalTime fcsjTime(String fcsj) {  
62 - if ("NULL".equals(fcsj)) {  
63 - return null;  
64 - }  
65 - return LocalTime.parse(fcsj, DateTimeFormat.forPattern("HH:mm"));  
66 -}  
67 -  
68 -function String ttInfoId_sd(Map map, DateTime sd) {  
69 - TTInfoResult_output ttInfoResult_output = (TTInfoResult_output) map.get(sd);  
70 - return ttInfoResult_output.getTtInfoId();  
71 -}  
72 -  
73 -function Map gsMap(List gses) {  
74 - Map gsMap = new HashMap();  
75 - for (int i = 0; i < gses.size(); i++) {  
76 - Business gs = (Business) gses.get(i);  
77 - if (StringUtils.isNotEmpty(gs.getBusinessCode())) {  
78 - if ("88".equals(gs.getUpCode())) { // 浦东公交  
79 - gsMap.put(gs.getBusinessCode(), gs);  
80 - }  
81 - if (gs.getBusinessCode().equals(gs.getUpCode())) { // 闵行,青浦  
82 - gsMap.put(gs.getBusinessCode(), gs);  
83 - }  
84 - }  
85 - }  
86 - return gsMap;  
87 -}  
88 -  
89 -function Map fgsMap(List gses) {  
90 - // 这里简单将 businessCode和upCode合并  
91 - Map fgsMap = new HashMap();  
92 - for (int i = 0; i < gses.size(); i++) {  
93 - Business gs = (Business) gses.get(i);  
94 - if (StringUtils.isNotEmpty(gs.getBusinessCode()) && StringUtils.isNotEmpty(gs.getUpCode())) {  
95 - fgsMap.put(gs.getUpCode() + "_" + gs.getBusinessCode(), gs);  
96 - }  
97 - }  
98 - return fgsMap;  
99 -}  
100 -  
101 -/*  
102 - 规则说明:  
103 - 根据循环规则输出,时刻表选择规则输出,组合计算排班明细  
104 -*/  
105 -  
106 -//-------------------- 第一阶段、计算迭代数据 -----------------//  
107 -declare Loop_result  
108 - xlId: String // 线路id  
109 -  
110 - ruleLoop: List // 每天分配的规则 List<ScheduleResult_output>  
111 -  
112 - ttInfoMapLoop_temp: Map // 每天分配的时刻表 Map<DataTime, Collection<TTInfoResult_output>>  
113 - ttInfoMapLoop: Map // 每天分配的时刻表 Map<DataTime, TTInfoResult_output>  
114 - ttInfoMap: Map // 总共用到的时刻表 Map<id, TTInfoResult_output>  
115 -end  
116 -  
117 -rule "calcu_step1_Loop_result"  
118 - salience 1000  
119 - when  
120 - $param: PlanCalcuParam_input($xlId: xlId)  
121 - then  
122 - Loop_result loop_result = new Loop_result();  
123 - loop_result.setXlId($xlId);  
124 - loop_result.setRuleLoop($param.getScheduleResults_output().getResults());  
125 -  
126 - loop_result.setTtInfoMapLoop(new HashMap());  
127 - loop_result.setTtInfoMap(new HashMap());  
128 -  
129 - com.google.common.collect.Multimap ttInfoMap_temp =  
130 - (com.google.common.collect.Multimap)  
131 - $param.getTtInfoResults_output().getResults().get(  
132 - String.valueOf($xlId));  
133 -  
134 - loop_result.setTtInfoMapLoop_temp(ttInfoMap_temp.asMap());  
135 -  
136 - insert(loop_result);  
137 -  
138 -// log.info("calcu_step1_Loop_result");  
139 -end  
140 -  
141 -rule "calcu_step2_loop_result"  
142 - salience 1000  
143 - no-loop  
144 - when  
145 - $param: PlanCalcuParam_input($xlId: xlId)  
146 - $lr: Loop_result(xlId == $xlId)  
147 - $sd: DateTime() from $lr.ttInfoMapLoop_temp.keySet()  
148 - then  
149 - // 当天时刻表只取第一张 TODO:  
150 - Collection col = (Collection) $lr.getTtInfoMapLoop_temp().get($sd);  
151 - Iterator iter = col.iterator();  
152 - TTInfoResult_output ttInfo_result = (TTInfoResult_output) iter.next();  
153 - $lr.getTtInfoMapLoop().put($sd, ttInfo_result);  
154 -  
155 - // 总共使用的时刻表  
156 - $lr.getTtInfoMap().put(ttInfo_result.getTtInfoId(), ttInfo_result);  
157 -  
158 - update($lr);  
159 -  
160 -// log.info("calcu_step2_Loop_result");  
161 -end  
162 -  
163 -//-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------//  
164 -  
165 -//--------------- 车辆配置信息载入 -------------//  
166 -declare CarConfig_Wraps  
167 - xlId: String // 线路Id  
168 - ccMap: Map // 车辆配置Map Map<id, CarConfigInfo>  
169 -end  
170 -  
171 -rule "calcu_CarConfig_Wraps"  
172 - salience 800  
173 - when  
174 - $lr: Loop_result($xlId: xlId)  
175 - then  
176 - List carConfigInfos = carConfigInfoRepository.findByXlId(Integer.parseInt($xlId));  
177 -  
178 - CarConfig_Wraps carConfig_wraps = new CarConfig_Wraps();  
179 - carConfig_wraps.setXlId($xlId);  
180 - carConfig_wraps.setCcMap(new HashMap());  
181 -  
182 - for (int i = 0; i < carConfigInfos.size(); i++) {  
183 - CarConfigInfo carConfigInfo = (CarConfigInfo) carConfigInfos.get(i);  
184 - carConfig_wraps.getCcMap().put(carConfigInfo.getId().toString(), carConfigInfo);  
185 - }  
186 -  
187 - insert(carConfig_wraps);  
188 -  
189 - log.info("calcu_CarConfig_Wrap");  
190 -end  
191 -  
192 -//--------------- 人员配置信息载入 --------------//  
193 -declare EmployeeConfig_Wraps  
194 - xlId: String // 线路Id  
195 - ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>  
196 -end  
197 -  
198 -rule "calcu_EmployeeConfig_Wraps"  
199 - salience 800  
200 - when  
201 - $lr: Loop_result($xlId: xlId)  
202 - then  
203 - List employeeConfigInfos = employeeConfigInfoRepository.findByXlId(Integer.parseInt($xlId));  
204 -  
205 - EmployeeConfig_Wraps employeeConfig_wraps = new EmployeeConfig_Wraps();  
206 - employeeConfig_wraps.setXlId($xlId);  
207 - employeeConfig_wraps.setEcMap(new HashMap());  
208 -  
209 - for (int i = 0; i < employeeConfigInfos.size(); i++) {  
210 - EmployeeConfigInfo employeeConfigInfo = (EmployeeConfigInfo) employeeConfigInfos.get(i);  
211 - employeeConfig_wraps.getEcMap().put(employeeConfigInfo.getId().toString(), employeeConfigInfo);  
212 - }  
213 -  
214 - insert(employeeConfig_wraps);  
215 -  
216 - log.info("calcu_EmployeeConfig_Wrap");  
217 -end  
218 -  
219 -//----------------- 时刻表班次信息载入 -----------------//  
220 -declare TTInfo_gid_stat  
221 - xlId: String // 线路id(cast字符串-方便比较)  
222 - ttInfoId: String // 时刻表id(cast字符串-方便比较)  
223 - gid: String // 路牌id(cast字符串-方便比较)  
224 -  
225 - maxFcno: Integer // 最大发车顺序号  
226 -  
227 - fbTime: LocalTime // 分班时间  
228 - fbfcno: Integer // 分班发车顺序号  
229 -end  
230 -  
231 -rule "calcu_TTInfo_gid_stat"  
232 - salience 800  
233 - when  
234 - $lr: Loop_result($xlId: xlId)  
235 - $ttInfoId: String() from $lr.getTtInfoMap().keySet()  
236 - $gids: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidscount($ttd))  
237 - $gid: String() from $gids  
238 - $fbtime_str: String() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbtime($ttd))  
239 - $fbfcno: Integer() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbfcno($ttd))  
240 - $maxfcno: Double() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), max($ttd.getFcno()))  
241 - then  
242 - TTInfo_gid_stat ttInfo_gid_stat = new TTInfo_gid_stat();  
243 - ttInfo_gid_stat.setXlId($xlId);  
244 - ttInfo_gid_stat.setTtInfoId($ttInfoId);  
245 - ttInfo_gid_stat.setGid($gid);  
246 -  
247 - ttInfo_gid_stat.setMaxFcno($maxfcno.intValue());  
248 - ttInfo_gid_stat.setFbTime(fcsjTime($fbtime_str));  
249 - ttInfo_gid_stat.setFbfcno($fbfcno);  
250 -  
251 - insert(ttInfo_gid_stat);  
252 -  
253 -// log.info("xlid={},ttid={},gid={},maxfcno={},fbtime={},fbfcno={}",  
254 -// $xlId, $ttInfoId, $gid, ttInfo_gid_stat.getMaxFcno(), ttInfo_gid_stat.getFbTime(), ttInfo_gid_stat.getFbfcno());  
255 -  
256 -end  
257 -  
258 -declare TTInfoDetail_Wrap  
259 - isFirstBc: Boolean = false // 是否是当前路牌的第一个班次  
260 - isLastBc: Boolean = false // 是否是当前路牌的最后一个班次  
261 - isFb: Boolean = false // 是否分班  
262 -  
263 - self: TTInfoDetail // 原始数据  
264 -end  
265 -  
266 -declare TTInfoDetail_Wraps  
267 - xlId: String // 线路id(cast字符串-方便比较)  
268 - ttInfoId: String // 时刻表id(cast字符串-方便比较)  
269 -  
270 - detailsMap: Map // 明细Map,Map<路牌id, List<TTInfoDetail_Wrap>>  
271 -end  
272 -  
273 -rule "calcu_TTInfoDetail_Wraps"  
274 - salience 700  
275 - when  
276 - $lr: Loop_result($xlId: xlId)  
277 - $ttInfoId: String() from $lr.getTtInfoMap().keySet()  
278 - $ttInfoStatList: List(size > 0) from collect (TTInfo_gid_stat(ttInfoId == $ttInfoId))  
279 - then  
280 - TTInfoDetail_Wraps ttInfoDetail_wraps = new TTInfoDetail_Wraps();  
281 - ttInfoDetail_wraps.setXlId($xlId);  
282 - ttInfoDetail_wraps.setTtInfoId($ttInfoId);  
283 - ttInfoDetail_wraps.setDetailsMap(new HashMap());  
284 -  
285 - // 将list的形式变成 Map<路牌id, TTInfo_gid_stat>  
286 - Map statMap = new HashMap();  
287 - for (int i = 0; i < $ttInfoStatList.size(); i++) {  
288 - TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) $ttInfoStatList.get(i);  
289 - statMap.put(ttInfo_gid_stat.getGid(), ttInfo_gid_stat);  
290 - }  
291 -  
292 - // 迭代ttinfodetail,拼装 TTInfoDetail_Wraps  
293 - List detaillist = tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId));  
294 - for (int j = 0; j < detaillist.size(); j++) {  
295 - TTInfoDetail ttInfoDetail = (TTInfoDetail) detaillist.get(j);  
296 - String gid = String.valueOf(ttInfoDetail.getLp().getId());  
297 -  
298 - if (ttInfoDetail_wraps.getDetailsMap().get(gid) == null) {  
299 - ttInfoDetail_wraps.getDetailsMap().put(gid, new ArrayList());  
300 - }  
301 -  
302 - // 获取stat  
303 - TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) statMap.get(gid);  
304 -  
305 - TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();  
306 - ttInfoDetail_wrap.setIsFirstBc(1 == ttInfoDetail.getFcno());  
307 - ttInfoDetail_wrap.setIsLastBc(ttInfo_gid_stat.getMaxFcno() == ttInfoDetail.getFcno());  
308 -  
309 - LocalTime fcsj = fcsjTime(ttInfoDetail.getFcsj());  
310 - LocalTime fbsj = ttInfo_gid_stat.getFbTime();  
311 - Integer fbfcno = ttInfo_gid_stat.getFbfcno();  
312 - // 不用时间判定,因为有的路牌,后面的班次都是凌晨的,时间反而比分班时间早,不合理,所以使用发车顺序号做第二次比较  
313 -// ttInfoDetail_wrap.setIsFb(fbsj == null ? false : (fcsj.isEqual(fbsj) || fcsj.isAfter(fbsj)));  
314 - ttInfoDetail_wrap.setIsFb(fbsj == null ? false : ttInfoDetail.getFcno() >= fbfcno);  
315 -  
316 - ttInfoDetail_wrap.setSelf(ttInfoDetail);  
317 -  
318 - ((List) ttInfoDetail_wraps.getDetailsMap().get(gid)).add(ttInfoDetail_wrap);  
319 -  
320 - }  
321 -  
322 -  
323 - insert(ttInfoDetail_wraps);  
324 -  
325 - log.info("xlid={}, ttinfoid={}, lpstatCount={}, detailLpCount={}",  
326 - $xlId, $ttInfoId, $ttInfoStatList.size(), ttInfoDetail_wraps.getDetailsMap().keySet().size());  
327 -  
328 -  
329 -end  
330 -  
331 -declare TTInfoDetail_Wraps_map  
332 - xlId: String // 线路id(cast字符串-方便比较)  
333 -  
334 - wrapsMap: Map // 明细Map,Map<时刻表Id, TTInfoDetail_Wraps>  
335 -end  
336 -  
337 -rule "calcu_TTInfoDetail_Wraps_toMap"  
338 - salience 600  
339 - when  
340 - $lr: Loop_result($xlId: xlId)  
341 - $wrapsList: List(size > 0) from collect (TTInfoDetail_Wraps(xlId == $xlId))  
342 - then  
343 - // 转换成Map  
344 - TTInfoDetail_Wraps_map all = new TTInfoDetail_Wraps_map();  
345 - all.setXlId($xlId);  
346 - all.setWrapsMap(new HashMap());  
347 -  
348 - for (int i = 0; i < $wrapsList.size(); i++) {  
349 - TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $wrapsList.get(i);  
350 - all.getWrapsMap().put(ttInfoDetail_wraps.getTtInfoId(), ttInfoDetail_wraps);  
351 - }  
352 -  
353 - insert(all);  
354 -end  
355 -  
356 -  
357 -  
358 -  
359 -//-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------//  
360 -  
361 -  
362 -rule "Calcu_SchedulePlanInfo"  
363 - salience 500  
364 - when  
365 - $param: PlanCalcuParam_input($xlId: xlId)  
366 - $lr: Loop_result(xlId == $xlId)  
367 - $ccs: CarConfig_Wraps(xlId == $xlId)  
368 - $ecs: EmployeeConfig_Wraps(xlId == $xlId)  
369 - $tts: TTInfoDetail_Wraps_map(xlId == $xlId)  
370 - then  
371 - // 线路  
372 - Line xl = lineRepository.findOne(Integer.parseInt($xlId));  
373 -  
374 - // 查找公司  
375 - List gses = (List) businessRepository.findAll();  
376 - // 构造公司代码对应map  
377 - Map gsMap = gsMap(gses);  
378 - // 构造分公司对应的map  
379 - Map fgsMap = fgsMap(gses);  
380 -  
381 - for (int i = 0; i < $lr.getRuleLoop().size(); i++) {  
382 - ScheduleResult_output sro = (ScheduleResult_output) $lr.getRuleLoop().get(i);  
383 -  
384 - // 日期  
385 - DateTime sd = sro.getSd();  
386 - // 路牌  
387 - String gid = sro.getGuideboardId();  
388 - // 车辆配置  
389 - CarConfigInfo carConfigInfo = sro.getsType() == ScheduleRule_Type.NORMAL ?  
390 - (CarConfigInfo) $ccs.getCcMap().get(sro.getCarConfigId()) : null;  
391 - // 人员配置  
392 - List eclist = sro.getsType() == ScheduleRule_Type.NORMAL ?  
393 - ecList(employeeConfigInfoRepository, sro.getEmployeeConfigId()) : null;  
394 -  
395 - // 时刻表id  
396 - String ttInfoId = ttInfoId_sd($lr.getTtInfoMapLoop(), sd);  
397 - TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $tts.getWrapsMap().get(ttInfoId);  
398 - if (ttInfoDetail_wraps == null) {  
399 - // 时刻表为空,直接跳过  
400 - // 如1118路,周末不开,此是时刻表指定一个空表  
401 - // TODO:这个以后要改的,选时刻表的规则要修正,没有默认的时刻表  
402 - continue;  
403 - }  
404 -  
405 - List detaillist = (List) ttInfoDetail_wraps.getDetailsMap().get(gid);  
406 - if (detaillist == null) {  
407 - // 这里翻到的路牌时刻表里可能没有,  
408 - // 因为没有考虑翻班格式(就是做几休几)  
409 - // 所有翻班格式全由时刻表决定,即时刻表有的路牌就做,没有不做  
410 - continue;  
411 - }  
412 -  
413 - for (int j = 0; j < detaillist.size(); j++) {  
414 - TTInfoDetail_Wrap wrap = (TTInfoDetail_Wrap) detaillist.get(j);  
415 -  
416 - SchedulePlanInfo schedulePlanInfo = new SchedulePlanInfo(  
417 - xl,  
418 - sro,  
419 - wrap.getSelf(),  
420 - wrap.getIsFb(),  
421 - carConfigInfo,  
422 - eclist,  
423 - $param.getSchedulePlan(),  
424 - wrap.getIsFirstBc(),  
425 - wrap.getIsLastBc(),  
426 - sro.getsType()  
427 - );  
428 -  
429 - // 获取公司,分公司信息  
430 - String gsbm = xl.getCompany();  
431 - String fgsbm = xl.getBrancheCompany();  
432 - Business gs = null;  
433 - Business fgs = null;  
434 -  
435 - if (StringUtils.isNotEmpty(gsbm)) {  
436 - gs = (Business) gsMap.get(gsbm);  
437 - }  
438 - if (StringUtils.isNotEmpty(gsbm) && StringUtils.isNotEmpty(fgsbm)) {  
439 - fgs = (Business) fgsMap.get(gsbm + "_" + fgsbm);  
440 - }  
441 -  
442 - if (gs != null) {  
443 - schedulePlanInfo.setGsBm(gs.getBusinessCode());  
444 - schedulePlanInfo.setGsName(gs.getBusinessName());  
445 - }  
446 - if (fgs != null) {  
447 - schedulePlanInfo.setFgsBm(fgs.getBusinessCode());  
448 - schedulePlanInfo.setFgsName(fgs.getBusinessName());  
449 - }  
450 -  
451 - // 操作人,操作时间  
452 - schedulePlanInfo.setCreateBy($param.getSchedulePlan().getCreateBy());  
453 - schedulePlanInfo.setCreateDate($param.getSchedulePlan().getCreateDate());  
454 - schedulePlanInfo.setUpdateBy($param.getSchedulePlan().getUpdateBy());  
455 - schedulePlanInfo.setUpdateDate($param.getSchedulePlan().getUpdateDate());  
456 -  
457 - // result 输出  
458 - planResult.getSchedulePlanInfos().add(schedulePlanInfo);  
459 -  
460 - }  
461 -  
462 - }  
463 -  
464 - log.info("xlid={} plan ok!", $xlId);  
465 -  
466 -end  
467 -  
468 -  
469 -  
470 -  
471 -  
472 -  
473 -  
474 -  
475 -  
476 -  
477 -  
478 -  
479 -  
480 - 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.plan;
  2 +
  3 +import org.joda.time.*;
  4 +import java.util.*;
  5 +
  6 +import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanCalcuParam_input;
  7 +import com.bsth.service.schedule.impl.plan.kBase1.core.plan.PlanResult;
  8 +
  9 +import com.bsth.repository.schedule.TTInfoDetailRepository;
  10 +import com.bsth.repository.schedule.CarConfigInfoRepository;
  11 +import com.bsth.repository.schedule.EmployeeConfigInfoRepository;
  12 +import com.bsth.repository.LineRepository;
  13 +import com.bsth.repository.BusinessRepository;
  14 +
  15 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResult_output;
  16 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResults_output;
  17 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResult_output;
  18 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResults_output;
  19 +import com.bsth.entity.Line;
  20 +import com.bsth.entity.Business;
  21 +
  22 +import com.bsth.entity.schedule.CarConfigInfo;
  23 +import com.bsth.entity.schedule.EmployeeConfigInfo;
  24 +import com.bsth.entity.schedule.TTInfo;
  25 +import com.bsth.entity.schedule.TTInfoDetail;
  26 +import com.bsth.entity.schedule.SchedulePlanInfo;
  27 +
  28 +import org.slf4j.Logger
  29 +import org.joda.time.format.DateTimeFormat
  30 +import org.apache.commons.lang3.StringUtils
  31 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_Type;
  32 +
  33 +
  34 +// 全局日志类(一般使用调用此规则的service类)
  35 +global Logger log;
  36 +
  37 +global TTInfoDetailRepository tTInfoDetailRepository;
  38 +global CarConfigInfoRepository carConfigInfoRepository;
  39 +global EmployeeConfigInfoRepository employeeConfigInfoRepository;
  40 +global LineRepository lineRepository;
  41 +global BusinessRepository businessRepository;
  42 +
  43 +// 输出
  44 +global PlanResult planResult;
  45 +
  46 +function Map xlidParams(String xlid) {
  47 + Map param = new HashMap();
  48 + param.put("xl.id_eq", Integer.valueOf(xlid));
  49 + return param;
  50 +}
  51 +
  52 +function List ecList(EmployeeConfigInfoRepository repo, String ecids) {
  53 + List<String> ids = Arrays.asList(ecids.split("-"));
  54 + List rst = new ArrayList();
  55 + for (int i = 0; i < ids.size(); i++) {
  56 + rst.add(repo.findOne(Long.parseLong(ids.get(i))));
  57 + }
  58 + return rst;
  59 +}
  60 +
  61 +function LocalTime fcsjTime(String fcsj) {
  62 + if ("NULL".equals(fcsj)) {
  63 + return null;
  64 + }
  65 + return LocalTime.parse(fcsj, DateTimeFormat.forPattern("HH:mm"));
  66 +}
  67 +
  68 +function String ttInfoId_sd(Map map, DateTime sd) {
  69 + TTInfoResult_output ttInfoResult_output = (TTInfoResult_output) map.get(sd);
  70 + return ttInfoResult_output.getTtInfoId();
  71 +}
  72 +
  73 +function Map gsMap(List gses) {
  74 + Map gsMap = new HashMap();
  75 + for (int i = 0; i < gses.size(); i++) {
  76 + Business gs = (Business) gses.get(i);
  77 + if (StringUtils.isNotEmpty(gs.getBusinessCode())) {
  78 + if ("88".equals(gs.getUpCode())) { // 浦东公交
  79 + gsMap.put(gs.getBusinessCode(), gs);
  80 + }
  81 + if (gs.getBusinessCode().equals(gs.getUpCode())) { // 闵行,青浦
  82 + gsMap.put(gs.getBusinessCode(), gs);
  83 + }
  84 + }
  85 + }
  86 + return gsMap;
  87 +}
  88 +
  89 +function Map fgsMap(List gses) {
  90 + // 这里简单将 businessCode和upCode合并
  91 + Map fgsMap = new HashMap();
  92 + for (int i = 0; i < gses.size(); i++) {
  93 + Business gs = (Business) gses.get(i);
  94 + if (StringUtils.isNotEmpty(gs.getBusinessCode()) && StringUtils.isNotEmpty(gs.getUpCode())) {
  95 + fgsMap.put(gs.getUpCode() + "_" + gs.getBusinessCode(), gs);
  96 + }
  97 + }
  98 + return fgsMap;
  99 +}
  100 +
  101 +/*
  102 + 规则说明:
  103 + 根据循环规则输出,时刻表选择规则输出,组合计算排班明细
  104 +*/
  105 +
  106 +//-------------------- 第一阶段、计算迭代数据 -----------------//
  107 +declare Loop_result
  108 + xlId: String // 线路id
  109 +
  110 + ruleLoop: List // 每天分配的规则 List<ScheduleResult_output>
  111 +
  112 + ttInfoMapLoop_temp: Map // 每天分配的时刻表 Map<DataTime, Collection<TTInfoResult_output>>
  113 + ttInfoMapLoop: Map // 每天分配的时刻表 Map<DataTime, TTInfoResult_output>
  114 + ttInfoMap: Map // 总共用到的时刻表 Map<id, TTInfoResult_output>
  115 +end
  116 +
  117 +rule "calcu_step1_Loop_result"
  118 + salience 1000
  119 + when
  120 + $param: PlanCalcuParam_input($xlId: xlId)
  121 + then
  122 + Loop_result loop_result = new Loop_result();
  123 + loop_result.setXlId($xlId);
  124 + loop_result.setRuleLoop($param.getScheduleResults_output().getResults());
  125 +
  126 + loop_result.setTtInfoMapLoop(new HashMap());
  127 + loop_result.setTtInfoMap(new HashMap());
  128 +
  129 + com.google.common.collect.Multimap ttInfoMap_temp =
  130 + (com.google.common.collect.Multimap)
  131 + $param.getTtInfoResults_output().getResults().get(
  132 + String.valueOf($xlId));
  133 +
  134 + loop_result.setTtInfoMapLoop_temp(ttInfoMap_temp.asMap());
  135 +
  136 + insert(loop_result);
  137 +
  138 +// log.info("calcu_step1_Loop_result");
  139 +end
  140 +
  141 +rule "calcu_step2_loop_result"
  142 + salience 1000
  143 + no-loop
  144 + when
  145 + $param: PlanCalcuParam_input($xlId: xlId)
  146 + $lr: Loop_result(xlId == $xlId)
  147 + $sd: DateTime() from $lr.ttInfoMapLoop_temp.keySet()
  148 + then
  149 + // 当天时刻表只取第一张 TODO:
  150 + Collection col = (Collection) $lr.getTtInfoMapLoop_temp().get($sd);
  151 + Iterator iter = col.iterator();
  152 + TTInfoResult_output ttInfo_result = (TTInfoResult_output) iter.next();
  153 + $lr.getTtInfoMapLoop().put($sd, ttInfo_result);
  154 +
  155 + // 总共使用的时刻表
  156 + $lr.getTtInfoMap().put(ttInfo_result.getTtInfoId(), ttInfo_result);
  157 +
  158 + update($lr);
  159 +
  160 +// log.info("calcu_step2_Loop_result");
  161 +end
  162 +
  163 +//-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------//
  164 +
  165 +//--------------- 车辆配置信息载入 -------------//
  166 +declare CarConfig_Wraps
  167 + xlId: String // 线路Id
  168 + ccMap: Map // 车辆配置Map Map<id, CarConfigInfo>
  169 +end
  170 +
  171 +rule "calcu_CarConfig_Wraps"
  172 + salience 800
  173 + when
  174 + $lr: Loop_result($xlId: xlId)
  175 + then
  176 + List carConfigInfos = carConfigInfoRepository.findByXlId(Integer.parseInt($xlId));
  177 +
  178 + CarConfig_Wraps carConfig_wraps = new CarConfig_Wraps();
  179 + carConfig_wraps.setXlId($xlId);
  180 + carConfig_wraps.setCcMap(new HashMap());
  181 +
  182 + for (int i = 0; i < carConfigInfos.size(); i++) {
  183 + CarConfigInfo carConfigInfo = (CarConfigInfo) carConfigInfos.get(i);
  184 + carConfig_wraps.getCcMap().put(carConfigInfo.getId().toString(), carConfigInfo);
  185 + }
  186 +
  187 + insert(carConfig_wraps);
  188 +
  189 + log.info("calcu_CarConfig_Wrap");
  190 +end
  191 +
  192 +//--------------- 人员配置信息载入 --------------//
  193 +declare EmployeeConfig_Wraps
  194 + xlId: String // 线路Id
  195 + ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>
  196 +end
  197 +
  198 +rule "calcu_EmployeeConfig_Wraps"
  199 + salience 800
  200 + when
  201 + $lr: Loop_result($xlId: xlId)
  202 + then
  203 + List employeeConfigInfos = employeeConfigInfoRepository.findByXlId(Integer.parseInt($xlId));
  204 +
  205 + EmployeeConfig_Wraps employeeConfig_wraps = new EmployeeConfig_Wraps();
  206 + employeeConfig_wraps.setXlId($xlId);
  207 + employeeConfig_wraps.setEcMap(new HashMap());
  208 +
  209 + for (int i = 0; i < employeeConfigInfos.size(); i++) {
  210 + EmployeeConfigInfo employeeConfigInfo = (EmployeeConfigInfo) employeeConfigInfos.get(i);
  211 + employeeConfig_wraps.getEcMap().put(employeeConfigInfo.getId().toString(), employeeConfigInfo);
  212 + }
  213 +
  214 + insert(employeeConfig_wraps);
  215 +
  216 + log.info("calcu_EmployeeConfig_Wrap");
  217 +end
  218 +
  219 +//----------------- 时刻表班次信息载入 -----------------//
  220 +declare TTInfo_gid_stat
  221 + xlId: String // 线路id(cast字符串-方便比较)
  222 + ttInfoId: String // 时刻表id(cast字符串-方便比较)
  223 + gid: String // 路牌id(cast字符串-方便比较)
  224 +
  225 + maxFcno: Integer // 最大发车顺序号
  226 +
  227 + fbTime: LocalTime // 分班时间
  228 + fbfcno: Integer // 分班发车顺序号
  229 +end
  230 +
  231 +rule "calcu_TTInfo_gid_stat"
  232 + salience 800
  233 + when
  234 + $lr: Loop_result($xlId: xlId)
  235 + $ttInfoId: String() from $lr.getTtInfoMap().keySet()
  236 + $gids: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidscount($ttd))
  237 + $gid: String() from $gids
  238 + $fbtime_str: String() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbtime($ttd))
  239 + $fbfcno: Integer() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), gidfbfcno($ttd))
  240 + $maxfcno: Double() from accumulate ($ttd: TTInfoDetail(lp.id.toString() == $gid) from tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId)), max($ttd.getFcno()))
  241 + then
  242 + TTInfo_gid_stat ttInfo_gid_stat = new TTInfo_gid_stat();
  243 + ttInfo_gid_stat.setXlId($xlId);
  244 + ttInfo_gid_stat.setTtInfoId($ttInfoId);
  245 + ttInfo_gid_stat.setGid($gid);
  246 +
  247 + ttInfo_gid_stat.setMaxFcno($maxfcno.intValue());
  248 + ttInfo_gid_stat.setFbTime(fcsjTime($fbtime_str));
  249 + ttInfo_gid_stat.setFbfcno($fbfcno);
  250 +
  251 + insert(ttInfo_gid_stat);
  252 +
  253 +// log.info("xlid={},ttid={},gid={},maxfcno={},fbtime={},fbfcno={}",
  254 +// $xlId, $ttInfoId, $gid, ttInfo_gid_stat.getMaxFcno(), ttInfo_gid_stat.getFbTime(), ttInfo_gid_stat.getFbfcno());
  255 +
  256 +end
  257 +
  258 +declare TTInfoDetail_Wrap
  259 + isFirstBc: Boolean = false // 是否是当前路牌的第一个班次
  260 + isLastBc: Boolean = false // 是否是当前路牌的最后一个班次
  261 + isFb: Boolean = false // 是否分班
  262 +
  263 + self: TTInfoDetail // 原始数据
  264 +end
  265 +
  266 +declare TTInfoDetail_Wraps
  267 + xlId: String // 线路id(cast字符串-方便比较)
  268 + ttInfoId: String // 时刻表id(cast字符串-方便比较)
  269 +
  270 + detailsMap: Map // 明细Map,Map<路牌id, List<TTInfoDetail_Wrap>>
  271 +end
  272 +
  273 +rule "calcu_TTInfoDetail_Wraps"
  274 + salience 700
  275 + when
  276 + $lr: Loop_result($xlId: xlId)
  277 + $ttInfoId: String() from $lr.getTtInfoMap().keySet()
  278 + $ttInfoStatList: List(size > 0) from collect (TTInfo_gid_stat(ttInfoId == $ttInfoId))
  279 + then
  280 + TTInfoDetail_Wraps ttInfoDetail_wraps = new TTInfoDetail_Wraps();
  281 + ttInfoDetail_wraps.setXlId($xlId);
  282 + ttInfoDetail_wraps.setTtInfoId($ttInfoId);
  283 + ttInfoDetail_wraps.setDetailsMap(new HashMap());
  284 +
  285 + // 将list的形式变成 Map<路牌id, TTInfo_gid_stat>
  286 + Map statMap = new HashMap();
  287 + for (int i = 0; i < $ttInfoStatList.size(); i++) {
  288 + TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) $ttInfoStatList.get(i);
  289 + statMap.put(ttInfo_gid_stat.getGid(), ttInfo_gid_stat);
  290 + }
  291 +
  292 + // 迭代ttinfodetail,拼装 TTInfoDetail_Wraps
  293 + List detaillist = tTInfoDetailRepository.findByTtinfoId(Long.parseLong($ttInfoId));
  294 + for (int j = 0; j < detaillist.size(); j++) {
  295 + TTInfoDetail ttInfoDetail = (TTInfoDetail) detaillist.get(j);
  296 + String gid = String.valueOf(ttInfoDetail.getLp().getId());
  297 +
  298 + if (ttInfoDetail_wraps.getDetailsMap().get(gid) == null) {
  299 + ttInfoDetail_wraps.getDetailsMap().put(gid, new ArrayList());
  300 + }
  301 +
  302 + // 获取stat
  303 + TTInfo_gid_stat ttInfo_gid_stat = (TTInfo_gid_stat) statMap.get(gid);
  304 +
  305 + TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();
  306 + ttInfoDetail_wrap.setIsFirstBc(1 == ttInfoDetail.getFcno());
  307 + ttInfoDetail_wrap.setIsLastBc(ttInfo_gid_stat.getMaxFcno() == ttInfoDetail.getFcno());
  308 +
  309 + LocalTime fcsj = fcsjTime(ttInfoDetail.getFcsj());
  310 + LocalTime fbsj = ttInfo_gid_stat.getFbTime();
  311 + Integer fbfcno = ttInfo_gid_stat.getFbfcno();
  312 + // 不用时间判定,因为有的路牌,后面的班次都是凌晨的,时间反而比分班时间早,不合理,所以使用发车顺序号做第二次比较
  313 +// ttInfoDetail_wrap.setIsFb(fbsj == null ? false : (fcsj.isEqual(fbsj) || fcsj.isAfter(fbsj)));
  314 + ttInfoDetail_wrap.setIsFb(fbsj == null ? false : ttInfoDetail.getFcno() >= fbfcno);
  315 +
  316 + ttInfoDetail_wrap.setSelf(ttInfoDetail);
  317 +
  318 + ((List) ttInfoDetail_wraps.getDetailsMap().get(gid)).add(ttInfoDetail_wrap);
  319 +
  320 + }
  321 +
  322 +
  323 + insert(ttInfoDetail_wraps);
  324 +
  325 + log.info("xlid={}, ttinfoid={}, lpstatCount={}, detailLpCount={}",
  326 + $xlId, $ttInfoId, $ttInfoStatList.size(), ttInfoDetail_wraps.getDetailsMap().keySet().size());
  327 +
  328 +
  329 +end
  330 +
  331 +declare TTInfoDetail_Wraps_map
  332 + xlId: String // 线路id(cast字符串-方便比较)
  333 +
  334 + wrapsMap: Map // 明细Map,Map<时刻表Id, TTInfoDetail_Wraps>
  335 +end
  336 +
  337 +rule "calcu_TTInfoDetail_Wraps_toMap"
  338 + salience 600
  339 + when
  340 + $lr: Loop_result($xlId: xlId)
  341 + $wrapsList: List(size > 0) from collect (TTInfoDetail_Wraps(xlId == $xlId))
  342 + then
  343 + // 转换成Map
  344 + TTInfoDetail_Wraps_map all = new TTInfoDetail_Wraps_map();
  345 + all.setXlId($xlId);
  346 + all.setWrapsMap(new HashMap());
  347 +
  348 + for (int i = 0; i < $wrapsList.size(); i++) {
  349 + TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $wrapsList.get(i);
  350 + all.getWrapsMap().put(ttInfoDetail_wraps.getTtInfoId(), ttInfoDetail_wraps);
  351 + }
  352 +
  353 + insert(all);
  354 +end
  355 +
  356 +
  357 +
  358 +
  359 +//-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------//
  360 +
  361 +
  362 +rule "Calcu_SchedulePlanInfo"
  363 + salience 500
  364 + when
  365 + $param: PlanCalcuParam_input($xlId: xlId)
  366 + $lr: Loop_result(xlId == $xlId)
  367 + $ccs: CarConfig_Wraps(xlId == $xlId)
  368 + $ecs: EmployeeConfig_Wraps(xlId == $xlId)
  369 + $tts: TTInfoDetail_Wraps_map(xlId == $xlId)
  370 + then
  371 + // 线路
  372 + Line xl = lineRepository.findOne(Integer.parseInt($xlId));
  373 +
  374 + // 查找公司
  375 + List gses = (List) businessRepository.findAll();
  376 + // 构造公司代码对应map
  377 + Map gsMap = gsMap(gses);
  378 + // 构造分公司对应的map
  379 + Map fgsMap = fgsMap(gses);
  380 +
  381 + for (int i = 0; i < $lr.getRuleLoop().size(); i++) {
  382 + ScheduleResult_output sro = (ScheduleResult_output) $lr.getRuleLoop().get(i);
  383 +
  384 + // 日期
  385 + DateTime sd = sro.getSd();
  386 + // 路牌
  387 + String gid = sro.getGuideboardId();
  388 + // 车辆配置
  389 + CarConfigInfo carConfigInfo = sro.getsType() == ScheduleRule_Type.NORMAL ?
  390 + (CarConfigInfo) $ccs.getCcMap().get(sro.getCarConfigId()) : null;
  391 + // 人员配置
  392 + List eclist = sro.getsType() == ScheduleRule_Type.NORMAL ?
  393 + ecList(employeeConfigInfoRepository, sro.getEmployeeConfigId()) : null;
  394 +
  395 + // 时刻表id
  396 + String ttInfoId = ttInfoId_sd($lr.getTtInfoMapLoop(), sd);
  397 + TTInfoDetail_Wraps ttInfoDetail_wraps = (TTInfoDetail_Wraps) $tts.getWrapsMap().get(ttInfoId);
  398 + if (ttInfoDetail_wraps == null) {
  399 + // 时刻表为空,直接跳过
  400 + // 如1118路,周末不开,此是时刻表指定一个空表
  401 + // TODO:这个以后要改的,选时刻表的规则要修正,没有默认的时刻表
  402 + continue;
  403 + }
  404 +
  405 + List detaillist = (List) ttInfoDetail_wraps.getDetailsMap().get(gid);
  406 + if (detaillist == null) {
  407 + // 这里翻到的路牌时刻表里可能没有,
  408 + // 因为没有考虑翻班格式(就是做几休几)
  409 + // 所有翻班格式全由时刻表决定,即时刻表有的路牌就做,没有不做
  410 + continue;
  411 + }
  412 +
  413 + for (int j = 0; j < detaillist.size(); j++) {
  414 + TTInfoDetail_Wrap wrap = (TTInfoDetail_Wrap) detaillist.get(j);
  415 +
  416 + SchedulePlanInfo schedulePlanInfo = new SchedulePlanInfo(
  417 + xl,
  418 + sro,
  419 + wrap.getSelf(),
  420 + wrap.getIsFb(),
  421 + carConfigInfo,
  422 + eclist,
  423 + $param.getSchedulePlan(),
  424 + wrap.getIsFirstBc(),
  425 + wrap.getIsLastBc(),
  426 + sro.getsType()
  427 + );
  428 +
  429 + // 获取公司,分公司信息
  430 + String gsbm = xl.getCompany();
  431 + String fgsbm = xl.getBrancheCompany();
  432 + Business gs = null;
  433 + Business fgs = null;
  434 +
  435 + if (StringUtils.isNotEmpty(gsbm)) {
  436 + gs = (Business) gsMap.get(gsbm);
  437 + }
  438 + if (StringUtils.isNotEmpty(gsbm) && StringUtils.isNotEmpty(fgsbm)) {
  439 + fgs = (Business) fgsMap.get(gsbm + "_" + fgsbm);
  440 + }
  441 +
  442 + if (gs != null) {
  443 + schedulePlanInfo.setGsBm(gs.getBusinessCode());
  444 + schedulePlanInfo.setGsName(gs.getBusinessName());
  445 + }
  446 + if (fgs != null) {
  447 + schedulePlanInfo.setFgsBm(fgs.getBusinessCode());
  448 + schedulePlanInfo.setFgsName(fgs.getBusinessName());
  449 + }
  450 +
  451 + // 操作人,操作时间
  452 + schedulePlanInfo.setCreateBy($param.getSchedulePlan().getCreateBy());
  453 + schedulePlanInfo.setCreateDate($param.getSchedulePlan().getCreateDate());
  454 + schedulePlanInfo.setUpdateBy($param.getSchedulePlan().getUpdateBy());
  455 + schedulePlanInfo.setUpdateDate($param.getSchedulePlan().getUpdateDate());
  456 +
  457 + // result 输出
  458 + planResult.getSchedulePlanInfos().add(schedulePlanInfo);
  459 +
  460 + }
  461 +
  462 + }
  463 +
  464 + log.info("xlid={} plan ok!", $xlId);
  465 +
  466 +end
  467 +
  468 +
  469 +
  470 +
  471 +
  472 +
  473 +
  474 +
  475 +
  476 +
  477 +
  478 +
  479 +
  480 +
src/main/resources/rules/rerun.drl renamed to src/main/resources/rules/kBase1_core_rerun.drl
1 -package com.bsth.service.schedule.rerun;  
2 -  
3 -import org.joda.time.*;  
4 -import java.util.*;  
5 -  
6 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;  
7 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;  
8 -  
9 -import com.bsth.service.schedule.rules.rerun.RerunRule_input;  
10 -import com.bsth.service.schedule.rules.rerun.RerunRule_param;  
11 -  
12 -import com.bsth.repository.schedule.CarConfigInfoRepository;  
13 -import com.bsth.repository.schedule.EmployeeConfigInfoRepository;  
14 -  
15 -import org.slf4j.Logger  
16 -import com.bsth.entity.schedule.CarConfigInfo  
17 -import java.util.HashMap  
18 -import com.bsth.entity.schedule.EmployeeConfigInfo  
19 -import com.bsth.entity.schedule.SchedulePlanInfo;  
20 -  
21 -// 全局日志类(一般使用调用此规则的service类)  
22 -global Logger log;  
23 -  
24 -global CarConfigInfoRepository carConfigInfoRepository;  
25 -global EmployeeConfigInfoRepository employeeConfigInfoRepository;  
26 -  
27 -// 输出  
28 -  
29 -  
30 -/*  
31 - 规则说明:  
32 - 1、对应路牌规则:将对应路牌的车辆,人员替换指定的套跑班次已有的配置  
33 - 2、对应班车规则:直接使用指定的人员,车辆替换指定的套跑班次已有的配置  
34 -*/  
35 -  
36 -//-------------------- 第一阶段、计算对应路牌套跑的车辆配置,人员配置数据 -----------------//  
37 -  
38 -//--------------- 车辆配置信息载入 -------------//  
39 -declare Dylp_CarConfig_Wraps  
40 - xlId: String // 线路Id  
41 - ccMap: Map // 车辆配置Map Map<id, CarConfigInfo>  
42 -end  
43 -  
44 -rule "calcu_Dylp_CarConfig_Wraps"  
45 - salience 1000  
46 - when  
47 - $rp: RerunRule_param($xlId: mxlid)  
48 - $dylpxlid: String() from $rp.getXlIds_dylp()  
49 - then  
50 - List carConfigInfos = carConfigInfoRepository.findByXlId(Integer.parseInt($dylpxlid));  
51 -  
52 - Dylp_CarConfig_Wraps carConfig_wraps = new Dylp_CarConfig_Wraps();  
53 - carConfig_wraps.setXlId($dylpxlid);  
54 - carConfig_wraps.setCcMap(new HashMap());  
55 -  
56 - for (int i = 0; i < carConfigInfos.size(); i++) {  
57 - CarConfigInfo carConfigInfo = (CarConfigInfo) carConfigInfos.get(i);  
58 - carConfig_wraps.getCcMap().put(carConfigInfo.getId().toString(), carConfigInfo);  
59 - }  
60 -  
61 - insert(carConfig_wraps);  
62 -  
63 - log.info("calcu_Dylp_CarConfig_Wraps");  
64 -  
65 -end  
66 -  
67 -//--------------- 人员配置信息载入 --------------//  
68 -declare Dylp_EmployeeConfig_Wraps  
69 - xlId: String // 线路Id  
70 - ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>  
71 -end  
72 -  
73 -rule "calcu_Dylp_EmployeeConfig_Wraps"  
74 - salience 1000  
75 - when  
76 - $rp: RerunRule_param($xlId: mxlid)  
77 - $dylpxlid: String() from $rp.getXlIds_dylp()  
78 - then  
79 - List employeeConfigInfos = employeeConfigInfoRepository.findByXlId(Integer.parseInt($dylpxlid));  
80 -  
81 - Dylp_EmployeeConfig_Wraps employeeConfig_wraps = new Dylp_EmployeeConfig_Wraps();  
82 - employeeConfig_wraps.setXlId($dylpxlid);  
83 - employeeConfig_wraps.setEcMap(new HashMap());  
84 -  
85 - for (int i = 0; i < employeeConfigInfos.size(); i++) {  
86 - EmployeeConfigInfo employeeConfigInfo = (EmployeeConfigInfo) employeeConfigInfos.get(i);  
87 - employeeConfig_wraps.getEcMap().put(employeeConfigInfo.getId().toString(), employeeConfigInfo);  
88 - }  
89 -  
90 - insert(employeeConfig_wraps);  
91 -  
92 - log.info("calcu_Dylp_EmployeeConfig_Wraps");  
93 -  
94 -end  
95 -  
96 -//-------------------- 第二阶段、包装对应路牌的循环规则输出 -----------------//  
97 -  
98 -declare Dylp_ScheduleResult_output_wrap  
99 - xlId: String // 线路  
100 - sd: DateTime // 日期  
101 - lp: String // 路牌  
102 - cc: CarConfigInfo // 使用的车辆配置  
103 - ec: List // 使用的人员配置 List<EmployeeConfigInfo>  
104 -end  
105 -  
106 -rule "calcu_Dylp_ScheduleResult_output_wrap"  
107 - salience 900  
108 - when  
109 - $sro: ScheduleResults_output($xlId: xlid)  
110 - $sr: ScheduleResult_output() from $sro.getResults()  
111 - Dylp_CarConfig_Wraps(xlId == $xlId, $ccmap: ccMap)  
112 - Dylp_EmployeeConfig_Wraps(xlId == $xlId, $ecmap: ecMap)  
113 - then  
114 - Dylp_ScheduleResult_output_wrap wrap = new Dylp_ScheduleResult_output_wrap();  
115 - wrap.setXlId($xlId);  
116 - wrap.setSd($sr.getSd());  
117 - wrap.setLp($sr.getGuideboardId());  
118 - wrap.setCc((CarConfigInfo) $ccmap.get($sr.getCarConfigId()));  
119 -  
120 - List ecs = new ArrayList();  
121 - String[] ecids = $sr.getEmployeeConfigId().split("-"); // 分班的人  
122 - for (int i = 0; i < ecids.length; i++) {  
123 - ecs.add($ecmap.get(ecids[i]));  
124 - }  
125 - wrap.setEc(ecs);  
126 -  
127 -// log.info("xlid = {}", $xlId);  
128 -  
129 - insert(wrap);  
130 -end  
131 -  
132 -//-------------------- 第三阶段、套跑线路,替换班次的车辆,人员 --------------------//  
133 -rule "calcu_Dylp_rerun_update_dylp"  
134 - salience 800  
135 -// no-loop  
136 - when  
137 - $spi: SchedulePlanInfo($xlid: xl, $sd: scheduleDate, $lp: lp, $fcsj: fcsj, $ttinfo: ttInfo)  
138 - $ri: RerunRule_input(  
139 - type == "dylp",  
140 - xl == $xlid.toString(),  
141 - ttinfo == $ttinfo.toString(),  
142 - lp == $lp.toString(),  
143 - fcsj == $fcsj,  
144 - $sxl: s_xl, $slp: s_lp, $type: usetype, $hrtype: userhrtype  
145 - )  
146 - $dsro: Dylp_ScheduleResult_output_wrap(  
147 - xlId == $sxl,  
148 - lp == $slp,  
149 - sd.getMillis() == $sd.getTime()  
150 - )  
151 - then  
152 -// log.info("TODO:测试 {}", $fcsj);  
153 -  
154 - $spi.setRerunInfoDylp($dsro.getCc(), $dsro.getEc(), $type, $hrtype);  
155 -  
156 -end  
157 -  
158 -rule "calcu_Dylp_rerun_update_dybc"  
159 - salience 700  
160 - when  
161 - $spi: SchedulePlanInfo($xlid: xl, $sd: scheduleDate, $lp: lp, $fcsj: fcsj, $ttinfo: ttInfo)  
162 - $ri: RerunRule_input(  
163 - type == "dybc",  
164 - xl == $xlid.toString(),  
165 - ttinfo == $ttinfo.toString(),  
166 - lp == $lp.toString(),  
167 - fcsj == $fcsj  
168 - )  
169 -  
170 - then  
171 -  
172 - $spi.setRerunInfoDybc($ri);  
173 -  
174 -  
175 -end  
176 -  
177 -  
178 -  
179 -  
180 -  
181 -  
182 -  
183 -  
184 -  
185 -  
186 -  
187 -  
188 -  
189 -  
190 -  
191 -  
192 - 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.rerun;
  2 +
  3 +import org.joda.time.*;
  4 +import java.util.*;
  5 +
  6 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResult_output;
  7 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResults_output;
  8 +
  9 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_input;
  10 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_param;
  11 +
  12 +import com.bsth.repository.schedule.CarConfigInfoRepository;
  13 +import com.bsth.repository.schedule.EmployeeConfigInfoRepository;
  14 +
  15 +import org.slf4j.Logger;
  16 +import com.bsth.entity.schedule.CarConfigInfo;
  17 +import java.util.HashMap;
  18 +import com.bsth.entity.schedule.EmployeeConfigInfo;
  19 +import com.bsth.entity.schedule.SchedulePlanInfo;
  20 +
  21 +// 全局日志类(一般使用调用此规则的service类)
  22 +global Logger log;
  23 +
  24 +global CarConfigInfoRepository carConfigInfoRepository;
  25 +global EmployeeConfigInfoRepository employeeConfigInfoRepository;
  26 +
  27 +// 输出
  28 +
  29 +
  30 +/*
  31 + 规则说明:
  32 + 1、对应路牌规则:将对应路牌的车辆,人员替换指定的套跑班次已有的配置
  33 + 2、对应班车规则:直接使用指定的人员,车辆替换指定的套跑班次已有的配置
  34 +*/
  35 +
  36 +//-------------------- 第一阶段、计算对应路牌套跑的车辆配置,人员配置数据 -----------------//
  37 +
  38 +//--------------- 车辆配置信息载入 -------------//
  39 +declare Dylp_CarConfig_Wraps
  40 + xlId: String // 线路Id
  41 + ccMap: Map // 车辆配置Map Map<id, CarConfigInfo>
  42 +end
  43 +
  44 +rule "calcu_Dylp_CarConfig_Wraps"
  45 + salience 1000
  46 + when
  47 + $rp: RerunRule_param($xlId: mxlid)
  48 + $dylpxlid: String() from $rp.getXlIds_dylp()
  49 + then
  50 + List carConfigInfos = carConfigInfoRepository.findByXlId(Integer.parseInt($dylpxlid));
  51 +
  52 + Dylp_CarConfig_Wraps carConfig_wraps = new Dylp_CarConfig_Wraps();
  53 + carConfig_wraps.setXlId($dylpxlid);
  54 + carConfig_wraps.setCcMap(new HashMap());
  55 +
  56 + for (int i = 0; i < carConfigInfos.size(); i++) {
  57 + CarConfigInfo carConfigInfo = (CarConfigInfo) carConfigInfos.get(i);
  58 + carConfig_wraps.getCcMap().put(carConfigInfo.getId().toString(), carConfigInfo);
  59 + }
  60 +
  61 + insert(carConfig_wraps);
  62 +
  63 + log.info("calcu_Dylp_CarConfig_Wraps");
  64 +
  65 +end
  66 +
  67 +//--------------- 人员配置信息载入 --------------//
  68 +declare Dylp_EmployeeConfig_Wraps
  69 + xlId: String // 线路Id
  70 + ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>
  71 +end
  72 +
  73 +rule "calcu_Dylp_EmployeeConfig_Wraps"
  74 + salience 1000
  75 + when
  76 + $rp: RerunRule_param($xlId: mxlid)
  77 + $dylpxlid: String() from $rp.getXlIds_dylp()
  78 + then
  79 + List employeeConfigInfos = employeeConfigInfoRepository.findByXlId(Integer.parseInt($dylpxlid));
  80 +
  81 + Dylp_EmployeeConfig_Wraps employeeConfig_wraps = new Dylp_EmployeeConfig_Wraps();
  82 + employeeConfig_wraps.setXlId($dylpxlid);
  83 + employeeConfig_wraps.setEcMap(new HashMap());
  84 +
  85 + for (int i = 0; i < employeeConfigInfos.size(); i++) {
  86 + EmployeeConfigInfo employeeConfigInfo = (EmployeeConfigInfo) employeeConfigInfos.get(i);
  87 + employeeConfig_wraps.getEcMap().put(employeeConfigInfo.getId().toString(), employeeConfigInfo);
  88 + }
  89 +
  90 + insert(employeeConfig_wraps);
  91 +
  92 + log.info("calcu_Dylp_EmployeeConfig_Wraps");
  93 +
  94 +end
  95 +
  96 +//-------------------- 第二阶段、包装对应路牌的循环规则输出 -----------------//
  97 +
  98 +declare Dylp_ScheduleResult_output_wrap
  99 + xlId: String // 线路
  100 + sd: DateTime // 日期
  101 + lp: String // 路牌
  102 + cc: CarConfigInfo // 使用的车辆配置
  103 + ec: List // 使用的人员配置 List<EmployeeConfigInfo>
  104 +end
  105 +
  106 +rule "calcu_Dylp_ScheduleResult_output_wrap"
  107 + salience 900
  108 + when
  109 + $sro: ScheduleResults_output($xlId: xlid)
  110 + $sr: ScheduleResult_output() from $sro.getResults()
  111 + Dylp_CarConfig_Wraps(xlId == $xlId, $ccmap: ccMap)
  112 + Dylp_EmployeeConfig_Wraps(xlId == $xlId, $ecmap: ecMap)
  113 + then
  114 + Dylp_ScheduleResult_output_wrap wrap = new Dylp_ScheduleResult_output_wrap();
  115 + wrap.setXlId($xlId);
  116 + wrap.setSd($sr.getSd());
  117 + wrap.setLp($sr.getGuideboardId());
  118 + wrap.setCc((CarConfigInfo) $ccmap.get($sr.getCarConfigId()));
  119 +
  120 + List ecs = new ArrayList();
  121 + String[] ecids = $sr.getEmployeeConfigId().split("-"); // 分班的人
  122 + for (int i = 0; i < ecids.length; i++) {
  123 + ecs.add($ecmap.get(ecids[i]));
  124 + }
  125 + wrap.setEc(ecs);
  126 +
  127 +// log.info("xlid = {}", $xlId);
  128 +
  129 + insert(wrap);
  130 +end
  131 +
  132 +//-------------------- 第三阶段、套跑线路,替换班次的车辆,人员 --------------------//
  133 +rule "calcu_Dylp_rerun_update_dylp"
  134 + salience 800
  135 +// no-loop
  136 + when
  137 + $spi: SchedulePlanInfo($xlid: xl, $sd: scheduleDate, $lp: lp, $fcsj: fcsj, $ttinfo: ttInfo)
  138 + $ri: RerunRule_input(
  139 + type == "dylp",
  140 + xl == $xlid.toString(),
  141 + ttinfo == $ttinfo.toString(),
  142 + lp == $lp.toString(),
  143 + fcsj == $fcsj,
  144 + $sxl: s_xl, $slp: s_lp, $type: usetype, $hrtype: userhrtype
  145 + )
  146 + $dsro: Dylp_ScheduleResult_output_wrap(
  147 + xlId == $sxl,
  148 + lp == $slp,
  149 + sd.getMillis() == $sd.getTime()
  150 + )
  151 + then
  152 +// log.info("TODO:测试 {}", $fcsj);
  153 +
  154 + $spi.setRerunInfoDylp($dsro.getCc(), $dsro.getEc(), $type, $hrtype);
  155 +
  156 +end
  157 +
  158 +rule "calcu_Dylp_rerun_update_dybc"
  159 + salience 700
  160 + when
  161 + $spi: SchedulePlanInfo($xlid: xl, $sd: scheduleDate, $lp: lp, $fcsj: fcsj, $ttinfo: ttInfo)
  162 + $ri: RerunRule_input(
  163 + type == "dybc",
  164 + xl == $xlid.toString(),
  165 + ttinfo == $ttinfo.toString(),
  166 + lp == $lp.toString(),
  167 + fcsj == $fcsj
  168 + )
  169 +
  170 + then
  171 +
  172 + $spi.setRerunInfoDybc($ri);
  173 +
  174 +
  175 +end
  176 +
  177 +
  178 +
  179 +
  180 +
  181 +
  182 +
  183 +
  184 +
  185 +
  186 +
  187 +
  188 +
  189 +
  190 +
  191 +
  192 +
src/main/resources/rules/shiftloop_fb_2.drl renamed to src/main/resources/rules/kBase1_core_shiftloop.drl
1 -package com.bsth.service.schedule.shiftloop;  
2 -  
3 -import org.joda.time.*;  
4 -import java.util.*;  
5 -  
6 -import com.bsth.service.schedule.rules.ttinfo.LpInfoResult_output;  
7 -  
8 -import com.bsth.service.schedule.utils.Md5Util;  
9 -  
10 -import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;  
11 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;  
12 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_Type;  
13 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;  
14 -import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;  
15 -  
16 -import com.bsth.entity.schedule.temp.SchedulePlanRuleResult;  
17 -  
18 -import com.bsth.entity.schedule.SchedulePlan;  
19 -  
20 -import com.bsth.service.schedule.rules.ScheduleRuleService;  
21 -  
22 -import org.slf4j.Logger;  
23 -  
24 -global Logger log;  
25 -global ScheduleResults_output scheduleResult;  
26 -global ScheduleRuleService scheduleRuleService;  
27 -  
28 -/*  
29 - 存在(翻班格式)  
30 -*/  
31 -  
32 -//------------------------- 第一阶段、计算规则准备数据(天数) ----------------------------//  
33 -  
34 -declare Calcu_days_result_pre  
35 - ruleId: String // 规则Id  
36 - ruleMd5: String // 规则md5  
37 - ruleEcCount: Integer // 人员范围个数  
38 -  
39 - calcu_index_lp : Integer // 计算之后路牌的起始索引  
40 - calcu_index_ry : Integer // 计算之后人员的起始索引  
41 -  
42 - fbtype: Integer // 翻班type,0:时刻表type 1:翻班格式type  
43 - fbweeks: List // 翻班格式,如:1111001111001  
44 - fbgs_index: Integer // 翻班格式起始索引(从0开始)  
45 -  
46 - // 1、第一部分循环需要用到的数据(当开始日期大于启用日期的时候才有)  
47 - calcu_start_date_1: DateTime // 第一部分开始计算日期  
48 - calcu_end_date_1: DateTime // 第一部分结束计算日期  
49 -  
50 - // 2、第二部分循环需要用到的数据  
51 - sdays : Integer // 总共需要排班的天数  
52 - calcu_start_date_2 : DateTime // 开始计算日期  
53 - calcu_end_date_2 : DateTime // 结束计算日期  
54 -  
55 -end  
56 -  
57 -/*  
58 - 计算启用日期,开始计算日期,结束计算日期,相差天数  
59 - 1、规则启用日期小于开始计算日期  
60 - 2、规则启用日期大于等于开始日期,小于等于结束日期  
61 -*/  
62 -// 1、启用日期 < 开始日期  
63 -rule "calcu_days_1_"  
64 - salience 1000  
65 - when  
66 - ScheduleCalcuParam_input(  
67 - fromDate.isBefore(toDate) || fromDate.isEqual(toDate),  
68 - $fromDate : fromDate,  
69 - $toDate : toDate,  
70 - $xlId: xlId  
71 - )  
72 - $sri: ScheduleRule_input(  
73 - $ruleId : ruleId, $qyrq : qyrq,  
74 - $lpindex : startGbdIndex, $ryindex: startEIndex)  
75 - eval($qyrq.isBefore($fromDate))  
76 - then  
77 - scheduleResult.setXlid($xlId);  
78 -  
79 - // 构造Calcu_days_result_pre,用于路牌  
80 - Calcu_days_result_pre cdrp = new Calcu_days_result_pre();  
81 - cdrp.setRuleId($ruleId);  
82 - cdrp.setCalcu_index_lp($lpindex);  
83 - cdrp.setCalcu_index_ry($ryindex);  
84 - cdrp.setCalcu_start_date_1($qyrq);  
85 - cdrp.setCalcu_end_date_1($fromDate);  
86 - Period p2 = new Period($fromDate, $toDate, PeriodType.days());  
87 - cdrp.setSdays(p2.getDays() + 1);  
88 - cdrp.setCalcu_start_date_2($fromDate);  
89 - cdrp.setCalcu_end_date_2($toDate);  
90 -  
91 - // 翻班相关  
92 - cdrp.setFbtype($sri.getFbtype());  
93 - cdrp.setFbgs_index(0);  
94 - cdrp.setFbweeks($sri.getWeekdays());  
95 -  
96 - /**  
97 - * 规则md5值(不使用id判定,使用md5判定)  
98 - * 使用,启用日期,路牌范围,结合生成md5编码  
99 - */  
100 - String ruleMd5 = Md5Util.getMd5(  
101 - String.valueOf($qyrq.getMillis()) +  
102 - "_" +  
103 - $sri.getSelf().getLpIds() +  
104 - "_" +  
105 - $sri.getSelf().getLpStart().toString()  
106 - );  
107 - cdrp.setRuleMd5(ruleMd5);  
108 - // 人员范围个数  
109 - cdrp.setRuleEcCount($sri.getEmployeeConfigIds().size());  
110 -  
111 - insert(cdrp);  
112 -  
113 -// log.info("总共需要排班的天数 sdays={} ruleId={} from={} to={}", (p2.getDays() + 1), $ruleId, $fromDate, $toDate);  
114 -  
115 -end  
116 -  
117 -// 启用日期 属于 [开始日期,结束日期]  
118 -rule "calcu_days_2_"  
119 - salience 1000  
120 - when  
121 - ScheduleCalcuParam_input(  
122 - fromDate.isBefore(toDate) || fromDate.isEqual(toDate),  
123 - $fromDate : fromDate,  
124 - $toDate : toDate,  
125 - $xlId: xlId  
126 - )  
127 - $sri: ScheduleRule_input(  
128 - $ruleId : ruleId, $qyrq : qyrq,  
129 - $lpindex : startGbdIndex, $ryindex: startEIndex)  
130 - eval((!$qyrq.isBefore($fromDate)) && (!$qyrq.isAfter($toDate)))  
131 - then  
132 - scheduleResult.setXlid($xlId);  
133 -  
134 - // 构造Calcu_days_result_pre,用于路牌  
135 - Calcu_days_result_pre cdrp = new Calcu_days_result_pre();  
136 - cdrp.setRuleId($ruleId);  
137 - cdrp.setCalcu_index_lp($lpindex);  
138 - cdrp.setCalcu_index_ry($ryindex);  
139 - cdrp.setCalcu_start_date_1($qyrq);  
140 - cdrp.setCalcu_end_date_1($qyrq);  
141 - Period p2 = new Period($qyrq, $toDate, PeriodType.days());  
142 - cdrp.setSdays(p2.getDays() + 1);  
143 - cdrp.setCalcu_start_date_2($qyrq);  
144 - cdrp.setCalcu_end_date_2($toDate);  
145 -  
146 - // 翻班相关  
147 - cdrp.setFbtype($sri.getFbtype());  
148 - cdrp.setFbgs_index(0);  
149 - cdrp.setFbweeks($sri.getWeekdays());  
150 -  
151 - /**  
152 - * 规则md5值(不使用id判定,使用md5判定)  
153 - * 使用,启用日期,路牌范围,结合生成md5编码  
154 - */  
155 - String ruleMd5 = Md5Util.getMd5(  
156 - String.valueOf($qyrq.getMillis()) +  
157 - "_" +  
158 - $sri.getSelf().getLpIds() +  
159 - "_" +  
160 - $sri.getSelf().getLpStart().toString()  
161 - );  
162 - cdrp.setRuleMd5(ruleMd5);  
163 - // 人员范围个数  
164 - cdrp.setRuleEcCount($sri.getEmployeeConfigIds().size());  
165 -  
166 - insert(cdrp);  
167 -  
168 -// log.info("总共需要排班的天数 sdays={} ruleId={} from={} to={}", (p2.getDays() + 1), $ruleId, $qyrq, $toDate);  
169 -  
170 -end  
171 -  
172 -// 使用已经排过班的数据修正Calcu_days_result_pre  
173 -// 1、避免每次从规则的启用日期开始算  
174 -// 2、时刻表会不停的修正,如果每次都从规则启用日期开始算,会出错  
175 -  
176 -declare SchedulePlanRuleResult_wrap  
177 - ruleId: String // 规则Id  
178 - ruleMd5: String // 规则md5编码  
179 - scheduleDate: DateTime // 排班日期  
180 -  
181 - isUsed: Boolean = false // 是否被使用过  
182 -  
183 - self: SchedulePlanRuleResult; // 原始对象数据  
184 -end  
185 -  
186 -rule "Calcu_SchedulePlanRuleResult_wrap"  
187 - salience 950  
188 - when  
189 - ScheduleCalcuParam_input(  
190 - fromDate.isBefore(toDate) || fromDate.isEqual(toDate),  
191 - $fromDate : fromDate,  
192 - $toDate : toDate,  
193 - $xlId: xlId,  
194 - $self: schedulePlan  
195 - )  
196 - eval($self.getIsHistoryPlanFirst() == true) // 是否使用历史排班标识  
197 - $sprr: SchedulePlanRuleResult() from scheduleRuleService.findLastByXl($xlId, $fromDate.toDate())  
198 - eval($sprr.getQyrq() != null)  
199 -  
200 - then  
201 - // 创建班序历史结果数据  
202 - SchedulePlanRuleResult_wrap schedulePlanRuleResult_wrap = new SchedulePlanRuleResult_wrap();  
203 - schedulePlanRuleResult_wrap.setRuleId($sprr.getRuleId());  
204 - schedulePlanRuleResult_wrap.setScheduleDate(new DateTime($sprr.getScheduleDate()));  
205 - schedulePlanRuleResult_wrap.setSelf($sprr);  
206 -  
207 - // 规则Md5编码  
208 - String md5 = Md5Util.getMd5(  
209 - String.valueOf($sprr.getQyrq().getTime()) +  
210 - "_" +  
211 - $sprr.getGids() +  
212 - "_" +  
213 - $sprr.getOrigingidindex()  
214 - );  
215 -  
216 -// System.out.println("修改后的md5:" + md5 + "车辆:" + $sprr.getCcZbh());  
217 -  
218 - schedulePlanRuleResult_wrap.setRuleMd5(md5);  
219 -  
220 - insert(schedulePlanRuleResult_wrap);  
221 -end  
222 -  
223 -  
224 -// 1、启用日期 < 开始日期  
225 -// 2、如果最近的排班规则历史时间在 (启用日期,开始日期) 之间,需要重新修正预处理数据  
226 -rule "calcu_days_1_with_result"  
227 - no-loop  
228 - salience 960  
229 - when  
230 - $cdrp: Calcu_days_result_pre(  
231 - calcu_start_date_1.isBefore(calcu_start_date_2),  
232 - $ruleId: ruleId,  
233 - $ruleMd5: ruleMd5,  
234 - $ruleEcCount: ruleEcCount  
235 - )  
236 - $srrr_wrap: SchedulePlanRuleResult_wrap(  
237 -// ruleId == $ruleId,  
238 - ruleMd5 == $ruleMd5,  
239 - scheduleDate.isAfter($cdrp.calcu_start_date_1),  
240 - scheduleDate.isBefore($cdrp.calcu_start_date_2),  
241 - isUsed == false,  
242 - $scheduleDate: scheduleDate,  
243 - $self: self  
244 - )  
245 - then  
246 - // 修正排班数据  
247 -// log.info("准备修正 ruleId={} historyDate={}", $ruleId, $scheduleDate);  
248 -  
249 - // 路牌范围起始index使用历史数据  
250 - $cdrp.setCalcu_index_lp(Integer.valueOf($self.getGidindex()));  
251 - // 人员范围起始index,需要判定,如果长度都是一样的,使用历史的,否则不更新,使用最新的  
252 - String history_ecids = $self.getEcids();  
253 - if ($ruleEcCount == history_ecids.split(",").length) {  
254 - $cdrp.setCalcu_index_ry(Integer.valueOf($self.getEcindex()));  
255 - }  
256 -  
257 - // 翻班格式利用路牌的历史index更新  
258 - int fb_temp = Integer.valueOf($self.getGidindex()) % $cdrp.getFbweeks().size();  
259 - $cdrp.setFbgs_index(fb_temp);  
260 -  
261 - $cdrp.setCalcu_start_date_1($scheduleDate);  
262 - update($cdrp);  
263 -  
264 - $srrr_wrap.setIsUsed(true);  
265 - update($srrr_wrap);  
266 -  
267 -end  
268 -  
269 -  
270 -  
271 -//------------------------- 第二阶段、计算规则准备数据2(第一组循环) ----------------------------//  
272 -  
273 -function void calcu_loop1_fb(Calcu_days_result_pre $cdrp, ScheduleRule_input $sri, Logger log) {  
274 - Integer $lpindex = $cdrp.getCalcu_index_lp();  
275 - Integer $lprangesize = $sri.getGuideboardIds().size();  
276 - Integer $ryindex = $cdrp.getCalcu_index_ry();  
277 - Integer $ryrangesize = $sri.getEmployeeConfigIds().size();  
278 - Integer $fbindex = $cdrp.getFbgs_index();  
279 - Integer $fbfangesize = $sri.getWeekdays().size();  
280 - DateTime $csd1 = $cdrp.getCalcu_start_date_1();  
281 - DateTime $ced1 = $cdrp.getCalcu_end_date_1();  
282 -  
283 - String $ruleId = $cdrp.getRuleId();  
284 -  
285 - $cdrp.setCalcu_index_lp(($lpindex + 1) % $lprangesize);  
286 - $cdrp.setCalcu_index_ry(($ryindex + 1) % $ryrangesize);  
287 -  
288 - $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);  
289 - $cdrp.setCalcu_start_date_1($csd1.plusDays(1));  
290 -  
291 -// log.info("calcu_loop1_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",  
292 -// $ruleId, $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd1, $ced1);  
293 -  
294 -}  
295 -function void calcu_loop1_not_fb(Calcu_days_result_pre $cdrp, ScheduleRule_input $sri, Logger log) {  
296 - DateTime $csd1 = $cdrp.getCalcu_start_date_1();  
297 - DateTime $ced1 = $cdrp.getCalcu_end_date_1();  
298 - Integer $fbindex = $cdrp.getFbgs_index();  
299 - Integer $fbfangesize = $sri.getWeekdays().size();  
300 -  
301 - $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);  
302 - $cdrp.setCalcu_start_date_1($csd1.plusDays(1));  
303 -  
304 -// log.info("calcu_loop1_not_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",  
305 -// $cdrp.getRuleId(), $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd1, $ced1);  
306 -}  
307 -  
308 -  
309 -rule "Calcu_loop1_fbtype_with_0_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是false,就跳过  
310 - salience 900  
311 - when  
312 - $cdrp: Calcu_days_result_pre(  
313 - calcu_start_date_1.isBefore(calcu_end_date_1),  
314 - $ruleId: ruleId,  
315 - fbtype == "1",  
316 - $fbindex : fbgs_index  
317 - )  
318 - $sri: ScheduleRule_input(  
319 - ruleId == $ruleId,  
320 - weekdays[$fbindex] == false  
321 - )  
322 - then  
323 - calcu_loop1_not_fb($cdrp, $sri, log);  
324 - update($cdrp);  
325 -end  
326 -  
327 -rule "Calcu_loop1_fbtype_with_1_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里存在指定路牌,就翻  
328 - salience 900  
329 - when  
330 - $cdrp: Calcu_days_result_pre(  
331 - calcu_start_date_1.isBefore(calcu_end_date_1),  
332 - $csd1: calcu_start_date_1,  
333 - $ruleId: ruleId,  
334 - fbtype == "1",  
335 - $lpindex: calcu_index_lp,  
336 - $fbindex : fbgs_index  
337 - )  
338 - $sri: ScheduleRule_input(  
339 - ruleId == $ruleId,  
340 - $gids: guideboardIds,  
341 - weekdays[$fbindex] == true  
342 - )  
343 - $liro: LpInfoResult_output(  
344 - dateTime.isEqual($csd1),  
345 - $gids[$lpindex] == lpId  
346 - )  
347 - then  
348 - calcu_loop1_fb($cdrp, $sri, log);  
349 - update($cdrp);  
350 -  
351 -end  
352 -  
353 -rule "Calcu_loop1_fbtype_with_1_no_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里不存在指定路牌,就跳过  
354 - salience 900  
355 - when  
356 - $cdrp: Calcu_days_result_pre(  
357 - calcu_start_date_1.isBefore(calcu_end_date_1),  
358 - $csd1: calcu_start_date_1,  
359 - $ruleId: ruleId,  
360 - fbtype == "1",  
361 - $fbindex : fbgs_index  
362 - )  
363 - $sri: ScheduleRule_input(  
364 - ruleId == $ruleId,  
365 - weekdays[$fbindex] == true  
366 - )  
367 - then  
368 - calcu_loop1_not_fb($cdrp, $sri, log);  
369 - update($cdrp);  
370 -end  
371 -  
372 -  
373 -rule "Calcu_loop1_timetabletype_with_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中存在,就翻  
374 - salience 900  
375 - when  
376 - $cdrp: Calcu_days_result_pre(  
377 - calcu_start_date_1.isBefore(calcu_end_date_1),  
378 - $csd1: calcu_start_date_1,  
379 - $ruleId: ruleId,  
380 - fbtype == "0",  
381 - $lpindex: calcu_index_lp  
382 - )  
383 - $sri: ScheduleRule_input(  
384 - ruleId == $ruleId,  
385 - $gids: guideboardIds  
386 - )  
387 - $liro: LpInfoResult_output(  
388 - dateTime.isEqual($csd1),  
389 - $gids[$lpindex] == lpId  
390 - )  
391 - then  
392 - calcu_loop1_fb($cdrp, $sri, log);  
393 - update($cdrp);  
394 -end  
395 -  
396 -rule "Calcu_loop1_timetabletype_with_no_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中不存在,就跳过  
397 - salience 900  
398 - when  
399 - $cdrp: Calcu_days_result_pre(  
400 - calcu_start_date_1.isBefore(calcu_end_date_1),  
401 - $csd1: calcu_start_date_1,  
402 - $ruleId: ruleId,  
403 - fbtype == "0"  
404 - )  
405 - $sri: ScheduleRule_input(  
406 - ruleId == $ruleId  
407 - )  
408 - then  
409 - calcu_loop1_not_fb($cdrp, $sri, log);  
410 - update($cdrp);  
411 -end  
412 -  
413 -//------------------------- 第三阶段、计算规则准备数据2(第二组循环) ----------------------------//  
414 -  
415 -function void calcu_loop2_fb(  
416 - SchedulePlan $sp,  
417 - Calcu_days_result_pre $cdrp,  
418 - ScheduleRule_input $sri,  
419 - LpInfoResult_output $liro,  
420 - ScheduleResults_output rs,  
421 - Logger log) {  
422 - String $ruleId = $cdrp.getRuleId();  
423 - DateTime $csd2 = $cdrp.getCalcu_start_date_2();  
424 - DateTime $ced2 = $cdrp.getCalcu_end_date_2();  
425 - Integer $lpindex = $cdrp.getCalcu_index_lp();  
426 - List $gids = $sri.getGuideboardIds();  
427 - Integer $lprangesize = $sri.getGuideboardIds().size();  
428 - Integer $ryindex = $cdrp.getCalcu_index_ry();  
429 - List $eids = $sri.getEmployeeConfigIds();  
430 - Integer $ryrangesize = $sri.getEmployeeConfigIds().size();  
431 - Integer $fbindex = $cdrp.getFbgs_index();  
432 - Integer $fbfangesize = $sri.getWeekdays().size();  
433 - String $cid = $sri.getCarConfigId();  
434 - String $xlid = $sri.getXlId();  
435 -  
436 - com.bsth.entity.schedule.rule.ScheduleRule1Flat $srf = $sri.getSelf();  
437 -  
438 - String $ttinfoId = $liro.getTtInfoId();  
439 - String $ttinfoName = $liro.getTtInfoName();  
440 -  
441 - ScheduleResult_output ro = new ScheduleResult_output();  
442 - ro.setRuleId($ruleId);  
443 - ro.setSd($csd2);  
444 - ro.setGuideboardId(String.valueOf($gids.get($lpindex)));  
445 - ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex)));  
446 - ro.setCarConfigId($cid);  
447 - ro.setXlId($xlid);  
448 -  
449 - // 类型  
450 - ro.setsType($sri.getsType());  
451 -  
452 - rs.getResults().add(ro);  
453 -  
454 -// log.info("gogoogogogogo");  
455 -  
456 - $cdrp.setCalcu_index_lp(($lpindex + 1) % $lprangesize);  
457 - $cdrp.setCalcu_index_ry(($ryindex + 1) % $ryrangesize);  
458 -  
459 - $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);  
460 - $cdrp.setCalcu_start_date_2($csd2.plusDays(1));  
461 -  
462 - if ($sri.getsType() == ScheduleRule_Type.NORMAL) {  
463 - // 保存排班规则循环结果 --> SchedulePlanRuleResult  
464 - SchedulePlanRuleResult schedulePlanRuleResult = new SchedulePlanRuleResult($sp);  
465 -// schedulePlanRuleResult.setXlId(String.valueOf($srf.getXl().getId()));  
466 - schedulePlanRuleResult.setXlId($srf.getXl().getId());  
467 - schedulePlanRuleResult.setXlName($srf.getXl().getName());  
468 - schedulePlanRuleResult.setRuleId($ruleId);  
469 - schedulePlanRuleResult.setCcId($cid);  
470 - schedulePlanRuleResult.setCcZbh($srf.getCarConfigInfo().getCl().getInsideCode());  
471 - schedulePlanRuleResult.setGids($srf.getLpIds()); // 参与md5计算  
472 - schedulePlanRuleResult.setGnames($srf.getLpNames());  
473 - schedulePlanRuleResult.setGidindex(String.valueOf($lpindex));  
474 - schedulePlanRuleResult.setEcids($srf.getRyConfigIds());  
475 - schedulePlanRuleResult.setEcdbbms($srf.getRyDbbms());  
476 - schedulePlanRuleResult.setEcindex(String.valueOf($ryindex));  
477 - schedulePlanRuleResult.setScheduleDate($csd2.toDate());  
478 - schedulePlanRuleResult.setTtinfoId($ttinfoId);  
479 - schedulePlanRuleResult.setTtinfoName($ttinfoName);  
480 - schedulePlanRuleResult.setQyrq($sri.getQyrq().toDate()); // 参与md5计算  
481 - schedulePlanRuleResult.setOrigingidindex(String.valueOf($sri.getSelf().getLpStart())); // 参与md5计算  
482 -  
483 - rs.getSchedulePlanRuleResults().add(schedulePlanRuleResult);  
484 - }  
485 -  
486 -  
487 -  
488 -// log.info("calcu_loop2_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",  
489 -// $ruleId, $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd2, $ced2);  
490 -  
491 -}  
492 -  
493 -function void calcu_loop2_not_fb(  
494 - Calcu_days_result_pre $cdrp,  
495 - ScheduleRule_input $sri,  
496 - ScheduleResults_output rs,  
497 - Logger log) {  
498 -  
499 - String $ruleId = $cdrp.getRuleId();  
500 - DateTime $csd2 = $cdrp.getCalcu_start_date_2();  
501 - DateTime $ced2 = $cdrp.getCalcu_end_date_2();  
502 - Integer $lpindex = $cdrp.getCalcu_index_lp();  
503 - List $gids = $sri.getGuideboardIds();  
504 - Integer $ryindex = $cdrp.getCalcu_index_ry();  
505 - List $eids = $sri.getEmployeeConfigIds();  
506 - Integer $fbindex = $cdrp.getFbgs_index();  
507 - Integer $fbfangesize = $sri.getWeekdays().size();  
508 - String $cid = $sri.getCarConfigId();  
509 - String $xlid = $sri.getXlId();  
510 -  
511 - ScheduleResult_output ro = new ScheduleResult_output();  
512 - ro.setRuleId($ruleId);  
513 - ro.setSd($csd2);  
514 -// ro.setGuideboardId(String.valueOf($gids.get($lpindex)));  
515 - ro.setGuideboardId("not_fb_lp"); // 不翻班,路牌id用假的,后面会过滤  
516 - ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex)));  
517 - ro.setCarConfigId($cid);  
518 - ro.setXlId($xlid);  
519 -  
520 - // 类型  
521 - ro.setsType($sri.getsType());  
522 -  
523 - rs.getResults().add(ro);  
524 -  
525 - $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);  
526 - $cdrp.setCalcu_start_date_2($csd2.plusDays(1));  
527 -  
528 -// log.info("calcu_loop2_not_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",  
529 -// $ruleId, $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd2, $ced2);  
530 -  
531 -}  
532 -  
533 -rule "Calcu_loop2_fbtype_with_0_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是false,就跳过  
534 - salience 800  
535 - when  
536 - ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)  
537 - $cdrp: Calcu_days_result_pre(  
538 - calcu_start_date_1.isEqual(calcu_end_date_1),  
539 - calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),  
540 - $ruleId: ruleId,  
541 - fbtype == "1",  
542 - $fbindex : fbgs_index  
543 - )  
544 - $sri: ScheduleRule_input(  
545 - ruleId == $ruleId,  
546 - weekdays[$fbindex] == false  
547 - )  
548 - then  
549 - calcu_loop2_not_fb($cdrp, $sri, scheduleResult, log);  
550 - update($cdrp);  
551 -  
552 -end  
553 -  
554 -rule "Calcu_loop2_fbtype_with_1_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里存在指定路牌,就翻  
555 - salience 800  
556 - when  
557 - ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)  
558 - $cdrp: Calcu_days_result_pre(  
559 - calcu_start_date_1.isEqual(calcu_end_date_1),  
560 - calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),  
561 - $csd2: calcu_start_date_2,  
562 - $ruleId: ruleId,  
563 - fbtype == "1",  
564 - $lpindex: calcu_index_lp,  
565 - $fbindex : fbgs_index  
566 - )  
567 - $sri: ScheduleRule_input(  
568 - ruleId == $ruleId,  
569 - $gids: guideboardIds,  
570 - weekdays[$fbindex] == true  
571 - )  
572 - $liro: LpInfoResult_output(  
573 - dateTime.isEqual($csd2),  
574 - $gids[$lpindex] == lpId  
575 - )  
576 - then  
577 - calcu_loop2_fb($sp, $cdrp, $sri, $liro, scheduleResult, log);  
578 - update($cdrp);  
579 -end  
580 -  
581 -rule "Calcu_loop2_fbtype_with_1_no_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里不存在指定路牌,就跳过  
582 - salience 800  
583 - when  
584 - ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)  
585 - $cdrp: Calcu_days_result_pre(  
586 - calcu_start_date_1.isEqual(calcu_end_date_1),  
587 - calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),  
588 - $ruleId: ruleId,  
589 - fbtype == "1",  
590 - $fbindex : fbgs_index  
591 - )  
592 - $sri: ScheduleRule_input(  
593 - ruleId == $ruleId,  
594 - weekdays[$fbindex] == true  
595 - )  
596 - then  
597 - calcu_loop2_not_fb($cdrp, $sri, scheduleResult, log);  
598 - update($cdrp);  
599 -  
600 -end  
601 -  
602 -rule "Calcu_loop2_timetabletype_with_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中存在,就翻  
603 - salience 800  
604 - when  
605 - ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)  
606 - $cdrp: Calcu_days_result_pre(  
607 - calcu_start_date_1.isEqual(calcu_end_date_1),  
608 - calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),  
609 - $csd2: calcu_start_date_2,  
610 - $ruleId: ruleId,  
611 - fbtype == "0",  
612 - $lpindex: calcu_index_lp,  
613 - $fbindex : fbgs_index  
614 - )  
615 - $sri: ScheduleRule_input(  
616 - ruleId == $ruleId,  
617 - $gids: guideboardIds  
618 - )  
619 - $liro: LpInfoResult_output(  
620 - dateTime.isEqual($csd2),  
621 - $gids[$lpindex] == lpId  
622 - )  
623 - then  
624 - calcu_loop2_fb($sp, $cdrp, $sri, $liro, scheduleResult, log);  
625 - update($cdrp);  
626 -  
627 -end  
628 -  
629 -rule "Calcu_loop2_timetabletype_with_no_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中不存在,就跳过  
630 - salience 800  
631 - when  
632 - ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)  
633 - $cdrp: Calcu_days_result_pre(  
634 - calcu_start_date_1.isEqual(calcu_end_date_1),  
635 - calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),  
636 - $ruleId: ruleId,  
637 - fbtype == "0"  
638 - )  
639 - $sri: ScheduleRule_input(  
640 - ruleId == $ruleId  
641 - )  
642 - then  
643 - calcu_loop2_not_fb($cdrp, $sri, scheduleResult, log);  
644 - update($cdrp);  
645 -end  
646 -  
647 -  
648 -  
649 -  
650 -  
651 -  
652 -  
653 - 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop;
  2 +
  3 +import org.joda.time.*;
  4 +import java.util.*;
  5 +
  6 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResult_output;
  7 +
  8 +import com.bsth.service.schedule.utils.Md5Util;
  9 +
  10 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleCalcuParam_input;
  11 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_input;
  12 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_Type;
  13 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResult_output;
  14 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleResults_output;
  15 +
  16 +import com.bsth.entity.schedule.temp.SchedulePlanRuleResult;
  17 +
  18 +import com.bsth.entity.schedule.SchedulePlan;
  19 +
  20 +import com.bsth.service.schedule.impl.plan.ScheduleRuleService;
  21 +
  22 +import org.slf4j.Logger;
  23 +
  24 +global Logger log;
  25 +global ScheduleResults_output scheduleResult;
  26 +global ScheduleRuleService scheduleRuleService;
  27 +
  28 +/*
  29 + 存在(翻班格式)
  30 +*/
  31 +
  32 +//------------------------- 第一阶段、计算规则准备数据(天数) ----------------------------//
  33 +
  34 +declare Calcu_days_result_pre
  35 + ruleId: String // 规则Id
  36 + ruleMd5: String // 规则md5
  37 + ruleEcCount: Integer // 人员范围个数
  38 +
  39 + calcu_index_lp : Integer // 计算之后路牌的起始索引
  40 + calcu_index_ry : Integer // 计算之后人员的起始索引
  41 +
  42 + fbtype: Integer // 翻班type,0:时刻表type 1:翻班格式type
  43 + fbweeks: List // 翻班格式,如:1111001111001
  44 + fbgs_index: Integer // 翻班格式起始索引(从0开始)
  45 +
  46 + // 1、第一部分循环需要用到的数据(当开始日期大于启用日期的时候才有)
  47 + calcu_start_date_1: DateTime // 第一部分开始计算日期
  48 + calcu_end_date_1: DateTime // 第一部分结束计算日期
  49 +
  50 + // 2、第二部分循环需要用到的数据
  51 + sdays : Integer // 总共需要排班的天数
  52 + calcu_start_date_2 : DateTime // 开始计算日期
  53 + calcu_end_date_2 : DateTime // 结束计算日期
  54 +
  55 +end
  56 +
  57 +/*
  58 + 计算启用日期,开始计算日期,结束计算日期,相差天数
  59 + 1、规则启用日期小于开始计算日期
  60 + 2、规则启用日期大于等于开始日期,小于等于结束日期
  61 +*/
  62 +// 1、启用日期 < 开始日期
  63 +rule "calcu_days_1_"
  64 + salience 1000
  65 + when
  66 + ScheduleCalcuParam_input(
  67 + fromDate.isBefore(toDate) || fromDate.isEqual(toDate),
  68 + $fromDate : fromDate,
  69 + $toDate : toDate,
  70 + $xlId: xlId
  71 + )
  72 + $sri: ScheduleRule_input(
  73 + $ruleId : ruleId, $qyrq : qyrq,
  74 + $lpindex : startGbdIndex, $ryindex: startEIndex)
  75 + eval($qyrq.isBefore($fromDate))
  76 + then
  77 + scheduleResult.setXlid($xlId);
  78 +
  79 + // 构造Calcu_days_result_pre,用于路牌
  80 + Calcu_days_result_pre cdrp = new Calcu_days_result_pre();
  81 + cdrp.setRuleId($ruleId);
  82 + cdrp.setCalcu_index_lp($lpindex);
  83 + cdrp.setCalcu_index_ry($ryindex);
  84 + cdrp.setCalcu_start_date_1($qyrq);
  85 + cdrp.setCalcu_end_date_1($fromDate);
  86 + Period p2 = new Period($fromDate, $toDate, PeriodType.days());
  87 + cdrp.setSdays(p2.getDays() + 1);
  88 + cdrp.setCalcu_start_date_2($fromDate);
  89 + cdrp.setCalcu_end_date_2($toDate);
  90 +
  91 + // 翻班相关
  92 + cdrp.setFbtype($sri.getFbtype());
  93 + cdrp.setFbgs_index(0);
  94 + cdrp.setFbweeks($sri.getWeekdays());
  95 +
  96 + /**
  97 + * 规则md5值(不使用id判定,使用md5判定)
  98 + * 使用,启用日期,路牌范围,结合生成md5编码
  99 + */
  100 + String ruleMd5 = Md5Util.getMd5(
  101 + String.valueOf($qyrq.getMillis()) +
  102 + "_" +
  103 + $sri.getSelf().getLpIds() +
  104 + "_" +
  105 + $sri.getSelf().getLpStart().toString()
  106 + );
  107 + cdrp.setRuleMd5(ruleMd5);
  108 + // 人员范围个数
  109 + cdrp.setRuleEcCount($sri.getEmployeeConfigIds().size());
  110 +
  111 + insert(cdrp);
  112 +
  113 +// log.info("总共需要排班的天数 sdays={} ruleId={} from={} to={}", (p2.getDays() + 1), $ruleId, $fromDate, $toDate);
  114 +
  115 +end
  116 +
  117 +// 启用日期 属于 [开始日期,结束日期]
  118 +rule "calcu_days_2_"
  119 + salience 1000
  120 + when
  121 + ScheduleCalcuParam_input(
  122 + fromDate.isBefore(toDate) || fromDate.isEqual(toDate),
  123 + $fromDate : fromDate,
  124 + $toDate : toDate,
  125 + $xlId: xlId
  126 + )
  127 + $sri: ScheduleRule_input(
  128 + $ruleId : ruleId, $qyrq : qyrq,
  129 + $lpindex : startGbdIndex, $ryindex: startEIndex)
  130 + eval((!$qyrq.isBefore($fromDate)) && (!$qyrq.isAfter($toDate)))
  131 + then
  132 + scheduleResult.setXlid($xlId);
  133 +
  134 + // 构造Calcu_days_result_pre,用于路牌
  135 + Calcu_days_result_pre cdrp = new Calcu_days_result_pre();
  136 + cdrp.setRuleId($ruleId);
  137 + cdrp.setCalcu_index_lp($lpindex);
  138 + cdrp.setCalcu_index_ry($ryindex);
  139 + cdrp.setCalcu_start_date_1($qyrq);
  140 + cdrp.setCalcu_end_date_1($qyrq);
  141 + Period p2 = new Period($qyrq, $toDate, PeriodType.days());
  142 + cdrp.setSdays(p2.getDays() + 1);
  143 + cdrp.setCalcu_start_date_2($qyrq);
  144 + cdrp.setCalcu_end_date_2($toDate);
  145 +
  146 + // 翻班相关
  147 + cdrp.setFbtype($sri.getFbtype());
  148 + cdrp.setFbgs_index(0);
  149 + cdrp.setFbweeks($sri.getWeekdays());
  150 +
  151 + /**
  152 + * 规则md5值(不使用id判定,使用md5判定)
  153 + * 使用,启用日期,路牌范围,结合生成md5编码
  154 + */
  155 + String ruleMd5 = Md5Util.getMd5(
  156 + String.valueOf($qyrq.getMillis()) +
  157 + "_" +
  158 + $sri.getSelf().getLpIds() +
  159 + "_" +
  160 + $sri.getSelf().getLpStart().toString()
  161 + );
  162 + cdrp.setRuleMd5(ruleMd5);
  163 + // 人员范围个数
  164 + cdrp.setRuleEcCount($sri.getEmployeeConfigIds().size());
  165 +
  166 + insert(cdrp);
  167 +
  168 +// log.info("总共需要排班的天数 sdays={} ruleId={} from={} to={}", (p2.getDays() + 1), $ruleId, $qyrq, $toDate);
  169 +
  170 +end
  171 +
  172 +// 使用已经排过班的数据修正Calcu_days_result_pre
  173 +// 1、避免每次从规则的启用日期开始算
  174 +// 2、时刻表会不停的修正,如果每次都从规则启用日期开始算,会出错
  175 +
  176 +declare SchedulePlanRuleResult_wrap
  177 + ruleId: String // 规则Id
  178 + ruleMd5: String // 规则md5编码
  179 + scheduleDate: DateTime // 排班日期
  180 +
  181 + isUsed: Boolean = false // 是否被使用过
  182 +
  183 + self: SchedulePlanRuleResult; // 原始对象数据
  184 +end
  185 +
  186 +rule "Calcu_SchedulePlanRuleResult_wrap"
  187 + salience 950
  188 + when
  189 + ScheduleCalcuParam_input(
  190 + fromDate.isBefore(toDate) || fromDate.isEqual(toDate),
  191 + $fromDate : fromDate,
  192 + $toDate : toDate,
  193 + $xlId: xlId,
  194 + $self: schedulePlan
  195 + )
  196 + eval($self.getIsHistoryPlanFirst() == true) // 是否使用历史排班标识
  197 + $sprr: SchedulePlanRuleResult() from scheduleRuleService.findLastByXl($xlId, $fromDate.toDate())
  198 + eval($sprr.getQyrq() != null)
  199 +
  200 + then
  201 + // 创建班序历史结果数据
  202 + SchedulePlanRuleResult_wrap schedulePlanRuleResult_wrap = new SchedulePlanRuleResult_wrap();
  203 + schedulePlanRuleResult_wrap.setRuleId($sprr.getRuleId());
  204 + schedulePlanRuleResult_wrap.setScheduleDate(new DateTime($sprr.getScheduleDate()));
  205 + schedulePlanRuleResult_wrap.setSelf($sprr);
  206 +
  207 + // 规则Md5编码
  208 + String md5 = Md5Util.getMd5(
  209 + String.valueOf($sprr.getQyrq().getTime()) +
  210 + "_" +
  211 + $sprr.getGids() +
  212 + "_" +
  213 + $sprr.getOrigingidindex()
  214 + );
  215 +
  216 +// System.out.println("修改后的md5:" + md5 + "车辆:" + $sprr.getCcZbh());
  217 +
  218 + schedulePlanRuleResult_wrap.setRuleMd5(md5);
  219 +
  220 + insert(schedulePlanRuleResult_wrap);
  221 +end
  222 +
  223 +
  224 +// 1、启用日期 < 开始日期
  225 +// 2、如果最近的排班规则历史时间在 (启用日期,开始日期) 之间,需要重新修正预处理数据
  226 +rule "calcu_days_1_with_result"
  227 + no-loop
  228 + salience 960
  229 + when
  230 + $cdrp: Calcu_days_result_pre(
  231 + calcu_start_date_1.isBefore(calcu_start_date_2),
  232 + $ruleId: ruleId,
  233 + $ruleMd5: ruleMd5,
  234 + $ruleEcCount: ruleEcCount
  235 + )
  236 + $srrr_wrap: SchedulePlanRuleResult_wrap(
  237 +// ruleId == $ruleId,
  238 + ruleMd5 == $ruleMd5,
  239 + scheduleDate.isAfter($cdrp.calcu_start_date_1),
  240 + scheduleDate.isBefore($cdrp.calcu_start_date_2),
  241 + isUsed == false,
  242 + $scheduleDate: scheduleDate,
  243 + $self: self
  244 + )
  245 + then
  246 + // 修正排班数据
  247 +// log.info("准备修正 ruleId={} historyDate={}", $ruleId, $scheduleDate);
  248 +
  249 + // 路牌范围起始index使用历史数据
  250 + $cdrp.setCalcu_index_lp(Integer.valueOf($self.getGidindex()));
  251 + // 人员范围起始index,需要判定,如果长度都是一样的,使用历史的,否则不更新,使用最新的
  252 + String history_ecids = $self.getEcids();
  253 + if ($ruleEcCount == history_ecids.split(",").length) {
  254 + $cdrp.setCalcu_index_ry(Integer.valueOf($self.getEcindex()));
  255 + }
  256 +
  257 + // 翻班格式利用路牌的历史index更新
  258 + int fb_temp = Integer.valueOf($self.getGidindex()) % $cdrp.getFbweeks().size();
  259 + $cdrp.setFbgs_index(fb_temp);
  260 +
  261 + $cdrp.setCalcu_start_date_1($scheduleDate);
  262 + update($cdrp);
  263 +
  264 + $srrr_wrap.setIsUsed(true);
  265 + update($srrr_wrap);
  266 +
  267 +end
  268 +
  269 +
  270 +
  271 +//------------------------- 第二阶段、计算规则准备数据2(第一组循环) ----------------------------//
  272 +
  273 +function void calcu_loop1_fb(Calcu_days_result_pre $cdrp, ScheduleRule_input $sri, Logger log) {
  274 + Integer $lpindex = $cdrp.getCalcu_index_lp();
  275 + Integer $lprangesize = $sri.getGuideboardIds().size();
  276 + Integer $ryindex = $cdrp.getCalcu_index_ry();
  277 + Integer $ryrangesize = $sri.getEmployeeConfigIds().size();
  278 + Integer $fbindex = $cdrp.getFbgs_index();
  279 + Integer $fbfangesize = $sri.getWeekdays().size();
  280 + DateTime $csd1 = $cdrp.getCalcu_start_date_1();
  281 + DateTime $ced1 = $cdrp.getCalcu_end_date_1();
  282 +
  283 + String $ruleId = $cdrp.getRuleId();
  284 +
  285 + $cdrp.setCalcu_index_lp(($lpindex + 1) % $lprangesize);
  286 + $cdrp.setCalcu_index_ry(($ryindex + 1) % $ryrangesize);
  287 +
  288 + $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);
  289 + $cdrp.setCalcu_start_date_1($csd1.plusDays(1));
  290 +
  291 +// log.info("calcu_loop1_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",
  292 +// $ruleId, $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd1, $ced1);
  293 +
  294 +}
  295 +function void calcu_loop1_not_fb(Calcu_days_result_pre $cdrp, ScheduleRule_input $sri, Logger log) {
  296 + DateTime $csd1 = $cdrp.getCalcu_start_date_1();
  297 + DateTime $ced1 = $cdrp.getCalcu_end_date_1();
  298 + Integer $fbindex = $cdrp.getFbgs_index();
  299 + Integer $fbfangesize = $sri.getWeekdays().size();
  300 +
  301 + $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);
  302 + $cdrp.setCalcu_start_date_1($csd1.plusDays(1));
  303 +
  304 +// log.info("calcu_loop1_not_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",
  305 +// $cdrp.getRuleId(), $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd1, $ced1);
  306 +}
  307 +
  308 +
  309 +rule "Calcu_loop1_fbtype_with_0_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是false,就跳过
  310 + salience 900
  311 + when
  312 + $cdrp: Calcu_days_result_pre(
  313 + calcu_start_date_1.isBefore(calcu_end_date_1),
  314 + $ruleId: ruleId,
  315 + fbtype == "1",
  316 + $fbindex : fbgs_index
  317 + )
  318 + $sri: ScheduleRule_input(
  319 + ruleId == $ruleId,
  320 + weekdays[$fbindex] == false
  321 + )
  322 + then
  323 + calcu_loop1_not_fb($cdrp, $sri, log);
  324 + update($cdrp);
  325 +end
  326 +
  327 +rule "Calcu_loop1_fbtype_with_1_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里存在指定路牌,就翻
  328 + salience 900
  329 + when
  330 + $cdrp: Calcu_days_result_pre(
  331 + calcu_start_date_1.isBefore(calcu_end_date_1),
  332 + $csd1: calcu_start_date_1,
  333 + $ruleId: ruleId,
  334 + fbtype == "1",
  335 + $lpindex: calcu_index_lp,
  336 + $fbindex : fbgs_index
  337 + )
  338 + $sri: ScheduleRule_input(
  339 + ruleId == $ruleId,
  340 + $gids: guideboardIds,
  341 + weekdays[$fbindex] == true
  342 + )
  343 + $liro: LpInfoResult_output(
  344 + dateTime.isEqual($csd1),
  345 + $gids[$lpindex] == lpId
  346 + )
  347 + then
  348 + calcu_loop1_fb($cdrp, $sri, log);
  349 + update($cdrp);
  350 +
  351 +end
  352 +
  353 +rule "Calcu_loop1_fbtype_with_1_no_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里不存在指定路牌,就跳过
  354 + salience 900
  355 + when
  356 + $cdrp: Calcu_days_result_pre(
  357 + calcu_start_date_1.isBefore(calcu_end_date_1),
  358 + $csd1: calcu_start_date_1,
  359 + $ruleId: ruleId,
  360 + fbtype == "1",
  361 + $fbindex : fbgs_index
  362 + )
  363 + $sri: ScheduleRule_input(
  364 + ruleId == $ruleId,
  365 + weekdays[$fbindex] == true
  366 + )
  367 + then
  368 + calcu_loop1_not_fb($cdrp, $sri, log);
  369 + update($cdrp);
  370 +end
  371 +
  372 +
  373 +rule "Calcu_loop1_timetabletype_with_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中存在,就翻
  374 + salience 900
  375 + when
  376 + $cdrp: Calcu_days_result_pre(
  377 + calcu_start_date_1.isBefore(calcu_end_date_1),
  378 + $csd1: calcu_start_date_1,
  379 + $ruleId: ruleId,
  380 + fbtype == "0",
  381 + $lpindex: calcu_index_lp
  382 + )
  383 + $sri: ScheduleRule_input(
  384 + ruleId == $ruleId,
  385 + $gids: guideboardIds
  386 + )
  387 + $liro: LpInfoResult_output(
  388 + dateTime.isEqual($csd1),
  389 + $gids[$lpindex] == lpId
  390 + )
  391 + then
  392 + calcu_loop1_fb($cdrp, $sri, log);
  393 + update($cdrp);
  394 +end
  395 +
  396 +rule "Calcu_loop1_timetabletype_with_no_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中不存在,就跳过
  397 + salience 900
  398 + when
  399 + $cdrp: Calcu_days_result_pre(
  400 + calcu_start_date_1.isBefore(calcu_end_date_1),
  401 + $csd1: calcu_start_date_1,
  402 + $ruleId: ruleId,
  403 + fbtype == "0"
  404 + )
  405 + $sri: ScheduleRule_input(
  406 + ruleId == $ruleId
  407 + )
  408 + then
  409 + calcu_loop1_not_fb($cdrp, $sri, log);
  410 + update($cdrp);
  411 +end
  412 +
  413 +//------------------------- 第三阶段、计算规则准备数据2(第二组循环) ----------------------------//
  414 +
  415 +function void calcu_loop2_fb(
  416 + SchedulePlan $sp,
  417 + Calcu_days_result_pre $cdrp,
  418 + ScheduleRule_input $sri,
  419 + LpInfoResult_output $liro,
  420 + ScheduleResults_output rs,
  421 + Logger log) {
  422 + String $ruleId = $cdrp.getRuleId();
  423 + DateTime $csd2 = $cdrp.getCalcu_start_date_2();
  424 + DateTime $ced2 = $cdrp.getCalcu_end_date_2();
  425 + Integer $lpindex = $cdrp.getCalcu_index_lp();
  426 + List $gids = $sri.getGuideboardIds();
  427 + Integer $lprangesize = $sri.getGuideboardIds().size();
  428 + Integer $ryindex = $cdrp.getCalcu_index_ry();
  429 + List $eids = $sri.getEmployeeConfigIds();
  430 + Integer $ryrangesize = $sri.getEmployeeConfigIds().size();
  431 + Integer $fbindex = $cdrp.getFbgs_index();
  432 + Integer $fbfangesize = $sri.getWeekdays().size();
  433 + String $cid = $sri.getCarConfigId();
  434 + String $xlid = $sri.getXlId();
  435 +
  436 + com.bsth.entity.schedule.rule.ScheduleRule1Flat $srf = $sri.getSelf();
  437 +
  438 + String $ttinfoId = $liro.getTtInfoId();
  439 + String $ttinfoName = $liro.getTtInfoName();
  440 +
  441 + ScheduleResult_output ro = new ScheduleResult_output();
  442 + ro.setRuleId($ruleId);
  443 + ro.setSd($csd2);
  444 + ro.setGuideboardId(String.valueOf($gids.get($lpindex)));
  445 + ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex)));
  446 + ro.setCarConfigId($cid);
  447 + ro.setXlId($xlid);
  448 +
  449 + // 类型
  450 + ro.setsType($sri.getsType());
  451 +
  452 + rs.getResults().add(ro);
  453 +
  454 +// log.info("gogoogogogogo");
  455 +
  456 + $cdrp.setCalcu_index_lp(($lpindex + 1) % $lprangesize);
  457 + $cdrp.setCalcu_index_ry(($ryindex + 1) % $ryrangesize);
  458 +
  459 + $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);
  460 + $cdrp.setCalcu_start_date_2($csd2.plusDays(1));
  461 +
  462 + if ($sri.getsType() == ScheduleRule_Type.NORMAL) {
  463 + // 保存排班规则循环结果 --> SchedulePlanRuleResult
  464 + SchedulePlanRuleResult schedulePlanRuleResult = new SchedulePlanRuleResult($sp);
  465 +// schedulePlanRuleResult.setXlId(String.valueOf($srf.getXl().getId()));
  466 + schedulePlanRuleResult.setXlId($srf.getXl().getId());
  467 + schedulePlanRuleResult.setXlName($srf.getXl().getName());
  468 + schedulePlanRuleResult.setRuleId($ruleId);
  469 + schedulePlanRuleResult.setCcId($cid);
  470 + schedulePlanRuleResult.setCcZbh($srf.getCarConfigInfo().getCl().getInsideCode());
  471 + schedulePlanRuleResult.setGids($srf.getLpIds()); // 参与md5计算
  472 + schedulePlanRuleResult.setGnames($srf.getLpNames());
  473 + schedulePlanRuleResult.setGidindex(String.valueOf($lpindex));
  474 + schedulePlanRuleResult.setEcids($srf.getRyConfigIds());
  475 + schedulePlanRuleResult.setEcdbbms($srf.getRyDbbms());
  476 + schedulePlanRuleResult.setEcindex(String.valueOf($ryindex));
  477 + schedulePlanRuleResult.setScheduleDate($csd2.toDate());
  478 + schedulePlanRuleResult.setTtinfoId($ttinfoId);
  479 + schedulePlanRuleResult.setTtinfoName($ttinfoName);
  480 + schedulePlanRuleResult.setQyrq($sri.getQyrq().toDate()); // 参与md5计算
  481 + schedulePlanRuleResult.setOrigingidindex(String.valueOf($sri.getSelf().getLpStart())); // 参与md5计算
  482 +
  483 + rs.getSchedulePlanRuleResults().add(schedulePlanRuleResult);
  484 + }
  485 +
  486 +
  487 +
  488 +// log.info("calcu_loop2_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",
  489 +// $ruleId, $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd2, $ced2);
  490 +
  491 +}
  492 +
  493 +function void calcu_loop2_not_fb(
  494 + Calcu_days_result_pre $cdrp,
  495 + ScheduleRule_input $sri,
  496 + ScheduleResults_output rs,
  497 + Logger log) {
  498 +
  499 + String $ruleId = $cdrp.getRuleId();
  500 + DateTime $csd2 = $cdrp.getCalcu_start_date_2();
  501 + DateTime $ced2 = $cdrp.getCalcu_end_date_2();
  502 + Integer $lpindex = $cdrp.getCalcu_index_lp();
  503 + List $gids = $sri.getGuideboardIds();
  504 + Integer $ryindex = $cdrp.getCalcu_index_ry();
  505 + List $eids = $sri.getEmployeeConfigIds();
  506 + Integer $fbindex = $cdrp.getFbgs_index();
  507 + Integer $fbfangesize = $sri.getWeekdays().size();
  508 + String $cid = $sri.getCarConfigId();
  509 + String $xlid = $sri.getXlId();
  510 +
  511 + ScheduleResult_output ro = new ScheduleResult_output();
  512 + ro.setRuleId($ruleId);
  513 + ro.setSd($csd2);
  514 +// ro.setGuideboardId(String.valueOf($gids.get($lpindex)));
  515 + ro.setGuideboardId("not_fb_lp"); // 不翻班,路牌id用假的,后面会过滤
  516 + ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex)));
  517 + ro.setCarConfigId($cid);
  518 + ro.setXlId($xlid);
  519 +
  520 + // 类型
  521 + ro.setsType($sri.getsType());
  522 +
  523 + rs.getResults().add(ro);
  524 +
  525 + $cdrp.setFbgs_index(($fbindex + 1) % $fbfangesize);
  526 + $cdrp.setCalcu_start_date_2($csd2.plusDays(1));
  527 +
  528 +// log.info("calcu_loop2_not_fb ruleId={}, calcu_index_lp/ry={}/{}, from={}, to={}",
  529 +// $ruleId, $cdrp.getCalcu_index_lp(), $cdrp.getCalcu_index_ry(), $csd2, $ced2);
  530 +
  531 +}
  532 +
  533 +rule "Calcu_loop2_fbtype_with_0_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是false,就跳过
  534 + salience 800
  535 + when
  536 + ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)
  537 + $cdrp: Calcu_days_result_pre(
  538 + calcu_start_date_1.isEqual(calcu_end_date_1),
  539 + calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),
  540 + $ruleId: ruleId,
  541 + fbtype == "1",
  542 + $fbindex : fbgs_index
  543 + )
  544 + $sri: ScheduleRule_input(
  545 + ruleId == $ruleId,
  546 + weekdays[$fbindex] == false
  547 + )
  548 + then
  549 + calcu_loop2_not_fb($cdrp, $sri, scheduleResult, log);
  550 + update($cdrp);
  551 +
  552 +end
  553 +
  554 +rule "Calcu_loop2_fbtype_with_1_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里存在指定路牌,就翻
  555 + salience 800
  556 + when
  557 + ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)
  558 + $cdrp: Calcu_days_result_pre(
  559 + calcu_start_date_1.isEqual(calcu_end_date_1),
  560 + calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),
  561 + $csd2: calcu_start_date_2,
  562 + $ruleId: ruleId,
  563 + fbtype == "1",
  564 + $lpindex: calcu_index_lp,
  565 + $fbindex : fbgs_index
  566 + )
  567 + $sri: ScheduleRule_input(
  568 + ruleId == $ruleId,
  569 + $gids: guideboardIds,
  570 + weekdays[$fbindex] == true
  571 + )
  572 + $liro: LpInfoResult_output(
  573 + dateTime.isEqual($csd2),
  574 + $gids[$lpindex] == lpId
  575 + )
  576 + then
  577 + calcu_loop2_fb($sp, $cdrp, $sri, $liro, scheduleResult, log);
  578 + update($cdrp);
  579 +end
  580 +
  581 +rule "Calcu_loop2_fbtype_with_1_no_lp_" // 翻班模式为 type=1 使用翻班格式翻,当天翻班格式是true,并且当天时刻表里不存在指定路牌,就跳过
  582 + salience 800
  583 + when
  584 + ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)
  585 + $cdrp: Calcu_days_result_pre(
  586 + calcu_start_date_1.isEqual(calcu_end_date_1),
  587 + calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),
  588 + $ruleId: ruleId,
  589 + fbtype == "1",
  590 + $fbindex : fbgs_index
  591 + )
  592 + $sri: ScheduleRule_input(
  593 + ruleId == $ruleId,
  594 + weekdays[$fbindex] == true
  595 + )
  596 + then
  597 + calcu_loop2_not_fb($cdrp, $sri, scheduleResult, log);
  598 + update($cdrp);
  599 +
  600 +end
  601 +
  602 +rule "Calcu_loop2_timetabletype_with_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中存在,就翻
  603 + salience 800
  604 + when
  605 + ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)
  606 + $cdrp: Calcu_days_result_pre(
  607 + calcu_start_date_1.isEqual(calcu_end_date_1),
  608 + calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),
  609 + $csd2: calcu_start_date_2,
  610 + $ruleId: ruleId,
  611 + fbtype == "0",
  612 + $lpindex: calcu_index_lp,
  613 + $fbindex : fbgs_index
  614 + )
  615 + $sri: ScheduleRule_input(
  616 + ruleId == $ruleId,
  617 + $gids: guideboardIds
  618 + )
  619 + $liro: LpInfoResult_output(
  620 + dateTime.isEqual($csd2),
  621 + $gids[$lpindex] == lpId
  622 + )
  623 + then
  624 + calcu_loop2_fb($sp, $cdrp, $sri, $liro, scheduleResult, log);
  625 + update($cdrp);
  626 +
  627 +end
  628 +
  629 +rule "Calcu_loop2_timetabletype_with_no_lp_" // 翻班模式为 type=0 使用时刻表格式翻,路牌在时刻表中不存在,就跳过
  630 + salience 800
  631 + when
  632 + ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)
  633 + $cdrp: Calcu_days_result_pre(
  634 + calcu_start_date_1.isEqual(calcu_end_date_1),
  635 + calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),
  636 + $ruleId: ruleId,
  637 + fbtype == "0"
  638 + )
  639 + $sri: ScheduleRule_input(
  640 + ruleId == $ruleId
  641 + )
  642 + then
  643 + calcu_loop2_not_fb($cdrp, $sri, scheduleResult, log);
  644 + update($cdrp);
  645 +end
  646 +
  647 +
  648 +
  649 +
  650 +
  651 +
  652 +
  653 +
src/main/resources/rules/ttinfo.drl renamed to src/main/resources/rules/kBase1_core_ttinfo.drl
1 -package com.bsth.service.schedule.ttinfo;  
2 -  
3 -import org.joda.time.*;  
4 -import java.util.*;  
5 -  
6 -import com.bsth.service.schedule.rules.ttinfo.TTInfoCalcuParam_input;  
7 -import com.bsth.service.schedule.rules.ttinfo.TTInfo_input;  
8 -import com.bsth.service.schedule.rules.ttinfo.TTInfoResult_output;  
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;  
12 -  
13 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;  
14 -  
15 -import com.bsth.repository.schedule.TTInfoDetailRepository;  
16 -  
17 -import com.bsth.entity.schedule.TTInfo;  
18 -import com.bsth.entity.schedule.TTInfoDetail;  
19 -  
20 -import org.slf4j.Logger  
21 -  
22 -// 全局日志  
23 -global Logger log;  
24 -// repostory  
25 -global TTInfoDetailRepository tTInfoDetailRepository;  
26 -// return输出  
27 -global TTInfoResults_output results  
28 -global LpInfoResults_output lpInfoResults_output  
29 -  
30 -function Long ttidParams(List ttinfolist) {  
31 - // 获取第一张时刻表id  
32 - TTInfo_input ttInfo_input = (TTInfo_input) ttinfolist.get(0);  
33 - return Long.parseLong(ttInfo_input.getTtInfoId());  
34 -}  
35 -  
36 -/*  
37 - TODO:规则说明,以后待说明  
38 -*/  
39 -  
40 -//----------------- pre 预处理 param对象 -----------------------//  
41 -  
42 -rule "pre_calcu_TTInfoCalcuParam_input"  
43 - no-loop  
44 - salience 1000  
45 - when  
46 - $ttp: TTInfoCalcuParam_input($xlId : xlId)  
47 - $minqyrq: DateTime() from accumulate ($sri: ScheduleRule_input(xlId == $xlId), minruleqyrq($sri))  
48 - then  
49 - $ttp.setFromDate($minqyrq);  
50 - update($ttp);  
51 -end  
52 -  
53 -//----------------- 第一阶段、计算规则准备数据(天数)----------------//  
54 -  
55 -declare Calcu_days_result  
56 - calcu_day : Integer // 该计算第几天  
57 - calcu_weekday : Integer // 星期几(1到7)  
58 - calcu_date : DateTime // 该计算的具体日期  
59 - calcu_days : Integer // 总共需要计算的天数  
60 - calcu_start_date : DateTime // 开始计算日期  
61 - calcu_end_date : DateTime // 结束计算日期  
62 - xlId : String // 线路Id  
63 -end  
64 -  
65 -rule "calcu_days"  
66 - when  
67 - TTInfoCalcuParam_input(  
68 - $fromDate : fromDate,  
69 - $toDate : toDate,  
70 - $xlId : xlId,  
71 - $fromDate.isBefore($toDate) || $fromDate.isEqual($toDate))  
72 - then  
73 - // 构造Calcu_days_result对象,进行下一阶段计算  
74 - Calcu_days_result cdr = new Calcu_days_result();  
75 - Period p = new Period($fromDate, $toDate, PeriodType.days());  
76 -  
77 - cdr.setCalcu_day(1);  
78 - cdr.setCalcu_date($fromDate);  
79 - cdr.setCalcu_days(p.getDays() + 1);  
80 - cdr.setCalcu_weekday($fromDate.getDayOfWeek());  
81 - cdr.setCalcu_start_date($fromDate);  
82 - cdr.setCalcu_end_date(($toDate));  
83 - cdr.setXlId($xlId);  
84 -  
85 -// log.info("总共需要计算的天数 calcu_days={} 之后的计算从第1天开始 ", p.getDays() + 1);  
86 -  
87 - insert(cdr); // 插入fact数据,进入下一个阶段  
88 -end  
89 -  
90 -//----------------- 第二阶段、判定时刻表是否启用 ----------------//  
91 -  
92 -declare Calcu_ttinfo_enable_result  
93 - xlId : String // 线路id  
94 - ttInfo_input_list : ArrayList // 可用时刻表列表  
95 - calcu_date : DateTime // 计算日期  
96 -end  
97 -  
98 -rule "calcu_ttinfo_enable"  
99 - salience 900  
100 - when  
101 - $calcu_days_result : Calcu_days_result($calcu_date : calcu_date, calcu_day <= calcu_days, $xlId : xlId)  
102 - $ttInfo_input_list : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlId, isEnable == true))  
103 - then  
104 - // 构造Calcu_ttinfo_enable_result对象,进行下一步计算  
105 - Calcu_ttinfo_enable_result cter = new Calcu_ttinfo_enable_result();  
106 - cter.setXlId($xlId);  
107 - cter.setTtInfo_input_list($ttInfo_input_list);  
108 - cter.setCalcu_date($calcu_date);  
109 -  
110 -// log.info("启用的时刻表:xlId={} 时刻表个数={}", $xlId, $ttInfo_input_list.size());  
111 -  
112 - insert (cter);  
113 -  
114 -end  
115 -  
116 -//----------------- 第三阶段、时刻表的日期匹配 -------------------//  
117 -  
118 -rule "calcu_ttinfo_special_day" // 特殊日期匹配  
119 - salience 800  
120 - when  
121 - $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)  
122 - $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day)  
123 - $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays contains $calcu_date) from $ttInfo_input_list)  
124 - $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))  
125 - then  
126 - // 更新Calcu_days_result对象  
127 - int new_calcu_day = $calcu_day + 1;  
128 - $calcu_days_result.setCalcu_day(new_calcu_day);  
129 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
130 - $calcu_days_result.setCalcu_date(new_calcu_date);  
131 - $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());  
132 -  
133 -// log.info("启用特殊日期时刻表:xlId={} 时刻表个数={} 特殊日期={}", $xlId, $ttinfolist.size(), $calcu_date);  
134 -  
135 - // $ttinfolist按时间倒排序,result输出  
136 - Collections.sort($ttinfolist);  
137 - results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);  
138 -  
139 - // lp输出  
140 - for (int i = 0; i < $lpInfoResults.size(); i++) {  
141 - LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);  
142 - lpInfoResult_output.setDateTime($calcu_date); // 设定时间  
143 - lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);  
144 - }  
145 -  
146 - update($calcu_days_result);  
147 -end  
148 -  
149 -rule "calcu_ttinfo_normal_day" // 平日匹配  
150 - salience 700  
151 - when  
152 - $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)  
153 - $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)  
154 - $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == true) from $ttInfo_input_list)  
155 - $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))  
156 - then  
157 - // 更新Calcu_days_result对象  
158 - int new_calcu_day = $calcu_day + 1;  
159 - $calcu_days_result.setCalcu_day(new_calcu_day);  
160 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
161 - $calcu_days_result.setCalcu_date(new_calcu_date);  
162 - $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());  
163 -  
164 -// log.info("启用常规日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={} 路牌size={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday, $lpInfoResults.size());  
165 -  
166 - // $ttinfolist按时间倒排序,result输出  
167 - Collections.sort($ttinfolist);  
168 - results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);  
169 -  
170 - // lp输出  
171 - for (int i = 0; i < $lpInfoResults.size(); i++) {  
172 - LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);  
173 - lpInfoResult_output.setDateTime($calcu_date); // 设定时间  
174 - lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);  
175 - }  
176 -  
177 - update($calcu_days_result);  
178 -end  
179 -  
180 -rule "calcu_ttinfo_other_day" // 都没有的情况下,匹配  
181 - salience 500  
182 - when  
183 - $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)  
184 - $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)  
185 - $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == false) from $ttInfo_input_list)  
186 - $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))  
187 - then  
188 - // 更新Calcu_days_result对象  
189 - int new_calcu_day = $calcu_day + 1;  
190 - $calcu_days_result.setCalcu_day(new_calcu_day);  
191 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
192 - $calcu_days_result.setCalcu_date(new_calcu_date);  
193 - $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());  
194 -  
195 -// log.info("启用默认日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday);  
196 -  
197 - // $ttinfolist按时间倒排序,result输出  
198 - Collections.sort($ttinfolist);  
199 - results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);  
200 -  
201 - // lp输出  
202 - for (int i = 0; i < $lpInfoResults.size(); i++) {  
203 - LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);  
204 - lpInfoResult_output.setDateTime($calcu_date); // 设定时间  
205 - lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);  
206 - }  
207 -  
208 - update($calcu_days_result);  
209 - 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo;
  2 +
  3 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.GidsCountFunction gidscount;
  4 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.GidFbTimeFunction gidfbtime;
  5 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.GidFbFcnoFunction gidfbfcno;
  6 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResultsFunction lpinforesult;
  7 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.MinRuleQyrqFunction minruleqyrq;
  8 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidRepeatBcFunction vrb;
  9 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWholeRerunBcFunction vwrb;
  10 +import accumulate com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidWantLpFunction vwlp;
  11 +
  12 +import org.joda.time.*;
  13 +import java.util.*;
  14 +
  15 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoCalcuParam_input;
  16 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfo_input;
  17 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResult_output;
  18 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.TTInfoResults_output;
  19 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResult_output;
  20 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResults_output;
  21 +
  22 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_input;
  23 +
  24 +import com.bsth.repository.schedule.TTInfoDetailRepository;
  25 +
  26 +import com.bsth.entity.schedule.TTInfo;
  27 +import com.bsth.entity.schedule.TTInfoDetail;
  28 +
  29 +import org.slf4j.Logger
  30 +
  31 +// 全局日志
  32 +global Logger log;
  33 +// repostory
  34 +global TTInfoDetailRepository tTInfoDetailRepository;
  35 +// return输出
  36 +global TTInfoResults_output results
  37 +global LpInfoResults_output lpInfoResults_output
  38 +
  39 +function Long ttidParams(List ttinfolist) {
  40 + // 获取第一张时刻表id
  41 + TTInfo_input ttInfo_input = (TTInfo_input) ttinfolist.get(0);
  42 + return Long.parseLong(ttInfo_input.getTtInfoId());
  43 +}
  44 +
  45 +/*
  46 + TODO:规则说明,以后待说明
  47 +*/
  48 +
  49 +//----------------- pre 预处理 param对象 -----------------------//
  50 +
  51 +rule "pre_calcu_TTInfoCalcuParam_input"
  52 + no-loop
  53 + salience 1000
  54 + when
  55 + $ttp: TTInfoCalcuParam_input($xlId : xlId)
  56 + $minqyrq: DateTime() from accumulate ($sri: ScheduleRule_input(xlId == $xlId), minruleqyrq($sri))
  57 + then
  58 + $ttp.setFromDate($minqyrq);
  59 + update($ttp);
  60 +end
  61 +
  62 +//----------------- 第一阶段、计算规则准备数据(天数)----------------//
  63 +
  64 +declare Calcu_days_result
  65 + calcu_day : Integer // 该计算第几天
  66 + calcu_weekday : Integer // 星期几(1到7)
  67 + calcu_date : DateTime // 该计算的具体日期
  68 + calcu_days : Integer // 总共需要计算的天数
  69 + calcu_start_date : DateTime // 开始计算日期
  70 + calcu_end_date : DateTime // 结束计算日期
  71 + xlId : String // 线路Id
  72 +end
  73 +
  74 +rule "calcu_days"
  75 + when
  76 + TTInfoCalcuParam_input(
  77 + $fromDate : fromDate,
  78 + $toDate : toDate,
  79 + $xlId : xlId,
  80 + $fromDate.isBefore($toDate) || $fromDate.isEqual($toDate))
  81 + then
  82 + // 构造Calcu_days_result对象,进行下一阶段计算
  83 + Calcu_days_result cdr = new Calcu_days_result();
  84 + Period p = new Period($fromDate, $toDate, PeriodType.days());
  85 +
  86 + cdr.setCalcu_day(1);
  87 + cdr.setCalcu_date($fromDate);
  88 + cdr.setCalcu_days(p.getDays() + 1);
  89 + cdr.setCalcu_weekday($fromDate.getDayOfWeek());
  90 + cdr.setCalcu_start_date($fromDate);
  91 + cdr.setCalcu_end_date(($toDate));
  92 + cdr.setXlId($xlId);
  93 +
  94 +// log.info("总共需要计算的天数 calcu_days={} 之后的计算从第1天开始 ", p.getDays() + 1);
  95 +
  96 + insert(cdr); // 插入fact数据,进入下一个阶段
  97 +end
  98 +
  99 +//----------------- 第二阶段、判定时刻表是否启用 ----------------//
  100 +
  101 +declare Calcu_ttinfo_enable_result
  102 + xlId : String // 线路id
  103 + ttInfo_input_list : ArrayList // 可用时刻表列表
  104 + calcu_date : DateTime // 计算日期
  105 +end
  106 +
  107 +rule "calcu_ttinfo_enable"
  108 + salience 900
  109 + when
  110 + $calcu_days_result : Calcu_days_result($calcu_date : calcu_date, calcu_day <= calcu_days, $xlId : xlId)
  111 + $ttInfo_input_list : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlId, isEnable == true))
  112 + then
  113 + // 构造Calcu_ttinfo_enable_result对象,进行下一步计算
  114 + Calcu_ttinfo_enable_result cter = new Calcu_ttinfo_enable_result();
  115 + cter.setXlId($xlId);
  116 + cter.setTtInfo_input_list($ttInfo_input_list);
  117 + cter.setCalcu_date($calcu_date);
  118 +
  119 +// log.info("启用的时刻表:xlId={} 时刻表个数={}", $xlId, $ttInfo_input_list.size());
  120 +
  121 + insert (cter);
  122 +
  123 +end
  124 +
  125 +//----------------- 第三阶段、时刻表的日期匹配 -------------------//
  126 +
  127 +rule "calcu_ttinfo_special_day" // 特殊日期匹配
  128 + salience 800
  129 + when
  130 + $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
  131 + $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day)
  132 + $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays contains $calcu_date) from $ttInfo_input_list)
  133 + $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))
  134 + then
  135 + // 更新Calcu_days_result对象
  136 + int new_calcu_day = $calcu_day + 1;
  137 + $calcu_days_result.setCalcu_day(new_calcu_day);
  138 + DateTime new_calcu_date = $calcu_date.plusDays(1);
  139 + $calcu_days_result.setCalcu_date(new_calcu_date);
  140 + $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());
  141 +
  142 +// log.info("启用特殊日期时刻表:xlId={} 时刻表个数={} 特殊日期={}", $xlId, $ttinfolist.size(), $calcu_date);
  143 +
  144 + // $ttinfolist按时间倒排序,result输出
  145 + Collections.sort($ttinfolist);
  146 + results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);
  147 +
  148 + // lp输出
  149 + for (int i = 0; i < $lpInfoResults.size(); i++) {
  150 + LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
  151 + lpInfoResult_output.setDateTime($calcu_date); // 设定时间
  152 + lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
  153 + }
  154 +
  155 + update($calcu_days_result);
  156 +end
  157 +
  158 +rule "calcu_ttinfo_normal_day" // 平日匹配
  159 + salience 700
  160 + when
  161 + $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
  162 + $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
  163 + $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == true) from $ttInfo_input_list)
  164 + $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))
  165 + then
  166 + // 更新Calcu_days_result对象
  167 + int new_calcu_day = $calcu_day + 1;
  168 + $calcu_days_result.setCalcu_day(new_calcu_day);
  169 + DateTime new_calcu_date = $calcu_date.plusDays(1);
  170 + $calcu_days_result.setCalcu_date(new_calcu_date);
  171 + $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());
  172 +
  173 +// log.info("启用常规日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={} 路牌size={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday, $lpInfoResults.size());
  174 +
  175 + // $ttinfolist按时间倒排序,result输出
  176 + Collections.sort($ttinfolist);
  177 + results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);
  178 +
  179 + // lp输出
  180 + for (int i = 0; i < $lpInfoResults.size(); i++) {
  181 + LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
  182 + lpInfoResult_output.setDateTime($calcu_date); // 设定时间
  183 + lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
  184 + }
  185 +
  186 + update($calcu_days_result);
  187 +end
  188 +
  189 +rule "calcu_ttinfo_other_day" // 都没有的情况下,匹配
  190 + salience 500
  191 + when
  192 + $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
  193 + $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
  194 + $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == false) from $ttInfo_input_list)
  195 + $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))
  196 + then
  197 + // 更新Calcu_days_result对象
  198 + int new_calcu_day = $calcu_day + 1;
  199 + $calcu_days_result.setCalcu_day(new_calcu_day);
  200 + DateTime new_calcu_date = $calcu_date.plusDays(1);
  201 + $calcu_days_result.setCalcu_date(new_calcu_date);
  202 + $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());
  203 +
  204 +// log.info("启用默认日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday);
  205 +
  206 + // $ttinfolist按时间倒排序,result输出
  207 + Collections.sort($ttinfolist);
  208 + results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);
  209 +
  210 + // lp输出
  211 + for (int i = 0; i < $lpInfoResults.size(); i++) {
  212 + LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
  213 + lpInfoResult_output.setDateTime($calcu_date); // 设定时间
  214 + lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
  215 + }
  216 +
  217 + update($calcu_days_result);
  218 +
210 end 219 end
211 \ No newline at end of file 220 \ No newline at end of file
src/main/resources/rules/validplan.drl renamed to src/main/resources/rules/kBase1_core_validate.drl
1 -package com.bsth.service.schedule.rules.validate;  
2 -  
3 -import com.bsth.entity.schedule.SchedulePlanInfo;  
4 -import com.bsth.service.schedule.rules.ttinfo.LpInfoResult_output;  
5 -import com.bsth.service.schedule.rules.validate.ValidateResource;  
6 -  
7 -import org.joda.time.*;  
8 -import java.util.*;  
9 -  
10 -import org.slf4j.Logger;  
11 -  
12 -// 全局日志类(一般使用调用此规则的service类)  
13 -global Logger log;  
14 -  
15 -// 输出  
16 -global ValidateResults_output validResult;  
17 -  
18 -//------------------------- 第一阶段、构造验证源 ----------------------------//  
19 -rule "Calcu_validate_resource"  
20 - salience 2000  
21 - when  
22 - $spi: SchedulePlanInfo($sd: scheduleDate)  
23 - $lpiList: ArrayList() from collect (LpInfoResult_output(dateTime.getMillis() == $sd.getTime()))  
24 - then  
25 - ValidateResource resource = new ValidateResource();  
26 - resource.setSd($sd);  
27 - resource.setSpi($spi);  
28 - resource.setLpiList($lpiList);  
29 -  
30 - insert(resource);  
31 -end  
32 -  
33 -//------------------------- 第二阶段、构造循环体 ----------------------------//  
34 -  
35 -declare Loop_param  
36 - start_date: DateTime // 开始日期(这个要不停的更新迭代)  
37 - end_date: DateTime // 结束日期  
38 - sdays: Integer // 总共循环的天数  
39 -end  
40 -  
41 -rule "Calcu_Loop_param"  
42 - salience 1000  
43 - when  
44 - ValidateParam(  
45 - $fd: fromDate,  
46 - $ed: toDate,  
47 - $days: days  
48 - )  
49 - then  
50 - Loop_param p = new Loop_param();  
51 - p.setStart_date($fd);  
52 - p.setEnd_date($ed);  
53 - p.setSdays($days);  
54 -  
55 - insert(p);  
56 -end  
57 -  
58 -//------------------------- 第三阶段、验证计算 ----------------------------//  
59 -  
60 -  
61 -rule "Valid_repeat_bc" // 验证是否存在重复班次,未套跑班次,未执行路牌  
62 - salience 600  
63 - when  
64 - $lp: Loop_param($sd: start_date, $ed: end_date)  
65 - eval($sd.isBefore($ed) || $sd.isEqual($ed))  
66 - $vrList: ArrayList() from collect (ValidateResource(sd.getTime() == $sd.getMillis()))  
67 - $infos: ArrayList() from accumulate ($vr: ValidateResource() from $vrList, vrb($vr.getSpi()))  
68 - $infos2: ArrayList() from accumulate ($vr: ValidateResource() from $vrList, vwrb($vr.getSpi()))  
69 - $infos3: ArrayList() from accumulate ($vr: ValidateResource() from $vrList, vwlp($vr))  
70 - then  
71 - // TODO:  
72 -// log.info("日期={},班次重复错误数={}", $sd, $infos.size());  
73 -  
74 -// log.info("班次数={}", $vrList.size());  
75 -  
76 - validResult.getInfos().addAll($infos);  
77 - validResult.getInfos().addAll($infos2);  
78 - validResult.getInfos().addAll($infos3);  
79 -  
80 - // 迭代  
81 - $lp.setStart_date($sd.plusDays(1));  
82 - update($lp);  
83 -  
84 -end  
85 -  
86 -//  
87 -//declare LpInfo_wrap  
88 -// sd: DateTime // 具体日期  
89 -// lpId: Long // 路牌Id  
90 -// isPlan: Boolean = false // 是否排班  
91 -//end  
92 -//  
93 -//rule "Calcu_LpInfo_wrap"  
94 -// salience 500  
95 -// when  
96 -// $lp: LpInfoResult_output()  
97 -// then  
98 -// LpInfo_wrap ll = new LpInfo_wrap();  
99 -// ll.setSd($lp.getDateTime());  
100 -// ll.setLpId(Long.parseLong($lp.getLpId()));  
101 -//  
102 -// insert(ll);  
103 -//end  
104 -//  
105 -//rule "Valid_Lp_plan" // 查看路牌是否被排班  
106 -// salience 400  
107 -// no-loop  
108 -// when  
109 -// $sp: SchedulePlanInfo($lp: lp)  
110 -// $ll: LpInfo_wrap(lpId == $lp)  
111 -// then  
112 -// $ll.setIsPlan(true);  
113 -// update($ll);  
114 -//end  
115 -//  
116 -//// TODO:  
117 -  
118 -  
119 -  
120 -  
121 -  
122 -  
123 -  
124 -  
125 -  
126 - 1 +package com.bsth.service.schedule.impl.plan.kBase1.core.validate;
  2 +
  3 +import com.bsth.entity.schedule.SchedulePlanInfo;
  4 +import com.bsth.service.schedule.impl.plan.kBase1.core.ttinfo.LpInfoResult_output;
  5 +import com.bsth.service.schedule.impl.plan.kBase1.core.validate.ValidateResource;
  6 +
  7 +import org.joda.time.*;
  8 +import java.util.*;
  9 +
  10 +import org.slf4j.Logger;
  11 +
  12 +// 全局日志类(一般使用调用此规则的service类)
  13 +global Logger log;
  14 +
  15 +// 输出
  16 +global ValidateResults_output validResult;
  17 +
  18 +//------------------------- 第一阶段、构造验证源 ----------------------------//
  19 +rule "Calcu_validate_resource"
  20 + salience 2000
  21 + when
  22 + $spi: SchedulePlanInfo($sd: scheduleDate)
  23 + $lpiList: ArrayList() from collect (LpInfoResult_output(dateTime.getMillis() == $sd.getTime()))
  24 + then
  25 + ValidateResource resource = new ValidateResource();
  26 + resource.setSd($sd);
  27 + resource.setSpi($spi);
  28 + resource.setLpiList($lpiList);
  29 +
  30 + insert(resource);
  31 +end
  32 +
  33 +//------------------------- 第二阶段、构造循环体 ----------------------------//
  34 +
  35 +declare Loop_param
  36 + start_date: DateTime // 开始日期(这个要不停的更新迭代)
  37 + end_date: DateTime // 结束日期
  38 + sdays: Integer // 总共循环的天数
  39 +end
  40 +
  41 +rule "Calcu_Loop_param"
  42 + salience 1000
  43 + when
  44 + ValidateParam(
  45 + $fd: fromDate,
  46 + $ed: toDate,
  47 + $days: days
  48 + )
  49 + then
  50 + Loop_param p = new Loop_param();
  51 + p.setStart_date($fd);
  52 + p.setEnd_date($ed);
  53 + p.setSdays($days);
  54 +
  55 + insert(p);
  56 +end
  57 +
  58 +//------------------------- 第三阶段、验证计算 ----------------------------//
  59 +
  60 +
  61 +rule "Valid_repeat_bc" // 验证是否存在重复班次,未套跑班次,未执行路牌
  62 + salience 600
  63 + when
  64 + $lp: Loop_param($sd: start_date, $ed: end_date)
  65 + eval($sd.isBefore($ed) || $sd.isEqual($ed))
  66 + $vrList: ArrayList() from collect (ValidateResource(sd.getTime() == $sd.getMillis()))
  67 + $infos: ArrayList() from accumulate ($vr: ValidateResource() from $vrList, vrb($vr.getSpi()))
  68 + $infos2: ArrayList() from accumulate ($vr: ValidateResource() from $vrList, vwrb($vr.getSpi()))
  69 + $infos3: ArrayList() from accumulate ($vr: ValidateResource() from $vrList, vwlp($vr))
  70 + then
  71 + // TODO:
  72 +// log.info("日期={},班次重复错误数={}", $sd, $infos.size());
  73 +
  74 +// log.info("班次数={}", $vrList.size());
  75 +
  76 + validResult.getInfos().addAll($infos);
  77 + validResult.getInfos().addAll($infos2);
  78 + validResult.getInfos().addAll($infos3);
  79 +
  80 + // 迭代
  81 + $lp.setStart_date($sd.plusDays(1));
  82 + update($lp);
  83 +
  84 +end
  85 +
  86 +//
  87 +//declare LpInfo_wrap
  88 +// sd: DateTime // 具体日期
  89 +// lpId: Long // 路牌Id
  90 +// isPlan: Boolean = false // 是否排班
  91 +//end
  92 +//
  93 +//rule "Calcu_LpInfo_wrap"
  94 +// salience 500
  95 +// when
  96 +// $lp: LpInfoResult_output()
  97 +// then
  98 +// LpInfo_wrap ll = new LpInfo_wrap();
  99 +// ll.setSd($lp.getDateTime());
  100 +// ll.setLpId(Long.parseLong($lp.getLpId()));
  101 +//
  102 +// insert(ll);
  103 +//end
  104 +//
  105 +//rule "Valid_Lp_plan" // 查看路牌是否被排班
  106 +// salience 400
  107 +// no-loop
  108 +// when
  109 +// $sp: SchedulePlanInfo($lp: lp)
  110 +// $ll: LpInfo_wrap(lpId == $lp)
  111 +// then
  112 +// $ll.setIsPlan(true);
  113 +// update($ll);
  114 +//end
  115 +//
  116 +//// TODO:
  117 +
  118 +
  119 +
  120 +
  121 +
  122 +
  123 +
  124 +
  125 +
  126 +
src/main/resources/rules/ruleWrap.drl renamed to src/main/resources/rules/kBase2_wrap_rule.drl
1 -package com.bsth.service.schedule.rulewrap;  
2 -  
3 -import org.joda.time.*;  
4 -import java.util.*;  
5 -import org.slf4j.Logger;  
6 -  
7 -import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;  
8 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;  
9 -import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_Type;  
10 -  
11 -import com.bsth.repository.schedule.RerunRuleRepository;  
12 -import com.bsth.repository.schedule.ScheduleRule1FlatRepository;  
13 -  
14 -import com.bsth.service.schedule.rules.rerun.RerunRule_input;  
15 -import com.bsth.service.schedule.rules.ScheduleRuleService;  
16 -  
17 -import com.bsth.entity.Line;  
18 -import com.bsth.entity.schedule.CarConfigInfo  
19 -import com.bsth.entity.schedule.EmployeeConfigInfo  
20 -import javax.print.attribute.standard.DateTimeAtCompleted;  
21 -  
22 -// 全局日志类(一般使用调用此规则的service类)  
23 -global Logger log;  
24 -  
25 -global ScheduleRule1FlatRepository srf;  
26 -global RerunRuleRepository rrr;  
27 -global ScheduleRuleService srservice;  
28 -global List sriList;  
29 -  
30 -  
31 -declare Sri_Wrap  
32 - xlId : String // 线路id  
33 - lpIds : List // 路牌id  
34 - srf : Object // ScheduleRule1Flat类型  
35 - sri : ScheduleRule_input; // ScheduleRule_input输入  
36 -end  
37 -  
38 -rule "rw1"  
39 - salience 1000  
40 - when  
41 - ScheduleCalcuParam_input(  
42 - $fromDate : fromDate,  
43 - $toDate : toDate,  
44 - $xlId: xlId  
45 - )  
46 - $srf : Object() from srf.findByXlId(Integer.parseInt($xlId))  
47 - then  
48 - // 创建Sri_Wrap  
49 - Sri_Wrap sw = new Sri_Wrap();  
50 - sw.setXlId($xlId);  
51 - sw.setSrf($srf);  
52 - ScheduleRule_input sri = new ScheduleRule_input((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf());  
53 - sw.setSri(sri);  
54 - sw.setLpIds(sri.getGuideboardIds());  
55 -  
56 - insert(sw);  
57 -  
58 -end  
59 -  
60 -rule "rw2"  
61 - salience 800  
62 - no-loop  
63 - when  
64 - ScheduleCalcuParam_input(  
65 - $fromDate : fromDate,  
66 - $toDate : toDate,  
67 - $xlId: xlId  
68 - )  
69 - $reu : RerunRule_input($lpId : lp) from srservice.findRerunrule(Integer.parseInt($xlId))  
70 - not Sri_Wrap(xlId == $xlId, lpIds contains $lpId)  
71 - then  
72 - // 套跑中有规则,主线路的路牌,主线路该路牌不存在,添加一个临时的,做处理  
73 - Sri_Wrap sw = new Sri_Wrap();  
74 - sw.setSrf(new com.bsth.entity.schedule.rule.ScheduleRule1Flat());  
75 - // 线路  
76 - Line xl = new Line();  
77 - xl.setId(Integer.valueOf($xlId));  
78 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setXl(xl);  
79 - // id,使用当前日期作为原始值加上路牌id最为临时id值  
80 - DateTime dt = new DateTime(new Date());  
81 - DateTime dt2 = new DateTime(dt.year().get(), dt.monthOfYear().get(), dt.dayOfMonth().get(), 0, 0, 0);  
82 - long id = (dt2.toDate().getTime() + Long.parseLong($lpId));  
83 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setId(id);  
84 - // 启用日期  
85 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setQyrq($fromDate.toDate());  
86 - // 车辆配置  
87 - CarConfigInfo cci = new CarConfigInfo();  
88 - cci.setId(new Date().getTime());  
89 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setCarConfigInfo(cci);  
90 - // 人员配置  
91 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setRyConfigIds("TEMP");  
92 - // 人员搭班编码  
93 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setRyDbbms("TEMP");  
94 - // 起始人员  
95 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setRyStart(1);  
96 - // 路牌id  
97 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setLpIds($lpId);  
98 - // 起始路牌  
99 - ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setLpStart(1);  
100 -  
101 - ScheduleRule_input sri = new ScheduleRule_input((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf());  
102 - sri.setsType(ScheduleRule_Type.RERUN);  
103 - sw.setSri(sri);  
104 -  
105 - sw.setXlId($xlId);  
106 -  
107 - List lpIds = new ArrayList();  
108 - lpIds.add($lpId);  
109 - sw.setLpIds(lpIds);  
110 -  
111 - insert(sw);  
112 -end  
113 -  
114 -rule "rw3"  
115 - salience 600  
116 - when  
117 - $sri_wrap : Sri_Wrap($sri : sri, $xlId: xlId, $lpIds : lpIds)  
118 - then  
119 - log.info("线路id={},type={},ruleId={},lpids={}", $xlId, $sri.getsType(), $sri.getRuleId(), $lpIds);  
120 - sriList.add($sri); 1 +package com.bsth.service.schedule.impl.plan.kBase2.wrap.rule;
  2 +
  3 +import org.joda.time.*;
  4 +import java.util.*;
  5 +import org.slf4j.Logger;
  6 +
  7 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleCalcuParam_input;
  8 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_input;
  9 +import com.bsth.service.schedule.impl.plan.kBase1.core.shiftloop.ScheduleRule_Type;
  10 +import com.bsth.service.schedule.impl.plan.kBase1.core.rerun.RerunRule_input;
  11 +
  12 +import com.bsth.repository.schedule.RerunRuleRepository;
  13 +import com.bsth.repository.schedule.ScheduleRule1FlatRepository;
  14 +
  15 +import com.bsth.service.schedule.impl.plan.ScheduleRuleService;
  16 +
  17 +import com.bsth.entity.Line;
  18 +import com.bsth.entity.schedule.CarConfigInfo
  19 +import com.bsth.entity.schedule.EmployeeConfigInfo
  20 +import javax.print.attribute.standard.DateTimeAtCompleted;
  21 +
  22 +// 全局日志类(一般使用调用此规则的service类)
  23 +global Logger log;
  24 +
  25 +global ScheduleRule1FlatRepository srf;
  26 +global RerunRuleRepository rrr;
  27 +global ScheduleRuleService srservice;
  28 +global List sriList;
  29 +
  30 +
  31 +declare Sri_Wrap
  32 + xlId : String // 线路id
  33 + lpIds : List // 路牌id
  34 + srf : Object // ScheduleRule1Flat类型
  35 + sri : ScheduleRule_input; // ScheduleRule_input输入
  36 +end
  37 +
  38 +rule "rw1"
  39 + salience 1000
  40 + when
  41 + ScheduleCalcuParam_input(
  42 + $fromDate : fromDate,
  43 + $toDate : toDate,
  44 + $xlId: xlId
  45 + )
  46 + $srf : Object() from srf.findByXlId(Integer.parseInt($xlId))
  47 + then
  48 + // 创建Sri_Wrap
  49 + Sri_Wrap sw = new Sri_Wrap();
  50 + sw.setXlId($xlId);
  51 + sw.setSrf($srf);
  52 + ScheduleRule_input sri = new ScheduleRule_input((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf());
  53 + sw.setSri(sri);
  54 + sw.setLpIds(sri.getGuideboardIds());
  55 +
  56 + insert(sw);
  57 +
  58 +end
  59 +
  60 +rule "rw2"
  61 + salience 800
  62 + no-loop
  63 + when
  64 + ScheduleCalcuParam_input(
  65 + $fromDate : fromDate,
  66 + $toDate : toDate,
  67 + $xlId: xlId
  68 + )
  69 + $reu : RerunRule_input($lpId : lp) from srservice.findRerunrule(Integer.parseInt($xlId))
  70 + not Sri_Wrap(xlId == $xlId, lpIds contains $lpId)
  71 + then
  72 + // 套跑中有规则,主线路的路牌,主线路该路牌不存在,添加一个临时的,做处理
  73 + Sri_Wrap sw = new Sri_Wrap();
  74 + sw.setSrf(new com.bsth.entity.schedule.rule.ScheduleRule1Flat());
  75 + // 线路
  76 + Line xl = new Line();
  77 + xl.setId(Integer.valueOf($xlId));
  78 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setXl(xl);
  79 + // id,使用当前日期作为原始值加上路牌id最为临时id值
  80 + DateTime dt = new DateTime(new Date());
  81 + DateTime dt2 = new DateTime(dt.year().get(), dt.monthOfYear().get(), dt.dayOfMonth().get(), 0, 0, 0);
  82 + long id = (dt2.toDate().getTime() + Long.parseLong($lpId));
  83 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setId(id);
  84 + // 启用日期
  85 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setQyrq($fromDate.toDate());
  86 + // 车辆配置
  87 + CarConfigInfo cci = new CarConfigInfo();
  88 + cci.setId(new Date().getTime());
  89 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setCarConfigInfo(cci);
  90 + // 人员配置
  91 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setRyConfigIds("TEMP");
  92 + // 人员搭班编码
  93 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setRyDbbms("TEMP");
  94 + // 起始人员
  95 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setRyStart(1);
  96 + // 路牌id
  97 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setLpIds($lpId);
  98 + // 起始路牌
  99 + ((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf()).setLpStart(1);
  100 +
  101 + ScheduleRule_input sri = new ScheduleRule_input((com.bsth.entity.schedule.rule.ScheduleRule1Flat) sw.getSrf());
  102 + sri.setsType(ScheduleRule_Type.RERUN);
  103 + sw.setSri(sri);
  104 +
  105 + sw.setXlId($xlId);
  106 +
  107 + List lpIds = new ArrayList();
  108 + lpIds.add($lpId);
  109 + sw.setLpIds(lpIds);
  110 +
  111 + insert(sw);
  112 +end
  113 +
  114 +rule "rw3"
  115 + salience 600
  116 + when
  117 + $sri_wrap : Sri_Wrap($sri : sri, $xlId: xlId, $lpIds : lpIds)
  118 + then
  119 + log.info("线路id={},type={},ruleId={},lpids={}", $xlId, $sri.getsType(), $sri.getRuleId(), $lpIds);
  120 + sriList.add($sri);
121 end 121 end
122 \ No newline at end of file 122 \ No newline at end of file
src/main/resources/rules/kBase3_validate_rule.drl 0 → 100644
  1 +package com.bsth.service.schedule.impl.plan.kBase3.validate.rule;
  2 +
  3 +import accumulate com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ErrorInfoFunction srif;
  4 +import accumulate com.bsth.service.schedule.impl.plan.kBase3.validate.timetable.ErrorBcCountFunction ecount;
  5 +
  6 +import org.joda.time.*;
  7 +import java.util.*;
  8 +
  9 +import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.CalcuParam;
  10 +import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult;
  11 +import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.ValidateRuleResult.ErrorInfo;
  12 +import com.bsth.service.schedule.impl.plan.kBase3.validate.rule.WrapInput;
  13 +
  14 +import com.bsth.repository.schedule.ScheduleRule1FlatRepository
  15 +import com.bsth.repository.schedule.CarConfigInfoRepository;
  16 +import com.bsth.repository.schedule.GuideboardInfoRepository;
  17 +import com.bsth.repository.schedule.EmployeeConfigInfoRepository;
  18 +
  19 +import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
  20 +import com.bsth.entity.schedule.CarConfigInfo;
  21 +import com.bsth.entity.schedule.GuideboardInfo;
  22 +import com.bsth.entity.schedule.EmployeeConfigInfo;
  23 +
  24 +import org.slf4j.Logger
  25 +
  26 +// 全局日志
  27 +global Logger LOG;
  28 +
  29 +// repository查询
  30 +global CarConfigInfoRepository ccRepo;
  31 +global GuideboardInfoRepository lpRepo;
  32 +global EmployeeConfigInfoRepository ecRepo;
  33 +global ScheduleRule1FlatRepository ruleRepo;
  34 +
  35 +// return输出
  36 +global ValidateRuleResult result;
  37 +
  38 +
  39 +//------------------ 第一阶段、车辆信息,路牌信息,人员信息载入 -----------------//
  40 +
  41 +// 1、车辆信息载入
  42 +declare CarConfig_Wraps
  43 + xlId: Integer // 线路Id
  44 + ccMap: Map // 车辆配置Map Map<车辆自编号, CarConfigInfo>
  45 +end
  46 +
  47 +rule "calcu_CarConfig_Wraps"
  48 + salience 800
  49 + when
  50 + $param: CalcuParam($xlId: xlId)
  51 + then
  52 + List ccInfos = ccRepo.findByXlId($xlId);
  53 +
  54 + CarConfig_Wraps carConfig_wraps = new CarConfig_Wraps();
  55 + carConfig_wraps.setXlId($xlId);
  56 + carConfig_wraps.setCcMap(new HashMap());
  57 +
  58 + for (int i = 0; i < ccInfos.size(); i++) {
  59 + CarConfigInfo ccInfo = (CarConfigInfo) ccInfos.get(i);
  60 + if (!ccInfo.getIsCancel()) {
  61 + carConfig_wraps.getCcMap().put(ccInfo.getCl().getInsideCode(), ccInfo);
  62 + }
  63 + }
  64 +
  65 + insert(carConfig_wraps);
  66 +
  67 + LOG.info("第一阶段 --> 1、车辆信息载入 calcu_CarConfig_Wraps 有效配置车辆数={}", ccInfos.size());
  68 +end
  69 +
  70 +// 2、路牌信息载入
  71 +declare Lp_Wraps
  72 + xlId: Integer // 线路Id
  73 + lpMap: Map // 路牌Map Map<id, GuideboardInfo>
  74 +end
  75 +
  76 +rule "calcu_Lp_Wraps"
  77 + salience 800
  78 + when
  79 + $param: CalcuParam($xlId: xlId)
  80 + then
  81 + List lpInfos = lpRepo.findByXlId($xlId);
  82 + Lp_Wraps lp_wraps = new Lp_Wraps();
  83 + lp_wraps.setXlId($xlId);
  84 + lp_wraps.setLpMap(new HashMap());
  85 +
  86 + for (int i = 0; i < lpInfos.size(); i++) {
  87 + GuideboardInfo lpInfo = (GuideboardInfo) lpInfos.get(i);
  88 + if (!lpInfo.getIsCancel()) {
  89 + lp_wraps.getLpMap().put(lpInfo.getId(), lpInfo);
  90 + }
  91 + }
  92 +
  93 + insert(lp_wraps);
  94 +
  95 + LOG.info("第一阶段 --> 2、路牌信息载入 calcu_Lp_Wraps 有效路牌数={}", lpInfos.size());
  96 +
  97 +end
  98 +
  99 +// 3、人员信息载入
  100 +declare EmployeeConfig_Wraps
  101 + xlId: Integer // 线路Id
  102 + ecMap: Map // 人员配置Map Map<id, EmployeeConfigInfo>
  103 +end
  104 +
  105 +rule "calcu_EmployeeConfig_Wraps"
  106 + salience 800
  107 + when
  108 + $param: CalcuParam($xlId: xlId)
  109 + then
  110 + List ecInfos = ecRepo.findByXlId($xlId);
  111 +
  112 + EmployeeConfig_Wraps employeeConfig_wraps = new EmployeeConfig_Wraps();
  113 + employeeConfig_wraps.setXlId($xlId);
  114 + employeeConfig_wraps.setEcMap(new HashMap());
  115 +
  116 + for (int i = 0; i < ecInfos.size(); i++) {
  117 + EmployeeConfigInfo ecInfo = (EmployeeConfigInfo) ecInfos.get(i);
  118 + if (!ecInfo.getIsCancel()) {
  119 + employeeConfig_wraps.getEcMap().put(ecInfo.getId(), ecInfo);
  120 + }
  121 + }
  122 +
  123 + insert(employeeConfig_wraps);
  124 +
  125 + LOG.info("第一阶段 --> 3、人员信息载入 calcu_EmployeeConfig_Wraps 有效人员配置数={}", ecInfos.size());
  126 +end
  127 +
  128 +//------------------ 第二阶段、规则载入,计算相关数量 -----------------//
  129 +
  130 +declare Rule_Wraps
  131 + xlId: Integer // 线路Id
  132 + qyrq: Date // 启用日期
  133 + rule: ScheduleRule1Flat // ScheduleRule1Flat规则
  134 +end
  135 +
  136 +rule "calcu_schedule_rule_wrap"
  137 + salience 700
  138 + when
  139 + $param: CalcuParam($xlId: xlId)
  140 + $rule: ScheduleRule1Flat($qyrq: qyrq) from ruleRepo.findByXlId($xlId)
  141 + then
  142 + Rule_Wraps rw = new Rule_Wraps();
  143 + rw.setXlId($xlId);
  144 + rw.setQyrq($qyrq);
  145 + rw.setRule($rule);
  146 + insert(rw);
  147 +end
  148 +
  149 +rule "calcu_all_rule_count"
  150 + salience 600
  151 + when
  152 + $param: CalcuParam($xlId: xlId, $fd: fromDate, $td: toDate)
  153 + $allList: ArrayList() from collect(Rule_Wraps(xlId == $xlId))
  154 + then
  155 + result.setXlId($xlId);
  156 + result.setCount($allList.size());
  157 +
  158 + LOG.info("第二阶段 --> 规则总数={}", $allList.size());
  159 +end
  160 +
  161 +rule "calcu_all_qy_rule_count"
  162 + salience 500
  163 + when
  164 + $param: CalcuParam($xlId: xlId, $fd: fromDate, $td: toDate)
  165 + $qyList: ArrayList() from collect(
  166 + Rule_Wraps(xlId == $xlId, qyrq.getTime() <= $td.getMillis()))
  167 + then
  168 + result.setXlId($xlId);
  169 + result.setQyCount($qyList.size());
  170 +
  171 + LOG.info("第二阶段 --> 启用规则数={}", $qyList.size());
  172 +
  173 +end
  174 +
  175 +//------------------ 第三阶段、规则判定 -----------------//
  176 +
  177 +rule "calcu_Wrap_input"
  178 + salience 400
  179 + when
  180 + $param: CalcuParam($xlId: xlId, $fd: fromDate, $td: toDate)
  181 + $qy_rule: Rule_Wraps(xlId == $xlId, qyrq.getTime() <= $td.getMillis())
  182 + $cc: CarConfig_Wraps(xlId == $xlId)
  183 + $lp: Lp_Wraps(xlId == $xlId)
  184 + $ec: EmployeeConfig_Wraps(xlId == $xlId)
  185 + then
  186 + WrapInput wr = new WrapInput(
  187 + $qy_rule.getRule(),
  188 + $cc.getCcMap(),
  189 + $lp.getLpMap(),
  190 + $ec.getEcMap()
  191 + );
  192 + insert(wr);
  193 +end
  194 +
  195 +rule "calcu_error_info"
  196 + salience 300
  197 + when
  198 + $param: CalcuParam($xlId: xlId)
  199 + $errorMap: Map() from accumulate ($wr: WrapInput(xlId == $xlId), srif($wr))
  200 + then
  201 + result.setQyErrorCount($errorMap.size());
  202 + result.getErrorInfos().addAll($errorMap.values());
  203 +
  204 + LOG.info("第三阶段 --> 规则总数={}, 启用规则数={}, 错误的启用规则数={}",
  205 + result.getCount(), result.getQyCount(), result.getQyErrorCount());
  206 +
  207 +end
  208 +
  209 +