package cn.timer.api.controller.zpgl.sevice;

import cn.timer.api.bean.clazz.SysRegion;
import cn.timer.api.bean.wechat.MessageTemplate;
import cn.timer.api.bean.yggl.YgglMainEmp;
import cn.timer.api.bean.zpgl.*;
import cn.timer.api.bean.zzgl.ZzglBmgwM;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.enuminterface.JxglEnumInterface;
import cn.timer.api.controller.kqgl.ClockInTool;
import cn.timer.api.dto.baidu.*;
import cn.timer.api.bean.clazz.NationClass;
import cn.timer.api.dto.resumesdk.*;
import cn.timer.api.dto.resumesdk.enumresume.ResumeSdk;
import cn.timer.api.dto.template.InterviewNotice;
import cn.timer.api.dto.zpgl.ImportCandidateDto;
import cn.timer.api.dto.zpgl.ZpglRcxxDto;
import cn.timer.api.service.OSSService;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import cn.timer.api.utils.ZpglMessageTemplate;
import cn.timer.api.utils.baidu.BaiduTicUtil;
import cn.timer.api.utils.baidu.Base64;
import cn.timer.api.utils.resumesdk.ResumeSDKUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.transaction.Transactional;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * @author wuqingjun
 * @email 284718418@qq.com
 * @date 2022/3/18
 */
@Slf4j
@Service
@Transactional(rollbackOn = Exception.class)
public class ZpglServiceImpl implements ZpglService {

    @Value("${spring.mail.username}")
    private String username;

    @Autowired
    private BaiduTicUtil baiduTicUtil;
    @Autowired
    private ResumeSDKUtil resumeSDKUtil;

    @Autowired
    private JavaMailSender mailSender;

    @Autowired
    private ZpglMslcLogService zpglMslcLogService;

    @Autowired
    private ZpglWxgzptServiceImpl zpglWxgzptService;

    @Autowired
    private OSSService ossService;

    @Value("${config-8timer.Aliyun.RESUMESDK_APPCODE}")
    private String RESUMESDK_APPCODE;


