plan.drl 7.45 KB
package com.bsth.service.schedule.plan;

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

import com.bsth.service.schedule.rules.plan.PlanCalcuParam_input;
import com.bsth.service.schedule.rules.plan.PlanResult;

import com.bsth.service.schedule.TTInfoService;
import com.bsth.service.schedule.TTInfoDetailService;
import com.bsth.service.schedule.CarConfigInfoService;
import com.bsth.service.schedule.EmployeeConfigInfoService;
import com.bsth.service.schedule.rules.shiftloop.ScheduleResult_output;
import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
import com.bsth.service.schedule.rules.ttinfo.TTInfoResult_output;
import com.bsth.service.schedule.rules.ttinfo.TTInfoResults_output;

import com.bsth.entity.schedule.CarConfigInfo;
import com.bsth.entity.schedule.EmployeeConfigInfo;
import com.bsth.entity.schedule.TTInfo;
import com.bsth.entity.schedule.TTInfoDetail;
import com.bsth.entity.schedule.SchedulePlanInfo;

import org.slf4j.Logger;


// 全局日志类(一般使用调用此规则的service类)
global Logger log;
global TTInfoDetailService tTInfoDetailService;
global TTInfoService tTInfoService;
global CarConfigInfoService carConfigInfoService;
global EmployeeConfigInfoService employeeConfigInfoService;

// 输出
global PlanResult planResult;

function Map ttidParams(String ttid) {
    Map param = new HashMap();
    param.put("ttinfo.id_eq", Long.parseLong(ttid));
    return param;
}

function Map xlidParams(Integer xlid) {
    Map param = new HashMap();
    param.put("xl.id_eq", xlid);
    return param;
}

/*
    规则说明:
    1、根据循环规则输出,时刻表选择规则输出,计算排班明细
*/

//-------------------- 第一阶段、计算迭代数据 -----------------//
declare Loop_result
    xlId: Integer // 线路id
    ruleLoop: List // 每天分配的规则 List<ScheduleResult_output>
    ttInfoMapLoop_temp: Map // 每天分配的时刻表 Map<DataTime, Collection<TTInfoResult_output>>
    ttInfoMapLoop: Map // 每天分配的时刻表 Map<DataTime, TTInfoResult_output>

    ttInfoMap: Map // 总共用到的时刻表 Map<id, TTInfoResult_output>
end

rule "calcu_step1_Loop_result"
    salience 1000
    when
        $param: PlanCalcuParam_input($xlId: xlId)
    then
        Loop_result loop_result = new Loop_result();
        loop_result.setXlId($xlId);
        loop_result.setRuleLoop($param.getScheduleResults_output().getResults());

        loop_result.setTtInfoMapLoop(new HashMap());
        loop_result.setTtInfoMap(new HashMap());

        com.google.common.collect.Multimap ttInfoMap_temp =
                    (com.google.common.collect.Multimap)
                        $param.getTtInfoResults_output().getResults().get(
                            String.valueOf($xlId));

        loop_result.setTtInfoMapLoop_temp(ttInfoMap_temp.asMap());

        insert(loop_result);

        log.info("calcu_step1_Loop_result");
end

rule "calcu_step2_loop_result"
    salience 1000
    no-loop
    when
        $param: PlanCalcuParam_input($xlId: xlId)
        $lr: Loop_result(xlId == $xlId)
        $sd: DateTime() from $lr.ttInfoMapLoop_temp.keySet()
    then
        // 当天时刻表只取第一张 TODO:
        Collection col = (Collection) $lr.getTtInfoMapLoop_temp().get($sd);
        Iterator iter = col.iterator();
        TTInfoResult_output ttInfo_result = (TTInfoResult_output) iter.next();
        $lr.getTtInfoMapLoop().put($sd, ttInfo_result);

        // 总共使用的时刻表
        $lr.getTtInfoMap().put(ttInfo_result.getTtInfoId(), ttInfo_result);

        update($lr);
end

//-------------------- 第二阶段、将时刻表班次,车辆配置,人员配置信息载入 -----------------//

declare TTInfoDetail_Wrap
    ttInfoId: String // 时刻表id(cast字符串-方便比较)
    gid: String // 路牌id(cast字符串-方便比较)

    self: TTInfoDetail // 原始数据
