ttinfo.drl 6.47 KB
package com.bsth.service.schedule.ttinfo;

import org.joda.time.*;
import java.util.*;

import com.bsth.service.schedule.rules.ttinfo.TTInfoCalcuParam_input;
import com.bsth.service.schedule.rules.ttinfo.TTInfo_input;
import com.bsth.service.schedule.rules.ttinfo.TTInfoResult_output;
import com.bsth.service.schedule.rules.ttinfo.TTInfoResults_output;

import org.slf4j.Logger;

// 全局日志
global Logger log;
// return输出
global TTInfoResults_output results


/*
    TODO:规则说明,以后待说明
*/

//----------------- 第一阶段、计算规则准备数据(天数)----------------//

declare Calcu_days_result
    calcu_day : Integer // 该计算第几天
    calcu_weekday : Integer // 星期几(1到7)
    calcu_date : DateTime // 该计算的具体日期
    calcu_days : Integer // 总共需要计算的天数
    calcu_start_date : DateTime // 开始计算日期
    calcu_end_date : DateTime // 结束计算日期
    xlId : String // 线路Id
end

rule "calcu_days"
    when
        TTInfoCalcuParam_input($fromDate : fromDate, $toDate : toDate, $fromDate.isBefore($toDate), $xlId : xlId)
    then
        // 构造Calcu_days_result对象,进行下一阶段计算
        Calcu_days_result cdr = new Calcu_days_result();
        Period p = new Period($fromDate, $toDate, PeriodType.days());

        cdr.setCalcu_day(1);
        cdr.setCalcu_date($fromDate);
        cdr.setCalcu_days(p.getDays() + 1);
        cdr.setCalcu_weekday($fromDate.getDayOfWeek());
        cdr.setCalcu_start_date($fromDate);
        cdr.setCalcu_end_date(($toDate));
        cdr.setXlId($xlId);

        log.info("总共需要计算的天数 calcu_days={} 之后的计算从第1天开始 ", p.getDays() + 1);

        insert(cdr); // 插入fact数据,进入下一个阶段
end

//----------------- 第二阶段、判定时刻表是否启用 ----------------//

declare Calcu_ttinfo_enable_result
    xlId : String // 线路id
    ttInfo_input_list : ArrayList // 可用时刻表列表
    calcu_date : DateTime // 计算日期
end

rule "calcu_ttinfo_enable"
    salience 900
    when
        $calcu_days_result : Calcu_days_result($calcu_date : calcu_date, calcu_day <= calcu_days, $xlId : xlId)
        $ttInfo_input_list : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlId, isEnable == true))
    then
        // 构造Calcu_ttinfo_enable_result对象,进行下一步计算
        Calcu_ttinfo_enable_result cter = new Calcu_ttinfo_enable_result();
        cter.setXlId($xlId);
        cter.setTtInfo_input_list($ttInfo_input_list);
        cter.setCalcu_date($calcu_date);

        log.info("启用的时刻表:xlId={} 时刻表个数={}", $xlId, $ttInfo_input_list.size());

        insert (cter);

end

//----------------- 第三阶段、时刻表的日期匹配 -------------------//

rule "calcu_ttinfo_special_day" // 特殊日期匹配
    salience 800
    when
        $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
        $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day)
        $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays contains $calcu_date) from $ttInfo_input_list)
    then
        // 更新Calcu_days_result对象
        int new_calcu_day = $calcu_day + 1;
        $calcu_days_result.setCalcu_day(new_calcu_day);
        DateTime new_calcu_date = $calcu_date.plusDays(1);
        $calcu_days_result.setCalcu_date(new_calcu_date);
        $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());

        log.info("启用特殊日期时刻表:xlId={} 时刻表个数={} 特殊日期={}", $xlId, $ttinfolist.size(), $calcu_date);

        // $ttinfolist按时间倒排序,result输出
        Collections.sort($ttinfolist);
        results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);

        update($calcu_days_result);
end

rule "calcu_ttinfo_normal_day" // 平日匹配
    salience 700
    when
        $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
        $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
        $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == true) from $ttInfo_input_list)
    then
        // 更新Calcu_days_result对象
        int new_calcu_day = $calcu_day + 1;
        $calcu_days_result.setCalcu_day(new_calcu_day);
        DateTime new_calcu_date = $calcu_date.plusDays(1);
        $calcu_days_result.setCalcu_date(new_calcu_date);
        $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());

        log.info("启用常规日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday);

        // $ttinfolist按时间倒排序,result输出
        Collections.sort($ttinfolist);
        results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);

        update($calcu_days_result);
end

rule "calcu_ttinfo_other_day" // 都没有的情况下,匹配
    salience 500
    when
        $calcu_ttinfo_enable_result : Calcu_ttinfo_enable_result($xlId : xlId, $calcu_date : calcu_date, $ttInfo_input_list : ttInfo_input_list)
        $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, xlId == $xlId, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
        $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == false) from $ttInfo_input_list)
    then
        // 更新Calcu_days_result对象
        int new_calcu_day = $calcu_day + 1;
        $calcu_days_result.setCalcu_day(new_calcu_day);
        DateTime new_calcu_date = $calcu_date.plusDays(1);
        $calcu_days_result.setCalcu_date(new_calcu_date);
        $calcu_days_result.setCalcu_weekday(new_calcu_date.getDayOfWeek());

        log.info("启用默认日期时刻表:xlId={} 时刻表个数={} 常规日期={} 星期几={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday);

        // $ttinfolist按时间倒排序,result输出
        Collections.sort($ttinfolist);
        results.addXlTTInfos($xlId, $calcu_date, $ttinfolist);

        update($calcu_days_result);

end