Commit a4ff8a760ff23345d631e25737b0dedcebc8080b
1 parent
34547da3
嘉定公交调度系统计划调度功能优化5
1、排班优化,重构 排班生成 - 1、计算时刻表相关信息,关联的规则drl,服务service,测试用例
Showing
20 changed files
with
1835 additions
and
1 deletions
src/main/java/com/bsth/service/schedule/plan/PlanConfig.java
| @@ -59,6 +59,19 @@ public class PlanConfig { | @@ -59,6 +59,19 @@ public class PlanConfig { | ||
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | /** | 61 | /** |
| 62 | + * 排班生成 - 1、计算时刻表相关信息 kieBase。 | ||
| 63 | + * @return | ||
| 64 | + */ | ||
| 65 | + @Bean(name = "kBaseGenerateCalcuTimeTable_plus") | ||
| 66 | + public KieBase kBaseGenerateCalcuTimeTable() { | ||
| 67 | + KieBase kieBase = this.generateKieBase( | ||
| 68 | + "kBaseGenerateCalcuTimeTable", | ||
| 69 | + new String[] {this.planConfigProperties.getGenerateCalcuTimetable()}); | ||
| 70 | + LOGGER.info("初始化 KieBase[{}]成功", "排班生成 - 1、计算时刻表相关信息"); | ||
| 71 | + return kieBase; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + /** | ||
| 62 | * 生成KieBase。 | 75 | * 生成KieBase。 |
| 63 | * @param kBaseName kBase名字 | 76 | * @param kBaseName kBase名字 |
| 64 | * @param drlClasspaths 规则类路径 | 77 | * @param drlClasspaths 规则类路径 |
src/main/java/com/bsth/service/schedule/plan/PlanConfigProperties.java
| @@ -22,6 +22,9 @@ public class PlanConfigProperties { | @@ -22,6 +22,9 @@ public class PlanConfigProperties { | ||
| 22 | @NotNull | 22 | @NotNull |
| 23 | private String validateRule; | 23 | private String validateRule; |
| 24 | 24 | ||
| 25 | + /** 排班生成 - 1、计算时刻表相关信息 */ | ||
| 26 | + private String generateCalcuTimetable; | ||
| 27 | + | ||
| 25 | public String getValidateTimetable() { | 28 | public String getValidateTimetable() { |
| 26 | return validateTimetable; | 29 | return validateTimetable; |
| 27 | } | 30 | } |
| @@ -37,4 +40,12 @@ public class PlanConfigProperties { | @@ -37,4 +40,12 @@ public class PlanConfigProperties { | ||
| 37 | public void setValidateRule(String validateRule) { | 40 | public void setValidateRule(String validateRule) { |
| 38 | this.validateRule = validateRule; | 41 | this.validateRule = validateRule; |
| 39 | } | 42 | } |
| 43 | + | ||
| 44 | + public String getGenerateCalcuTimetable() { | ||
| 45 | + return generateCalcuTimetable; | ||
| 46 | + } | ||
| 47 | + | ||
| 48 | + public void setGenerateCalcuTimetable(String generateCalcuTimetable) { | ||
| 49 | + this.generateCalcuTimetable = generateCalcuTimetable; | ||
| 50 | + } | ||
| 40 | } | 51 | } |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/PlanProcessGenerateCalcuTimeTableService.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | +import org.joda.time.DateTime; | ||
| 7 | + | ||
| 8 | +import java.util.ArrayList; | ||
| 9 | +import java.util.Date; | ||
| 10 | +import java.util.List; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * 计算时刻表信息服务。 | ||
| 14 | + */ | ||
| 15 | +public interface PlanProcessGenerateCalcuTimeTableService { | ||
| 16 | + /** | ||
| 17 | + * 计算时刻表信息。 | ||
| 18 | + * @param xlid 线路Id | ||
| 19 | + * @param from 排班计划开始时间 | ||
| 20 | + * @param to 排班计划结束时间 | ||
| 21 | + * @return 验证输出 | ||
| 22 | + */ | ||
| 23 | + List<TTinfoDetailByLpResult> generateCalcuTTInfos(Integer xlid, Date from, Date to); | ||
| 24 | + | ||
| 25 | + /** | ||
| 26 | + * 时刻表,路牌信息合并。 | ||
| 27 | + * 当前线路,指定排班日期,使用的时刻表,对应的路牌,以及对应路牌的时刻表班次列表。 | ||
| 28 | + */ | ||
| 29 | + @Data | ||
| 30 | + @Builder | ||
| 31 | + @AllArgsConstructor | ||
| 32 | + class TTinfoDetailByLpResult { | ||
| 33 | + /** 线路 */ | ||
| 34 | + private LineResult lineResult; | ||
| 35 | + | ||
| 36 | + /** 排班日期 */ | ||
| 37 | + private DateTime scheduleDate; | ||
| 38 | + | ||
| 39 | + /** 当前日期使用的时刻表 */ | ||
| 40 | + private TTinfoResult tTinfoResult; | ||
| 41 | + | ||
| 42 | + /** 时刻表对应路牌配置 */ | ||
| 43 | + private LpInfoResult lpInfoResult; | ||
| 44 | + /** 时刻表路牌对应班次列表 */ | ||
| 45 | + private List<TTinfoDetailResult> tTinfoDetailResultList; | ||
| 46 | + | ||
| 47 | + /** 最小班次发车顺序号 */ | ||
| 48 | + private Integer minFcno; | ||
| 49 | + /** 最大班次发车顺序号 */ | ||
| 50 | + private Integer maxFcno; | ||
| 51 | + /** 开始分班班次发车顺序号 */ | ||
| 52 | + private Integer startFbFcno; | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + @Data | ||
| 56 | + @Builder | ||
| 57 | + @AllArgsConstructor | ||
| 58 | + class LineResult { | ||
| 59 | + /** 主键id */ | ||
| 60 | + private Integer id; | ||
| 61 | + /** 线路名称 */ | ||
| 62 | + private String name; | ||
| 63 | + } | ||
| 64 | + | ||
| 65 | + @Data | ||
| 66 | + @Builder | ||
| 67 | + @AllArgsConstructor | ||
| 68 | + class TTinfoResult { | ||
| 69 | + /** 主键Id */ | ||
| 70 | + private Long id; | ||
| 71 | + | ||
| 72 | + /** 线路关联 */ | ||
| 73 | + private LineResult xl; | ||
| 74 | + | ||
| 75 | + /** 时刻表名称 */ | ||
| 76 | + private String name; | ||
| 77 | + | ||
| 78 | + /** 常规有效日(1-7表示星期一到星期日,多个用逗号隔开) */ | ||
| 79 | + private String rule_days; | ||
| 80 | + /** 特殊有效日期(格式:2001-01-01,多个用逗号隔开) */ | ||
| 81 | + private String special_days; | ||
| 82 | + | ||
| 83 | + /** 常规有效日(参照rule_days,1=true表示启用,0=false表示未启用,一个星期7天,保存7个元素) */ | ||
| 84 | + private List<Boolean> weekdayList = new ArrayList<>(); | ||
| 85 | + /** 特殊有效日期(参照special_days,1个日期保存1个元素) */ | ||
| 86 | + private List<DateTime> specialDayList = new ArrayList<>(); | ||
| 87 | + | ||
| 88 | + /** 线路版本(bsth_c_line_versions表对应字段) */ | ||
| 89 | + private int lineVersion; | ||
| 90 | + } | ||
| 91 | + | ||
| 92 | + @Data | ||
| 93 | + @Builder | ||
| 94 | + @AllArgsConstructor | ||
| 95 | + class LpInfoResult { | ||
| 96 | + /** 线路信息 */ | ||
| 97 | + private LineResult xl; | ||
| 98 | + /** 路牌Id */ | ||
| 99 | + private Long id; | ||
| 100 | + /** 路牌名字 */ | ||
| 101 | + private String name; | ||
| 102 | + } | ||
| 103 | + | ||
| 104 | + @Data | ||
| 105 | + @Builder | ||
| 106 | + @AllArgsConstructor | ||
| 107 | + class TTinfoDetailResult { | ||
| 108 | + /** 线路 */ | ||
| 109 | + private LineResult xl; | ||
| 110 | + /** 时刻表 */ | ||
| 111 | + private TTinfoResult ttInfo; | ||
| 112 | + /** 路牌 */ | ||
| 113 | + private LpInfoResult lp; | ||
| 114 | + | ||
| 115 | + /** 主健Id */ | ||
| 116 | + private Long id; | ||
| 117 | + | ||
| 118 | + // 站点包括普通站点和停车场(站点编码不同,使用站点编码区分) | ||
| 119 | + // 以后不需要再区分是站点还是停车场了 | ||
| 120 | + /** 起站点代码(bsth_c_station,bsth_c_car_park 里的编码) */ | ||
| 121 | + private String qdzCode; | ||
| 122 | + /** 起站点名字(bsth_c_stationroute,bsth_c_car_park里的名字) */ | ||
| 123 | + private String qdzName; | ||
| 124 | + /** 终点站代码(bsth_c_station,bsth_c_car_park 里的编码) */ | ||
| 125 | + private String zdzCode; | ||
| 126 | + /** 终点站名字(bsth_c_stationroute,bsth_c_car_park里的名字) */ | ||
| 127 | + private String zdzName; | ||
| 128 | + | ||
| 129 | + /** 发车顺序号 */ | ||
| 130 | + private Integer fcno; | ||
| 131 | + /** 是否分班(表示这个班次是否是晚班班次,就是换另外一个驾驶员开)*/ | ||
| 132 | + private Boolean isFB; | ||
| 133 | + /** 是否停驶(表示此班次执行完成,停在终点站,不进场) */ | ||
| 134 | + private Boolean isTS; | ||
| 135 | + | ||
| 136 | + /** 线路方向(TODO:上下行,上行,下行,这个以后用枚举还是字典再议,现在先用文字) */ | ||
| 137 | + private String xlDir; | ||
| 138 | + /** 班次类型 字典type=ScheduleType */ | ||
| 139 | + private String bcType; | ||
| 140 | + | ||
| 141 | + /** 线路版本(bsth_c_line_versions表对应字段) */ | ||
| 142 | + private int lineVersion; | ||
| 143 | + /** 发车时间(格式 HH:mm) */ | ||
| 144 | + private String fcsj; | ||
| 145 | + /** 对应班次数 */ | ||
| 146 | + private Integer bcs; | ||
| 147 | + /** 计划里程 */ | ||
| 148 | + private Double jhlc; | ||
| 149 | + /** 班次历时 */ | ||
| 150 | + private Integer bcsj; | ||
| 151 | + | ||
| 152 | + /** 备注 */ | ||
| 153 | + private String remark; | ||
| 154 | + } | ||
| 155 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/PlanProcessGenerateCalcuTimeTableServiceDroolsImpl.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable; | ||
| 2 | + | ||
| 3 | +import com.bsth.control_v2.plan_module.common.exception.PlanModuleException; | ||
| 4 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.*; | ||
| 5 | +import org.joda.time.DateTime; | ||
| 6 | +import org.kie.api.KieBase; | ||
| 7 | +import org.kie.api.runtime.KieSession; | ||
| 8 | +import org.slf4j.Logger; | ||
| 9 | +import org.slf4j.LoggerFactory; | ||
| 10 | +import org.springframework.jdbc.core.JdbcTemplate; | ||
| 11 | +import org.springframework.jdbc.core.RowMapper; | ||
| 12 | +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; | ||
| 13 | +import org.springframework.util.CollectionUtils; | ||
| 14 | + | ||
| 15 | +import java.sql.ResultSet; | ||
| 16 | +import java.sql.SQLException; | ||
| 17 | +import java.util.*; | ||
| 18 | + | ||
| 19 | +/** | ||
| 20 | + * 计算时刻表信息服务drools实现。 | ||
| 21 | + */ | ||
| 22 | +public class PlanProcessGenerateCalcuTimeTableServiceDroolsImpl implements PlanProcessGenerateCalcuTimeTableService { | ||
| 23 | + /** 日志记录器 */ | ||
| 24 | + private static final Logger LOGGER = LoggerFactory.getLogger(PlanProcessGenerateCalcuTimeTableServiceDroolsImpl.class); | ||
| 25 | + | ||
| 26 | + /** 计算时刻表信息drools kbase */ | ||
| 27 | + private KieBase kBaseGenerateCalcuTimeTable; | ||
| 28 | + | ||
| 29 | + /** 使用的jdbc服务 */ | ||
| 30 | + private JdbcTemplate jdbcTemplate; | ||
| 31 | + | ||
| 32 | + /** 线路查询SQL */ | ||
| 33 | + private static final String LINE_QUERY_SQL = | ||
| 34 | + "select id, name " + | ||
| 35 | + "from bsth_c_line line " + | ||
| 36 | + "where line.id = ? and destroy = 0"; | ||
| 37 | + /** 时刻表查询SQL */ | ||
| 38 | + private static final String TTINFO_QUERY_SQL = | ||
| 39 | + "select id, name, rule_days, special_days, xl " + | ||
| 40 | + "from bsth_c_s_ttinfo ttinfo " + | ||
| 41 | + "where ttinfo.is_cancel = 0 and ttinfo.is_enable_dis_template = 1 and ttinfo.xl = ?"; | ||
| 42 | + /** 时刻表明细查询SQL(使用 NamedParameterJdbcTemplate) */ | ||
| 43 | + private static final String TTINFO_DETAIL_QUERY_SQL = | ||
| 44 | + "select id, qdz_code, qdz_name, zdz_code, zdz_name, " + | ||
| 45 | + "ttinfo, line_version, lp, fcno, isfb, " + | ||
| 46 | + "xl, xl_dir, bc_type, ists, " + | ||
| 47 | + "fcsj, bcs, jhlc, bcsj, remark " + | ||
| 48 | + "from bsth_c_s_ttinfo_detail td " + | ||
| 49 | + "where td.ttinfo in (:ttInfoIds)"; | ||
| 50 | + /** 路牌配置信息查询SQL */ | ||
| 51 | + private static final String LP_QUERY_SQL = | ||
| 52 | + "select id, lp_name, xl " + | ||
| 53 | + "from bsth_c_s_gbi " + | ||
| 54 | + "where is_cancel = 0 and xl = ? "; | ||
| 55 | + | ||
| 56 | + /** 规则信息查询SQL */ | ||
| 57 | + private static final String FLAT_RULE_QUERY_SQL = | ||
| 58 | + "select rule.id, cc.xl, rule.qyrq, car_config_info, " + | ||
| 59 | + "lp_ids, lp_names, lp_start, " + | ||
| 60 | + "ry_config_ids, ry_dbbms, ry_start, " + | ||
| 61 | + "car.inside_code " + | ||
| 62 | + "from bsth_c_s_sr1_flat rule left join bsth_c_s_ccinfo cc on rule.car_config_info = cc.id " + | ||
| 63 | + "left join bsth_c_cars car on cc.cl = car.id " + | ||
| 64 | + "where cc.xl = ? "; | ||
| 65 | + | ||
| 66 | + @Override | ||
| 67 | + public List<TTinfoDetailByLpResult> generateCalcuTTInfos(Integer xlid, Date from, Date to) { | ||
| 68 | + LOGGER.info("KieBase[{}],线路id={},开始日期={},结束日期={} 开始", | ||
| 69 | + "排班生成 - 1、计算时刻表相关信息", xlid, from, to); | ||
| 70 | + | ||
| 71 | + // 构造drools session->载入数据->启动规则->计算->销毁session | ||
| 72 | + // 创建session,内部配置的是stateful | ||
| 73 | + KieSession session = kBaseGenerateCalcuTimeTable.newKieSession(); | ||
| 74 | + // 设置gloable对象,在drl中通过别名使用 | ||
| 75 | + session.setGlobal("LOGGER", LOGGER); | ||
| 76 | + | ||
| 77 | + // 输出gloable对象 | ||
| 78 | + List<TTinfoDetailByLpResult> rs = new ArrayList<>(); | ||
| 79 | + session.setGlobal("rs", rs); | ||
| 80 | + | ||
| 81 | + // 载入数据,参数数据,线路数据,时刻表数据,时刻表明细数据 | ||
| 82 | + // 载入线路fact | ||
| 83 | + List<KBaseGenerateCalcuTimeTable_Fact_Line> fact_lines = this.jdbcTemplate.query( | ||
| 84 | + LINE_QUERY_SQL, | ||
| 85 | + new Object[]{xlid}, | ||
| 86 | + new RowMapper<KBaseGenerateCalcuTimeTable_Fact_Line>() { | ||
| 87 | + @Override | ||
| 88 | + public KBaseGenerateCalcuTimeTable_Fact_Line mapRow(ResultSet rs, int rowNum) throws SQLException { | ||
| 89 | + return KBaseGenerateCalcuTimeTable_Fact_Line.builder() | ||
| 90 | + .id(rs.getInt("id")) | ||
| 91 | + .name(rs.getString("name")) | ||
| 92 | + .build(); | ||
| 93 | + } | ||
| 94 | + } | ||
| 95 | + ); | ||
| 96 | + if (CollectionUtils.isEmpty(fact_lines)) { | ||
| 97 | + throw new PlanModuleException("线路不存在,id=" + xlid); | ||
| 98 | + } else { | ||
| 99 | + session.insert(fact_lines.get(0)); | ||
| 100 | + } | ||
| 101 | + | ||
| 102 | + // 载入参数fact | ||
| 103 | + KBaseGenerateCalcuTimeTable_Fact_CalcuParam calcuParam = new KBaseGenerateCalcuTimeTable_Fact_CalcuParam( | ||
| 104 | + fact_lines.get(0), new DateTime(from), new DateTime(to)); | ||
| 105 | + session.insert(calcuParam); | ||
| 106 | + | ||
| 107 | + // 载入规则fact | ||
| 108 | + List<KBaseGenerateCalcuTimeTable_Fact_Rule> fact_rules = this.jdbcTemplate.query( | ||
| 109 | + FLAT_RULE_QUERY_SQL, | ||
| 110 | + new Object[] {xlid}, | ||
| 111 | + new RowMapper<KBaseGenerateCalcuTimeTable_Fact_Rule>() { | ||
| 112 | + @Override | ||
| 113 | + public KBaseGenerateCalcuTimeTable_Fact_Rule mapRow(ResultSet rs, int rowNum) throws SQLException { | ||
| 114 | + return KBaseGenerateCalcuTimeTable_Fact_Rule.builder() | ||
| 115 | + .id(rs.getLong("id")) | ||
| 116 | + .qyrq(rs.getDate("qyrq")) | ||
| 117 | + .lpIds(rs.getString("lp_ids")) | ||
| 118 | + .lpNames(rs.getString("lp_names")) | ||
| 119 | + .lpStart(rs.getInt("lp_start")) | ||
| 120 | + .ryConfigIds(rs.getString("ry_config_ids")) | ||
| 121 | + .ryDbbms(rs.getString("ry_dbbms")) | ||
| 122 | + .ryStart(rs.getInt("ry_start")) | ||
| 123 | + .carConfigInfo(KBaseGenerateCalcuTimeTable_Fact_VehicleConfig.builder() | ||
| 124 | + .id(rs.getLong("car_config_info")) | ||
| 125 | + .cl(KBaseGenerateCalcuTimeTable_Fact_Vehicle.builder() | ||
| 126 | + .insideCode(rs.getString("inside_code")) | ||
| 127 | + .build()) | ||
| 128 | + .build()) | ||
| 129 | + .xl(KBaseGenerateCalcuTimeTable_Fact_Line.builder() | ||
| 130 | + .id(rs.getInt("xl")) | ||
| 131 | + .build()) | ||
| 132 | + .build(); | ||
| 133 | + } | ||
| 134 | + }); | ||
| 135 | + for (KBaseGenerateCalcuTimeTable_Fact_Rule fact_rule : fact_rules) { | ||
| 136 | + session.insert(fact_rule); | ||
| 137 | + } | ||
| 138 | + | ||
| 139 | + // 载入时刻表fact | ||
| 140 | + List<KBaseGenerateCalcuTimeTable_Fact_TTinfo> fact_tTinfos = this.jdbcTemplate.query( | ||
| 141 | + TTINFO_QUERY_SQL, | ||
| 142 | + new Object[]{xlid}, | ||
| 143 | + new RowMapper<KBaseGenerateCalcuTimeTable_Fact_TTinfo>() { | ||
| 144 | + @Override | ||
| 145 | + public KBaseGenerateCalcuTimeTable_Fact_TTinfo mapRow(ResultSet rs, int rowNum) throws SQLException { | ||
| 146 | + return KBaseGenerateCalcuTimeTable_Fact_TTinfo.getBuilder() | ||
| 147 | + .setXl(KBaseGenerateCalcuTimeTable_Fact_Line.builder() | ||
| 148 | + .id(rs.getInt("xl")) | ||
| 149 | + .build()) | ||
| 150 | + .setId(rs.getLong("id")) | ||
| 151 | + .setName(rs.getString("name")) | ||
| 152 | + .setSpecial_days(rs.getString("special_days")) | ||
| 153 | + .setSpecialDayList(rs.getString("special_days")) | ||
| 154 | + .setRule_days(rs.getString("rule_days")) | ||
| 155 | + .setWeekdayList(rs.getString("rule_days")) | ||
| 156 | + .build(); | ||
| 157 | + } | ||
| 158 | + } | ||
| 159 | + ); | ||
| 160 | + for (KBaseGenerateCalcuTimeTable_Fact_TTinfo fact_tTinfo : fact_tTinfos) { | ||
| 161 | + session.insert(fact_tTinfo); | ||
| 162 | + } | ||
| 163 | + | ||
| 164 | + // 载入时刻表明细fact | ||
| 165 | + Map<String, Object> param = new HashMap<>(); | ||
| 166 | + List<Long> ttInfoIds = new ArrayList<>(); | ||
| 167 | + param.put("ttInfoIds", ttInfoIds); | ||
| 168 | + for (KBaseGenerateCalcuTimeTable_Fact_TTinfo fact_tTinfo : fact_tTinfos) { | ||
| 169 | + ttInfoIds.add(fact_tTinfo.getId()); | ||
| 170 | + } | ||
| 171 | + if (!CollectionUtils.isEmpty(ttInfoIds)) { | ||
| 172 | + NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate); | ||
| 173 | + List<KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail> fact_ttInfoDetails = namedParameterJdbcTemplate.query( | ||
| 174 | + TTINFO_DETAIL_QUERY_SQL, | ||
| 175 | + param, | ||
| 176 | + new RowMapper<KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail>() { | ||
| 177 | + @Override | ||
| 178 | + public KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail mapRow(ResultSet rs, int rowNum) throws SQLException { | ||
| 179 | + return KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail.builder() | ||
| 180 | + .xl(KBaseGenerateCalcuTimeTable_Fact_Line.builder() | ||
| 181 | + .id(rs.getInt("xl")) | ||
| 182 | + .build() | ||
| 183 | + ) | ||
| 184 | + .ttInfo(KBaseGenerateCalcuTimeTable_Fact_TTinfo.getBuilder() | ||
| 185 | + .setXl(KBaseGenerateCalcuTimeTable_Fact_Line.builder() | ||
| 186 | + .id(rs.getInt("xl")) | ||
| 187 | + .build()) | ||
| 188 | + .setId(rs.getLong("ttinfo")) | ||
| 189 | + .build() | ||
| 190 | + ) | ||
| 191 | + .lp(KBaseGenerateCalcuTimeTable_Fact_LpInfo.builder() | ||
| 192 | + .id(rs.getLong("lp")) | ||
| 193 | + .build() | ||
| 194 | + ) | ||
| 195 | + .id(rs.getLong("id")) | ||
| 196 | + .qdzCode(rs.getString("qdz_code")) | ||
| 197 | + .qdzName(rs.getString("qdz_name")) | ||
| 198 | + .zdzCode(rs.getString("zdz_code")) | ||
| 199 | + .zdzName(rs.getString("zdz_name")) | ||
| 200 | + .fcno(rs.getInt("fcno")) | ||
| 201 | + .isFB(rs.getBoolean("isfb")) | ||
| 202 | + .isTS(rs.getBoolean("ists")) | ||
| 203 | + .xlDir(rs.getString("xl_dir")) | ||
| 204 | + .bcType(rs.getString("bc_type")) | ||
| 205 | + .lineVersion(rs.getInt("line_version")) | ||
| 206 | + .fcsj(rs.getString("fcsj")) | ||
| 207 | + .bcs(rs.getInt("bcs")) | ||
| 208 | + .jhlc(rs.getDouble("jhlc")) | ||
| 209 | + .bcsj(rs.getInt("bcsj")) | ||
| 210 | + .remark(rs.getString("remark")) | ||
| 211 | + .build(); | ||
| 212 | + | ||
| 213 | + } | ||
| 214 | + } | ||
| 215 | + ); | ||
| 216 | + for (KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail fact_ttInfoDetail : fact_ttInfoDetails) { | ||
| 217 | + session.insert(fact_ttInfoDetail); | ||
| 218 | + } | ||
| 219 | + } | ||
| 220 | + | ||
| 221 | + // 载入路牌fact | ||
| 222 | + List<KBaseGenerateCalcuTimeTable_Fact_LpInfo> fact_lpInfos = this.jdbcTemplate.query( | ||
| 223 | + LP_QUERY_SQL, | ||
| 224 | + new Object[]{xlid}, | ||
| 225 | + new RowMapper<KBaseGenerateCalcuTimeTable_Fact_LpInfo>() { | ||
| 226 | + @Override | ||
| 227 | + public KBaseGenerateCalcuTimeTable_Fact_LpInfo mapRow(ResultSet rs, int rowNum) throws SQLException { | ||
| 228 | + return KBaseGenerateCalcuTimeTable_Fact_LpInfo.builder() | ||
| 229 | + .xl(KBaseGenerateCalcuTimeTable_Fact_Line.builder().id(rs.getInt("xl")).build()) | ||
| 230 | + .id(rs.getLong("id")) | ||
| 231 | + .name(rs.getString("lp_name")) | ||
| 232 | + .build(); | ||
| 233 | + } | ||
| 234 | + } | ||
| 235 | + ); | ||
| 236 | + for (KBaseGenerateCalcuTimeTable_Fact_LpInfo fact_lpInfo : fact_lpInfos) { | ||
| 237 | + session.insert(fact_lpInfo); | ||
| 238 | + } | ||
| 239 | + | ||
| 240 | + // 执行rule | ||
| 241 | + session.fireAllRules(); | ||
| 242 | + | ||
| 243 | + // 执行完毕销毁,有日志的也要关闭 | ||
| 244 | + session.dispose(); | ||
| 245 | + | ||
| 246 | + LOGGER.info("KieBase[{}],线路id={},开始日期={},结束日期={} 完成", | ||
| 247 | + "排班生成 - 1、计算时刻表相关信息", | ||
| 248 | + calcuParam.getXl().getId(), | ||
| 249 | + calcuParam.getFromDate(), | ||
| 250 | + calcuParam.getToDate()); | ||
| 251 | + | ||
| 252 | + return rs; | ||
| 253 | + } | ||
| 254 | + | ||
| 255 | + private PlanProcessGenerateCalcuTimeTableServiceDroolsImpl() {} | ||
| 256 | + private PlanProcessGenerateCalcuTimeTableServiceDroolsImpl(Builder builder) { | ||
| 257 | + this.kBaseGenerateCalcuTimeTable = builder.kBaseGenerateCalcuTimeTable; | ||
| 258 | + this.jdbcTemplate = builder.jdbcTemplate; | ||
| 259 | + | ||
| 260 | + } | ||
| 261 | + | ||
| 262 | + public static Builder getBuilder() { | ||
| 263 | + return new Builder(); | ||
| 264 | + } | ||
| 265 | + | ||
| 266 | + public static class Builder { | ||
| 267 | + /** 计算时刻表drools kbase */ | ||
| 268 | + private KieBase kBaseGenerateCalcuTimeTable; | ||
| 269 | + | ||
| 270 | + /** 使用的jdbc服务 */ | ||
| 271 | + private JdbcTemplate jdbcTemplate; | ||
| 272 | + | ||
| 273 | + public Builder setkBaseGenerateCalcuTimeTable(KieBase kBaseGenerateCalcuTimeTable) { | ||
| 274 | + this.kBaseGenerateCalcuTimeTable = kBaseGenerateCalcuTimeTable; | ||
| 275 | + return this; | ||
| 276 | + } | ||
| 277 | + | ||
| 278 | + public Builder setJdbcTemplate(JdbcTemplate jdbcTemplate) { | ||
| 279 | + this.jdbcTemplate = jdbcTemplate; | ||
| 280 | + return this; | ||
| 281 | + } | ||
| 282 | + | ||
| 283 | + public PlanProcessGenerateCalcuTimeTableServiceDroolsImpl build() { | ||
| 284 | + return new PlanProcessGenerateCalcuTimeTableServiceDroolsImpl(this); | ||
| 285 | + } | ||
| 286 | + } | ||
| 287 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_CalcuParam.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | +import org.joda.time.DateTime; | ||
| 7 | + | ||
| 8 | +/** | ||
| 9 | + * drools规则计算时刻表信息使用的参数fact对象。 | ||
| 10 | + */ | ||
| 11 | +@Data | ||
| 12 | +@Builder | ||
| 13 | +@AllArgsConstructor | ||
| 14 | +public class KBaseGenerateCalcuTimeTable_Fact_CalcuParam { | ||
| 15 | + /** 线路信息 */ | ||
| 16 | + private KBaseGenerateCalcuTimeTable_Fact_Line xl; | ||
| 17 | + /** 开始计算时间 */ | ||
| 18 | + private DateTime fromDate; | ||
| 19 | + /** 结束计算时间 */ | ||
| 20 | + private DateTime toDate; | ||
| 21 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_Line.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * drools规则计算时刻表信息使用的线路fact对象。 | ||
| 9 | + */ | ||
| 10 | +@Data | ||
| 11 | +@Builder | ||
| 12 | +@AllArgsConstructor | ||
| 13 | +public class KBaseGenerateCalcuTimeTable_Fact_Line { | ||
| 14 | + /** 主键id */ | ||
| 15 | + private Integer id; | ||
| 16 | + /** 线路名称 */ | ||
| 17 | + private String name; | ||
| 18 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_LpInfo.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * drools规则计算时刻表信息使用的路牌fact对象。 | ||
| 9 | + */ | ||
| 10 | +@Data | ||
| 11 | +@Builder | ||
| 12 | +@AllArgsConstructor | ||
| 13 | +public class KBaseGenerateCalcuTimeTable_Fact_LpInfo { | ||
| 14 | + /** 线路信息 */ | ||
| 15 | + private KBaseGenerateCalcuTimeTable_Fact_Line xl; | ||
| 16 | + /** 路牌Id */ | ||
| 17 | + private Long id; | ||
| 18 | + /** 路牌名字 */ | ||
| 19 | + private String name; | ||
| 20 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_Rule.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +import java.util.Date; | ||
| 8 | + | ||
| 9 | +/** | ||
| 10 | + * drools规则计算时刻表信息使用的规则fact对象 | ||
| 11 | + */ | ||
| 12 | +@Data | ||
| 13 | +@Builder | ||
| 14 | +@AllArgsConstructor | ||
| 15 | +public class KBaseGenerateCalcuTimeTable_Fact_Rule { | ||
| 16 | + /** 主键Id */ | ||
| 17 | + private Long id; | ||
| 18 | + /** 启用日期 */ | ||
| 19 | + private Date qyrq; | ||
| 20 | + /** 对应的路牌ids(用逗号隔开) */ | ||
| 21 | + private String lpIds; | ||
| 22 | + /** 路牌名称s(用逗号隔开) */ | ||
| 23 | + private String lpNames; | ||
| 24 | + /** 起始路牌(从0开始) */ | ||
| 25 | + private Integer lpStart; | ||
| 26 | + /** 对应的人员配置ids(用逗号隔开,如果分班,就先-隔开再逗号隔开) */ | ||
| 27 | + private String ryConfigIds; | ||
| 28 | + /** 人员搭班编码s(用逗号隔开,如果分班,就先-隔开再逗号隔开) */ | ||
| 29 | + private String ryDbbms; | ||
| 30 | + /** 起始人员(从0开始) */ | ||
| 31 | + private Integer ryStart; | ||
| 32 | + | ||
| 33 | + /** 关联车辆配置 */ | ||
| 34 | + private KBaseGenerateCalcuTimeTable_Fact_VehicleConfig carConfigInfo; | ||
| 35 | + /** 关联线路 */ | ||
| 36 | + private KBaseGenerateCalcuTimeTable_Fact_Line xl; | ||
| 37 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * drools规则计算时刻表信息使用的时刻表明细fact对象。 | ||
| 9 | + */ | ||
| 10 | +@Data | ||
| 11 | +@Builder | ||
| 12 | +@AllArgsConstructor | ||
| 13 | +public class KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail { | ||
| 14 | + /** 线路 */ | ||
| 15 | + private KBaseGenerateCalcuTimeTable_Fact_Line xl; | ||
| 16 | + /** 时刻表 */ | ||
| 17 | + private KBaseGenerateCalcuTimeTable_Fact_TTinfo ttInfo; | ||
| 18 | + /** 路牌 */ | ||
| 19 | + private KBaseGenerateCalcuTimeTable_Fact_LpInfo lp; | ||
| 20 | + | ||
| 21 | + /** 主健Id */ | ||
| 22 | + private Long id; | ||
| 23 | + | ||
| 24 | + // 站点包括普通站点和停车场(站点编码不同,使用站点编码区分) | ||
| 25 | + // 以后不需要再区分是站点还是停车场了 | ||
| 26 | + /** 起站点代码(bsth_c_station,bsth_c_car_park 里的编码) */ | ||
| 27 | + private String qdzCode; | ||
| 28 | + /** 起站点名字(bsth_c_stationroute,bsth_c_car_park里的名字) */ | ||
| 29 | + private String qdzName; | ||
| 30 | + /** 终点站代码(bsth_c_station,bsth_c_car_park 里的编码) */ | ||
| 31 | + private String zdzCode; | ||
| 32 | + /** 终点站名字(bsth_c_stationroute,bsth_c_car_park里的名字) */ | ||
| 33 | + private String zdzName; | ||
| 34 | + | ||
| 35 | + /** 发车顺序号 */ | ||
| 36 | + private Integer fcno; | ||
| 37 | + /** 是否分班(表示这个班次是否是晚班班次,就是换另外一个驾驶员开)*/ | ||
| 38 | + private Boolean isFB; | ||
| 39 | + /** 是否停驶(表示此班次执行完成,停在终点站,不进场) */ | ||
| 40 | + private Boolean isTS; | ||
| 41 | + | ||
| 42 | + /** 线路方向(TODO:上下行,上行,下行,这个以后用枚举还是字典再议,现在先用文字) */ | ||
| 43 | + private String xlDir; | ||
| 44 | + /** 班次类型 字典type=ScheduleType */ | ||
| 45 | + private String bcType; | ||
| 46 | + | ||
| 47 | + /** 线路版本(bsth_c_line_versions表对应字段) */ | ||
| 48 | + private int lineVersion; | ||
| 49 | + /** 发车时间(格式 HH:mm) */ | ||
| 50 | + private String fcsj; | ||
| 51 | + /** 对应班次数 */ | ||
| 52 | + private Integer bcs; | ||
| 53 | + /** 计划里程 */ | ||
| 54 | + private Double jhlc; | ||
| 55 | + /** 班次历时 */ | ||
| 56 | + private Integer bcsj; | ||
| 57 | + | ||
| 58 | + /** 备注 */ | ||
| 59 | + private String remark; | ||
| 60 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_TTinfo.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import org.apache.commons.lang3.StringUtils; | ||
| 4 | +import org.apache.commons.lang3.time.DateFormatUtils; | ||
| 5 | +import org.joda.time.DateTime; | ||
| 6 | + | ||
| 7 | +import java.text.ParseException; | ||
| 8 | +import java.util.ArrayList; | ||
| 9 | +import java.util.List; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * drools规则计算时刻表信息使用的时刻表fact对象。 | ||
| 13 | + */ | ||
| 14 | +public class KBaseGenerateCalcuTimeTable_Fact_TTinfo { | ||
| 15 | + /** 主键Id */ | ||
| 16 | + private Long id; | ||
| 17 | + | ||
| 18 | + /** 线路关联 */ | ||
| 19 | + private KBaseGenerateCalcuTimeTable_Fact_Line xl; | ||
| 20 | + | ||
| 21 | + /** 时刻表名称 */ | ||
| 22 | + private String name; | ||
| 23 | + | ||
| 24 | + // TODO:原系统里的分别在,圈后圈进场,意思不知道,再议 | ||
| 25 | + | ||
| 26 | + /** 常规有效日(1-7表示星期一到星期日,多个用逗号隔开) */ | ||
| 27 | + private String rule_days; | ||
| 28 | + /** 特殊有效日期(格式:2001-01-01,多个用逗号隔开) */ | ||
| 29 | + private String special_days; | ||
| 30 | + | ||
| 31 | + /** 常规有效日(参照rule_days,1=true表示启用,0=false表示未启用,一个星期7天,保存7个元素) */ | ||
| 32 | + private List<Boolean> weekdayList = new ArrayList<>(); | ||
| 33 | + /** 特殊有效日期(参照special_days,1个日期保存1个元素) */ | ||
| 34 | + private List<DateTime> specialDayList = new ArrayList<>(); | ||
| 35 | + | ||
| 36 | + /** 线路版本(bsth_c_line_versions表对应字段) */ | ||
| 37 | + private int lineVersion; | ||
| 38 | + | ||
| 39 | + public Long getId() { | ||
| 40 | + return id; | ||
| 41 | + } | ||
| 42 | + | ||
| 43 | + public void setId(Long id) { | ||
| 44 | + this.id = id; | ||
| 45 | + } | ||
| 46 | + | ||
| 47 | + public KBaseGenerateCalcuTimeTable_Fact_Line getXl() { | ||
| 48 | + return xl; | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | + public void setXl(KBaseGenerateCalcuTimeTable_Fact_Line xl) { | ||
| 52 | + this.xl = xl; | ||
| 53 | + } | ||
| 54 | + | ||
| 55 | + public String getName() { | ||
| 56 | + return name; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + public void setName(String name) { | ||
| 60 | + this.name = name; | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + public String getRule_days() { | ||
| 64 | + return rule_days; | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + public void setRule_days(String rule_days) { | ||
| 68 | + this.rule_days = rule_days; | ||
| 69 | + } | ||
| 70 | + | ||
| 71 | + public String getSpecial_days() { | ||
| 72 | + return special_days; | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + public void setSpecial_days(String special_days) { | ||
| 76 | + this.special_days = special_days; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + public List<Boolean> getWeekdayList() { | ||
| 80 | + return weekdayList; | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + public void setWeekdayList(List<Boolean> weekdayList) { | ||
| 84 | + this.weekdayList = weekdayList; | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + public List<DateTime> getSpecialDayList() { | ||
| 88 | + return specialDayList; | ||
| 89 | + } | ||
| 90 | + | ||
| 91 | + public void setSpecialDayList(List<DateTime> specialDayList) { | ||
| 92 | + this.specialDayList = specialDayList; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + public int getLineVersion() { | ||
| 96 | + return lineVersion; | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + public void setLineVersion(int lineVersion) { | ||
| 100 | + this.lineVersion = lineVersion; | ||
| 101 | + } | ||
| 102 | + | ||
| 103 | + public KBaseGenerateCalcuTimeTable_Fact_TTinfo(Builder builder) { | ||
| 104 | + this.id = builder.id; | ||
| 105 | + | ||
| 106 | + this.xl = builder.xl; | ||
| 107 | + | ||
| 108 | + this.name = builder.name; | ||
| 109 | + | ||
| 110 | + this.rule_days = builder.rule_days; | ||
| 111 | + this.special_days = builder.special_days; | ||
| 112 | + this.weekdayList = builder.weekdayList; | ||
| 113 | + this.specialDayList = builder.specialDayList; | ||
| 114 | + | ||
| 115 | + this.lineVersion = builder.lineVersion; | ||
| 116 | + | ||
| 117 | + } | ||
| 118 | + | ||
| 119 | + //------------------- builder模式 -----------------// | ||
| 120 | + public static Builder getBuilder() { | ||
| 121 | + return new Builder(); | ||
| 122 | + } | ||
| 123 | + public static class Builder { | ||
| 124 | + /** 主键Id */ | ||
| 125 | + private Long id; | ||
| 126 | + | ||
| 127 | + /** 线路关联 */ | ||
| 128 | + private KBaseGenerateCalcuTimeTable_Fact_Line xl; | ||
| 129 | + | ||
| 130 | + /** 时刻表名称 */ | ||
| 131 | + private String name; | ||
| 132 | + | ||
| 133 | + // TODO:原系统里的分别在,圈后圈进场,意思不知道,再议 | ||
| 134 | + | ||
| 135 | + /** 常规有效日(1-7表示星期一到星期日,多个用逗号隔开) */ | ||
| 136 | + private String rule_days; | ||
| 137 | + /** 特殊有效日期(格式:2001-01-01,多个用逗号隔开) */ | ||
| 138 | + private String special_days; | ||
| 139 | + | ||
| 140 | + /** 常规有效日(参照rule_days,1=true表示启用,0=false表示未启用,一个星期7天,保存7个元素) */ | ||
| 141 | + private List<Boolean> weekdayList = new ArrayList<>(); | ||
| 142 | + /** 特殊有效日期(参照special_days,1个日期保存1个元素) */ | ||
| 143 | + private List<DateTime> specialDayList = new ArrayList<>(); | ||
| 144 | + | ||
| 145 | + /** 线路版本(bsth_c_line_versions表对应字段) */ | ||
| 146 | + private int lineVersion; | ||
| 147 | + | ||
| 148 | + public Builder() { | ||
| 149 | + // 初始化 weekdayList,7个元素为FALSE | ||
| 150 | + for (int i = 0; i < 7; i++) { | ||
| 151 | + this.weekdayList.add(Boolean.FALSE); | ||
| 152 | + } | ||
| 153 | + } | ||
| 154 | + | ||
| 155 | + public Builder setId(Long id) { | ||
| 156 | + this.id = id; | ||
| 157 | + return this; | ||
| 158 | + } | ||
| 159 | + | ||
| 160 | + public Builder setXl(KBaseGenerateCalcuTimeTable_Fact_Line xl) { | ||
| 161 | + this.xl = xl; | ||
| 162 | + return this; | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + public Builder setName(String name) { | ||
| 166 | + this.name = name; | ||
| 167 | + return this; | ||
| 168 | + } | ||
| 169 | + | ||
| 170 | + public Builder setRule_days(String rule_days) { | ||
| 171 | + this.rule_days = rule_days; | ||
| 172 | + return this; | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + public Builder setSpecial_days(String special_days) { | ||
| 176 | + this.special_days = special_days; | ||
| 177 | + return this; | ||
| 178 | + } | ||
| 179 | + | ||
| 180 | + public Builder setWeekdayList(String rule_days) { | ||
| 181 | + // 初始化weekday,全false | ||
| 182 | + this.weekdayList = new ArrayList<>(7); | ||
| 183 | + for (int i = 0; i < 7; i++) { | ||
| 184 | + this.weekdayList.add(Boolean.FALSE); | ||
| 185 | + } | ||
| 186 | + // 1表示工作,其他表示不工作 | ||
| 187 | + if (StringUtils.isNotEmpty(rule_days)) { | ||
| 188 | + String[] days = rule_days.split(","); | ||
| 189 | + for (int i = 0; i < 7 && i < days.length; i++) { | ||
| 190 | + if ("1".equals(days[i])) { | ||
| 191 | + this.weekdayList.set(i, Boolean.TRUE); | ||
| 192 | + } else { | ||
| 193 | + this.weekdayList.set(i, Boolean.FALSE); | ||
| 194 | + } | ||
| 195 | + } | ||
| 196 | + } | ||
| 197 | + return this; | ||
| 198 | + } | ||
| 199 | + | ||
| 200 | + public Builder setSpecialDayList(String special_days) { | ||
| 201 | + this.specialDayList = new ArrayList<>(); | ||
| 202 | + if (StringUtils.isNotEmpty(special_days)) { | ||
| 203 | + String[] days = special_days.split(","); | ||
| 204 | + for (String day : days) { | ||
| 205 | + try { | ||
| 206 | + this.specialDayList.add(new DateTime(DateFormatUtils.ISO_DATE_FORMAT.parse(day))); | ||
| 207 | + } catch (ParseException exp) { | ||
| 208 | + throw new RuntimeException(exp); | ||
| 209 | + } | ||
| 210 | + } | ||
| 211 | + } | ||
| 212 | + return this; | ||
| 213 | + } | ||
| 214 | + | ||
| 215 | + public Builder setLineVersion(int lineVersion) { | ||
| 216 | + this.lineVersion = lineVersion; | ||
| 217 | + return this; | ||
| 218 | + } | ||
| 219 | + | ||
| 220 | + public KBaseGenerateCalcuTimeTable_Fact_TTinfo build() { | ||
| 221 | + return new KBaseGenerateCalcuTimeTable_Fact_TTinfo(this); | ||
| 222 | + } | ||
| 223 | + } | ||
| 224 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_Vehicle.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * drools规则计算时刻表信息使用的车辆fact对象。 | ||
| 9 | + */ | ||
| 10 | +@Data | ||
| 11 | +@Builder | ||
| 12 | +@AllArgsConstructor | ||
| 13 | +public class KBaseGenerateCalcuTimeTable_Fact_Vehicle { | ||
| 14 | + /** 主键Id */ | ||
| 15 | + private Integer id; | ||
| 16 | + /** 自编号/内部编号 */ | ||
| 17 | + private String insideCode; | ||
| 18 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Fact_VehicleConfig.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import lombok.AllArgsConstructor; | ||
| 4 | +import lombok.Builder; | ||
| 5 | +import lombok.Data; | ||
| 6 | + | ||
| 7 | +/** | ||
| 8 | + * drools规则计算时刻表信息使用的车辆配置fact对象。 | ||
| 9 | + */ | ||
| 10 | +@Data | ||
| 11 | +@Builder | ||
| 12 | +@AllArgsConstructor | ||
| 13 | +public class KBaseGenerateCalcuTimeTable_Fact_VehicleConfig { | ||
| 14 | + /** 主健Id */ | ||
| 15 | + private Long id; | ||
| 16 | + /** 线路 */ | ||
| 17 | + private KBaseGenerateCalcuTimeTable_Fact_Line xl; | ||
| 18 | + /** 车辆 */ | ||
| 19 | + private KBaseGenerateCalcuTimeTable_Fact_Vehicle cl; | ||
| 20 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Function_MinRuleQyrq.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import org.joda.time.DateTime; | ||
| 4 | +import org.kie.api.runtime.rule.AccumulateFunction; | ||
| 5 | + | ||
| 6 | +import java.io.*; | ||
| 7 | + | ||
| 8 | +/** | ||
| 9 | + * drools规则计算时刻表信息用的函数(计算规则中最早的启用日期)。 | ||
| 10 | + * | ||
| 11 | + */ | ||
| 12 | +public class KBaseGenerateCalcuTimeTable_Function_MinRuleQyrq implements AccumulateFunction { | ||
| 13 | + @Override | ||
| 14 | + public void writeExternal(ObjectOutput out) throws IOException { | ||
| 15 | + } | ||
| 16 | + | ||
| 17 | + @Override | ||
| 18 | + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { | ||
| 19 | + | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + protected static class MinRuleQyrqData implements Externalizable { | ||
| 23 | + public DateTime min; | ||
| 24 | + // 最大的最小值,比它小的不计算 | ||
| 25 | + public DateTime maxMin = new DateTime(2014,1,1,0,0); | ||
| 26 | + | ||
| 27 | + public MinRuleQyrqData() {} | ||
| 28 | + | ||
| 29 | + @Override | ||
| 30 | + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { | ||
| 31 | + min = (DateTime) in.readObject(); | ||
| 32 | + } | ||
| 33 | + | ||
| 34 | + @Override | ||
| 35 | + public void writeExternal(ObjectOutput out) throws IOException { | ||
| 36 | + out.writeObject(min); | ||
| 37 | + } | ||
| 38 | + } | ||
| 39 | + | ||
| 40 | + @Override | ||
| 41 | + public Serializable createContext() { | ||
| 42 | + return new MinRuleQyrqData(); | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + @Override | ||
| 46 | + public void init(Serializable context) throws Exception { } | ||
| 47 | + | ||
| 48 | + @Override | ||
| 49 | + public void accumulate(Serializable context, Object value) { | ||
| 50 | + MinRuleQyrqData minRuleQyrqData = (MinRuleQyrqData) context; | ||
| 51 | + KBaseGenerateCalcuTimeTable_Fact_Rule fact_rule = (KBaseGenerateCalcuTimeTable_Fact_Rule) value; | ||
| 52 | + | ||
| 53 | + DateTime qyrq = new DateTime(fact_rule.getQyrq()); | ||
| 54 | + if (qyrq.isAfter(minRuleQyrqData.maxMin)) { | ||
| 55 | + if (minRuleQyrqData.min == null) { | ||
| 56 | + minRuleQyrqData.min = qyrq; | ||
| 57 | + } else if (qyrq.isBefore(minRuleQyrqData.min)) { | ||
| 58 | + minRuleQyrqData.min = qyrq; | ||
| 59 | + } | ||
| 60 | + } | ||
| 61 | + | ||
| 62 | + } | ||
| 63 | + | ||
| 64 | + @Override | ||
| 65 | + public boolean supportsReverse() { | ||
| 66 | + return false; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + @Override | ||
| 70 | + public void reverse(Serializable serializable, Object o) throws Exception { | ||
| 71 | + | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + @Override | ||
| 75 | + public Class<?> getResultType() { | ||
| 76 | + return DateTime.class; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + @Override | ||
| 80 | + public Object getResult(Serializable context) throws Exception { | ||
| 81 | + MinRuleQyrqData minRuleQyrqData = (MinRuleQyrqData) context; | ||
| 82 | + return minRuleQyrqData.min; | ||
| 83 | + } | ||
| 84 | +} |
src/main/java/com/bsth/service/schedule/plan/process/_2_generate/_1_calcu/_2_timetable/drools/KBaseGenerateCalcuTimeTable_Function_Result.java
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.PlanProcessGenerateCalcuTimeTableService.*; | ||
| 4 | +import org.kie.api.runtime.rule.AccumulateFunction; | ||
| 5 | +import org.springframework.util.CollectionUtils; | ||
| 6 | + | ||
| 7 | +import java.io.IOException; | ||
| 8 | +import java.io.ObjectInput; | ||
| 9 | +import java.io.ObjectOutput; | ||
| 10 | +import java.io.Serializable; | ||
| 11 | +import java.util.ArrayList; | ||
| 12 | +import java.util.HashMap; | ||
| 13 | +import java.util.List; | ||
| 14 | +import java.util.Map; | ||
| 15 | + | ||
| 16 | +/** | ||
| 17 | + * drools规则计算时刻表信息用的函数(计算Result 当前线路,指定排班日期,使用的时刻表,对应的路牌,以及对应路牌的时刻表班次列表) | ||
| 18 | + */ | ||
| 19 | +public class KBaseGenerateCalcuTimeTable_Function_Result implements AccumulateFunction { | ||
| 20 | + @Override | ||
| 21 | + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { | ||
| 22 | + | ||
| 23 | + } | ||
| 24 | + | ||
| 25 | + @Override | ||
| 26 | + public void writeExternal(ObjectOutput out) throws IOException { | ||
| 27 | + | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + protected static class ResultContext implements Serializable { | ||
| 31 | + private Map<Long, KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail> fact_ttInfoDetailMap; | ||
| 32 | + | ||
| 33 | + public ResultContext() { | ||
| 34 | + this.fact_ttInfoDetailMap = new HashMap<>(); | ||
| 35 | + } | ||
| 36 | + | ||
| 37 | + public void add(KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail fact_ttInfoDetail) { | ||
| 38 | + fact_ttInfoDetailMap.put(fact_ttInfoDetail.getId(), fact_ttInfoDetail); | ||
| 39 | + } | ||
| 40 | + | ||
| 41 | + public void remove(KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail fact_ttInfoDetail) { | ||
| 42 | + fact_ttInfoDetailMap.remove(fact_ttInfoDetail.getId()); | ||
| 43 | + } | ||
| 44 | + | ||
| 45 | + public TTinfoDetailByLpResult result() { | ||
| 46 | + List<KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail> fact_ttInfoDetails = new ArrayList<>(); | ||
| 47 | + fact_ttInfoDetails.addAll(fact_ttInfoDetailMap.values()); | ||
| 48 | + | ||
| 49 | + // 输出结果 | ||
| 50 | + TTinfoDetailByLpResult result = TTinfoDetailByLpResult.builder() | ||
| 51 | + .tTinfoDetailResultList(new ArrayList<TTinfoDetailResult>()) | ||
| 52 | + .build(); | ||
| 53 | + | ||
| 54 | + // 注意:drl匹配的时候可能没有班次,直接返回result,drl获取result后需要过滤班次列表为空的result | ||
| 55 | + if (CollectionUtils.isEmpty(fact_ttInfoDetails)) { | ||
| 56 | + return result; | ||
| 57 | + } | ||
| 58 | + | ||
| 59 | + // 1、线路(相关drl负责添加) | ||
| 60 | + // 2、路牌(相关drl负责添加) | ||
| 61 | + // 3、排班日期(相关drl负责添加) | ||
| 62 | + // 4、对应的时刻表 | ||
| 63 | + KBaseGenerateCalcuTimeTable_Fact_TTinfo fact_tTinfo = fact_ttInfoDetails.get(0).getTtInfo(); | ||
| 64 | + result.setTTinfoResult(TTinfoResult.builder() | ||
| 65 | + .id(fact_tTinfo.getId()) | ||
| 66 | + .xl(LineResult.builder() | ||
| 67 | + .id(fact_tTinfo.getXl().getId()) | ||
| 68 | + .build()) | ||
| 69 | + .name(fact_tTinfo.getName()) | ||
| 70 | + .rule_days(fact_tTinfo.getRule_days()) | ||
| 71 | + .special_days(fact_tTinfo.getSpecial_days()) | ||
| 72 | + .weekdayList(fact_tTinfo.getWeekdayList()) | ||
| 73 | + .special_days(fact_tTinfo.getSpecial_days()) | ||
| 74 | + .lineVersion(fact_tTinfo.getLineVersion()) | ||
| 75 | + .build()); | ||
| 76 | + // 5、路牌对应的时刻表时刻表明细列表 | ||
| 77 | + for (KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail fact_ttInfoDetail : fact_ttInfoDetails) { | ||
| 78 | + TTinfoDetailResult tTinfoDetailResult = TTinfoDetailResult.builder() | ||
| 79 | + .xl(LineResult.builder() | ||
| 80 | + .id(fact_ttInfoDetail.getXl().getId()) | ||
| 81 | + .build()) | ||
| 82 | + .ttInfo(TTinfoResult.builder() | ||
| 83 | + .id(fact_ttInfoDetail.getTtInfo().getId()) | ||
| 84 | + .build()) | ||
| 85 | + .lp(LpInfoResult.builder() | ||
| 86 | + .id(fact_ttInfoDetail.getLp().getId()) | ||
| 87 | + .build()) | ||
| 88 | + .id(fact_ttInfoDetail.getId()) | ||
| 89 | + .qdzCode(fact_ttInfoDetail.getQdzCode()) | ||
| 90 | + .qdzName(fact_ttInfoDetail.getQdzName()) | ||
| 91 | + .zdzCode(fact_ttInfoDetail.getZdzCode()) | ||
| 92 | + .zdzName(fact_ttInfoDetail.getZdzName()) | ||
| 93 | + .fcno(fact_ttInfoDetail.getFcno()) | ||
| 94 | + .isFB(fact_ttInfoDetail.getIsFB()) | ||
| 95 | + .isTS(fact_ttInfoDetail.getIsTS()) | ||
| 96 | + .xlDir(fact_ttInfoDetail.getXlDir()) | ||
| 97 | + .bcType(fact_ttInfoDetail.getBcType()) | ||
| 98 | + .lineVersion(fact_ttInfoDetail.getLineVersion()) | ||
| 99 | + .fcsj(fact_ttInfoDetail.getFcsj()) | ||
| 100 | + .bcs(fact_ttInfoDetail.getBcs()) | ||
| 101 | + .jhlc(fact_ttInfoDetail.getJhlc()) | ||
| 102 | + .bcsj(fact_ttInfoDetail.getBcsj()) | ||
| 103 | + .remark(fact_ttInfoDetail.getRemark()) | ||
| 104 | + .build(); | ||
| 105 | + result.getTTinfoDetailResultList().add(tTinfoDetailResult); | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + // 6、计算最小,最大,分班发车顺序号 | ||
| 109 | + Integer minFcno = null; | ||
| 110 | + Integer maxFcno = null; | ||
| 111 | + Integer fbFcno = null; | ||
| 112 | + for (KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail fact_ttInfoDetail : fact_ttInfoDetails) { | ||
| 113 | + Integer fcno = fact_ttInfoDetail.getFcno(); | ||
| 114 | + if (minFcno == null) { // 最小发车顺序号 | ||
| 115 | + minFcno = fcno; | ||
| 116 | + } else if (fcno < minFcno) { | ||
| 117 | + minFcno = fcno; | ||
| 118 | + } | ||
| 119 | + | ||
| 120 | + if (maxFcno == null) { // 最大发车顺序号 | ||
| 121 | + maxFcno = fcno; | ||
| 122 | + } else if (fcno > maxFcno) { | ||
| 123 | + maxFcno = fcno; | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + if (fact_ttInfoDetail.getIsFB() == true) { // 记录分班发车顺序号(注意多个分班可能会乱) | ||
| 127 | + fbFcno = fcno; | ||
| 128 | + } | ||
| 129 | + } | ||
| 130 | + | ||
| 131 | + result.setMinFcno(minFcno); | ||
| 132 | + result.setMaxFcno(maxFcno); | ||
| 133 | + result.setStartFbFcno(fbFcno); | ||
| 134 | + | ||
| 135 | + return result; | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + } | ||
| 139 | + | ||
| 140 | + @Override | ||
| 141 | + public Serializable createContext() { | ||
| 142 | + return new ResultContext(); | ||
| 143 | + } | ||
| 144 | + | ||
| 145 | + @Override | ||
| 146 | + public void init(Serializable context) throws Exception { | ||
| 147 | + | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + @Override | ||
| 151 | + public void accumulate(Serializable context, Object value) { | ||
| 152 | + ResultContext resultContext = (ResultContext) context; | ||
| 153 | + KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail fact_ttInfoDetail = | ||
| 154 | + (KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail) value; | ||
| 155 | + resultContext.add(fact_ttInfoDetail); | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + @Override | ||
| 159 | + public void reverse(Serializable context, Object value) throws Exception { | ||
| 160 | + ResultContext resultContext = (ResultContext) context; | ||
| 161 | + KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail fact_ttInfoDetail = | ||
| 162 | + (KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail) value; | ||
| 163 | + resultContext.remove(fact_ttInfoDetail); | ||
| 164 | + } | ||
| 165 | + | ||
| 166 | + @Override | ||
| 167 | + public Object getResult(Serializable context) throws Exception { | ||
| 168 | + ResultContext resultContext = (ResultContext) context; | ||
| 169 | + return resultContext.result(); | ||
| 170 | + } | ||
| 171 | + | ||
| 172 | + @Override | ||
| 173 | + public boolean supportsReverse() { | ||
| 174 | + return true; | ||
| 175 | + } | ||
| 176 | + | ||
| 177 | + @Override | ||
| 178 | + public Class<?> getResultType() { | ||
| 179 | + return TTinfoDetailByLpResult.class; | ||
| 180 | + } | ||
| 181 | +} |
src/main/resources/META-INF/drools.packagebuilder.conf
| @@ -18,3 +18,6 @@ drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_valida | @@ -18,3 +18,6 @@ drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_valida | ||
| 18 | drools.accumulate.function.ae = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateEmpty | 18 | drools.accumulate.function.ae = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateEmpty |
| 19 | # kBase_validate_rule.drl使用 | 19 | # kBase_validate_rule.drl使用 |
| 20 | drools.accumulate.function.srif2 = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo | 20 | drools.accumulate.function.srif2 = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo |
| 21 | +# KBase_generate_calcu_timetable使用 | ||
| 22 | +drools.accumulate.function.minruleqyrq2 = com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Function_MinRuleQyrq | ||
| 23 | +drools.accumulate.function.tresult = com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Function_Result |
src/main/resources/drools/KBase/generate/calcu/timetable/KBase_generate_calcu_timetable.drl
0 → 100644
| 1 | +package com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools; | ||
| 2 | + | ||
| 3 | +import org.joda.time.*; | ||
| 4 | +import java.util.*; | ||
| 5 | + | ||
| 6 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Fact_CalcuParam; | ||
| 7 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Fact_Rule; | ||
| 8 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Fact_TTinfo; | ||
| 9 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail; | ||
| 10 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Fact_Line; | ||
| 11 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Fact_LpInfo; | ||
| 12 | + | ||
| 13 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.PlanProcessGenerateCalcuTimeTableService.*; | ||
| 14 | + | ||
| 15 | +import org.slf4j.Logger; | ||
| 16 | + | ||
| 17 | +// 全局日志类 | ||
| 18 | +global Logger LOGGER; | ||
| 19 | + | ||
| 20 | +// 输出 | ||
| 21 | +global List rs; | ||
| 22 | + | ||
| 23 | +/* | ||
| 24 | + 规则说明: | ||
| 25 | + 1、找出指定线路,指定时间范围的时刻表 | ||
| 26 | + 2、如果一天有多个时刻表全部都要输出(注意:一天多时刻表的情况由前置验证规则处理) | ||
| 27 | +*/ | ||
| 28 | + | ||
| 29 | +//----------------- pre 预处理 param对象 -----------------------// | ||
| 30 | +// 将开始排班时间设定为最小的规则启用日期(因为在时刻表模式下的排班,时刻表和排班规则关联) | ||
| 31 | +rule "pre_CalcuParam" | ||
| 32 | + no-loop | ||
| 33 | + salience 1000 | ||
| 34 | + when | ||
| 35 | + $cp: KBaseGenerateCalcuTimeTable_Fact_CalcuParam($xlId : xl.id) | ||
| 36 | + $minqyrq: DateTime() from accumulate ($rule: KBaseGenerateCalcuTimeTable_Fact_Rule(xl.id == $xlId), minruleqyrq2($rule)) | ||
| 37 | + then | ||
| 38 | + LOGGER.info("修正日期={}", $minqyrq); | ||
| 39 | + $cp.setFromDate($minqyrq); | ||
| 40 | + update($cp); | ||
| 41 | +end | ||
| 42 | + | ||
| 43 | +//-------------- 第一阶段、计算规则迭代数据(天数) ------------// | ||
| 44 | +declare Calcu_iter_days_result | ||
| 45 | + xlId: Integer // 线路Id | ||
| 46 | + xlName: String // 线路名字 | ||
| 47 | + | ||
| 48 | + // 迭代数据 | ||
| 49 | + calcu_day: Integer // 准备计算第几天 | ||
| 50 | + calcu_weekday: Integer // 准备计算星期几(1到7) | ||
| 51 | + calcu_date: DateTime // 准备计算的具体日期 | ||
| 52 | + | ||
| 53 | + // 范围数据 | ||
| 54 | + calcu_days: Integer // 总共需要计算的天数 | ||
| 55 | + calcu_start_date: DateTime // 开始计算日期 | ||
| 56 | + calcu_end_date: DateTime // 结束计算日期 | ||
| 57 | + | ||
| 58 | +end | ||
| 59 | + | ||
| 60 | +rule "calcu_iter_days" | ||
| 61 | + salience 900 | ||
| 62 | + when | ||
| 63 | + KBaseGenerateCalcuTimeTable_Fact_CalcuParam( | ||
| 64 | + $xlId: xl.id, | ||
| 65 | + $fromDate: fromDate, | ||
| 66 | + $toDate: toDate, | ||
| 67 | + $fromDate.isBefore($toDate) || $fromDate.isEqual($toDate) | ||
| 68 | + ) | ||
| 69 | + $line: KBaseGenerateCalcuTimeTable_Fact_Line(id == $xlId) | ||
| 70 | + then | ||
| 71 | + // 构造Calcu_iter_days_result对象,进行下一步计算 | ||
| 72 | + Calcu_iter_days_result cidr = new Calcu_iter_days_result(); | ||
| 73 | + Period p = new Period($fromDate, $toDate, PeriodType.days()); | ||
| 74 | + | ||
| 75 | + cidr.setXlId($xlId); | ||
| 76 | + cidr.setXlName($line.getName()); | ||
| 77 | + | ||
| 78 | + cidr.setCalcu_day(new Integer(1)); | ||
| 79 | + cidr.setCalcu_weekday(Integer.valueOf($fromDate.getDayOfWeek())); | ||
| 80 | + cidr.setCalcu_date($fromDate); | ||
| 81 | + | ||
| 82 | + cidr.setCalcu_days(Integer.valueOf(p.getDays() + 1)); | ||
| 83 | + cidr.setCalcu_start_date($fromDate); | ||
| 84 | + cidr.setCalcu_end_date($toDate); | ||
| 85 | + | ||
| 86 | + LOGGER.info( | ||
| 87 | + "线路={}-id={},开始时间={},结束时间={},总共计算的天数={},将从开始时间迭代", | ||
| 88 | + cidr.getXlName(), | ||
| 89 | + cidr.getXlId(), | ||
| 90 | + cidr.getCalcu_start_date(), | ||
| 91 | + cidr.getCalcu_end_date(), | ||
| 92 | + cidr.getCalcu_days() | ||
| 93 | + ); | ||
| 94 | + | ||
| 95 | + insert(cidr); | ||
| 96 | +end | ||
| 97 | + | ||
| 98 | +//-------------- 第二阶段、时刻表的日期匹配 ------------// | ||
| 99 | +// 时刻表内部封装 | ||
| 100 | +declare Internal_WrapTTInfo | ||
| 101 | + calcuDate: DateTime // 具体的日期 | ||
| 102 | + ttInfoSpecialList: List // 时刻表(可能多张) | ||
| 103 | + ttInfoNormalList: List // 时刻表明细 | ||
| 104 | +end | ||
| 105 | + | ||
| 106 | + | ||
| 107 | +rule "Calcu_iter_days_special_normal_day" // 日期匹配 | ||
| 108 | + salience 800 | ||
| 109 | + when | ||
| 110 | + $cid : Calcu_iter_days_result( | ||
| 111 | + $calcu_date: calcu_date, | ||
| 112 | + $calcu_weekday: calcu_weekday, | ||
| 113 | + $calcu_day: calcu_day, | ||
| 114 | + calcu_day <= calcu_days | ||
| 115 | + ) | ||
| 116 | + | ||
| 117 | + $ttInfoSpecialList : ArrayList($ss: size) from collect ( | ||
| 118 | + KBaseGenerateCalcuTimeTable_Fact_TTinfo( | ||
| 119 | + specialDayList contains $calcu_date | ||
| 120 | + ) | ||
| 121 | + ) | ||
| 122 | + | ||
| 123 | + $ttInfoNormalList : ArrayList($sn: size) from collect ( | ||
| 124 | + KBaseGenerateCalcuTimeTable_Fact_TTinfo( | ||
| 125 | + $ss == 0, // 注意:条件=没有特殊日期被匹配到 | ||
| 126 | + specialDayList not contains $calcu_date, | ||
| 127 | + weekdayList[$calcu_weekday - 1] == Boolean.TRUE | ||
| 128 | + ) | ||
| 129 | + ) | ||
| 130 | + | ||
| 131 | + then | ||
| 132 | + LOGGER.info("日期={},特殊时刻表个数={},一般时刻表个数={}", | ||
| 133 | + $calcu_date, $ss, $sn); | ||
| 134 | + Internal_WrapTTInfo internal_WrapTTInfo = new Internal_WrapTTInfo(); | ||
| 135 | + List ttInfoNormalList = new ArrayList(); | ||
| 136 | + List ttInfoSpecialList = new ArrayList(); | ||
| 137 | + ttInfoNormalList.addAll($ttInfoNormalList); | ||
| 138 | + ttInfoSpecialList.addAll($ttInfoSpecialList); | ||
| 139 | + internal_WrapTTInfo.setCalcuDate($calcu_date); | ||
| 140 | + internal_WrapTTInfo.setTtInfoNormalList(ttInfoNormalList); | ||
| 141 | + internal_WrapTTInfo.setTtInfoSpecialList(ttInfoSpecialList); | ||
| 142 | + insert(internal_WrapTTInfo); | ||
| 143 | + | ||
| 144 | + // 更新迭代对象 | ||
| 145 | + Integer new_calcu_day = Integer.valueOf($calcu_day + 1); | ||
| 146 | + $cid.setCalcu_day(new_calcu_day); | ||
| 147 | + DateTime new_calcu_date = $calcu_date.plusDays(1); | ||
| 148 | + $cid.setCalcu_date(new_calcu_date); | ||
| 149 | + $cid.setCalcu_weekday(Integer.valueOf(new_calcu_date.getDayOfWeek())); | ||
| 150 | + | ||
| 151 | + update($cid); | ||
| 152 | + | ||
| 153 | +end | ||
| 154 | + | ||
| 155 | +// 整合时刻表封装类 | ||
| 156 | +declare Internal_WrapTTInfo_merge | ||
| 157 | + calcuDate: DateTime // 具体的日期 | ||
| 158 | + ttInfo: KBaseGenerateCalcuTimeTable_Fact_TTinfo // 对应的时刻表 | ||
| 159 | + ttInfoDetailList: List // 对应的时刻表列表对应的明细列表 | ||
| 160 | +end | ||
| 161 | + | ||
| 162 | +rule "Calcu_Internal_WrapTTInfo_merge_has_special_ttInfo" // 整合时刻表(特殊日期匹配) | ||
| 163 | + salience 700 | ||
| 164 | + when | ||
| 165 | + Internal_WrapTTInfo( | ||
| 166 | + ttInfoSpecialList.size() > 0, | ||
| 167 | + $calcuDate: calcuDate, | ||
| 168 | + $ttInfoSpecialList: ttInfoSpecialList | ||
| 169 | + ) | ||
| 170 | + $ttInfo: KBaseGenerateCalcuTimeTable_Fact_TTinfo($ttInfoId: id) from $ttInfoSpecialList | ||
| 171 | + $ttInfoDetailList: ArrayList(size > 0) from collect ( | ||
| 172 | + KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail( | ||
| 173 | + ttInfo.id == $ttInfoId | ||
| 174 | + ) | ||
| 175 | + ) | ||
| 176 | + then | ||
| 177 | + LOGGER.info("日期={},时刻表id={}", $calcuDate, $ttInfoId); | ||
| 178 | + | ||
| 179 | + // 整合时刻表信息 | ||
| 180 | + Internal_WrapTTInfo_merge internal_WrapTTInfo_merge = new Internal_WrapTTInfo_merge(); | ||
| 181 | + internal_WrapTTInfo_merge.setCalcuDate($calcuDate); | ||
| 182 | + internal_WrapTTInfo_merge.setTtInfo($ttInfo); | ||
| 183 | + List ttInfoDetailList = new ArrayList(); | ||
| 184 | + ttInfoDetailList.addAll($ttInfoDetailList); | ||
| 185 | + internal_WrapTTInfo_merge.setTtInfoDetailList(ttInfoDetailList); | ||
| 186 | + insert(internal_WrapTTInfo_merge); | ||
| 187 | + | ||
| 188 | +end | ||
| 189 | + | ||
| 190 | +rule "Calcu_Internal_WrapTTInfo_merge_has_normal_ttInfo" // 整合时刻表(一般日期匹配) | ||
| 191 | + salience 700 | ||
| 192 | + when | ||
| 193 | + Internal_WrapTTInfo( | ||
| 194 | + ttInfoNormalList.size() > 0, | ||
| 195 | + $calcuDate: calcuDate, | ||
| 196 | + $ttInfoNormalList: ttInfoNormalList | ||
| 197 | + ) | ||
| 198 | + $ttInfo: KBaseGenerateCalcuTimeTable_Fact_TTinfo($ttInfoId: id) from $ttInfoNormalList | ||
| 199 | + $ttInfoDetailList: ArrayList(size > 0) from collect ( | ||
| 200 | + KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail( | ||
| 201 | + ttInfo.id == $ttInfoId | ||
| 202 | + ) | ||
| 203 | + ) | ||
| 204 | + then | ||
| 205 | + LOGGER.info("日期={},时刻表id={}", $calcuDate, $ttInfoId); | ||
| 206 | + | ||
| 207 | + // 整合时刻表信息 | ||
| 208 | + Internal_WrapTTInfo_merge internal_WrapTTInfo_merge = new Internal_WrapTTInfo_merge(); | ||
| 209 | + internal_WrapTTInfo_merge.setCalcuDate($calcuDate); | ||
| 210 | + internal_WrapTTInfo_merge.setTtInfo($ttInfo); | ||
| 211 | + List ttInfoDetailList = new ArrayList(); | ||
| 212 | + ttInfoDetailList.addAll($ttInfoDetailList); | ||
| 213 | + internal_WrapTTInfo_merge.setTtInfoDetailList(ttInfoDetailList); | ||
| 214 | + insert(internal_WrapTTInfo_merge); | ||
| 215 | + | ||
| 216 | +end | ||
| 217 | + | ||
| 218 | +//-------------- 第三阶段、聚合计算输出结果 ------------// | ||
| 219 | +rule "output_result" | ||
| 220 | + salience 600 | ||
| 221 | + when | ||
| 222 | + $line: KBaseGenerateCalcuTimeTable_Fact_Line($xlId: id, $xlName: name) | ||
| 223 | + Internal_WrapTTInfo_merge( | ||
| 224 | + ttInfo.xl.id == $xlId, | ||
| 225 | + $calcuDate: calcuDate, | ||
| 226 | + $ttInfo: ttInfo, | ||
| 227 | + $ttInfoDetailList: ttInfoDetailList | ||
| 228 | + ) | ||
| 229 | + $lp: KBaseGenerateCalcuTimeTable_Fact_LpInfo( | ||
| 230 | + $ttInfo.xl.id == xl.id, | ||
| 231 | + $lpId: id, | ||
| 232 | + $lpName: name | ||
| 233 | + ) | ||
| 234 | + $result: TTinfoDetailByLpResult(tTinfoDetailResultList.size > 0) from accumulate ( | ||
| 235 | + $ttInfoDetail: KBaseGenerateCalcuTimeTable_Fact_TTInfoDetail( | ||
| 236 | + ttInfo.id == $ttInfo.id, | ||
| 237 | + lp.id == $lpId | ||
| 238 | + ), | ||
| 239 | + tresult($ttInfoDetail) | ||
| 240 | + ) | ||
| 241 | + then | ||
| 242 | + // 1、线路 | ||
| 243 | + $result.setLineResult(LineResult.builder() | ||
| 244 | + .id($xlId) | ||
| 245 | + .name($xlName) | ||
| 246 | + .build()); | ||
| 247 | + | ||
| 248 | + // 2、路牌 | ||
| 249 | + $result.setLpInfoResult(LpInfoResult.builder() | ||
| 250 | + .xl($result.getLineResult()) | ||
| 251 | + .id($lpId) | ||
| 252 | + .name($lpName) | ||
| 253 | + .build()); | ||
| 254 | + | ||
| 255 | + // 3、排班日期(相关drl负责添加) | ||
| 256 | + $result.setScheduleDate($calcuDate); | ||
| 257 | + | ||
| 258 | + LOGGER.debug("数据整合时刻表路牌班次输出:日期={} 时刻表id={} 路牌id={} 班次数={} 最小发车顺序号={} 最大发车顺序号={} 开始分班发车顺序号={} ", | ||
| 259 | + $calcuDate, $ttInfo.getId(), $lpId, $result.getTTinfoDetailResultList().size(), | ||
| 260 | + $result.getMinFcno(), $result.getMaxFcno(), $result.getStartFbFcno()); | ||
| 261 | + | ||
| 262 | + rs.add($result); | ||
| 263 | + | ||
| 264 | +end | ||
| 265 | + |
src/main/resources/drools/config.properties
| @@ -23,4 +23,5 @@ drools.KBase.validate_timetable=drools/KBase/validate/timetable/KBase_validate_t | @@ -23,4 +23,5 @@ drools.KBase.validate_timetable=drools/KBase/validate/timetable/KBase_validate_t | ||
| 23 | # 规则验证 | 23 | # 规则验证 |
| 24 | drools.KBase.validate_rule=drools/KBase/validate/rule/KBase_validate_rule.drl | 24 | drools.KBase.validate_rule=drools/KBase/validate/rule/KBase_validate_rule.drl |
| 25 | 25 | ||
| 26 | - | 26 | +# 排班生成 - 1、计算时刻表相关信息 |
| 27 | +drools.KBase.generate_calcu_timetable=drools/KBase/generate/calcu/timetable/KBase_generate_calcu_timetable.drl |
src/test/java/com/bsth/service/schedule/PlanGenerateTest.java
0 → 100644
| 1 | +package com.bsth.service.schedule; | ||
| 2 | + | ||
| 3 | +import com.bsth.BaseTest_junit4; | ||
| 4 | +import com.bsth.TestApplication; | ||
| 5 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.PlanProcessGenerateCalcuTimeTableService; | ||
| 6 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.PlanProcessGenerateCalcuTimeTableService.*; | ||
| 7 | +import com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.PlanProcessGenerateCalcuTimeTableServiceDroolsImpl; | ||
| 8 | +import org.joda.time.format.DateTimeFormat; | ||
| 9 | +import org.junit.Assert; | ||
| 10 | +import org.junit.Test; | ||
| 11 | +import org.junit.runner.RunWith; | ||
| 12 | +import org.kie.api.KieBase; | ||
| 13 | +import org.springframework.beans.factory.annotation.Autowired; | ||
| 14 | +import org.springframework.beans.factory.annotation.Qualifier; | ||
| 15 | +import org.springframework.boot.test.SpringApplicationConfiguration; | ||
| 16 | +import org.springframework.jdbc.core.JdbcTemplate; | ||
| 17 | +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; | ||
| 18 | + | ||
| 19 | +import java.util.*; | ||
| 20 | + | ||
| 21 | +/** | ||
| 22 | + * 排班计划生成测试。 | ||
| 23 | + */ | ||
| 24 | +@RunWith(SpringJUnit4ClassRunner.class) | ||
| 25 | +@SpringApplicationConfiguration(classes = {TestApplication.class}) | ||
| 26 | +public class PlanGenerateTest extends BaseTest_junit4 { | ||
| 27 | + @Override | ||
| 28 | + public Map<String, String> getDbunitTestDbFileClassPathMap() { | ||
| 29 | + Map<String, String> dbFileMap = new HashMap<>(); | ||
| 30 | + dbFileMap.put("_2_generate_calcu_timetable_test_case1", "testdata/_2_generate_calcu_timetable.xml"); | ||
| 31 | + dbFileMap.put("_2_generate_calcu_timetable_test_case2", "testdata/_2_generate_calcu_timetable.xml"); | ||
| 32 | + return dbFileMap; | ||
| 33 | + } | ||
| 34 | + | ||
| 35 | + @Autowired | ||
| 36 | + @Qualifier("kBaseGenerateCalcuTimeTable_plus") | ||
| 37 | + private KieBase kBaseGenerateCalcuTimeTable; | ||
| 38 | + | ||
| 39 | + @Autowired | ||
| 40 | + private JdbcTemplate jdbcTemplate; | ||
| 41 | + | ||
| 42 | + /** | ||
| 43 | + * 正常计算时刻表路牌启用,总班次数验证 | ||
| 44 | + * @throws Exception | ||
| 45 | + */ | ||
| 46 | + @Test | ||
| 47 | + public void _2_generate_calcu_timetable_test_case1() { | ||
| 48 | + LOG.info("--------------- 正常计算时刻表路牌启用,总班次数验证 ------------"); | ||
| 49 | + | ||
| 50 | + // 使用builder创建服务 | ||
| 51 | + PlanProcessGenerateCalcuTimeTableService planProcessGenerateCalcuTimeTableService = | ||
| 52 | + PlanProcessGenerateCalcuTimeTableServiceDroolsImpl.getBuilder() | ||
| 53 | + .setkBaseGenerateCalcuTimeTable(kBaseGenerateCalcuTimeTable) | ||
| 54 | + .setJdbcTemplate(jdbcTemplate) | ||
| 55 | + .build(); | ||
| 56 | + | ||
| 57 | + // 注意:数据有当日重复的时刻表匹配(包括特殊节假日重复和平日重复) | ||
| 58 | + // 1、当日重复时刻表在业务上一般是错误的(由前置验证规则过滤) | ||
| 59 | + // 2、到了排班的阶段,计算时刻表重复时是不会过滤的 | ||
| 60 | + List<TTinfoDetailByLpResult> tTinfoDetailByLpResultList = planProcessGenerateCalcuTimeTableService.generateCalcuTTInfos( | ||
| 61 | + 1, | ||
| 62 | + DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime("2019-01-05").toDate(), | ||
| 63 | + DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime("2019-01-14").toDate() | ||
| 64 | + ); | ||
| 65 | + Assert.assertArrayEquals( | ||
| 66 | + "时刻表路牌班次信息不匹配", | ||
| 67 | + new Object[] {33}, | ||
| 68 | + new Object[] {tTinfoDetailByLpResultList.size()} | ||
| 69 | + ); | ||
| 70 | + | ||
| 71 | + } | ||
| 72 | + | ||
| 73 | + /** | ||
| 74 | + * 单独测试某一天的时刻表路牌班次明细属性是否正常。 | ||
| 75 | + * @throws Exception | ||
| 76 | + */ | ||
| 77 | + @Test | ||
| 78 | + public void _2_generate_calcu_timetable_test_case2() { | ||
| 79 | + LOG.info("--------------- 单独测试某一天的时刻表路牌班次明细属性 ------------"); | ||
| 80 | + | ||
| 81 | + // 使用builder创建服务 | ||
| 82 | + PlanProcessGenerateCalcuTimeTableService planProcessGenerateCalcuTimeTableService = | ||
| 83 | + PlanProcessGenerateCalcuTimeTableServiceDroolsImpl.getBuilder() | ||
| 84 | + .setkBaseGenerateCalcuTimeTable(kBaseGenerateCalcuTimeTable) | ||
| 85 | + .setJdbcTemplate(jdbcTemplate) | ||
| 86 | + .build(); | ||
| 87 | + | ||
| 88 | + // 注意:数据有当日重复的时刻表匹配(包括特殊节假日重复和平日重复) | ||
| 89 | + // 1、当日重复时刻表在业务上一般是错误的(由前置验证规则过滤) | ||
| 90 | + // 2、到了排班的阶段,计算时刻表重复时是不会过滤的 | ||
| 91 | + List<TTinfoDetailByLpResult> tTinfoDetailByLpResultList = planProcessGenerateCalcuTimeTableService.generateCalcuTTInfos( | ||
| 92 | + 1, | ||
| 93 | + DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime("2019-01-01").toDate(), | ||
| 94 | + DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime("2019-01-01").toDate() | ||
| 95 | + ); | ||
| 96 | + Assert.assertArrayEquals( | ||
| 97 | + "时刻表路牌班次信息不匹配", | ||
| 98 | + new Object[] {5}, | ||
| 99 | + new Object[] {tTinfoDetailByLpResultList.size()} | ||
| 100 | + ); | ||
| 101 | + | ||
| 102 | + // 找出时刻表1路牌1数据,路牌2,路牌3的班次数据,时刻表2的路牌1数据,路牌2数据 | ||
| 103 | + TTinfoDetailByLpResult t1_lp1_info = null; | ||
| 104 | + TTinfoDetailByLpResult t1_lp2_info = null; | ||
| 105 | + TTinfoDetailByLpResult t1_lp3_info = null; | ||
| 106 | + TTinfoDetailByLpResult t2_lp1_info = null; | ||
| 107 | + TTinfoDetailByLpResult t2_lp2_info = null; | ||
| 108 | + for (TTinfoDetailByLpResult ttInfoLpInfoResult : tTinfoDetailByLpResultList) { | ||
| 109 | + if (ttInfoLpInfoResult.getTTinfoResult().getId() == 1) { | ||
| 110 | + if (ttInfoLpInfoResult.getLpInfoResult().getId() == 1L) { | ||
| 111 | + t1_lp1_info = ttInfoLpInfoResult; | ||
| 112 | + } else if (ttInfoLpInfoResult.getLpInfoResult().getId() == 2L) { | ||
| 113 | + t1_lp2_info = ttInfoLpInfoResult; | ||
| 114 | + } else if (ttInfoLpInfoResult.getLpInfoResult().getId() == 3L) { | ||
| 115 | + t1_lp3_info = ttInfoLpInfoResult; | ||
| 116 | + } | ||
| 117 | + } else if (ttInfoLpInfoResult.getTTinfoResult().getId() == 2) { | ||
| 118 | + if (ttInfoLpInfoResult.getLpInfoResult().getId() == 1L) { | ||
| 119 | + t2_lp1_info = ttInfoLpInfoResult; | ||
| 120 | + } else if (ttInfoLpInfoResult.getLpInfoResult().getId() == 2L) { | ||
| 121 | + t2_lp2_info = ttInfoLpInfoResult; | ||
| 122 | + } | ||
| 123 | + } | ||
| 124 | + } | ||
| 125 | + | ||
| 126 | + Assert.assertArrayEquals( | ||
| 127 | + "时刻表1 路牌1 最小发车顺序号 最大发车顺序号 开始分班顺序号 不一致", | ||
| 128 | + new Object[] {1L, 1L, 1, 6, 6}, | ||
| 129 | + new Object[] {t1_lp1_info.getTTinfoResult().getId(), t1_lp1_info.getLpInfoResult().getId(), | ||
| 130 | + t1_lp1_info.getMinFcno(), t1_lp1_info.getMaxFcno(), t1_lp1_info.getStartFbFcno()}); | ||
| 131 | + Assert.assertArrayEquals( | ||
| 132 | + "时刻表1 路牌2 最小发车顺序号 最大发车顺序号 开始分班顺序号 不一致", | ||
| 133 | + new Object[] {1L, 2L, 2, 5, null}, | ||
| 134 | + new Object[] {t1_lp2_info.getTTinfoResult().getId(), t1_lp2_info.getLpInfoResult().getId(), | ||
| 135 | + t1_lp2_info.getMinFcno(), t1_lp2_info.getMaxFcno(), t1_lp2_info.getStartFbFcno()}); | ||
| 136 | + Assert.assertArrayEquals( | ||
| 137 | + "时刻表1 路牌3 最小发车顺序号 最大发车顺序号 开始分班顺序号 不一致", | ||
| 138 | + new Object[] {1L, 3L, 3, 3, null}, | ||
| 139 | + new Object[] {t1_lp3_info.getTTinfoResult().getId(), t1_lp3_info.getLpInfoResult().getId(), | ||
| 140 | + t1_lp3_info.getMinFcno(), t1_lp3_info.getMaxFcno(), t1_lp3_info.getStartFbFcno()}); | ||
| 141 | + | ||
| 142 | + Assert.assertArrayEquals( | ||
| 143 | + "时刻表2 路牌1 最小发车顺序号 最大发车顺序号 开始分班顺序号 不一致", | ||
| 144 | + new Object[] {2L, 1L, 1, 1, null}, | ||
| 145 | + new Object[] {t2_lp1_info.getTTinfoResult().getId(), t2_lp1_info.getLpInfoResult().getId(), | ||
| 146 | + t2_lp1_info.getMinFcno(), t2_lp1_info.getMaxFcno(), t2_lp1_info.getStartFbFcno()}); | ||
| 147 | + Assert.assertArrayEquals( | ||
| 148 | + "时刻表2 路牌2 最小发车顺序号 最大发车顺序号 开始分班顺序号 不一致", | ||
| 149 | + new Object[] {2L, 2L, 2, 2, null}, | ||
| 150 | + new Object[] {t2_lp2_info.getTTinfoResult().getId(), t2_lp2_info.getLpInfoResult().getId(), | ||
| 151 | + t2_lp2_info.getMinFcno(), t2_lp2_info.getMaxFcno(), t2_lp2_info.getStartFbFcno()}); | ||
| 152 | + | ||
| 153 | + // 验证路牌1 ttinfo中的第一个班次的属性 | ||
| 154 | + Collections.sort(t1_lp1_info.getTTinfoDetailResultList(), new Comparator<TTinfoDetailResult>() { | ||
| 155 | + @Override | ||
| 156 | + public int compare(TTinfoDetailResult o1, TTinfoDetailResult o2) { | ||
| 157 | + return o1.getFcno() - o2.getFcno(); | ||
| 158 | + } | ||
| 159 | + }); | ||
| 160 | + Assert.assertArrayEquals( | ||
| 161 | + "路牌1的第一个班次 对象属性不能为空", | ||
| 162 | + new Object[] { | ||
| 163 | + true, | ||
| 164 | + true, | ||
| 165 | + true | ||
| 166 | + }, | ||
| 167 | + new Object[] { | ||
| 168 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getXl() != null, | ||
| 169 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getTtInfo() != null, | ||
| 170 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getLp() != null | ||
| 171 | + } | ||
| 172 | + ); | ||
| 173 | + Assert.assertArrayEquals( | ||
| 174 | + "路牌1的第一个班次 属性不一致", | ||
| 175 | + new Object[] { | ||
| 176 | + 1L, | ||
| 177 | + 1, | ||
| 178 | + 1L, | ||
| 179 | + 1L, | ||
| 180 | + 1, | ||
| 181 | + "0", | ||
| 182 | + "#1", | ||
| 183 | + "上行起点站", | ||
| 184 | + "#2", | ||
| 185 | + "上行终点站", | ||
| 186 | + "08:30", | ||
| 187 | + 1, | ||
| 188 | + 30D, | ||
| 189 | + 30, | ||
| 190 | + "normal", | ||
| 191 | + "mark一下", | ||
| 192 | + 1, | ||
| 193 | + false, | ||
| 194 | + false | ||
| 195 | + }, | ||
| 196 | + new Object[] { | ||
| 197 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getId(), | ||
| 198 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getXl().getId(), | ||
| 199 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getTtInfo().getId(), | ||
| 200 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getLp().getId(), | ||
| 201 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getFcno(), | ||
| 202 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getXlDir(), | ||
| 203 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getQdzCode(), | ||
| 204 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getQdzName(), | ||
| 205 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getZdzCode(), | ||
| 206 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getZdzName(), | ||
| 207 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getFcsj(), | ||
| 208 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getBcs(), | ||
| 209 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getJhlc(), | ||
| 210 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getBcsj(), | ||
| 211 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getBcType(), | ||
| 212 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getRemark(), | ||
| 213 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getLineVersion(), | ||
| 214 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getIsFB(), | ||
| 215 | + t1_lp1_info.getTTinfoDetailResultList().get(0).getIsTS() | ||
| 216 | + } | ||
| 217 | + ); | ||
| 218 | + } | ||
| 219 | +} |
src/test/resources/META-INF/drools.packagebuilder.conf
| @@ -7,3 +7,6 @@ drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_valida | @@ -7,3 +7,6 @@ drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_valida | ||
| 7 | drools.accumulate.function.ae = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateEmpty | 7 | drools.accumulate.function.ae = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateEmpty |
| 8 | # kBase_validate_rule.drl使用 | 8 | # kBase_validate_rule.drl使用 |
| 9 | drools.accumulate.function.srif2 = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo | 9 | drools.accumulate.function.srif2 = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo |
| 10 | +# KBase_generate_calcu_timetable使用 | ||
| 11 | +drools.accumulate.function.minruleqyrq2 = com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Function_MinRuleQyrq | ||
| 12 | +drools.accumulate.function.tresult = com.bsth.service.schedule.plan.process._2_generate._1_calcu._2_timetable.drools.KBaseGenerateCalcuTimeTable_Function_Result |
src/test/resources/testdata/_2_generate_calcu_timetable.xml
0 → 100644
| 1 | +<?xml version='1.0' encoding='UTF-8'?> | ||
| 2 | +<dataset> | ||
| 3 | + <!-- 用户信息 --> | ||
| 4 | + <bsth_c_sys_user id="1" user_name="管理员1" name="vip" password="vip" enabled="1" /> | ||
| 5 | + <!-- 角色信息 --> | ||
| 6 | + <bsth_c_sys_role id="1" role_name="管理员组" enable="1" is_super_admin="1" pic="0" /> | ||
| 7 | + <!-- 用户角色关联信息 --> | ||
| 8 | + <bsth_c_sys_user_roles users="1" roles="1" /> | ||
| 9 | + <!-- 公司信息(关联角色) --> | ||
| 10 | + <bsth_c_sys_company_auth id="1" company_code="22" company_name="金高公司" | ||
| 11 | + sub_company_code="01" sub_company_name="一分公司" /> | ||
| 12 | + | ||
| 13 | + <!-- 车辆基础信息 --> | ||
| 14 | + <bsth_c_cars id="1" inside_code="SSS-01" | ||
| 15 | + business_code="22" company="金高公司" branche_company_code="01" branche_company="一分公司" | ||
| 16 | + car_code="11111" car_plate="沪88881" supplier_name="bsth" equipment_code="123451" | ||
| 17 | + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" /> | ||
| 18 | + <bsth_c_cars id="2" inside_code="SSS-02" | ||
| 19 | + business_code="22" company="金高公司" branche_company_code="01" branche_company="一分公司" | ||
| 20 | + car_code="11112" car_plate="沪88882" supplier_name="bsth" equipment_code="123452" | ||
| 21 | + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" /> | ||
| 22 | + <bsth_c_cars id="3" inside_code="SSS-03" | ||
| 23 | + business_code="55" company="南汇公司" branche_company_code="01" branche_company="一分公司" | ||
| 24 | + car_code="11113" car_plate="沪88883" supplier_name="bsth" equipment_code="123453" | ||
| 25 | + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" /> | ||
| 26 | + <bsth_c_cars id="4" inside_code="SSS-04" | ||
| 27 | + business_code="22" company="金高公司" branche_company_code="02" branche_company="二分公司" | ||
| 28 | + car_code="11114" car_plate="沪88884" supplier_name="bsth" equipment_code="123454" | ||
| 29 | + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" /> | ||
| 30 | + <bsth_c_cars id="5" inside_code="SSS-05" | ||
| 31 | + business_code="22" company="金高公司" branche_company_code="01" branche_company="一分公司" | ||
| 32 | + car_code="11115" car_plate="沪88885" supplier_name="bsth" equipment_code="123455" | ||
| 33 | + hvac_car="1" ticket_type="1" led_screen="1" tv_video_type="1" scrap_state="0" /> | ||
| 34 | + | ||
| 35 | + <!-- 人员基础信息 --> | ||
| 36 | + <bsth_c_personnel id="1" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 37 | + branche_company_code="01" job_code="05-000001" personnel_name="员工1" job_codeori="000001" /> | ||
| 38 | + <bsth_c_personnel id="2" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 39 | + branche_company_code="01" job_code="05-000002" personnel_name="员工2" job_codeori="000002" /> | ||
| 40 | + <bsth_c_personnel id="3" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 41 | + branche_company_code="01" job_code="05-000003" personnel_name="员工3" job_codeori="000003" /> | ||
| 42 | + <bsth_c_personnel id="4" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 43 | + branche_company_code="01" job_code="05-000004" personnel_name="员工4" job_codeori="000004" /> | ||
| 44 | + <bsth_c_personnel id="5" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 45 | + branche_company_code="01" job_code="05-000005" personnel_name="员工5" job_codeori="000005" /> | ||
| 46 | + <bsth_c_personnel id="6" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 47 | + branche_company_code="01" job_code="05-000006" personnel_name="员工6" job_codeori="000006" /> | ||
| 48 | + <bsth_c_personnel id="7" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 49 | + branche_company_code="01" job_code="05-000007" personnel_name="员工7" job_codeori="000007" /> | ||
| 50 | + <bsth_c_personnel id="8" company="金高公司" company_code="22" branche_company="一分公司" | ||
| 51 | + branche_company_code="01" job_code="05-000008" personnel_name="员工8" job_codeori="000008" /> | ||
| 52 | + | ||
| 53 | + <!-- 线路基础信息 --> | ||
| 54 | + <bsth_c_line id="1" name="线路1" company="22" branche_company="01" length="20" destroy="0" /> | ||
| 55 | + | ||
| 56 | + <!-- 停车场基础信息 --> | ||
| 57 | + <bsth_c_car_park id="1" park_name="停车场1" company="05" branche_company="01" area="100" /> | ||
| 58 | + | ||
| 59 | + <!-- 车辆配置信息(线路1,金高公司,一分公司) --> | ||
| 60 | + <bsth_c_s_ccinfo id="1" xl="1" cl="1" qyrq="2019-01-01" tcd="停车场1" is_switch="0" is_cancel="0" /> | ||
| 61 | + <bsth_c_s_ccinfo id="2" xl="1" cl="2" qyrq="2019-01-01" tcd="停车场1" is_switch="0" is_cancel="0" /> | ||
| 62 | + <bsth_c_s_ccinfo id="3" xl="1" cl="5" qyrq="2019-01-01" tcd="停车场1" is_switch="0" is_cancel="0" /> | ||
| 63 | + | ||
| 64 | + <!-- 人员配置信息(线路1,金高公司) --> | ||
| 65 | + <bsth_c_s_ecinfo id="1" xl="1" jsy="1" dbbm="1" is_cancel="0" /> | ||
| 66 | + <bsth_c_s_ecinfo id="2" xl="1" jsy="2" dbbm="2" is_cancel="0" /> | ||
| 67 | + <bsth_c_s_ecinfo id="3" xl="1" jsy="3" dbbm="3" is_cancel="0" /> | ||
| 68 | + <bsth_c_s_ecinfo id="4" xl="1" jsy="4" dbbm="4" is_cancel="0" /> | ||
| 69 | + <bsth_c_s_ecinfo id="5" xl="1" jsy="5" dbbm="5" is_cancel="0" /> | ||
| 70 | + <bsth_c_s_ecinfo id="6" xl="1" jsy="6" dbbm="6" is_cancel="0" /> | ||
| 71 | + <bsth_c_s_ecinfo id="7" xl="1" jsy="7" spy="8" dbbm="78" is_cancel="0" /> | ||
| 72 | + | ||
| 73 | + <!-- 路牌信息 --> | ||
| 74 | + <bsth_c_s_gbi id="1" xl="1" lp_no="1" lp_name="路牌1" lp_type="普通路牌" is_cancel="0" | ||
| 75 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 76 | + /> | ||
| 77 | + <bsth_c_s_gbi id="2" xl="1" lp_no="2" lp_name="路牌2" lp_type="普通路牌" is_cancel="0" | ||
| 78 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 79 | + /> | ||
| 80 | + <bsth_c_s_gbi id="3" xl="1" lp_no="3" lp_name="路牌3" lp_type="普通路牌" is_cancel="0" | ||
| 81 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 82 | + /> | ||
| 83 | + <bsth_c_s_gbi id="4" xl="1" lp_no="4" lp_name="特1" lp_type="普通路牌" is_cancel="0" | ||
| 84 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 85 | + /> | ||
| 86 | + | ||
| 87 | + <!-- 时刻表1信息(平日) --> | ||
| 88 | + <bsth_c_s_ttinfo id="1" xl="1" name="时刻表1" xl_dir="2" qyrq="2019-01-01" is_enable_dis_template="1" | ||
| 89 | + is_cancel="0" line_version="1" lp_count = "10" loop_count = "6" | ||
| 90 | + rule_days="1,1,0,1,1,0,0" | ||
| 91 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 92 | + /> | ||
| 93 | + <!-- 时刻表2信息(节假日) --> | ||
| 94 | + <bsth_c_s_ttinfo id="2" xl="1" name="时刻表2" xl_dir="2" qyrq="2019-01-01" is_enable_dis_template="1" | ||
| 95 | + is_cancel="0" line_version="1" lp_count = "10" loop_count = "6" | ||
| 96 | + rule_days="1,1,0,0,0,1,1" | ||
| 97 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 98 | + /> | ||
| 99 | + <!-- 时刻表3信息(特殊日期) --> | ||
| 100 | + <bsth_c_s_ttinfo id="3" xl="1" name="时刻表3" xl_dir="2" qyrq="2019-01-01" is_enable_dis_template="1" | ||
| 101 | + is_cancel="0" line_version="1" lp_count = "10" loop_count = "6" | ||
| 102 | + special_days="2019-01-05,2019-01-06,2019-01-07" | ||
| 103 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 104 | + /> | ||
| 105 | + <!-- 时刻表4信息(特殊日期) --> | ||
| 106 | + <bsth_c_s_ttinfo id="4" xl="1" name="时刻表4" xl_dir="2" qyrq="2019-01-01" is_enable_dis_template="1" | ||
| 107 | + is_cancel="0" line_version="1" lp_count = "10" loop_count = "6" | ||
| 108 | + special_days="2019-01-06,2019-01-07,2019-01-08,2019-01-09" | ||
| 109 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 110 | + /> | ||
| 111 | + | ||
| 112 | + <!-- 时刻表1明细信息(3个路牌6个班次 ) --> | ||
| 113 | + <bsth_c_s_ttinfo_detail id="1" xl="1" ttinfo="1" lp="1" fcno="1" xl_dir="0" | ||
| 114 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 115 | + fcsj="08:30" bcs="1" jhlc="30" bcsj="30" bc_type="normal" | ||
| 116 | + line_version="1" remark="mark一下" isfb="0" ists="0" | ||
| 117 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 118 | + /> | ||
| 119 | + <bsth_c_s_ttinfo_detail id="2" xl="1" ttinfo="1" lp="2" fcno="2" xl_dir="0" | ||
| 120 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 121 | + fcsj="08:40" bcs="2" jhlc="30" bcsj="30" bc_type="normal" | ||
| 122 | + line_version="1" | ||
| 123 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 124 | + /> | ||
| 125 | + <bsth_c_s_ttinfo_detail id="3" xl="1" ttinfo="1" lp="3" fcno="3" xl_dir="0" | ||
| 126 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 127 | + fcsj="08:50" bcs="3" jhlc="30" bcsj="30" bc_type="normal" | ||
| 128 | + line_version="1" | ||
| 129 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 130 | + /> | ||
| 131 | + <bsth_c_s_ttinfo_detail id="4" xl="1" ttinfo="1" lp="1" fcno="4" xl_dir="1" | ||
| 132 | + qdz_code="#3" qdz_name="下行起点站" zdz_code="#4" zdz_name="下行终点站" | ||
| 133 | + fcsj="09:10" bcs="4" jhlc="30" bcsj="30" bc_type="normal" | ||
| 134 | + line_version="1" | ||
| 135 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 136 | + /> | ||
| 137 | + <bsth_c_s_ttinfo_detail id="5" xl="1" ttinfo="1" lp="2" fcno="5" xl_dir="1" | ||
| 138 | + qdz_code="#3" qdz_name="下行起点站" zdz_code="#4" zdz_name="下行终点站" | ||
| 139 | + fcsj="09:20" bcs="5" jhlc="30" bcsj="30" bc_type="normal" | ||
| 140 | + line_version="1" | ||
| 141 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 142 | + /> | ||
| 143 | + <bsth_c_s_ttinfo_detail id="10" xl="1" ttinfo="1" lp="1" fcno="6" xl_dir="0" | ||
| 144 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 145 | + fcsj="09:50" bcs="1" jhlc="30" bcsj="30" bc_type="normal" isfb="1" | ||
| 146 | + line_version="1" | ||
| 147 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 148 | + /> | ||
| 149 | + <!-- 时刻表2明细信息(2个路牌2个班次 ) --> | ||
| 150 | + <bsth_c_s_ttinfo_detail id="6" xl="1" ttinfo="2" lp="1" fcno="1" xl_dir="0" | ||
| 151 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 152 | + fcsj="08:30" bcs="1" jhlc="30" bcsj="30" bc_type="normal" | ||
| 153 | + line_version="1" | ||
| 154 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 155 | + /> | ||
| 156 | + <bsth_c_s_ttinfo_detail id="7" xl="1" ttinfo="2" lp="2" fcno="2" xl_dir="0" | ||
| 157 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 158 | + fcsj="08:40" bcs="2" jhlc="30" bcsj="30" bc_type="normal" | ||
| 159 | + line_version="1" | ||
| 160 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 161 | + /> | ||
| 162 | + <!-- 时刻表3明细信息(1个路牌1个班次 ) --> | ||
| 163 | + <bsth_c_s_ttinfo_detail id="8" xl="1" ttinfo="3" lp="1" fcno="1" xl_dir="0" | ||
| 164 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 165 | + fcsj="08:30" bcs="1" jhlc="30" bcsj="30" bc_type="normal" | ||
| 166 | + line_version="1" | ||
| 167 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 168 | + /> | ||
| 169 | + <!-- 时刻表4明细信息(1个路牌1个班次 ) --> | ||
| 170 | + <bsth_c_s_ttinfo_detail id="9" xl="1" ttinfo="4" lp="1" fcno="1" xl_dir="0" | ||
| 171 | + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站" | ||
| 172 | + fcsj="08:30" bcs="1" jhlc="30" bcsj="30" bc_type="normal" | ||
| 173 | + line_version="1" | ||
| 174 | + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01" | ||
| 175 | + /> | ||
| 176 | + | ||
| 177 | + <!-- 线路1规则信息 --> | ||
| 178 | + <bsth_c_s_sr1_flat id="1" xl="1" car_config_info="1" qyrq="2019-01-01" | ||
| 179 | + lp_names="路牌1" lp_ids="1" lp_start="1" | ||
| 180 | + ry_dbbms="1,2" ry_config_ids="1,2" ry_start="1" | ||
| 181 | + fbtype="0" | ||
| 182 | + /> | ||
| 183 | + <bsth_c_s_sr1_flat id="2" xl="1" car_config_info="2" qyrq="2019-01-01" | ||
| 184 | + lp_names="路牌2" lp_ids="2" lp_start="1" | ||
| 185 | + ry_dbbms="3,4" ry_config_ids="3,4" ry_start="1" | ||
| 186 | + fbtype="0" | ||
| 187 | + /> | ||
| 188 | + <bsth_c_s_sr1_flat id="3" xl="1" car_config_info="3" qyrq="2019-01-01" | ||
| 189 | + lp_names="路牌3" lp_ids="3" lp_start="1" | ||
| 190 | + ry_dbbms="5-78,6" ry_config_ids="5-7,6" ry_start="1" | ||
| 191 | + fbtype="0" | ||
| 192 | + /> | ||
| 193 | + | ||
| 194 | +</dataset> |