SendUserAsync.java 14.2 KB
package com.sincere.haikangface.async;


import com.alibaba.fastjson.JSON;
import com.sincere.haikangface.CMSServer;
import com.sincere.haikangface.bean.StudentBean;
import com.sincere.haikangface.bean.TeacherBean;
import com.sincere.haikangface.bean.face.PermissionBean;
import com.sincere.haikangface.bean.face.WeekDay;
import com.sincere.haikangface.bean.face.WeekTime;
import com.sincere.haikangface.dao.DeviceDao;
import com.sincere.haikangface.dao.UserDao;
import com.sincere.haikangface.enums.EnumSzBusinessType;
import com.sincere.haikangface.service.impl.BaseService;
import com.sincere.haikangface.utils.HKXmlUtils;
import com.sincere.haikangface.utils.HttpUtil;
import com.sincere.haikangface.utils.SpringContextHolder;
import com.sincere.haikangface.xiananDao.SendRecordDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Component
@Slf4j
public class SendUserAsync {


    @Autowired
    CMSServer cmsServer;

    @Autowired
    DeviceDao deviceDao;

    @Autowired
    SendRecordDao sendRecordDao;

    @Autowired
    UserDao userDao;

    /**
     * 人脸下发至海康设备
     * @param srcFile
     * @param picUrl
     * @param card
     * @param startTime
     * @param endTime
     * @param validTimeEnabled
     * @param name
     * @param deviceId
     * @param userType
     */
    public void sendStuToHaiKang(String srcFile, String picUrl, String card, String startTime, String endTime,
                                 int validTimeEnabled, String name, String deviceId, String userType,Integer schoolId,String cardNum) {
        //1、检测图片是否合格
        boolean check = true;
        if (check) {//合格
            //根据设备是5603 还是新设备
            String employeeNo = "";
            //picUrl:压缩后的图片路径,图片上传,用户信息、用户卡下发。
            cmsServer.createImgPath(srcFile, picUrl, card, startTime, endTime, validTimeEnabled, name, deviceId, userType, employeeNo,schoolId,cardNum);
            //根据设备
            if (deviceId.contains("ymzx") || deviceId.contains("5607") || deviceId.contains("5671") || deviceId.contains("5604")) {
                long lon = Long.parseLong(card);
                //十六进制卡号
                String resultCard = getCard(String.format("%08x", lon)).toUpperCase();
                //系统时间
                String time = System.currentTimeMillis() + "";
                //设置卡权限计划模板
                cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardTemplate(), "设置卡权限计划模板",schoolId,cardNum);
                //设置卡权限周计划
                cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardWeekPlan(), "卡权限周计划" ,schoolId,cardNum);
                for (int i = 0; i < 7; i++) {
                    cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardWeekPlanTime(HKXmlUtils.getInstance().SetCardWeekPlanTimes("00:00:00", "23:00:00"), "" + i), "设置卡权限周计划时间",schoolId,cardNum);
                }
                cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardRightCfg(card), "设置卡权限",schoolId,cardNum);
            }
        } else {//不合格
            BaseService baseService = SpringContextHolder.getBaseService();
            baseService.sendFailRecord(cardNum, srcFile, deviceId, "人脸照片不合格", userType,schoolId);
        }

    }


    /**
     * 下发权限
     *
     * @param permissionBean
     * @param i              1:不需要重新下发,0需要重新下发
     */
    public boolean sendPermiss(PermissionBean permissionBean, int i) {
        try{
            //用户类型1老师2学生
            String userType = permissionBean.getUserType();
            //权限周计划
            List<WeekDay> weekDays = permissionBean.getWeekDays();
            //存储周计划时段
            Map<Integer, List<WeekTime>> map = new HashMap<>();

            String schoolId = permissionBean.getSchoolId();

            String userIds = permissionBean.getUserIds();

            List<String> deviceIds = permissionBean.getDeviceIds();

            for (WeekDay weekDay : weekDays) {
                List<String> cardNumList = new ArrayList<>();
                String sex = weekDay.getSex();
                if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.TEACHER.code) {
                    List<String> cardList = getUserCard(userIds, 1);
                    cardNumList.addAll(cardList);
                }
                if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.STUDENT.code) {
                    cardNumList = getCards(sex, userType, schoolId);
                }
                //整理周和时间段
                initWeedayAndTimes(weekDay, map);
                senPsermiss(permissionBean, map, deviceIds, cardNumList, i);
            }
            log.info("map{}", JSON.toJSONString(map));
            return true;
        }catch (Exception e){
            log.error("下发卡权限失败,异常信息:{}",e);
        }
        return false;
    }

    /**
     * 下发权限
     *
     * @param permissionBean
     * @param id
     */
    public boolean sendHKAuth(PermissionBean permissionBean, Integer id,Integer studentType) {
        try{
            //用户类型1老师2学生
            String userType = permissionBean.getUserType();
            //权限周计划
            List<WeekDay> weekDays = permissionBean.getWeekDays();
            //存储周计划时段
            Map<Integer, List<WeekTime>> map = new HashMap<>();
            //学校ID
            String schoolId = permissionBean.getSchoolId();
            //老师点名专用
            String userIds = permissionBean.getUserIds();
            //下发设备
            List<String> deviceIds = permissionBean.getDeviceIds();
            for (WeekDay weekDay : weekDays) {
                List<String> cardNumList = new ArrayList<>();
                String sex = weekDay.getSex();
                if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.TEACHER.code) {
                    List<String> cardList = getUserCard(userIds, 1);
                    cardNumList.addAll(cardList);
                }
                if (Integer.parseInt(userType) == EnumSzBusinessType.EnumUserType.STUDENT.code) {
                    BaseService baseService = SpringContextHolder.getBaseService();
                    cardNumList = baseService.getStudentCard(Integer.parseInt(schoolId),studentType,sex);
                }
                //整理周和时间段
                initWeedayAndTimes(weekDay, map);
                //1:不需要重新下发,0需要重新下发
                senPsermiss(permissionBean, map, deviceIds, cardNumList,0);
            }
            log.info("下发海康权限计划成功:{}",JSON.toJSONString(map));
            //更新计划位下发成功
            userDao.updateAuthRecord(id,1);
            return true;
        }catch (Exception e){
            log.error("下发卡权限失败,异常信息:{}",e);
        }
        return false;
    }

    private List<String> getUserCard(String userIds, int userType) {
        List<String> cards = new ArrayList<>();
        try {
            String[] userIdsStr = userIds.split(",");
            for (String userId : userIdsStr) {
                TeacherBean teacherBean = null;
                if (userType == EnumSzBusinessType.EnumUserType.TEACHER.code) {//教师
                    teacherBean = userDao.getTeacherWithUserId(userId);
                    if (null != teacherBean) {
                        String card = teacherBean.getTeacer_num();
                        if (!StringUtils.isEmpty(card)) {
                            cards.add(card);
                        }
                    } else {
                        log.error("教师用户不存在");
                    }
                }
            }

        } catch (Exception e) {
            log.error("获取用户卡异常,异常信息:{}",e);
        }
        return cards;
    }

    /**
     * 把卡号和权限下发到对应的设备
     *
     * @param permissionBean
     * @param map
     * @param deviceIds
     * @param cardNumList
     * @param i
     * @return
     */
    private boolean senPsermiss(PermissionBean permissionBean, Map<Integer, List<WeekTime>> map, List<String> deviceIds, List<String> cardNumList, int i) {
        String userType = permissionBean.getUserType();
        Integer schoolId = Integer.valueOf(permissionBean.getSchoolId());
        if (deviceIds == null || deviceIds.size() == 0) {
            log.error("设备不存在");
            return false;
        }
        if (null == cardNumList || cardNumList.size() == 0) {
            log.error("卡号为空");
            return false;
        }
        try{
            for (String deviceId : deviceIds) {
                //设备在线
                if (cmsServer.getIsDeviceOnline(deviceId)) {
                    for (String cardNum : cardNumList) {
                        if (!StringUtils.isEmpty(cardNum)) {
                            //卡号取反
                            String newCardNum = getCard(cardNum);
                            if(StringUtils.isEmpty(newCardNum)){
                                continue;
                            }
                            cardNum = Long.parseLong(newCardNum, 16) + "";

                            cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, HKXmlUtils.getInstance().SetCardTemplate(), "设置卡权限计划模板",schoolId,cardNum);
                            cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, HKXmlUtils.getInstance().SetCardWeekPlan(), "卡权限周计划",schoolId,cardNum);

                            for (Map.Entry<Integer, List<WeekTime>> weeKdayMap : map.entrySet()) {

                                int week = weeKdayMap.getKey();
                                List<WeekTime> weekTimes = weeKdayMap.getValue();

                                StringBuffer stringBuffer = new StringBuffer();//添加时间集
                                for (WeekTime weekTime : weekTimes) {
                                    String weekPlanTimes = HKXmlUtils.getInstance().SetCardWeekPlanTimes(weekTime.getStartTime(), weekTime.getEndTime());
                                    stringBuffer.append(weekPlanTimes);
                                }
                                String weekPlanTime = HKXmlUtils.getInstance().SetCardWeekPlanTime(stringBuffer.toString(), "" + week);
                                String serCardRightCfg = HKXmlUtils.getInstance().SetCardRightCfg(cardNum);
                                cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, weekPlanTime, "设置卡权限周计划时间",schoolId,cardNum);
                                cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, serCardRightCfg, "设置卡权限",schoolId,cardNum);
                            }
                        }
                    }
                } else {//设备不在线,请求253服务器执行下发
                    HttpUtil.sendPermission2HK(permissionBean);
                    log.error("deviceId:{}", deviceId + "不在线");
                }
            }
            return true;
        }catch (Exception e){
            log.error("下发卡权限失败,异常信息{}",e);
        }
        return false;
    }


    private List<String> getCards(String sex, String userType, String schoolId) {
        List<String> cardList = new ArrayList<>();

        switch (userType) {
            case "2"://学生
                String[] sexs = sex.split(",");
                List<String> sexList = new ArrayList<>();
                for (int i = 0; i < sexs.length; i++) {
                    sexList.add(sexs[i]);
                }
                cardList = userDao.getStudentWiSidAndSex(schoolId, sexList);
                break;
        }
        return cardList;
    }




    private void initWeedayAndTimes(WeekDay weekDay, Map<Integer, List<WeekTime>> map) {
        String weekDayStr = weekDay.getWeekDay();
        String[] weekDays = weekDayStr.split(",");
        List<WeekTime> weekTimes = weekDay.getWeekTimes();

        for (int i = 0; i < weekDays.length; i++) {
            int weekDayIndex = Integer.parseInt(weekDays[i]);
            if (map.containsKey(weekDayIndex)) {//周已经有时间段
                List<WeekTime> weekTimeList = map.get(weekDayIndex);
                for (WeekTime wee : weekTimes) {
                    weekTimeList.add(wee);
                }
                map.put(weekDayIndex, weekTimeList);
            } else {
                List<WeekTime> weekTimes1 = new ArrayList<>();
                weekTimes1.addAll(weekTimes);
                map.put(weekDayIndex, weekTimes1);
            }
        }
    }

    private String getCard(String card) {
        if (card.length() == 8) {
            int length = card.length();
            String result = card.substring(length - 2, length) + card.substring(length - 4, length - 2) + card.substring(length - 6, length - 4)
                    + card.substring(length - 8, length - 6);
            return result;
        } else {
            log.info("卡号位数不对:" + card);
            return "";
        }
    }

    /**
     * 调用传图片接口
     *
     * @param filePath
     * @param card
     * @param name
     * @param deviceId
     * @param startTime
     * @param endTime
     * @param validTimeEnabled
     * @param userType
     */
    public void uploadImgs(String filePath, String card, String name, String deviceId, String startTime, String endTime, int validTimeEnabled, String userType,Integer schoolId) {
        HttpUtil.uploadImgs(filePath, card, name, deviceId, startTime, endTime, validTimeEnabled, userType,schoolId);
    }

    public void deleteCard(String deviceId, String card) {
        HttpUtil.deleteCard(deviceId, card);
    }

    public boolean IsDeviceOnline(String deviceId) {
        return HttpUtil.IsDeviceOnline(deviceId);
    }
}