ttinfo.drl 5.72 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 // 结束计算日期
end

rule "calcu_days"
    when
        TTInfoCalcuParam_input($fromDate : fromDate, $toDate : toDate, $fromDate.isBefore($toDate))
    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));

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

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

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

declare Calcu_ttinfo_enable_result
    xlid : String // 线路id
    ttid : String // 时刻表id
    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)
        $tTInfo_input : TTInfo_input($xlid : xlId, $ttid : ttInfoId, isEnable == true)
    then
        // 构造Calcu_ttinfo_enable_result对象,进行下一步计算
        Calcu_ttinfo_enable_result cter = new Calcu_ttinfo_enable_result();
        cter.setXlid($xlid);
        cter.setTtid($ttid);
        cter.setCalcu_date($calcu_date);

        log.info("启用的时刻表:xlid={} ttid={} 计算日期={}", $xlid, $ttid, $calcu_date);

        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)
        $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, $calcu_day : calcu_day)
        $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlid, isEnable == true, specialDays contains $calcu_date))
    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);

        // result输出
        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)
        $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
        $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlid, isEnable == true, specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == true))
    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);

        // result输出
        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)
        $calcu_days_result : Calcu_days_result(calcu_date == $calcu_date, $calcu_day : calcu_day, $calcu_weekday : calcu_weekday)
        $ttinfolist : ArrayList(size >= 1) from collect (TTInfo_input(xlId == $xlid, isEnable == true, specialDays not contains $calcu_date, weekdays[$calcu_weekday - 1] == false))
    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);

        // result输出
        results.addXlTTInfos($xlid, $calcu_date, $ttinfolist);

        update($calcu_days_result);

end