SendUserAsync.java 11.8 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.utils.*;
import com.sincere.haikangface.xiananDao.SendRecordDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.*;

@Component
@Slf4j
public class SendUserAsync {


    @Autowired
    CMSServer cmsServer;

    @Autowired
    DeviceDao deviceDao;

    @Autowired
    SendRecordDao sendRecordDao;

    @Autowired
    UserDao userDao;

    SendRecoderUtils sendRecoderUtils;

    //    @Async("taskExecutor")
    public void sendStuToHaiKang(String srcFile, String picUrl, String card, String startTime, String endTime, int validTimeEnabled, String name, String deviceId, String userType, int isPiliang) {
//        System.out.println("下发时间设置:"+validTimeEnabled);
        if (null == sendRecoderUtils) sendRecoderUtils = new SendRecoderUtils();
        //1、检测图片是否合格
        boolean check = true;
        if (check) {//合格
            //根据设备是5603 还是新设备
            String employeeNo = "";
            boolean result = cmsServer.createImgPath(srcFile, picUrl, card, startTime, endTime, validTimeEnabled, name, deviceId, userType, employeeNo);
            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() + "";
                if (userType.equals("1")) {
                    StudentBean studentBean = userDao.getTeacherWithCard(resultCard);
                    log.error("studentBean:{}", studentBean == null ? "-------" : studentBean.toString());
                    if (null == studentBean) {
                        employeeNo = time.substring(time.length() - 6, time.length());
                    } else
                        employeeNo = studentBean.getTeacher_id();
                } else if (userType.equals("2")) {
                    StudentBean studentBean = userDao.getStudentWithCard(resultCard);
                    if (null == studentBean) {
                        employeeNo = time.substring(time.length() - 6, time.length());
                    } else
                        employeeNo = studentBean.getStudent_id();
                }
                cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardTemplate(), "设置卡权限计划模板");
                cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardWeekPlan(), "卡权限周计划");
                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), "设置卡权限周计划时间");
                }
                cmsServer.SetCardWeekPlan(deviceId, card, userType, HKXmlUtils.getInstance().SetCardRightCfg(card), "设置卡权限");
            }

        } else {//不合格
            sendRecoderUtils.sendFail(sendRecordDao, card, srcFile, deviceId, userDao, "人脸照片不合格", userType);
        }

    }


    /**
     * 下发权限
     *
     * @param permissionBean
     * @param i              1:不需要重新下发,0需要重新下发
     */
    @Async("taskExecutor")
    public boolean sendPermiss(PermissionBean permissionBean, int i) {

        String userType = permissionBean.getUserType();

        List<WeekDay> weekDays = permissionBean.getWeekDays();

        Map<Integer, List<WeekTime>> map = new HashMap<>();

        String schoolId = permissionBean.getSchoolId();

        for (WeekDay weekDay :
                weekDays) {
            if (weekDay.getDeviceIds() != null && weekDay.getDeviceIds().size() > 0) {
                permissionBean.setDeviceIds(weekDay.getDeviceIds());
            }
            List<String> deviceIds = weekDay.getDeviceIds();
            List<String> cardNumList = new ArrayList<>();
            String sex = weekDay.getSex();
            if (userType.equals("1")) {
                List<String> cardList = getUserCard(weekDay.getUserIds(), 1);
                cardNumList.addAll(cardList);
            } else if (userType.equals("2")) {
                cardNumList = getCards(sex, userType, schoolId);
            }
            //整理周和时间段
            initWeedayAndTimes(weekDay, map);
            senPsermiss(permissionBean, map, deviceIds, cardNumList, i);
        }
        log.error("map{}", JSON.toJSONString(map));
        return true;
    }

    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 == 1) {//教师
                    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) {
            e.printStackTrace();
        }

        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();

        if (deviceIds == null || deviceIds.size() == 0) {
            log.error("设备不存在");
            return false;
        }

        if (null == cardNumList || cardNumList.size() == 0) {
            log.error("卡号为空");
            return false;
        }

        for (String deviceId :
                deviceIds) {
            if (cmsServer.getIsDeviceOnline(deviceId)) {//设备在线

                for (String cardNum :
                        cardNumList) {

                    if (!StringUtils.isEmpty(cardNum)) {
                        cardNum = Long.parseLong(getCard(cardNum), 16) + "";

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

                        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());
//                            log.error("weekPlanTimes:{}", weekPlanTimes);
                                stringBuffer.append(weekPlanTimes);
                            }

                            String weekPlanTime = HKXmlUtils.getInstance().SetCardWeekPlanTime(stringBuffer.toString(), "" + week);
                            String serCardRightCfg = HKXmlUtils.getInstance().SetCardRightCfg(cardNum);
//                            log.error("serCardRightCfg:{}", serCardRightCfg);
                            FileUtils.getInstance().writeLogs(weekPlanTime, "设置卡权限周计划时间.txt");
                            cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, weekPlanTime, "设置卡权限周计划时间");
                            cmsServer.SetCardWeekPlan(deviceId, cardNum, userType, serCardRightCfg, "设置卡权限");

                        }
                    }

                }
            } else {//设备不在线
                if (i == 0)
                    HttpUtil.sendPermission2HK(permissionBean);
                log.error("deviceId:{}", deviceId + "不在线");
            }

        }
        return true;
    }


    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 {
            System.out.println("卡号位数不对:" + card);
            return "";
        }

    }

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

    //    @Async("taskExecutor")
    public void deleteCard(String deviceId, String card) {
        HttpUtil.deleteCard(deviceId, card);
    }


    @Async("taskExecutor")
    public boolean IsDeviceOnline(String deviceId) {
        return HttpUtil.IsDeviceOnline(deviceId);
    }

}