RealAttendaceHandler.java 3.47 KB
package com.bsth.data.attendance;

import com.bsth.data.abnormal.MainAbnormalClient;
import com.bsth.data.abnormal.entity.AbnormalEntity;
import com.bsth.data.abnormal.rate_chart.RateNCalculator;
import com.bsth.data.attendance.entity.JsyAttendance;
import com.bsth.data.schedule.dto.ScheduleInOut;
import com.bsth.data.schedule.real.ScheduleComparator;
import com.bsth.data.schedule.real.ScheduleDataBuffer;
import com.bsth.websocket.handler.SendUtils;
import com.google.common.collect.ArrayListMultimap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 实时签到退数据管理
 * Created by panzhao on 2018/3/27.
 */
@Component
public class RealAttendaceHandler {

    @Autowired
    SendUtils sendUtils;

    @Autowired
    MainAbnormalClient mainAbnormalClient;

    /**
     * K:工号 V:签到信息
     */
    private static ArrayListMultimap<String, JsyAttendance> qdListMap;

    static {
        qdListMap = ArrayListMultimap.create();
    }

    /**
     * 签到
     */
    public void attendace(JsyAttendance att){
        qdListMap.put(att.getUserId(), att);
        //驾驶员的出场计划
        ScheduleInOut sio = ScheduleDataBuffer.getCurrExecOut(att.getCompany(), att.getUserId(), att.getAt());

        //报到时间不覆盖
        if (sio.getAttSjTime() != null)
            return;

        sio.setAttSjTime(att.getAt());
        //处理掉相关异常
        AbnormalEntity ae = mainAbnormalClient.qiandao(sio, att);

        //通知页面
        sendUtils.scheduleAttendace(sio, ae);

        //重新计算签到准点率
        if(RateNCalculator.calcBdzdRateNo())
            sendUtils.sendAllRates();
    }

    /**
     * 重新匹配驾驶员报到时间
     * @param jGh1
     * @param jGh2
     */
    public void reCalcOutSignal(String company, String jGh1, String jGh2) {
        //获取驾驶员的出场计划
        List<ScheduleInOut> arrayA = ScheduleDataBuffer.getOutsByUserId(company, jGh1)
                , arrayB = ScheduleDataBuffer.getOutsByUserId(company, jGh2);

        reCalcOutSignal(arrayA);
        reCalcOutSignal(arrayB);
    }

    private void reCalcOutSignal(List<ScheduleInOut> list) {
        if (null == list || list.size() == 0)
            return;

        //清空班次上的签到时间
        for (ScheduleInOut sio : list)
            sio.setAttSjTime(null);

        List<JsyAttendance> atts = qdListMap.get(list.get(0).getjGh());

        if (null == atts || atts.size() == 0)
            return;

        Collections.sort(list, new ScheduleComparator());
        Collections.sort(atts, new AttendanceComp());

        for (JsyAttendance att : atts) {

            for (ScheduleInOut sio : list)
                matchJh2Sj(att, sio);
        }
    }

    /**
     * 匹配计划和实际
     *
     * @param att
     * @param sio
     */
    private void matchJh2Sj(JsyAttendance att, ScheduleInOut sio) {
        if(Math.abs(att.getAttTime().getTime() - sio.getAttJhTime()) > ScheduleDataBuffer.SPACE_THRESHOLD)
            return;//2小时内

        if (null == sio.getOutTimeRfid())
            sio.setAttSjTime(att.getAttTime().getTime());
    }

    class AttendanceComp implements Comparator<JsyAttendance>{

        @Override
        public int compare(JsyAttendance o1, JsyAttendance o2) {
            return (int) (o1.getAttTime().getTime() - o2.getAttTime().getTime());
        }
    }
}