Commit 514010492398d5b8f92250aab9e7bcffc8e7524a

Authored by 徐烜
1 parent e38abc75

Update

src/main/java/com/bsth/entity/schedule/SchedulePlanInfo.java
@@ -164,6 +164,42 @@ public class SchedulePlanInfo { @@ -164,6 +164,42 @@ public class SchedulePlanInfo {
164 164
165 public SchedulePlanInfo() {} 165 public SchedulePlanInfo() {}
166 166
  167 + public void setRerunInfo(CarConfigInfo cc, EmployeeConfigInfo ec) {
  168 + // 关联的车辆信息
  169 + this.cl = cc.getCl().getId(); // 车辆id
  170 + this.clZbh = cc.getCl().getInsideCode(); // 自编号/内部编号
  171 +
  172 + // 关联的驾驶员
  173 + EmployeeConfigInfo employeeConfigInfo = ec;
  174 +
  175 + this.j = employeeConfigInfo.getJsy().getId();
  176 +// this.jGh = employeeConfigInfo.getJsy().getJobCode();
  177 + if (StringUtils.isNotEmpty(employeeConfigInfo.getJsy().getJobCode())) {
  178 + String[] jsy_temp = employeeConfigInfo.getJsy().getJobCode().split("-");
  179 + if (jsy_temp.length > 1) {
  180 + this.jGh = jsy_temp[1];
  181 + } else {
  182 + this.jGh = jsy_temp[0];
  183 + }
  184 + }
  185 + this.jName = employeeConfigInfo.getJsy().getPersonnelName();
  186 + // 关联的售票员
  187 + if (employeeConfigInfo.getSpy() != null) {
  188 + this.s = employeeConfigInfo.getSpy().getId();
  189 +// this.sGh = employeeConfigInfo.getSpy().getJobCode();
  190 + if (StringUtils.isNotEmpty(employeeConfigInfo.getSpy().getJobCode())) {
  191 + String[] spy_temp = employeeConfigInfo.getSpy().getJobCode().split("-");
  192 + if (spy_temp.length > 1) {
  193 + this.sGh = spy_temp[1];
  194 + } else {
  195 + this.sGh = spy_temp[0];
  196 + }
  197 + }
  198 +
  199 + this.sName = employeeConfigInfo.getSpy().getPersonnelName();
  200 + }
  201 + }
  202 +
167 public SchedulePlanInfo( 203 public SchedulePlanInfo(
168 Line xl, 204 Line xl,
169 ScheduleResult_output scheduleResult_output, 205 ScheduleResult_output scheduleResult_output,
src/main/java/com/bsth/entity/schedule/temp/SchedulePlanRuleResult.java
@@ -3,6 +3,8 @@ package com.bsth.entity.schedule.temp; @@ -3,6 +3,8 @@ package com.bsth.entity.schedule.temp;
3 import com.bsth.entity.schedule.SchedulePlan; 3 import com.bsth.entity.schedule.SchedulePlan;
4 4
5 import javax.persistence.*; 5 import javax.persistence.*;
  6 +import java.sql.PreparedStatement;
  7 +import java.sql.SQLException;
6 import java.util.Date; 8 import java.util.Date;
7 9
8 /** 10 /**
@@ -72,6 +74,38 @@ public class SchedulePlanRuleResult { @@ -72,6 +74,38 @@ public class SchedulePlanRuleResult {
72 this.createDate = new Date(); 74 this.createDate = new Date();
73 } 75 }
74 76
  77 + public static String generateInsertSql() {
  78 + String sql = "insert into bsth_c_s_sp_rule_rst" +
  79 + "(xl_id,xl_name,rule_id,cc_id,cc_zbh," +
  80 + "gids,gnames,gidindex,ecids,ecdbbms,ecindex," +
  81 + "ttinfo_id,ttinfo_name,schedule_date," +
  82 + "sysuser_id,sysuser_name,create_date) " +
  83 + "values (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  84 +
  85 + return sql;
  86 + }
  87 +
  88 + public void preparedStatementSet(PreparedStatement ps) throws SQLException {
  89 + ps.setInt(1, this.getXlId());
  90 + ps.setString(2, this.getXlName());
  91 + ps.setString(3, this.getRuleId());
  92 + ps.setString(4, this.getCcId());
  93 + ps.setString(5, this.getCcZbh());
  94 + ps.setString(6, this.getGids());
  95 + ps.setString(7, this.getGnames());
  96 + ps.setString(8, this.getGidindex());
  97 + ps.setString(9, this.getEcids());
  98 + ps.setString(10, this.getEcdbbms());
  99 + ps.setString(11, this.getEcindex());
  100 + ps.setString(12, this.getTtinfoId());
  101 + ps.setString(13, this.getTtinfoName());
  102 + ps.setDate(14, new java.sql.Date(this.getScheduleDate().getTime()));
  103 + ps.setString(15, this.getSysuserId());
  104 + ps.setString(16, this.getSysuserName());
  105 + ps.setTimestamp(17, new java.sql.Timestamp(this.getCreateDate().getTime()));
  106 +
  107 + }
  108 +
75 public Long getId() { 109 public Long getId() {
76 return id; 110 return id;
77 } 111 }
src/main/java/com/bsth/service/schedule/impl/SchedulePlanServiceImpl.java
@@ -2,6 +2,7 @@ package com.bsth.service.schedule.impl; @@ -2,6 +2,7 @@ package com.bsth.service.schedule.impl;
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;
  5 +import com.bsth.entity.schedule.SchedulePlanInfo;
5 import com.bsth.entity.schedule.TTInfo; 6 import com.bsth.entity.schedule.TTInfo;
6 import com.bsth.entity.schedule.rule.ScheduleRule1Flat; 7 import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
7 import com.bsth.repository.BusinessRepository; 8 import com.bsth.repository.BusinessRepository;
@@ -13,6 +14,7 @@ import com.bsth.service.schedule.rules.ScheduleRuleService; @@ -13,6 +14,7 @@ import com.bsth.service.schedule.rules.ScheduleRuleService;
13 import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input; 14 import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input;
14 import com.bsth.service.schedule.rules.plan.PlanResult; 15 import com.bsth.service.schedule.rules.plan.PlanResult;
15 import com.bsth.service.schedule.rules.rerun.RerunRule_input; 16 import com.bsth.service.schedule.rules.rerun.RerunRule_input;
  17 +import com.bsth.service.schedule.rules.rerun.RerunRule_param;
16 import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input; 18 import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;
17 import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output; 19 import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
18 import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input; 20 import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;
@@ -102,6 +104,9 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im @@ -102,6 +104,9 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
102 // 执行完毕销毁,有日志的也要关闭 104 // 执行完毕销毁,有日志的也要关闭
103 session.dispose(); 105 session.dispose();
104 106
  107 + // 保存循环规则结果数据
  108 + scheduleRuleService.generateRuleResult(scheduleResults_output.getSchedulePlanRuleResults());
  109 +
105 // logger.info("循环规则输出={}", scheduleResults_output.showGuideboardDesc1()); 110 // logger.info("循环规则输出={}", scheduleResults_output.showGuideboardDesc1());
106 111
107 return scheduleResults_output; 112 return scheduleResults_output;
@@ -217,15 +222,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im @@ -217,15 +222,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
217 * @param schedulePlan 222 * @param schedulePlan
218 * @return 223 * @return
219 */ 224 */
220 - private PlanResult SchedulePlanWithOutRerun(SchedulePlan schedulePlan) {  
221 - // pre、如果排班的数据之前已经有了,删除之前的数据  
222 - Date startpre = new Date();  
223 - scheduleRuleService.deelteSchedulePlanInfo(  
224 - schedulePlan.getXl().getId(),  
225 - schedulePlan.getScheduleFromTime(),  
226 - schedulePlan.getScheduleToTime());  
227 - Date endpre = new Date();  
228 - 225 + private PlanResult schedulePlanWithOutRerun(SchedulePlan schedulePlan) {
229 // 1、时刻表数据及每日路牌数据计算 226 // 1、时刻表数据及每日路牌数据计算
230 Date start1 = new Date(); 227 Date start1 = new Date();
231 Object[] ttInfoRets = ttInfoOutput(schedulePlan); 228 Object[] ttInfoRets = ttInfoOutput(schedulePlan);
@@ -241,8 +238,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im @@ -241,8 +238,7 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
241 PlanResult planResult = planResultOutput(schedulePlan, scheduleResults_output, ttInfoResults_output); 238 PlanResult planResult = planResultOutput(schedulePlan, scheduleResults_output, ttInfoResults_output);
242 Date end3 = new Date(); 239 Date end3 = new Date();
243 240
244 - logger.info("删除数据 {} ms,drool时刻表每日路牌计算 {} ms,drool循环规则计算 {} ms,drool计划数据 {} ms",  
245 - endpre.getTime() - startpre.getTime(), 241 + logger.info("drool时刻表每日路牌计算 {} ms,drool循环规则计算 {} ms,drool计划数据 {} ms",
246 end1.getTime() - start1.getTime(), 242 end1.getTime() - start1.getTime(),
247 end2.getTime() - start2.getTime(), 243 end2.getTime() - start2.getTime(),
248 end3.getTime() - start3.getTime()); 244 end3.getTime() - start3.getTime());
@@ -250,24 +246,99 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im @@ -250,24 +246,99 @@ public class SchedulePlanServiceImpl extends BServiceImpl<SchedulePlan, Long> im
250 return planResult; 246 return planResult;
251 } 247 }
252 248
  249 + /**
  250 + * 套跑计划排班数据。
  251 + * @param planResult
  252 + */
  253 + private void rerunPlanResult(PlanResult planResult, SchedulePlan schedulePlan) {
  254 + List<RerunRule_input> rerunRule_inputs = scheduleRuleService.findRerunrule(Integer.parseInt(planResult.getXlId()));
  255 + logger.info("套跑数量 {} 组", rerunRule_inputs.size());
  256 +
  257 + if (rerunRule_inputs.size() > 0) {
  258 + // 找出是对应路牌类型的线路,计算循环规则输出
  259 + Set<String> xlids = new HashSet<>();
  260 + for (RerunRule_input rerunRule_input: rerunRule_inputs) {
  261 + if ("dylp".equals(rerunRule_input.getType())) {
  262 + xlids.add(rerunRule_input.getXl());
  263 + }
  264 + }
  265 +
  266 + List<ScheduleResults_output> scheduleResults_outputs = new ArrayList<>();
  267 + Date start1 = new Date();
  268 + for (String xlid: xlids) {
  269 + schedulePlan.getXl().setId(Integer.parseInt(xlid)); // 套跑的线路默认跟着主线路设定走
  270 + // 获取套跑线路的循环规则计算输出
  271 + Object[] ttInfoRets = ttInfoOutput(schedulePlan);
  272 + LpInfoResults_output lpInfoResults_output = (LpInfoResults_output) ttInfoRets[1];
  273 + ScheduleResults_output scheduleResults_output = loopRuleOutput(schedulePlan, lpInfoResults_output);
  274 + scheduleResults_outputs.add(scheduleResults_output);
  275 + }
  276 +
  277 + // 1-2、构造drools session->载入数据->启动规则->计算->销毁session
  278 + // 创建session,内部配置的是stateful
  279 + KieSession session = kieBase.newKieSession();
  280 +
  281 + // 设置gloable对象,在drl中通过别名使用
  282 + session.setGlobal("planResult", planResult);
  283 + session.setGlobal("log", logger); // 设置日志
  284 +
  285 + session.setGlobal("carConfigInfoRepository", carConfigInfoRepository);
  286 + session.setGlobal("employeeConfigInfoRepository", employeeConfigInfoRepository);
  287 +
  288 + // 载入数据
  289 + RerunRule_param rerunRule_param = new RerunRule_param();
  290 + rerunRule_param.setMxlid(planResult.getXlId());
  291 + rerunRule_param.setXlIds_dylp(xlids);
  292 + session.insert(rerunRule_param);
  293 + for (RerunRule_input rri: rerunRule_inputs) {
  294 + session.insert(rri);
  295 + }
  296 + for (SchedulePlanInfo spi: planResult.getSchedulePlanInfos()) {
  297 + session.insert(spi);
  298 + }
  299 + for (ScheduleResults_output sro: scheduleResults_outputs) {
  300 + session.insert(sro);
  301 + }
  302 +
  303 + // 执行rule
  304 + session.fireAllRules();
  305 +
  306 + // 执行完毕销毁,有日志的也要关闭
  307 + session.dispose();
  308 +
  309 + Date end1 = new Date();
  310 + logger.info("套跑规则计算,耗时 {} ms", end1.getTime() - start1.getTime());
  311 +
  312 + }
  313 +
  314 + }
  315 +
253 public SchedulePlan save(SchedulePlan schedulePlan) { 316 public SchedulePlan save(SchedulePlan schedulePlan) {
  317 + // pre、如果排班的数据之前已经有了,删除之前的数据
  318 + Date startpre = new Date();
  319 + scheduleRuleService.deelteSchedulePlanInfo(
  320 + schedulePlan.getXl().getId(),
  321 + schedulePlan.getScheduleFromTime(),
  322 + schedulePlan.getScheduleToTime());
  323 + Date endpre = new Date();
  324 +
254 // 1、查找线路,这是主线路 325 // 1、查找线路,这是主线路
255 Line xl = lineRepository.findOne(schedulePlan.getXl().getId()); 326 Line xl = lineRepository.findOne(schedulePlan.getXl().getId());
256 logger.info("<--- 排班master线路 id={}, name={}, 开始排班", xl.getId(), xl.getName()); 327 logger.info("<--- 排班master线路 id={}, name={}, 开始排班", xl.getId(), xl.getName());
257 328
258 // 2、确定主线路排班(无套跑规则) 329 // 2、确定主线路排班(无套跑规则)
259 - PlanResult planResult = SchedulePlanWithOutRerun(schedulePlan); 330 + PlanResult planResult = schedulePlanWithOutRerun(schedulePlan);
260 331
261 - // TODO 3、确定套跑规则  
262 - List<RerunRule_input> rerunRule_inputs = scheduleRuleService.findRerunrule(schedulePlan.getXl().getId());  
263 - logger.info("套跑数量 {} 组", rerunRule_inputs.size()); 332 + // 3、确定套跑规则
  333 + rerunPlanResult(planResult, schedulePlan);
264 334
265 // 4、保存数据(jdbcTemplate 批量插入) 335 // 4、保存数据(jdbcTemplate 批量插入)
266 Date start4 = new Date(); 336 Date start4 = new Date();
267 scheduleRuleService.generateSchedulePlan(schedulePlan, planResult.getSchedulePlanInfos()); 337 scheduleRuleService.generateSchedulePlan(schedulePlan, planResult.getSchedulePlanInfos());
268 Date end4 = new Date(); 338 Date end4 = new Date();
269 339
270 - logger.info("保存主线路数据 {} 条 耗时 {} ms --->", 340 + logger.info("删除数据 {} ms,保存主线路数据 {} 条 耗时 {} ms --->",
  341 + endpre.getTime() - startpre.getTime(),
271 planResult.getSchedulePlanInfos().size(), 342 planResult.getSchedulePlanInfos().size(),
272 end4.getTime() - start4.getTime()); 343 end4.getTime() - start4.getTime());
273 344
src/main/java/com/bsth/service/schedule/rules/MyDroolsConfiguration.java
@@ -71,6 +71,9 @@ public class MyDroolsConfiguration { @@ -71,6 +71,9 @@ public class MyDroolsConfiguration {
71 kfs.write("src/main/resources/plan.drl", kieServices.getResources() 71 kfs.write("src/main/resources/plan.drl", kieServices.getResources()
72 .newInputStreamResource(this.getClass().getResourceAsStream( 72 .newInputStreamResource(this.getClass().getResourceAsStream(
73 "/rules/plan.drl"), "UTF-8")); 73 "/rules/plan.drl"), "UTF-8"));
  74 + kfs.write("src/main/resources/rerun.drl", kieServices.getResources()
  75 + .newInputStreamResource(this.getClass().getResourceAsStream(
  76 + "/rules/rerun.drl"), "UTF-8"));
74 // TODO:还有其他drl.... 77 // TODO:还有其他drl....
75 78
76 // 4、创建KieBuilder,使用KieFileSystem构建 79 // 4、创建KieBuilder,使用KieFileSystem构建
src/main/java/com/bsth/service/schedule/rules/ScheduleRuleService.java
@@ -31,6 +31,12 @@ public interface ScheduleRuleService { @@ -31,6 +31,12 @@ public interface ScheduleRuleService {
31 void generateSchedulePlan(SchedulePlan schedulePlan, List<SchedulePlanInfo> schedulePlanInfos); 31 void generateSchedulePlan(SchedulePlan schedulePlan, List<SchedulePlanInfo> schedulePlanInfos);
32 32
33 /** 33 /**
  34 + * 生成排班规则结果。
  35 + * @param schedulePlanRuleResults
  36 + */
  37 + void generateRuleResult(List<SchedulePlanRuleResult> schedulePlanRuleResults);
  38 +
  39 + /**
34 * 删除排班计划。 40 * 删除排班计划。
35 * @param id 排班计划id 41 * @param id 排班计划id
36 */ 42 */
src/main/java/com/bsth/service/schedule/rules/ScheduleRuleServiceImpl.java
@@ -71,10 +71,10 @@ public class ScheduleRuleServiceImpl implements ScheduleRuleService { @@ -71,10 +71,10 @@ public class ScheduleRuleServiceImpl implements ScheduleRuleService {
71 71
72 rerunRule_input.setType(resultSet.getString("type")); 72 rerunRule_input.setType(resultSet.getString("type"));
73 // 对应班次类型 73 // 对应班次类型
74 - if ("dybc".equals(resultSet.getString("type"))) { 74 + if ("dylp".equals(resultSet.getString("type"))) {
75 rerunRule_input.setS_xl(String.valueOf(resultSet.getInt("s_dylp_xl"))); 75 rerunRule_input.setS_xl(String.valueOf(resultSet.getInt("s_dylp_xl")));
76 rerunRule_input.setS_lp(String.valueOf(resultSet.getLong("s_dylp_lp"))); 76 rerunRule_input.setS_lp(String.valueOf(resultSet.getLong("s_dylp_lp")));
77 - } else if ("dylp".equals(resultSet.getString("type"))) { 77 + } else if ("dybc".equals(resultSet.getString("type"))) {
78 rerunRule_input.setCl(resultSet.getInt("s_dybc_cl")); 78 rerunRule_input.setCl(resultSet.getInt("s_dybc_cl"));
79 rerunRule_input.setZbh(resultSet.getString("s_dybc_clzbh")); 79 rerunRule_input.setZbh(resultSet.getString("s_dybc_clzbh"));
80 rerunRule_input.setJ(resultSet.getInt("s_dybc_j")); 80 rerunRule_input.setJ(resultSet.getInt("s_dybc_j"));
@@ -94,15 +94,6 @@ public class ScheduleRuleServiceImpl implements ScheduleRuleService { @@ -94,15 +94,6 @@ public class ScheduleRuleServiceImpl implements ScheduleRuleService {
94 return rerunRule_inputs; 94 return rerunRule_inputs;
95 } 95 }
96 96
97 - public void test() {  
98 - jdbcTemplate.query("", new RowCallbackHandler() {  
99 - @Override  
100 - public void processRow(ResultSet resultSet) throws SQLException {  
101 -  
102 - }  
103 - });  
104 - }  
105 -  
106 @Override 97 @Override
107 public List<SchedulePlanRuleResult> findLastByXl(String xlid, Date from) { 98 public List<SchedulePlanRuleResult> findLastByXl(String xlid, Date from) {
108 String sql = "select * from bsth_c_s_sp_rule_rst a " + 99 String sql = "select * from bsth_c_s_sp_rule_rst a " +
@@ -142,6 +133,35 @@ public class ScheduleRuleServiceImpl implements ScheduleRuleService { @@ -142,6 +133,35 @@ public class ScheduleRuleServiceImpl implements ScheduleRuleService {
142 jdbcTemplate.update(sql, xlid, datefrom, dateto); 133 jdbcTemplate.update(sql, xlid, datefrom, dateto);
143 } 134 }
144 135
  136 + @Override
  137 + public void generateRuleResult(List<SchedulePlanRuleResult> schedulePlanRuleResults) {
  138 + // 、批量插入排班规则结果
  139 + List<List<SchedulePlanRuleResult>> lists = new ArrayList<>();
  140 + int batchSize = 2000;
  141 + int loopCount = schedulePlanRuleResults.size() / batchSize;
  142 + int otherCount = schedulePlanRuleResults.size() % batchSize;
  143 + for (int i = 0; i < loopCount; i++) {
  144 + lists.add(schedulePlanRuleResults.subList(i * batchSize, i * batchSize + batchSize));
  145 + }
  146 + if (otherCount > 0) {
  147 + lists.add(schedulePlanRuleResults.subList(loopCount * batchSize, loopCount * batchSize + otherCount));
  148 + }
  149 +
  150 + for (final List<SchedulePlanRuleResult> list : lists) {
  151 + jdbcTemplate.batchUpdate(SchedulePlanRuleResult.generateInsertSql(), new BatchPreparedStatementSetter() {
  152 + @Override
  153 + public void setValues(PreparedStatement preparedStatement, int i) throws SQLException {
  154 + SchedulePlanRuleResult schedulePlanRuleResult = list.get(i);
  155 + schedulePlanRuleResult.preparedStatementSet(preparedStatement);
  156 + }
  157 + @Override
  158 + public int getBatchSize() {
  159 + return list.size();
  160 + }
  161 + });
  162 + }
  163 + }
  164 +
145 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) 165 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
146 @Override 166 @Override
147 public void generateSchedulePlan(final SchedulePlan schedulePlan, final List<SchedulePlanInfo> schedulePlanInfos) { 167 public void generateSchedulePlan(final SchedulePlan schedulePlan, final List<SchedulePlanInfo> schedulePlanInfos) {
src/main/java/com/bsth/service/schedule/rules/rerun/RerunRule_param.java 0 → 100644
  1 +package com.bsth.service.schedule.rules.rerun;
  2 +
  3 +import java.util.Set;
  4 +
  5 +/**
  6 + * Created by xu on 17/4/27.
  7 + */
  8 +public class RerunRule_param {
  9 + /** 主线路id */
  10 + private String mxlid;
  11 +
  12 + /** 对应路牌的套跑线路 */
  13 + private Set<String> xlIds_dylp;
  14 +
  15 + // TODO:
  16 +
  17 +
  18 + public Set<String> getXlIds_dylp() {
  19 + return xlIds_dylp;
  20 + }
  21 +
  22 + public void setXlIds_dylp(Set<String> xlIds_dylp) {
  23 + this.xlIds_dylp = xlIds_dylp;
  24 + }
  25 +
  26 + public String getMxlid() {
  27 + return mxlid;
  28 + }
  29 +
  30 + public void setMxlid(String mxlid) {
  31 + this.mxlid = mxlid;
  32 + }
  33 +}
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleResult_output.java
@@ -17,6 +17,9 @@ public class ScheduleResult_output { @@ -17,6 +17,9 @@ public class ScheduleResult_output {
17 /** 车辆配置id */ 17 /** 车辆配置id */
18 private String carConfigId; 18 private String carConfigId;
19 19
  20 + /** 线路id */
  21 + private String xlId;
  22 +
20 public DateTime getSd() { 23 public DateTime getSd() {
21 return sd; 24 return sd;
22 } 25 }
@@ -56,4 +59,12 @@ public class ScheduleResult_output { @@ -56,4 +59,12 @@ public class ScheduleResult_output {
56 public void setCarConfigId(String carConfigId) { 59 public void setCarConfigId(String carConfigId) {
57 this.carConfigId = carConfigId; 60 this.carConfigId = carConfigId;
58 } 61 }
  62 +
  63 + public String getXlId() {
  64 + return xlId;
  65 + }
  66 +
  67 + public void setXlId(String xlId) {
  68 + this.xlId = xlId;
  69 + }
59 } 70 }
src/main/java/com/bsth/service/schedule/rules/shiftloop/ScheduleResults_output.java
@@ -9,6 +9,9 @@ import java.util.*; @@ -9,6 +9,9 @@ import java.util.*;
9 * 输出结果集合。 9 * 输出结果集合。
10 */ 10 */
11 public class ScheduleResults_output { 11 public class ScheduleResults_output {
  12 + /** 线路Id */
  13 + private String xlid;
  14 +
12 /** 输出列表 */ 15 /** 输出列表 */
13 private List<ScheduleResult_output> results = new ArrayList<>(); 16 private List<ScheduleResult_output> results = new ArrayList<>();
14 17
@@ -71,5 +74,13 @@ public class ScheduleResults_output { @@ -71,5 +74,13 @@ public class ScheduleResults_output {
71 return stringBuilder.toString(); 74 return stringBuilder.toString();
72 } 75 }
73 76
74 - // TODO:人员输出 77 + public String getXlid() {
  78 + return xlid;
  79 + }
  80 +
  81 + public void setXlid(String xlid) {
  82 + this.xlid = xlid;
  83 + }
  84 +
  85 +// TODO:人员输出
75 } 86 }
src/main/resources/rules/rerun.drl 0 → 100644
  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($xlId));
  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($xlId));
  80 +
  81 + Dylp_EmployeeConfig_Wraps employeeConfig_wraps = new Dylp_EmployeeConfig_Wraps();
  82 + employeeConfig_wraps.setXlId($xlId);
  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: 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 + wrap.setEc((EmployeeConfigInfo) $ecmap.get($sr.getEmployeeConfigId()));
  120 +
  121 + insert(wrap);
  122 +end
  123 +
  124 +//-------------------- 第三阶段、套跑线路,替换班次的车辆,人员 --------------------//
  125 +rule "calcu_Dylp_rerun_update"
  126 + salience 800
  127 +// no-loop
  128 + when
  129 + $spi: SchedulePlanInfo($xlid: xl, $sd: scheduleDate, $lp: lp, $fcsj: fcsj, $ttinfo: ttInfo)
  130 + $ri: RerunRule_input(
  131 + type == "dylp",
  132 + xl == $xlid.toString(),
  133 + ttinfo == $ttinfo.toString(),
  134 + lp == $lp.toString(),
  135 + fcsj == $fcsj,
  136 + $sxl: s_xl, $slp: s_lp
  137 + )
  138 + $dsro: Dylp_ScheduleResult_output_wrap(
  139 + xlId == $sxl,
  140 + lp == $slp,
  141 + sd.getMillis() == $sd.getTime()
  142 + )
  143 + then
  144 +// log.info("TODO:测试 {}", $fcsj);
  145 +
  146 + $spi.setRerunInfo($dsro.getCc(), $dsro.getEc());
  147 +
  148 +end
  149 +
  150 +
  151 +
  152 +
  153 +
  154 +
  155 +
  156 +
  157 +
  158 +
  159 +
  160 +
  161 +
  162 +
  163 +
  164 +
  165 +
  166 +
src/main/resources/rules/shiftloop_fb_2.drl
@@ -55,13 +55,16 @@ rule &quot;calcu_days_1_&quot; @@ -55,13 +55,16 @@ rule &quot;calcu_days_1_&quot;
55 ScheduleCalcuParam_input( 55 ScheduleCalcuParam_input(
56 fromDate.isBefore(toDate) || fromDate.isEqual(toDate), 56 fromDate.isBefore(toDate) || fromDate.isEqual(toDate),
57 $fromDate : fromDate, 57 $fromDate : fromDate,
58 - $toDate : toDate 58 + $toDate : toDate,
  59 + $xlId: xlId
59 ) 60 )
60 ScheduleRule_input( 61 ScheduleRule_input(
61 $ruleId : ruleId, $qyrq : qyrq, 62 $ruleId : ruleId, $qyrq : qyrq,
62 $lpindex : startGbdIndex, $ryindex: startEIndex) 63 $lpindex : startGbdIndex, $ryindex: startEIndex)
63 eval($qyrq.isBefore($fromDate)) 64 eval($qyrq.isBefore($fromDate))
64 then 65 then
  66 + scheduleResult.setXlid($xlId);
  67 +
65 // 构造Calcu_days_result_pre,用于路牌 68 // 构造Calcu_days_result_pre,用于路牌
66 Calcu_days_result_pre cdrp = new Calcu_days_result_pre(); 69 Calcu_days_result_pre cdrp = new Calcu_days_result_pre();
67 cdrp.setRuleId($ruleId); 70 cdrp.setRuleId($ruleId);
@@ -87,13 +90,16 @@ rule &quot;calcu_days_2_&quot; @@ -87,13 +90,16 @@ rule &quot;calcu_days_2_&quot;
87 ScheduleCalcuParam_input( 90 ScheduleCalcuParam_input(
88 fromDate.isBefore(toDate) || fromDate.isEqual(toDate), 91 fromDate.isBefore(toDate) || fromDate.isEqual(toDate),
89 $fromDate : fromDate, 92 $fromDate : fromDate,
90 - $toDate : toDate 93 + $toDate : toDate,
  94 + $xlId: xlId
91 ) 95 )
92 ScheduleRule_input( 96 ScheduleRule_input(
93 $ruleId : ruleId, $qyrq : qyrq, 97 $ruleId : ruleId, $qyrq : qyrq,
94 $lpindex : startGbdIndex, $ryindex: startEIndex) 98 $lpindex : startGbdIndex, $ryindex: startEIndex)
95 eval((!$qyrq.isBefore($fromDate)) && (!$qyrq.isAfter($toDate))) 99 eval((!$qyrq.isBefore($fromDate)) && (!$qyrq.isAfter($toDate)))
96 then 100 then
  101 + scheduleResult.setXlid($xlId);
  102 +
97 // 构造Calcu_days_result_pre,用于路牌 103 // 构造Calcu_days_result_pre,用于路牌
98 Calcu_days_result_pre cdrp = new Calcu_days_result_pre(); 104 Calcu_days_result_pre cdrp = new Calcu_days_result_pre();
99 cdrp.setRuleId($ruleId); 105 cdrp.setRuleId($ruleId);
@@ -243,7 +249,7 @@ end @@ -243,7 +249,7 @@ end
243 rule "Calcu_loop2_1_" // 路牌在时刻表中存在,就翻 249 rule "Calcu_loop2_1_" // 路牌在时刻表中存在,就翻
244 salience 800 250 salience 800
245 when 251 when
246 - ScheduleCalcuParam_input($sp: schedulePlan) 252 + ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)
247 $cdrp: Calcu_days_result_pre( 253 $cdrp: Calcu_days_result_pre(
248 calcu_start_date_1.isEqual(calcu_end_date_1), 254 calcu_start_date_1.isEqual(calcu_end_date_1),
249 calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2), 255 calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),
@@ -276,6 +282,7 @@ rule &quot;Calcu_loop2_1_&quot; // 路牌在时刻表中存在,就翻 @@ -276,6 +282,7 @@ rule &quot;Calcu_loop2_1_&quot; // 路牌在时刻表中存在,就翻
276 ro.setGuideboardId(String.valueOf($gids.get($lpindex))); 282 ro.setGuideboardId(String.valueOf($gids.get($lpindex)));
277 ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex))); 283 ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex)));
278 ro.setCarConfigId($cid); 284 ro.setCarConfigId($cid);
  285 + ro.setXlId($xlid);
279 286
280 scheduleResult.getResults().add(ro); 287 scheduleResult.getResults().add(ro);
281 288
@@ -313,7 +320,7 @@ end @@ -313,7 +320,7 @@ end
313 rule "Calcu_loop2_2_" // 路牌在时刻表中不存在,就不翻 320 rule "Calcu_loop2_2_" // 路牌在时刻表中不存在,就不翻
314 salience 800 321 salience 800
315 when 322 when
316 - ScheduleCalcuParam_input($sp: schedulePlan) 323 + ScheduleCalcuParam_input($sp: schedulePlan, $xlid: xlId)
317 $cdrp: Calcu_days_result_pre( 324 $cdrp: Calcu_days_result_pre(
318 calcu_start_date_1.isEqual(calcu_end_date_1), 325 calcu_start_date_1.isEqual(calcu_end_date_1),
319 calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2), 326 calcu_start_date_2.isBefore(calcu_end_date_2) || calcu_start_date_2.isEqual(calcu_end_date_2),
@@ -337,6 +344,7 @@ rule &quot;Calcu_loop2_2_&quot; // 路牌在时刻表中不存在,就不翻 @@ -337,6 +344,7 @@ rule &quot;Calcu_loop2_2_&quot; // 路牌在时刻表中不存在,就不翻
337 ro.setGuideboardId(String.valueOf($gids.get($lpindex))); 344 ro.setGuideboardId(String.valueOf($gids.get($lpindex)));
338 ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex))); 345 ro.setEmployeeConfigId(String.valueOf($eids.get($ryindex)));
339 ro.setCarConfigId($cid); 346 ro.setCarConfigId($cid);
  347 + ro.setXlId($xlid);
340 348
341 scheduleResult.getResults().add(ro); 349 scheduleResult.getResults().add(ro);
342 350
src/test/resources/testdata/problem.properties
@@ -14,4 +14,5 @@ @@ -14,4 +14,5 @@
14 14=路牌编号自动生成 14 14=路牌编号自动生成
15 15=时刻表导入的时候表头后面不需要加数字 15 15=时刻表导入的时候表头后面不需要加数字
16 16=时间框中文 16 16=时间框中文
  17 +17=人员工号前公司编码自动加
17 18