end

rule "calcu_TTInfoDetail_Wrap"
    salience 800
    when
        $lr: Loop_result($xlId: xlId)
        $ttInfoId: String() from $lr.getTtInfoMap().keySet()
        $ttInfoDetail: TTInfoDetail() from tTInfoDetailService.list(ttidParams($ttInfoId))
    then
        TTInfoDetail_Wrap ttInfoDetail_wrap = new TTInfoDetail_Wrap();
        ttInfoDetail_wrap.setTtInfoId($ttInfoId);
        ttInfoDetail_wrap.setGid(String.valueOf($ttInfoDetail.getLp().getId()));
        ttInfoDetail_wrap.setSelf($ttInfoDetail);

//        log.info("时刻表id={}", $ttInfoId);
//        log.info("时刻表明细id={}", $ttInfoDetail.getId());

        insert(ttInfoDetail_wrap);
end

declare CarConfig_Wrap
    id: String // 车辆配置id(cast字符串-方便比较)

    self: CarConfigInfo // 原始数据
end

rule "calcu_CarConfig_Wrap"
    salience 800
    when
        $lr: Loop_result($xlId: xlId)
        $ccf: CarConfigInfo() from carConfigInfoService.list(xlidParams($xlId))
    then
        CarConfig_Wrap carConfig_wrap = new CarConfig_Wrap();
        carConfig_wrap.setId(String.valueOf($ccf.getId()));
        carConfig_wrap.setSelf($ccf);

        insert(carConfig_wrap);
end

declare EmployeeConfig_Wrap
    id: String // 人员配置id(cast字符串-方便比较)

    self: EmployeeConfigInfo // 原始数据
end

rule "calcu_EmployeeConfig_Wrap"
    salience 800
    when
        $lr: Loop_result($xlId: xlId)
        $eci: EmployeeConfigInfo() from employeeConfigInfoService.list(xlidParams($xlId))
    then
        EmployeeConfig_Wrap employeeConfig_wrap = new EmployeeConfig_Wrap();
        employeeConfig_wrap.setId(String.valueOf($eci.getId()));
        employeeConfig_wrap.setSelf($eci);

        insert(employeeConfig_wrap);
end

declare ScheduleResult_output_Wrap
    xlId: Integer // 线路id
    sd: DateTime // 日期
    ruleId: String // 规则Id
    eciIds: List // 人员配置ids

    self: ScheduleResult_output // 原始数据
end

rule "calcu_ScheduleResult_output_Wrap"
    salience 800
    when
        $lr: Loop_result($xlId: xlId)
        $sro: ScheduleResult_output() from $lr.getRuleLoop()
    then
        ScheduleResult_output_Wrap scheduleResult_output_wrap = new ScheduleResult_output_Wrap();
        scheduleResult_output_wrap.setXlId($xlId);
        scheduleResult_output_wrap.setSd($sro.getSd());
        scheduleResult_output_wrap.setRuleId($sro.getRuleId());
        scheduleResult_output_wrap.setEciIds(Arrays.asList(
            $sro.getEmployeeConfigId().split("-")));
        scheduleResult_output_wrap.setSelf($sro);

        insert(scheduleResult_output_wrap);
end

//-------------------- 第三阶段、合并计算SchedulePlanInfo -----------------//

// TODO:暂时不考虑分班

//rule "Calcu_SchedulePlanInfo"
//    salience 600
//    when
//        $lr: Loop_result($xlId: xlId)
//        $sro: ScheduleResult_output($sd: sd) from $lr.getRuleLoop()
//        ScheduleResult_output_Wrap(
//            xlId == $xlId, sd == $sro.sd, ruleId == $sro.ruleId,
//            $eciIds: eciIds, $sr: self)
//        $ecId: String() from $eciIds
//        CarConfig_Wrap(id == $sro.carConfigId, $cc: self)
//        EmployeeConfig_Wrap(id == $ecId, $ec: self)
//        TTInfoDetail_Wrap(
//            ttInfoId == ((TTInfoResult_output) $lr.getTtInfoMapLoop($sd)).,
//            gid == $sr.guideboardId,
//            $ttInfoDetail: self
//        )
//    then
//        log.info("Calcu_SchedulePlanInfo");
//
//end