Commit 96f32069d680fba31dd5171c8a0bfc7ab20a184c

Authored by 徐烜
1 parent d525d33c

嘉定公交调度系统计划调度功能优化3

1、完成前置排班规则信息验证,编写相关测试用例
2、重要:修改Personnel.java实体,添加destroy字段
Showing 21 changed files with 1190 additions and 326 deletions
src/main/java/com/bsth/entity/Personnel.java
@@ -7,17 +7,17 @@ import org.hibernate.annotations.Formula; @@ -7,17 +7,17 @@ import org.hibernate.annotations.Formula;
7 import javax.persistence.*; 7 import javax.persistence.*;
8 8
9 /** 9 /**
10 - * 10 + *
11 * @ClassName : Personnel(人员实体类) 11 * @ClassName : Personnel(人员实体类)
12 - * 12 + *
13 * @Author : bsth@lq 13 * @Author : bsth@lq
14 - * 14 + *
15 * @Description : TODO(人员) 15 * @Description : TODO(人员)
16 - * 16 + *
17 * @Data :2016-04-27 17 * @Data :2016-04-27
18 * 18 *
19 * @Version 公交调度系统BS版 0.1 19 * @Version 公交调度系统BS版 0.1
20 - * 20 + *
21 */ 21 */
22 22
23 @Entity 23 @Entity
@@ -66,6 +66,10 @@ public class Personnel extends BEntity { @@ -66,6 +66,10 @@ public class Personnel extends BEntity {
66 /** 身份证 */ 66 /** 身份证 */
67 private String card; 67 private String card;
68 68
  69 + /**
  70 + * 0为在职,1为停用
  71 + */
  72 + private Integer destroy;
69 73
70 /** 备注 */ 74 /** 备注 */
71 private String remark; 75 private String remark;
@@ -254,4 +258,12 @@ public class Personnel extends BEntity { @@ -254,4 +258,12 @@ public class Personnel extends BEntity {
254 public void setRemark(String remark) { 258 public void setRemark(String remark) {
255 this.remark = remark; 259 this.remark = remark;
256 } 260 }
  261 +
  262 + public Integer getDestroy() {
  263 + return destroy;
  264 + }
  265 +
  266 + public void setDestroy(Integer destroy) {
  267 + this.destroy = destroy;
  268 + }
257 } 269 }
src/main/java/com/bsth/service/schedule/plan/PlanConfig.java
@@ -40,13 +40,25 @@ public class PlanConfig { @@ -40,13 +40,25 @@ public class PlanConfig {
40 public KieBase kBaseValidateTimetable() { 40 public KieBase kBaseValidateTimetable() {
41 KieBase kieBase = this.generateKieBase( 41 KieBase kieBase = this.generateKieBase(
42 "kBaseValidateTimetable", 42 "kBaseValidateTimetable",
43 - new String[] {this.planConfigProperties.getValidateTimetable()}  
44 - ); 43 + new String[] {this.planConfigProperties.getValidateTimetable()});
45 LOGGER.info("初始化 KieBase[{}]成功", "前置验证相关时刻表信息"); 44 LOGGER.info("初始化 KieBase[{}]成功", "前置验证相关时刻表信息");
46 return kieBase; 45 return kieBase;
47 } 46 }
48 47
49 /** 48 /**
  49 + * 验证规则kieBase。
  50 + * @return
  51 + */
  52 + @Bean(name = "kBaseValidateRule")
  53 + public KieBase kBaseValidateRule() {
  54 + KieBase kieBase = this.generateKieBase(
  55 + "kBaseValidateRule",
  56 + new String[] {this.planConfigProperties.getValidateRule()});
  57 + LOGGER.info("初始化 KieBase[{}]成功", "前置验证相关规则信息");
  58 + return kieBase;
  59 + }
  60 +
  61 + /**
50 * 生成KieBase。 62 * 生成KieBase。
51 * @param kBaseName kBase名字 63 * @param kBaseName kBase名字
52 * @param drlClasspaths 规则类路径 64 * @param drlClasspaths 规则类路径
src/main/java/com/bsth/service/schedule/plan/PlanConfigProperties.java
@@ -18,6 +18,10 @@ public class PlanConfigProperties { @@ -18,6 +18,10 @@ public class PlanConfigProperties {
18 @NotNull 18 @NotNull
19 private String validateTimetable; 19 private String validateTimetable;
20 20
  21 + /** 排班前置验证规则(规则)*/
  22 + @NotNull
  23 + private String validateRule;
  24 +
21 public String getValidateTimetable() { 25 public String getValidateTimetable() {
22 return validateTimetable; 26 return validateTimetable;
23 } 27 }
@@ -25,4 +29,12 @@ public class PlanConfigProperties { @@ -25,4 +29,12 @@ public class PlanConfigProperties {
25 public void setValidateTimetable(String validateTimetable) { 29 public void setValidateTimetable(String validateTimetable) {
26 this.validateTimetable = validateTimetable; 30 this.validateTimetable = validateTimetable;
27 } 31 }
  32 +
  33 + public String getValidateRule() {
  34 + return validateRule;
  35 + }
  36 +
  37 + public void setValidateRule(String validateRule) {
  38 + this.validateRule = validateRule;
  39 + }
28 } 40 }
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_1_timetable/PlanProcessValidateTimetableServiceDroolsImpl.java
@@ -22,7 +22,7 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces @@ -22,7 +22,7 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces
22 private static final Logger LOGGER = LoggerFactory.getLogger(PlanProcessValidateTimetableServiceDroolsImpl.class); 22 private static final Logger LOGGER = LoggerFactory.getLogger(PlanProcessValidateTimetableServiceDroolsImpl.class);
23 23
24 /** 验证时刻表drools kbase */ 24 /** 验证时刻表drools kbase */
25 - private KieBase validateTimetableKBase; 25 + private KieBase kBaseValidateTimetable;
26 26
27 /** 使用的jdbc服务 */ 27 /** 使用的jdbc服务 */
28 private JdbcTemplate jdbcTemplate; 28 private JdbcTemplate jdbcTemplate;
@@ -48,7 +48,7 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces @@ -48,7 +48,7 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces
48 48
49 // 构造drools session->载入数据->启动规则->计算->销毁session 49 // 构造drools session->载入数据->启动规则->计算->销毁session
50 // 创建session,内部配置的是stateful 50 // 创建session,内部配置的是stateful
51 - KieSession session = validateTimetableKBase.newKieSession(); 51 + KieSession session = kBaseValidateTimetable.newKieSession();
52 // 设置gloable对象,在drl中通过别名使用 52 // 设置gloable对象,在drl中通过别名使用
53 session.setGlobal("LOGGER", LOGGER); 53 session.setGlobal("LOGGER", LOGGER);
54 54
@@ -147,7 +147,7 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces @@ -147,7 +147,7 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces
147 147
148 private PlanProcessValidateTimetableServiceDroolsImpl() {} 148 private PlanProcessValidateTimetableServiceDroolsImpl() {}
149 private PlanProcessValidateTimetableServiceDroolsImpl(Builder builder) { 149 private PlanProcessValidateTimetableServiceDroolsImpl(Builder builder) {
150 - this.validateTimetableKBase = builder.validateTimetableKBase; 150 + this.kBaseValidateTimetable = builder.kBaseValidateTimetable;
151 this.jdbcTemplate = builder.jdbcTemplate; 151 this.jdbcTemplate = builder.jdbcTemplate;
152 152
153 } 153 }
@@ -158,13 +158,13 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces @@ -158,13 +158,13 @@ public class PlanProcessValidateTimetableServiceDroolsImpl implements PlanProces
158 158
159 public static class Builder { 159 public static class Builder {
160 /** 验证时刻表drools kbase */ 160 /** 验证时刻表drools kbase */
161 - private KieBase validateTimetableKBase; 161 + private KieBase kBaseValidateTimetable;
162 162
163 /** 使用的jdbc服务 */ 163 /** 使用的jdbc服务 */
164 private JdbcTemplate jdbcTemplate; 164 private JdbcTemplate jdbcTemplate;
165 165
166 - public Builder setValidateTimetableKBase(KieBase validateTimetableKBase) {  
167 - this.validateTimetableKBase = validateTimetableKBase; 166 + public Builder setkBaseValidateTimetable(KieBase kBaseValidateTimetable) {
  167 + this.kBaseValidateTimetable = kBaseValidateTimetable;
168 return this; 168 return this;
169 } 169 }
170 170
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/PlanProcessValidateRuleService.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule;
  2 +
  3 +import java.io.Serializable;
  4 +import java.util.ArrayList;
  5 +import java.util.Date;
  6 +import java.util.List;
  7 +
  8 +/**
  9 + * 验证规则服务。
  10 + */
  11 +public interface PlanProcessValidateRuleService {
  12 + /**
  13 + * 验证关联的规则信息。
  14 + * @param xlId 线路Id
  15 + * @param from 排班计划开始时间
  16 + * @param to 排班计划结束时间
  17 + * @return 验证输出
  18 + */
  19 + Result validateRule(Integer xlId, Date from, Date to);
  20 +
  21 + /**
  22 + * 排班,验证规则结果。
  23 + */
  24 + class Result implements Serializable {
  25 + /**
  26 + *
  27 + */
  28 + private static final long serialVersionUID = 1L;
  29 +
  30 + /** 线路id */
  31 + private Integer xlId;
  32 + /** 规则总数量 */
  33 + private Integer count;
  34 + /** 启用的规则数量 */
  35 + private Integer qyCount;
  36 + /** 启用规则中的错误数量 */
  37 + private Integer qyErrorCount;
  38 + /** 错误列表 */
  39 + private List<ErrorInfo> errorInfos = new ArrayList<>();
  40 +
  41 + public Integer getXlId() {
  42 + return xlId;
  43 + }
  44 +
  45 + public void setXlId(Integer xlId) {
  46 + this.xlId = xlId;
  47 + }
  48 +
  49 + public Integer getCount() {
  50 + return count;
  51 + }
  52 +
  53 + public void setCount(Integer count) {
  54 + this.count = count;
  55 + }
  56 +
  57 + public Integer getQyCount() {
  58 + return qyCount;
  59 + }
  60 +
  61 + public void setQyCount(Integer qyCount) {
  62 + this.qyCount = qyCount;
  63 + }
  64 +
  65 + public Integer getQyErrorCount() {
  66 + return qyErrorCount;
  67 + }
  68 +
  69 + public void setQyErrorCount(Integer qyErrorCount) {
  70 + this.qyErrorCount = qyErrorCount;
  71 + }
  72 +
  73 + public List<ErrorInfo> getErrorInfos() {
  74 + return errorInfos;
  75 + }
  76 +
  77 + public void setErrorInfos(List<ErrorInfo> errorInfos) {
  78 + this.errorInfos = errorInfos;
  79 + }
  80 + }
  81 +
  82 + class ErrorInfo implements Serializable {
  83 + /**
  84 + *
  85 + */
  86 + private static final long serialVersionUID = 1L;
  87 +
  88 + /** 规则id */
  89 + private Long ruleId;
  90 + /** 车辆自编号 */
  91 + private String clZbh;
  92 + /** 启用日期 */
  93 + private Date qyrq;
  94 + /** 错误描述 */
  95 + private List<String> errorDescList = new ArrayList<>();
  96 +
  97 + public Long getRuleId() {
  98 + return ruleId;
  99 + }
  100 +
  101 + public void setRuleId(Long ruleId) {
  102 + this.ruleId = ruleId;
  103 + }
  104 +
  105 + public String getClZbh() {
  106 + return clZbh;
  107 + }
  108 +
  109 + public void setClZbh(String clZbh) {
  110 + this.clZbh = clZbh;
  111 + }
  112 +
  113 + public Date getQyrq() {
  114 + return qyrq;
  115 + }
  116 +
  117 + public void setQyrq(Date qyrq) {
  118 + this.qyrq = qyrq;
  119 + }
  120 +
  121 + public List<String> getErrorDescList() {
  122 + return errorDescList;
  123 + }
  124 +
  125 + public void setErrorDescList(List<String> errorDescList) {
  126 + this.errorDescList = errorDescList;
  127 + }
  128 + }
  129 +
  130 +
  131 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/PlanProcessValidateRuleServiceDroolsImpl.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule;
  2 +
  3 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.*;
  4 +import org.joda.time.DateTime;
  5 +import org.kie.api.KieBase;
  6 +import org.kie.api.runtime.KieSession;
  7 +import org.slf4j.Logger;
  8 +import org.slf4j.LoggerFactory;
  9 +import org.springframework.jdbc.core.JdbcTemplate;
  10 +import org.springframework.jdbc.core.RowMapper;
  11 +
  12 +import java.sql.ResultSet;
  13 +import java.sql.SQLException;
  14 +import java.util.Date;
  15 +import java.util.List;
  16 +
  17 +/**
  18 + * 验证规则服务。
  19 + */
  20 +public class PlanProcessValidateRuleServiceDroolsImpl implements PlanProcessValidateRuleService {
  21 + /** 日志记录器 */
  22 + private static final Logger LOGGER = LoggerFactory.getLogger(PlanProcessValidateRuleServiceDroolsImpl.class);
  23 +
  24 + private KieBase kBaseValidateRule;
  25 +
  26 + private JdbcTemplate jdbcTemplate;
  27 +
  28 + /** 车辆配置信息查询SQL */
  29 + private static final String CC_QUERY_SQL =
  30 + "select ccinfo.xl, ccinfo.cl, car.inside_code, ccinfo.id " +
  31 + "from bsth_c_s_ccinfo ccinfo left join bsth_c_cars car on ccinfo.cl = car.id " +
  32 + "where ccinfo.is_cancel = 0 and ccinfo.xl = ? ";
  33 + /** 路牌配置信息查询SQL */
  34 + private static final String LP_QUERY_SQL =
  35 + "select id, lp_name, xl " +
  36 + "from bsth_c_s_gbi " +
  37 + "where is_cancel = 0 and xl = ? ";
  38 + /** 人员配置信息查询SQL */
  39 + private static final String EC_QUERY_SQL =
  40 + "select ec.id as id, xl, dbbm, " +
  41 + "ec.jsy as jsy_id, p1.personnel_name as jsy_name, p1.job_codeori as jsy_code, p1.destroy as jsy_destroy, " +
  42 + "ec.spy as spy_id, p2.personnel_name as spy_name, p2.job_codeori as spy_code, p2.destroy as spy_destroy " +
  43 + "from bsth_c_s_ecinfo ec left join bsth_c_personnel p1 on ec.jsy = p1.id left join bsth_c_personnel p2 on ec.spy = p2.id " +
  44 + "where is_cancel = 0 and xl = ? ";
  45 +
  46 + /** 规则信息查询SQL */
  47 + private static final String FLAT_RULE_SQUERY_SQL =
  48 + "select rule.id, cc.xl, rule.qyrq, car_config_info, " +
  49 + "lp_ids, lp_names, lp_start, " +
  50 + "ry_config_ids, ry_dbbms, ry_start, " +
  51 + "car.inside_code " +
  52 + "from bsth_c_s_sr1_flat rule left join bsth_c_s_ccinfo cc on rule.car_config_info = cc.id left join bsth_c_cars car on cc.cl = car.id " +
  53 + "where cc.xl = ? ";
  54 +
  55 + @Override
  56 + public Result validateRule(Integer xlId, Date from, Date to) {
  57 + LOGGER.info("KieBase[{}],线路id={},开始日期={},结束日期={} 开始验证",
  58 + "前置验证相关规则", xlId, from, to);
  59 +
  60 + // 构造drools session->载入数据->启动规则->计算->销毁session
  61 + // 创建session,内部配置的是stateful
  62 + KieSession session = kBaseValidateRule.newKieSession();
  63 + // 设置gloable对象,在drl中通过别名使用
  64 + session.setGlobal("LOGGER", LOGGER);
  65 +
  66 + Result rs = new Result(); // 输出gloable对象
  67 + session.setGlobal("rs", rs);
  68 +
  69 + // 载入参数数据
  70 + KBaseValidateRule_Fact_CalcuParam calcuParam = KBaseValidateRule_Fact_CalcuParam.builder()
  71 + .fromDate(new DateTime(from))
  72 + .toDate(new DateTime(to))
  73 + .xlId(xlId)
  74 + .build();
  75 + session.insert(calcuParam);
  76 +
  77 + // 载入车辆配置信息
  78 + List<KBaseValidateRule_Fact_VehicleConfig> vehicleConfigDtoList = jdbcTemplate.query(
  79 + CC_QUERY_SQL,
  80 + new Object[]{xlId},
  81 + new RowMapper<KBaseValidateRule_Fact_VehicleConfig>() {
  82 + @Override
  83 + public KBaseValidateRule_Fact_VehicleConfig mapRow(ResultSet rs, int rowNum) throws SQLException {
  84 + return KBaseValidateRule_Fact_VehicleConfig.builder()
  85 + .id(rs.getLong("id"))
  86 + .cl(KBaseValidateRule_Fact_Car.builder()
  87 + .id(rs.getInt("cl"))
  88 + .insideCode(rs.getString("inside_code"))
  89 + .build())
  90 + .xl(KBaseValidateRule_Fact_Line.builder()
  91 + .id(rs.getInt("xl"))
  92 + .build())
  93 + .build();
  94 + }
  95 + });
  96 + for (KBaseValidateRule_Fact_VehicleConfig vehicleConfigDto : vehicleConfigDtoList) {
  97 + session.insert(vehicleConfigDto);
  98 + }
  99 +
  100 + // 载入路牌配置信息
  101 + List<KBaseValidateRule_Fact_LpConfig> lpConfigDtoList = jdbcTemplate.query(
  102 + LP_QUERY_SQL,
  103 + new Object[]{xlId},
  104 + new RowMapper<KBaseValidateRule_Fact_LpConfig>() {
  105 + @Override
  106 + public KBaseValidateRule_Fact_LpConfig mapRow(ResultSet rs, int rowNum) throws SQLException {
  107 + return KBaseValidateRule_Fact_LpConfig.builder()
  108 + .id(rs.getLong("id"))
  109 + .lpName(rs.getString("lp_name"))
  110 + .xl(KBaseValidateRule_Fact_Line.builder()
  111 + .id(rs.getInt("xl"))
  112 + .build())
  113 + .build();
  114 + }
  115 + });
  116 + for (KBaseValidateRule_Fact_LpConfig lpConfigDto : lpConfigDtoList) {
  117 + session.insert(lpConfigDto);
  118 + }
  119 +
  120 + // 载入人员配置信息
  121 + List<KBaseValidateRule_Fact_EmployeeConfig> employeeConfigDtoList = jdbcTemplate.query(
  122 + EC_QUERY_SQL,
  123 + new Object[]{xlId},
  124 + new RowMapper<KBaseValidateRule_Fact_EmployeeConfig>() {
  125 + @Override
  126 + public KBaseValidateRule_Fact_EmployeeConfig mapRow(ResultSet rs, int rowNum) throws SQLException {
  127 + return KBaseValidateRule_Fact_EmployeeConfig.builder()
  128 + .id(rs.getLong("id"))
  129 + .dbbm(rs.getString("dbbm"))
  130 + .xl(KBaseValidateRule_Fact_Line.builder()
  131 + .id(rs.getInt("xl"))
  132 + .build())
  133 + .jsy(rs.getString("jsy_name") == null ? null :
  134 + KBaseValidateRule_Fact_Personnel.builder()
  135 + .id(rs.getInt("jsy_id"))
  136 + .personnelName(rs.getString("jsy_name"))
  137 + .jobCodeori(rs.getString("jsy_code"))
  138 + .destroy(rs.getInt("jsy_destroy"))
  139 + .build())
  140 + .spy(rs.getString("spy_name") == null ? null :
  141 + KBaseValidateRule_Fact_Personnel.builder()
  142 + .id(rs.getInt("spy_id"))
  143 + .personnelName(rs.getString("spy_name"))
  144 + .jobCodeori(rs.getString("spy_code"))
  145 + .destroy(rs.getInt("spy_destroy"))
  146 + .build())
  147 + .build();
  148 + }
  149 + });
  150 + for (KBaseValidateRule_Fact_EmployeeConfig employeeConfigDto : employeeConfigDtoList) {
  151 + session.insert(employeeConfigDto);
  152 + }
  153 +
  154 + // 载入规则信息
  155 + List<KBaseValidateRule_Fact_Rule> flatRuleDtoList = jdbcTemplate.query(
  156 + FLAT_RULE_SQUERY_SQL,
  157 + new Object[]{xlId},
  158 + new RowMapper<KBaseValidateRule_Fact_Rule>() {
  159 + @Override
  160 + public KBaseValidateRule_Fact_Rule mapRow(ResultSet rs, int rowNum) throws SQLException {
  161 + return KBaseValidateRule_Fact_Rule.builder()
  162 + .id(rs.getLong("id"))
  163 + .qyrq(rs.getDate("qyrq"))
  164 + .lpIds(rs.getString("lp_ids"))
  165 + .lpNames(rs.getString("lp_names"))
  166 + .lpStart(rs.getInt("lp_start"))
  167 + .ryConfigIds(rs.getString("ry_config_ids"))
  168 + .ryDbbms(rs.getString("ry_dbbms"))
  169 + .ryStart(rs.getInt("ry_start"))
  170 + .carConfigInfo(KBaseValidateRule_Fact_VehicleConfig.builder()
  171 + .id(rs.getLong("car_config_info"))
  172 + .cl(KBaseValidateRule_Fact_Car.builder()
  173 + .insideCode(rs.getString("inside_code"))
  174 + .build())
  175 + .build())
  176 + .xl(KBaseValidateRule_Fact_Line.builder()
  177 + .id(rs.getInt("xl"))
  178 + .build())
  179 + .build();
  180 + }
  181 + });
  182 + for (KBaseValidateRule_Fact_Rule flatRuleDto : flatRuleDtoList) {
  183 + session.insert(flatRuleDto);
  184 + }
  185 +
  186 + // 执行rule
  187 + session.fireAllRules();
  188 +
  189 + // 执行完毕销毁,有日志的也要关闭
  190 + session.dispose();
  191 +
  192 +
  193 + LOGGER.info("KieBase[{}],线路id={},开始日期={},结束日期={} 完成验证",
  194 + "前置验证相关规则", xlId, from, to);
  195 +
  196 + return rs;
  197 + }
  198 +
  199 + private PlanProcessValidateRuleServiceDroolsImpl() {}
  200 + private PlanProcessValidateRuleServiceDroolsImpl(Builder builder) {
  201 + this.jdbcTemplate = builder.jdbcTemplate;
  202 + this.kBaseValidateRule = builder.kBaseValidateRule;
  203 + }
  204 + public static Builder getBuilder() {
  205 + return new Builder();
  206 + }
  207 +
  208 + public static class Builder {
  209 + private KieBase kBaseValidateRule;
  210 +
  211 + private JdbcTemplate jdbcTemplate;
  212 +
  213 + public Builder setkBaseValidateRule(KieBase kBaseValidateRule) {
  214 + this.kBaseValidateRule = kBaseValidateRule;
  215 + return this;
  216 + }
  217 +
  218 + public Builder setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  219 + this.jdbcTemplate = jdbcTemplate;
  220 + return this;
  221 + }
  222 +
  223 + public PlanProcessValidateRuleServiceDroolsImpl build() {
  224 + return new PlanProcessValidateRuleServiceDroolsImpl(this);
  225 + }
  226 + }
  227 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_CalcuParam.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_Fact_CalcuParam {
  15 + /** 线路Id */
  16 + private Integer xlId;
  17 +
  18 + /** 计划开始计算日期 */
  19 + private DateTime fromDate;
  20 + /** 计划结束计算日期 */
  21 + private DateTime toDate;
  22 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_Car.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_Fact_Car {
  14 + /** 主键Id */
  15 + private Integer id;
  16 + /** 自编号/内部编号 */
  17 + private String insideCode;
  18 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_EmployeeConfig.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_Fact_EmployeeConfig {
  14 + /** 主键Id */
  15 + private Long id;
  16 + /** 搭班编码(是售票员和驾驶员搭配时使用,同一条线路搭班编码不能重复) */
  17 + private String dbbm;
  18 + /** 线路关联 */
  19 + private KBaseValidateRule_Fact_Line xl;
  20 + /** 人员关联(驾驶员) */
  21 + private KBaseValidateRule_Fact_Personnel jsy;
  22 + /** 人员关联(售票员) */
  23 + private KBaseValidateRule_Fact_Personnel spy;
  24 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_Line.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_Fact_Line {
  14 + /** 主键id */
  15 + private Integer id;
  16 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_LpConfig.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_Fact_LpConfig {
  14 + /** 主键Id */
  15 + private Long id;
  16 + /** 路牌名称 */
  17 + private String lpName;
  18 + /** 线路 */
  19 + private KBaseValidateRule_Fact_Line xl;
  20 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_Personnel.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_Fact_Personnel {
  14 + /** 主键Id */
  15 + private Integer id;
  16 + /** 姓名 */
  17 + private String personnelName;
  18 + /** 工号 */
  19 + private String jobCodeori;
  20 + /**
  21 + * 0为在职,1为停用
  22 + */
  23 + private Integer destroy;
  24 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_Rule.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_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 KBaseValidateRule_Fact_VehicleConfig carConfigInfo;
  35 + /** 关联线路 */
  36 + private KBaseValidateRule_Fact_Line xl;
  37 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Fact_VehicleConfig.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.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 KBaseValidateRule_Fact_VehicleConfig {
  14 + /** 主健Id */
  15 + private Long id;
  16 + /** 线路 */
  17 + private KBaseValidateRule_Fact_Line xl;
  18 + /** 车辆 */
  19 + private KBaseValidateRule_Fact_Car cl;
  20 +}
src/main/java/com/bsth/service/schedule/plan/process/_1_validate/_2_rule/drools/KBaseValidateRule_Function_ErrorInfo.java 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.drools;
  2 +
  3 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.PlanProcessValidateRuleService.ErrorInfo;
  4 +import org.apache.commons.lang3.StringUtils;
  5 +import org.apache.commons.lang3.math.NumberUtils;
  6 +import org.kie.api.runtime.rule.AccumulateFunction;
  7 +
  8 +import java.io.IOException;
  9 +import java.io.ObjectInput;
  10 +import java.io.ObjectOutput;
  11 +import java.io.Serializable;
  12 +import java.util.HashMap;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +
  16 +/**
  17 + * drools验证规则用的函数(计算规则错误)
  18 + */
  19 +public class KBaseValidateRule_Function_ErrorInfo implements AccumulateFunction {
  20 + @Override
  21 + public void writeExternal(ObjectOutput out) throws IOException {}
  22 +
  23 + @Override
  24 + public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {}
  25 +
  26 + /**
  27 + * 规则包装类。
  28 + */
  29 + public static class WrapRule {
  30 + /** 规则 */
  31 + public KBaseValidateRule_Fact_Rule rule;
  32 + /** 对应线路的车辆配置,key=车辆配置Id */
  33 + public Map<Long, KBaseValidateRule_Fact_VehicleConfig> ccInfos;
  34 + /** 对应线路的人员配置,key=人员配置Id */
  35 + public Map<Long, KBaseValidateRule_Fact_EmployeeConfig> ecInfos;
  36 + /** 对应线路的路牌配置,key=路牌配置Id */
  37 + public Map<Long, KBaseValidateRule_Fact_LpConfig> lpInfos;
  38 +
  39 + public WrapRule() {
  40 + this.ccInfos = new HashMap<>();
  41 + this.ecInfos = new HashMap<>();
  42 + this.lpInfos = new HashMap<>();
  43 + }
  44 +
  45 + public void addCcInfoList(List<KBaseValidateRule_Fact_VehicleConfig> list) {
  46 + for (KBaseValidateRule_Fact_VehicleConfig config : list) {
  47 + this.ccInfos.put(config.getId(), config);
  48 + }
  49 + }
  50 + public void addEcInfoList(List<KBaseValidateRule_Fact_EmployeeConfig> list) {
  51 + for (KBaseValidateRule_Fact_EmployeeConfig config : list) {
  52 + this.ecInfos.put(config.getId(), config);
  53 + }
  54 + }
  55 + public void addLpInfoList(List<KBaseValidateRule_Fact_LpConfig> list) {
  56 + for (KBaseValidateRule_Fact_LpConfig config : list) {
  57 + this.lpInfos.put(config.getId(), config);
  58 + }
  59 + }
  60 +
  61 + }
  62 +
  63 + protected static class ErrorInfoContext implements Serializable {
  64 + /** 规则错误数量 */
  65 + private Integer errorCount = 0;
  66 + /** 错误Map, key=规则Id */
  67 + private Map<Long, ErrorInfo> errorInfoMap = new HashMap<>();
  68 +
  69 + void remove(Long ruleId) {
  70 + if (ruleId != null) {
  71 + this.errorInfoMap.remove(ruleId);
  72 + this.errorCount --;
  73 + }
  74 + }
  75 +
  76 + void add(WrapRule wrapRule) {
  77 + ErrorInfo errorInfo = new ErrorInfo();
  78 + errorInfo.setRuleId(wrapRule.rule.getId());
  79 + errorInfo.setQyrq(wrapRule.rule.getQyrq());
  80 +
  81 + // 1、车辆配置验证
  82 + String clZbh = wrapRule.rule.getCarConfigInfo().getCl().getInsideCode();
  83 + Long ccInfoId = wrapRule.rule.getCarConfigInfo().getId();
  84 + errorInfo.setClZbh(clZbh);
  85 +
  86 + if (StringUtils.isNotEmpty(clZbh)) { // 自编号不能为空
  87 + if (wrapRule.ccInfos.get(ccInfoId) == null) { // 车辆配置不在当前线路上
  88 + errorInfo.getErrorDescList().add("车辆配置不在当前线路,请重新编辑保存!");
  89 + }
  90 + } else {
  91 + errorInfo.getErrorDescList().add("自编号不能为空,请重新编辑保存!");
  92 + }
  93 +
  94 + // 2、路牌id,路牌名字,路牌起始索引验证
  95 + String lpIds_str = wrapRule.rule.getLpIds();
  96 + String lpNames_str = wrapRule.rule.getLpNames();
  97 + Integer lpStart = wrapRule.rule.getLpStart();
  98 +
  99 + if (StringUtils.isNotEmpty(lpIds_str) &&
  100 + StringUtils.isNotEmpty(lpNames_str)) { // 冗余的路牌id和路牌名字都不能为空
  101 + String[] lpIds = lpIds_str.split(",");
  102 + String[] lpNames = lpNames_str.split(",");
  103 + if (lpIds.length == lpNames.length) { // 路牌id和路牌名字个数一致
  104 + for (int i = 0; i < lpIds.length; i++) {
  105 + if (!NumberUtils.isDigits(lpIds[i])) { // 冗余路牌id必须是数字
  106 + errorInfo.getErrorDescList().add("冗余路牌id必须是数字,请重新编辑保存!");
  107 + break;
  108 + }
  109 +
  110 + KBaseValidateRule_Fact_LpConfig lpInfo = wrapRule.lpInfos.get(NumberUtils.toLong(lpIds[i]));
  111 + if (lpInfo == null) { // 路牌不在当前线路上
  112 + errorInfo.getErrorDescList().add("路牌不在当前线路上,请重新编辑保存!");
  113 + } else {
  114 + if (StringUtils.isEmpty(lpNames[i]) ||
  115 + !(lpNames[i].equals(lpInfo.getLpName()))) { // 路牌id和路牌名字不对应
  116 + errorInfo.getErrorDescList().add("路牌id和路牌名字不对应,请重新编辑保存!");
  117 + break;
  118 + }
  119 + }
  120 + }
  121 +
  122 + if (lpStart < 1 || lpStart > lpIds.length) { // 路牌起始索引溢出
  123 + errorInfo.getErrorDescList().add("路牌起始索引溢出,请重新编辑保存!");
  124 + }
  125 + } else {
  126 + errorInfo.getErrorDescList().add("路牌id和路牌名字个数不一致,请重新编辑保存!");
  127 + }
  128 + } else {
  129 + errorInfo.getErrorDescList().add("冗余的路牌id和路牌名字都不能为空,请重新编辑保存!");
  130 + }
  131 +
  132 + // 3、人员配置,搭班编码,人员起始索引验证,配置人员停用验证
  133 + String ecIds_str = wrapRule.rule.getRyConfigIds();
  134 + String ecDbbms_str = wrapRule.rule.getRyDbbms();
  135 + Integer ryStart = wrapRule.rule.getRyStart();
  136 +
  137 + if (StringUtils.isNotEmpty(ecIds_str) &&
  138 + StringUtils.isNotEmpty(ecDbbms_str)) { // 冗余的人员配置id和人员搭班编码都不能为空
  139 + String[] ecIds = ecIds_str.split(",");
  140 + String[] ecDbbms = ecDbbms_str.split(",");
  141 + if (ecIds.length == ecDbbms.length) { // 人员配置id和搭班编码个数一致
  142 + for (int i = 0; i < ecIds.length; i++) {
  143 + if (ecIds[i].contains("-")) { // 分班标识
  144 + String[] fb_ecIds = ecIds[i].split("-");
  145 + String[] fb_ecDbbms = ecDbbms[i].split("-");
  146 + if (fb_ecIds.length != 2 || fb_ecDbbms.length != 2) { // 只能早晚分班
  147 + errorInfo.getErrorDescList().add("只能早晚分班,请重新编辑保存!");
  148 + break;
  149 + } else {
  150 + KBaseValidateRule_Fact_EmployeeConfig fb_ecInfo1 =
  151 + wrapRule.ecInfos.get(NumberUtils.toLong(fb_ecIds[0]));
  152 + KBaseValidateRule_Fact_EmployeeConfig fb_ecInfo2 =
  153 + wrapRule.ecInfos.get(NumberUtils.toLong(fb_ecIds[1]));
  154 + if (fb_ecInfo1 == null || fb_ecInfo2 == null) { // 分班的人员配置不在当前线路
  155 + errorInfo.getErrorDescList().add("分班的人员配置不在当前线路,请重新编辑保存!");
  156 + break;
  157 + } else {
  158 + if (StringUtils.isEmpty(fb_ecDbbms[0]) ||
  159 + StringUtils.isEmpty(fb_ecDbbms[1]) ||
  160 + !(fb_ecDbbms[0].equals(fb_ecInfo1.getDbbm())) ||
  161 + !(fb_ecDbbms[1].equals(fb_ecInfo2.getDbbm()))) { // 分班人员配置id和搭班编码不对应
  162 + errorInfo.getErrorDescList().add("分班人员配置id和搭班编码不对应,请重新编辑保存!");
  163 + break;
  164 + }
  165 + }
  166 +
  167 + // 验证fb_ecInfo1
  168 + String dbbm = fb_ecInfo1.getDbbm();
  169 + KBaseValidateRule_Fact_Personnel jsy = fb_ecInfo1.getJsy();
  170 + KBaseValidateRule_Fact_Personnel spy = fb_ecInfo1.getSpy();
  171 + if (jsy != null && jsy.getDestroy() != null && jsy.getDestroy() == 1) {
  172 + errorInfo.getErrorDescList().add(
  173 + String.format("搭班编码=%s,驾驶员=%s,工号=%s,人员已经停用!",
  174 + dbbm, jsy.getPersonnelName(), jsy.getJobCodeori()));
  175 + break;
  176 + }
  177 + if (spy != null && spy.getDestroy() != null && spy.getDestroy() == 1) {
  178 + errorInfo.getErrorDescList().add(
  179 + String.format("搭班编码=%s,售票员=%s,工号=%s,人员已经停用!",
  180 + dbbm, spy.getPersonnelName(), spy.getJobCodeori()));
  181 + break;
  182 + }
  183 + // 验证fb_ecInfo2
  184 + dbbm = fb_ecInfo2.getDbbm();
  185 + jsy = fb_ecInfo2.getJsy();
  186 + spy = fb_ecInfo2.getSpy();
  187 + if (jsy != null && jsy.getDestroy() != null && jsy.getDestroy() == 1) {
  188 + errorInfo.getErrorDescList().add(
  189 + String.format("搭班编码=%s,驾驶员=%s,工号=%s,人员已经停用!",
  190 + dbbm, jsy.getPersonnelName(), jsy.getJobCodeori()));
  191 + break;
  192 + }
  193 + if (spy != null && spy.getDestroy() != null && spy.getDestroy() == 1) {
  194 + errorInfo.getErrorDescList().add(
  195 + String.format("搭班编码=%s,售票员=%s,工号=%s,人员已经停用!",
  196 + dbbm, spy.getPersonnelName(), spy.getJobCodeori()));
  197 + break;
  198 + }
  199 + }
  200 +
  201 + } else {
  202 + if (!NumberUtils.isDigits(ecIds[i])) { // 冗余的人员配置id必须是数字
  203 + errorInfo.getErrorDescList().add("冗余的人员配置id必须是数字,请重新编辑保存!");
  204 + break;
  205 + }
  206 +
  207 + KBaseValidateRule_Fact_EmployeeConfig ecInfo = wrapRule.ecInfos.get(NumberUtils.toLong(ecIds[i]));
  208 + if (ecInfo == null) { // 人员配置不在当前线路
  209 + errorInfo.getErrorDescList().add("人员配置不在当前线路,请重新编辑保存!");
  210 + break;
  211 + } else {
  212 + if (StringUtils.isEmpty(ecDbbms[i]) ||
  213 + !(ecDbbms[i].equals(ecInfo.getDbbm()))) { // 人员配置id和搭班编码不对应
  214 + errorInfo.getErrorDescList().add("人员配置id和搭班编码不对应,请重新编辑保存!");
  215 + break;
  216 + }
  217 + }
  218 +
  219 + // 验证ecInfo
  220 + String dbbm = ecInfo.getDbbm();
  221 + KBaseValidateRule_Fact_Personnel jsy = ecInfo.getJsy();
  222 + KBaseValidateRule_Fact_Personnel spy = ecInfo.getSpy();
  223 + if (jsy != null && jsy.getDestroy() != null && jsy.getDestroy() == 1) {
  224 + errorInfo.getErrorDescList().add(
  225 + String.format("搭班编码=%s,驾驶员=%s,工号=%s,人员已经停用!",
  226 + dbbm, jsy.getPersonnelName(), jsy.getJobCodeori()));
  227 + break;
  228 + }
  229 + if (spy != null && spy.getDestroy() != null && spy.getDestroy() == 1) {
  230 + errorInfo.getErrorDescList().add(
  231 + String.format("搭班编码=%s,售票员=%s,工号=%s,人员已经停用!",
  232 + dbbm, spy.getPersonnelName(), spy.getJobCodeori()));
  233 + break;
  234 + }
  235 + }
  236 + }
  237 +
  238 + if (ryStart < 1 || ryStart > ecIds.length) { // 人员起始索引溢出
  239 + errorInfo.getErrorDescList().add("人员起始索引溢出,请重新编辑保存!");
  240 + }
  241 + } else {
  242 + errorInfo.getErrorDescList().add("人员配置id和搭班编码个数不一致,请重新编辑保存!");
  243 + }
  244 + }
  245 +
  246 + if (errorInfo.getErrorDescList().size() > 0) {
  247 + this.errorCount ++;
  248 + this.errorInfoMap.put(wrapRule.rule.getId(), errorInfo);
  249 + }
  250 + }
  251 +
  252 + ErrorInfoContext() {
  253 + this.errorCount = 0;
  254 + this.errorInfoMap = new HashMap<>();
  255 + }
  256 +
  257 + Map<Long, ErrorInfo> result() {
  258 + return this.errorInfoMap;
  259 + }
  260 +
  261 + }
  262 +
  263 + @Override
  264 + public Serializable createContext() {
  265 + return new ErrorInfoContext();
  266 + }
  267 +
  268 + @Override
  269 + public void init(Serializable context) throws Exception {}
  270 +
  271 + @Override
  272 + public void accumulate(Serializable context, Object value) {
  273 + ErrorInfoContext errorInfoContext = (ErrorInfoContext) context;
  274 + WrapRule wrapRule = (WrapRule) value;
  275 + errorInfoContext.add(wrapRule);
  276 + }
  277 +
  278 + @Override
  279 + public boolean supportsReverse() {
  280 + return true;
  281 + }
  282 +
  283 + @Override
  284 + public void reverse(Serializable context, Object value) throws Exception {
  285 + ErrorInfoContext errorInfoContext = (ErrorInfoContext) context;
  286 + WrapRule wrapRule = (WrapRule) value;
  287 + errorInfoContext.remove(wrapRule.rule.getId());
  288 + }
  289 +
  290 + @Override
  291 + public Class<?> getResultType() {
  292 + return Map.class;
  293 + }
  294 +
  295 + @Override
  296 + public Object getResult(Serializable context) throws Exception {
  297 + ErrorInfoContext errorInfoContext = (ErrorInfoContext) context;
  298 + return errorInfoContext.result();
  299 + }
  300 +}
src/main/resources/drools/KBase/validate/rule/KBase_validate_rule.drl 0 → 100644
  1 +package com.bsth.service.schedule.plan.process._1_validate._2_rule.drools;
  2 +
  3 +import org.joda.time.*;
  4 +import org.joda.time.format.DateTimeFormat;
  5 +import java.util.*;
  6 +import org.apache.commons.lang3.StringUtils;
  7 +
  8 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Fact_CalcuParam;
  9 +
  10 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Fact_VehicleConfig;
  11 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Fact_EmployeeConfig;
  12 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Fact_LpConfig;
  13 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Fact_Rule;
  14 +
  15 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.PlanProcessValidateRuleService.Result;
  16 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo.WrapRule;
  17 +
  18 +import org.slf4j.Logger;
  19 +
  20 +// 全局日志类(使用PlanPreValidateServiceImpl里定义的LOGGER)
  21 +global Logger LOGGER;
  22 +
  23 +// 输出
  24 +global Result rs;
  25 +
  26 +//------------------ 第一阶段、计算wrapRule -----------------//
  27 +rule "calcu_Wrap_rule"
  28 + salience 400
  29 + when
  30 + $param: KBaseValidateRule_Fact_CalcuParam($xlId: xlId, $fd: fromDate, $td: toDate)
  31 + $qy_rule: KBaseValidateRule_Fact_Rule(xl.id == $xlId, qyrq.getTime() <= $td.getMillis(), $rid: id)
  32 + $ccInfos : ArrayList() from collect (KBaseValidateRule_Fact_VehicleConfig(xl.id == $xlId)) // 线路车辆配置
  33 + $ecInfos : ArrayList() from collect (KBaseValidateRule_Fact_EmployeeConfig(xl.id == $xlId)) // 线路人员配置
  34 + $lpInfos : ArrayList() from collect (KBaseValidateRule_Fact_LpConfig(xl.id == $xlId)) // 线路路牌配置
  35 + then
  36 + LOGGER.debug("线路Id={},开始时间={},结束时间={},启用规则Id={},线路车辆配置数={},线路人员配置数={},线路路牌配置数={}",
  37 + $xlId, $fd, $td, $rid, $ccInfos.size(), $ecInfos.size(), $lpInfos.size());
  38 +
  39 + WrapRule wrapRule = new WrapRule();
  40 + wrapRule.rule = $qy_rule;
  41 + wrapRule.addCcInfoList($ccInfos);
  42 + wrapRule.addEcInfoList($ecInfos);
  43 + wrapRule.addLpInfoList($lpInfos);
  44 +
  45 + insert(wrapRule);
  46 +
  47 +
  48 +end
  49 +
  50 +//------------------ 第二阶段、验证规则 -----------------//
  51 +rule "calcu_error_info"
  52 + salience 300
  53 + when
  54 + $param: KBaseValidateRule_Fact_CalcuParam($xlId: xlId, $fd: fromDate, $td: toDate)
  55 + $allRuleList: ArrayList() from collect(KBaseValidateRule_Fact_Rule(xl.id == $xlId))
  56 + $allWrapRuleList: ArrayList() from collect(WrapRule(rule.xl.id == $xlId))
  57 + $errorMap: Map() from accumulate ($wr: WrapRule(rule.xl.id == $xlId), srif($wr))
  58 + then
  59 + rs.setXlId($xlId);
  60 + rs.setCount($allRuleList.size());
  61 + rs.setQyCount($allWrapRuleList.size());
  62 +
  63 + rs.setQyErrorCount($errorMap.size());
  64 + rs.getErrorInfos().addAll($errorMap.values());
  65 +
  66 + LOGGER.info("线路Id={},开始时间={},结束时间={},规则总数={},启用规则数={},错误的启用规则数={}",
  67 + $xlId, $fd, $td, $allRuleList.size(), $allWrapRuleList.size(), $errorMap.size());
  68 +
  69 +end
  70 +
  71 +
src/main/resources/drools/KBase/validate/timetable/KBase_validate_timetable_old.drl deleted 100644 → 0
1 -package com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools;  
2 -  
3 -import org.joda.time.*;  
4 -import org.joda.time.format.DateTimeFormat;  
5 -import java.util.*;  
6 -import org.apache.commons.lang3.StringUtils;  
7 -  
8 -import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Fact_CalcuParam;  
9 -import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Result;  
10 -import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Result.StatInfo;  
11 -  
12 -import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Fact_Line;  
13 -import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Fact_TTInfo;  
14 -import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Fact_TTInfoDetail;  
15 -  
16 -import org.slf4j.Logger;  
17 -  
18 -// 全局日志类(使用PlanPreValidateServiceImpl里定义的LOGGER)  
19 -global Logger LOGGER;  
20 -  
21 -// 输出  
22 -global KBaseValidateTimeTable_Result rs;  
23 -  
24 -/*  
25 - 规则说明:  
26 - 1、找出指定线路,指定时间范围的时刻表  
27 - 2、统计这些时刻表班次数据的情况  
28 -*/  
29 -  
30 -//-------------- 第一阶段、计算规则迭代数据(天数) ------------//  
31 -declare Calcu_iter_days_result  
32 - xlId: Integer // 线路Id  
33 - xlName: String // 线路名字  
34 -  
35 - // 迭代数据  
36 - calcu_day: Integer // 准备计算第几天  
37 - calcu_weekday: Integer // 准备计算星期几(1到7)  
38 - calcu_date: DateTime // 准备计算的具体日期  
39 -  
40 - // 范围数据  
41 - calcu_days: Integer // 总共需要计算的天数  
42 - calcu_start_date: DateTime // 开始计算日期  
43 - calcu_end_date: DateTime // 结束计算日期  
44 -  
45 - // 时刻表映射数据  
46 - ttinfomap: Map // 指定时间段内,用的时刻表id映射 Map<Long, Long>  
47 -end  
48 -  
49 -rule "calcu_iter_days"  
50 - salience 1900  
51 - when  
52 - KBaseValidateTimeTable_Fact_CalcuParam(  
53 - $xlId: xlId,  
54 - $fromDate: fromDate,  
55 - $toDate: toDate,  
56 - $fromDate.isBefore($toDate) || $fromDate.isEqual($toDate)  
57 - )  
58 - $line: KBaseValidateTimeTable_Fact_Line(id == $xlId)  
59 - then  
60 - // 构造Calcu_iter_days_result对象,进行下一步计算  
61 - Calcu_iter_days_result cidr = new Calcu_iter_days_result();  
62 - Period p = new Period($fromDate, $toDate, PeriodType.days());  
63 -  
64 - cidr.setXlId($xlId);  
65 - cidr.setXlName($line.getName());  
66 -  
67 - cidr.setCalcu_day(new Integer(1));  
68 - cidr.setCalcu_weekday(Integer.valueOf($fromDate.getDayOfWeek()));  
69 - cidr.setCalcu_date($fromDate);  
70 -  
71 - cidr.setCalcu_days(Integer.valueOf(p.getDays() + 1));  
72 - cidr.setCalcu_start_date($fromDate);  
73 - cidr.setCalcu_end_date($toDate);  
74 -  
75 - cidr.setTtinfomap(new HashMap());  
76 -  
77 - LOGGER.info(  
78 - "线路={}-id={},开始时间={},结束时间={},总共计算的天数={},将从开始时间迭代",  
79 - cidr.getXlName(),  
80 - cidr.getXlId(),  
81 - cidr.getCalcu_start_date(),  
82 - cidr.getCalcu_end_date(),  
83 - cidr.getCalcu_days()  
84 - );  
85 -  
86 - insert(cidr);  
87 -end  
88 -  
89 -//-------------- 第二阶段、时刻表的日期匹配 ------------//  
90 -declare TTInfoDetails_wrap  
91 - ttInfoId: Long // 时刻表id  
92 - lineVersion: Integer // 线路版本  
93 - bcInfoList: List // 班次信息列表 List<KBaseValidateTimeTable_Fact_TTInfoDetail>  
94 -end  
95 -  
96 -rule "Calcu_iter_days_special_day" // 特殊日期匹配(并且不在StatInfo中)  
97 - salience 800  
98 - when  
99 - $cid : Calcu_iter_days_result(  
100 - $calcu_date: calcu_date,  
101 - $calcu_day: calcu_day,  
102 - calcu_day <= calcu_days  
103 - )  
104 - KBaseValidateTimeTable_Fact_TTInfo(  
105 - $tid: id,  
106 - $tname: name,  
107 - $lineVersion: lineVersion,  
108 - specialDayList contains $calcu_date  
109 - )  
110 - not StatInfo(ttid == $tid)  
111 - $bcInfoList : ArrayList() from collect (KBaseValidateTimeTable_Fact_TTInfoDetail(ttinfo.id == $tid))  
112 - then  
113 - // 更新迭代对象  
114 - Integer new_calcu_day = Integer.valueOf($calcu_day + 1);  
115 - $cid.setCalcu_day(new_calcu_day);  
116 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
117 - $cid.setCalcu_date(new_calcu_date);  
118 - $cid.setCalcu_weekday(Integer.valueOf(new_calcu_date.getDayOfWeek()));  
119 -  
120 - LOGGER.debug("启用特殊日期时刻表(设置StatInfo):" +  
121 - "时刻表id={} 特殊日期={}",  
122 - $tid, $calcu_date);  
123 -  
124 - StatInfo statInfo = new StatInfo();  
125 - statInfo.setTtid($tid);  
126 - statInfo.setTtname($tname);  
127 - insert(statInfo);  
128 -  
129 - TTInfoDetails_wrap ttInfoDetails_wrap = new TTInfoDetails_wrap();  
130 - ttInfoDetails_wrap.setTtInfoId($tid);  
131 - ttInfoDetails_wrap.setBcInfoList($bcInfoList);  
132 - ttInfoDetails_wrap.setLineVersion($lineVersion);  
133 - insert(ttInfoDetails_wrap);  
134 -  
135 - update($cid);  
136 -  
137 -end  
138 -  
139 -rule "Calcu_iter_days_special_day_exist" // 特殊日期匹配(已经在StatInfo中)  
140 - salience 800  
141 - when  
142 - $cid : Calcu_iter_days_result(  
143 - $calcu_date: calcu_date,  
144 - $calcu_day: calcu_day,  
145 - calcu_day <= calcu_days  
146 - )  
147 - KBaseValidateTimeTable_Fact_TTInfo(  
148 - $tid: id,  
149 - $tname: name,  
150 - $lineVersion: lineVersion,  
151 - specialDayList contains $calcu_date  
152 - )  
153 - StatInfo(ttid == $tid)  
154 - then  
155 - // 更新迭代对象  
156 - Integer new_calcu_day = Integer.valueOf($calcu_day + 1);  
157 - $cid.setCalcu_day(new_calcu_day);  
158 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
159 - $cid.setCalcu_date(new_calcu_date);  
160 - $cid.setCalcu_weekday(Integer.valueOf(new_calcu_date.getDayOfWeek()));  
161 -  
162 - LOGGER.debug("启用特殊日期时刻表(已经设置过StatInfo):" +  
163 - "时刻表id={} 特殊日期={}",  
164 - $tid, $calcu_date);  
165 -  
166 - update($cid);  
167 -  
168 -end  
169 -  
170 -rule "Calcu_iter_days_normal_day" // 平日匹配(并且不在StatInfo中)  
171 - salience 700  
172 - when  
173 - $cid : Calcu_iter_days_result(  
174 - $calcu_date: calcu_date,  
175 - $calcu_weekday: calcu_weekday,  
176 - $calcu_day: calcu_day,  
177 - calcu_day <= calcu_days  
178 - )  
179 - KBaseValidateTimeTable_Fact_TTInfo(  
180 - $tid: id,  
181 - $tname: name,  
182 - $lineVersion: lineVersion,  
183 - specialDayList not contains $calcu_date,  
184 - weekdayList[$calcu_weekday - 1] == Boolean.TRUE  
185 - )  
186 - not StatInfo(ttid == $tid)  
187 - $bcInfoList : ArrayList() from collect (KBaseValidateTimeTable_Fact_TTInfoDetail(ttinfo.id == $tid))  
188 - then  
189 - // 更新迭代对象  
190 - Integer new_calcu_day = Integer.valueOf($calcu_day + 1);  
191 - $cid.setCalcu_day(new_calcu_day);  
192 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
193 - $cid.setCalcu_date(new_calcu_date);  
194 - $cid.setCalcu_weekday(Integer.valueOf(new_calcu_date.getDayOfWeek()));  
195 -  
196 -  
197 - LOGGER.debug("启用常规日期时刻表(设置StatInfo):" +  
198 - "时刻表id={} 常规日期={} 星期几={}",  
199 - $tid, $calcu_date, $calcu_weekday);  
200 -  
201 - StatInfo statInfo = new StatInfo();  
202 - statInfo.setTtid($tid);  
203 - statInfo.setTtname($tname);  
204 - insert(statInfo);  
205 -  
206 - TTInfoDetails_wrap ttInfoDetails_wrap = new TTInfoDetails_wrap();  
207 - ttInfoDetails_wrap.setTtInfoId($tid);  
208 - ttInfoDetails_wrap.setBcInfoList($bcInfoList);  
209 - ttInfoDetails_wrap.setLineVersion($lineVersion);  
210 - insert(ttInfoDetails_wrap);  
211 -  
212 - update($cid);  
213 -  
214 -end  
215 -  
216 -rule "Calcu_iter_days_normal_day_exist" // 平日匹配(已经在StatInfo中)  
217 - salience 700  
218 - when  
219 - $cid : Calcu_iter_days_result(  
220 - $calcu_date: calcu_date,  
221 - $calcu_weekday: calcu_weekday,  
222 - $calcu_day: calcu_day,  
223 - calcu_day <= calcu_days  
224 - )  
225 - KBaseValidateTimeTable_Fact_TTInfo(  
226 - $tid: id,  
227 - $tname: name,  
228 - $lineVersion: lineVersion,  
229 - specialDayList not contains $calcu_date,  
230 - weekdayList[$calcu_weekday - 1] == Boolean.TRUE  
231 - )  
232 - StatInfo(ttid == $tid)  
233 - then  
234 - // 更新迭代对象  
235 - Integer new_calcu_day = Integer.valueOf($calcu_day + 1);  
236 - $cid.setCalcu_day(new_calcu_day);  
237 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
238 - $cid.setCalcu_date(new_calcu_date);  
239 - $cid.setCalcu_weekday(Integer.valueOf(new_calcu_date.getDayOfWeek()));  
240 -  
241 - LOGGER.debug("启用常规日期时刻表(已经设置过StatInfo):" +  
242 - "时刻表id={} 常规日期={} 星期几={}",  
243 - $tid, $calcu_date, $calcu_weekday);  
244 -  
245 - update($cid);  
246 -  
247 -end  
248 -  
249 -rule "Calcu_iter_days_other_day" // 都没有的情况下,匹配  
250 - salience 500  
251 - when  
252 - $cid : Calcu_iter_days_result(  
253 - $calcu_date: calcu_date,  
254 - $calcu_weekday: calcu_weekday,  
255 - $calcu_day: calcu_day,  
256 - calcu_day <= calcu_days  
257 - )  
258 - not KBaseValidateTimeTable_Fact_TTInfo(  
259 - (specialDayList contains $calcu_date) ||  
260 - (weekdayList[$calcu_weekday - 1] == Boolean.TRUE)  
261 - )  
262 - then  
263 - // 更新迭代对象  
264 - Integer new_calcu_day = Integer.valueOf($calcu_day + 1);  
265 - $cid.setCalcu_day(new_calcu_day);  
266 - DateTime new_calcu_date = $calcu_date.plusDays(1);  
267 - $cid.setCalcu_date(new_calcu_date);  
268 - $cid.setCalcu_weekday(Integer.valueOf(new_calcu_date.getDayOfWeek()));  
269 -  
270 - LOGGER.debug("当前日期没有匹配的时刻表:日期={} 星期几={}", $calcu_date, $calcu_weekday);  
271 -  
272 - update($cid);  
273 -  
274 -end  
275 -  
276 -//-------------- 第三阶段、时刻表明细统计值 ------------//  
277 -  
278 -rule "statinfo_result" // 统计计算结果  
279 - salience 300  
280 - no-loop  
281 - when  
282 - $statInfo: StatInfo($tid: ttid)  
283 - $ttInfoDetails_wrap: TTInfoDetails_wrap(ttInfoId == $tid)  
284 - $allbc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail() from $ttInfoDetails_wrap.getBcInfoList(), count())  
285 - $inbc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType == "in") from $ttInfoDetails_wrap.getBcInfoList(), count())  
286 - $outbc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType == "out") from $ttInfoDetails_wrap.getBcInfoList(), count())  
287 - $yybc: Long() from accumulate (KBaseValidateTimeTable_Fact_TTInfoDetail(bcType != "out", bcType != "in") from $ttInfoDetails_wrap.getBcInfoList(), count())  
288 - $errorbc: Long() from accumulate ($ttd: KBaseValidateTimeTable_Fact_TTInfoDetail() from $ttInfoDetails_wrap.getBcInfoList(), ecount($ttd))  
289 - then  
290 - LOGGER.info("时刻表={},id={},班次数={},进场={},出场={},营运={},错误={}", $statInfo.getTtname(), $statInfo.getTtid(), $allbc, $inbc, $outbc, $yybc, $errorbc);  
291 -  
292 - $statInfo.setAllbc($allbc);  
293 - $statInfo.setInbc($inbc);  
294 - $statInfo.setOutbc($outbc);  
295 - $statInfo.setYybc($yybc);  
296 - $statInfo.setErrorbc($errorbc);  
297 -  
298 - int lineVersion = $ttInfoDetails_wrap.getLineVersion();  
299 - $statInfo.setLineVersion(lineVersion);  
300 -  
301 - rs.getInfos().add($statInfo);  
302 -  
303 -end  
304 -  
305 -  
306 -  
307 -  
src/main/resources/drools/config.properties
@@ -20,5 +20,7 @@ @@ -20,5 +20,7 @@
20 # 排班前置验证规则 20 # 排班前置验证规则
21 # 时刻表验证 21 # 时刻表验证
22 drools.KBase.validate_timetable=drools/KBase/validate/timetable/KBase_validate_timetable.drl 22 drools.KBase.validate_timetable=drools/KBase/validate/timetable/KBase_validate_timetable.drl
  23 +# 规则验证
  24 +drools.KBase.validate_rule=drools/KBase/validate/rule/KBase_validate_rule.drl
23 25
24 26
src/test/java/com/bsth/service/schedule/Plan_0_validateTimetableTest.java renamed to src/test/java/com/bsth/service/schedule/PlanValidateTest.java
@@ -2,9 +2,12 @@ package com.bsth.service.schedule; @@ -2,9 +2,12 @@ package com.bsth.service.schedule;
2 2
3 import com.bsth.BaseTest_junit4; 3 import com.bsth.BaseTest_junit4;
4 import com.bsth.TestApplication; 4 import com.bsth.TestApplication;
  5 +import com.bsth.control_v2.plan_module.common.service.schedule.validate.ValidateRuleResult;
5 import com.bsth.service.schedule.plan.process._1_validate._1_timetable.PlanProcessValidateTimetableService; 6 import com.bsth.service.schedule.plan.process._1_validate._1_timetable.PlanProcessValidateTimetableService;
6 import com.bsth.service.schedule.plan.process._1_validate._1_timetable.PlanProcessValidateTimetableServiceDroolsImpl; 7 import com.bsth.service.schedule.plan.process._1_validate._1_timetable.PlanProcessValidateTimetableServiceDroolsImpl;
7 import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Result; 8 import com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Result;
  9 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.PlanProcessValidateRuleService;
  10 +import com.bsth.service.schedule.plan.process._1_validate._2_rule.PlanProcessValidateRuleServiceDroolsImpl;
8 import org.joda.time.format.DateTimeFormat; 11 import org.joda.time.format.DateTimeFormat;
9 import org.junit.Assert; 12 import org.junit.Assert;
10 import org.junit.Test; 13 import org.junit.Test;
@@ -20,34 +23,39 @@ import java.util.HashMap; @@ -20,34 +23,39 @@ import java.util.HashMap;
20 import java.util.Map; 23 import java.util.Map;
21 24
22 /** 25 /**
23 - * 排班计划,验证时刻表测试。 26 + * 排班计划,前置验证测试。
24 */ 27 */
25 @RunWith(SpringJUnit4ClassRunner.class) 28 @RunWith(SpringJUnit4ClassRunner.class)
26 @SpringApplicationConfiguration(classes = {TestApplication.class}) 29 @SpringApplicationConfiguration(classes = {TestApplication.class})
27 -public class Plan_0_validateTimetableTest extends BaseTest_junit4 { 30 +public class PlanValidateTest extends BaseTest_junit4 {
28 @Override 31 @Override
29 public Map<String, String> getDbunitTestDbFileClassPathMap() { 32 public Map<String, String> getDbunitTestDbFileClassPathMap() {
30 Map<String, String> dbFileMap = new HashMap<>(); 33 Map<String, String> dbFileMap = new HashMap<>();
31 - dbFileMap.put("testCase1", "testdata/_0_validate_timetable.xml"); 34 + dbFileMap.put("_0_validate_timetable_test_case1", "testdata/_0_validate_timetable.xml");
  35 + dbFileMap.put("_1_validate_rule_test_case1", "testdata/_1_validate_rule.xml");
32 return dbFileMap; 36 return dbFileMap;
33 } 37 }
34 38
35 @Autowired 39 @Autowired
36 @Qualifier("kBaseValidateTimetable") 40 @Qualifier("kBaseValidateTimetable")
37 - private KieBase validateTimetableKBase; 41 + private KieBase kBaseValidateTimetable;
  42 +
  43 + @Autowired
  44 + @Qualifier("kBaseValidateRule")
  45 + private KieBase kBaseValidateRule;
38 46
39 @Autowired 47 @Autowired
40 private JdbcTemplate jdbcTemplate; 48 private JdbcTemplate jdbcTemplate;
41 49
42 50
43 @Test 51 @Test
44 - public void testCase1() { 52 + public void _0_validate_timetable_test_case1() {
45 LOG.info("---------------时刻表验证测试--------------"); 53 LOG.info("---------------时刻表验证测试--------------");
46 54
47 // 使用builder创建服务 55 // 使用builder创建服务
48 PlanProcessValidateTimetableService planProcessValidateTimetableService = 56 PlanProcessValidateTimetableService planProcessValidateTimetableService =
49 PlanProcessValidateTimetableServiceDroolsImpl.getBuilder() 57 PlanProcessValidateTimetableServiceDroolsImpl.getBuilder()
50 - .setValidateTimetableKBase(validateTimetableKBase) 58 + .setkBaseValidateTimetable(kBaseValidateTimetable)
51 .setJdbcTemplate(jdbcTemplate) 59 .setJdbcTemplate(jdbcTemplate)
52 .build(); 60 .build();
53 61
@@ -67,4 +75,39 @@ public class Plan_0_validateTimetableTest extends BaseTest_junit4 { @@ -67,4 +75,39 @@ public class Plan_0_validateTimetableTest extends BaseTest_junit4 {
67 new Object[] {4}, 75 new Object[] {4},
68 new Object[] {result.getInfos().size()}); 76 new Object[] {result.getInfos().size()});
69 } 77 }
  78 +
  79 + @Test
  80 + public void _1_validate_rule_test_case1() {
  81 + LOG.info("---------------规则验证测试--------------");
  82 +
  83 + // 使用builder创建服务
  84 + PlanProcessValidateRuleService planProcessValidateRuleService =
  85 + PlanProcessValidateRuleServiceDroolsImpl.getBuilder()
  86 + .setkBaseValidateRule(kBaseValidateRule)
  87 + .setJdbcTemplate(jdbcTemplate)
  88 + .build();
  89 +
  90 + PlanProcessValidateRuleService.Result validateRuleResult = planProcessValidateRuleService.validateRule(
  91 + 1,
  92 + DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime("2019-01-01").toDate(),
  93 + DateTimeFormat.forPattern("yyyy-MM-dd").parseDateTime("2019-01-14").toDate()
  94 + );
  95 +
  96 + Assert.assertArrayEquals(
  97 + "验证结果不一致!",
  98 + new Object[] {
  99 + 1,
  100 + 3,
  101 + 3,
  102 + 0,
  103 + 0
  104 + },
  105 + new Object[] {
  106 + validateRuleResult.getXlId(),
  107 + validateRuleResult.getCount(),
  108 + validateRuleResult.getQyCount(),
  109 + validateRuleResult.getQyErrorCount(),
  110 + validateRuleResult.getErrorInfos().size()
  111 + });
  112 + }
70 } 113 }
src/test/resources/META-INF/drools.packagebuilder.conf
@@ -3,3 +3,5 @@ @@ -3,3 +3,5 @@
3 # kBase_validate_timetable.drl使用 3 # kBase_validate_timetable.drl使用
4 drools.accumulate.function.ecount = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_ErrorBcCount 4 drools.accumulate.function.ecount = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_ErrorBcCount
5 drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateConflict 5 drools.accumulate.function.ac = com.bsth.service.schedule.plan.process._1_validate._1_timetable.drools.KBaseValidateTimeTable_Function_AccumulateConflict
  6 +# kBase_validate_rule.drl使用
  7 +drools.accumulate.function.srif = com.bsth.service.schedule.plan.process._1_validate._2_rule.drools.KBaseValidateRule_Function_ErrorInfo
src/test/resources/testdata/_1_validate_rule.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_sp id="1" xl="1" schedule_from_time="2019-01-01" schedule_to_time="2019-01-10"
  75 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"/>
  76 +
  77 + <!-- 路牌信息 -->
  78 + <bsth_c_s_gbi id="1" xl="1" lp_no="1" lp_name="路牌1" lp_type="普通路牌" is_cancel="0"
  79 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  80 + />
  81 + <bsth_c_s_gbi id="2" xl="1" lp_no="2" lp_name="路牌2" lp_type="普通路牌" is_cancel="0"
  82 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  83 + />
  84 + <bsth_c_s_gbi id="3" xl="1" lp_no="3" lp_name="路牌3" lp_type="普通路牌" is_cancel="0"
  85 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  86 + />
  87 + <bsth_c_s_gbi id="4" xl="1" lp_no="4" lp_name="特1" lp_type="普通路牌" is_cancel="0"
  88 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  89 + />
  90 +
  91 + <!-- 时刻表1信息(平日) -->
  92 + <bsth_c_s_ttinfo id="1" xl="1" name="时刻表1" xl_dir="2" qyrq="2019-01-01" is_enable_dis_template="1"
  93 + is_cancel="0" line_version="1" lp_count = "10" loop_count = "6"
  94 + rule_days="1,1,1,1,1,0,0"
  95 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  96 + />
  97 + <!-- 时刻表2信息(节假日) -->
  98 + <bsth_c_s_ttinfo id="2" xl="1" name="时刻表2" xl_dir="2" qyrq="2019-01-01" is_enable_dis_template="1"
  99 + is_cancel="0" line_version="1" lp_count = "10" loop_count = "6"
  100 + rule_days="0,0,0,0,0,1,1"
  101 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  102 + />
  103 + <!-- 时刻表3信息(特殊日期) -->
  104 + <bsth_c_s_ttinfo id="3" xl="1" name="时刻表3" xl_dir="2" qyrq="2019-01-01" is_enable_dis_template="1"
  105 + is_cancel="0" line_version="1" lp_count = "10" loop_count = "6"
  106 + special_days="2019-01-05,2019-01-06,2019-01-07"
  107 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  108 + />
  109 + <!-- 时刻表明细1信息(3个路牌,5个班次) -->
  110 + <bsth_c_s_ttinfo_detail id="1" xl="1" ttinfo="1" lp="1" fcno="1" xl_dir="0"
  111 + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站"
  112 + fcsj="08:30" bcs="1" jhlc="30" bcsj="30" bc_type="normal"
  113 + line_version="1"
  114 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  115 + />
  116 + <bsth_c_s_ttinfo_detail id="2" xl="1" ttinfo="1" lp="2" fcno="2" xl_dir="0"
  117 + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站"
  118 + fcsj="08:40" bcs="2" jhlc="30" bcsj="30" bc_type="normal"
  119 + line_version="1"
  120 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  121 + />
  122 + <bsth_c_s_ttinfo_detail id="3" xl="1" ttinfo="1" lp="3" fcno="3" xl_dir="0"
  123 + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站"
  124 + fcsj="08:50" bcs="3" jhlc="30" bcsj="30" bc_type="normal"
  125 + line_version="1"
  126 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  127 + />
  128 + <bsth_c_s_ttinfo_detail id="4" xl="1" ttinfo="1" lp="1" fcno="4" xl_dir="1"
  129 + qdz_code="#3" qdz_name="下行起点站" zdz_code="#4" zdz_name="下行终点站"
  130 + fcsj="09:10" bcs="4" jhlc="30" bcsj="30" bc_type="normal"
  131 + line_version="1"
  132 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  133 + />
  134 + <bsth_c_s_ttinfo_detail id="5" xl="1" ttinfo="1" lp="2" fcno="5" xl_dir="1"
  135 + qdz_code="#3" qdz_name="下行起点站" zdz_code="#4" zdz_name="下行终点站"
  136 + fcsj="09:20" bcs="5" jhlc="30" bcsj="30" bc_type="normal"
  137 + line_version="1"
  138 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  139 + />
  140 + <!-- 时刻表明细2信息(2个路牌,2个班次) -->
  141 + <bsth_c_s_ttinfo_detail id="6" xl="1" ttinfo="2" lp="1" fcno="1" xl_dir="0"
  142 + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站"
  143 + fcsj="08:30" bcs="1" jhlc="30" bcsj="30" bc_type="normal"
  144 + line_version="1"
  145 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  146 + />
  147 + <bsth_c_s_ttinfo_detail id="7" xl="1" ttinfo="2" lp="2" fcno="2" xl_dir="0"
  148 + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站"
  149 + fcsj="08:40" bcs="2" jhlc="30" bcsj="30" bc_type="normal"
  150 + line_version="1"
  151 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  152 + />
  153 + <!-- 时刻表明细3信息(1个路牌,1个班次) -->
  154 + <bsth_c_s_ttinfo_detail id="8" xl="1" ttinfo="3" lp="4" fcno="1" xl_dir="0"
  155 + qdz_code="#1" qdz_name="上行起点站" zdz_code="#2" zdz_name="上行终点站"
  156 + fcsj="08:30" bcs="1" jhlc="30" bcsj="30" bc_type="normal"
  157 + line_version="1"
  158 + create_by="1" create_date="2019-02-01" update_by="1" update_date="2019-02-01"
  159 + />
  160 +
  161 + <!-- 线路1规则信息 -->
  162 + <bsth_c_s_sr1_flat id="1" xl="1" car_config_info="1" qyrq="2019-01-01"
  163 + lp_names="路牌1" lp_ids="1" lp_start="1"
  164 + ry_dbbms="1,2" ry_config_ids="1,2" ry_start="1"
  165 + fbtype="0"
  166 + />
  167 + <bsth_c_s_sr1_flat id="2" xl="1" car_config_info="2" qyrq="2019-01-01"
  168 + lp_names="路牌2" lp_ids="2" lp_start="1"
  169 + ry_dbbms="3,4" ry_config_ids="3,4" ry_start="1"
  170 + fbtype="0"
  171 + />
  172 + <bsth_c_s_sr1_flat id="3" xl="1" car_config_info="3" qyrq="2019-01-01"
  173 + lp_names="路牌3" lp_ids="3" lp_start="1"
  174 + ry_dbbms="5-78,6" ry_config_ids="5-7,6" ry_start="1"
  175 + fbtype="0"
  176 + />
  177 +
  178 +</dataset>