package com.template.controller;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.qcloud.cos.utils.IOUtils;
import com.seewo.open.sdk.DefaultSeewoClient;
import com.seewo.open.sdk.SeewoClient;
import com.seewo.open.sdk.auth.Account;
import com.template.annotation.DESRespondSecret;
import com.template.annotation.PassToken;
import com.template.api.SmartUserControllerAPI;
import com.template.common.utils.*;
import com.template.config.ControlConfig;
import com.template.config.SeewoConfig;
import com.template.model.enumModel.*;
import com.template.model.evaluate.teacher.SmartEvaluateTeacher;
import com.template.model.pojo.*;
import com.template.model.request.*;
import com.template.model.result.CommonResult;
import com.template.model.result.PageUtils;
import com.template.model.seewo.*;
import com.template.model.vo.*;
import com.template.services.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipInputStream;

import static com.template.common.utils.AesTestOne.decrypt;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author ceshi
 * @since 2023-12-04
 */
@RestController
//返回参数加密注解
@DESRespondSecret
public class SmartUserController implements SmartUserControllerAPI {

    @Resource
    private SeewoConfig seewoConfig;

    @Resource
    private ControlConfig controlConfig;

    @Autowired
    private SmartUserService smartUserService;

    @Autowired
    private SmartGradeService smartGradeService;

    @Autowired
    private SmartClassService smartClassService;

    @Autowired
    private SmartUploadService smartUploadService;

    @Autowired
    private SmartDutiesService smartDutiesService;

    @Autowired
    private SmartDepartmentService smartDepartmentService;

    @Autowired
    private SmartIdentityService smartIdentityService;

    @Autowired
    private SmartTimeGroupService smartTimeGroupService;

    @Autowired
    private SmartAuthorityService smartAuthorityService;

    @Autowired
    private SmartFamilyIndexService smartFamilyIndexService;

    @Autowired
    private SmartTeachingService smartTeachingService;

    @Autowired
    private SmartAuthorGroupService smartAuthorGroupService;

    @Autowired
    private SmartSemesterService smartSemesterService;

    @Autowired
    private SmartSubjectService smartSubjectService;

    @Autowired
    private SmartEvaluateTeacherService smartEvaluateTeacherService;

    @Autowired
    private SmartOperationUserService smartOperationUserService;


    private static Logger logger = LoggerFactory.getLogger(SmartUserController.class);

    //region 开发自己导数据用的接口

    @Override
    public CommonResult testDeleteUserById(int userId) throws Exception {
        SmartUser user = smartUserService.getSmartById(userId);

        bsDeleteStudent(user);

        return CommonResult.ok();
    }

    @Override
    public CommonResult insertSmartUserPhoto() throws JsonProcessingException {

        Integer userType = eSeewoUserType.Student.getValue();
        SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        List<SmartUser> students = smartUserService.queryStudentDatas();
        List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
        for (SmartUser student : students) {
            PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
            photo.setPhotoUrl(student.getHeadImage());
            photo.setUserCode(student.getCardNo());
            photoList.add(photo);

        }

        int num = (int) Math.ceil((double) photoList.size() / 1000);
        for (int count = 1; count <= num; count++) {
            int startIndex = (count - 1) * 1000;
            int endIndex = count * 1000;
            if (count == num) {
                endIndex = startIndex + (photoList.size() % 1000);
            }

            List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> currentPhotoList = photoList.subList(startIndex, endIndex);//结尾不包含下标1000
            CommonResult result = SeewoInsertBatchPhoto(seewoClient, currentPhotoList, userType);
            if (!result.isSuccess()) {
                return result;
            }
        }


        return CommonResult.ok("图片上传成功");
    }

    @Override
    public CommonResult importExcelUserBsno(MultipartFile excelFile) throws IOException {
        //先解析excel如果excel不满足格式就提示错误信息 避免提前占用带宽上传头像
        if (excelFile.isEmpty() || excelFile.getSize() == 0) {
            return CommonResult.fail("压缩包中的excel文件不能为空");
        }

        List<SmartUser> result = new ArrayList<>();
        String ContentType = excelFile.getContentType();
        InputStream inputStream = excelFile.getInputStream();
        if (ContentType.equals(eFileType.Xlsx.getValue())) {
            CommonResult<List<SmartUser>> resultData = readBsXlsx(inputStream);
            if (!resultData.isSuccess()) {
                return resultData;
            }
            result = resultData.getData();
            if (result == null) {
                return CommonResult.fail("文档内容为空，导入失败");
            }
        } else {
            return CommonResult.fail("用户导入只支持Xlsx");
        }

        List<String> gradeIds = result.stream().map(SmartUser::getGrade).distinct().collect(Collectors.toList());
        if (gradeIds != null && gradeIds.size() > 0) {
            List<SmartUser> users = smartUserService.queryStudentsByGrade(gradeIds);
            for (SmartUser user : users) {
                Optional<SmartUser> resultData = result.stream().filter(e -> e.getCardNo().equals(user.getCardNo()) && e.getName().equals(user.getName())).findFirst();
                if (resultData != null && resultData.isPresent()) {
                    user.setBsStudentNo(resultData.get().getBsStudentNo());
                }
            }

            if (users != null && users.size() > 0) {
                boolean insertData = smartUserService.updateUserBatchById(users);
                if (!insertData) {
                    return CommonResult.fail("导入失败");
                }
            }
        }

        return CommonResult.ok("导入成功");
    }

    /**
     * Xlsx文件读取方法ss
     *
     * @param inputStream 文件流
     * @return
     * @throws IOException
     */
    private CommonResult<List<SmartUser>> readBsXlsx(InputStream inputStream) throws IOException {
        List<SmartUser> users = new ArrayList<>();
        List<String> idCards = new ArrayList<>();
        List<String> cardNos = new ArrayList<>();
        XSSFWorkbook sheets = new XSSFWorkbook(inputStream);

        List<SmartGrade> grades = smartGradeService.list(null); //年级
        //读取第一张sheet
        XSSFSheet sheetAt = sheets.getSheetAt(0);

        DataFormatter dataFormatter = new DataFormatter();
        try {
            for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
                XSSFRow row = sheetAt.getRow(rowNum);

                if (row != null) {
                    //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                    //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                    //然后poi会根据字符串读取它
                    //标题 校验
                    if (rowNum == 0) {
                        String schoolClass = dataFormatter.formatCellValue(row.getCell(0));//年级
                        if (!schoolClass.equals("年级")) {
                            return CommonResult.fail("导入数据第一列为年级");
                        }
                        String cardNo = dataFormatter.formatCellValue(row.getCell(3));//学号
                        if (!cardNo.equals("学号")) {
                            return CommonResult.fail("导入数据第四列为学号");
                        }
                        String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                        if (!name.equals("姓名")) {
                            return CommonResult.fail("导入数据第五列为姓名");
                        }
                        String sex = dataFormatter.formatCellValue(row.getCell(5));//学生编码
                        if (!sex.equals("学生编码")) {
                            return CommonResult.fail("导入数据第六列为学生编码");
                        }
                    } else {
                        SmartUser user = new SmartUser();
                        String name = dataFormatter.formatCellValue(row.getCell(4));
                        if (ObjectUtils.isEmpty(name)) {
                            return CommonResult.fail("第" + (rowNum + 1) + "条数据的姓名不能为空");
                        }

                        String schoolGrade = dataFormatter.formatCellValue(row.getCell(0));//年级
                        if (ObjectUtils.isEmpty(schoolGrade)) {
                            return CommonResult.fail(name + "的年级不能为空");
                        }

                        String cardNo = dataFormatter.formatCellValue(row.getCell(3));//学号
                        if (ObjectUtils.isEmpty(cardNo)) {
                            return CommonResult.fail(name + "的学号不能为空");
                        }

                        //学号重复判断
                        if (!ObjectUtils.isEmpty(cardNo)) {
                            cardNos.add(cardNo);
                        }
                        if (cardNos.stream().distinct().count() != cardNos.size()) {
                            return CommonResult.fail("导入的Excel中，" + name + "的学号：" + cardNo + "存在重复数据");
                        }

                        String studentNo = dataFormatter.formatCellValue(row.getCell(5));//学生编码
                        if (ObjectUtils.isEmpty(studentNo)) {
                            return CommonResult.fail(name + "的学生编码不能为空");
                        }

                        Optional<SmartGrade> oGrade = grades.stream().filter(e -> e.getName().equals(schoolGrade)).findFirst();
                        if (oGrade != null && oGrade.isPresent()) {
                            Integer gradeId = oGrade.get().getId();
                            user.setGrade(String.valueOf(gradeId));
                        } else {
                            return CommonResult.fail(name + "的年级数据无效，导入失败");
                        }
                        user.setName(name);
                        user.setBsStudentNo(studentNo);
                        user.setCardNo(cardNo);
                        users.add(user);
                    }
                }
            }
        } catch (Exception e) {
            return CommonResult.fail("请按模板格式导入数据");
        }

