ChildTaskPlanServiceImpl.java 9.89 KB
package com.bsth.service.realcontrol.impl;

import com.bsth.common.ResponseCode;
import com.bsth.data.BasicData;
import com.bsth.data.Station2ParkBuffer;
import com.bsth.data.schedule.DayOfSchedule;
import com.bsth.entity.realcontrol.ChildTaskPlan;
import com.bsth.entity.realcontrol.ScheduleRealInfo;
import com.bsth.repository.realcontrol.ChildTaskPlanRepository;
import com.bsth.repository.realcontrol.ScheduleRealInfoRepository;
import com.bsth.service.impl.BaseServiceImpl;
import com.bsth.service.realcontrol.ChildTaskPlanService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

@Service
public class ChildTaskPlanServiceImpl extends BaseServiceImpl<ChildTaskPlan, Long> implements ChildTaskPlanService {

    @Autowired
    ScheduleRealInfoRepository scheduleRealInfoRepository;

    @Autowired
    ChildTaskPlanRepository childTaskPlanRepository;

    @Autowired
    DayOfSchedule dayOfSchedule;

    @Autowired
    JdbcTemplate jdbcTemplate;

    Logger logger = LoggerFactory.getLogger(this.getClass());

    @Transactional
    @Override
    public Map<String, Object> save(ChildTaskPlan t) {

        Map<String, Object> rs = new HashMap();
        try {
            ScheduleRealInfo sch = dayOfSchedule.get(t.getSchedule().getId());
            //保存起终点名称
            if(StringUtils.isEmpty(t.getStartStationName()))
                t.setStartStationName(getStationName(sch.getXlBm(), t.getStartStation()));

            if(StringUtils.isEmpty(t.getEndStationName()))
                t.setEndStationName(getStationName(sch.getXlBm(), t.getEndStation()));
            if(t.getDestroyReason() == null)
                t.setDestroyReason("");

            //烂班说明,为兼容之前的数据结构
            if(t.isDestroy() && StringUtils.isEmpty(t.getDestroyReason()))
                t.setDestroyReason(t.getReason());

            //中途换车出场子任务,级联生成一个主任务,供报表和对外接口计算用
            if(StringUtils.isNotEmpty(t.getNbbm())){
                ScheduleRealInfo ccServiceSch = new ScheduleRealInfo();
                ccServiceSch.setSflj(sch.isSflj());
                ccServiceSch.setjGh(sch.getjGh());
                ccServiceSch.setjName(sch.getjName());
                ccServiceSch.setsGh(sch.getsGh());
                ccServiceSch.setsName(sch.getsName());
                ccServiceSch.setGsBm(sch.getGsBm());
                ccServiceSch.setFgsBm(sch.getFgsBm());
                ccServiceSch.setGsName(sch.getGsName());
                ccServiceSch.setFgsName(sch.getFgsName());
                ccServiceSch.setLpName(sch.getLpName());
                ccServiceSch.setXlBm(sch.getXlBm());
                ccServiceSch.setXlName(sch.getXlName());
                ccServiceSch.setXlDir(sch.getXlDir());
                ccServiceSch.setScheduleDate(sch.getScheduleDate());
                ccServiceSch.setScheduleDateStr(sch.getScheduleDateStr());
                ccServiceSch.setRealExecDate(sch.getRealExecDate());

                ccServiceSch.setId(dayOfSchedule.getId());
                ccServiceSch.setSpId(null);
                ccServiceSch.setClZbh(t.getNbbm());
                ccServiceSch.setCcService(true);
                ccServiceSch.setFcsj(t.getStartDate());
                ccServiceSch.setDfsj(t.getStartDate());
                ccServiceSch.setZdsj(t.getEndDate());
                ccServiceSch.setBcsj(0);
                ccServiceSch.setJhlcOrig(Double.parseDouble(String.valueOf(t.getMileage())));
                ccServiceSch.setJhlc(ccServiceSch.getJhlcOrig());
                ccServiceSch.setQdzCode(t.getStartStation());
                ccServiceSch.setZdzCode(t.getEndStation());
                ccServiceSch.setQdzName(t.getStartStationName());
                ccServiceSch.setZdzName(t.getEndStationName());
                ccServiceSch.setFcsjActual(ccServiceSch.getDfsj());
                ccServiceSch.setZdsjActual(ccServiceSch.getZdsj());
                ccServiceSch.setRemarks(t.getRemarks());
                ccServiceSch.setStatus(2);
                ccServiceSch.setCreateDate(new Date());
                if("1".equals(t.getType2())){
                    ccServiceSch.setBcType("normal");
                }
                else {
                    if("2".equals(t.getType2()))
                        ccServiceSch.setBcType("in");
                    else if("3".equals(t.getType2()))
                        ccServiceSch.setBcType("out");
                }
                //实时入库
                ccServiceSch = scheduleRealInfoRepository.save(ccServiceSch);
                t.setCcId(ccServiceSch.getId());
            }

            //先持久化子任务
            rs = super.save(t);
            //关联主任务
            sch.getcTasks().add(t);
            dayOfSchedule.save(sch);
            //站到场对照
            t.setSchedule(sch);
            Station2ParkBuffer.put(t);

            rs.put("status", ResponseCode.SUCCESS);
            rs.put("t", sch);
        }catch (Exception e){
            logger.error("", e);
            rs.put("status", ResponseCode.ERROR);
            rs.put("msg",  e.getMessage());
        }
        return rs;
    }

