ttinfo.drl 9.15 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 com.bsth.service.schedule.rules.ttinfo.LpInfoResult_output;
import com.bsth.service.schedule.rules.ttinfo.LpInfoResults_output;

import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;

import com.bsth.repository.schedule.TTInfoDetailRepository;

import com.bsth.entity.schedule.TTInfo;
import com.bsth.entity.schedule.TTInfoDetail;

import org.slf4j.Logger

// 全局日志
global Logger log;
// repostory
global TTInfoDetailRepository tTInfoDetailRepository;
// return输出
global TTInfoResults_output results
global LpInfoResults_output lpInfoResults_output

function Long ttidParams(List ttinfolist) {
    // 获取第一张时刻表id
    TTInfo_input ttInfo_input = (TTInfo_input) ttinfolist.get(0);
    return Long.parseLong(ttInfo_input.getTtInfoId());
}

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

//----------------- pre 预处理 param对象 -----------------------//

rule "pre_calcu_TTInfoCalcuParam_input"
    no-loop
    salience 1000
    when
        $ttp: TTInfoCalcuParam_input($xlId : xlId)
        $minqyrq: DateTime() from accumulate ($sri: ScheduleRule_input(xlId == $xlId), minruleqyrq($sri))
    then
        $ttp.setFromDate($minqyrq);
        update($ttp);
end

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

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,
            $xlId : xlId,
            $fromDate.isBefore($toDate) || $fromDate.isEqual($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));
        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)
        $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))
    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);

        // lp输出
        for (int i = 0; i < $lpInfoResults.size(); i++) {
            LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
            lpInfoResult_output.setDateTime($calcu_date); // 设定时间
            lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
        }

        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)
        $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))
    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={} 时刻表个数={} 常规日期={} 星期几={} 路牌size={}", $xlId, $ttinfolist.size(), $calcu_date, $calcu_weekday, $lpInfoResults.size());

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

        // lp输出
        for (int i = 0; i < $lpInfoResults.size(); i++) {
            LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
            lpInfoResult_output.setDateTime($calcu_date); // 设定时间
            lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
        }

        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)
        $lpInfoResults: List() from accumulate ($ttd: TTInfoDetail() from tTInfoDetailRepository.findByTtinfoId(ttidParams($ttinfolist)), lpinforesult($ttd))
    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);

        // lp输出
        for (int i = 0; i < $lpInfoResults.size(); i++) {
            LpInfoResult_output lpInfoResult_output = (LpInfoResult_output) $lpInfoResults.get(i);
            lpInfoResult_output.setDateTime($calcu_date); // 设定时间
            lpInfoResults_output.getLpInfoResult_outputs().add(lpInfoResult_output);
        }

        update($calcu_days_result);

end