SchedulePlanServiceImpl.java 3.42 KB
package com.bsth.service.schedule;

import com.bsth.entity.schedule.SchedulePlan;
import com.bsth.entity.schedule.rule.ScheduleRule1Flat;
import com.bsth.service.impl.BaseServiceImpl;
import com.bsth.service.schedule.rules.shiftloop.ScheduleCalcuParam_input;
import com.bsth.service.schedule.rules.shiftloop.ScheduleResults_output;
import com.bsth.service.schedule.rules.shiftloop.ScheduleRule_input;
import org.kie.api.KieBase;
import org.kie.api.runtime.KieSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

/**
 * Created by xu on 16/6/16.
 */
@Service
public class SchedulePlanServiceImpl extends BaseServiceImpl<SchedulePlan, Long> implements SchedulePlanService {
    @Autowired
    private KieBase kieBase;
    @Autowired
    private ScheduleRule1FlatService scheduleRule1FlatService;

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
    @Override
    public Map<String, Object> save(SchedulePlan schedulePlan) {
        // 查询参数
        Map<String, Object> param = new HashMap<>();

        // 1、查出指定线路的所有规则
        param.clear();
        param.put("xl.id_eq", schedulePlan.getXl().getId());
        Iterable<ScheduleRule1Flat> scheduleRule1FlatIterable = scheduleRule1FlatService.list(param);
        if (!scheduleRule1FlatIterable.iterator().hasNext())
            throw new RuntimeException("线路:" + schedulePlan.getXl().getName() + " 没有配置规则!");

        // 2-1、构造drools规则输入数据,输出数据
        // 全局计算参数
        ScheduleCalcuParam_input scheduleCalcuParam_input = new ScheduleCalcuParam_input(schedulePlan);
        // 每个规则对应的输入参数
        List<ScheduleRule_input> scheduleRule_inputs = new ArrayList<>();
        Iterator<ScheduleRule1Flat> scheduleRule1FlatIterator = scheduleRule1FlatIterable.iterator();
        while (scheduleRule1FlatIterator.hasNext()) {
            ScheduleRule1Flat scheduleRule1Flat_temp = scheduleRule1FlatIterator.next();
            ScheduleRule_input scheduleRule_input = new ScheduleRule_input(scheduleRule1Flat_temp);
            scheduleRule_inputs.add(scheduleRule_input);
        }
        // 规则输出数据
        ScheduleResults_output scheduleResults_output = new ScheduleResults_output();

        // 2-2、构造drools session->载入数据->启动规则->计算->销毁session
        // 创建session,内部配置的是stateful
        KieSession session = kieBase.newKieSession();
        // 设置gloable对象,在drl中通过别名使用
        session.setGlobal("scheduleResult", scheduleResults_output);
        // 载入数据
        session.insert(scheduleCalcuParam_input);
        for (ScheduleRule_input scheduleRule_input : scheduleRule_inputs) {
            session.insert(scheduleRule_input);
        }
        // 执行rule
        session.fireAllRules();

        // 执行完毕销毁,有日志的也要关闭
        session.dispose();


        // TODO:

        System.out.println(scheduleResults_output.showGuideboardDesc1());

        return null;

//        return super.save(schedulePlan);
    }
}