        return CommonResult.ok(users);
    }

    @Override
    public CommonResult importExcelFamilys(MultipartFile excelFile) throws Exception {
        //先解析excel如果excel不满足格式就提示错误信息 避免提前占用带宽上传头像
        if (excelFile.isEmpty() || excelFile.getSize() == 0) {
            return CommonResult.fail("压缩包中的excel文件不能为空");
        }

        String ContentType = excelFile.getContentType();
        InputStream inputStream = excelFile.getInputStream();
        List<SmartFamilyIndex> result = new ArrayList<>();
        CommonResult<List<SmartFamilyIndex>> resultData = readFamilyXlsx(inputStream);
        if (!resultData.isSuccess()) {
            return resultData;
        }
        result = resultData.getData();

        boolean insertBatch = smartFamilyIndexService.saveBatch(result);

        return insertBatch ? CommonResult.ok("操作成功") : CommonResult.fail("操作失败");
    }

    /**
     * Xlsx文件读取方法
     *
     * @param inputStream 文件流
     * @return
     * @throws IOException
     */
    private CommonResult<List<SmartFamilyIndex>> readFamilyXlsx(InputStream inputStream) throws IOException {
        List<SmartFamilyIndex> result = new ArrayList<>();
        XSSFWorkbook sheets = new XSSFWorkbook(inputStream);

        //读取第一张sheet
        XSSFSheet sheetAt = sheets.getSheetAt(0);

        DataFormatter dataFormatter = new DataFormatter();
        try {
            for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
                XSSFRow row = sheetAt.getRow(rowNum);

                if (row != null) {
                    //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                    //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                    //然后poi会根据字符串读取它
                    //标题 校验
                    if (rowNum < 3) {
                        //不做校验处理了
                    } else {
                        String cardNo = dataFormatter.formatCellValue(row.getCell(4));//学号
                        if (ObjectUtils.isEmpty(cardNo)) {
                            continue;
                        }

                        String phone1 = dataFormatter.formatCellValue(row.getCell(10));//手机号1
                        if (!ObjectUtils.isEmpty(phone1)) {
                            SmartFamilyIndex index = new SmartFamilyIndex();
                            index.setStudentNo(cardNo);
                            index.setParentPhone(phone1);
                            index.setIndexData(0);
                            result.add(index);
                        }

                        String phone2 = dataFormatter.formatCellValue(row.getCell(12));//手机号1
                        if (!ObjectUtils.isEmpty(phone1)) {
                            SmartFamilyIndex index = new SmartFamilyIndex();
                            index.setStudentNo(cardNo);
                            index.setParentPhone(phone1);
                            index.setIndexData(1);
                            result.add(index);
                        }

                    }
                }
            }
        } catch (Exception e) {
            return CommonResult.fail("请按模板格式导入数据");
        }

        return CommonResult.ok(result);
    }

    /**
     * 批量导入压缩包用户信息
     * 以身份证号作为判断依据 如果存在重复数据就提示存在重复数据
     * 开发流程：建议先去拿到excel中的所有数据的身份证号去数据库中找一遍是否存在重复数据
     * 如果不存在重复数据就把附件文件夹中的附件文件上传到cos服务器上
     * 然后手动拼接一个人脸照片文件地址存入对应的数据中
     *
     * @param zipFile zip压缩包
     * @return
     */
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult importZipUsers(MultipartFile zipFile) throws IOException {
        List<SmartUser> result = new ArrayList<>();
        MultipartFile excelFile = null;
        List<MultipartFile> multipartFileHashMap = new ArrayList<>();
        String excelStr = null;
        if (zipFile != null) {
            //解压压缩文件并上传文件
            ByteArrayOutputStream byteOut = null;
            ZipInputStream zipIn = null;
            try {
                java.util.zip.ZipEntry zipEntry = null;
                zipIn = new ZipInputStream(zipFile.getInputStream(), Charset.forName("GBK"));
                while ((zipEntry = zipIn.getNextEntry()) != null) {
                    String fileName = zipEntry.getName();
                    if (fileName.contains("人脸照片") && (fileName.endsWith(".jpg") || fileName.endsWith(".png") || fileName.endsWith(".jpeg"))) {
                        byteOut = new ByteArrayOutputStream();
                        IOUtils.copy(zipIn, byteOut);
                        InputStream inputStream = new ByteArrayInputStream(byteOut.toByteArray());
                        MultipartFile multipartFile = FileUtils.getMultipartFile(inputStream, fileName);
                        multipartFileHashMap.add(multipartFile);
                    } else if (fileName.contains("人员信息采集表") && (fileName.endsWith(".xlsx") || fileName.endsWith(".xls"))) {
                        excelStr = fileName.endsWith(".xlsx") ? "xlsx" : "xls";
                        byteOut = new ByteArrayOutputStream();
                        IOUtils.copy(zipIn, byteOut);
                        InputStream inputStream = new ByteArrayInputStream(byteOut.toByteArray());
                        excelFile = FileUtils.getMultipartFile(inputStream, fileName);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (byteOut != null) {
                    byteOut.close();
                }
                if (zipIn != null) {
                    zipIn.close();
                }
            }
        }

        //先解析excel如果excel不满足格式就提示错误信息 避免提前占用带宽上传头像
        if (excelFile.isEmpty() || excelFile.getSize() == 0) {
            return CommonResult.fail("压缩包中的excel文件不能为空");
        }

        String ContentType = excelFile.getContentType();
        InputStream inputStream = excelFile.getInputStream();

        //xls格式文件
        if (excelStr.equals("xls")) {
            CommonResult<List<SmartUser>> resultData = readXls(inputStream);
            if (!resultData.isSuccess()) {
                return resultData;
            }
            result = resultData.getData();
        } else if (excelStr.equals("xlsx")) {
            CommonResult<List<SmartUser>> resultData = readXlsx(inputStream);
            if (!resultData.isSuccess()) {
                return resultData;
            }
            result = resultData.getData();
        } else {
            return CommonResult.fail("用户导入只支持Xls、Xlsx");
        }

        //cos上传 返回图片地址
        String uploadResult = smartUploadService.upload(multipartFileHashMap.toArray(new MultipartFile[0]));
        List<String> uploadImages = Arrays.asList(uploadResult.split(","));
        for (SmartUser user : result) {
            Optional<String> headImage = uploadImages == null ? null : uploadImages.stream().filter(e -> e.equals("https://wanzai-1306339220.cos.ap-shanghai.myqcloud.com/headImage/" + user.getHeadImage())).findFirst();
            if (headImage != null && headImage.isPresent()) {
                user.setHeadImage(headImage.get());
            }
        }

        //批量存储用户信息
        boolean resultBool = smartUserService.saveBatch(result);

        return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败");
    }
    //endregion

    //region 注销账号
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult logoffAccount(useridsRequest ur, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        int user = smartUserService.getSmartUserCountByIds(ur.getUserIds());
        if (user != ur.getUserIds().size()) {
            return CommonResult.fail("用户信息已失效");
        }

        return 0 > 0 ? CommonResult.ok("注销成功") : CommonResult.fail("注销失败");
    }
    //endregion

    //region 移动多个用户到其他部门
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult changeDepartment(changeDepartmentRequest cdr, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        List<SmartUser> users = smartUserService.getSmartUserByIds(cdr.getUserIds());
        if (users == null) {
            return CommonResult.fail("用户信息无效，移动失败！");
        }

        if (users.size() != cdr.getUserIds().size()) {
            return CommonResult.fail("存在无效用户数据，移动失败！");
        }

        for (SmartUser user : users) {
            user.setDepartmentId(cdr.getDepartmentId());

        }
        boolean result = smartUserService.updateUserBatchById(users);

        return result ? CommonResult.ok("移动成功") : CommonResult.fail("移动失败");
    }
    //endregion

    //region 批量新增用户

    //region 批量新增用户方法
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult importExcelUsers(MultipartFile excelFile, String headImage) throws Exception {
        List<SmartUser> result = new ArrayList<>();

        int useXw = 1;
        int useBs = 1;

        //先解析excel如果excel不满足格式就提示错误信息 避免提前占用带宽上传头像
        if (excelFile.isEmpty() || excelFile.getSize() == 0) {
            return CommonResult.fail("压缩包中的excel文件不能为空");
        }

        String ContentType = excelFile.getContentType();
        InputStream inputStream = excelFile.getInputStream();

        //xls格式文件
        if (ContentType.equals(eFileType.Xls.getValue())) {
            CommonResult<List<SmartUser>> resultData = readXls(inputStream);
            if (!resultData.isSuccess()) {
                return resultData;
            }
            result = resultData.getData();
        } else if (ContentType.equals(eFileType.Xlsx.getValue())) {
            CommonResult<List<SmartUser>> resultData = readXlsx(inputStream);
            if (!resultData.isSuccess()) {
                return resultData;
            }
            result = resultData.getData();
        } else {
            return CommonResult.fail("用户导入只支持Xls、Xlsx");
        }

        List<String> uploadImages = Arrays.asList(headImage.split(","));
        for (SmartUser user : result) {
            Optional<String> image = uploadImages == null ? null : uploadImages.stream().filter(e -> e.equals("https://wanzai-1306339220.cos.ap-shanghai.myqcloud.com/" + user.getHeadImage())).findFirst();
            if (image != null && image.isPresent()) {
                user.setHeadImage(image.get());
            } else {
                if (user.getIdentityId().equals(eIdentityStatu.Student.getValue())
                        || user.getIdentityId().equals(eIdentityStatu.Teacher.getValue())) {
                    return CommonResult.fail(user.getName() + "头像不存在，导入失败");
                }
            }
        }

        //region 将数据加入第三方
        List<SmartUser> studentDatas = result.stream().filter(e -> e.getIdentityId().intValue() == eIdentityStatu.Student.getValue()).collect(Collectors.toList());

        if (studentDatas != null && studentDatas.size() > 0) {
            //判断是否存在重复数据
            List<String> cardNos = studentDatas.stream().map(SmartUser::getCardNo).collect(Collectors.toList());
            if (cardNos == null) {
                return CommonResult.fail("文档内容为空，导入失败");
            }

            if (cardNos.size() <= 0) {
                return CommonResult.fail("文档内容为空，导入失败");
            }
            List<SmartUser> existUsers = smartUserService.querySmartUserByCardNos(cardNos);
            if (existUsers != null && existUsers.size() > 0) {
                String names = StringUtils.join(existUsers.stream().map(SmartUser::getName).collect(Collectors.toList()), ",");
                return CommonResult.fail("系统中已存在" + names + "的信息数据，请勿重复导入");
            }

            //获取班级Uid
            List<SmartClass> classDatas = smartClassService.getSmartClasss();
            if (classDatas == null) {
                return CommonResult.fail("班级数据无效，新增失败");
            }
            List<SmartGrade> gradeDatas = smartGradeService.getSmartGrades();
            if (gradeDatas == null) {
                return CommonResult.fail("年级数据无效，新增失败");
            }

            HashMap<String, List<StudentServiceBatchSaveClassStudentsParam.StudentInfo>> seewoDatas = new HashMap<>();
            List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
            for (SmartUser student : studentDatas) {

                PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                photo.setPhotoUrl(student.getHeadImage());
                photo.setUserCode(student.getCardNo());
                photoList.add(photo);

                //region 学生参数必填判断：年级、班级
                if (student.getGrade() == null) {
                    return CommonResult.fail("学生年级不能为空");
                }

                if (student.getSchoolClass() == null) {
                    return CommonResult.fail("学生班级不能为空");
                }
                //endregion

                Optional<SmartClass> oClassData = classDatas.stream().filter(e -> e.getId().equals(student.getSchoolClass())).findFirst();
                if (oClassData == null) {
                    return CommonResult.fail("班级数据无效，新增失败");
                }

                Optional<SmartGrade> oGradeData = gradeDatas.stream().filter(e -> e.getId().intValue() == Integer.valueOf(student.getGrade())).findFirst();
                if (oGradeData == null) {
                    return CommonResult.fail("年级数据无效，新增失败");
                }

                SmartClass classData = oClassData.get();
                SmartGrade gradeData = oGradeData.get();

                //region 凑希沃参数
                if (useXw == 1) {
                    if (!seewoDatas.containsKey(classData.getClassUid())) {
                        seewoDatas.put(classData.getClassUid(), new ArrayList<>());
                    }

                    StudentServiceBatchSaveClassStudentsParam.StudentInfo studentSeewo = StudentServiceBatchSaveClassStudentsParam.StudentInfo.builder()
                            .studentName(student.getName())
                            .studentCode(student.getCardNo())
                            .gender(student.getSexId())
                            .phone(student.getPhone() == null ? "" : student.getPhone())
                            .build();

                    seewoDatas.get(classData.getClassUid()).add(studentSeewo);
                }
                //endregion

                //region 百胜新增学生信息
                if (useBs == 1) {
                    /**
                     * 学生数据的有效期是到毕业年份的8月31日
                     */
                    String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                    String endTime = queryGraduationYear(gradeData.getGradeNo());
                    CommonResult<String> insertBsStudent = bsInsertStudent(student.getName(), student.getCardNo(), student.getSexId(), student.getHeadImage(), student.getTimeGroupId(), classData.getBsClassNo(), startTime, endTime, student.getIdCard());
                    if (!insertBsStudent.isSuccess()) {
                        return CommonResult.fail("百胜平台：" + insertBsStudent.getMessage());
                    }
                    student.setBsStudentNo(insertBsStudent.getData());
                }
                //endregion

            }

            if (useXw == 1) {
                //初始化客户端
                SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));

                List<StudentServiceBatchSaveClassStudentsResult.StudentInfoDto> seewoResultDatas = new ArrayList<>();
                for (Map.Entry<String, List<StudentServiceBatchSaveClassStudentsParam.StudentInfo>> entry : seewoDatas.entrySet()) {
                    String classUid = entry.getKey();
                    CommonResult<List<StudentServiceBatchSaveClassStudentsResult.StudentInfoDto>> insertStudents = SeewoInsertBatchStudent(seewoClient, entry.getValue(), classUid);
                    if (!insertStudents.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + insertStudents.getMessage());
                    }
                    seewoResultDatas.addAll(insertStudents.getData());
                }

                for (SmartUser student : studentDatas) {
                    Optional<StudentServiceBatchSaveClassStudentsResult.StudentInfoDto> seewoResultData = seewoResultDatas.stream().filter(e -> e.getStudentCode().equals(student.getCardNo())).findFirst();
                    if (seewoResultData != null && seewoResultData.isPresent()) {
                        student.setXwStudentUid(seewoResultData.get().getUserUid());
                    }
                }

            }


            if (studentDatas != null && studentDatas.size() > 0) {
                //批量存储学生信息
                boolean resultBool = smartUserService.saveBatch(studentDatas);
                if (!resultBool) {
                    return CommonResult.fail("导入失败");
                } else {
//                需添加到海康平台
                    ArrayList<SmartOperationUser> operationUsers = new ArrayList<>();
                    for (SmartUser studentData : studentDatas) {
                        Integer id = studentData.getId();
                        SmartOperationUser smartOperationUser = new SmartOperationUser();
                        smartOperationUser.setOperationId(id);
                        smartOperationUser.setOperationMode("1");
                        smartOperationUser.setStatus(1);
                        smartOperationUser.setType(studentData.getIdentityId());
                        operationUsers.add(smartOperationUser);
                    }
                    smartOperationUserService.saveBatch(operationUsers);
                }
                List<SmartFamilyIndex> familyIndexs = new ArrayList<>();
                //region 希沃新增编辑学生家长信息
                if (useXw == 1) {
                    int num = (int) Math.ceil((double) studentDatas.size() / 100);
                    for (int count = 1; count <= num; count++) {
                        int startIndex = (count - 1) * 100;
                        int endIndex = count * 100;
                        if (count == num) {
                            endIndex = startIndex + (studentDatas.size() % 100);
                        }

                        List<SmartUser> currentStudentDatas = studentDatas.subList(startIndex, endIndex);//结尾不包含下标100
                        //学生与家长列表，最大100条
                        List<ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem> studentParents = new ArrayList<>();
                        for (SmartUser student : currentStudentDatas) {
                            ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem students = ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem.builder()
                                    .studentCode(student.getCardNo())
                                    .build();


                            List<SmartUser> parentDatas = result.stream().filter(e -> e.getIdentityId().intValue() == eIdentityStatu.Parent.getValue() && e.getAffiliate().equals(student.getCardNo())).collect(Collectors.toList());
                            List<ParentServiceBatchSaveOrUpdateParentsParam.ParentsItem> parents = new ArrayList<>();
                            int i = 0;
                            for (SmartUser parent : parentDatas) {
                                SmartFamilyIndex familyIndex = new SmartFamilyIndex();
                                familyIndex.setParentPhone(parent.getPhone());
                                familyIndex.setStudentNo(student.getCardNo());
                                familyIndex.setIndexData(i);
                                familyIndexs.add(familyIndex);
                                ParentServiceBatchSaveOrUpdateParentsParam.ParentsItem data = ParentServiceBatchSaveOrUpdateParentsParam.ParentsItem.builder()
                                        .name(parent.getName())
                                        .phone(parent.getPhone())
                                        .index(i)
                                        .build();
                                parents.add(data);
                                ++i;
                            }

                            if (parents != null && parents.size() > 0) {
                                studentParents.add(students);
                                //家长列表，最多4个
                                students.setParents(parents);
                            }
                        }

                        //初始化客户端
                        SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
                        ParentServiceBatchSaveOrUpdateParentsParam param = new ParentServiceBatchSaveOrUpdateParentsParam();
                        //响应体，MimeType为 application/json
                        ParentServiceBatchSaveOrUpdateParentsParam.RequestBody requestBody = ParentServiceBatchSaveOrUpdateParentsParam.RequestBody.builder()
                                .build();
                        param.setRequestBody(requestBody);
                        //query
                        ParentServiceBatchSaveOrUpdateParentsParam.Query query = ParentServiceBatchSaveOrUpdateParentsParam.Query.builder()
                                .appId(seewoConfig.getAppId())
                                .schoolUid(seewoConfig.getSchoolId())
                                .build();
                        requestBody.setQuery(query);
                        query.setStudentParents(studentParents);
                        param.setRequestBody(requestBody);
                        ParentServiceBatchSaveOrUpdateParentsRequest request = new ParentServiceBatchSaveOrUpdateParentsRequest(param);
                        String jsonString = JSON.toJSONString(request);
                        logger.info("入参：" + request);
                        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
                        //request.setServerUrl("https://openapi.test.seewo.com")
                        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
                        ParentServiceBatchSaveOrUpdateParentsResult parentResult = seewoClient.invoke(request);
                        logger.info("出参：" + parentResult);


                        if (parentResult == null) {
                            return CommonResult.fail("希沃学生家长数据添加失败！");
                        }

                        if (!parentResult.getResponseBody().getCode().equals("000000")) {
                            return CommonResult.fail("希沃平台：" + parentResult.getResponseBody().getMessage());
                        }
                    }

                }
                //endregion
                if (familyIndexs != null && familyIndexs.size() > 0) {
                    boolean insertBatch = smartFamilyIndexService.saveBatch(familyIndexs);
                    if (!insertBatch) {
                        return CommonResult.fail("导入失败！");
                    }
                }
            }
            //endregion

            List<SmartUser> parents = result.stream().filter(e -> e.getIdentityId().intValue() == eIdentityStatu.Parent.getValue()).collect(Collectors.toList());

            //双胞胎家长
            List<SmartUser> newParents = new ArrayList<>();

            if (cardNos != null && cardNos.size() > 0) {
                List<SmartUser> students = smartUserService.querySmartUserByCardNos(cardNos);
                for (SmartUser parent : parents) {
                    Optional<SmartUser> student = students.stream().filter(e -> e.getCardNo().equals(parent.getAffiliate())).findFirst();
                    if (student != null && student.isPresent()) {
                        //先查找是否存在
                        Optional<SmartUser> newData = newParents.stream().filter(e -> e.getName().equals(parent.getName()) && e.getPhone().equals(parent.getPhone()) && e.getShip().equals(parent.getShip())).findFirst();
                        if (newData != null && newData.isPresent()) {
                            String affiliate = newData.get().getAffiliate() + "," + student.get().getId();
                            newData.get().setAffiliate(affiliate);
                        } else {
                            SmartUser newParent = new SmartUser();
                            newParent.setName(parent.getName());
                            newParent.setDepartmentId(parent.getDepartmentId());
                            newParent.setPhone(parent.getPhone());
                            newParent.setIdentityId(parent.getIdentityId());
                            newParent.setSexId(parent.getSexId());
                            newParent.setIsCancel(parent.getIsCancel());
                            newParent.setAffiliate(String.valueOf(student.get().getId()));
                            newParent.setShip(parent.getShip());
                            newParents.add(newParent);
                        }
                    }

                }
                if (newParents != null && newParents.size() > 0) {
                    //批量存储家长信息
                    boolean resultBool = smartUserService.saveBatch(newParents);
                    if (!resultBool) {
                        return CommonResult.fail("导入失败！");
                    }
                }

                //region 最后上传学生图片 这样能保证图片上传失败也不影响数据导入
                if (useXw == 1) {
                    SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
                    int num = (int) Math.ceil((double) photoList.size() / 1000);
                    for (int count = 1; count <= num; count++) {
                        int startIndex = (count - 1) * 1000;
                        int endIndex = count * 1000;
                        if (count == num) {
                            endIndex = startIndex + (photoList.size() % 1000);
                        }

                        List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> currentPhotoList = photoList.subList(startIndex, endIndex);//结尾不包含下标1000
                        CommonResult photoResult = SeewoInsertBatchPhoto(seewoClient, currentPhotoList, eSeewoUserType.Student.getValue());
                        if (!photoResult.isSuccess()) {
                            return photoResult;
                        }
                    }
                }
                //endregion
            }
        } else {
            List<SmartUser> teacherDatas = result.stream().filter(e -> e.getIdentityId().intValue() == eIdentityStatu.Teacher.getValue()).collect(Collectors.toList());
            //判断是否存在重复数据
            List<String> cardNos = teacherDatas.stream().map(SmartUser::getCardNo).collect(Collectors.toList());
            if (cardNos == null) {
                return CommonResult.fail("文档内容为空，导入失败");
            }

            if (cardNos.size() <= 0) {
                return CommonResult.fail("文档内容为空，导入失败");
            }
            List<SmartUser> existUsers = smartUserService.querySmartUserByCardNos(cardNos);
            if (existUsers != null && existUsers.size() > 0) {
                String names = StringUtils.join(existUsers.stream().map(SmartUser::getName).collect(Collectors.toList()), ",");
                return CommonResult.fail("系统中已存在" + names + "的信息数据，请勿重复导入");
            }

            //获取班级Uid
            List<SmartClass> classDatas = smartClassService.getSmartClasss();
            List<SmartDepartment> departmentDatas = smartDepartmentService.list(null);

            //region
            //region 希沃添加教师数据
            if (useXw == 1) {

                int num = (int) Math.ceil((double) teacherDatas.size() / 100);
                for (int count = 1; count <= num; count++) {
                    int startIndex = (count - 1) * 100;
                    int endIndex = count * 100;
                    if (count == num) {
                        endIndex = startIndex + (teacherDatas.size() % 100);
                    }

                    List<SmartUser> currentStudentDatas = teacherDatas.subList(startIndex, endIndex);//结尾不包含下标100

                    //初始化客户端
                    SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
                    //上传图片
                    List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
                    // 老师列表
                    List<TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery> teachers = new ArrayList<>();
                    for (SmartUser teacher : currentStudentDatas) {
                        TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery teacherData = TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery.builder()
                                .account(teacher.getPhone())//用户账号
                                .name(teacher.getName())//用户名字
                                .accountType("phone")//账号类型 phone：手机号  email：邮箱
                                .teacherCode(teacher.getCardNo())//教师工号
                                .photoUrl(teacher.getHeadImage())//图片链接
                                .build();
                        teachers.add(teacherData);

                        PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                        photo.setPhotoUrl(teacher.getHeadImage());
                        photo.setUserCode(teacher.getPhone());
                        photoList.add(photo);
                    }

                    CommonResult<List<TeacherServiceBatchSaveOrUpdateTeacherResult.TeacherBaseInfoDto>> insertTeacher = SeewoInsertBatchTeacher(seewoClient, teachers);
                    if (!insertTeacher.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + insertTeacher.getMessage());
                    }

                    CommonResult insertPhotoResult = SeewoInsertBatchPhoto(seewoClient, photoList, eSeewoUserType.Teacher.getValue());
                    if (!insertPhotoResult.isSuccess()) {
                        return insertPhotoResult;
                    }

                    for (SmartUser teacher : teacherDatas) {
                        if (teacher.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {

                            Optional<SmartClass> oClass = classDatas.stream().filter(e -> e.getId().equals(teacher.getSchoolClass())).findFirst();
                            if (oClass != null && oClass.isPresent()) {
                                //获取班级Uid
                                //region 将班主任推送到希沃
                                if (useXw == 1) {
                                    CommonResult pushMaster = SeewoPushMaster(seewoClient, teacher.getPhone(), oClass.get().getClassUid());
                                    if (!pushMaster.isSuccess()) {
                                        return CommonResult.fail("希沃平台：" + pushMaster.getMessage());
                                    }
                                }
                                //endregion
                            } else {
                                return CommonResult.fail(teacher.getName() + "班级数据无效，导入失败");
                            }
                        }
                    }
                }
            }
            //endregion
            //region 百胜添加教师数据
            if (useBs == 1) {
                for (SmartUser teacher : teacherDatas) {
                    Optional<SmartDepartment> oDepartment = departmentDatas.stream().filter(e -> e.getId().equals(teacher.getDepartmentId())).findFirst();
                    if (!(oDepartment != null && oDepartment.isPresent())) {
                        return CommonResult.fail(teacher.getName() + "的部门数据无效，导入失败");
                    }

                    /**
                     * 教师数据的有效期是20年
                     */
                    String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                    String endTime = TimeExchange.addYear(20);

                    if (ObjectUtils.isEmpty(teacher.getBsStaffCode())) {
                        CommonResult<String> insertBsTeacher = bsInsertTeacher(teacher, oDepartment.get().getBsDepartmentNo(), startTime, endTime);
                        if (!insertBsTeacher.isSuccess()) {
                            return CommonResult.fail("百胜平台：" + insertBsTeacher.getMessage());
                        }
                        teacher.setBsStaffCode(insertBsTeacher.getData());
                    } else {
                        CommonResult<String> bsUpdateTeacher = updateBsTeacher(teacher, oDepartment.get().getBsDepartmentNo(), startTime, endTime);
                        if (!bsUpdateTeacher.isSuccess()) {
                            return CommonResult.fail("百胜平台：" + bsUpdateTeacher.getMessage());
                        }
                        teacher.setBsStaffCode(bsUpdateTeacher.getData());
                    }
                }
            }
            //endregion
            if (teacherDatas != null && teacherDatas.size() > 0) {
                //批量存储老师信息
                boolean resultBool = smartUserService.saveBatch(teacherDatas);
                if (!resultBool) {
                    return CommonResult.fail("导入失败");
                } else {
                    //                需添加到海康平台
                    ArrayList<SmartOperationUser> operationUsers = new ArrayList<>();
                    for (SmartUser teacherData : teacherDatas) {
                        Integer id = teacherData.getId();
                        SmartOperationUser smartOperationUser = new SmartOperationUser();
                        smartOperationUser.setOperationId(id);
                        smartOperationUser.setOperationMode("1");
                        smartOperationUser.setStatus(1);
                        smartOperationUser.setType(teacherData.getIdentityId());
                        operationUsers.add(smartOperationUser);
                    }
                    smartOperationUserService.saveBatch(operationUsers);
                }

                //region 批量存储综合评价
                List<SmartEvaluateTeacher> insertETeachers = new ArrayList<>();
                List<SmartSemester> semesters = smartSemesterService.list(null);
                List<SmartClass> classes = smartClassService.list(null);
                List<SmartGrade> grades = smartGradeService.list(null);
                for (SmartUser teacher : teacherDatas) {
                    for (SmartSemester semester : semesters) {
                        //<0 : A < B
                        //=0 : A = B
                        //>0 : A > B
                        if (semester.getEndTime().compareTo(teacher.getCreateTime()) >= 0) {//说明在半学期创建的老师
                            SmartEvaluateTeacher set = new SmartEvaluateTeacher();
                            set.setCardNo(teacher.getCardNo());
                            set.setName(teacher.getName());
                            set.setUserId(teacher.getId());
                            set.setTermId(semester.getId());
                            set.setTerm(semester.getName());
                            if (teacher.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {//班主任才有年级和班级
                                set.setGradeId(Integer.valueOf(teacher.getGrade()));
                                Optional<SmartGrade> oGrade = grades.stream().filter(e -> e.getId().equals(set.getGradeId())).findFirst();
                                if (oGrade != null && oGrade.isPresent()) {
                                    set.setGradeName(oGrade.get().getName());
                                }
                                set.setClassId(teacher.getSchoolClass());
                                Optional<SmartClass> oClass = classes.stream().filter(e -> e.getId().equals(set.getClassId())).findFirst();
                                if (oClass != null && oClass.isPresent()) {
                                    set.setClassName(oClass.get().getName());
                                }
                            }
                            set.setTotalScore(0.0);
                            set.setLowingScore(0.0);
                            insertETeachers.add(set);
                        }
                    }
                }

                if (insertETeachers != null && insertETeachers.size() > 0) {
                    boolean insertEteacher = smartEvaluateTeacherService.saveBatch(insertETeachers);
                    if (!insertEteacher) {
                        return CommonResult.fail("导入失败");
                    }
                }
                //endregion
            }
        }

        return CommonResult.ok("导入成功");
    }
    //endregion

    //region 批量新增Xlsx文件读取方法

    /**
     * Xlsx文件读取方法
     *
     * @param inputStream 文件流
     * @return
     * @throws IOException
     */
    private CommonResult<List<SmartUser>> readXlsx(InputStream inputStream) throws IOException {
        List<String> idCards = new ArrayList<>();
        List<String> cardNos = new ArrayList<>();
        List<SmartUser> result = new ArrayList<>();
        XSSFWorkbook sheets = new XSSFWorkbook(inputStream);

        List<SmartDepartment> departments = smartDepartmentService.list(null);
        List<SmartGrade> grades = smartGradeService.list(null); //年级
        List<SmartClass> classs = smartClassService.list(null);//班级
        List<SmartTimeGroup> timeGroups = smartTimeGroupService.queryTimeGroups();//时间组
        //读取第一张sheet
        XSSFSheet sheetAt = sheets.getSheetAt(0);

        DataFormatter dataFormatter = new DataFormatter();
        //region 判断是老师还是学生导入
        boolean isTeacher = false;
        XSSFRow checkRow = sheetAt.getRow(0);
        if (checkRow != null) {
            String firstCow = dataFormatter.formatCellValue(checkRow.getCell(0));//第一列 学生是年级 老师是 学校名称
            if (firstCow.equals("学校名称")) {
                isTeacher = true;
            }
        }
        //endregion

        try {
            for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
                XSSFRow row = sheetAt.getRow(rowNum);
                if (row != null) {
                    if (!isTeacher) {
                        //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                        //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                        //然后poi会根据字符串读取它
                        //标题 校验
                        if (rowNum == 0) {
                            String schoolGrade = dataFormatter.formatCellValue(row.getCell(0));//年级
                            if (!schoolGrade.equals("年级")) {
                                return CommonResult.fail("导入数据第一列为年级");
                            }
                            String schoolClass = dataFormatter.formatCellValue(row.getCell(1));//班级
                            if (!schoolClass.equals("班级")) {
                                return CommonResult.fail("导入数据第一列为班级");
                            }
                            String cardNo = dataFormatter.formatCellValue(row.getCell(2));//学号
                            if (!cardNo.equals("学号")) {
                                return CommonResult.fail("导入数据第二列为学号");
                            }
                            String name = dataFormatter.formatCellValue(row.getCell(3));//姓名
                            if (!name.equals("姓名")) {
                                return CommonResult.fail("导入数据第三列为姓名");
                            }
                            String sex = dataFormatter.formatCellValue(row.getCell(4));//性别
                            if (!sex.equals("性别")) {
                                return CommonResult.fail("导入数据第四列为性别");
                            }
                            String nation = dataFormatter.formatCellValue(row.getCell(5));//民族
                            if (!nation.equals("民族")) {
                                return CommonResult.fail("导入数据第五列为民族");
                            }
                            String cardId = dataFormatter.formatCellValue(row.getCell(6));//身份证
                            if (!cardId.equals("身份证")) {
                                return CommonResult.fail("导入数据第六列为身份证");
                            }
                            String headImage = dataFormatter.formatCellValue(row.getCell(7));//照片
                            if (!headImage.equals("照片")) {
                                return CommonResult.fail("导入数据第七列为照片");
                            }
                            String timeGroup = dataFormatter.formatCellValue(row.getCell(8));//常规时间组
                            if (!timeGroup.equals("常规时间组")) {
                                return CommonResult.fail("导入数据第八列为常规时间组");
                            }
                            String address = dataFormatter.formatCellValue(row.getCell(9));//住址
                            if (!address.equals("住址")) {
                                return CommonResult.fail("导入数据第九列为住址");
                            }
                            String phone = dataFormatter.formatCellValue(row.getCell(10));//联系电话
                            if (!phone.equals("联系电话")) {
                                return CommonResult.fail("导入数据第十列为联系电话");
                            }
                            String family = dataFormatter.formatCellValue(row.getCell(11));//家属
                            if (!family.equals("家属")) {
                                return CommonResult.fail("导入数据第十一列为家属");
                            }
                            String familyShip = dataFormatter.formatCellValue(row.getCell(12));//家属与本人关系
                            if (!familyShip.equals("家属与本人关系")) {
                                return CommonResult.fail("导入数据第十二列为家属与本人关系");
                            }
                            String phoneTwo = dataFormatter.formatCellValue(row.getCell(13));//联系电话2
                            if (!phoneTwo.equals("联系电话2")) {
                                return CommonResult.fail("导入数据第十三列为联系电话2");
                            }
                            String familyTwo = dataFormatter.formatCellValue(row.getCell(14));//家属2
                            if (!familyTwo.equals("家属2")) {
                                return CommonResult.fail("导入数据第十四列为家属2");
                            }
                            String familyShipTwo = dataFormatter.formatCellValue(row.getCell(15));//家属与本人关系2
                            if (!familyShipTwo.equals("家属与本人关系2")) {
                                return CommonResult.fail("导入数据第十五列为家属与本人关系2");
                            }
                        } else {
                            SmartUser user = new SmartUser();
                            String name = dataFormatter.formatCellValue(row.getCell(3));
                            //                        if (ObjectUtils.isEmpty(name)) {
                            //                            return CommonResult.fail("第" + (rowNum + 1) + "条数据的名称不能为空");
                            //                        }
                            if (ObjectUtils.isEmpty(name)) {
                                continue;
                            }

                            String schoolGrade = dataFormatter.formatCellValue(row.getCell(0));//年级
                            if (ObjectUtils.isEmpty(schoolGrade)) {
                                return CommonResult.fail(name + "的年级不能为空");
                            }

                            String schoolClass = dataFormatter.formatCellValue(row.getCell(1));//班级
                            if (ObjectUtils.isEmpty(schoolClass)) {
                                return CommonResult.fail(name + "的班级不能为空");
                            }

                            //不判断重复性 因为会出现双胞胎
                            String phone = dataFormatter.formatCellValue(row.getCell(10));
                            //                        if (!ObjectUtils.isEmpty(phone)) {
                            //                            phones.add(phone);
                            //                        }
                            //                        if (phones.stream().distinct().count() != phones.size()) {
                            //                            return CommonResult.fail("导入的Excel中，联系电话：" + phone + "存在重复数据");
                            //                        }


                            //性别是否为空判断
                            String sex = dataFormatter.formatCellValue(row.getCell(4));
                            if (ObjectUtils.isEmpty(sex)) {
                                return CommonResult.fail(name + "的性别不能为空");
                            }

                            //家庭住址是否为空判断
                            String address = dataFormatter.formatCellValue(row.getCell(9));

                            //民族是否为空判断
                            String nation = dataFormatter.formatCellValue(row.getCell(5));
                            if (ObjectUtils.isEmpty(nation)) {
                                return CommonResult.fail(name + "的民族不能为空");
                            }

                            //部门是否为空判断
                            String department = dataFormatter.formatCellValue(row.getCell(1)).replace("年级", "") + "学生";
                            if (ObjectUtils.isEmpty(department)) {
                                return CommonResult.fail(name + "的部门不能为空");
                            }
                            Integer departmentId = null;
                            Optional<SmartDepartment> departModel = departments.stream().filter(e -> e.getName().equals(department)).findFirst();
                            if (departModel != null && departModel.isPresent()) {
                                departmentId = departModel.get().getId();
                            } else {
                                departmentId = 1;
                            }

                            //学号重复判断
                            String cardNo = dataFormatter.formatCellValue(row.getCell(2));
                            if (!ObjectUtils.isEmpty(cardNo)) {
                                cardNos.add(cardNo);
                            }
                            if (cardNos.stream().distinct().count() != cardNos.size()) {
                                return CommonResult.fail("导入的Excel中，" + name + "的学号：" + cardNo + "存在重复数据");
                            }

                            //身份证重复判断
                            String idCard = dataFormatter.formatCellValue(row.getCell(6));
                            if (!ObjectUtils.isEmpty(idCard)) {
                                idCards.add(idCard);
                            }
                            if (idCards.stream().distinct().count() != idCards.size()) {
                                return CommonResult.fail("导入的Excel中，" + name + "的身份证号：" + idCard + "存在重复数据");
                            }
                            user.setCardNo(cardNo == null ? "" : cardNo);
                            user.setName(name == null ? "" : name);
                            user.setIdentityId(eIdentityStatu.Student.getValue());
                            user.setIdCard(idCard == null ? "" : idCard);
                            user.setSexId(sex == null ? eSexStatu.Man.getValue() : eSexStatu.integerOf(sex));
                            user.setDepartmentId(departmentId);
                            String cellImage = dataFormatter.formatCellValue(row.getCell(7));
                            user.setHeadImage(cellImage);
                            user.setDormitoryNumber("");
                            String grade = schoolGrade == null ? "" : schoolGrade;
                            Optional<SmartGrade> oGrade = grades.stream().filter(e -> e.getName().equals(grade)).findFirst();
                            if (oGrade != null && oGrade.isPresent()) {
                                Integer gradeId = oGrade.get().getId();
                                user.setGrade(String.valueOf(gradeId));
                                Optional<SmartClass> oClass = classs.stream().filter(e -> e.getName().equals(schoolClass) && e.getGradeId().equals(gradeId)).findFirst();
                                if (oClass != null && oClass.isPresent()) {
                                    user.setSchoolClass(oClass.get().getId());
                                } else {
                                    return CommonResult.fail(name + "的班级数据无效，导入失败");
                                }

                            } else {
                                return CommonResult.fail(name + "的年级数据无效，导入失败");
                            }
                            user.setCollege("");
                            user.setSpeciality("");
                            user.setCampus("");
                            user.setPhone("");
                            user.setAffiliate("");
                            user.setTitle("");
                            user.setAddress(address == null ? "" : address);
                            user.setNation(nation == null ? "" : nation);
                            user.setOfStudent("");
                            user.setGraduate("");
                            user.setDuties(null);
                            String timeGroup = dataFormatter.formatCellValue(row.getCell(8));
                            Optional<SmartTimeGroup> groupData = timeGroups.stream().filter(e -> e.getName().equals(timeGroup)).findFirst();
                            if (groupData != null && groupData.isPresent()) {
                                user.setTimeGroupId(groupData.get().getId());
                            } else {
                                user.setTimeGroupId(0);
                            }

                            user.setIsCancel(eLogOff.Unlogout.getValue());

                            result.add(user);

                            //部门是否为空判断
                            String familyDepartment = dataFormatter.formatCellValue(row.getCell(1)).replace("年级", "") + "家长";

                            Integer familyDepartmentId = null;
                            Optional<SmartDepartment> familyDepartModel = departments.stream().filter(e -> e.getName().equals(familyDepartment)).findFirst();
                            if (familyDepartModel != null && familyDepartModel.isPresent()) {
                                familyDepartmentId = familyDepartModel.get().getId();
                            } else {
                                familyDepartmentId = 16;
                            }

                            //region 家属

                            if (!ObjectUtils.isEmpty(phone)) {
                                if (phone.length() != 11) {
                                    return CommonResult.fail(name + "的学生家长手机号长度不符合标准");
                                }

                                SmartUser familyOne = new SmartUser();
                                String family = dataFormatter.formatCellValue(row.getCell(11));//家属
                                familyOne.setName(!ObjectUtils.isEmpty(family) ? family : "家长");
                                familyOne.setDepartmentId(familyDepartmentId);
                                familyOne.setPhone(phone);
                                familyOne.setIdentityId(eIdentityStatu.Parent.getValue());
                                familyOne.setSexId(eSexStatu.Man.getValue());
                                familyOne.setIsCancel(eLogOff.Unlogout.getValue());
                                familyOne.setAffiliate(user.getCardNo());
                                String familyShip = dataFormatter.formatCellValue(row.getCell(12));//家属与本人关系
                                familyOne.setShip(familyShip == null ? "其他" : familyShip);
                                result.add(familyOne);
                            }

                            String phoneTwo = dataFormatter.formatCellValue(row.getCell(13));//联系电话2
                            if (!ObjectUtils.isEmpty(phoneTwo)) {
                                if (phoneTwo.length() != 11) {
                                    return CommonResult.fail(name + "的学生家长手机号长度不符合标准");
                                }
                                SmartUser familyTwo = new SmartUser();
                                String familyNameTwo = dataFormatter.formatCellValue(row.getCell(14));//家属2
                                familyTwo.setName(!ObjectUtils.isEmpty(familyNameTwo) ? familyNameTwo : "家长");
                                familyTwo.setDepartmentId(familyDepartmentId);
                                familyTwo.setPhone(phoneTwo == null ? "" : phoneTwo);
                                familyTwo.setIdentityId(eIdentityStatu.Parent.getValue());
                                familyTwo.setSexId(eSexStatu.Man.getValue());
                                familyTwo.setIsCancel(eLogOff.Unlogout.getValue());
                                familyTwo.setAffiliate(user.getCardNo());
                                String familyShipTwo = dataFormatter.formatCellValue(row.getCell(15));//家属与本人关系2
                                familyTwo.setShip(familyShipTwo == null ? "其他" : familyShipTwo);
                                result.add(familyTwo);
                            }
                            //endregion

                            //希沃不允许一个学生家长的两个手机号重复 所以做一个重复性判断
                            if (!ObjectUtils.isEmpty(phone) && !ObjectUtils.isEmpty(dataFormatter.formatCellValue(row.getCell(13)))) {
                                if (phone.equals(dataFormatter.formatCellValue(row.getCell(13)))) {
                                    return CommonResult.fail(name + "的学生家长手机号不可重复");
                                }
                            }
                            //endregion
                        }
                    } else {
                        //教师导入
                        //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                        //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                        //然后poi会根据字符串读取它
                        //标题 校验
                        if (rowNum == 0) {
                            String schoolName = dataFormatter.formatCellValue(row.getCell(0));//学校名称
                            if (!schoolName.equals("学校名称")) {
                                return CommonResult.fail("导入数据第一列为学校名称");
                            }
                            String departmentNo = dataFormatter.formatCellValue(row.getCell(1));//部门编码
                            if (!departmentNo.equals("部门编码")) {
                                return CommonResult.fail("导入数据第二列为部门编码");
                            }
                            String departmentName = dataFormatter.formatCellValue(row.getCell(2));//部门名称
                            if (!departmentName.equals("部门名称")) {
                                return CommonResult.fail("导入数据第三列为部门名称");
                            }
                            String teacherNo = dataFormatter.formatCellValue(row.getCell(3));//教师编码
                            if (!teacherNo.equals("教师编码")) {
                                return CommonResult.fail("导入数据第四列为教师编码");
                            }

                            String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                            if (!name.equals("姓名")) {
                                return CommonResult.fail("导入数据第五列为姓名");
                            }
                            String sex = dataFormatter.formatCellValue(row.getCell(5));//性别
                            if (!sex.equals("性别")) {
                                return CommonResult.fail("导入数据第六列为性别");
                            }
                            String phone = dataFormatter.formatCellValue(row.getCell(6));//联系电话
                            if (!phone.equals("联系电话")) {
                                return CommonResult.fail("导入数据第七列为联系电话");
                            }
                            String schoolClass = dataFormatter.formatCellValue(row.getCell(7));//管理班级
                            if (!schoolClass.equals("管理班级")) {
                                return CommonResult.fail("导入数据第八列为身份证");
                            }
                            String nation = dataFormatter.formatCellValue(row.getCell(8));//民族
                            if (!nation.equals("民族")) {
                                return CommonResult.fail("导入数据第九列为民族");
                            }
                            String card = dataFormatter.formatCellValue(row.getCell(9));//身份证
                            if (!card.equals("身份证(允许为空）")) {
                                return CommonResult.fail("导入数据第十列为身份证");
                            }
                            String photo = dataFormatter.formatCellValue(row.getCell(10));//照片
                            if (!photo.equals("照片")) {
                                return CommonResult.fail("导入数据第十一列为照片");
                            }
                            String timeGroup = dataFormatter.formatCellValue(row.getCell(11));//常规时间组
                            if (!timeGroup.equals("常规时间组")) {
                                return CommonResult.fail("导入数据第十二列为常规时间组");
                            }
                            String address = dataFormatter.formatCellValue(row.getCell(12));//住址
                            if (!address.equals("住址")) {
                                return CommonResult.fail("导入数据第十三列为住址");
                            }
                        } else {
                            SmartUser user = new SmartUser();
                            user.setIdentityId(eIdentityStatu.Teacher.getValue());
                            String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                            if (ObjectUtils.isEmpty(name)) {
                                continue;
                            }

                            user.setName(name);

                            String sex = dataFormatter.formatCellValue(row.getCell(5));//性别
                            user.setSexId(sex == null ? eSexStatu.Man.getValue() : eSexStatu.integerOf(sex));

                            String departmentName = dataFormatter.formatCellValue(row.getCell(2));//部门名称
                            if (ObjectUtils.isEmpty(departmentName)) {
                                return CommonResult.fail(name + "的部门名称不能为空");
                            }

                            String departmentNo = dataFormatter.formatCellValue(row.getCell(1));//部门编码
                            if (ObjectUtils.isEmpty(departmentNo)) {
                                return CommonResult.fail(name + "的部门编码不能为空");
                            }

                            Optional<SmartDepartment> oDepartment = departments.stream().filter(e -> e.getName().equals(departmentName)).findFirst();
                            if (!(oDepartment != null && oDepartment.isPresent())) {
                                return CommonResult.fail(departmentName + "部门数据在系统中不存在");
                            }

                            user.setDepartmentId(oDepartment.get().getId());

                            if (departmentName.equals("班主任")) {
                                String schoolClass = dataFormatter.formatCellValue(row.getCell(7));//班级
                                if (ObjectUtils.isEmpty(schoolClass)) {
                                    return CommonResult.fail(name + "的管理班级不能为空");
                                }
                                //班级和年级
                                Optional<SmartClass> oClass = classs.stream().filter(e -> e.getName().equals(schoolClass)).findFirst();
                                if (!(oClass != null && oClass.isPresent())) {
                                    return CommonResult.fail(schoolClass + "的班级数据在系统中不存在");
                                }
                                user.setSchoolClass(oClass.get().getId());
                                user.setGrade(String.valueOf(oClass.get().getGradeId()));
                                user.setDuties(eDuties.ClassTeacher.getValue());
                            } else {
                                user.setDuties(5);//任课老师
                            }

                            String teacherNo = dataFormatter.formatCellValue(row.getCell(3));//教师编码
                            if (!ObjectUtils.isEmpty(teacherNo)) {
                                user.setBsStaffCode(teacherNo);
                            }

                            String phone = dataFormatter.formatCellValue(row.getCell(6));//联系电话
                            if (ObjectUtils.isEmpty(phone)) {
                                return CommonResult.fail(name + "的手机号不能为空");
                            }

                            user.setCardNo(phone);
                            user.setPhone(phone);
                            user.setXwTeacherCode(phone);

                            String nation = dataFormatter.formatCellValue(row.getCell(8));//民族
                            if (!ObjectUtils.isEmpty(nation)) {
                                user.setNation(nation);
                            }

                            String card = dataFormatter.formatCellValue(row.getCell(9));//身份证
                            if (!ObjectUtils.isEmpty(card)) {
                                user.setIdCard(card);
                            }

                            String photo = dataFormatter.formatCellValue(row.getCell(10));//照片
                            if (!ObjectUtils.isEmpty(photo)) {
                                user.setHeadImage(photo);
                            }

                            String timeGroup = dataFormatter.formatCellValue(row.getCell(11));//常规时间组
                            if (!ObjectUtils.isEmpty(timeGroup)) {
                                Optional<SmartTimeGroup> groupData = timeGroups.stream().filter(e -> e.getName().equals(timeGroup)).findFirst();
                                if (groupData != null && groupData.isPresent()) {
                                    user.setTimeGroupId(groupData.get().getId());
                                }
                            }

                            String address = dataFormatter.formatCellValue(row.getCell(12));//住址
                            if (!ObjectUtils.isEmpty(address)) {
                                user.setAddress(address);
                            }
                            user.setIsCancel(eLogOff.Unlogout.getValue());

                            result.add(user);
                        }
                    }
                }
            }
        } catch (Exception e) {
            return CommonResult.fail("请按模板格式导入数据");
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region 批量新增Xls文件读取方法

    /**
     * Xls文件读取方法
     *
     * @param inputStream 文件流
     * @return
     * @throws IOException
     */
    private CommonResult<List<SmartUser>> readXls(InputStream inputStream) throws IOException {
        List<String> idCards = new ArrayList<>();
        List<String> cardNos = new ArrayList<>();
        List<SmartUser> result = new ArrayList<>();
        HSSFWorkbook sheets = new HSSFWorkbook(inputStream);

        List<SmartDepartment> departments = smartDepartmentService.list(null);
        List<SmartGrade> grades = smartGradeService.list(null); //年级
        List<SmartClass> classs = smartClassService.list(null);//班级
        List<SmartTimeGroup> timeGroups = smartTimeGroupService.queryTimeGroups();//时间组

        //读取第一张sheet
        HSSFSheet sheetAt = sheets.getSheetAt(0);
        DataFormatter dataFormatter = new DataFormatter();

        //region 判断是老师还是学生导入
        boolean isTeacher = false;
        HSSFRow checkRow = sheetAt.getRow(0);
        if (checkRow != null) {
            String firstCow = dataFormatter.formatCellValue(checkRow.getCell(0));//第一列 学生是年级 老师是 学校名称
            if (firstCow.equals("学校名称")) {
                isTeacher = true;
            }
        }
        //endregion

        try {
            for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
                HSSFRow row = sheetAt.getRow(rowNum);
                if (row != null) {
                    if (!isTeacher) {
                        //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                        //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                        //然后poi会根据字符串读取它
                        //标题 校验
                        if (rowNum == 0) {
                            String schoolGrade = dataFormatter.formatCellValue(row.getCell(0));//年级
                            if (!schoolGrade.equals("年级")) {
                                return CommonResult.fail("导入数据第一列为年级");
                            }
                            String schoolClass = dataFormatter.formatCellValue(row.getCell(1));//班级
                            if (!schoolClass.equals("班级")) {
                                return CommonResult.fail("导入数据第一列为班级");
                            }
                            String cardNo = dataFormatter.formatCellValue(row.getCell(2));//学号
                            if (!cardNo.equals("学号")) {
                                return CommonResult.fail("导入数据第二列为学号");
                            }
                            String name = dataFormatter.formatCellValue(row.getCell(3));//姓名
                            if (!name.equals("姓名")) {
                                return CommonResult.fail("导入数据第三列为姓名");
                            }
                            String sex = dataFormatter.formatCellValue(row.getCell(4));//性别
                            if (!sex.equals("性别")) {
                                return CommonResult.fail("导入数据第四列为性别");
                            }
                            String nation = dataFormatter.formatCellValue(row.getCell(5));//民族
                            if (!nation.equals("民族")) {
                                return CommonResult.fail("导入数据第五列为民族");
                            }
                            String cardId = dataFormatter.formatCellValue(row.getCell(6));//身份证
                            if (!cardId.equals("身份证")) {
                                return CommonResult.fail("导入数据第六列为身份证");
                            }
                            String headImage = dataFormatter.formatCellValue(row.getCell(7));//照片
                            if (!headImage.equals("照片")) {
                                return CommonResult.fail("导入数据第七列为照片");
                            }
                            String timeGroup = dataFormatter.formatCellValue(row.getCell(8));//常规时间组
                            if (!timeGroup.equals("常规时间组")) {
                                return CommonResult.fail("导入数据第八列为常规时间组");
                            }
                            String address = dataFormatter.formatCellValue(row.getCell(9));//住址
                            if (!address.equals("住址")) {
                                return CommonResult.fail("导入数据第九列为住址");
                            }
                            String phone = dataFormatter.formatCellValue(row.getCell(10));//联系电话
                            if (!phone.equals("联系电话")) {
                                return CommonResult.fail("导入数据第十列为联系电话");
                            }
                            String family = dataFormatter.formatCellValue(row.getCell(11));//家属
                            if (!family.equals("家属")) {
                                return CommonResult.fail("导入数据第十一列为家属");
                            }
                            String familyShip = dataFormatter.formatCellValue(row.getCell(12));//家属与本人关系
                            if (!familyShip.equals("家属与本人关系")) {
                                return CommonResult.fail("导入数据第十二列为家属与本人关系");
                            }
                            String phoneTwo = dataFormatter.formatCellValue(row.getCell(13));//联系电话2
                            if (!phoneTwo.equals("联系电话2")) {
                                return CommonResult.fail("导入数据第十三列为联系电话2");
                            }
                            String familyTwo = dataFormatter.formatCellValue(row.getCell(14));//家属2
                            if (!familyTwo.equals("家属2")) {
                                return CommonResult.fail("导入数据第十四列为家属2");
                            }
                            String familyShipTwo = dataFormatter.formatCellValue(row.getCell(15));//家属与本人关系2
                            if (!familyShipTwo.equals("家属与本人关系2")) {
                                return CommonResult.fail("导入数据第十五列为家属与本人关系2");
                            }
                        } else {
                            SmartUser user = new SmartUser();
                            String name = dataFormatter.formatCellValue(row.getCell(3));
                            //                        if (ObjectUtils.isEmpty(name)) {
                            //                            return CommonResult.fail("第" + (rowNum + 1) + "条数据的名称不能为空");
                            //                        }
                            if (ObjectUtils.isEmpty(name)) {
                                continue;
                            }

                            String schoolGrade = dataFormatter.formatCellValue(row.getCell(0));//年级
                            if (ObjectUtils.isEmpty(schoolGrade)) {
                                return CommonResult.fail(name + "的年级不能为空");
                            }

                            String schoolClass = dataFormatter.formatCellValue(row.getCell(1));//班级
                            if (ObjectUtils.isEmpty(schoolClass)) {
                                return CommonResult.fail(name + "的班级不能为空");
                            }

                            //不判断重复性 因为会出现双胞胎
                            String phone = dataFormatter.formatCellValue(row.getCell(10));
                            //                        if (!ObjectUtils.isEmpty(phone)) {
                            //                            phones.add(phone);
                            //                        }
                            //                        if (phones.stream().distinct().count() != phones.size()) {
                            //                            return CommonResult.fail("导入的Excel中，联系电话：" + phone + "存在重复数据");
                            //                        }


                            //性别是否为空判断
                            String sex = dataFormatter.formatCellValue(row.getCell(4));
                            if (ObjectUtils.isEmpty(sex)) {
                                return CommonResult.fail(name + "的性别不能为空");
                            }

                            //家庭住址是否为空判断
                            String address = dataFormatter.formatCellValue(row.getCell(9));

                            //民族是否为空判断
                            String nation = dataFormatter.formatCellValue(row.getCell(5));
                            if (ObjectUtils.isEmpty(nation)) {
                                return CommonResult.fail(name + "的民族不能为空");
                            }

                            //部门是否为空判断
                            String department = dataFormatter.formatCellValue(row.getCell(1)).replace("年级", "") + "学生";
                            if (ObjectUtils.isEmpty(department)) {
                                return CommonResult.fail(name + "的部门不能为空");
                            }
                            Integer departmentId = null;
                            Optional<SmartDepartment> departModel = departments.stream().filter(e -> e.getName().equals(department)).findFirst();
                            if (departModel != null && departModel.isPresent()) {
                                departmentId = departModel.get().getId();
                            } else {
                                departmentId = 1;
                            }

                            //学号重复判断
                            String cardNo = dataFormatter.formatCellValue(row.getCell(2));
                            if (!ObjectUtils.isEmpty(cardNo)) {
                                cardNos.add(cardNo);
                            }
                            if (cardNos.stream().distinct().count() != cardNos.size()) {
                                return CommonResult.fail("导入的Excel中，" + name + "的学号：" + cardNo + "存在重复数据");
                            }

                            //身份证重复判断
                            String idCard = dataFormatter.formatCellValue(row.getCell(6));
                            if (!ObjectUtils.isEmpty(idCard)) {
                                idCards.add(idCard);
                            }
                            if (idCards.stream().distinct().count() != idCards.size()) {
                                return CommonResult.fail("导入的Excel中，" + name + "的身份证号：" + idCard + "存在重复数据");
                            }
                            user.setCardNo(cardNo == null ? "" : cardNo);
                            user.setName(name == null ? "" : name);
                            user.setIdentityId(eIdentityStatu.Student.getValue());
                            user.setIdCard(idCard == null ? "" : idCard);
                            user.setSexId(sex == null ? eSexStatu.Man.getValue() : eSexStatu.integerOf(sex));
                            user.setDepartmentId(departmentId);
                            String cellImage = dataFormatter.formatCellValue(row.getCell(7));
                            user.setHeadImage(cellImage);
                            user.setDormitoryNumber("");
                            String grade = schoolGrade == null ? "" : schoolGrade;
                            Optional<SmartGrade> oGrade = grades.stream().filter(e -> e.getName().equals(grade)).findFirst();
                            if (oGrade != null && oGrade.isPresent()) {
                                Integer gradeId = oGrade.get().getId();
                                user.setGrade(String.valueOf(gradeId));
                                Optional<SmartClass> oClass = classs.stream().filter(e -> e.getName().equals(schoolClass) && e.getGradeId().equals(gradeId)).findFirst();
                                if (oClass != null && oClass.isPresent()) {
                                    user.setSchoolClass(oClass.get().getId());
                                } else {
                                    return CommonResult.fail(name + "的班级数据无效，导入失败");
                                }

                            } else {
                                return CommonResult.fail(name + "的年级数据无效，导入失败");
                            }
                            user.setCollege("");
                            user.setSpeciality("");
                            user.setCampus("");
                            user.setPhone("");
                            user.setAffiliate("");
                            user.setTitle("");
                            user.setAddress(address == null ? "" : address);
                            user.setNation(nation == null ? "" : nation);
                            user.setOfStudent("");
                            user.setGraduate("");
                            user.setDuties(null);
                            String timeGroup = dataFormatter.formatCellValue(row.getCell(8));
                            Optional<SmartTimeGroup> groupData = timeGroups.stream().filter(e -> e.getName().equals(timeGroup)).findFirst();
                            if (groupData != null && groupData.isPresent()) {
                                user.setTimeGroupId(groupData.get().getId());
                            } else {
                                user.setTimeGroupId(0);
                            }

                            user.setIsCancel(eLogOff.Unlogout.getValue());

                            result.add(user);

                            //部门是否为空判断
                            String familyDepartment = dataFormatter.formatCellValue(row.getCell(1)).replace("年级", "") + "家长";

                            Integer familyDepartmentId = null;
                            Optional<SmartDepartment> familyDepartModel = departments.stream().filter(e -> e.getName().equals(familyDepartment)).findFirst();
                            if (familyDepartModel != null && familyDepartModel.isPresent()) {
                                familyDepartmentId = familyDepartModel.get().getId();
                            } else {
                                familyDepartmentId = 16;
                            }

                            //region 家属

                            if (!ObjectUtils.isEmpty(phone)) {
                                if (phone.length() != 11) {
                                    return CommonResult.fail(name + "的学生家长手机号长度不符合标准");
                                }

                                SmartUser familyOne = new SmartUser();
                                String family = dataFormatter.formatCellValue(row.getCell(11));//家属
                                familyOne.setName(!ObjectUtils.isEmpty(family) ? family : "家长");
                                familyOne.setDepartmentId(familyDepartmentId);
                                familyOne.setPhone(phone);
                                familyOne.setIdentityId(eIdentityStatu.Parent.getValue());
                                familyOne.setSexId(eSexStatu.Man.getValue());
                                familyOne.setIsCancel(eLogOff.Unlogout.getValue());
                                familyOne.setAffiliate(user.getCardNo());
                                String familyShip = dataFormatter.formatCellValue(row.getCell(12));//家属与本人关系
                                familyOne.setShip(familyShip == null ? "其他" : familyShip);
                                result.add(familyOne);
                            }

                            String phoneTwo = dataFormatter.formatCellValue(row.getCell(13));//联系电话2
                            if (!ObjectUtils.isEmpty(phoneTwo)) {
                                if (phoneTwo.length() != 11) {
                                    return CommonResult.fail(name + "的学生家长手机号长度不符合标准");
                                }
                                SmartUser familyTwo = new SmartUser();
                                String familyNameTwo = dataFormatter.formatCellValue(row.getCell(14));//家属2
                                familyTwo.setName(!ObjectUtils.isEmpty(familyNameTwo) ? familyNameTwo : "家长");
                                familyTwo.setDepartmentId(familyDepartmentId);
                                familyTwo.setPhone(phoneTwo == null ? "" : phoneTwo);
                                familyTwo.setIdentityId(eIdentityStatu.Parent.getValue());
                                familyTwo.setSexId(eSexStatu.Man.getValue());
                                familyTwo.setIsCancel(eLogOff.Unlogout.getValue());
                                familyTwo.setAffiliate(user.getCardNo());
                                String familyShipTwo = dataFormatter.formatCellValue(row.getCell(15));//家属与本人关系2
                                familyTwo.setShip(familyShipTwo == null ? "其他" : familyShipTwo);
                                result.add(familyTwo);
                            }
                            //endregion

                            //希沃不允许一个学生家长的两个手机号重复 所以做一个重复性判断
                            if (!ObjectUtils.isEmpty(phone) && !ObjectUtils.isEmpty(dataFormatter.formatCellValue(row.getCell(13)))) {
                                if (phone.equals(dataFormatter.formatCellValue(row.getCell(13)))) {
                                    return CommonResult.fail(name + "的学生家长手机号不可重复");
                                }
                            }
                            //endregion
                        }
                    } else {
                        //教师导入
                        //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                        //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                        //然后poi会根据字符串读取它
                        //标题 校验
                        if (rowNum == 0) {
                            String schoolName = dataFormatter.formatCellValue(row.getCell(0));//学校名称
                            if (!schoolName.equals("学校名称")) {
                                return CommonResult.fail("导入数据第一列为学校名称");
                            }
                            String departmentNo = dataFormatter.formatCellValue(row.getCell(1));//部门编码
                            if (!departmentNo.equals("部门编码")) {
                                return CommonResult.fail("导入数据第二列为部门编码");
                            }
                            String departmentName = dataFormatter.formatCellValue(row.getCell(2));//部门名称
                            if (!departmentName.equals("部门名称")) {
                                return CommonResult.fail("导入数据第三列为部门名称");
                            }
                            String teacherNo = dataFormatter.formatCellValue(row.getCell(3));//教师编码
                            if (!teacherNo.equals("教师编码")) {
                                return CommonResult.fail("导入数据第四列为教师编码");
                            }

                            String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                            if (!name.equals("姓名")) {
                                return CommonResult.fail("导入数据第五列为姓名");
                            }
                            String sex = dataFormatter.formatCellValue(row.getCell(5));//性别
                            if (!sex.equals("性别")) {
                                return CommonResult.fail("导入数据第六列为性别");
                            }
                            String phone = dataFormatter.formatCellValue(row.getCell(6));//联系电话
                            if (!phone.equals("联系电话")) {
                                return CommonResult.fail("导入数据第七列为联系电话");
                            }
                            String schoolClass = dataFormatter.formatCellValue(row.getCell(7));//管理班级
                            if (!schoolClass.equals("管理班级")) {
                                return CommonResult.fail("导入数据第八列为身份证");
                            }
                            String nation = dataFormatter.formatCellValue(row.getCell(8));//民族
                            if (!nation.equals("民族")) {
                                return CommonResult.fail("导入数据第九列为民族");
                            }
                            String card = dataFormatter.formatCellValue(row.getCell(9));//身份证
                            if (!card.equals("身份证(允许为空）")) {
                                return CommonResult.fail("导入数据第十列为身份证");
                            }
                            String photo = dataFormatter.formatCellValue(row.getCell(10));//照片
                            if (!photo.equals("照片")) {
                                return CommonResult.fail("导入数据第十一列为照片");
                            }
                            String timeGroup = dataFormatter.formatCellValue(row.getCell(11));//常规时间组
                            if (!timeGroup.equals("常规时间组")) {
                                return CommonResult.fail("导入数据第十二列为常规时间组");
                            }
                            String address = dataFormatter.formatCellValue(row.getCell(12));//住址
                            if (!address.equals("住址")) {
                                return CommonResult.fail("导入数据第十三列为住址");
                            }
                        } else {
                            SmartUser user = new SmartUser();
                            user.setIdentityId(eIdentityStatu.Teacher.getValue());
                            String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                            if (ObjectUtils.isEmpty(name)) {
                                continue;
                            }

                            user.setName(name);

                            String sex = dataFormatter.formatCellValue(row.getCell(5));//性别
                            user.setSexId(sex == null ? eSexStatu.Man.getValue() : eSexStatu.integerOf(sex));

                            String departmentName = dataFormatter.formatCellValue(row.getCell(2));//部门名称
                            if (ObjectUtils.isEmpty(departmentName)) {
                                return CommonResult.fail(name + "的部门名称不能为空");
                            }

                            String departmentNo = dataFormatter.formatCellValue(row.getCell(1));//部门编码
                            if (ObjectUtils.isEmpty(departmentNo)) {
                                return CommonResult.fail(name + "的部门编码不能为空");
                            }

                            Optional<SmartDepartment> oDepartment = departments.stream().filter(e -> e.getName().equals(departmentName)).findFirst();
                            if (!(oDepartment != null && oDepartment.isPresent())) {
                                return CommonResult.fail(departmentName + "部门数据在系统中不存在");
                            }

                            user.setDepartmentId(oDepartment.get().getId());

                            if (departmentName.equals("班主任")) {
                                String schoolClass = dataFormatter.formatCellValue(row.getCell(7));//班级
                                if (ObjectUtils.isEmpty(schoolClass)) {
                                    return CommonResult.fail(name + "的管理班级不能为空");
                                }
                                //班级和年级
                                Optional<SmartClass> oClass = classs.stream().filter(e -> e.getName().equals(schoolClass)).findFirst();
                                if (!(oClass != null && oClass.isPresent())) {
                                    return CommonResult.fail(schoolClass + "的班级数据在系统中不存在");
                                }
                                user.setSchoolClass(oClass.get().getId());
                                user.setGrade(String.valueOf(oClass.get().getGradeId()));
                                user.setDuties(eDuties.ClassTeacher.getValue());
                            } else {
                                user.setDuties(5);//任课老师
                            }

                            String teacherNo = dataFormatter.formatCellValue(row.getCell(3));//教师编码
                            if (!ObjectUtils.isEmpty(teacherNo)) {
                                user.setBsStaffCode(teacherNo);
                            }

                            String phone = dataFormatter.formatCellValue(row.getCell(6));//联系电话
                            if (ObjectUtils.isEmpty(phone)) {
                                return CommonResult.fail(name + "的手机号不能为空");
                            }

                            user.setCardNo(phone);
                            user.setPhone(phone);
                            user.setXwTeacherCode(phone);

                            String nation = dataFormatter.formatCellValue(row.getCell(8));//民族
                            if (!ObjectUtils.isEmpty(nation)) {
                                user.setNation(nation);
                            }

                            String card = dataFormatter.formatCellValue(row.getCell(9));//身份证
                            if (!ObjectUtils.isEmpty(card)) {
                                user.setIdCard(card);
                            }

                            String photo = dataFormatter.formatCellValue(row.getCell(10));//照片
                            if (!ObjectUtils.isEmpty(photo)) {
                                user.setHeadImage(photo);
                            }

                            String timeGroup = dataFormatter.formatCellValue(row.getCell(11));//常规时间组
                            if (!ObjectUtils.isEmpty(timeGroup)) {
                                Optional<SmartTimeGroup> groupData = timeGroups.stream().filter(e -> e.getName().equals(timeGroup)).findFirst();
                                if (groupData != null && groupData.isPresent()) {
                                    user.setTimeGroupId(groupData.get().getId());
                                }
                            }

                            String address = dataFormatter.formatCellValue(row.getCell(12));//住址
                            if (!ObjectUtils.isEmpty(address)) {
                                user.setAddress(address);
                            }
                            user.setIsCancel(eLogOff.Unlogout.getValue());

                            result.add(user);
                        }
                    }
                }
            }
        } catch (Exception e) {
            return CommonResult.fail("请按模板格式导入数据");
        }

        return CommonResult.ok(result);
    }
    //endregion

    //endregion

    //region 批量更新用户

    //region 批量更新用户方法

    /**
     * 只更新 姓名 班级 时间组
     *
     * @param excelFile excel文件
     * @return
     * @throws IOException
     */
    @Override
    public CommonResult importExcelUpdateUsers(MultipartFile excelFile) throws Exception {
        List<SmartUser> result = new ArrayList<>();

        int useXw = 1;
        int useBs = 1;

        //先解析excel如果excel不满足格式就提示错误信息 避免提前占用带宽上传头像
        if (excelFile.isEmpty() || excelFile.getSize() == 0) {
            return CommonResult.fail("excel文件不能为空");
        }

        String ContentType = excelFile.getContentType();
        InputStream inputStream = excelFile.getInputStream();

        //xls格式文件
        if (ContentType.equals(eFileType.Xls.getValue())) {
            CommonResult<List<SmartUser>> resultData = readUpdateXls(inputStream);
            if (!resultData.isSuccess()) {
                return resultData;
            }
            result = resultData.getData();
        } else if (ContentType.equals(eFileType.Xlsx.getValue())) {
            CommonResult<List<SmartUser>> resultData = readUpdateXlsx(inputStream);
            if (!resultData.isSuccess()) {
                return resultData;
            }
            result = resultData.getData();
        } else {
            return CommonResult.fail("用户导入只支持Xls、Xlsx");
        }

        //获取导入学生的相关数据
        List<String> cardNos = result.stream().map(SmartUser::getCardNo).collect(Collectors.toList());
        if (cardNos == null) {
            return CommonResult.fail("文档内容为空，批量更新失败");
        }

        List<SmartGrade> grades = smartGradeService.list(null);
        List<SmartUser> studentDatas = smartUserService.querySmartUserByCardNos(cardNos);
        List<SmartClass> classes = smartClassService.list(null);

        List<SmartUser> updateStudent = new ArrayList<>();
        for (SmartUser studentData : result) {
            Optional<SmartUser> oldStudent = studentDatas.stream().filter(e -> e.getCardNo().equals(studentData.getCardNo())).findFirst();
            if (oldStudent != null && oldStudent.isPresent()) {
                oldStudent.get().setName(studentData.getName());//姓名
                oldStudent.get().setSchoolClass(studentData.getSchoolClass());//班级
                oldStudent.get().setGrade(studentData.getGrade());//可能会变年级
                oldStudent.get().setTimeGroupId(studentData.getTimeGroupId());//时间组
                updateStudent.add(oldStudent.get());
                Optional<SmartGrade> oGrade = grades.stream().filter(e -> String.valueOf(e.getId()).equals(studentData.getGrade())).findFirst();
                if (oGrade != null && oGrade.isPresent()) {
                    Optional<SmartClass> oClass = classes.stream().filter(e -> e.getId().equals(studentData.getSchoolClass())).findFirst();
                    if (oClass != null && oClass.isPresent()) {
                        if (useXw == 1) {
                            SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
                            CommonResult updateSwStudent = SeewoUpdateStudent(seewoClient, oldStudent.get());
                            if (!updateSwStudent.isSuccess()) {
                                return CommonResult.fail("希沃平台：" + updateSwStudent.getMessage());
                            }
                        }

                        if (useBs == 1) {
                            /**
                             * 学生数据的有效期是到毕业年份的8月31日
                             */
                            String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                            String endTime = queryGraduationYear(oGrade.get().getGradeNo());
                            CommonResult<String> updateBsStudent = bsEUpdateStudent(oldStudent.get(), oClass.get().getBsClassNo(), startTime, endTime);
                            if (!updateBsStudent.isSuccess()) {
                                return CommonResult.fail("百胜平台：" + updateBsStudent.getMessage());
                            }
                        }

                    } else {
                        return CommonResult.fail("学号为：" + studentData.getCardNo() + "的" + studentData.getName() + "的班级数据无效，无法进行更新操作");
                    }

                } else {
                    return CommonResult.fail("学号为：" + studentData.getCardNo() + "的" + studentData.getName() + "的年级数据无效，无法进行更新操作");
                }
            } else {
                return CommonResult.fail("学号为：" + studentData.getCardNo() + "的" + studentData.getName() + "的数据在系统中不存在，无法进行更新操作");
            }
        }

        if (updateStudent != null && updateStudent.size() > 0) {
            boolean updateBatch = smartUserService.updateUserBatchById(updateStudent);
            if (!updateBatch) {
                return CommonResult.fail("系统批量更新出错，导入失败");
            } else {
//                修改需同步到海康平台
                for (SmartUser su : updateStudent) {
                    Integer identityId = su.getIdentityId();
                    if (2 == identityId || identityId == 3) {
                        Integer id = su.getId();
                        SmartOperationUser smartOperationUser = new SmartOperationUser();
                        smartOperationUser.setOperationId(id);
                        smartOperationUser.setOperationMode("2");
                        smartOperationUser.setStatus(1);
                        smartOperationUser.setType(identityId);
                        smartOperationUserService.save(smartOperationUser);
                    }
                }
            }
        }

        return CommonResult.ok("导入成功");
    }
    //endregion

    //region Xls文件读取方法

    /**
     * Xls文件读取方法
     *
     * @param inputStream 文件流
     * @return
     * @throws IOException
     */
    private CommonResult<List<SmartUser>> readUpdateXls(InputStream inputStream) throws IOException {
        List<SmartUser> result = new ArrayList<>();
        HSSFWorkbook sheets = new HSSFWorkbook(inputStream);

        List<SmartClass> classs = smartClassService.list(null);//班级
        List<SmartTimeGroup> timeGroups = smartTimeGroupService.queryTimeGroups();//时间组

        //读取第一张sheet
        HSSFSheet sheetAt = sheets.getSheetAt(0);

        DataFormatter dataFormatter = new DataFormatter();
        try {
            for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
                HSSFRow row = sheetAt.getRow(rowNum);

                if (row != null) {
                    //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                    //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                    //然后poi会根据字符串读取它
                    //标题 校验
                    if (rowNum == 1) {
                        String xwNo = dataFormatter.formatCellValue(row.getCell(1));//希沃编号
                        if (!xwNo.equals("希沃编号")) {
                            return CommonResult.fail("导入数据第二列为希沃编号");
                        }
                        String bsNo = dataFormatter.formatCellValue(row.getCell(2));//百胜编号
                        if (!bsNo.equals("百胜编号")) {
                            return CommonResult.fail("导入数据第三列为百胜编号");
                        }
                        String cardNo = dataFormatter.formatCellValue(row.getCell(3));//学号
                        if (!cardNo.equals("学号")) {
                            return CommonResult.fail("导入数据第四列为学号");
                        }
                        String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                        if (!name.equals("姓名")) {
                            return CommonResult.fail("导入数据第五列为姓名");
                        }
                        String schoolClass = dataFormatter.formatCellValue(row.getCell(5));//班级
                        if (!schoolClass.equals("班级")) {
                            return CommonResult.fail("导入数据第六列为班级");
                        }
                        String group = dataFormatter.formatCellValue(row.getCell(6));//时间组
                        if (!group.equals("时间组")) {
                            return CommonResult.fail("导入数据第七列为时间组");
                        }
                    } else {
                        SmartUser user = new SmartUser();

                        String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                        if (ObjectUtils.isEmpty(name)) {
                            return CommonResult.fail("第" + (rowNum) + "条数据的名称不能为空");
                        }

                        String xwNo = dataFormatter.formatCellValue(row.getCell(1));//希沃编号
                        if (ObjectUtils.isEmpty(xwNo)) {
                            return CommonResult.fail(name + "的希沃编号不能为空");
                        }

                        String bsNo = dataFormatter.formatCellValue(row.getCell(2));//百胜编号
                        if (ObjectUtils.isEmpty(bsNo)) {
                            return CommonResult.fail(name + "的百胜编号不能为空");
                        }

                        String cardNo = dataFormatter.formatCellValue(row.getCell(3));//学号
                        if (ObjectUtils.isEmpty(cardNo)) {
                            return CommonResult.fail(name + "的学号不能为空");
                        }
                        String schoolClass = dataFormatter.formatCellValue(row.getCell(5));//班级
                        if (ObjectUtils.isEmpty(schoolClass)) {
                            return CommonResult.fail(name + "的班级不能为空");
                        }
                        String group = dataFormatter.formatCellValue(row.getCell(6));//时间组
                        if (ObjectUtils.isEmpty(group)) {
                            return CommonResult.fail(name + "的时间组不能为空");
                        }


                        user.setCardNo(cardNo == null ? "" : cardNo);
                        user.setName(name == null ? "" : name);
                        user.setIdentityId(eIdentityStatu.Student.getValue());

                        Optional<SmartClass> oClass = classs.stream().filter(e -> e.getName().equals(schoolClass)).findFirst();
                        if (oClass != null && oClass.isPresent()) {
                            user.setSchoolClass(oClass.get().getId());
                            user.setGrade(String.valueOf(oClass.get().getGradeId()));
                        } else {
                            return CommonResult.fail(name + "的班级数据无效，导入失败");
                        }

                        Optional<SmartTimeGroup> oGroup = timeGroups.stream().filter(e -> e.getName().equals(group)).findFirst();
                        if (oGroup != null && oGroup.isPresent()) {
                            user.setTimeGroupId(oGroup.get().getId());
                        }
                        result.add(user);
                    }
                }
            }
        } catch (Exception e) {
            return CommonResult.fail("请按模板格式导入数据");
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region Xlsx文件读取方法

    /**
     * Xlsx文件读取方法
     *
     * @param inputStream 文件流
     * @return
     * @throws IOException
     */
    private CommonResult<List<SmartUser>> readUpdateXlsx(InputStream inputStream) throws IOException {
        List<SmartUser> result = new ArrayList<>();
        XSSFWorkbook sheets = new XSSFWorkbook(inputStream);

        List<SmartClass> classs = smartClassService.list(null);//班级
        List<SmartTimeGroup> timeGroups = smartTimeGroupService.queryTimeGroups();//时间组

        //读取第一张sheet
        XSSFSheet sheetAt = sheets.getSheetAt(0);

        DataFormatter dataFormatter = new DataFormatter();
        try {
            for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
                XSSFRow row = sheetAt.getRow(rowNum);

                if (row != null) {
                    //使用了getStringCellValue()方法来获取值，POI会判断单元格的类型，如果非字符串类型就会抛出上面的异常。
                    //所以先使用setCellType()方法先将该单元格的类型设置为STRING
                    //然后poi会根据字符串读取它
                    //标题 校验
                    if (rowNum == 1) {
                        String xwNo = dataFormatter.formatCellValue(row.getCell(1));//希沃编号
                        if (!xwNo.equals("希沃编号")) {
                            return CommonResult.fail("导入数据第二列为希沃编号");
                        }
                        String bsNo = dataFormatter.formatCellValue(row.getCell(2));//百胜编号
                        if (!bsNo.equals("百胜编号")) {
                            return CommonResult.fail("导入数据第三列为百胜编号");
                        }
                        String cardNo = dataFormatter.formatCellValue(row.getCell(3));//学号
                        if (!cardNo.equals("学号")) {
                            return CommonResult.fail("导入数据第四列为学号");
                        }
                        String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                        if (!name.equals("姓名")) {
                            return CommonResult.fail("导入数据第五列为姓名");
                        }
                        String schoolClass = dataFormatter.formatCellValue(row.getCell(5));//班级
                        if (!schoolClass.equals("班级")) {
                            return CommonResult.fail("导入数据第六列为班级");
                        }
                        String group = dataFormatter.formatCellValue(row.getCell(6));//时间组
                        if (!group.equals("时间组")) {
                            return CommonResult.fail("导入数据第七列为时间组");
                        }
                    } else {
                        SmartUser user = new SmartUser();

                        String name = dataFormatter.formatCellValue(row.getCell(4));//姓名
                        if (ObjectUtils.isEmpty(name)) {
                            return CommonResult.fail("第" + (rowNum) + "条数据的名称不能为空");
                        }

                        String xwNo = dataFormatter.formatCellValue(row.getCell(1));//希沃编号
                        if (ObjectUtils.isEmpty(xwNo)) {
                            return CommonResult.fail(name + "的希沃编号不能为空");
                        }

                        String bsNo = dataFormatter.formatCellValue(row.getCell(2));//百胜编号
                        if (ObjectUtils.isEmpty(bsNo)) {
                            return CommonResult.fail(name + "的百胜编号不能为空");
                        }

                        String cardNo = dataFormatter.formatCellValue(row.getCell(3));//学号
                        if (ObjectUtils.isEmpty(cardNo)) {
                            return CommonResult.fail(name + "的学号不能为空");
                        }
                        String schoolClass = dataFormatter.formatCellValue(row.getCell(5));//班级
                        if (ObjectUtils.isEmpty(schoolClass)) {
                            return CommonResult.fail(name + "的班级不能为空");
                        }
                        String group = dataFormatter.formatCellValue(row.getCell(6));//时间组
                        if (ObjectUtils.isEmpty(group)) {
                            return CommonResult.fail(name + "的时间组不能为空");
                        }


                        user.setCardNo(cardNo == null ? "" : cardNo);
                        user.setName(name == null ? "" : name);
                        user.setIdentityId(eIdentityStatu.Student.getValue());

                        Optional<SmartClass> oClass = classs.stream().filter(e -> e.getName().equals(schoolClass)).findFirst();
                        if (oClass != null && oClass.isPresent()) {
                            user.setSchoolClass(oClass.get().getId());
                            user.setGrade(String.valueOf(oClass.get().getGradeId()));
                        } else {
                            return CommonResult.fail(name + "的班级数据无效，导入失败");
                        }

                        Optional<SmartTimeGroup> oGroup = timeGroups.stream().filter(e -> e.getName().equals(group)).findFirst();
                        if (oGroup != null && oGroup.isPresent()) {
                            user.setTimeGroupId(oGroup.get().getId());
                        }
                        result.add(user);
                    }
                }
            }
        } catch (Exception e) {
            return CommonResult.fail("请按模板格式导入数据");
        }

        return CommonResult.ok(result);
    }
    //endregion

    //endregion

    //region 时间组数据集合
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult timeGroups() throws Exception {
        List<TimeGroupVo> result = new ArrayList<>();
        //region 获取百胜的时间组
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "timegroup/searchtimegroup";

        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"pageindex\":\"" + 1 + "\",\"pagesize\":\"" + 20 + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"pageindex\":\"" + 1 + "\",\"pagesize\":\"" + 20 + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsTimeGroupVo bsDataResult = objectMapper.readValue(bsResult, BsTimeGroupVo.class);

        if (!bsResult.contains("查询成功")) {
            return CommonResult.fail(bsDataResult.getMsg());
        }

        // URL解码
        String decodedUrl = URLDecoder.decode(bsDataResult.getData(), "UTF-8");

        BsTimeGroupNoVo timeGroupNos = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsTimeGroupNoVo.class);
        //endregion

        List<SmartTimeGroup> groups = smartTimeGroupService.queryTimeGroups();

        List<SmartTimeGroup> newGroups = new ArrayList<>();

        List<SmartTimeGroup> oldGroups = new ArrayList<>();

        if (timeGroupNos.getData() != null) {
            for (BsTimeGroupNoListVo timeGroup : timeGroupNos.getData()) {
                Optional<SmartTimeGroup> oGroup = groups == null ? null : groups.stream().filter(e -> e.getBsno().equals(timeGroup.getTg_no())).findFirst();
                if (oGroup != null && oGroup.isPresent()) {
                    SmartTimeGroup oldData = new SmartTimeGroup();
                    oldData.setId(oGroup.get().getId());
                    oldData.setBsno(timeGroup.getTg_no());
                    oldData.setName(timeGroup.getTg_name());
                    oldData.setRemark(timeGroup.getTg_remark());
                    oldGroups.add(oldData);
                } else {
                    SmartTimeGroup newData = new SmartTimeGroup();
                    newData.setBsno(timeGroup.getTg_no());
                    newData.setName(timeGroup.getTg_name());
                    newData.setRemark(timeGroup.getTg_remark());
                    newGroups.add(newData);
                }
            }
        }

        if (oldGroups != null && oldGroups.size() > 0) {
            boolean updateGroup = smartTimeGroupService.updateSmartTimeGroups(oldGroups);
            if (!updateGroup) {
                return CommonResult.fail("获取时间组失败");
            }
        }

        if (newGroups != null && newGroups.size() > 0) {
            boolean insertGroup = smartTimeGroupService.insertSmartTimeGroups(newGroups);
            if (!insertGroup) {
                return CommonResult.fail("获取时间组失败");
            }
        }

        //oldData集合不在newDatas集合中的内容
        List<Integer> newDatas = oldGroups.stream().map(SmartTimeGroup::getId).collect(Collectors.toList());
        List<Integer> oldDatas = groups.stream().map(SmartTimeGroup::getId).collect(Collectors.toList());
        List<Integer> deleteIds = oldDatas.stream().filter(item -> !newDatas.contains(item)).collect(Collectors.toList());//需要删除的id

        if (deleteIds.size() > 0) {
            int deleted = smartTimeGroupService.deletedTimeGroupByIds(deleteIds);
            if (deleted <= 0) {
                throw new Exception("获取时间组失败！");
            }
        }

        List<SmartTimeGroup> groupDatas = smartTimeGroupService.queryTimeGroups();

        for (SmartTimeGroup groupData : groupDatas) {
            TimeGroupVo data = new TimeGroupVo();
            data.setId(groupData.getId());
            data.setName(groupData.getName());
            data.setRemark(groupData.getRemark());
            result.add(data);
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region 新增用户

    /**
     * 新增用户
     *
     * @param isur          用户数据
     * @param bindingResult
     * @return
     */
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult insertSmartUser(insertSmartUserRequest isur, BindingResult bindingResult) throws Exception {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        int useBs = 1;
        int useXw = 1;
        SmartGrade gradeData = null;
        SmartClass classData = null;
        if (org.springframework.util.StringUtils.hasText(isur.getCardNo())) {
            //重复性判断
            int existCount = smartUserService.querySmartUserByCardNo(isur.getCardNo());
            if (existCount > 0) {
                return CommonResult.fail("当前学号已存在，请勿重复添加");
            }
        }

        SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));

        SmartUser su = new SmartUser();
        su.setTimeGroupId(isur.getTimeGroupId());
        su.setCardNo(isur.getCardNo());
        su.setName(isur.getName());
        su.setIdentityId(isur.getIdentityId());
        su.setIdCard(isur.getIdCard());
        su.setSexId(isur.getSexId());
        su.setDepartmentId(isur.getDepartmentId());
        su.setHeadImage(isur.getHeadImage());
        su.setGrade(isur.getGrade());
        su.setCollege(isur.getCollege());
        su.setSpeciality(isur.getSpeciality());
        su.setSchoolClass(isur.getSchoolClass());
        su.setCampus(isur.getCampus());
        su.setDormitoryNumber(isur.getDormitoryNumber());
        su.setPhone(isur.getPhone());
        su.setAffiliate(StringUtils.join(isur.getAffiliate(), ","));
        su.setTitle(isur.getTitle());
        su.setAddress(isur.getAddress());
        su.setNation(isur.getNation());
        su.setOfStudent(isur.getOfStudent());
        su.setGraduate(isur.getGraduate());
        su.setDuties(isur.getDuties());
        su.setIsCancel(eLogOff.Unlogout.getValue());

        //region 人员信息加入到第三方api
        //要将用户数据加入到希沃和百胜中
        //希沃和百胜的老师、学生数据添加是不一样的，所以按身份添加
        if (isur.getIdentityId().intValue() == eIdentityStatu.Parent.getValue()) {//家长

            //region 家长参数必填判断：手机号
            if (isur.getPhone() == null) {
                return CommonResult.fail("家长手机号不能为空");
            }
            //endregion

            //查找家长身份是否存在用了该手机号的用户
            int existCount = smartUserService.queryParentByCount(isur.getPhone());
            if (existCount > 0) {
                return CommonResult.fail("当前手机号已被其他家长使用");
            }

            //拿到被关联学生的信息去获取对应的卡号
            //有多个学生就循环学生

            if (isur.getAffiliate() == null) {
                return CommonResult.fail("被关联人不能为空");
            }

            if (isur.getAffiliate().size() <= 0) {
                return CommonResult.fail("被关联人不能为空");
            }

            List<SmartUser> studentDatas = smartUserService.getSmartUserIds(isur.getAffiliate());

            //region 希沃新增编辑学生家长信息
            if (useXw == 1) {
                CommonResult insertOrUpdateStudent = insertOrUpdateStudentParent(seewoClient, studentDatas, isur.getName(), isur.getPhone(), true);
                if (!insertOrUpdateStudent.isSuccess()) {
                    return CommonResult.fail("希沃平台：" + insertOrUpdateStudent.getMessage());
                }
            }
            //endregion

        } else if (isur.getIdentityId().intValue() == eIdentityStatu.Student.getValue()) {//学生

            //region 学生参数必填判断：年级、班级
            if (isur.getGrade() == null) {
                return CommonResult.fail("学生年级不能为空");
            }

            if (isur.getSchoolClass() == null) {
                return CommonResult.fail("学生班级不能为空");
            }
            //endregion

            //获取班级Uid
            classData = smartClassService.getSmartClassById(isur.getSchoolClass());
            if (classData == null) {
                return CommonResult.fail("班级数据无效，新增失败");
            }

            gradeData = smartGradeService.querySmartGradeById(Integer.valueOf(isur.getGrade()));
            if (gradeData == null) {
                return CommonResult.fail("年级数据无效，新增失败");
            }

            //region 希沃新增学生信息
            if (useXw == 1) {
                CommonResult<String> insertStudent = SeewoInsertStudent(seewoClient, isur.getName(), isur.getCardNo(), isur.getSexId(), isur.getPhone(), classData.getClassUid());
                if (!insertStudent.isSuccess()) {
                    return CommonResult.fail("希沃平台：" + insertStudent.getMessage());
                }

                su.setXwStudentUid(insertStudent.getData());

                //上传图片
                List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
                PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                photo.setPhotoUrl(su.getHeadImage());
                photo.setUserCode(su.getCardNo());
                photoList.add(photo);
                CommonResult result = SeewoInsertBatchPhoto(seewoClient, photoList, eSeewoUserType.Student.getValue());
                if (!result.isSuccess()) {
                    return result;
                }
            }
            //endregion

            //region 百胜新增学生信息
            if (useBs == 1) {
                /**
                 * 学生数据的有效期是到毕业年份的8月31日
                 */
                String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                String endTime = queryGraduationYear(gradeData.getGradeNo());
                CommonResult<String> insertBsStudent = bsInsertStudent(isur.getName(), isur.getCardNo(), isur.getSexId(), isur.getHeadImage(), isur.getTimeGroupId(), classData.getBsClassNo(), startTime, endTime, isur.getIdCard());
                if (!insertBsStudent.isSuccess()) {
                    return CommonResult.fail("百胜平台：" + insertBsStudent.getMessage());
                }
                su.setBsStudentNo(insertBsStudent.getData());
            }
            //endregion

        } else if (isur.getIdentityId().intValue() == eIdentityStatu.Teacher.getValue()) {//老师

            //region 老师参数必填判断：职称、手机号
            if (isur.getTitle() == null) {
                return CommonResult.fail("老师职称不能为空");
            }

            if (isur.getPhone() == null) {
                return CommonResult.fail("老师手机号不能为空");
            }
            //endregion

            //region 希沃添加教师数据
            if (useXw == 1) {
                CommonResult<String> insertTeacher = SeewoInsertTeacher(seewoClient, isur.getPhone(), isur.getName(), isur.getHeadImage());
                if (!insertTeacher.isSuccess()) {
                    return CommonResult.fail("希沃平台：" + insertTeacher.getMessage());
                }
                su.setXwTeacherCode(insertTeacher.getData());

                //上传图片
                List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
                PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                photo.setPhotoUrl(su.getHeadImage());
                photo.setUserCode(su.getPhone());
                photoList.add(photo);
                CommonResult result = SeewoInsertBatchPhoto(seewoClient, photoList, eSeewoUserType.Teacher.getValue());
                if (!result.isSuccess()) {
                    return result;
                }
            }
            //endregion

            if (isur.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                //获取班级Uid
                classData = smartClassService.getSmartClassById(isur.getSchoolClass());
                if (classData == null) {
                    return CommonResult.fail("班级数据无效，新增失败");
                }

                //region 将班主任推送到希沃
                if (useXw == 1) {
                    CommonResult pushMaster = SeewoPushMaster(seewoClient, isur.getPhone(), classData.getClassUid());
                    if (!pushMaster.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + pushMaster.getMessage());
                    }
                }
                //endregion
            }

            SmartDepartment departmentData = smartDepartmentService.getSmartById(isur.getDepartmentId());
            if (departmentData == null) {
                return CommonResult.fail("部门数据无效，新增教师失败");
            }
            String departmentNo = departmentData.getBsDepartmentNo();//"DT1701845086538710";
            if (departmentNo == null) {
                return CommonResult.fail("百胜部门编号为空，新增教师失败");
            }

            //region 百胜添加教师数据
            if (useBs == 1) {
                /**
                 * 教师数据的有效期是20年
                 */
                String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                String endTime = TimeExchange.addYear(20);
                CommonResult<String> insertBsTeacher = bsInsertTeacher(su, departmentNo, startTime, endTime);
                if (!insertBsTeacher.isSuccess()) {
                    return CommonResult.fail("百胜平台：" + insertBsTeacher.getMessage());
                }
                su.setBsStaffCode(insertBsTeacher.getData());
            }
            //endregion


        }
        //endregion

        //最后都要把数据加入到数据库中
        if (org.springframework.util.StringUtils.hasText(isur.getPhone())) {
            //多身份
            List<SmartUser> users = smartUserService.getPhoneUsers(isur.getPhone());
            if (users != null && users.size() > 0) {
                Optional<SmartUser> ownerUser = users.stream().filter(e -> org.springframework.util.StringUtils.hasText(e.getXOpenId())).findFirst();
                if (ownerUser != null && ownerUser.isPresent()) {
                    su.setXOpenId(ownerUser.get().getXOpenId());
                }
            }
        }

        int result = smartUserService.insertSmartUser(su);

        if (result > 0) {
            //        将添加的用户同步到海康平台
            Integer identityId = su.getIdentityId();
            if (2 == identityId || identityId == 3) {
                Integer id = su.getId();
                SmartOperationUser smartOperationUser = new SmartOperationUser();
                smartOperationUser.setOperationId(id);
                smartOperationUser.setOperationMode("1");
                smartOperationUser.setStatus(1);
                smartOperationUser.setType(identityId);
                smartOperationUserService.save(smartOperationUser);
            }

            if (isur.getIdentityId().intValue() == eIdentityStatu.Teacher.getValue()) {
                if (isur.getIsr() != null && isur.getIsr().size() > 0) {
                    List<SmartTeaching> teachings = new ArrayList<>();
                    for (isrRequest sv : isur.getIsr()) {
                        if (sv.getIds() != null && sv.getIds().size() > 0) {
                            SmartTeaching st = new SmartTeaching();
                            st.setUserId(result);
                            st.setSubjectId(sv.getIds().size() > 0 ? sv.getIds().get(0) : 0);
                            st.setGradeId(sv.getIds().size() > 1 ? sv.getIds().get(1) : 0);
                            st.setClassId(sv.getIds().size() > 2 ? sv.getIds().get(2) : 0);
                            teachings.add(st);
                        }
                    }
                    if (teachings != null && teachings.size() > 0) {
                        boolean insertBatch = smartTeachingService.saveBatch(teachings);
                        if (!insertBatch) {
                            return CommonResult.fail("任课数据添加失败");
                        }
                    }
                }
                //region 新增用户的时候同步新增教师综合评价数据
                List<SmartSemester> semesters = smartSemesterService.querySemesterByTime(new Date());
                gradeData = smartGradeService.querySmartGradeById(Integer.valueOf(isur.getGrade()));
                if (semesters != null && semesters.size() > 0) {
                    List<SmartEvaluateTeacher> eTeachers = new ArrayList<>();
                    for (SmartSemester semester : semesters) {
                        SmartEvaluateTeacher set = new SmartEvaluateTeacher();
                        set.setCardNo(su.getCardNo());
                        set.setName(su.getName());
                        set.setUserId(su.getId());
                        set.setTermId(semester.getId());
                        set.setTerm(semester.getName());
                        if (su.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {//班主任才有年级和班级
                            set.setGradeId(Integer.valueOf(su.getGrade()));
                            if (gradeData != null) {
                                set.setGradeName(gradeData.getName());
                            }
                            set.setClassId(su.getSchoolClass());
                            if (classData != null) {
                                set.setClassName(classData.getName());
                            }
                        }
                        set.setTotalScore(0.0);
                        set.setLowingScore(0.0);
                        eTeachers.add(set);
                    }
                    if (eTeachers != null && eTeachers.size() > 0) {
                        boolean insertEteacher = smartEvaluateTeacherService.saveBatch(eTeachers);
                        if (!insertEteacher) {
                            return CommonResult.fail("添加失败");
                        }
                    }
                }
                //endregion
            }
        }
        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
    }
    //endregion

    //region 更新用户

    /**
     * 更新用户
     *
     * @param usur          更新用户数据
     * @param bindingResult
     * @return
     */
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult updateSmartUserById(updateSmartUserRequest usur, BindingResult bindingResult) throws Exception {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        //region 参数判断
        if (usur.getIdentityId().intValue() == eIdentityStatu.Student.getValue()) {
            if (usur.getTimeGroupId() == null) {
                return CommonResult.fail("学生时间组不能为空");
            }
            if (usur.getCardNo() == null) {
                return CommonResult.fail("学生编号不能为空");
            }
            if (usur.getHeadImage() == null) {
                return CommonResult.fail("学生人脸照片不能为空");
            }
        }

        //endregion

        int useXw = 1;
        int useBs = 1;

        //更新的同时将百胜用户信息同步过去或者同步过来？
        SmartUser su = smartUserService.getSmartById(usur.getId());
        if (su == null) {
            return CommonResult.fail("用户数据已失效，修改失败！");
        }

        //是否转换身份
        boolean changeIdentity = false;
        Integer oldIdentity = null;
        String oldAffiliate = su.getAffiliate();
        Integer oldSchoolClass = su.getSchoolClass();
        String oldStaffNo = su.getBsStaffCode();
        String oldCardNo = su.getCardNo();
        if (usur.getIdentityId().intValue() != su.getIdentityId().intValue()) {
            changeIdentity = true;
            oldIdentity = su.getIdentityId().intValue();
        }
        SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));

        su.setTimeGroupId(usur.getTimeGroupId());
        su.setCardNo(usur.getCardNo());
        su.setName(usur.getName());
        su.setIdentityId(usur.getIdentityId());
        su.setIdCard(usur.getIdCard());
        su.setSexId(usur.getSexId());
        su.setDepartmentId(usur.getDepartmentId());
        su.setHeadImage(usur.getHeadImage());
        su.setGrade(usur.getGrade());
        su.setCollege(usur.getCollege());
        su.setSpeciality(usur.getSpeciality());
        su.setSchoolClass(usur.getSchoolClass());
        su.setCampus(usur.getCampus());
        su.setDormitoryNumber(usur.getDormitoryNumber());
        su.setPhone(usur.getPhone());
        su.setAffiliate(StringUtils.join(usur.getAffiliate(), ","));
        su.setTitle(usur.getTitle());
        su.setAddress(usur.getAddress());
        su.setNation(usur.getNation());
        su.setOfStudent(usur.getOfStudent());
        su.setGraduate(usur.getGraduate());
        su.setDuties(usur.getDuties());
        su.setIsCancel(eLogOff.Unlogout.getValue());

        if (usur.getIdentityId().intValue() == eIdentityStatu.Parent.getValue()) {//家长
            //拿到被关联学生的信息去获取对应的卡号
            //有多个学生就循环学生
            if (usur.getAffiliate() == null) {
                return CommonResult.fail("被关联人不能为空");
            }

            if (usur.getAffiliate().size() <= 0) {
                return CommonResult.fail("被关联人不能为空");
            }

            SmartUser oldUser = smartUserService.queryParentByPhone(usur.getPhone());
            if (oldUser != null && oldUser.getId().intValue() != usur.getId().intValue()) {
                return CommonResult.fail("当前手机号已被其他家长使用");
            }

            List<SmartUser> studentDatas = smartUserService.getSmartUserIds(usur.getAffiliate());

            if (!changeIdentity) {
                //region 希沃新增编辑学生家长信息
                if (useXw == 1) {
                    //学生与家长列表，最大100条
                    CommonResult insertOrUpdateResult = insertOrUpdateStudentParent(seewoClient, studentDatas, usur.getName(), usur.getPhone(), false);
                    if (!insertOrUpdateResult.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + insertOrUpdateResult.getMessage());
                    }
                }
                //endregion
            } else {
                if (oldIdentity.intValue() == eIdentityStatu.Student.getValue()) {
                    //region 希沃删除学生
                    //获取班级Uid
                    SmartClass classData = smartClassService.getSmartClassById(oldSchoolClass);
                    if (classData == null) {
                        return CommonResult.fail("班级数据无效，更新失败");
                    }

                    if (useXw == 1) {
                        CommonResult deleteStudent = SeewoDeleteStudent(seewoClient, classData.getClassUid(), oldCardNo);
                        if (!deleteStudent.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteStudent.getMessage());
                        }
                    }
                    //endregion

                    //region 百胜删除学生
                    if (useBs == 1) {
                        CommonResult deleteBsStudent = bsDeleteStudent(su);
                        if (!deleteBsStudent.isSuccess()) {
                            return CommonResult.fail("百胜平台：" + deleteBsStudent.getMessage());
                        }
                    }
                    //endregion

                } else if (oldIdentity.intValue() == eIdentityStatu.Teacher.getValue()) {
                    //获取班级Uid
                    SmartClass classData = smartClassService.getSmartClassById(oldSchoolClass);
                    if (classData == null) {
                        return CommonResult.fail("班级数据无效，更新失败");
                    }

                    //region 希沃删除教师
                    if (useXw == 1) {
                        CommonResult deleteTeacher = SeewoDeleteTeacher(seewoClient, su.getPhone());
                        if (!deleteTeacher.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteTeacher.getMessage());
                        }
                    }
                    //endregion

                    //region 希沃删除班主任
                    if (useXw == 1) {
                        CommonResult deleteTeacherMaster = SeewoDeleteTeacherMaster(seewoClient, classData.getClassUid(), su.getPhone());
                        if (deleteTeacherMaster.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteTeacherMaster.getMessage());
                        }
                    }
                    //endregion

                    //region 百胜删除教师
                    if (useBs == 1) {
                        CommonResult bsDeleteTeacher = bsDeleteTeacher(oldStaffNo);
                        if (!bsDeleteTeacher.isSuccess()) {
                            return CommonResult.fail("百胜平台：" + bsDeleteTeacher.getMessage());
                        }
                    }
                    //endregion
                }

                //region 希沃新增编辑学生家长信息
                if (useXw == 1) {
                    List<SmartFamilyIndex> indexs = smartFamilyIndexService.querySmartFamilyByCardNo(su.getCardNo());
                    if (indexs != null && indexs.size() >= 4) {
                        return CommonResult.fail("绑定失败，希沃学生家长最多绑定四个家长");
                    }

                    CommonResult insertOrUpdate = insertOrUpdateStudentParent(seewoClient, studentDatas, su.getName(), su.getPhone(), true);
                    if (!insertOrUpdate.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + insertOrUpdate.getMessage());
                    }
                }
                //endregion
            }

        } else if (usur.getIdentityId().intValue() == eIdentityStatu.Student.getValue()) {//学生

            //region 年级和班级不能为空
            if (usur.getGrade() == null) {
                return CommonResult.fail("学生年级不能为空");
            }
            if (usur.getSchoolClass() == null) {
                return CommonResult.fail("学生班级不能为空");
            }
            //endregion
            //获取班级Uid
            SmartClass classData = smartClassService.getSmartClassById(su.getSchoolClass());
            if (classData == null) {
                return CommonResult.fail("班级数据无效，更新失败");
            }
            //获取年级Uid
            SmartGrade gradeData = smartGradeService.querySmartGradeById(Integer.valueOf(su.getGrade()));
            if (gradeData == null) {
                return CommonResult.fail("年级数据无效，新增失败");
            }
            if (!changeIdentity) {
                //region 更新希沃学生信息
                if (useXw == 1) {
                    CommonResult updateStudent = SeewoUpdateStudent(seewoClient, su);
                    if (!updateStudent.isSuccess()) {
                        if (updateStudent.getMessage().equals("学生不存在")) {
                            CommonResult<String> insertStudent = SeewoInsertStudent(seewoClient, su.getName(), su.getCardNo(), su.getSexId(), su.getPhone(), classData.getClassUid());
                            if (!insertStudent.isSuccess()) {
                                return CommonResult.fail("希沃平台：" + insertStudent.getMessage());
                            }
                        }
                    }

                    //上传图片
                    List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
                    PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                    photo.setPhotoUrl(su.getHeadImage());
                    photo.setUserCode(su.getCardNo());
                    photoList.add(photo);
                    CommonResult result = SeewoInsertBatchPhoto(seewoClient, photoList, eSeewoUserType.Student.getValue());
                    if (!result.isSuccess()) {
                        return result;
                    }
                }
                //endregion

                //region 更新百胜学生信息
                if (useBs == 1) {
                    /**
                     * 学生数据的有效期是到毕业年份的8月31日
                     */
                    String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                    String endTime = queryGraduationYear(gradeData.getGradeNo());
                    CommonResult updateBsStudent = bsUpdateStudent(su, startTime, endTime);
                    if (!updateBsStudent.isSuccess()) {
                        if (updateBsStudent.getMessage().equals("人员不存在或已删除")) {
                            //region 百胜新增学生信息
                            CommonResult<String> insertBsStudent = bsInsertStudent(usur.getName(), usur.getCardNo(), usur.getSexId(), usur.getHeadImage(), usur.getTimeGroupId(), classData.getBsClassNo(), startTime, endTime, usur.getIdCard());
                            if (!insertBsStudent.isSuccess()) {
                                return CommonResult.fail("百胜平台：" + insertBsStudent.getMessage());
                            }
                            su.setBsStudentNo(insertBsStudent.getData());
                            //endregion
                        } else {
                            return CommonResult.fail("百胜平台：" + updateBsStudent.getMessage());
                        }
                    }
                }
                //endregion
            } else {
                if (oldIdentity.intValue() == eIdentityStatu.Parent.getValue()) {

                    List<SmartUser> studentDatas = smartUserService.getSmartUserIds(Arrays.asList(oldAffiliate.split(",")));

                    //region 希沃删除原有的家长关系
                    if (useXw == 1) {
                        CommonResult deleteResult = deleteOldParentShip(seewoClient, studentDatas, su.getPhone());
                        if (!deleteResult.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteResult.getMessage());
                        }

                        smartFamilyIndexService.deleteSmartFamilyByPhone(su.getPhone());
                    }
                    //endregion
                } else if (oldIdentity.intValue() == eIdentityStatu.Teacher.getValue()) {
                    //获取班级Uid
                    SmartClass oldClassData = smartClassService.getSmartClassById(oldSchoolClass);
                    if (oldClassData == null) {
                        return CommonResult.fail("班级数据无效，更新失败");
                    }

                    //region 希沃删除教师
                    if (useXw == 1) {
                        CommonResult deleteTeacher = SeewoDeleteTeacher(seewoClient, su.getPhone());
                        if (!deleteTeacher.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteTeacher.getMessage());
                        }
                    }
                    //endregion

                    //region 希沃删除班主任
                    if (useXw == 1) {
                        CommonResult deleteMaster = SeewoDeleteTeacherMaster(seewoClient, oldClassData.getClassUid(), su.getPhone());
                        if (!deleteMaster.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteMaster.getMessage());
                        }
                    }
                    //endregion

                    //region 百胜删除教师
                    if (useBs == 1) {
                        CommonResult deleteBsTeacher = bsDeleteTeacher(oldStaffNo);
                        if (!deleteBsTeacher.isSuccess()) {
                            return CommonResult.fail("百胜平台：" + deleteBsTeacher.getMessage());
                        }
                    }
                    //endregion
                }

                //region 希沃新增学生信息
                if (useXw == 1) {
                    CommonResult<String> insertStudent = SeewoInsertStudent(seewoClient, su.getName(), su.getCardNo(), su.getSexId(), su.getPhone(), classData.getClassUid());
                    if (!insertStudent.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + insertStudent.getMessage());
                    } else {
                        su.setXwStudentUid(insertStudent.getData());
                    }

                    //上传图片
                    List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
                    PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                    photo.setPhotoUrl(su.getHeadImage());
                    photo.setUserCode(su.getCardNo());
                    photoList.add(photo);
                    CommonResult result = SeewoInsertBatchPhoto(seewoClient, photoList, eSeewoUserType.Student.getValue());
                    if (!result.isSuccess()) {
                        return result;
                    }
                }
                //endregion

                //region 百胜新增学生信息
                if (useBs == 1) {
                    /**
                     * 学生数据的有效期是到毕业年份的8月31日
                     */
                    String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                    String endTime = queryGraduationYear(gradeData.getGradeNo());
                    CommonResult<String> insertBsStudent = bsInsertStudent(su.getName(), su.getCardNo(), su.getSexId(), su.getHeadImage(), su.getTimeGroupId(), classData.getBsClassNo(), startTime, endTime, su.getIdCard());

                    if (insertBsStudent.isSuccess()) {
                        su.setBsStudentNo(insertBsStudent.getData());
                    } else {
                        //region 希沃删除学生
                        //百胜数据插入失败后需要把已插入到希沃的数据删除
                        CommonResult deleteStudent = SeewoDeleteStudent(seewoClient, classData.getClassUid(), oldCardNo);
                        if (!deleteStudent.isSuccess()) {
                            return CommonResult.fail("百胜平台：" + deleteStudent.getMessage());
                        }
                        //endregion

                        return CommonResult.fail("切换身份后，" + insertBsStudent.getMessage() + "，百胜无法插入学生数据");
                    }
                }
                //endregion

            }

        } else if (usur.getIdentityId().intValue() == eIdentityStatu.Teacher.getValue()) {//教师
            if (!changeIdentity) {
                //region 希沃更新教师数据
                if (useXw == 1) {
                    CommonResult<String> updateTeacher = SeewoUpdateTeacher(seewoClient, su.getPhone(), su.getName(), su.getHeadImage());
                    if (!updateTeacher.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + updateTeacher.getMessage());
                    }
                    su.setXwTeacherCode(updateTeacher.getData());

                    //上传图片
                    List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
                    PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                    photo.setPhotoUrl(su.getHeadImage());
                    photo.setUserCode(su.getPhone());
                    photoList.add(photo);
                    CommonResult result = SeewoInsertBatchPhoto(seewoClient, photoList, eSeewoUserType.Teacher.getValue());
                    if (!result.isSuccess()) {
                        return result;
                    }
                }
                if (su.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                    //获取班级Uid
                    SmartClass classData = smartClassService.getSmartClassById(su.getSchoolClass());
                    if (classData == null) {
                        return CommonResult.fail("班级数据无效，新增失败");
                    }

                    //region 将班主任推送到希沃
                    if (useXw == 1) {
                        CommonResult pushMaster = SeewoPushMaster(seewoClient, su.getPhone(), classData.getClassUid());
                        if (!pushMaster.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + pushMaster.getMessage());
                        }
                    }
                    //endregion
                }
                //endregion

                SmartDepartment departmentData = smartDepartmentService.getSmartById(su.getDepartmentId());
                if (departmentData == null) {
                    return CommonResult.fail("部门数据无效，更新教师失败");
                }

                String departmentNo = departmentData.getBsDepartmentNo();
                if (departmentNo == null) {
                    return CommonResult.fail("百胜部门编号为空，新增教师失败");
                }

                //region 百胜更新教师数据
                if (useBs == 1) {
                    /**
                     * 教师数据的有效期是20年
                     */
                    String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                    String endTime = TimeExchange.addYear(20);
                    CommonResult<String> bsUpdateTeacher = updateBsTeacher(su, departmentNo, startTime, endTime);
                    if (!bsUpdateTeacher.isSuccess()) {
                        return CommonResult.fail("百胜平台：" + bsUpdateTeacher.getMessage());
                    }

                    su.setBsStaffCode(bsUpdateTeacher.getData());
                }
                //endregion

            } else {
                if (oldIdentity.intValue() == eIdentityStatu.Parent.getValue()) {

                    List<SmartUser> studentDatas = smartUserService.getSmartUserIds(Arrays.asList(oldAffiliate.split(",")));

                    //region 希沃删除原有的家长关系
                    if (useXw == 1) {
                        CommonResult deleteOldShip = deleteOldParentShip(seewoClient, studentDatas, su.getPhone());
                        if (!deleteOldShip.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteOldShip.getMessage());
                        }

                        smartFamilyIndexService.deleteSmartFamilyByPhone(su.getPhone());
                    }
                    //endregion
                } else if (oldIdentity.intValue() == eIdentityStatu.Student.getValue()) {
                    //获取班级Uid
                    SmartClass classData = smartClassService.getSmartClassById(oldSchoolClass);
                    if (classData == null) {
                        return CommonResult.fail("班级数据无效，更新失败");
                    }

                    //region 希沃删除学生
                    if (useXw == 1) {
                        CommonResult deleteStudent = SeewoDeleteStudent(seewoClient, classData.getClassUid(), oldCardNo);
                        if (!deleteStudent.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + deleteStudent.getMessage());
                        }
                    }
                    //endregion

                    //region 百胜删除学生
                    if (useBs == 1) {
                        CommonResult deleteBsStudent = bsDeleteStudent(su);
                        if (!deleteBsStudent.isSuccess()) {
                            return CommonResult.fail("百胜平台：" + deleteBsStudent.getMessage());
                        }
                    }
                    //endregion
                }

                //region 希沃添加教师数据
                if (useXw == 1) {
                    CommonResult<String> insertTeacher = SeewoInsertTeacher(seewoClient, su.getPhone(), su.getName(), su.getHeadImage());
                    if (!insertTeacher.isSuccess()) {
                        return CommonResult.fail("希沃平台：" + insertTeacher.getMessage());
                    }
                    su.setXwTeacherCode(insertTeacher.getData());
                    //上传图片
                    List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList = new ArrayList<>();
                    PhotoServiceSavePhotosParam.ThirdSavePhotoQuery photo = new PhotoServiceSavePhotosParam.ThirdSavePhotoQuery();
                    photo.setPhotoUrl(su.getHeadImage());
                    photo.setUserCode(su.getPhone());
                    photoList.add(photo);
                    CommonResult result = SeewoInsertBatchPhoto(seewoClient, photoList, eSeewoUserType.Teacher.getValue());
                    if (!result.isSuccess()) {
                        return result;
                    }
                }
                //endregion

                if (su.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                    //获取班级Uid
                    SmartClass classData = smartClassService.getSmartClassById(su.getSchoolClass());
                    if (classData == null) {
                        return CommonResult.fail("班级数据无效，新增失败");
                    }

                    //region 将班主任推送到希沃
                    if (useXw == 1) {
                        CommonResult pushMaster = SeewoPushMaster(seewoClient, su.getPhone(), classData.getClassUid());
                        if (!pushMaster.isSuccess()) {
                            return CommonResult.fail("希沃平台：" + pushMaster.getMessage());
                        }
                    }
                    //endregion
                }

                SmartDepartment departmentData = smartDepartmentService.getSmartById(su.getDepartmentId());
                if (departmentData == null) {
                    return CommonResult.fail("部门数据无效，新增教师失败");
                }

                String departmentNo = departmentData.getBsDepartmentNo();//"DT1701845086538710";
                if (departmentNo == null) {
                    return CommonResult.fail("百胜部门编号为空，新增教师失败");
                }
                //region 百胜添加教师数据
                if (useBs == 1) {
                    /**
                     * 教师数据的有效期是20年
                     */
                    String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
                    String endTime = TimeExchange.addYear(20);
                    CommonResult<String> insertBsTeacher = bsInsertTeacher(su, departmentNo, startTime, endTime);
                    if (!insertBsTeacher.isSuccess()) {
                        return CommonResult.fail("百胜平台：" + insertBsTeacher.getMessage());
                    }
                    su.setBsStaffCode(insertBsTeacher.getData());
                }
                //endregion
            }
        }

        int result = smartUserService.updateSmartUser(su);