    @Override
    public boolean updateZpglRcxx(UserBean userBean, ZpglRcxxDto zpglRcxxDto) {
        boolean count = false;
        ZpglRcxx zpglRcxxEntity = ZpglRcxx.builder().id(zpglRcxxDto.getId()).build().selectById();
        if (StringUtils.isEmpty(zpglRcxxEntity)) {
            return count;
        }
        zpglRcxxDto.setName(zpglRcxxEntity.getName());
        ZpglRcxx zpglRcxx = ZpglRcxx.builder().id(zpglRcxxDto.getId()).status(zpglRcxxDto.getStatus()).build();
        ZpglMslcLog zpglMslcLog = new ZpglMslcLog();
        zpglMslcLog.setZpglRcxxId(zpglRcxxDto.getId());
        zpglMslcLog.setUserId(userBean.getEmpNum());
        zpglMslcLog.setUserName(userBean.getQyzxEmpLogin().getUsername());
        if (!StringUtils.isEmpty(zpglRcxxDto.getIfrck()) && zpglRcxxDto.getIfrck().intValue() == 1) {
            zpglRcxx.setIfrckTime(new Date());
        }
        if(!StringUtils.isEmpty(zpglRcxxDto.getCreateTime())){
            zpglRcxx.setCreateTime(zpglRcxxDto.getCreateTime());
        }
        String detail = "";
        // 类型,1状态变更,2面试,3Offer,4讨论,5其他
        int zpglRcxxStatus = 0;
        switch (zpglRcxxDto.getStatus()) {
            case 1:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.CHANGEING.getType();
                //待初筛 填充字段
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.FILTERING, new String[]{
                        userBean.getQyzxEmpLogin().getUsername()});
                break;
            case 2:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.CHANGEING.getType();
                //初筛通过 填充字段
                zpglRcxx.setIfrck(zpglRcxxDto.getIfrck());
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.FILTER_PASS, new String[]{
                        userBean.getQyzxEmpLogin().getUsername()});
                break;
            case 3:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.INTERVIEW.getType();
                //安排面试 填充字段
                zpglRcxx.setInterviewNum(zpglRcxxDto.getInterviewNum());
                zpglRcxx.setInterviewWay(zpglRcxxDto.getInterviewWay());
                zpglRcxx.setInterviewerId(zpglRcxxDto.getInterviewerId());
                zpglRcxx.setInterviewTime(zpglRcxxDto.getInterviewTime());
                zpglRcxx.setNoticeWay(zpglRcxxDto.getNoticeWay());
                YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().select("name").lambda().eq(YgglMainEmp::getEmpNum, zpglRcxxDto.getInterviewerId()));
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.INTERVIEW, new String[]{
                        userBean.getQyzxEmpLogin().getUsername(),
                        zpglRcxxDto.getInterviewNum().toString(),
                        new SimpleDateFormat("yyyy-MM-dd' 'HH:mm:ss").format(zpglRcxxDto.getInterviewTime()),
                        ygglMainEmp.getName()});
                break;
            case 4:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.INTERVIEW.getType();
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.INTERVIEWED, new String[]{
                        userBean.getQyzxEmpLogin().getUsername(), zpglRcxxEntity.getInterviewNum().toString()});
                break;
            case 5:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.INTERVIEW.getType();
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.INTERVIEW_PASS, new String[]{
                        userBean.getQyzxEmpLogin().getUsername()});
                break;
            case 6:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.INTERVIEW.getType();
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.EMPLOY, new String[]{
                        userBean.getQyzxEmpLogin().getUsername()});
                break;
            case 7:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OFFER.getType();
                //发送offer 填充字段
                zpglRcxx.setBmgwId(zpglRcxxDto.getBmgwId());
                zpglRcxx.setJobType(zpglRcxxDto.getJobType());
                zpglRcxx.setYjrzTime(zpglRcxxDto.getYjrzTime());
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.OFFER, new String[]{
                        userBean.getQyzxEmpLogin().getUsername()});
                //发送offer
                ZpglRcxxOffer zpglRcxxOffer = this.insertZpglRcxxOffer(userBean, zpglRcxxDto);
                zpglRcxxOffer.setReceiverEmail(zpglRcxxEntity.getMail());
                Thread pthread = new Thread(new ZpglSendMessageThread(mailSender, zpglRcxxOffer));
                pthread.start();
                break;
            case 8:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                //待入职 填充字段
                zpglRcxx.setBmgwId(zpglRcxxDto.getBmgwId());
                zpglRcxx.setJobType(zpglRcxxDto.getJobType());
                zpglRcxx.setYjrzTime(zpglRcxxDto.getYjrzTime());
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.WAIT, new String[]{
                        userBean.getQyzxEmpLogin().getUsername()});
                break;
            case 9:
                //淘汰 填充字段
                if(!StringUtils.isEmpty(zpglRcxxDto.getIfrck())){
                    zpglRcxx.setIfrck(zpglRcxxDto.getIfrck());
                    zpglRcxx.setIfrckTime(new Date());
                }
                zpglRcxx.setZpglFailId(zpglRcxxDto.getZpglFailId());
                zpglRcxx.setRemarks(zpglRcxxDto.getRemarks());
                ZpglFail zpglFail = ZpglFail.builder().id(zpglRcxxDto.getZpglFailId()).build().selectById();
                String messageTemplate = ZpglMessageTemplate.ENTRYING, titleLabel = "";
                if (!StringUtils.isEmpty(zpglFail)) {
                    if (zpglFail.getZpglRcxxStatus().equals(JxglEnumInterface.ResumeStatus.INTERVIEWED.getType())) {
                        titleLabel = JxglEnumInterface.ResumeStatus.INTERVIEWED.getName();
                        zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                        messageTemplate = ZpglMessageTemplate.INTERVIEWED_ENTRYING;
                    }
                    if (zpglFail.getZpglRcxxStatus().equals(JxglEnumInterface.ResumeStatus.INTERVIEW_PASS.getType())) {
                        titleLabel = JxglEnumInterface.ResumeStatus.INTERVIEW_PASS.getName();
                        zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                        messageTemplate = ZpglMessageTemplate.INTERVIEWED_ENTRYING;
                    }
                    if (zpglFail.getZpglRcxxStatus().equals(JxglEnumInterface.ResumeStatus.INTERVIEW.getType())) {
                        titleLabel = JxglEnumInterface.ResumeStatus.INTERVIEW.getName();
                        zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                        messageTemplate = ZpglMessageTemplate.INTERVIEWED_ENTRYING;
                    }

                    if (zpglFail.getZpglRcxxStatus().equals(JxglEnumInterface.ResumeStatus.EMPLOY.getType())) {
                        titleLabel = JxglEnumInterface.ResumeStatus.EMPLOY.getName();
                        zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                        messageTemplate = ZpglMessageTemplate.OFFER_ENTRYING;
                    }
                    if (zpglFail.getZpglRcxxStatus().equals(JxglEnumInterface.ResumeStatus.OFFER.getType())) {
                        titleLabel = JxglEnumInterface.ResumeStatus.OFFER.getName();
                        zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                        messageTemplate = ZpglMessageTemplate.OFFER_ENTRYING;
                    }
                    if (zpglFail.getZpglRcxxStatus().equals(JxglEnumInterface.ResumeStatus.ENTRYING.getType())) {
                        titleLabel = JxglEnumInterface.ResumeStatus.ENTRYING.getName();
                        zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                        messageTemplate = ZpglMessageTemplate.OFFER_ENTRYING;
                    }
                    if (zpglFail.getZpglRcxxStatus().equals(JxglEnumInterface.ResumeStatus.ENTRY.getType())) {
                        titleLabel = JxglEnumInterface.ResumeStatus.ENTRY.getName();
                        zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                        messageTemplate = ZpglMessageTemplate.OFFER_ENTRYING;
                    }
                    detail = ZpglMessageTemplate.print(messageTemplate, new String[]{
                            userBean.getUserInfo().getName(), zpglFail.getFailCause(), StringUtils.isEmpty(zpglRcxxDto.getRemarks())?"":zpglRcxxDto.getRemarks(), titleLabel});
                }
                break;
            case 10:
                zpglRcxxStatus = JxglEnumInterface.MslcLogStatus.OTHER.getType();
                //确认入职
                detail = ZpglMessageTemplate.print(ZpglMessageTemplate.ENTRY, new String[]{
                        userBean.getQyzxEmpLogin().getUsername()});
                break;
            default:
                break;
        }
        zpglMslcLog.setZpglRcxxStatus(zpglRcxxStatus);
        zpglMslcLog.setDetail(detail);
        count = zpglRcxx.updateById();
        zpglMslcLogService.addZpglMslcLog(zpglMslcLog);
        // 发送面试通知
        if (count && JxglEnumInterface.ResumeStatus.INTERVIEW.getType().equals(zpglRcxxDto.getStatus()) && JxglEnumInterface.NoticeWay.WECHAT_PUBLIC.getType().equals(zpglRcxxDto.getNoticeWay())) {
            InterviewNotice interviewNotice = new InterviewNotice();
            ZpglZwxx zpglZwxx = ZpglZwxx.builder().id(zpglRcxxEntity.getZpglZwxxId()).build().selectById();
            if (!StringUtils.isEmpty(zpglZwxx)) {
                interviewNotice.setZpglZwxxName(zpglZwxx.getName());
            }
            interviewNotice.setName(zpglRcxxEntity.getName());
            interviewNotice.setType(zpglRcxxDto.getNoticeWay());
            interviewNotice.setEmail(zpglRcxxEntity.getMail());
            //公众号类型 1:8小时企业管理 2:优领人才网
            interviewNotice.setWxgzhType(1);
            //0 即时发送,1 定时发送
            interviewNotice.setTiming(0);
            interviewNotice.setInterviewTime(zpglRcxxDto.getInterviewTime());
            // 通知面试官
            YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().select("phone").lambda()
                    .eq(YgglMainEmp::getOrgCode, userBean.getOrgCode()).eq(YgglMainEmp::getEmpNum, zpglRcxxDto.getInterviewerId()));
            if (!StringUtils.isEmpty(ygglMainEmp)) {
                interviewNotice.setMobile(ygglMainEmp.getPhone());
                interviewNotice.setYgglMainEmpId(ygglMainEmp.getId());
            }
            interviewNotice.setTemplateId(MessageTemplate.TEMPLATE_ID_TO_INTERVIEWER);
            interviewNotice.setContentStr(ZpglMessageTemplate.print(ZpglMessageTemplate.TO_INTERVIEWER, new String[]{interviewNotice.getName()}));
            log.info("TO_INTERVIEWER addInterviewMessageQueue info:{}", zpglWxgzptService.addInterviewMessageQueue(interviewNotice));
            // 通知面试者
            interviewNotice.setZpglRcxxId(zpglRcxxEntity.getId());
            interviewNotice.setMobile(zpglRcxxEntity.getMobile());
            interviewNotice.setRemark("请您提前做好准备,妥善安排接面试的时间~如有疑问,请联系 HR");
            interviewNotice.setContentStr(ZpglMessageTemplate.print(ZpglMessageTemplate.TO_INTERVIEWEE, new String[]{interviewNotice.getName(), interviewNotice.getZpglZwxxName()}));
            log.info("TO_INTERVIEWEE addInterviewMessageQueue info:{}", zpglWxgzptService.addInterviewMessageQueue(interviewNotice));
        }
        return count;
    }

    @Override
    public SysRegion getSysRegion(Integer keyId) {
        return SysRegion.builder().build()
                .selectOne(new QueryWrapper<SysRegion>().lambda().eq(SysRegion::getKeyId, keyId).select(
                        SysRegion::getRegionName, SysRegion::getKeyId, SysRegion::getZipCode,
                        SysRegion::getRegionCode));
    }

    @Override
    public Result<Object> addResumeImportCandidate(UserBean userBean, MultipartFile file, ImportCandidateDto importCandidateDto) {
        BaiduTicResumeDto baiduTicResumeDto = BaiduTicResumeDto.builder().filename(file.getOriginalFilename()).filetype(importCandidateDto.getSuffix()).filedata(Base64.getStrFromPath(file)).build();
        ResponseEntity<String> resumeString = baiduTicUtil.getResumeByCvParser(baiduTicResumeDto);
        JSONObject json = (JSONObject) JSONObject.parse(resumeString.getBody());
        log.info("招聘-导入候选人简历{}", resumeString.getBody());
        ResumeExtract resumeExtract = null;
        if ("success".equals(json.get("error_msg"))) {
            if (StringUtils.isEmpty(json.get("results"))) {
                log.info("招聘-导入候选人简历:results is null");
                return ResultUtil.error("导入简历失败,请检查是否为简历文件~");
            }
            JSONArray array = (JSONArray) json.get("results");
            if (StringUtils.isEmpty(array.get(0))) {
                log.info("招聘-导入候选人简历:results is null");
                return ResultUtil.error("导入简历失败,请检查是否为简历文件~");
            }
            JSONObject resultsJsonObject = (JSONObject) array.get(0);
            resumeExtract = JSONObject.toJavaObject((JSONObject) resultsJsonObject.get("extract"), ResumeExtract.class);
        } else {
            return ResultUtil.error("导入简历失败,请检查是否为简历文件~");
        }
        if (StringUtils.isEmpty(resumeExtract) || StringUtils.isEmpty(resumeExtract.getBasic_infos())) {
            return ResultUtil.error("导入简历失败,请检查是否为简历文件~");
        }
        Result<String> data = ossService.upload(userBean.getOrgCode(), "zpgl", file);
        if(!StringUtils.isEmpty(data) && !StringUtils.isEmpty(data.getData())){
            importCandidateDto.setFilePath(data.getData());
            importCandidateDto.setFileName(file.getOriginalFilename());
        }
        return this.addZpglRcxx(userBean, resumeExtract, importCandidateDto);
    }

    @Override
    public Result<Object> addCandidateByResumeSDK(UserBean userBean, MultipartFile file, ImportCandidateDto importCandidateDto) {
        ResumeSdkDto resumeSdkDto = ResumeSdkDto.builder().ocr_type(1).need_avatar(0).file_name(file.getOriginalFilename()).file_cont(Base64.getStrFromPath(file)).build();
        String resumeString = "";
        try {
            resumeString = resumeSDKUtil.getResumeByCvParser(resumeSdkDto, RESUMESDK_APPCODE);
        }catch (Exception e){
            e.printStackTrace();
        }
        JSONObject json = (JSONObject) JSONObject.parse(resumeString);
        log.info("招聘-导入候选人简历{}", resumeString);
        if(StringUtils.isEmpty(json)){
            log.error("招聘-导入候选人简历: resumeSDKUtil.getResumeByCvParser return null. ");
            return ResultUtil.error("导入简历失败,请检查是否为简历文件~");
        }
        Status statusEntity = JSONObject.toJavaObject((JSONObject) json.get("status"), Status.class);
        if(StringUtils.isEmpty(statusEntity) || !ResumeSdk.StatusCodeEnum.SUCCESSS.getType().equals(statusEntity.getCode())){
            log.error("招聘-导入候选人简历:{}",ResumeSdk.StatusCodeEnum.getName(statusEntity.getCode()));
            return ResultUtil.error("导入简历失败,请联系管理员~("+ResumeSdk.StatusCodeEnum.getName(statusEntity.getCode())+")");
        }
        Result<String> data = ossService.upload(userBean.getOrgCode(), "zpgl", file);
        if(!StringUtils.isEmpty(data) && !StringUtils.isEmpty(data.getData())){
            importCandidateDto.setFilePath(data.getData());
            importCandidateDto.setFileName(file.getOriginalFilename());
        }
        return this.addZpglRcxx(userBean, json, importCandidateDto);
    }
    @Override
    public boolean updateZpglRcxxZwxx(UserBean userBean, ZpglRcxxDto zpglRcxxDto) {
        ZpglRcxx zpglRcxx = ZpglRcxx.builder().id(zpglRcxxDto.getId()).zpglZwxxId(zpglRcxxDto.getZpglZwxxId()).build();
        ZpglMslcLog zpglMslcLog = new ZpglMslcLog();
        zpglMslcLog.setZpglRcxxId(zpglRcxxDto.getId());
        zpglMslcLog.setUserId(userBean.getEmpNum());
        zpglMslcLog.setUserName(userBean.getQyzxEmpLogin().getUsername());
        zpglMslcLog.setZpglRcxxStatus(JxglEnumInterface.MslcLogStatus.OTHER.getType());
        zpglMslcLog.setDetail(userBean.getQyzxEmpLogin().getUsername() + " 更改候选人应聘职位.");
        zpglRcxx.updateById();
        return zpglMslcLogService.addZpglMslcLog(zpglMslcLog);
    }

    @Override
    public boolean updateZpglOther(UserBean userBean, ZpglRcxxDto zpglRcxxDto,Integer ygglMainEmpId) {
        // 招聘-变更人才信息状态
        // 添加面试流程记录
        this.updateZpglRcxx(userBean,zpglRcxxDto);
        // 职位信息已入职人数+1
        ZpglZwxx zpglZwxx = ZpglZwxx.builder().id(zpglRcxxDto.getZpglZwxxId()).build().selectById();
        if(!StringUtils.isEmpty(zpglZwxx)){
            zpglZwxx.setEntryNum(zpglZwxx.getEntryNum()+1);
            zpglZwxx.updateById();
        }
        // 维护微信公众平台表
        ZpglRcxx zpglRcxx = ZpglRcxx.builder().id(zpglRcxxDto.getId()).build().selectById();
        if(!StringUtils.isEmpty(zpglRcxx) && !StringUtils.isEmpty(zpglRcxx.getMobile())){
            ZpglWxgzptEmpRcxx zpglWxgzptEmpRcxx = ZpglWxgzptEmpRcxx.builder().build().selectOne(
                    new QueryWrapper<ZpglWxgzptEmpRcxx>().select("id","zpgl_rcxx_id").lambda().eq(ZpglWxgzptEmpRcxx::getMobile,zpglRcxx.getMobile())
                    .eq(ZpglWxgzptEmpRcxx::getDeleteFlag,0)
            );
            if(!StringUtils.isEmpty(zpglWxgzptEmpRcxx) && (StringUtils.isEmpty(zpglWxgzptEmpRcxx.getZpglRcxxId()) || zpglWxgzptEmpRcxx.getZpglRcxxId() <= 0)){
                zpglWxgzptEmpRcxx.setOrgCode(userBean.getOrgCode());
                zpglWxgzptEmpRcxx.setZpglRcxxId(zpglRcxx.getId());
                zpglWxgzptEmpRcxx.setYgglMainEmpId(ygglMainEmpId);
                zpglWxgzptEmpRcxx.updateById();
            }
            if(StringUtils.isEmpty(zpglWxgzptEmpRcxx)){
                zpglWxgzptEmpRcxx = new ZpglWxgzptEmpRcxx();
                zpglWxgzptEmpRcxx.setOrgCode(userBean.getOrgCode());
                zpglWxgzptEmpRcxx.setZpglRcxxId(zpglRcxx.getId());
                zpglWxgzptEmpRcxx.setYgglMainEmpId(ygglMainEmpId);
                zpglWxgzptEmpRcxx.setMobile(zpglRcxx.getMobile());
                zpglWxgzptEmpRcxx.insert();
            }
        }
        return true;
    }

    /**
     * 导入简历
     * 同步人才信息 教育资讯 基本信息 其他信息 项目信息 工作信息
     *
     * @param resumeExtract
     * @param importCandidateDto
     */
    private Result<Object> addZpglRcxx(UserBean userBean, ResumeExtract resumeExtract, ImportCandidateDto importCandidateDto) {
        ZpglRcxx zpglRcxx = ZpglRcxx.builder().build();
        zpglRcxx.setZpglZwxxId(importCandidateDto.getZpglZwxxId());
        zpglRcxx.setStatus(importCandidateDto.getStatus());
        zpglRcxx.setZpglZpqdId(importCandidateDto.getZpglZpqdId());
        zpglRcxx.setOrgCode(userBean.getOrgCode().toString());
        zpglRcxx.setFileName(importCandidateDto.getFileName());
        zpglRcxx.setFilePath(importCandidateDto.getFilePath());
        Integer highesteducation = null;
        // 添加人才信息
        if (!StringUtils.isEmpty(resumeExtract.getBasic_infos())) {
            zpglRcxx.setName(resumeExtract.getBasic_infos().getName());
            String phone = resumeExtract.getBasic_infos().getPhone_numbers();
            if (StringUtils.isEmpty(phone)) {
                return ResultUtil.error("导入简历失败,手机号码不存在~");
            }
            // 查询简历是否重复导入
            ZpglRcxx zpglRcxxEntiyt = ZpglRcxx.builder().build().selectOne(new QueryWrapper<ZpglRcxx>().lambda().eq(ZpglRcxx::getMobile, phone).eq(ZpglRcxx::getDeleteFlag, 0));
            if (!StringUtils.isEmpty(zpglRcxxEntiyt)) {
                return ResultUtil.error("简历已入库,请勿重复导入");
            }
            zpglRcxx.setMobile(phone);
            zpglRcxx.setMail(resumeExtract.getBasic_infos().getEmail_address());
            zpglRcxx.setWeixin(resumeExtract.getBasic_infos().getWechat());
            zpglRcxx.setIdCard(resumeExtract.getBasic_infos().getId_number());
            if (!StringUtils.isEmpty(resumeExtract.getBasic_infos().getGender())) {
                zpglRcxx.setSex(resumeExtract.getBasic_infos().getGender().indexOf("男") != -1 ? 0 : 1);
            }
            //出生日期,格式化为 年-月,如2000-01,若只有年,则只显示年,如2000
            if (!StringUtils.isEmpty(resumeExtract.getBasic_infos().getBirth_date()) && resumeExtract.getBasic_infos().getBirth_date().length() > 0) {
                zpglRcxx.setDatebirth(this.getDate(resumeExtract.getBasic_infos().getBirth_date()));
            }
            if (!StringUtils.isEmpty(resumeExtract.getBasic_infos().getNation())) {
                NationClass nationClass = NationClass.builder().build().selectOne(new QueryWrapper<NationClass>().lambda().like(NationClass::getName, resumeExtract.getBasic_infos().getNation()));
                if (!StringUtils.isEmpty(nationClass)) {
                    zpglRcxx.setNationClassId(nationClass.getId());
                }
            }
            zpglRcxx.setAddress(resumeExtract.getBasic_infos().getHome_location());
            zpglRcxx.setUniversitie(resumeExtract.getBasic_infos().getSchool());
            if (!StringUtils.isEmpty(resumeExtract.getBasic_infos().getCur_duration())) {
                zpglRcxx.setWorkyears(Integer.parseInt(resumeExtract.getBasic_infos().getCur_duration()));
            }
            zpglRcxx.setCompany(resumeExtract.getBasic_infos().getCur_company());
            zpglRcxx.insert();
        }
        if (!StringUtils.isEmpty(zpglRcxx.getId())) {
            // 添加教育经历
            if (!StringUtils.isEmpty(resumeExtract.getEducation_infos())) {
                ZpglRcxxStudy zpglRcxxStudy = ZpglRcxxStudy.builder().zpglRcxxId(zpglRcxx.getId()).build();
                List<EducationInfo> list = resumeExtract.getEducation_infos();
                for (EducationInfo entity : list) {
                    if (!StringUtils.isEmpty(entity.getStart_time()) && entity.getStart_time().length() > 0) {
                        zpglRcxxStudy.setStartTime(this.getDate(entity.getStart_time()));
                    }
                    if (!StringUtils.isEmpty(entity.getEnd_time()) && entity.getEnd_time().length() > 0) {
                        zpglRcxxStudy.setEndTime(this.getDate(entity.getEnd_time()));
                    }
                    zpglRcxxStudy.setSubject(entity.getMajor());
                    zpglRcxxStudy.setSchoolName(StringUtils.isEmpty(entity.getSchool()) ? entity.getCollege() : entity.getSchool());
                    zpglRcxxStudy.setEducation(this.getEducation(entity.getSchooling_record()));
                    highesteducation = zpglRcxxStudy.getEducation();
                    zpglRcxxStudy.insert();
                }
            }
            // 添加工作经验
            if (!StringUtils.isEmpty(resumeExtract.getWork_infos())) {
                ZpglRcxxExperience zpglRcxxExperience = ZpglRcxxExperience.builder().zpglRcxxId(zpglRcxx.getId()).build();
                List<WorkInfo> list = resumeExtract.getWork_infos();
                for (WorkInfo entity : list) {
                    zpglRcxxExperience.setCompany(entity.getCompany());
                    zpglRcxxExperience.setJobName(entity.getJob());
                    zpglRcxxExperience.setDepartment(entity.getDepartment());
                    zpglRcxxExperience.setWorkContent(entity.getDescribe());
                    if (!StringUtils.isEmpty(entity.getEnd_time()) && entity.getEnd_time().length() > 0) {
                        zpglRcxxExperience.setEndTime(this.getDate(entity.getEnd_time()));
                    }
                    if (!StringUtils.isEmpty(entity.getStart_time()) && entity.getStart_time().length() > 0) {
                        zpglRcxxExperience.setStartTime(this.getDate(entity.getStart_time()));
                    }
                    zpglRcxxExperience.insert();
                }
            }
            // 添加项目信息
            if (!StringUtils.isEmpty(resumeExtract.getProject_infos())) {
                ZpglRcxxProject zpglRcxxProject = ZpglRcxxProject.builder().zpglRcxxId(zpglRcxx.getId()).build();
                List<ProjectInfo> list = resumeExtract.getProject_infos();
                for (ProjectInfo entity : list) {
                    zpglRcxxProject.setProjectDescribe(entity.getDescribe());
                    zpglRcxxProject.setDuty(entity.getDuty());
                    zpglRcxxProject.setJob(entity.getJob());
                    zpglRcxxProject.setLocation(entity.getLocation());
                    zpglRcxxProject.setProjectName(entity.getProject_name());

                    if (!StringUtils.isEmpty(entity.getStart_time()) && entity.getStart_time().length() > 0) {
                        zpglRcxxProject.setStartTime(this.getDate(entity.getStart_time()));
                    }
                    if (!StringUtils.isEmpty(entity.getEnd_time()) && entity.getEnd_time().length() > 0) {
                        zpglRcxxProject.setEndTime(this.getDate(entity.getEnd_time()));
                    }
                    zpglRcxxProject.insert();
                }
            }
            if (!StringUtils.isEmpty(highesteducation)) {
                ZpglRcxx.builder().id(zpglRcxx.getId()).highesteducation(highesteducation.toString()).build().updateById();
            }

        }
        return ResultUtil.success();
    }

    /**
     * 导入简历
     * 同步人才信息 教育资讯 基本信息 其他信息 项目信息 工作信息
     * @sdkdocs http://www.resumesdk.com/docs/rs-parser.html
     * @param json
     * @param importCandidateDto
     */
    private Result<Object> addZpglRcxx(UserBean userBean, JSONObject json, ImportCandidateDto importCandidateDto) {
        ReumeSdkResult reumeSdkResult = JSONObject.toJavaObject((JSONObject) json.get("result"), ReumeSdkResult.class);
        if(StringUtils.isEmpty(reumeSdkResult)){
            log.info("招聘-导入候选人简历:results is null");
            return ResultUtil.error("导入简历失败,请检查是否为简历文件~");
        }
        /** 基础信息开始 */
        ZpglRcxx zpglRcxx = ZpglRcxx.builder().build();
        zpglRcxx.setZpglZwxxId(importCandidateDto.getZpglZwxxId());
        zpglRcxx.setStatus(importCandidateDto.getStatus());
        zpglRcxx.setZpglZpqdId(importCandidateDto.getZpglZpqdId());
        zpglRcxx.setOrgCode(userBean.getOrgCode().toString());
        zpglRcxx.setFileName(importCandidateDto.getFileName());
        zpglRcxx.setFilePath(importCandidateDto.getFilePath());
        // 添加人才信息
        zpglRcxx.setName(reumeSdkResult.getName());
        String phone = reumeSdkResult.getPhone();
        if (StringUtils.isEmpty(phone)) {
            return ResultUtil.error("导入简历失败,手机号码不存在~");
        }
        // 查询简历是否重复导入
        ZpglRcxx zpglRcxxEntiyt = ZpglRcxx.builder().build().selectOne(new QueryWrapper<ZpglRcxx>().lambda().eq(ZpglRcxx::getOrgCode, userBean.getOrgCode()).eq(ZpglRcxx::getMobile, phone).eq(ZpglRcxx::getDeleteFlag, 0));
        if (!StringUtils.isEmpty(zpglRcxxEntiyt)) {
            return ResultUtil.error("简历已入库,请勿重复导入");
        }
        zpglRcxx.setMobile(phone);
        zpglRcxx.setMail(reumeSdkResult.getEmail());
        zpglRcxx.setWeixin(reumeSdkResult.getWeixin());
        zpglRcxx.setIdCard(reumeSdkResult.getId_card());
        if (!StringUtils.isEmpty(reumeSdkResult.getGender())) {
            zpglRcxx.setSex(reumeSdkResult.getGender().indexOf("男") != -1 ? 0 : 1);
        }
        //出生日期,格式化为 年.月,如2000.01,若只有年,则只显示年,如2000
        if (!StringUtils.isEmpty(reumeSdkResult.getBirthday()) && reumeSdkResult.getBirthday().length() > 0) {
            zpglRcxx.setDatebirth(this.getDate(reumeSdkResult.getBirthday()));
        }
        if (!StringUtils.isEmpty(reumeSdkResult.getRace())) {
            NationClass nationClass = NationClass.builder().build().selectOne(new QueryWrapper<NationClass>().lambda().like(NationClass::getName, reumeSdkResult.getRace()));
            if (!StringUtils.isEmpty(nationClass)) {
                zpglRcxx.setNationClassId(nationClass.getId());
            }
        }
        // 身高
        if(!StringUtils.isEmpty(reumeSdkResult.getHeight())){
            String[] height = reumeSdkResult.getHeight().split("cm");
            if(height.length > 0){
                zpglRcxx.setHeight(Integer.parseInt(height[0]));
            }
        }
        // 体重
        if(!StringUtils.isEmpty(reumeSdkResult.getWeight())){
            String[] height = reumeSdkResult.getWeight().split("kg");
            if(height.length > 0){
                zpglRcxx.setWeight(Integer.parseInt(height[0]));
            }
        }
        zpglRcxx.setNativePlace(reumeSdkResult.getNationality());
        zpglRcxx.setAddress(reumeSdkResult.getLiving_address());
        zpglRcxx.setUniversitie(reumeSdkResult.getCollege());
        zpglRcxx.setSubject(reumeSdkResult.getMajor());
        if(!StringUtils.isEmpty(reumeSdkResult.getDegree())){
            zpglRcxx.setHighesteducation(this.getEducation(reumeSdkResult.getDegree())+"");
        }
        if (!StringUtils.isEmpty(reumeSdkResult.getWork_year_norm())) {
            if(reumeSdkResult.getWork_year_norm().indexOf(".") != -1){
                zpglRcxx.setWorkyears(Integer.parseInt(reumeSdkResult.getWork_year_norm().substring(0,reumeSdkResult.getWork_year_norm().lastIndexOf(".")))+1);
            }else {
                zpglRcxx.setWorkyears(Integer.parseInt(reumeSdkResult.getWork_year_norm()));
            }
        }
        if(!StringUtils.isEmpty(reumeSdkResult.getExpect_salary_max())){
            zpglRcxx.setSalary(Integer.parseInt(reumeSdkResult.getExpect_salary_max()));
        }
        zpglRcxx.setCompany(reumeSdkResult.getWork_company());

        zpglRcxx.setZjzw(reumeSdkResult.getWork_position());
        zpglRcxx.setContMyDesc(reumeSdkResult.getCont_my_desc());
        zpglRcxx.setHobby(reumeSdkResult.getCont_hobby());
        zpglRcxx.insert();
        /** 基础信息结束 */
        if (!StringUtils.isEmpty(zpglRcxx.getId())) {
            // 初始化流程记录
            ZpglMslcLog zpglMslcLog = new ZpglMslcLog();
            zpglMslcLog.setZpglRcxxId(zpglRcxx.getId());
            zpglMslcLog.setUserId(userBean.getEmpNum());
            zpglMslcLog.setUserName(userBean.getQyzxEmpLogin().getUsername());
            zpglMslcLog.setZpglRcxxStatus(JxglEnumInterface.MslcLogStatus.OTHER.getType());
            zpglMslcLog.setDetail(ZpglMessageTemplate.SYS_ADD);
            zpglMslcLogService.addZpglMslcLog(zpglMslcLog);
            // 添加教育经历
            if (!StringUtils.isEmpty(reumeSdkResult.getEducation_objs())) {
                ZpglRcxxStudy zpglRcxxStudy = ZpglRcxxStudy.builder().zpglRcxxId(zpglRcxx.getId()).build();
                List<Education_objs> list = reumeSdkResult.getEducation_objs();
                for (Education_objs entity : list) {
                    if (!StringUtils.isEmpty(entity.getStart_date()) && entity.getStart_date().length() > 0) {
                        zpglRcxxStudy.setStartTime(this.getDate(entity.getStart_date()));
                    }
                    if (!StringUtils.isEmpty(entity.getEnd_date()) && entity.getEnd_date().length() > 0) {
                        zpglRcxxStudy.setEndTime(this.getDate(entity.getEnd_date()));
                    }
                    zpglRcxxStudy.setSubject(entity.getEdu_major());
                    zpglRcxxStudy.setSchoolName(entity.getEdu_college());
                    zpglRcxxStudy.setEducation(this.getEducation(entity.getEdu_degree_norm()));
                    zpglRcxxStudy.insert();
                }
            }
            // 添加工作经验
            if (!StringUtils.isEmpty(reumeSdkResult.getJob_exp_objs())) {
                ZpglRcxxExperience zpglRcxxExperience = ZpglRcxxExperience.builder().zpglRcxxId(zpglRcxx.getId()).build();
                List<Job_exp_objs> list = reumeSdkResult.getJob_exp_objs();
                for (Job_exp_objs entity : list) {
                    zpglRcxxExperience.setCompany(entity.getJob_cpy());
                    zpglRcxxExperience.setJobName(entity.getJob_position());
                    zpglRcxxExperience.setDepartment(entity.getJob_dept());
                    zpglRcxxExperience.setWorkContent(entity.getJob_content());
                    zpglRcxxExperience.setReason(entity.getJob_why_leave());
                    if (!StringUtils.isEmpty(entity.getEnd_date()) && entity.getEnd_date().length() > 0) {
                        zpglRcxxExperience.setEndTime(this.getDate(entity.getEnd_date()));
                    }
                    if (!StringUtils.isEmpty(entity.getStart_date()) && entity.getStart_date().length() > 0) {
                        zpglRcxxExperience.setStartTime(this.getDate(entity.getStart_date()));
                    }

                    zpglRcxxExperience.insert();
                }
            }
            // 添加项目信息
            if (!StringUtils.isEmpty(reumeSdkResult.getProj_exp_objs())) {
                ZpglRcxxProject zpglRcxxProject = ZpglRcxxProject.builder().zpglRcxxId(zpglRcxx.getId()).build();
                List<Proj_exp_objs> list = reumeSdkResult.getProj_exp_objs();
                for (Proj_exp_objs entity : list) {
                    zpglRcxxProject.setProjectDescribe(entity.getProj_content());
                    zpglRcxxProject.setDuty(entity.getProj_resp());
                    zpglRcxxProject.setJob(entity.getProj_position());
                    zpglRcxxProject.setProjectName(entity.getProj_name());
                    if (!StringUtils.isEmpty(entity.getStart_date()) && entity.getStart_date().length() > 0) {
                        zpglRcxxProject.setStartTime(this.getDate(entity.getStart_date()));
                    }
                    if (!StringUtils.isEmpty(entity.getEnd_date()) && entity.getEnd_date().length() > 0) {
                        zpglRcxxProject.setEndTime(this.getDate(entity.getEnd_date()));
                    }
                    zpglRcxxProject.insert();
                }
            }
            // 添加培训经历
            if (!StringUtils.isEmpty(reumeSdkResult.getTraining_objs())) {
                ZpglRcxxTrain zpglRcxxTrain = ZpglRcxxTrain.builder().zpglRcxxId(zpglRcxx.getId()).build();
                List<Training_objs> list = reumeSdkResult.getTraining_objs();
                for (Training_objs entity : list) {
                    zpglRcxxTrain.setTrainCompany(entity.getTrain_org());
                    zpglRcxxTrain.setTrainContent(entity.getTrain_cont());
                    if (!StringUtils.isEmpty(entity.getStart_date()) && entity.getStart_date().length() > 0) {
                        zpglRcxxTrain.setStartTime(this.getDate(entity.getStart_date()));
                    }
                    if (!StringUtils.isEmpty(entity.getEnd_date()) && entity.getEnd_date().length() > 0) {
                        zpglRcxxTrain.setEndTime(this.getDate(entity.getEnd_date()));
                    }
                    zpglRcxxTrain.insert();
                }
            }
        }
        return ResultUtil.success();
    }

    /**
     * 根据string时间获取date(2019-10或2019)
     *
     * @param date
     * @return
     */
    private Date getDate(String date) {
        String datebirth = "";
        date = date.replace(".","-");
        String[] num = date.split("-");
        if (num.length == 1) {
            datebirth = num[0] + "-1-1";
        } else if (num.length == 2) {
            datebirth = num[0] + "-" + num[1] + "-1";
        }
        return datebirth.length() > 0 ? ClockInTool.strToDateLong(datebirth) : null;
    }

    /**
     * 获取学历类型
     *
     * @param str
     * @return
     */
    private Integer getEducation(String str) {
        Integer education = 0;
        if (StringUtils.isEmpty(str)) {
            return education;
        }
        // 博士研究生/硕士研究生/本科/专科/高中/中专/初中
        // 小学、初中、高中、中专、大专、本科、硕士研究生、博士研究生、博士后、mba
        if (str.indexOf("初中") != -1) {
            education = 2;
        } else if (str.indexOf("小学") != -1) {
            education = 1;
        }else if (str.indexOf("中专") != -1) {
            education = 4;
        } else if (str.indexOf("高中") != -1) {
            education = 3;
        } else if (str.indexOf("专科") != -1 || str.indexOf("大专") != -1) {
            education = 5;
        } else if (str.indexOf("本科") != -1) {
            education = 6;
        } else if (str.indexOf("硕士研究生") != -1 || str.indexOf("硕士") != -1) {
            education = 7;
        } else if (str.indexOf("博士研究生") != -1 || str.indexOf("博士") != -1) {
            education = 8;
        }
        return education;
    }

    /**
     * 添加offer记录
     *
     * @param userBean
     * @param zpglRcxxDto
     * @return
     */
    private ZpglRcxxOffer insertZpglRcxxOffer(UserBean userBean, ZpglRcxxDto zpglRcxxDto) {
        Integer orgCode = userBean.getOrgCode();
        ZpglRcxxOffer zpglRcxxOffer = ZpglRcxxOffer.builder().build();
        zpglRcxxOffer.setOrgCode(orgCode);
        zpglRcxxOffer.setRcxxName(zpglRcxxDto.getName());
        zpglRcxxOffer.setZpglRcxxId(zpglRcxxDto.getId());
        zpglRcxxOffer.setRzTime(zpglRcxxDto.getYjrzTime());
        // 所在部门
        ZzglBmgwM zzglBmgwM = ZzglBmgwM.builder().build().selectOne(
                new QueryWrapper<ZzglBmgwM>().lambda().eq(ZzglBmgwM::getOrgCode, orgCode).eq(ZzglBmgwM::getId, zpglRcxxDto.getBmgwId()));
        Integer bmid = null;
        if (!StringUtils.isEmpty(zzglBmgwM)) {
            zpglRcxxOffer.setGangwei(zzglBmgwM.getName());
            bmid = zzglBmgwM.getUpId();
        }
        // 所在职位
        ZzglBmgwM z = ZzglBmgwM.builder().build().selectOne(
                new QueryWrapper<ZzglBmgwM>().lambda().eq(ZzglBmgwM::getOrgCode, orgCode).eq(ZzglBmgwM::getId, bmid));
        if (!StringUtils.isEmpty(z)) {
            zpglRcxxOffer.setBumen(z.getName());
        }
        // 所在公司
        ZzglBmgwM company = ZzglBmgwM.builder().build().selectOne(
                new QueryWrapper<ZzglBmgwM>().select("name").lambda().eq(ZzglBmgwM::getOrgCode, orgCode).eq(ZzglBmgwM::getUpId, 0));
        if (!StringUtils.isEmpty(company)) {
            zpglRcxxOffer.setTitle(company.getName() + "录用函");
            zpglRcxxOffer.setCompanyName(company.getName());
        }
        YgglMainEmp ygglMainEmp = YgglMainEmp.builder().build().selectOne(new QueryWrapper<YgglMainEmp>().select("phone", "name", "work_email").lambda()
                .eq(YgglMainEmp::getOrgCode, orgCode).eq(YgglMainEmp::getEmpNum, zpglRcxxDto.getLinkId()));
        if (!StringUtils.isEmpty(ygglMainEmp)) {
            zpglRcxxOffer.setLinkName(ygglMainEmp.getName());
            zpglRcxxOffer.setLinkPhone(ygglMainEmp.getPhone());
            zpglRcxxOffer.setLinkEmail(ygglMainEmp.getWorkEmail());
        }
        zpglRcxxOffer.insert();
        return zpglRcxxOffer;
    }
}