    @Override
    public Map<String, Object> update(ChildTaskPlan t) {
        Map<String, Object> rs = new HashMap();
        try {
            ScheduleRealInfo sch = dayOfSchedule.get(t.getSchedule().getId());
            //保存起终点名称
            if(StringUtils.isEmpty(t.getStartStationName()))
                t.setStartStationName(getStationName(sch.getXlBm(), t.getStartStation()));

            if(StringUtils.isEmpty(t.getEndStationName()))
                t.setEndStationName(getStationName(sch.getXlBm(), t.getEndStation()));
            if(t.getDestroyReason() == null)
                t.setDestroyReason("");


            //根据id 获取原对象
            ChildTaskPlan task = null;
            Set<ChildTaskPlan> set = sch.getcTasks();
            for(ChildTaskPlan obj : set){
                if(obj.getId() == t.getId()){
                    task = obj;
                    break;
                }
            }

            if(null == task){
                rs.put("status", ResponseCode.ERROR);
                rs.put("msg",  "失败,服务端无法定位到数据!");
                return rs;
            }
            //更新字段
            task.setStartStation(t.getStartStation());
            task.setStartStationName(t.getStartStationName());
            task.setEndStation(t.getEndStation());
            task.setEndStationName(t.getEndStationName());
            task.setStartDate(t.getStartDate());
            task.setEndDate(t.getEndDate());
            task.setMileageType(t.getMileageType());
            task.setMileage(t.getMileage());
            task.setDestroy(t.isDestroy());
            task.setDestroyReason(t.getReason());
            task.setReason(t.getReason());
            task.setType1(t.getType1());
            task.setType2(t.getType2());
            task.setNoClerk(t.isNoClerk());
            task.setRemarks(t.getRemarks());

            //更新数据库
            super.save(task);

            rs.put("status", ResponseCode.SUCCESS);
            rs.put("t", sch);
        }catch (Exception e){
            logger.error("", e);
            rs.put("status", ResponseCode.ERROR);
            rs.put("msg",  e.getMessage());
        }
        return rs;
    }

    private String getStationName(String lineCode, String stationCode){
        String name;
        String prefix1 = lineCode + "_" + 0 + "_",
                prefix2 = lineCode + "_" + 1 + "_";

        name = BasicData.getStationNameByCode(stationCode, prefix1);
        if(StringUtils.isEmpty(name))
            name = BasicData.getStationNameByCode(stationCode, prefix2);
        return name;
    }

    @Override
    public Map<String, Object> delete(Long id) {
        Map<String, Object> rs;

        ChildTaskPlan cPlan = childTaskPlanRepository.findOne(id);

        //删除子任务
        rs = super.delete(id);

        //删除级联生成的换车主任务
        if(null != cPlan.getCcId()){
            scheduleRealInfoRepository.delete(cPlan.getCcId());
        }
        //dayOfSchedule.save(sch);
        //解除和主任务关联
        ScheduleRealInfo sch = dayOfSchedule.get(cPlan.getSchedule().getId());
        sch.getcTasks().remove(cPlan);
        rs.put("t", sch);
        return rs;
    }

    @Override
    public Map<String, Object> saveHistory(ChildTaskPlan t) {
        Map<String, Object> rs = new HashMap();
        try {
            ScheduleRealInfo sch = t.getSchedule();
            //保存起终点名称
            String prefix = sch.getXlBm() + "_" + sch.getXlDir() + "_";
            if(StringUtils.isEmpty(t.getStartStationName()))
                t.setStartStationName(BasicData.getStationNameByCode(t.getStartStation(), prefix));

            if(StringUtils.isEmpty(t.getEndStationName()))
                t.setEndStationName(BasicData.getStationNameByCode(t.getEndStation(), prefix));
            //先持久化子任务
            rs = super.save(t);

            rs.put("status", ResponseCode.SUCCESS);
        }catch (Exception e){
            logger.error("", e);
            rs.put("status", ResponseCode.ERROR);
            rs.put("msg",  e.getMessage());
        }
        return rs;
    }

    @Override
    public Map<String, Object> delHistory(Long id) {
        return super.delete(id);
    }
}