//        修改需同步到海康平台
        if (result > 0) {
            Integer identityId = su.getIdentityId();
            if (2 == identityId || identityId == 3) {
                Integer id = su.getId();
                SmartOperationUser smartOperationUser = new SmartOperationUser();
                smartOperationUser.setOperationId(id);
                smartOperationUser.setOperationMode("2");
                smartOperationUser.setStatus(1);
                smartOperationUser.setType(identityId);
                smartOperationUserService.save(smartOperationUser);
            }
        }
        //region 任课数据
        if (result > 0 && usur.getIdentityId().intValue() == eIdentityStatu.Teacher.getValue()) {
            smartTeachingService.deleteByUserId(su.getId());
            if (usur.getUsr() != null && usur.getUsr().size() > 0) {
                List<SmartTeaching> teachings = new ArrayList<>();
                for (isrRequest sv : usur.getUsr()) {
                    if (sv.getIds() != null && sv.getIds().size() > 0) {
                        SmartTeaching st = new SmartTeaching();
                        st.setUserId(su.getId());
                        st.setSubjectId(sv.getIds().size() > 0 ? sv.getIds().get(0) : 0);
                        st.setGradeId(sv.getIds().size() > 1 ? sv.getIds().get(1) : 0);
                        st.setClassId(sv.getIds().size() > 2 ? sv.getIds().get(2) : 0);
                        teachings.add(st);
                    }
                }
                if (teachings != null && teachings.size() > 0) {
                    boolean insertBatch = smartTeachingService.saveBatch(teachings);
                    if (!insertBatch) {
                        return CommonResult.fail("任课数据添加失败");
                    }
                }
            }

            List<SmartEvaluateTeacher> eTeachers = smartEvaluateTeacherService.queryEvaluateTeachersByUserId(usur.getId());
            List<SmartSemester> semesters = smartSemesterService.querySemesterByTime(su.getCreateTime());
            List<SmartEvaluateTeacher> newTeachers = new ArrayList<>();
            List<SmartEvaluateTeacher> updateTeachers = new ArrayList<>();
            SmartClass classData = null;
            SmartGrade gradeData = null;
            if (su.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                classData = smartClassService.getSmartClassById(su.getSchoolClass());
                gradeData = smartGradeService.querySmartGradeById(Integer.valueOf(su.getGrade()));
            }
            if (eTeachers != null && eTeachers.size() > 0) {
                for (SmartSemester semester : semesters) {
                    Optional<SmartEvaluateTeacher> oTeacher = eTeachers.stream().filter(e -> e.getTermId().equals(semester.getId())).findFirst();
                    if (oTeacher != null && oTeacher.isPresent()) {
                        if (su.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                            oTeacher.get().setGradeId(gradeData.getId());
                            oTeacher.get().setGradeName(gradeData.getName());
                            oTeacher.get().setClassId(classData.getId());
                            oTeacher.get().setClassName(classData.getName());
                            updateTeachers.add(oTeacher.get());
                        }
                    } else {
                        SmartEvaluateTeacher set = new SmartEvaluateTeacher();
                        set.setCardNo(su.getCardNo());
                        set.setName(su.getName());
                        set.setUserId(su.getId());
                        set.setTermId(semester.getId());
                        set.setTerm(semester.getName());
                        if (su.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {//班主任才有年级和班级
                            set.setGradeId(gradeData.getId());
                            set.setGradeName(gradeData.getName());
                            set.setClassId(classData.getId());
                            set.setClassName(classData.getName());
                        }
                        set.setTotalScore(0.0);
                        set.setLowingScore(0.0);
                        newTeachers.add(set);
                    }
                }
            } else {
                for (SmartSemester semester : semesters) {
                    SmartEvaluateTeacher set = new SmartEvaluateTeacher();
                    set.setCardNo(su.getCardNo());
                    set.setName(su.getName());
                    set.setUserId(su.getId());
                    set.setTermId(semester.getId());
                    set.setTerm(semester.getName());
                    if (su.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {//班主任才有年级和班级
                        set.setGradeId(gradeData.getId());
                        set.setGradeName(gradeData.getName());
                        set.setClassId(classData.getId());
                        set.setClassName(classData.getName());
                    }
                    set.setTotalScore(0.0);
                    set.setLowingScore(0.0);
                    newTeachers.add(set);
                }
            }

            if (newTeachers != null && newTeachers.size() > 0) {
                boolean insertEteacher = smartEvaluateTeacherService.saveBatch(newTeachers);
                if (!insertEteacher) {
                    return CommonResult.fail("修改失败");
                }
            }

            if (updateTeachers != null && updateTeachers.size() > 0) {
                boolean updateEteacher = smartEvaluateTeacherService.updateBatchById(updateTeachers);
                if (!updateEteacher) {
                    return CommonResult.fail("修改失败");
                }
            }
        }
        //endregion
        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
    }
    //endregion

    //region 希沃增删改查方法

    //region 希沃批量上传头像

    /**
     * 希沃批量上传头像 如果当前用户已存在图片 会进行覆盖
     *
     * @param seewoClient 链接配置
     * @param photoList   头像集合
     * @param userType    用户类型
     * @return
     * @throws JsonProcessingException
     */
    public CommonResult SeewoInsertBatchPhoto(SeewoClient seewoClient, List<PhotoServiceSavePhotosParam.ThirdSavePhotoQuery> photoList, Integer userType) throws
            JsonProcessingException {
        //region 希沃上传第三方图片信息
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        PhotoServiceSavePhotosParam param = new PhotoServiceSavePhotosParam();
        //请求体，MimeType为 application/json
        PhotoServiceSavePhotosParam.JSONRequestBody requestBody = PhotoServiceSavePhotosParam.JSONRequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //
        PhotoServiceSavePhotosParam.ThirdSavePhotoBatchQuery query = PhotoServiceSavePhotosParam.ThirdSavePhotoBatchQuery.builder()
                .appId(seewoConfig.getAppId())
                .unitUid(seewoConfig.getSchoolId())
                .userType(userType)
                .build();
        requestBody.setQuery(query);
        // 图片保存列表
        query.setPhotoList(photoList);
        PhotoServiceSavePhotosRequest request = new PhotoServiceSavePhotosRequest(param);
        // 该接口需要数据权限，请将授权资源id替换至下方，请妥善保管好授权资源id，避免泄露
        // permissionId位置: 控制台 -> 应用详情 -> 我申请的 -> 已通过的接口 -> 调用范围 -> 审批信息 中查看授权资源的「学校id」或「区域id」
        //request.setPermissionId(seewoConfig.getSchoolId());
        logger.info("入参：" + request);
        logger.info("入参：" + JSON.toJSON(request));
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        PhotoServiceSavePhotosResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        ObjectMapper objectMapper = new ObjectMapper();
        XwBodyVo xwResult = objectMapper.readValue(result.getBody(), XwBodyVo.class);
        if (!xwResult.getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getMessage());
        }

        //endregion
        return CommonResult.ok("200", "图片添加成功");
    }
    //endregion

    //region 希沃批量新增学生信息
    public CommonResult<List<StudentServiceBatchSaveClassStudentsResult.StudentInfoDto>> SeewoInsertBatchStudent
    (SeewoClient seewoClient, List<StudentServiceBatchSaveClassStudentsParam.StudentInfo> students, String
            classUid) {
        //region 希沃新增学生信息
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        StudentServiceBatchSaveClassStudentsParam param = new StudentServiceBatchSaveClassStudentsParam();
        //请求体，MimeType为 application/json
        StudentServiceBatchSaveClassStudentsParam.JSONRequestBody requestBody = StudentServiceBatchSaveClassStudentsParam.JSONRequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //查询条件
        StudentServiceBatchSaveClassStudentsParam.StudentSaveQuery query = StudentServiceBatchSaveClassStudentsParam.StudentSaveQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .classUid(classUid)
                .build();
        requestBody.setQuery(query);
        // 学生列表
        query.setStudents(students);
        query.setInPlaceOld(false);// 是否删除旧学生再保存
        param.setRequestBody(requestBody);
        StudentServiceBatchSaveClassStudentsRequest request = new StudentServiceBatchSaveClassStudentsRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        StudentServiceBatchSaveClassStudentsResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃学生数据新增失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        return CommonResult.ok("200", "添加成功", result.getResponseBody().getData());
        //endregion
    }
    //endregion

    //region 希沃新增学生信息
    public CommonResult<String> SeewoInsertStudent(SeewoClient seewoClient, String name, String cardNo, Integer
            sexId, String Phone, String classUid) {
        //region 希沃新增学生信息
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        StudentServiceBatchSaveClassStudentsParam param = new StudentServiceBatchSaveClassStudentsParam();
        //请求体，MimeType为 application/json
        StudentServiceBatchSaveClassStudentsParam.JSONRequestBody requestBody = StudentServiceBatchSaveClassStudentsParam.JSONRequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //查询条件
        StudentServiceBatchSaveClassStudentsParam.StudentSaveQuery query = StudentServiceBatchSaveClassStudentsParam.StudentSaveQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .classUid(classUid)
                .build();
        requestBody.setQuery(query);
        // 学生列表
        StudentServiceBatchSaveClassStudentsParam.StudentInfo students = StudentServiceBatchSaveClassStudentsParam.StudentInfo.builder()
                .studentName(name)
                .studentCode(cardNo)
                .gender(sexId)
                .phone(Phone == null ? "" : Phone)
                .build();
        query.setStudents(java.util.Collections.singletonList(students));
        query.setInPlaceOld(false);// 是否删除旧学生再保存
        param.setRequestBody(requestBody);
        StudentServiceBatchSaveClassStudentsRequest request = new StudentServiceBatchSaveClassStudentsRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        StudentServiceBatchSaveClassStudentsResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃学生数据新增失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        return CommonResult.ok("200", "添加成功", result.getResponseBody().getData().get(0).getUserUid());
        //endregion
    }
    //endregion

    //region 希沃更新学生信息
    public CommonResult SeewoUpdateStudent(SeewoClient seewoClient, SmartUser su) {
        //region 更新希沃学生信息
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        StudentServiceUpdateStudentInfoParam param = new StudentServiceUpdateStudentInfoParam();
        //响应体，MimeType为 application/json
        StudentServiceUpdateStudentInfoParam.RequestBody requestBody = StudentServiceUpdateStudentInfoParam.RequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //query
        StudentServiceUpdateStudentInfoParam.Query query = StudentServiceUpdateStudentInfoParam.Query.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .studentUid(su.getXwStudentUid())
                .studentCode(su.getCardNo())
                .studentName(su.getName())
                .build();
        requestBody.setQuery(query);
        param.setRequestBody(requestBody);
        StudentServiceUpdateStudentInfoRequest request = new StudentServiceUpdateStudentInfoRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        StudentServiceUpdateStudentInfoResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃学生数据更新失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        return CommonResult.ok("更新成功");
        //endregion
    }
    //endregion

    //region 希沃删除学生
    public CommonResult SeewoDeleteStudent(SeewoClient seewoClient, String ClassUid, String CardNo) {
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        StudentServiceRemoveClassStudentsParam deleteParam = new StudentServiceRemoveClassStudentsParam();
        //请求体，MimeType为 application/json
        StudentServiceRemoveClassStudentsParam.JSONRequestBody deleteRequestBody = StudentServiceRemoveClassStudentsParam.JSONRequestBody.builder()
                .build();
        deleteParam.setRequestBody(deleteRequestBody);
        //查询条件
        StudentServiceRemoveClassStudentsParam.UnbindStudentQuery deleteQuery = StudentServiceRemoveClassStudentsParam.UnbindStudentQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .classUid(ClassUid)
                .studentCodes(java.util.Collections.singletonList(CardNo))
                .build();
        deleteRequestBody.setQuery(deleteQuery);
        deleteParam.setRequestBody(deleteRequestBody);
        StudentServiceRemoveClassStudentsRequest deleteRequest = new StudentServiceRemoveClassStudentsRequest(deleteParam);
        logger.info("入参：" + deleteRequest);
        //如果想要调用沙箱环境，请通过设置 deleteRequest 对象的 serverUrl 属性，如：
        //deleteRequest.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        StudentServiceRemoveClassStudentsResult deleteResult = seewoClient.invoke(deleteRequest);
        logger.info("出参：" + deleteResult);

        if (deleteResult == null) {
            return CommonResult.fail("希沃删除学生数据失败！");
        }

        if (!deleteResult.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + deleteResult.getResponseBody().getMessage());
        }

        return CommonResult.ok("删除成功");
    }
    //endregion

    //region 希沃添加老师数据
    //老师数据会根据手机号判断新增不新增
    //手机号相同的情况下更新不新增
    public CommonResult<String> SeewoInsertTeacher(SeewoClient seewoClient, String phone, String name, String
            headImage) {
        //region 希沃添加教师数据
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        TeacherServiceBatchSaveOrUpdateTeacherParam param = new TeacherServiceBatchSaveOrUpdateTeacherParam();
        //请求体，MimeType为 application/json
        TeacherServiceBatchSaveOrUpdateTeacherParam.JSONRequestBody requestBody = TeacherServiceBatchSaveOrUpdateTeacherParam.JSONRequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //老师信息
        TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherBatchQuery query = TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherBatchQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .build();
        requestBody.setQuery(query);
        // 老师列表
        TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery teachers = TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery.builder()
                .account(phone)//用户账号
                .name(name)//用户名字
                .accountType("phone")//账号类型 phone：手机号  email：邮箱
                .teacherCode(phone)//教师工号
                .photoUrl(headImage)//图片链接
                .build();
        query.setTeachers(java.util.Collections.singletonList(teachers));
        param.setRequestBody(requestBody);
        TeacherServiceBatchSaveOrUpdateTeacherRequest request = new TeacherServiceBatchSaveOrUpdateTeacherRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        TeacherServiceBatchSaveOrUpdateTeacherResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃教师数据新增失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        String teacherCode = phone;
        if (result.getResponseBody().getData() != null && result.getResponseBody().getData().size() > 0) {
            teacherCode = result.getResponseBody().getData().get(0).getTeacherCode();
        }

        return CommonResult.ok("200", "操作成功", teacherCode);
        //endregion
    }
    //endregion

    //region 希沃批量添加老师数据
    //老师数据会根据手机号判断新增不新增
    //手机号相同的情况下更新不新增
    public CommonResult<List<TeacherServiceBatchSaveOrUpdateTeacherResult.TeacherBaseInfoDto>> SeewoInsertBatchTeacher
    (SeewoClient seewoClient, List<TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery> teachers) {
        //region 希沃添加教师数据
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        TeacherServiceBatchSaveOrUpdateTeacherParam param = new TeacherServiceBatchSaveOrUpdateTeacherParam();
        //请求体，MimeType为 application/json
        TeacherServiceBatchSaveOrUpdateTeacherParam.JSONRequestBody requestBody = TeacherServiceBatchSaveOrUpdateTeacherParam.JSONRequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //老师信息
        TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherBatchQuery query = TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherBatchQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .build();
        requestBody.setQuery(query);

        query.setTeachers(teachers);
        param.setRequestBody(requestBody);
        TeacherServiceBatchSaveOrUpdateTeacherRequest request = new TeacherServiceBatchSaveOrUpdateTeacherRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        TeacherServiceBatchSaveOrUpdateTeacherResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃教师数据新增失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        if (result.getResponseBody().getData() != null && result.getResponseBody().getData().size() > 0) {
            return CommonResult.ok("200", "操作成功", result.getResponseBody().getData());
        }

        return CommonResult.ok("200", "操作成功", null);
        //endregion
    }
    //endregion

    //region 希沃更新教师
    public CommonResult<String> SeewoUpdateTeacher(SeewoClient seewoClient, String phone, String name, String
            headImage) {
        //region 希沃更新教师数据
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        TeacherServiceBatchSaveOrUpdateTeacherParam param = new TeacherServiceBatchSaveOrUpdateTeacherParam();
        //请求体，MimeType为 application/json
        TeacherServiceBatchSaveOrUpdateTeacherParam.JSONRequestBody requestBody = TeacherServiceBatchSaveOrUpdateTeacherParam.JSONRequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //老师信息
        TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherBatchQuery query = TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherBatchQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .build();
        requestBody.setQuery(query);
        // 老师列表
        TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery teachers = TeacherServiceBatchSaveOrUpdateTeacherParam.SaveOrUpdateTeacherQuery.builder()
                .account(phone)//用户账号
                .name(name)//用户名字
                .accountType("phone")//账号类型 phone：手机号  email：邮箱
                .teacherCode(phone)//教师工号
                .photoUrl(headImage)//图片链接
                .build();
        query.setTeachers(java.util.Collections.singletonList(teachers));
        param.setRequestBody(requestBody);
        TeacherServiceBatchSaveOrUpdateTeacherRequest request = new TeacherServiceBatchSaveOrUpdateTeacherRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        TeacherServiceBatchSaveOrUpdateTeacherResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃教师数据更新失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        String teacherCode = phone;
        if (result.getResponseBody().getData() != null && result.getResponseBody().getData().size() > 0) {
            teacherCode = result.getResponseBody().getData().get(0).getTeacherCode();
        }

        return CommonResult.ok("200", "操作成功", teacherCode);

        //endregion
    }
    //endregion

    //region 希沃删除教师
    public CommonResult SeewoDeleteTeacher(SeewoClient seewoClient, String phone) {
        //region 希沃删除教师
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        TeacherServiceBatchRemoveTeachersParam param = new TeacherServiceBatchRemoveTeachersParam();
        //响应体，MimeType为 application/json
        TeacherServiceBatchRemoveTeachersParam.RequestBody requestBody = TeacherServiceBatchRemoveTeachersParam.RequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //query
        TeacherServiceBatchRemoveTeachersParam.Query query = TeacherServiceBatchRemoveTeachersParam.Query.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .phones(java.util.Collections.singletonList(phone))
                .build();
        requestBody.setQuery(query);
        param.setRequestBody(requestBody);
        TeacherServiceBatchRemoveTeachersRequest request = new TeacherServiceBatchRemoveTeachersRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        TeacherServiceBatchRemoveTeachersResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃教师数据删除失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        return CommonResult.ok("删除成功");
        //endregion
    }
    //endregion

    //region 希沃删除班主任
    public CommonResult SeewoDeleteTeacherMaster(SeewoClient seewoClient, String classUid, String phone) {
        //region 希沃删除班主任
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        TeacherServiceBatchRemoveClassMastersParam mastersParam = new TeacherServiceBatchRemoveClassMastersParam();
        //响应体，MimeType为 application/json
        TeacherServiceBatchRemoveClassMastersParam.RequestBody mastersRequestBody = TeacherServiceBatchRemoveClassMastersParam.RequestBody.builder()
                .build();
        mastersParam.setRequestBody(mastersRequestBody);
        //query
        TeacherServiceBatchRemoveClassMastersParam.Query mastersQuery = TeacherServiceBatchRemoveClassMastersParam.Query.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .classUid(classUid)
                .userPhones(java.util.Collections.singletonList(phone))
                .build();
        mastersRequestBody.setQuery(mastersQuery);
        mastersParam.setRequestBody(mastersRequestBody);
        TeacherServiceBatchRemoveClassMastersRequest mastersRequest = new TeacherServiceBatchRemoveClassMastersRequest(mastersParam);
        logger.info("入参：" + mastersRequest);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        TeacherServiceBatchRemoveClassMastersResult masterResult = seewoClient.invoke(mastersRequest);
        logger.info("出参：" + masterResult);

        if (masterResult == null) {
            return CommonResult.fail("希沃教师数据删除失败！");
        }

        if (!masterResult.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + masterResult.getResponseBody().getMessage());
        }

        return CommonResult.ok("删除成功");
        //endregion
    }
    //endregion

    //region 希沃推送班主任
    public CommonResult SeewoPushMaster(SeewoClient seewoClient, String phone, String classUid) {
        //region 将班主任推送到希沃
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        TeacherServiceBatchSetClassMastersParam teacherClassParam = new TeacherServiceBatchSetClassMastersParam();
        //响应体，MimeType为 application/json
        TeacherServiceBatchSetClassMastersParam.RequestBody teacherClassRequestBody = TeacherServiceBatchSetClassMastersParam.RequestBody.builder()
                .build();
        teacherClassParam.setRequestBody(teacherClassRequestBody);
        //query
        List<String> teacherPhones = new ArrayList<>();
        teacherPhones.add(phone);
        TeacherServiceBatchSetClassMastersParam.Query teacherClassQuery = TeacherServiceBatchSetClassMastersParam.Query.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .classUid(classUid)
                .userPhones(teacherPhones)
                .build();
        teacherClassRequestBody.setQuery(teacherClassQuery);
        teacherClassParam.setRequestBody(teacherClassRequestBody);
        TeacherServiceBatchSetClassMastersRequest teacherClassRequest = new TeacherServiceBatchSetClassMastersRequest(teacherClassParam);
        logger.info("入参：" + teacherClassRequest);
        //如果想要调用沙箱环境，请通过设置 teacherClassRequest 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        TeacherServiceBatchSetClassMastersResult teacherClassResult = seewoClient.invoke(teacherClassRequest);
        logger.info("出参：" + teacherClassResult);

        if (teacherClassResult == null) {
            return CommonResult.fail("希沃教师数据新增失败！");
        }

        if (!teacherClassResult.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + teacherClassResult.getResponseBody().getMessage());
        }

        return CommonResult.ok("添加成功");
        //endregion
    }
    //endregion

    //region 希沃新增编辑学生家长信息
    public CommonResult insertOrUpdateStudentParent(SeewoClient
                                                            seewoClient, List<SmartUser> studentDatas, String name, String phone, boolean isInsert) {

        //region 希沃新增编辑学生家长信息
        //学生与家长列表，最大100条
        List<ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem> studentParents = new ArrayList<>();
        List<SmartFamilyIndex> insertIndexs = new ArrayList<>();
        for (SmartUser student : studentDatas) {

            int index = 0;
            if (isInsert) {
                List<SmartFamilyIndex> indexs = smartFamilyIndexService.querySmartFamilyByCardNo(student.getCardNo());

                if (indexs != null && indexs.size() >= 4) {
                    return CommonResult.fail("绑定失败，希沃学生家长最多绑定四个家长");
                }

                if (indexs != null) {
                    long existCount = indexs.stream().filter(e -> e.getParentPhone().equals(phone)).count();
                    if (existCount > 0) {
                        return CommonResult.fail("当前家长手机号已绑定该学生，请勿重复绑定");
                    }

                    for (SmartFamilyIndex data : indexs) {
                        if (data.getIndexData().intValue() == index && index < 3) {
                            index++;
                            continue;
                        } else {
                            break;
                        }
                    }
                }

                SmartFamilyIndex insertFamily = new SmartFamilyIndex();
                insertFamily.setParentPhone(phone);
                insertFamily.setStudentNo(student.getCardNo());
                insertFamily.setIndexData(index);
                insertIndexs.add(insertFamily);
            } else {
                SmartFamilyIndex familyIndex = smartFamilyIndexService.queryFamilyByPhoneCardNo(phone, student.getCardNo());
                if (familyIndex == null) {
                    List<SmartFamilyIndex> indexs = smartFamilyIndexService.querySmartFamilyByCardNo(student.getCardNo());
                    if (indexs != null && indexs.size() >= 4) {
                        return CommonResult.fail("绑定失败，希沃学生家长最多绑定四个家长");
                    }

                    if (indexs != null) {
                        for (SmartFamilyIndex data : indexs) {
                            if (data.getIndexData().intValue() == index && index < 3) {
                                index++;
                                continue;
                            } else {
                                break;
                            }
                        }
                    }

                    SmartFamilyIndex insertFamily = new SmartFamilyIndex();
                    insertFamily.setParentPhone(phone);
                    insertFamily.setStudentNo(student.getCardNo());
                    insertFamily.setIndexData(index);
                    insertIndexs.add(insertFamily);
                } else {
                    familyIndex.setStudentNo(student.getCardNo());
                    familyIndex.setParentPhone(phone);
                    index = familyIndex.getIndexData();

                    int updateFamily = smartFamilyIndexService.updateSmartFamily(familyIndex);
                    if (updateFamily <= 0) {
                        return CommonResult.fail("绑定失败");
                    }
                }

            }


            ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem students = ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem.builder()
                    .studentCode(student.getCardNo())
                    .build();
            studentParents.add(students);

            //家长列表，最多4个
            ParentServiceBatchSaveOrUpdateParentsParam.ParentsItem parents = ParentServiceBatchSaveOrUpdateParentsParam.ParentsItem.builder()
                    .name(name)
                    .phone(phone)
                    .index(index)
                    .build();

            students.setParents(java.util.Collections.singletonList(parents));
        }

        if (insertIndexs != null && insertIndexs.size() > 0) {
            smartFamilyIndexService.saveBatch(insertIndexs);
        }


        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        ParentServiceBatchSaveOrUpdateParentsParam param = new ParentServiceBatchSaveOrUpdateParentsParam();
        //响应体，MimeType为 application/json
        ParentServiceBatchSaveOrUpdateParentsParam.RequestBody requestBody = ParentServiceBatchSaveOrUpdateParentsParam.RequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //query
        ParentServiceBatchSaveOrUpdateParentsParam.Query query = ParentServiceBatchSaveOrUpdateParentsParam.Query.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .build();
        requestBody.setQuery(query);
        query.setStudentParents(studentParents);
        param.setRequestBody(requestBody);
        ParentServiceBatchSaveOrUpdateParentsRequest request = new ParentServiceBatchSaveOrUpdateParentsRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        ParentServiceBatchSaveOrUpdateParentsResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃学生家长数据更新失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail("希沃平台：" + result.getResponseBody().getMessage());
        }

        return CommonResult.ok("新增成功");
        //endregion
    }
    //endregion

    //region 希沃删除学生原有的家长关系
    public CommonResult deleteOldStudentParentShip(SeewoClient seewoClient, String cardNo, List<String> phones) throws
            JsonProcessingException {
        //region 删除原有的家长关系
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        ParentServiceRemoveStudentParentConditionParam deleteOldFamilyParam = new ParentServiceRemoveStudentParentConditionParam();
        //请求体，MimeType为 application/json
        ParentServiceRemoveStudentParentConditionParam.JSONRequestBody deleteOldFamilyRequestBody = ParentServiceRemoveStudentParentConditionParam.JSONRequestBody.builder()
                .build();
        deleteOldFamilyParam.setRequestBody(deleteOldFamilyRequestBody);
        //
        ParentServiceRemoveStudentParentConditionParam.ThirdRemoveStudentParentQuery deleteOldFamilyquery = ParentServiceRemoveStudentParentConditionParam.ThirdRemoveStudentParentQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                //.studentCodes(java.util.Collections.singletonList(cardNo))//传卡号会把该学生的家长都删掉
                .parentPhones(phones)
                .build();
        deleteOldFamilyRequestBody.setQuery(deleteOldFamilyquery);
        deleteOldFamilyParam.setRequestBody(deleteOldFamilyRequestBody);
        ParentServiceRemoveStudentParentConditionRequest deleteOldFamilyRequest = new ParentServiceRemoveStudentParentConditionRequest(deleteOldFamilyParam);
        logger.info("入参：" + deleteOldFamilyRequest);
        //如果想要调用沙箱环境，请通过设置 deleteOldFamilyRequest 对象的 serverUrl 属性，如：
        //deleteOldFamilyRequest.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        ParentServiceRemoveStudentParentConditionResult deleteOldFamilyResult = seewoClient.invoke(deleteOldFamilyRequest);
        logger.info("出参：" + deleteOldFamilyResult);

        if (deleteOldFamilyResult == null) {
            return CommonResult.fail("希沃家长数据删除失败！");
        }

        if (deleteOldFamilyResult.getResponseBody().getResult() == null) {
            ObjectMapper objectMapper = new ObjectMapper();
            XwBodyVo result = objectMapper.readValue(deleteOldFamilyResult.getBody(), XwBodyVo.class);
            if (!result.getCode().equals("000000")) {
                return CommonResult.fail("希沃平台：" + result.getMessage());
            }

        } else {
            if (!deleteOldFamilyResult.getResponseBody().getResult().getCode().equals("000000")) {
                return CommonResult.fail("希沃平台：" + deleteOldFamilyResult.getResponseBody().getResult().getMessage());
            }
        }

        return CommonResult.ok("删除成功");
        //endregion
    }
    //endregion

    //region 希沃删除原有的家长关系
    public CommonResult deleteOldParentShip(SeewoClient seewoClient, List<SmartUser> studentDatas, String phone) throws
            JsonProcessingException {
        //region 删除原有的家长关系
        //初始化客户端
        //SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        ParentServiceRemoveStudentParentConditionParam deleteOldFamilyParam = new ParentServiceRemoveStudentParentConditionParam();
        //请求体，MimeType为 application/json
        ParentServiceRemoveStudentParentConditionParam.JSONRequestBody deleteOldFamilyRequestBody = ParentServiceRemoveStudentParentConditionParam.JSONRequestBody.builder()
                .build();
        deleteOldFamilyParam.setRequestBody(deleteOldFamilyRequestBody);
        //
        ParentServiceRemoveStudentParentConditionParam.ThirdRemoveStudentParentQuery deleteOldFamilyquery = ParentServiceRemoveStudentParentConditionParam.ThirdRemoveStudentParentQuery.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                //.studentCodes(studentDatas.stream().map(SmartUser::getCardNo).collect(Collectors.toList()))//不能传卡号 传了卡号会把该学生的家长都删掉
                .parentPhones(java.util.Collections.singletonList(phone))
                .build();
        deleteOldFamilyRequestBody.setQuery(deleteOldFamilyquery);
        deleteOldFamilyParam.setRequestBody(deleteOldFamilyRequestBody);
        ParentServiceRemoveStudentParentConditionRequest deleteOldFamilyRequest = new ParentServiceRemoveStudentParentConditionRequest(deleteOldFamilyParam);
        logger.info("入参：" + deleteOldFamilyRequest);
        logger.info("入参：" + JSON.toJSON(deleteOldFamilyRequest));
        //如果想要调用沙箱环境，请通过设置 deleteOldFamilyRequest 对象的 serverUrl 属性，如：
        //deleteOldFamilyRequest.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        ParentServiceRemoveStudentParentConditionResult deleteOldFamilyResult = seewoClient.invoke(deleteOldFamilyRequest);
        logger.info("出参：" + deleteOldFamilyResult);

        if (deleteOldFamilyResult == null) {
            return CommonResult.fail("希沃家长数据删除失败！");
        }

        if (deleteOldFamilyResult.getResponseBody().getResult() == null) {
            ObjectMapper objectMapper = new ObjectMapper();
            XwBodyVo result = objectMapper.readValue(deleteOldFamilyResult.getBody(), XwBodyVo.class);
            if (!result.getCode().equals("000000")) {
                return CommonResult.fail("希沃平台：" + result.getMessage());
            }

        } else {
            if (!deleteOldFamilyResult.getResponseBody().getResult().getCode().equals("000000")) {
                return CommonResult.fail("希沃平台：" + deleteOldFamilyResult.getResponseBody().getResult().getMessage());
            }
        }

        return CommonResult.ok("删除成功");
        //endregion
    }
    //endregion

    //endregion

    //region 百胜增删改查方法

    //region 百胜更新学生信息 给批量导入用的
    public CommonResult bsEUpdateStudent(SmartUser su, String bsClassNo, String startDate, String endDate) throws
            Exception {
        //region 更新百胜学生信息
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "student/update";

        String idCardStr = org.springframework.util.StringUtils.hasText(su.getIdCard()) ? "\",\"student_idcard\":\"" + su.getIdCard() : "\",\"student_idcard\":\"" + "";

        String bsGroupNo = eGroupTime(su.getTimeGroupId());
        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"classtab_no\":\"" + bsClassNo + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"classtab_no\":\"" + bsClassNo + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPosts(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsClassVo result = objectMapper.readValue(bsResult, BsClassVo.class);

        if (!bsResult.contains("更新成功")) {
            return CommonResult.fail("百胜平台：" + result.getMsg());
        }

        return CommonResult.ok("更新成功");
        //endregion
    }
    //endregion

    //region 百胜更新学生信息 给设置时间组接口用的
    public CommonResult bsTUpdateStudent(SmartUser su, String bsClassNo, String startDate, String endDate) throws
            Exception {
        //region 更新百胜学生信息
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "student/update";

        String idCardStr = org.springframework.util.StringUtils.hasText(su.getIdCard()) ? "\",\"student_idcard\":\"" + su.getIdCard() : "\",\"student_idcard\":\"" + "";

        String bsGroupNo = eGroupTime(su.getTimeGroupId());
        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"classtab_no\":\"" + bsClassNo + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"classtab_no\":\"" + bsClassNo + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPosts(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsClassVo result = objectMapper.readValue(bsResult, BsClassVo.class);

        if (!bsResult.contains("更新成功")) {
            return CommonResult.fail("百胜平台：" + result.getMsg());
        }

        return CommonResult.ok("更新成功");
        //endregion
    }
    //endregion

    //region 百胜更新学生信息
    public CommonResult bsUpdateStudent(SmartUser su, String startDate, String endDate) throws Exception {
        //region 更新百胜学生信息
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "student/update";

        String idCardStr = org.springframework.util.StringUtils.hasText(su.getIdCard()) ? "\",\"student_idcard\":\"" + su.getIdCard() : "\",\"student_idcard\":\"" + "";

        String bsGroupNo = eGroupTime(su.getTimeGroupId());
        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"student_no\":\"" + su.getBsStudentNo() + "\",\"student_name\":\"" + su.getName() + "\",\"student_number\":\"" + su.getCardNo() + "\",\"student_sex\":\"" + su.getSexId() + idCardStr + "\",\"student_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsClassVo result = objectMapper.readValue(bsResult, BsClassVo.class);

        if (!bsResult.contains("更新成功")) {
            return CommonResult.fail("百胜平台：" + result.getMsg());
        }

        return CommonResult.ok("更新成功");
        //endregion
    }
    //endregion

    //region 百胜新增学生
    public CommonResult<String> bsInsertStudent(String name, String cardNo, Integer sexId, String
            headImage, Integer timeGroupId, String bsClassNo, String startDate, String endDate, String idCard) throws
            Exception {
        //region 百胜新增学生信息
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "student/create";

        String idCardStr = org.springframework.util.StringUtils.hasText(idCard) ? "\",\"student_idcard\":\"" + idCard : "\",\"student_idcard\":\"" + "";

        String bsGroupNo = eGroupTime(timeGroupId);
        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"student_name\":\"" + name + "\",\"classtab_no\":\"" + bsClassNo + "\",\"student_number\":\"" + cardNo + "\",\"student_sex\":\"" + sexId + idCardStr + "\",\"student_photo\":\"" + imageUtils.getBase64Url(headImage) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"student_name\":\"" + name + "\",\"classtab_no\":\"" + bsClassNo + "\",\"student_number\":\"" + cardNo + "\",\"student_sex\":\"" + sexId + idCardStr + "\",\"student_photo\":\"" + imageUtils.getBase64Url(headImage) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"student_tgno\":\"" + bsGroupNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsStudentVo grade = objectMapper.readValue(bsResult, BsStudentVo.class);

        if (!bsResult.contains("添加成功")) {
            return CommonResult.fail("百胜平台：" + grade.getMsg());
        }

        // URL解码
        String decodedUrl = URLDecoder.decode(grade.getData(), "UTF-8");

        BsStudentNoVo studentNo = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsStudentNoVo.class);

        return CommonResult.ok("200", "新增成功", studentNo.getStudent_no());
        //endregion
    }
    //endregion

    //region 百胜删除学生
    public CommonResult bsDeleteStudent(SmartUser su) throws Exception {
        //region 百胜删除学生
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "student/delete";

        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"student_no\":\"" + su.getBsStudentNo() + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"student_no\":\"" + su.getBsStudentNo() + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsDeleteStudentVo result = objectMapper.readValue(bsResult, BsDeleteStudentVo.class);

        if (!bsResult.contains("删除学生成功")) {
            return CommonResult.fail("百胜平台：" + result.getMsg());
        }

        return CommonResult.ok("操作成功");
        //endregion
    }
    //endregion

    //region 百胜添加教师
    public CommonResult<String> bsInsertTeacher(SmartUser su, String departmentNo, String startDate, String endDate) throws
            Exception {
        //region 百胜添加教师数据
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "staff/create";

        String idCardStr = org.springframework.util.StringUtils.hasText(su.getIdCard()) ? "\",\"staff_idcard\":\"" + su.getIdCard() : "\",\"staff_idcard\":\"" + "";

        String bsGroupNo = eGroupTime(su.getTimeGroupId());
        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"staff_name\":\"" + su.getName() + "\",\"department_no\":\"" + departmentNo + "\",\"staff_number\":\"" + su.getCardNo() + "\",\"staff_phone\":\"" + su.getPhone() + "\",\"staff_sex\":\"" + su.getSexId() + idCardStr + "\",\"staff_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"staff_tgno\":\"" + bsGroupNo + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"staff_name\":\"" + su.getName() + "\",\"department_no\":\"" + departmentNo + "\",\"staff_number\":\"" + su.getCardNo() + "\",\"staff_phone\":\"" + su.getPhone() + "\",\"staff_sex\":\"" + su.getSexId() + idCardStr + "\",\"staff_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"staff_tgno\":\"" + bsGroupNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsStaffVo staff = objectMapper.readValue(bsResult, BsStaffVo.class);

        if (!bsResult.contains("添加成功")) {
            return CommonResult.fail("百胜平台：" + staff.getMsg());
        }

        // URL解码
        String decodedUrl = URLDecoder.decode(staff.getData(), "UTF-8");

        BsStaffNoVo staffNo = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsStaffNoVo.class);
        su.setBsStaffCode(staffNo.getStaff_no());

        return CommonResult.ok("200", "新增成功", staffNo.getStaff_no());
        //endregion
    }
    //endregion

    //region 百胜更新教师
    public CommonResult<String> updateBsTeacher(SmartUser su, String departmentNo, String startDate, String endDate) throws
            Exception {
        //region 百胜更新教师数据
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "staff/update";

        String idCardStr = org.springframework.util.StringUtils.hasText(su.getIdCard()) ? "\",\"staff_idcard\":\"" + su.getIdCard() : "\",\"staff_idcard\":\"" + "";

        String bsGroupNo = eGroupTime(su.getTimeGroupId());
        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"staff_no\":\"" + su.getBsStaffCode() + "\",\"staff_name\":\"" + su.getName() + "\",\"department_no\":\"" + departmentNo + "\",\"staff_number\":\"" + su.getCardNo() + "\",\"staff_phone\":\"" + su.getPhone() + "\",\"staff_sex\":\"" + su.getSexId() + idCardStr + "\",\"staff_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"staff_tgno\":\"" + bsGroupNo + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"staff_no\":\"" + su.getBsStaffCode() + "\",\"staff_name\":\"" + su.getName() + "\",\"department_no\":\"" + departmentNo + "\",\"staff_number\":\"" + su.getCardNo() + "\",\"staff_phone\":\"" + su.getPhone() + "\",\"staff_sex\":\"" + su.getSexId() + idCardStr + "\",\"staff_photo\":\"" + imageUtils.getBase64Url(su.getHeadImage()) + "\",\"student_startdate\":\"" + startDate + "\",\"student_effdate\":\"" + endDate + "\",\"staff_tgno\":\"" + bsGroupNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsStaffVo staff = objectMapper.readValue(bsResult, BsStaffVo.class);

        if (!bsResult.contains("更新成功")) {
            return CommonResult.fail("百胜平台：" + staff.getMsg());
        }

        // URL解码
        String decodedUrl = URLDecoder.decode(staff.getData(), "UTF-8");

        BsStaffNoVo staffNo = objectMapper.readValue(decrypt(decodedUrl, controlConfig.getAppSecret()), BsStaffNoVo.class);

        return CommonResult.ok("200", "操作成功", staffNo.getStaff_no());
        //endregion
    }
    //endregion

    //region百胜删除教师
    public CommonResult bsDeleteTeacher(String staffNo) throws Exception {
        //region 百胜删除教师
        String appId = controlConfig.getAppId();
        String schoolno = controlConfig.getSchoolCode();
        String timestamp = TimeExchange.DateNowTimeStamo();
        String appSecret = controlConfig.getAppSecret();
        String url = controlConfig.getUrl() + "staff/delete";

        JSONObject jsonobject = new JSONObject();
        jsonobject.put("appid", appId);
        String str = "{\"staff_no\":\"" + staffNo + "\"}";
        String aesStr = URLEncoder.encode(AesTestOne.encrypt(str, controlConfig.getAppSecret()), "UTF-8");
        jsonobject.put("data", aesStr);
        jsonobject.put("schoolno", schoolno);
        jsonobject.put("timestamp", timestamp);

        String md5Str = "appid=" + appId + "&data={\"staff_no\":\"" + staffNo + "\"}" + "&schoolno=" + schoolno + "&timestamp=" + timestamp + "&key=" + appSecret;
        String sign = CommonUtil.MD5(md5Str);
        //sign签名
        jsonobject.put("sign", sign);

        //返回的结果中 code为1表示成功
        String bsResult = RequestUtils.httpPost(url, jsonobject.toJSONString());

        ObjectMapper objectMapper = new ObjectMapper();
        BsDeleteStudentVo result = objectMapper.readValue(bsResult, BsDeleteStudentVo.class);

        if (!bsResult.contains("删除员工成功")) {
            return CommonResult.fail("百胜平台：" + result.getMsg());
        }

        return CommonResult.ok("删除成功");
        //endregion
    }
    //endregion

    //endregion

    //region 用户分页数据

    /**
     * 用户分页数据查询
     *
     * @param currentPage  当前页数
     * @param pageCount    一页数据条数
     * @param departmentId 部门ID
     * @return
     */
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult queryPageSmartUser(int currentPage, int pageCount, Integer departmentId, String
            name, String userhead) {
        //region 角色判断
        String userID = AesUtils.decrypt(userhead);
        SmartUser operateData = smartUserService.getSmartById(Integer.valueOf(userID));
        if (operateData == null) {
            return CommonResult.fail("用户信息不合法，无法查看");
        }

        QueryWrapper<SmartAuthority> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("user_id", operateData.getId());
        List<SmartAuthority> authorities = smartAuthorityService.getAuthorByKey(queryWrapper);
        if (authorities == null) {
            return CommonResult.fail("当前用户权限不足，无法查看对应部门数据");
        }

        if (authorities.size() <= 0) {
            return CommonResult.fail("当前用户权限不足，无法查看对应部门数据");
        }

        List<String> viewAuthors = new ArrayList<>();//部门查看权限
        List<String> manageAuthors = new ArrayList<>();//部门管理权限
        for (SmartAuthority author : authorities) {
            List<String> views = org.springframework.util.StringUtils.hasText(author.getDepartmentView().trim()) ? Arrays.asList(author.getDepartmentView().trim().split(",")) : new ArrayList<>();
            if (views != null && views.size() > 0) {
                viewAuthors.addAll(views);
            }

            List<String> manages = org.springframework.util.StringUtils.hasText(author.getDepartmentManage().trim()) ? Arrays.asList(author.getDepartmentManage().trim().split(",")) : new ArrayList<>();
            if (manages != null && manages.size() > 0) {
                manageAuthors.addAll(manages);
            }
        }

        List<String> AllAuths = new ArrayList<>();
        AllAuths.addAll(viewAuthors);
        AllAuths.addAll(manageAuthors);
        AllAuths = AllAuths.stream().distinct().collect(Collectors.toList());
        //endregion

        //获取该部门下的所有子级部门ID
        List<Integer> childDepartmentIds = new ArrayList<>();
        List<SmartDepartment> departments = smartDepartmentService.list(null);
        childDepartmentIds.add(departmentId);
        QueryDepartmentTreeRecords(departmentId, departments, childDepartmentIds);

        if (departmentId == null) {
            childDepartmentIds = null;
        }

        List<Integer> authDepartments = new ArrayList<>();
        for (Integer child : childDepartmentIds) {
            if (AllAuths.contains(String.valueOf(child))) {
                authDepartments.add(child);
            }
        }

        PageUtils<UserVo> result = null;
        if (authDepartments != null && authDepartments.size() > 0) {
            result = smartUserService.querySmartUserPages(currentPage, pageCount, authDepartments, name);
        } else {
            IPage<UserVo> userData = new Page<>();
            result = new PageUtils<UserVo>(userData);
        }

        if (result != null && result.getList() != null) {
            List<Integer> studentIds = new ArrayList<>();
            List<String> studentStrs = Arrays.asList(StringUtils.join(result.getList().stream().map(UserVo::getAffiliate).collect(Collectors.toList()), ",").split(","));
            for (String studentStr : studentStrs) {
                if (!ObjectUtils.isEmpty(studentStr)) {
                    studentIds.add(Integer.valueOf(studentStr));
                }
            }
            List<SmartUser> students = studentIds != null && studentIds.size() > 0 ? smartUserService.getSmartUserByIds(studentIds) : new ArrayList<>();
            List<SmartClass> classs = smartClassService.list(null);

            List<SmartIdentity> idnetitys = smartIdentityService.list(null);
            List<SmartTimeGroup> timeGroups = smartTimeGroupService.list(null);
            List<Integer> userIds = result.getList().stream().map(UserVo::getId).collect(Collectors.toList());
            List<UserSubjectVo> teachings = smartTeachingService.querySmartTeachings(userIds);
            for (UserVo data : result.getList()) {
                //region 任课数据
                List<UserSubjectVo> ownerTeachings = teachings.stream().filter(e -> e.getUserId().equals(data.getId())).collect(Collectors.toList());
                if (ownerTeachings != null && ownerTeachings.size() > 0) {
                    List<isrRequest> subjectVos = new ArrayList<>();
                    for (UserSubjectVo ownerTeaching : ownerTeachings) {
                        isrRequest ir = new isrRequest();
                        Integer[] ids = new Integer[3];
                        //用这种方式能避免重复引用
                        //简单说，重复引用就是一个集合/对象中的多个元素/属性同时引用同一对象，循环引用就是集合/对象中的多个元素/属性存在相互引用导致循环。
                        Integer subjectId = new Integer(ownerTeaching.getSubjectId());
                        ids[0] = subjectId;
                        Integer gradeId = new Integer(ownerTeaching.getGradeId());
                        ids[1] = gradeId;
                        Integer classId = new Integer(ownerTeaching.getClassId());
                        ids[2] = classId;
                        ir.setIds(Arrays.asList(ids));
                        subjectVos.add(ir);
                    }

                    data.setSubjectVos(subjectVos);
                }
                //endregion

                //时间组
                Optional<SmartTimeGroup> oTimeGroup = timeGroups.stream().filter(e -> e.getId().equals(data.getTimeGroupId())).findFirst();
                if (oTimeGroup != null && oTimeGroup.isPresent()) {
                    data.setTimeGroupName(oTimeGroup.get().getName());
                }

                Optional<SmartIdentity> identityData = idnetitys.stream().filter(e -> e.getId().equals(data.getIdentityId())).findFirst();
                if (identityData != null && identityData.isPresent()) {
                    data.setIdentity(identityData.get().getName());
                }

                data.setSex(eSexStatu.stringOf(data.getSexId()));
                Optional<SmartDepartment> departmentData = departments == null ? null : departments.stream().filter(e -> e.getId().equals(data.getDepartmentId())).findFirst();
                if (departmentData != null && departmentData.isPresent()) {
                    data.setDepartment(departmentData.get().getName());
                }
                Optional<SmartClass> nowClass = classs == null ? null : classs.stream().filter(e -> e.getId().equals(data.getSchoolClass())).findFirst();
                if (nowClass != null && nowClass.isPresent()) {
                    data.setClassStr(nowClass.get().getName());
                }

                List<AffiliateUserVo> datas = new ArrayList<>();
                if (data.getAffiliate() != null) {
                    List<String> affiliates = Arrays.asList(data.getAffiliate().split(","));
                    for (String a : affiliates) {
                        if (!ObjectUtils.isEmpty(a)) {
                            Optional<SmartUser> student = students.stream().filter(e -> e.getId().equals(Integer.valueOf(a))).findFirst();
                            if (student != null && student.isPresent()) {
                                AffiliateUserVo affiliate = new AffiliateUserVo();
                                affiliate.setId(student.get().getId());
                                affiliate.setName(student.get().getName());
                                affiliate.setCardNo(student.get().getCardNo());
                                affiliate.setDepartmentId(student.get().getDepartmentId());
                                datas.add(affiliate);
                            }
                        }
                    }
                }
                data.setAffiliates(datas);
            }
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region 用户分页数据

    /**
     * 用户分页数据查询
     *
     * @param currentPage  当前页数
     * @param pageCount    一页数据条数
     * @param departmentId 部门ID
     * @return
     */
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult queryPageSmartUserNoAuth(int currentPage, int pageCount, Integer departmentId, String
            name, String userhead) {
        //region 角色判断
        String userID = AesUtils.decrypt(userhead);
        SmartUser operateData = smartUserService.getSmartById(Integer.valueOf(userID));
        if (operateData == null) {
            return CommonResult.fail("用户信息不合法，无法查看");
        }
        //endregion

        //获取该部门下的所有子级部门ID
        List<Integer> childDepartmentIds = new ArrayList<>();
        List<SmartDepartment> departments = smartDepartmentService.list(null);
        childDepartmentIds.add(departmentId);
        QueryDepartmentTreeRecords(departmentId, departments, childDepartmentIds);

        if (departmentId == null) {
            childDepartmentIds = null;
        }

        PageUtils<UserVo> result = null;
        if (childDepartmentIds != null && childDepartmentIds.size() > 0) {
            result = smartUserService.querySmartUserPages(currentPage, pageCount, childDepartmentIds, name);
        } else {
            IPage<UserVo> userData = new Page<>();
            result = new PageUtils<UserVo>(userData);
        }

        if (result != null && result.getList() != null) {
            List<Integer> studentIds = new ArrayList<>();
            List<String> studentStrs = Arrays.asList(StringUtils.join(result.getList().stream().map(UserVo::getAffiliate).collect(Collectors.toList()), ",").split(","));
            for (String studentStr : studentStrs) {
                if (!ObjectUtils.isEmpty(studentStr)) {
                    studentIds.add(Integer.valueOf(studentStr));
                }
            }
            List<SmartUser> students = studentIds != null && studentIds.size() > 0 ? smartUserService.getSmartUserByIds(studentIds) : new ArrayList<>();
            List<SmartClass> classs = smartClassService.list(null);

            List<SmartIdentity> idnetitys = smartIdentityService.list(null);

            for (UserVo data : result.getList()) {
                data.setTimeGroupName(eGroupTime(data.getTimeGroupId()));

                Optional<SmartIdentity> identityData = idnetitys.stream().filter(e -> e.getId().equals(data.getIdentityId())).findFirst();
                if (identityData != null && identityData.isPresent()) {
                    data.setIdentity(identityData.get().getName());
                }

                data.setSex(eSexStatu.stringOf(data.getSexId()));
                Optional<SmartDepartment> departmentData = departments == null ? null : departments.stream().filter(e -> e.getId().equals(data.getDepartmentId())).findFirst();
                if (departmentData != null && departmentData.isPresent()) {
                    data.setDepartment(departmentData.get().getName());
                }
                Optional<SmartClass> nowClass = classs == null ? null : classs.stream().filter(e -> e.getId().equals(data.getSchoolClass())).findFirst();
                if (nowClass != null && nowClass.isPresent()) {
                    data.setClassStr(nowClass.get().getName());
                }

                List<AffiliateUserVo> datas = new ArrayList<>();
                if (data.getAffiliate() != null) {
                    List<String> affiliates = Arrays.asList(data.getAffiliate().split(","));
                    for (String a : affiliates) {
                        if (!ObjectUtils.isEmpty(a)) {
                            Optional<SmartUser> student = students.stream().filter(e -> e.getId().equals(Integer.valueOf(a))).findFirst();
                            if (student != null && student.isPresent()) {
                                AffiliateUserVo affiliate = new AffiliateUserVo();
                                affiliate.setId(student.get().getId());
                                affiliate.setName(student.get().getName());
                                affiliate.setCardNo(student.get().getCardNo());
                                affiliate.setDepartmentId(student.get().getDepartmentId());
                                datas.add(affiliate);
                            }
                        }
                    }
                }
                data.setAffiliates(datas);
            }
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region 导出表头列表集合
    @Override
    @DESRespondSecret(validated = false)
    public CommonResult gauageOutfit() {
        int i = 1;
        List<gauageOutfitVo> govs = new ArrayList<>();

        //region 学号
        gauageOutfitVo cardNo = new gauageOutfitVo();
        cardNo.setId(i);
        cardNo.setName("学号");
        govs.add(cardNo);
        i++;
        //endregion
        //region 姓名
        gauageOutfitVo name = new gauageOutfitVo();
        name.setId(i);
        name.setName("姓名");
        govs.add(name);
        i++;
        //endregion
        //region 身份
        gauageOutfitVo identity = new gauageOutfitVo();
        identity.setId(i);
        identity.setName("身份");
        govs.add(identity);
        i++;
        //endregion
        //region 职务
        gauageOutfitVo duties = new gauageOutfitVo();
        duties.setId(i);
        duties.setName("职务");
        govs.add(duties);
        i++;
        //endregion
        //region 身份证号
        gauageOutfitVo idcard = new gauageOutfitVo();
        idcard.setId(i);
        idcard.setName("身份证号");
        govs.add(idcard);
        i++;
        //endregion
        //region 性别
        gauageOutfitVo sex = new gauageOutfitVo();
        sex.setId(i);
        sex.setName("性别");
        govs.add(sex);
        i++;
        //endregion
        //region 部门
        gauageOutfitVo department = new gauageOutfitVo();
        department.setId(i);
        department.setName("部门");
        govs.add(department);
        i++;
        //endregion
        //region 人脸照片
        gauageOutfitVo iamge = new gauageOutfitVo();
        iamge.setId(i);
        iamge.setName("人脸照片");
        govs.add(iamge);
        i++;
        //endregion
        //region 年级
        gauageOutfitVo grade = new gauageOutfitVo();
        grade.setId(i);
        grade.setName("年级");
        govs.add(grade);
        i++;
        //endregion
        //region 班级
        gauageOutfitVo classes = new gauageOutfitVo();
        classes.setId(i);
        classes.setName("班级");
        govs.add(classes);
        i++;
        //endregion
        //region 时间组
        gauageOutfitVo timeGroup = new gauageOutfitVo();
        timeGroup.setId(i);
        timeGroup.setName("时间组");
        govs.add(timeGroup);
        i++;
        //endregion
        //region 学院
        gauageOutfitVo college = new gauageOutfitVo();
        college.setId(i);
        college.setName("学院");
        govs.add(college);
        i++;
        //endregion
        //region 专业
        gauageOutfitVo speciality = new gauageOutfitVo();
        speciality.setId(i);
        speciality.setName("专业");
        govs.add(speciality);
        i++;
        //endregion
        //region 校区
        gauageOutfitVo campus = new gauageOutfitVo();
        campus.setId(i);
        campus.setName("校区");
        govs.add(campus);
        i++;
        //endregion
        //region 宿舍号
        gauageOutfitVo dormitory = new gauageOutfitVo();
        dormitory.setId(i);
        dormitory.setName("宿舍号");
        govs.add(dormitory);
        i++;
        //endregion
        //region 手机号
        gauageOutfitVo phone = new gauageOutfitVo();
        phone.setId(i);
        phone.setName("手机号");
        govs.add(phone);
        i++;
        //endregion
        //region 关联人
        gauageOutfitVo affiliate = new gauageOutfitVo();
        affiliate.setId(i);
        affiliate.setName("关联人");
        govs.add(affiliate);
        i++;
        //endregion
        //region 职称
        gauageOutfitVo title = new gauageOutfitVo();
        title.setId(i);
        title.setName("职称");
        govs.add(title);
        i++;
        //endregion
        //region 家庭地址
        gauageOutfitVo address = new gauageOutfitVo();
        address.setId(i);
        address.setName("家庭地址");
        govs.add(address);
        i++;
        //endregion
        //region 民族
        gauageOutfitVo nation = new gauageOutfitVo();
        nation.setId(i);
        nation.setName("民族");
        govs.add(nation);
        i++;
        //endregion
        //region 生源地
        gauageOutfitVo student = new gauageOutfitVo();
        student.setId(i);
        student.setName("生源地");
        govs.add(student);
        i++;
        //endregion
        //region 毕业学院
        gauageOutfitVo graduate = new gauageOutfitVo();
        graduate.setId(i);
        graduate.setName("毕业学院");
        govs.add(graduate);
        //endregion
        return CommonResult.ok(govs);
    }

    @Override
    @DESRespondSecret(validated = true)
    public CommonResult getPage(int currentPage, int pageCount, String keyWord, String schoolClass) {
        PageUtils<SmartUserPageVo> pageUtils = smartUserService.getPage(currentPage, pageCount, keyWord, schoolClass);

        return CommonResult.ok(pageUtils);
    }

    @Override
    @DESRespondSecret(validated = true)
    @PassToken
    public CommonResult studentSelect(String keyWord) {
        if (ObjectUtils.isEmpty(keyWord)) {
            return CommonResult.fail();
        }

        List<StudentSelectVo> list = smartUserService.studentSelect(keyWord);

        return CommonResult.ok(list);
    }

    @Override
    @DESRespondSecret(validated = true)
    public CommonResult statisticsCampus(Integer classId, String dateTime) {
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime startTime = LocalDateTime.parse(dateTime, dateTimeFormatter1);
        LocalDateTime endTime = startTime.plusDays(1);
//        正常
        Set<StatisticsCampusVo> vos = new HashSet<>();

//        查找门禁记录
        List<StatisticsCampusVo> accessVos = smartUserService.getAccessStatisticsCampus(classId, startTime, endTime);
        for (StatisticsCampusVo accessVo : accessVos) {
            vos.add(accessVo);
        }
//        查找打卡记录
        List<StatisticsCampusVo> attendanceVos = smartUserService.getAttendanceStatisticsCampus(classId, startTime, endTime);
        for (StatisticsCampusVo attendanceVo : attendanceVos) {
            vos.add(attendanceVo);
        }
//        查找人脸记录
        List<StatisticsCampusVo> faceDiscernVos = smartUserService.getFaceDiscernStatisticsCampus(classId, startTime, endTime);
        for (StatisticsCampusVo faceDiscernVo : faceDiscernVos) {
            vos.add(faceDiscernVo);
        }

//        查找请假记录
        List<StatisticsCampusVo> ackVos = smartUserService.getAckStatisticsCampus(classId, startTime, endTime);
        for (StatisticsCampusVo ackVo : ackVos) {
            vos.add(ackVo);
        }

//        查找该班级下的所有人
        List<StatisticsCampusVo> campusVos = smartUserService.getClassStudent(classId);

//        不在正常记录里面的就是异常记录
        ArrayList<StatisticsCampusVo> abnormalVos = new ArrayList<>();
        for (StatisticsCampusVo campusVo : campusVos) {
            if (!vos.contains(campusVo)) {
                abnormalVos.add(campusVo);
            }
        }


        HashMap<String, Object> normal = new HashMap<>();
        normal.put("date", vos);
        normal.put("count", vos.size());

        HashMap<String, Object> ack = new HashMap<>();
        ack.put("date", ackVos);
        ack.put("count", ackVos.size());

        HashMap<String, Object> abnormal = new HashMap<>();
        abnormal.put("date", abnormalVos);
        abnormal.put("count", abnormalVos.size());

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("normal", normal);
        jsonObject.put("ack", ack);
        jsonObject.put("abnormal", abnormal);

        return CommonResult.ok(jsonObject);
    }

    @Override
    @DESRespondSecret(validated = true)
    public CommonResult addressBook(Integer userId) {
//        获取学生信息
        SmartUser smartById = smartUserService.getSmartById(userId);
//        获取家长信息
        List<SmartUser> list = smartUserService.getAddressBook(userId);

        HashMap<String, Object> map = new HashMap<>();
        map.put("student", smartById);

        map.put("patriarch", list);

        return CommonResult.ok(map);
    }

    /**
     * 在校统计 逻辑说明：
     * 监听包含请假、门禁、打卡、人脸
     */
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult statisticsCampusManage(Integer gradeId, Integer classId, String dateTime, Integer type, String keyWord) {
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime startTime = LocalDateTime.parse(dateTime, dateTimeFormatter1);
        LocalDateTime endTime = startTime.plusDays(1);
        //正常
        Set<StatisticsCampusManageVo> vos = new HashSet<>();

        //请假
        //查找请假记录
        List<StatisticsCampusManageVo> ackVos = smartUserService.getAckStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        if (ObjectUtils.isNotEmpty(ackVos) && ackVos.size() > 0) {
            for (StatisticsCampusManageVo ackVo : ackVos) {
                vos.add(ackVo);
            }
        }

        //查找门禁记录
        List<StatisticsCampusManageVo> accessVos = smartUserService.getAccessStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        for (StatisticsCampusManageVo accessVo : accessVos) {
            vos.add(accessVo);
        }
        //查找打卡记录
        List<StatisticsCampusManageVo> attendanceVos = smartUserService.getAttendanceStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        for (StatisticsCampusManageVo attendanceVo : attendanceVos) {
            vos.add(attendanceVo);
        }
        //查找人脸记录
        List<StatisticsCampusManageVo> faceDiscernVos = smartUserService.getFaceDiscernStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        for (StatisticsCampusManageVo faceDiscernVo : faceDiscernVos) {
            vos.add(faceDiscernVo);
        }


        //异常
        //查找该班级下的所有人
        List<StatisticsCampusManageVo> campusVos = smartUserService.getClassStudentManage(gradeId, classId, keyWord);

        //不在正常记录里面的就是异常记录
        ArrayList<StatisticsCampusManageVo> abnormalVos = new ArrayList<>();
        for (StatisticsCampusManageVo campusVo : campusVos) {
            if (!vos.contains(campusVo)) {
                abnormalVos.add(campusVo);
            }
        }

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("abnormal", abnormalVos.size());//未监听
        jsonObject.put("normal", vos.size());//监听
        jsonObject.put("ack", ackVos.size());//请假

        if (1 == type) {
            jsonObject.put("data", abnormalVos);
            return CommonResult.ok(jsonObject);
        } else if (2 == type) {
            jsonObject.put("data", vos);
            return CommonResult.ok(jsonObject);
        } else if (3 == type) {
            jsonObject.put("data", ackVos);
            return CommonResult.ok(jsonObject);
        } else {
            return CommonResult.fail("状态异常");
        }


    }

    @Override
    @PassToken
    public void statisticsCampusManageExport(HttpServletResponse response, Integer gradeId, Integer classId, String dateTime, Integer type, String keyWord) {
        //导出
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("在校统计");
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("序号");
        headerRow.createCell(1).setCellValue("年级");
        headerRow.createCell(2).setCellValue("班级");
        headerRow.createCell(3).setCellValue("姓名");
        headerRow.createCell(4).setCellValue("学号");
        headerRow.createCell(5).setCellValue("类型");
        headerRow.createCell(6).setCellValue("时间");


        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime startTime = LocalDateTime.parse(dateTime, dateTimeFormatter1);
        LocalDateTime endTime = startTime.plusDays(1);

        //        正常
        Set<StatisticsCampusManageVo> vos = new HashSet<>();

        //        查找请假记录
        List<StatisticsCampusManageVo> ackVos = smartUserService.getAckStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        if (ObjectUtils.isNotEmpty(ackVos) && ackVos.size() > 0) {
            for (StatisticsCampusManageVo ackVo : ackVos) {
                vos.add(ackVo);
            }
        }

//        查找门禁记录
        List<StatisticsCampusManageVo> accessVos = smartUserService.getAccessStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        for (StatisticsCampusManageVo accessVo : accessVos) {
            vos.add(accessVo);
        }
//        查找打卡记录
        List<StatisticsCampusManageVo> attendanceVos = smartUserService.getAttendanceStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        for (StatisticsCampusManageVo attendanceVo : attendanceVos) {
            vos.add(attendanceVo);
        }
//        查找人脸记录
        List<StatisticsCampusManageVo> faceDiscernVos = smartUserService.getFaceDiscernStatisticsCampusManage(gradeId, classId, startTime, endTime, keyWord);
        for (StatisticsCampusManageVo faceDiscernVo : faceDiscernVos) {
            vos.add(faceDiscernVo);
        }

//            异常
        //        查找该班级下的所有人
        List<StatisticsCampusManageVo> campusVos = smartUserService.getClassStudentManage(gradeId, classId, keyWord);

//        不在正常记录里面的就是异常记录
        ArrayList<StatisticsCampusManageVo> abnormalVos = new ArrayList<>();
        for (StatisticsCampusManageVo campusVo : campusVos) {
            if (!vos.contains(campusVo)) {
                abnormalVos.add(campusVo);
            }
        }
        String[] s = dateTime.split(" ");
        String s1 = s[0];

        int count = 0;

        for (int i = 0; i < abnormalVos.size(); i++) {
            StatisticsCampusManageVo vo = abnormalVos.get(i);
            count = count + 1;
            Row dataRow = sheet.createRow(count);
            dataRow.createCell(0).setCellValue(count);
            dataRow.createCell(1).setCellValue(vo.getGradeName());
            dataRow.createCell(2).setCellValue(vo.getClassName());
            dataRow.createCell(3).setCellValue(vo.getName());
            dataRow.createCell(4).setCellValue(vo.getCardNo());
            dataRow.createCell(5).setCellValue("异常");
            dataRow.createCell(6).setCellValue(s1);
        }

        for (int i = 0; i < ackVos.size(); i++) {
            StatisticsCampusManageVo vo = ackVos.get(i);
            count = count + 1;
            Row dataRow = sheet.createRow(count);
            dataRow.createCell(0).setCellValue(count);
            dataRow.createCell(1).setCellValue(vo.getGradeName());
            dataRow.createCell(2).setCellValue(vo.getClassName());
            dataRow.createCell(3).setCellValue(vo.getName());
            dataRow.createCell(4).setCellValue(vo.getCardNo());
            dataRow.createCell(5).setCellValue("请假");
            dataRow.createCell(6).setCellValue(s1);
        }


        for (StatisticsCampusManageVo vo : vos) {
            count = count + 1;
            Row dataRow = sheet.createRow(count);
            dataRow.createCell(0).setCellValue(count);
            dataRow.createCell(1).setCellValue(vo.getGradeName());
            dataRow.createCell(2).setCellValue(vo.getClassName());
            dataRow.createCell(3).setCellValue(vo.getName());
            dataRow.createCell(4).setCellValue(vo.getCardNo());
            dataRow.createCell(5).setCellValue("正常");
            dataRow.createCell(6).setCellValue(s1);
        }

// 将工作簿写入文件
        ExcelUtils.excelDownload(workbook, s1 + "：在校统计.xlsx", response);

    }

    @Override
    @DESRespondSecret(validated = false)
    public CommonResult statisticsStatementManag(String dateTime) {
        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime startTime = LocalDateTime.parse(dateTime, dateTimeFormatter1);
        LocalDateTime endTime = startTime.plusDays(1);

        Integer totalAbnormal = 0;
        Integer totalNormal = 0;
        Integer totalAck = 0;

//        获取年级
        List<SmartGrade> smartGrades = smartGradeService.list(new LambdaQueryWrapper<>());


//        获取每个班的请假人数
        List<StatisticsStatement> ackList = smartUserService.getUserAckTotal(startTime, endTime);

//        获取每个班级的人数
        List<StatisticsStatement> totalList = smartUserService.getUserClassTotal();

//        获取每个班级的正常人数
        List<StatisticsStatement> normalList = smartUserService.getUserNormalTotal(startTime, endTime);


        ArrayList<StatisticsStatementVo> vos = new ArrayList<>();
        for (StatisticsStatement statisticsStatement : totalList) {
            StatisticsStatementVo vo = new StatisticsStatementVo();
            Integer classId = statisticsStatement.getClassId();
            Integer gradeId = statisticsStatement.getGradeId();
            vo.setGradeId(gradeId);
            vo.setClassId(classId);
            vo.setGradeName(statisticsStatement.getGradeName());
            vo.setClassName(statisticsStatement.getClassName());

//            总数
            Integer total = statisticsStatement.getCount();
            Integer normal = 0;
            Integer ack = 0;

            for (StatisticsStatement statement : normalList) {
                Integer classId1 = statement.getClassId();
                Integer gradeId1 = statement.getGradeId();
                if (classId.equals(classId1) && gradeId.equals(gradeId1)) {
                    normal = statement.getCount();
                    break;
                }
            }

            for (StatisticsStatement statement : ackList) {
                Integer classId1 = statement.getClassId();
                Integer gradeId1 = statement.getGradeId();
                if (classId.equals(classId1) && gradeId.equals(gradeId1)) {
//                  请假数量
                    ack = statement.getCount();
                    break;
                }
            }
            Integer abnormal = total - normal;
            vo.setAck(ack);
            vo.setNormal(normal);
            vo.setAbnormal(abnormal);

            totalAbnormal = totalAbnormal + abnormal;
            totalNormal = totalNormal + normal;
            totalAck = totalAck + ack;

            vos.add(vo);

        }
        ArrayList<StatisticsStatementManagVo> ssmVos = new ArrayList<>();
        for (SmartGrade smartGrade : smartGrades) {
            StatisticsStatementManagVo vo = new StatisticsStatementManagVo();
            Integer id = smartGrade.getId();
            vo.setGradeName(smartGrade.getName());
            List<StatisticsStatementVo> ownerClasses = vos.stream().filter(e -> e.getGradeId().equals(id)).collect(Collectors.toList());
            if (ownerClasses != null && ownerClasses.size() > 0) {
                vo.setVos(ownerClasses);
            }
            ssmVos.add(vo);
        }

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("list", ssmVos);
        jsonObject.put("totalAbnormal", totalAbnormal);
        jsonObject.put("totalNormal", totalNormal);
        jsonObject.put("totalAck", totalAck);

        return CommonResult.ok(jsonObject);
    }

    @Override
    public void statisticsStatementManagExport(HttpServletResponse response, String dateTime) {

        //导出
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("统计报表");
        Row headerRow = sheet.createRow(0);
        headerRow.createCell(0).setCellValue("序号");
        headerRow.createCell(1).setCellValue("年级");
        headerRow.createCell(2).setCellValue("班级");
        headerRow.createCell(3).setCellValue("监听");
        headerRow.createCell(4).setCellValue("未监听");
        headerRow.createCell(5).setCellValue("请假");


        DateTimeFormatter dateTimeFormatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime startTime = LocalDateTime.parse(dateTime, dateTimeFormatter1);
        LocalDateTime endTime = startTime.plusDays(1);

//        获取每个班的请假人数
        List<StatisticsStatement> ackList = smartUserService.getUserAckTotal(startTime, endTime);

//        获取每个班级的人数
        List<StatisticsStatement> totalList = smartUserService.getUserClassTotal();

//        获取每个班级的正常人数
        List<StatisticsStatement> normalList = smartUserService.getUserNormalTotal(startTime, endTime);


        ArrayList<StatisticsStatementVo> vos = new ArrayList<>();
        for (StatisticsStatement statisticsStatement : totalList) {
            StatisticsStatementVo vo = new StatisticsStatementVo();
            Integer classId = statisticsStatement.getClassId();
            Integer gradeId = statisticsStatement.getGradeId();
            vo.setGradeId(gradeId);
            vo.setClassId(classId);
            vo.setGradeName(statisticsStatement.getGradeName());
            vo.setClassName(statisticsStatement.getClassName());

//            总数
            Integer total = statisticsStatement.getCount();
            Integer normal = 0;
            Integer ack = 0;

            for (StatisticsStatement statement : normalList) {
                Integer classId1 = statement.getClassId();
                Integer gradeId1 = statement.getGradeId();
                if (classId.equals(classId1) && gradeId.equals(gradeId1)) {
                    normal = statement.getCount();
                    break;
                }
            }

            for (StatisticsStatement statement : ackList) {
                Integer classId1 = statement.getClassId();
                Integer gradeId1 = statement.getGradeId();
                if (classId.equals(classId1) && gradeId.equals(gradeId1)) {
//                  请假数量
                    ack = statement.getCount();
                    break;
                }
            }
            Integer abnormal = total - normal;
            vo.setAck(ack);
            vo.setNormal(normal);
            vo.setAbnormal(abnormal);

            vos.add(vo);

        }

        String[] s = dateTime.split(" ");
        String s1 = s[0];

        for (int i = 0; i < vos.size(); i++) {
            StatisticsStatementVo vo = vos.get(i);
            Row dataRow = sheet.createRow(i+1);
            dataRow.createCell(0).setCellValue(i+1);
            dataRow.createCell(1).setCellValue(vo.getGradeName());
            dataRow.createCell(2).setCellValue(vo.getClassName());
            dataRow.createCell(3).setCellValue(vo.getNormal());
            dataRow.createCell(4).setCellValue(vo.getAbnormal());
            dataRow.createCell(5).setCellValue(vo.getAck());
        }

        ExcelUtils.excelDownload(workbook, s1 + "：统计报表.xlsx", response);
    }


    //endregion

    //region 用户导出

    /**
     * @param response 响应头
     * @param userhead 请求头
     * @param sure     请求参数
     */
    @Override
    @DESRespondSecret(validated = false)
    public CommonResult smartUserExport(HttpServletResponse response, String userhead, smartUserExportRequest sure) {
        if (sure.getGauageOutfitVos() == null) {
            return CommonResult.fail("表头数据为空");
        }

        if (sure.getGauageOutfitVos().size() <= 0) {
            return CommonResult.fail("表头数据为空");
        }

        //region 角色判断
        String userID = AesUtils.decrypt(userhead);
        SmartUser operateData = smartUserService.getSmartById(Integer.valueOf(userID));
        if (operateData != null && sure != null && sure.getGauageOutfitVos() != null && sure.getGauageOutfitVos().size() > 0) {
            QueryWrapper<SmartAuthority> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("user_id", operateData.getId());
            List<SmartAuthority> authorities = smartAuthorityService.getAuthorByKey(queryWrapper);
            if (authorities != null && authorities.size() > 0) {

                List<String> viewAuthors = new ArrayList<>();//部门查看权限
                List<String> manageAuthors = new ArrayList<>();//部门管理权限
                for (SmartAuthority author : authorities) {
                    List<String> views = org.springframework.util.StringUtils.hasText(author.getDepartmentView().trim()) ? Arrays.asList(author.getDepartmentView().trim().split(",")) : new ArrayList<>();
                    if (views != null && views.size() > 0) {
                        viewAuthors.addAll(views);
                    }

                    List<String> manages = org.springframework.util.StringUtils.hasText(author.getDepartmentManage().trim()) ? Arrays.asList(author.getDepartmentManage().trim().split(",")) : new ArrayList<>();
                    if (manages != null && manages.size() > 0) {
                        manageAuthors.addAll(manages);
                    }
                }

                List<String> AllAuths = new ArrayList<>();
                AllAuths.addAll(viewAuthors);
                AllAuths.addAll(manageAuthors);
                AllAuths = AllAuths.stream().distinct().collect(Collectors.toList());
                //endregion

                //获取该部门下的所有子级部门ID
                List<Integer> childDepartmentIds = new ArrayList<>();
                List<SmartDepartment> departments = smartDepartmentService.list(null);
                Integer departmentId = sure != null ? sure.getDepartmentId() : null;
                childDepartmentIds.add(departmentId);
                QueryDepartmentTreeRecords(departmentId, departments, childDepartmentIds);

                if (departmentId == null) {
                    childDepartmentIds = null;
                }

                List<Integer> authDepartments = new ArrayList<>();
                for (Integer child : childDepartmentIds) {
                    if (AllAuths.contains(String.valueOf(child))) {
                        authDepartments.add(child);
                    }
                }

                String name = sure != null ? sure.getName() : null;

                List<SmartUser> users = smartUserService.querySmartUsers(authDepartments, name);

                List<String> affiliates = new ArrayList<>();
                List<String> affiliateStr = users.stream().map(SmartUser::getAffiliate).distinct().collect(Collectors.toList());
                for (String datas : affiliateStr) {
                    if (!ObjectUtils.isEmpty(datas)) {
                        String[] dataArray = datas.split(",");
                        for (int i = 0; i < dataArray.length; i++) {
                            affiliates.add(dataArray[i]);
                        }
                    }
                }
                List<SmartUser> affiliateDatas = affiliates != null && affiliates.size() > 0 ? smartUserService.getSmartUserIds(affiliates) : null;

                List<Integer> dutieIds = users != null && users.size() > 0 ? users.stream().map(SmartUser::getDuties).collect(Collectors.toList()) : null;
                //职务数据
                List<SmartDuties> duties = dutieIds != null && dutieIds.size() > 0 ? smartDutiesService.queryDutiesByIds(dutieIds) : null;
                //年级
                List<SmartGrade> grades = smartGradeService.list(null);
                //班级
                List<SmartClass> classes = smartClassService.list(null);
                //导出
                Workbook workbook = new XSSFWorkbook();
                Sheet sheet = workbook.createSheet("用户信息管理");
                Row headerRow = sheet.createRow(0);
                int exportIndex = 1;
                List<String> gauageStrs = sure.getGauageOutfitVos().stream().map(gauageOutfitVo::getName).collect(Collectors.toList());

                headerRow.createCell(0).setCellValue("序号");
                if (gauageStrs.contains("学号")) {
                    headerRow.createCell(exportIndex).setCellValue("学号");
                    exportIndex++;
                }
                if (gauageStrs.contains("姓名")) {
                    headerRow.createCell(exportIndex).setCellValue("姓名");
                    exportIndex++;
                }
                if (gauageStrs.contains("身份")) {
                    headerRow.createCell(exportIndex).setCellValue("身份");
                    exportIndex++;
                }
                if (gauageStrs.contains("职务")) {
                    headerRow.createCell(exportIndex).setCellValue("职务");
                    exportIndex++;
                }
                if (gauageStrs.contains("身份证号")) {
                    headerRow.createCell(exportIndex).setCellValue("身份证号");
                    exportIndex++;
                }
                if (gauageStrs.contains("性别")) {
                    headerRow.createCell(exportIndex).setCellValue("性别");
                    exportIndex++;
                }
                if (gauageStrs.contains("部门")) {
                    headerRow.createCell(exportIndex).setCellValue("部门");
                    exportIndex++;
                }
                if (gauageStrs.contains("人脸照片")) {
                    headerRow.createCell(exportIndex).setCellValue("人脸照片");
                    exportIndex++;
                }
                if (gauageStrs.contains("年级")) {
                    headerRow.createCell(exportIndex).setCellValue("年级");
                    exportIndex++;
                }
                if (gauageStrs.contains("班级")) {
                    headerRow.createCell(exportIndex).setCellValue("班级");
                    exportIndex++;
                }
                if (gauageStrs.contains("时间组")) {
                    headerRow.createCell(exportIndex).setCellValue("时间组");
                    exportIndex++;
                }
                if (gauageStrs.contains("学院")) {
                    headerRow.createCell(exportIndex).setCellValue("学院");
                    exportIndex++;
                }
                if (gauageStrs.contains("专业")) {
                    headerRow.createCell(exportIndex).setCellValue("专业");
                    exportIndex++;
                }
                if (gauageStrs.contains("校区")) {
                    headerRow.createCell(exportIndex).setCellValue("校区");
                    exportIndex++;
                }
                if (gauageStrs.contains("宿舍号")) {
                    headerRow.createCell(exportIndex).setCellValue("宿舍号");
                    exportIndex++;
                }
                if (gauageStrs.contains("手机号")) {
                    headerRow.createCell(exportIndex).setCellValue("手机号");
                    exportIndex++;
                }
                if (gauageStrs.contains("关联人")) {
                    headerRow.createCell(exportIndex).setCellValue("关联人");
                    exportIndex++;
                }
                if (gauageStrs.contains("职称")) {
                    headerRow.createCell(exportIndex).setCellValue("职称");
                    exportIndex++;
                }
                if (gauageStrs.contains("家庭住址")) {
                    headerRow.createCell(exportIndex).setCellValue("家庭住址");
                    exportIndex++;
                }
                if (gauageStrs.contains("民族")) {
                    headerRow.createCell(exportIndex).setCellValue("民族");
                    exportIndex++;
                }
                if (gauageStrs.contains("生源地")) {
                    headerRow.createCell(exportIndex).setCellValue("生源地");
                    exportIndex++;
                }
                if (gauageStrs.contains("毕业学院")) {
                    headerRow.createCell(exportIndex).setCellValue("毕业学院");
                    exportIndex++;
                }


                List<SmartTimeGroup> timeGroups = new ArrayList<>();
                if (gauageStrs.contains("时间组")) {
                    timeGroups = smartTimeGroupService.list(null);
                }

                for (int i = 0; i < users.size(); i++) {
                    int valueIndex = 1;
                    SmartUser user = users.get(i);

                    Row dataRow = sheet.createRow(i + 1);
                    dataRow.createCell(0).setCellValue(i + 1);//序号
                    if (gauageStrs.contains("学号")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getCardNo());//学号
                        valueIndex++;
                    }
                    if (gauageStrs.contains("姓名")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getName());//姓名
                        valueIndex++;
                    }
                    if (gauageStrs.contains("身份")) {
                        dataRow.createCell(valueIndex).setCellValue(eIdentityStatu.stringOf(user.getIdentityId()));//身份
                        valueIndex++;
                    }
                    if (gauageStrs.contains("职务")) {
                        String dutieStr = "";
                        if (duties != null && duties.size() > 0 && user.getDuties() != null) {
                            Optional<SmartDuties> oduty = duties.stream().filter(e -> e.getId().equals(user.getDuties())).findFirst();
                            if (oduty != null && oduty.isPresent()) {
                                dutieStr = oduty.get().getName();
                            }
                        }
                        dataRow.createCell(valueIndex).setCellValue(dutieStr);//职务

                        valueIndex++;
                    }
                    if (gauageStrs.contains("身份证号")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getIdCard());//身份证号
                        valueIndex++;
                    }
                    if (gauageStrs.contains("性别")) {
                        dataRow.createCell(valueIndex).setCellValue(eSexStatu.stringOf(user.getSexId()));//性别
                        valueIndex++;
                    }
                    if (gauageStrs.contains("部门")) {
                        //获取父级部门ID
                        Optional<SmartDepartment> department = departments.stream().filter(e -> e.getId().equals(user.getDepartmentId())).findFirst();
                        if (department != null && department.isPresent()) {
                            dataRow.createCell(valueIndex).setCellValue(QueryParentDepartments(department.get().getParentId(), departments, null));//部门
                        }
                        valueIndex++;
                    }
                    if (gauageStrs.contains("人脸照片")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getHeadImage() == null ? "" : user.getHeadImage());//人脸
                        valueIndex++;
                    }
                    if (gauageStrs.contains("年级")) {
                        String grade = "";
                        Optional<SmartGrade> gradeData = grades == null ? null : grades.stream().filter(e -> e.getId().toString().equals(user.getGrade())).findFirst();
                        if (gradeData != null && gradeData.isPresent()) {
                            grade = gradeData.get().getName();
                        }
                        dataRow.createCell(valueIndex).setCellValue(grade);//年级
                        valueIndex++;
                    }
                    if (gauageStrs.contains("班级")) {
                        String classStr = "";
                        Optional<SmartClass> classData = classes == null ? null : classes.stream().filter(e -> e.getId().equals(user.getSchoolClass())).findFirst();
                        if (classData != null && classData.isPresent()) {
                            classStr = classData.get().getName();
                        }
                        dataRow.createCell(valueIndex).setCellValue(classStr);//班级
                        valueIndex++;
                    }
                    if (gauageStrs.contains("时间组")) {
                        Optional<SmartTimeGroup> oTime = timeGroups != null && timeGroups.size() > 0 && user.getTimeGroupId() != null ? timeGroups.stream().filter(e -> e.getId().equals(user.getTimeGroupId())).findFirst() : null;
                        String timeStr = "";
                        if (oTime != null && oTime.isPresent()) {
                            timeStr = oTime.get().getName();
                        }
                        dataRow.createCell(valueIndex).setCellValue(timeStr);//时间组
                        valueIndex++;
                    }
                    if (gauageStrs.contains("学院")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getCollege() == null ? "" : user.getCollege());//学院
                        valueIndex++;
                    }
                    if (gauageStrs.contains("专业")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getSpeciality() == null ? "" : user.getSpeciality());//专业
                        valueIndex++;
                    }
                    if (gauageStrs.contains("校区")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getCampus() == null ? "" : user.getCampus());//校区
                        valueIndex++;
                    }
                    if (gauageStrs.contains("宿舍号")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getDormitoryNumber() == null ? "" : user.getDormitoryNumber());//宿舍号
                        valueIndex++;
                    }
                    if (gauageStrs.contains("手机号")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getPhone() == null ? "" : user.getPhone());//手机号
                        valueIndex++;
                    }
                    if (gauageStrs.contains("关联人")) {
                        List<String> affiliateCellStrs = new ArrayList<>();
                        if (user.getAffiliate() != null && affiliateDatas != null) {
                            String[] affArrayStr = user.getAffiliate().split(",");
                            for (int j = 0; j < affArrayStr.length; j++) {
                                String affArrayIndex = affArrayStr[j];
                                Optional<SmartUser> affUser = affiliateDatas.stream().filter(e -> e.getId().toString().equals(affArrayIndex)).findFirst();
                                if (affUser != null && affUser.isPresent()) {
                                    affiliateCellStrs.add(affUser.get().getName());
                                }

                            }
                        }
                        dataRow.createCell(valueIndex).setCellValue(StringUtils.join(affiliateCellStrs, ","));//关联人
                        valueIndex++;
                    }
                    if (gauageStrs.contains("职称")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getTitle() == null ? "" : user.getTitle());//职称
                        valueIndex++;
                    }
                    if (gauageStrs.contains("家庭住址")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getAddress() == null ? "" : user.getAddress());//家庭住址
                        valueIndex++;
                    }
                    if (gauageStrs.contains("民族")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getNation() == null ? "" : user.getNation());//民族
                        valueIndex++;
                    }
                    if (gauageStrs.contains("生源地")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getOfStudent() == null ? "" : user.getOfStudent());//生源地
                        valueIndex++;
                    }
                    if (gauageStrs.contains("毕业学院")) {
                        dataRow.createCell(valueIndex).setCellValue(user.getGraduate() == null ? "" : user.getGraduate());//毕业学校
                        valueIndex++;
                    }
                }

                // 将工作簿写入文件
                ExcelUtils.excelDownload(workbook, "用户信息.xlsx", response);
            }
        }
        return CommonResult.ok("导出成功");
    }
    //endregion

    //region 根据父级ID获取树形数据

    /**
     * 根据父级ID获取树形数据
     *
     * @param parentID 父级ID
     * @param lists    数据集合
     * @return
     */
    private List<DepartmentTreeVo> QueryDepartmentTreeRecords
    (Integer
             parentID, List<SmartDepartment> lists, List<Integer> departmentIds) {
        List<DepartmentTreeVo> newTrees = new ArrayList<>();

        List<SmartDepartment> datas = lists.stream().filter(e -> e.getParentId().equals(parentID)).collect(Collectors.toList());

        for (SmartDepartment data : datas) {
            departmentIds.add(data.getId());
            QueryDepartmentTreeRecords(data.getId(), lists, departmentIds);
        }

        return newTrees;
    }
    //endregion

    //region 根据父级ID往上查找父级数据

    /**
     * 根据父级ID获取父级数据
     *
     * @param parentID 子级ID
     * @param lists    数据集合
     * @return
     */
    private String QueryParentDepartments
    (Integer
             parentID, List<SmartDepartment> lists, String
             departmentStr) {

        Optional<SmartDepartment> data = lists.stream().filter(e -> e.getId().equals(parentID)).findFirst();

        if (data != null && data.isPresent()) {
            departmentStr = departmentStr == null ? data.get().getName() : data.get().getName() + "/" + departmentStr;
            departmentStr = QueryParentDepartments(data.get().getParentId(), lists, departmentStr);
        }

        return departmentStr;
    }
    //endregion

    //region 根据数据ID删除用户数据（旧的）
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult deleteSmartUserByIdOld
    (useridsRequest ur, BindingResult
            bindingResult) throws Exception {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        List<SmartUser> users = smartUserService.getSmartUserByIds(ur.getUserIds());
        if (users.size() != ur.getUserIds().size()) {
            return CommonResult.fail("存在无效用户数据，删除失败！");
        }

        SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        for (SmartUser user : users) {
            if (user.getIdentityId().intValue() == eIdentityStatu.Parent.getValue()) {
                List<String> studentIds = Arrays.asList(user.getAffiliate().split(","));
                List<SmartUser> studentDatas = smartUserService.getSmartUserIds(studentIds);

                //region 删除原有的家长关系
                CommonResult deleteResult = deleteOldParentShip(seewoClient, studentDatas, user.getPhone());
                if (!deleteResult.isSuccess()) {
                    return CommonResult.fail(deleteResult.getMessage());
                }
                //endregion

            } else if (user.getIdentityId().intValue() == eIdentityStatu.Student.getValue()) {
                //查找家长
                List<SmartUser> parents = smartUserService.getAffiliateList(user.getId());

                //获取班级Uid
                SmartClass classData = smartClassService.getSmartClassById(user.getSchoolClass());
                if (classData == null) {
                    return CommonResult.fail("班级数据无效，更新失败");
                }
                //region 百胜删除学生
                CommonResult deleteBsStudent = bsDeleteStudent(user);
                if (!deleteBsStudent.isSuccess()) {
                    return CommonResult.fail(deleteBsStudent.getMessage());
                }
                //endregion

                //region 希沃删除学生
                CommonResult deleteStudent = SeewoDeleteStudent(seewoClient, classData.getClassUid(), user.getCardNo());
                if (!deleteStudent.isSuccess()) {
                    return CommonResult.fail(deleteStudent.getMessage());
                }
                //endregion

                if (parents != null) {
                    //region 删除原有的家长关系
                    CommonResult deleteResult = deleteOldStudentParentShip(seewoClient, user.getCardNo(), parents.stream().map(SmartUser::getPhone).collect(Collectors.toList()));
                    if (!deleteResult.isSuccess()) {
                        return CommonResult.fail(deleteResult.getMessage());
                    }
                    //endregion
                }

            } else if (user.getIdentityId().intValue() == eIdentityStatu.Teacher.getValue()) {


                //region 希沃删除教师
                CommonResult deleteTeacher = SeewoDeleteTeacher(seewoClient, user.getPhone());
                if (!deleteTeacher.isSuccess()) {
                    return CommonResult.fail(deleteTeacher.getMessage());
                }
                //endregion

                if (user.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                    if (user.getSchoolClass() == null) {
                        return CommonResult.fail("班级数据无效，删除失败");
                    }
                    //获取班级Uid
                    SmartClass classData = smartClassService.getSmartClassById(user.getSchoolClass());
                    if (classData == null) {
                        return CommonResult.fail("班级数据无效，删除失败");
                    }
                    //region 希沃删除班主任
                    if (user.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                        CommonResult deleteTeacherMaster = SeewoDeleteTeacherMaster(seewoClient, classData.getClassUid(), user.getPhone());
                        if (deleteTeacherMaster.isSuccess()) {
                            return CommonResult.fail(deleteTeacherMaster.getMessage());
                        }
                    }
                    //endregion
                }


                //region 百胜删除教师
                CommonResult bsDeleteTeacher = bsDeleteTeacher(user.getBsStaffCode());
                if (!bsDeleteTeacher.isSuccess()) {
                    return CommonResult.fail(bsDeleteTeacher.getMessage());
                }
                //endregion
            }

        }

        int result = smartUserService.deleteSmartUserByIds(ur.getUserIds());
        if (result > 0) {
            smartTeachingService.deleteByUserIds(ur.getUserIds());
        }

        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
    }
    //endregion

    //region 根据数据ID删除用户数据
    @Override
    public CommonResult deleteSmartUserById
    (useridsRequest ur, BindingResult
            bindingResult) throws Exception {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        List<SmartUser> users = smartUserService.getSmartUserByIds(ur.getUserIds());
        if (users.size() != ur.getUserIds().size()) {
            return CommonResult.fail("存在无效用户数据，删除失败！");
        }

        //先删除咱自己数据库里的用户数据
        int result = smartUserService.deleteSmartUserByIds(ur.getUserIds());
        if (result <= 0) {
            return CommonResult.fail("删除失败");
        } else {
//            删除同步到海康平台
            for (SmartUser user : users) {
                Integer identityId = user.getIdentityId();
                if (2 == identityId || identityId == 3) {
                    Integer id = user.getId();
                    SmartOperationUser smartOperationUser = new SmartOperationUser();
                    smartOperationUser.setOperationId(id);
                    smartOperationUser.setOperationMode("3");
                    smartOperationUser.setStatus(1);
                    smartOperationUser.setType(identityId);
                    smartOperationUserService.save(smartOperationUser);
                }
            }
        }

        List<deleteUserVo> deleteUsers = new ArrayList<>();
        SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        for (SmartUser user : users) {
            deleteUserVo deleteUser = new deleteUserVo();
            deleteUser.setId(user.getId());
            if (user.getIdentityId().intValue() == eIdentityStatu.Parent.getValue()) {
                List<String> studentIds = Arrays.asList(user.getAffiliate().split(","));
                List<SmartUser> studentDatas = smartUserService.getSmartUserIds(studentIds);

                //region 删除原有的家长关系
                CommonResult deleteResult = deleteOldParentShip(seewoClient, studentDatas, user.getPhone());
                if (!deleteResult.isSuccess()) {
                    String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "希沃删除家长关系失败：" + deleteResult.getMessage() + "；";
                    deleteUser.setReason(reason);
                    //return CommonResult.fail(deleteResult.getMessage());
                }
                //endregion

                //删除家长 根据家长手机号删除下标数据
                smartFamilyIndexService.deleteSmartFamilyByPhone(user.getPhone());

            } else if (user.getIdentityId().intValue() == eIdentityStatu.Student.getValue()) {
                //查找家长
                List<SmartUser> parents = smartUserService.getAffiliateList(user.getId());

                //获取班级Uid
                SmartClass classData = smartClassService.getSmartClassById(user.getSchoolClass());
                if (classData == null) {
                    String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "班级数据无效，百胜删除学生失败；";
                    deleteUser.setReason(reason);
                    //return CommonResult.fail("班级数据无效，更新失败");
                }
                //region 百胜删除学生
                CommonResult deleteBsStudent = bsDeleteStudent(user);
                if (!deleteBsStudent.isSuccess()) {
                    String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "百胜删除学生失败；" + deleteBsStudent.getMessage() + "；";

                    deleteUser.setReason(reason);
                    //return CommonResult.fail(deleteBsStudent.getMessage());
                }
                //endregion

                //region 希沃删除学生
                CommonResult deleteStudent = SeewoDeleteStudent(seewoClient, classData.getClassUid(), user.getCardNo());
                if (!deleteStudent.isSuccess()) {
                    String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "希沃删除学生失败；" + deleteStudent.getMessage() + "；";
                    ;
                    deleteUser.setReason(reason);
                    //return CommonResult.fail(deleteStudent.getMessage());
                }
                //endregion

                if (parents != null) {
                    //region 删除原有的家长关系
                    CommonResult deleteResult = deleteOldStudentParentShip(seewoClient, user.getCardNo(), parents.stream().map(SmartUser::getPhone).collect(Collectors.toList()));
                    if (!deleteResult.isSuccess()) {
                        String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "希沃删除家长关系失败；" + deleteResult.getMessage() + "；";
                        ;
                        deleteUser.setReason(reason);
                        //return CommonResult.fail(deleteResult.getMessage());
                    }
                    //endregion

                    //删除学生 根据学生学号删除下标数据
                    smartFamilyIndexService.deleteSmartFamilyByCardNo(user.getCardNo());
                }

            } else if (user.getIdentityId().intValue() == eIdentityStatu.Teacher.getValue()) {

                if (user.getDuties().intValue() == eDuties.ClassTeacher.getValue()) {
                    if (user.getSchoolClass() == null) {
                        String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "班级数据无效，希沃删除班主任失败；";
                        deleteUser.setReason(reason);
                    } else {
                        //获取班级Uid
                        SmartClass classData = smartClassService.getSmartClassById(user.getSchoolClass());
                        if (classData == null) {
                            String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "班级数据无效，希沃删除教师失败；";
                            deleteUser.setReason(reason);
                            //return CommonResult.fail("班级数据无效，更新失败");
                        }
                        //region 希沃删除班主任
                        CommonResult deleteTeacherMaster = SeewoDeleteTeacherMaster(seewoClient, classData.getClassUid(), user.getPhone());
                        if (!deleteTeacherMaster.isSuccess()) {
                            String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "希沃删除班主任失败；" + deleteTeacherMaster.getMessage() + "；";
                            deleteUser.setReason(reason);
                            //return CommonResult.fail(deleteTeacherMaster.getMessage());
                        }
                        //endregion
                    }

                }

                //region 希沃删除教师
                CommonResult deleteTeacher = SeewoDeleteTeacher(seewoClient, user.getPhone());
                if (!deleteTeacher.isSuccess()) {
                    String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "百胜删除老师失败；" + deleteTeacher.getMessage() + "；";
                    deleteUser.setReason(reason);
                    //return CommonResult.fail(deleteTeacher.getMessage());
                }
                //endregion


                //region 百胜删除教师
                CommonResult bsDeleteTeacher = bsDeleteTeacher(user.getBsStaffCode());
                if (!bsDeleteTeacher.isSuccess()) {
                    String reason = (deleteUser.getReason() == null ? "" : deleteUser.getReason()) + "百胜删除老师失败；" + bsDeleteTeacher.getMessage() + "；";
                    deleteUser.setReason(reason);
                    //return CommonResult.fail(bsDeleteTeacher.getMessage());
                }
                //endregion
            }
            if (deleteUser.getReason() != null) {
                deleteUsers.add(deleteUser);
            }

        }

        if (deleteUsers != null && deleteUsers.size() > 0) {
            int deleteUser = smartUserService.deleteUserBatch(deleteUsers);
            if (deleteUser > 0) {
                List<SmartAuthorGroup> allDatas = new ArrayList<>();//要被更新的权限组数据
                List<Integer> deleteGroupId = new ArrayList<>();//要被删除的权限组
                List<Integer> deleteUserId = new ArrayList<>();//要被删除的管理组权限
                for (deleteUserVo dUser : deleteUsers) {
                    deleteUserId.add(dUser.getId());
                    List<SmartAuthorGroup> authGroups = smartAuthorGroupService.smartAuthorGroup(dUser.getId());
                    for (SmartAuthorGroup authGroup : authGroups) {
                        List<String> newUserId = new ArrayList<>();
                        List<String> userIds = Arrays.asList(authGroup.getUserId().split(","));
                        for (String userId : userIds) {
                            if (!userId.equals(String.valueOf(dUser.getId()))) {
                                newUserId.add(userId);
                            }
                        }
                        if (newUserId != null && newUserId.size() > 0) {
                            authGroup.setUserId(StringUtils.join(newUserId, ","));
                            allDatas.add(authGroup);
                        } else {
                            deleteGroupId.add(authGroup.getId());
                        }
                    }
                }

                if (allDatas != null && allDatas.size() > 0) {//更新权限组
                    smartAuthorGroupService.saveBatch(allDatas);
                }
                if (deleteGroupId != null && deleteGroupId.size() > 0) {//删除权限组
                    smartAuthorGroupService.deleteSmartAuthorGroupByIds(deleteGroupId);
                }
                if (deleteUserId != null && deleteUserId.size() > 0) {//删除管理组权限
                    smartAuthorityService.deleteAuthorityByUserIds(deleteUserId);
                }
            } else {
                return CommonResult.fail("删除失败");
            }


        }

        return CommonResult.ok("删除成功");

    }
    //endregion

    //region 根据当前用户ID获取受访学生数据
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult queryAffiliateUserById
    (int id) {
        List<AffiliateUserVo> result = smartUserService.queryAffiliateUserById(id);

        if (result != null && result.size() > 0) {
            List<SmartDepartment> departments = smartDepartmentService.list(null);
            for (AffiliateUserVo data : result) {
                //获取父级部门ID
                Optional<SmartDepartment> department = departments.stream().filter(e -> e.getId().equals(data.getDepartmentId())).findFirst();
                if (department != null && department.isPresent()) {
                    String departmentName = QueryParentDepartments(department.get().getParentId(), departments, null);
                    data.setDepartmentName(departmentName);
                }
            }
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region 导出人员Excel模板
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult downloadUserExcel
    () {
        return CommonResult.ok("200", "操作成功", "https://wanzai-1306339220.cos.ap-shanghai.myqcloud.com/excelModel/人员信息表.xlsx");
    }
    //endregion

    //region 导出教师模板
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult downloadTeacherExcel
    () {
        return CommonResult.ok("200", "操作成功", "https://wanzai-1306339220.cos.ap-shanghai.myqcloud.com/excelModel/教师信息表.xlsx");
    }
    //endregion

    //region 导出更新人员Excel模板
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult downloadUpdateUserExcel
    () {
        return CommonResult.ok("200", "操作成功", "https://wanzai-1306339220.cos.ap-shanghai.myqcloud.com/excelModel/更新信息表.xlsx");
    }
    //endregion

    //region 根据用户ID查询学生
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult queryStudents(
            int userId) {

        List<SmartUser> students = new ArrayList<>();
        SmartUser user = smartUserService.getSmartById(userId);
        if (user == null) {
            return CommonResult.fail("用户信息为空，获取学生列表数据失败");
        }

        if (user.getAffiliate() == null) {
            return CommonResult.ok(students);
        }

        List<Integer> affiliateIds = new ArrayList<>();
        List<String> affiliates = Arrays.asList(user.getAffiliate().split(","));
        for (String affiliate : affiliates) {
            affiliateIds.add(Integer.valueOf(affiliate));
        }

        students = smartUserService.getSmartUserByIds(affiliateIds);

        List<ParentOfStudentsVo> result = new ArrayList<>();
        for (SmartUser student : students) {
            ParentOfStudentsVo data = new ParentOfStudentsVo();
            data.setId(student.getId());
            data.setName(student.getName());
            data.setCardNo(student.getCardNo());
            data.setDepartmentId(student.getDepartmentId());
            result.add(data);
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region 根据数据ID获取用户信息
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult queryInfoData(
            int id) {

        SmartUser su = smartUserService.getSmartById(id);
        if (su == null) {
            return CommonResult.fail("用户信息失效，获取用户信息失败");
        }

        //部门数据集合
        List<SmartDepartment> departments = smartDepartmentService.list(null);
        //年级数据
        List<SmartGrade> grades = smartGradeService.list(null);

        WechatUserVo userData = new WechatUserVo();
        userData.setId(su.getId());
        userData.setCardNo(su.getCardNo());
        userData.setTimeGroupId(su.getTimeGroupId());
        userData.setName(su.getName());
        userData.setIdentityId(su.getIdentityId());
        userData.setIdCard(su.getIdCard());
        userData.setSexId(su.getSexId());
        userData.setDepartmentId(su.getDepartmentId());

        Optional<SmartDepartment> department = departments.stream().filter(e -> e.getId().equals(su.getDepartmentId())).findFirst();
        if (department != null && department.isPresent()) {
            String departmentName = QueryParentDepartments(department.get().getParentId(), departments, null);
            userData.setDepartmentName(departmentName == null ? "" : departmentName + "/" + department.get().getName());
        }

        userData.setHeadImage(su.getHeadImage());
        if (org.springframework.util.StringUtils.hasText(su.getGrade())) {
            Optional<SmartGrade> oGrade = grades.stream().filter(e -> String.valueOf(e.getId()).equals(su.getGrade())).findFirst();
            if (oGrade != null && oGrade.isPresent()) {
                userData.setGrade(oGrade.get().getName());
            }
        }
        userData.setCollege(su.getCollege());
        userData.setSpeciality(su.getSpeciality());
        userData.setSchoolClass(su.getSchoolClass());
        userData.setCampus(su.getCampus());
        userData.setDormitoryNumber(su.getDormitoryNumber());
        userData.setPhone(su.getPhone());
        userData.setAffiliate(su.getAffiliate());
        //查找关联人
        if (su.getIdentityId().intValue() == eIdentityStatu.Student.getValue()) {//学生
            List<AffiliateParentVo> parents = smartUserService.queryAffiliateParents(su.getId());
            if (parents != null && parents.size() > 0) {
                String affiliateStr = StringUtils.join(parents.stream().map(AffiliateParentVo::getName).collect(Collectors.toList()), ",");
                userData.setAffiliateName(affiliateStr);
            }
        } else if (su.getIdentityId().intValue() == eIdentityStatu.Parent.getValue()) {//家长
            if (su.getAffiliate() != null) {
                List<String> affiliates = Arrays.asList(su.getAffiliate().split(","));
                List<SmartUser> childs = smartUserService.getSmartUserIds(affiliates);
                String affiliateStr = StringUtils.join(childs.stream().map(SmartUser::getName).collect(Collectors.toList()), ",");
                userData.setAffiliateName(affiliateStr);
            }
        }
        //关联人名称用逗号隔开

        userData.setTitle(su.getTitle());
        userData.setAddress(su.getAddress());
        userData.setNation(su.getNation());
        userData.setOfStudent(su.getOfStudent());
        userData.setGraduate(su.getGraduate());
        userData.setDuties(su.getDuties());
        userData.setIsPush(su.getIsPush());
        userData.setIsCancel(su.getIsCancel());
        userData.setOpenId(su.getOpenId());
        userData.setXOpenId(su.getXOpenId());
        userData.setGzhOpenId(su.getGzhOpenId());
        userData.setXwStudentUid(su.getXwStudentUid());
        userData.setBsStudentNo(su.getBsStudentNo());
        userData.setXwTeacherCode(su.getXwTeacherCode());
        userData.setBsStaffCode(su.getBsStaffCode());

        return CommonResult.ok(userData);
    }
    //endregion

    //region 绑定学生
    @Override
    @DESRespondSecret(validated = true)
    public CommonResult bindStudent
    (bindStudentRequest
             bsr, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        SmartUser parentUser = smartUserService.getSmartById(bsr.getUserId());
        if (parentUser == null) {
            return CommonResult.fail("当前用户信息无效，绑定失败！");
        }

        if (parentUser.getIdentityId().intValue() != eIdentityStatu.Parent.getValue()) {
            return CommonResult.fail("当前用户身份无法进行绑定操作");
        }

        //查找是否存在学生数据
        SmartUser studentUser = smartUserService.queryUserInfo(bsr.getName(), bsr.getCardNo(), bsr.getIdCard());
        if (studentUser == null) {
            return CommonResult.fail("当前学生不存在，绑定失败！");
        }


        //判断是否已绑定过
        if (parentUser.getAffiliate() == null) {
            parentUser.setAffiliate(String.valueOf(studentUser.getId()));
        } else {
            List<String> newAffiliates = new ArrayList<>();
            List<String> affiliates = Arrays.asList(parentUser.getAffiliate().split(","));
            long existCount = affiliates.stream().filter(e -> e.equals(String.valueOf(studentUser.getId()))).count();
            if (existCount > 0) {
                return CommonResult.fail("当前学生信息已绑定过，请勿重复操作！");
            }

            parentUser.setAffiliate(parentUser.getAffiliate() + "," + studentUser.getId());
        }

        List<SmartFamilyIndex> indexs = smartFamilyIndexService.querySmartFamilyByCardNo(studentUser.getCardNo());
        if (indexs != null && indexs.size() >= 4) {
            return CommonResult.fail("绑定失败，希沃学生家长最多绑定四个家长");
        }

        int index = 0;
        if (indexs != null) {
            for (SmartFamilyIndex data : indexs) {
                if (data.getIndexData().intValue() == index && index < 3) {
                    index++;
                    continue;
                } else {
                    break;
                }
            }
        }

        //region 新增希沃学生家长信息
        //初始化客户端
        SeewoClient seewoClient = new DefaultSeewoClient(new Account(seewoConfig.getAppId(), seewoConfig.getAppSecret()));
        ParentServiceBatchSaveOrUpdateParentsParam param = new ParentServiceBatchSaveOrUpdateParentsParam();
        //响应体，MimeType为 application/json
        ParentServiceBatchSaveOrUpdateParentsParam.RequestBody requestBody = ParentServiceBatchSaveOrUpdateParentsParam.RequestBody.builder()
                .build();
        param.setRequestBody(requestBody);
        //query
        ParentServiceBatchSaveOrUpdateParentsParam.Query query = ParentServiceBatchSaveOrUpdateParentsParam.Query.builder()
                .appId(seewoConfig.getAppId())
                .schoolUid(seewoConfig.getSchoolId())
                .build();
        requestBody.setQuery(query);
        //学生与家长列表，最大100条
        ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem studentParents = ParentServiceBatchSaveOrUpdateParentsParam.StudentParentsItem.builder()
                .studentCode(studentUser.getCardNo())
                .build();
        query.setStudentParents(java.util.Collections.singletonList(studentParents));
        //家长列表，最多4个
        ParentServiceBatchSaveOrUpdateParentsParam.ParentsItem parents = ParentServiceBatchSaveOrUpdateParentsParam.ParentsItem.builder()
                .name(parentUser.getName())
                .phone(parentUser.getPhone())
                .index(index)
                .build();
        studentParents.setParents(java.util.Collections.singletonList(parents));
        param.setRequestBody(requestBody);
        ParentServiceBatchSaveOrUpdateParentsRequest request = new ParentServiceBatchSaveOrUpdateParentsRequest(param);
        logger.info("入参：" + request);
        //如果想要调用沙箱环境，请通过设置 request 对象的 serverUrl 属性，如：
        //request.setServerUrl("https://openapi.test.seewo.com")
        //执行请求，如果想获取到com.seewo.open.sdk.HttpResponse对象，请调用 seewoClient.execute 方法
        ParentServiceBatchSaveOrUpdateParentsResult result = seewoClient.invoke(request);
        logger.info("出参：" + result);

        if (result == null) {
            return CommonResult.fail("希沃学生家长数据添加失败！");
        }

        if (!result.getResponseBody().getCode().equals("000000")) {
            return CommonResult.fail(result.getResponseBody().getMessage());
        }
        //endregion

        int updateResult = smartUserService.updateSmartUser(parentUser);

        return updateResult > 0 ? CommonResult.ok("绑定成功") : CommonResult.fail("绑定失败");
    }
    //endregion

    //region 根据数据ID获取用户信息
    @Override
    public CommonResult queryUserData(
            int id) {
        SmartUserVo user = smartUserService.querySmartUserById(id);

        return CommonResult.ok(user);
    }
    //endregion

    //region 删除记录的分页数据
    @Override
    public CommonResult queryUserDeletePage
    (int currentPage, int pageCount) {
        PageUtils<UserDeleteVo> result = smartUserService.queryUserDeletePage(currentPage, pageCount);

        List<SmartDepartment> departments = smartDepartmentService.list(null);
        for (UserDeleteVo data : result.getList()) {
            data.setIdentityStr(eIdentityStatu.stringOf(data.getIdentityId()));//身份
            //获取父级部门ID
            Optional<SmartDepartment> department = departments.stream().filter(e -> e.getId().equals(data.getDepartmentId())).findFirst();
            if (department != null && department.isPresent()) {
                String departmentName = QueryParentDepartments(department.get().getParentId(), departments, null);
                data.setDepartmentStr(departmentName);
            }
        }

        return CommonResult.ok(result);
    }
    //endregion

    //region 获取班级下的学生
    @Override
    public CommonResult queryClassUser(
            int userId, String keyWord) {
        SmartUser userData = smartUserService.getSmartById(userId);
        if (userData == null) {
            return CommonResult.fail("未查到用户信息，获取失败");
        }

        if (userData.getSchoolClass() == null) {
            return CommonResult.fail("当前用户所在班级为空，获取失败");
        }

        SmartClass classData = smartClassService.getSmartClassById(userData.getSchoolClass());
        if (classData == null) {
            return CommonResult.fail("班级数据为空，获取失败");
        }

        List<SmartDepartment> departments = smartDepartmentService.list(null);
        if (departments == null) {
            return CommonResult.fail("部门数据为空，获取失败");
        }

        //查找部门名称
        String departmentName = classData.getName().replace("年级", "") + "学生";
        Optional<SmartDepartment> department = departments.stream().filter(e -> e.getName().equals(departmentName)).findFirst();
        if (!(department != null && department.isPresent())) {
            return CommonResult.fail("部门数据为空，获取失败");
        }


        String departmentStr = QueryParentDepartments(department.get().getParentId(), departments, null);

        ClassUserVo result = new ClassUserVo();
        result.setClassId(userData.getSchoolClass());
        result.setName(departmentStr);
        List<ClassUserDetailVo> userDetails = new ArrayList<>();
        //region 用户明细集合数据
        List<SmartUser> users = smartUserService.queryUsersByClass(userData.getSchoolClass());
        if (users != null && users.size() > 0) {
            List<SmartTimeGroup> timeGroups = smartTimeGroupService.list(null);
            for (SmartUser user : users) {
                ClassUserDetailVo userDetail = new ClassUserDetailVo();
                userDetail.setId(user.getId());
                userDetail.setName(user.getName());
                userDetail.setCardNo(user.getCardNo());
                Optional<SmartTimeGroup> timeGroup = timeGroups.stream().filter(e -> e.getId().equals(user.getTimeGroupId())).findFirst();
                if (timeGroup != null && timeGroup.isPresent()) {
                    userDetail.setTimeGroup(timeGroup.get().getName());
                }
                userDetails.add(userDetail);
            }

            if (!ObjectUtils.isEmpty(keyWord)) {
                userDetails = userDetails.stream().filter(e -> (e.getName() != null && e.getName().contains(keyWord)) || (e.getTimeGroup() != null && e.getTimeGroup().contains(keyWord))).collect(Collectors.toList());
            }

        }
        //endregion


        result.setUserDetails(userDetails);

        return CommonResult.ok(result);
    }
    //endregion

    //region 批量设置学生时间组
    @Override
    public CommonResult setUserTimeGroup
    (setUserTimeGroupRequest
             isur, BindingResult bindingResult) throws
            Exception {
        if (bindingResult.hasErrors()) {
            String st = paramUtils.getParamError(bindingResult);
            return CommonResult.fail(st);
        }

        logger.info("批量设置时间组1" + TimeExchange.getDateMillS());

        SmartTimeGroup timeGroup = smartTimeGroupService.queryTimeGroupById(isur.getTimeGroupId());
        if (timeGroup == null) {
            return CommonResult.fail("时间组数据无效，批量同步时间组失败！");
        }

        logger.info("批量设置时间组2" + TimeExchange.getDateMillS());
        //region 批量更新百胜学生的时间组
        List<SmartUser> users = smartUserService.getSmartUserByIds(isur.getIds());
        if (users == null) {
            return CommonResult.fail("用户数据无效，批量同步时间组失败！");
        }
        logger.info("批量设置时间组3" + TimeExchange.getDateMillS());
        List<SmartGrade> grades = smartGradeService.list(null);
        List<SmartClass> classes = smartClassService.list(null);
        logger.info("批量设置时间组4" + TimeExchange.getDateMillS());

        for (SmartUser user : users) {
            user.setTimeGroupId(isur.getTimeGroupId());
            Optional<SmartGrade> oGrade = grades.stream().filter(e -> e.getId().equals(Integer.valueOf(user.getGrade()))).findFirst();
            if (!(oGrade != null && oGrade.isPresent())) {
                return CommonResult.fail("年级数据无效，批量同步时间组失败！");
            }

            Optional<SmartClass> oClass = classes.stream().filter(e -> e.getId().equals(user.getSchoolClass())).findFirst();
            if (!(oClass != null && oClass.isPresent())) {
                return CommonResult.fail("班级数据无效，批量同步时间组失败！");
            }

            // 开始时间
            long stime = System.currentTimeMillis();


            logger.info("开始循环调用百胜一次：" + TimeExchange.getDateMillS());
            /**
             * 学生数据的有效期是到毕业年份的8月31日
             */
            String startTime = TimeExchange.DateToString(new Date(), "yyyy-MM-dd HH:mm:ss");
            String endTime = queryGraduationYear(oGrade.get().getGradeNo());
            CommonResult<String> updateBsStudent = bsTUpdateStudent(user, oClass.get().getBsClassNo(), startTime, endTime);
            if (!updateBsStudent.isSuccess()) {
                return CommonResult.fail(updateBsStudent.getMessage());
            }
            // 结束时间
            long etime = System.currentTimeMillis();
            // 计算执行时间
            logger.info("结束循环调用百胜一次，执行时长：%d 毫秒.", (etime - stime));
            //endregion
        }

        logger.info("循环结束：" + TimeExchange.getDateMillS());
        //region 批量更新学生数据
        boolean updateBatch = smartUserService.updateUserBatchById(users);

        logger.info("存储结束：" + TimeExchange.getDateMillS());

        return updateBatch ? CommonResult.ok("批量同步成功") : CommonResult.fail("批量同步失败");
    }


    @Override
    @DESRespondSecret(validated = true)
    @PassToken
    public CommonResult getPhoneUser
            (String phone) {

        if (ObjectUtils.isEmpty(phone)) {
            return CommonResult.fail("参数异常");
        }
//        通过手机号找到对应用户
        SmartUser smartUser = smartUserService.getPhoneUser(phone);

        return CommonResult.ok(smartUser);
    }


    @Override
    @DESRespondSecret(validated = true)
    @PassToken
    public CommonResult getPhoneAffiliate(String phone) {
        if (ObjectUtils.isEmpty(phone)) {
            return CommonResult.fail("参数异常");
        }

        SmartUser smartUser = smartUserService.getPhoneUser(phone);

//        用户id，多个就用逗号隔开
        String affiliate = smartUser.getAffiliate();
        if (ObjectUtils.isEmpty(affiliate)) {
            return CommonResult.fail("未关联学生");
        }

//        通过关联人找到对应用户
        List<SmartUserAffiliateVo> smartUsers = smartUserService.getAffiliateUser(affiliate);


        return CommonResult.ok(smartUsers);
    }

    //endregion

    //region 查询时间组编号
    public String eGroupTime(Integer id) {
        SmartTimeGroup result = smartTimeGroupService.queryTimeGroupById(id);
        return result == null ? "" : result.getBsno();
    }
    //endregion

    //region 查询时间组ID
    public Integer eGroupTime(String name) {
        SmartTimeGroup result = smartTimeGroupService.queryTimeGroupByName(name);
        return result == null ? 0 : result.getId();
    }
    //endregion

    //region 根据年级查询毕业年份

    /**
     * 根据年级查询毕业年份
     *
     * @return
     */
    public String queryGraduationYear(
            int grade) {
        String endTime = "";
        int endYear = Year.now().getValue();
        // 获取当前年份
        LocalDate currentDate = LocalDate.now();
        switch (grade) {
            case 7:
                if (currentDate.getMonthValue() < 9) {
                    endYear = endYear + 2;
                } else {
                    endYear = endYear + 3;
                }
                break;
            case 8:
                if (currentDate.getMonthValue() < 9) {
                    endYear = endYear + 1;
                } else {
                    endYear = endYear + 2;
                }
                break;
            case 9:
                break;
            default:
                break;
        }

        endTime = endYear + "-08-31 23:59:59";
        return endTime;
    }
    //endregion

}

