package com.zcloud.controller.bus;

import com.alibaba.fastjson.JSON;
import com.zcloud.aspect.DockAnnotation;
import com.zcloud.controller.base.BaseController;
import com.zcloud.entity.Page;
import com.zcloud.entity.PageData;
import com.zcloud.entity.system.User;
import com.zcloud.service.bus.*;
import com.zcloud.service.inspection.SafetyEnvironmentalService;
import com.zcloud.util.*;
import com.zcloud.util.event.DeviceHiddenEvent;
import com.zcloud.util.message.MessageService;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;

import javax.annotation.Resource;
import java.util.*;

/**
 * 说明:隐患审核
 * 作者:luoxiaobao
 * 时间:2022-04-14
 * 官网:www.zcloudchina.com
 */
@Controller
@RequestMapping("/hiddenexamine")
public class HiddenExamineController extends BaseController {

    @Autowired
    private HiddenExamineService hiddenexamineService;
    @Autowired
    private HiddenService hiddenService;
    @Autowired
    private ImgFilesService imgFilesService;
    @Autowired
    private HiddenUserService hiddenUserService; // 隐患相关人员信息
    @Autowired
    private MessageService messageService;
    @Autowired
    private HiddenCheckService hiddenCheckService;
    @Autowired
    private HiddenSchemeService hiddenSchemeService;
    @Resource
    private ApplicationContext applicationContext;
    @Autowired
    private SafetyEnvironmentalService safetyenvironmentalService;
    @Autowired
    private NoticeCorpUtil noticeUtil;

    /**
     * 新增
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/add")
    // @RequiresPermissions("hiddenexamine:add")
    @ResponseBody
    public Object add() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        pd.put("HIDDENEXAMINE_ID", this.get32UUID());    //主键
        hiddenexamineService.save(pd);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 删除
     *
     * @param out
     * @throws Exception
     */
    @RequestMapping(value = "/delete")
    // @RequiresPermissions("hiddenexamine:del")
    @ResponseBody
    public Object delete() throws Exception {
        Map<String, String> map = new HashMap<String, String>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        hiddenexamineService.delete(pd);
        map.put("result", errInfo);                //返回结果
        return map;
    }

    /**
     * 修改
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/edit")
    // @RequiresPermissions("hiddenexamine:edit")
    @ResponseBody
    public Object edit() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        pd.put("OPERATOR", Jurisdiction.getUSER_ID());
        pd.put("OPERATTIME", DateUtil.date2Str(new Date()));
        hiddenexamineService.edit(pd);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 列表
     *
     * @param page
     * @throws Exception
     */
    @RequestMapping(value = "/list")
    // @RequiresPermissions("hiddenexamine:list")
    @ResponseBody
    public Object list(Page page) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        String KEYWORDS = pd.getString("KEYWORDS");                        //关键词检索条件
        String STARTTIME = pd.getString("STARTTIME"); // 隐患发现时间
        if (Tools.notEmpty(STARTTIME))
            pd.put("STARTTIME", STARTTIME.trim());
        if (Tools.notEmpty(KEYWORDS)) pd.put("KEYWORDS", KEYWORDS.trim());
        String ENDTIME = pd.getString("ENDTIME"); // 隐患发现时间
        if (Tools.notEmpty(ENDTIME))
            pd.put("ENDTIME", ENDTIME + " 23:59:59");
        pd.put("CORPINFO_ID", Jurisdiction.getCORPINFO_ID());
        if ("2".equals(pd.getString("keyIsSpecial"))) {
            pd.put("CONFIRM_USER", Jurisdiction.getUSER_ID());
        }
//		pd.put("CONFIRM_USER",Jurisdiction.getUSER_ID());
        pd = Jurisdiction.getUserDataJurisdiction(pd);
        page.setPd(pd);
        List<PageData> varList = hiddenexamineService.listAndHidden(page);    //列出HiddenExamine列表

        varList = hiddenUserService.getHiddebFind(varList);
        map.put("varList", varList);
        map.put("page", page);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 去修改页面获取数据
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/goEdit")
    // @RequiresPermissions("hiddenexamine:edit")
    @ResponseBody
    public Object goEdit() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        pd = hiddenexamineService.findByIdAndHidden(pd);    //根据ID读取
        List<PageData> checkList = hiddenCheckService.listAll(pd); // 隐患验收信息
        if (checkList != null && checkList.size() > 0) {
            PageData pd3 = new PageData();
            pd3.put("TYPE", 5);
            for (PageData check : checkList) {
                pd3.put("FOREIGN_KEY", check.get("HIDDENCHECK_ID"));
                check.put("cImgs", imgFilesService.listAll(pd3));// 验收图片
            }
        }
        List<PageData> hiddenExa = hiddenexamineService.listAllByHiddenId(pd.getString("HIDDEN_ID")); //特殊审批信息
        for (PageData pageData : hiddenExa) {
            if ("0".equals(pageData.getString("TYPE"))) {
                pd.put("editUserName", pageData.get("editUserName"));
                pd.put("editDeptName", pageData.get("editDeptName"));
                pd.put("editLevelName", pageData.get("editLevelName"));
                pd.put("editRectificationDeadline", pageData.get("spare3"));
            }
        }
        if (pd != null) {
            map.put("rImgs", imgFilesService.getListByKeyAndType(pd.getString("HIDDEN_ID"), "4"));// 整改图片
        }
        PageData hs = hiddenSchemeService.findByHdId(pd);
        List<PageData> sImgs = imgFilesService.getListByKeyAndType(pd.get("HIDDEN_ID"), "8");
        if (hs != null && hs.getString("HIDDENSCHEME_ID") != null) {
            PageData pd31 = new PageData();
            pd31.put("FOREIGN_KEY", hs.getString("HIDDENSCHEME_ID"));
            pd31.put("TYPE", 8);
            List<PageData> sImgs2 = imgFilesService.listAll(pd31);// 方案图片
            sImgs.addAll(sImgs2);
        }
        List<PageData> hiddenFindPeople = hiddenUserService.listAll(pd);// 隐患相关人员信息 --隐患发现人
        map.put("hiddenExa", hiddenExa); //
        map.put("checkList", checkList);
        map.put("hs", hs);
        map.put("sImgs", sImgs);
        map.put("hiddenVideo", imgFilesService.getListByKeyAndType(pd.getString("HIDDEN_ID"), "102"));// 隐患视频
        map.put("hImgs", imgFilesService.getListByKeyAndType(pd.getString("HIDDEN_ID"), "3"));// 隐患图片
        map.put("pd", pd);
        map.put("hiddenFindPeople", hiddenFindPeople);
        map.put("result", errInfo);
        return map;
    }

    /**
     * 批量删除
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/deleteAll")
    // @RequiresPermissions("hiddenexamine:del")
    @ResponseBody
    public Object deleteAll() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        String DATA_IDS = pd.getString("DATA_IDS");
        if (Tools.notEmpty(DATA_IDS)) {
            String ArrayDATA_IDS[] = DATA_IDS.split(",");
            hiddenexamineService.deleteAll(ArrayDATA_IDS);
            errInfo = "success";
        } else {
            errInfo = "fail";
        }
        map.put("result", errInfo);                //返回结果
        return map;
    }

    /**
     * 导出到excel
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/excel")
    // @RequiresPermissions("toExcel")
    public ModelAndView exportExcel() throws Exception {
        ModelAndView mv = new ModelAndView();
        PageData pd = new PageData();
        pd = this.getPageData();
        Map<String, Object> dataMap = new HashMap<String, Object>();
        List<String> titles = new ArrayList<String>();
        titles.add("隐患ID");    //1
        titles.add("审核原因");    //2
        titles.add("创建人");    //3
        titles.add("创建时间");    //4
        titles.add("修改人");    //5
        titles.add("修改时间");    //6
        titles.add("1,特殊审核。2.延期审核");    //7
        dataMap.put("titles", titles);
        List<PageData> varOList = hiddenexamineService.listAll(pd);
        List<PageData> varList = new ArrayList<PageData>();
        for (int i = 0; i < varOList.size(); i++) {
            PageData vpd = new PageData();
            vpd.put("var1", varOList.get(i).getString("HIDDEN_ID"));        //1
            vpd.put("var2", varOList.get(i).getString("EXAMINE"));        //2
            vpd.put("var3", varOList.get(i).getString("CREATOR"));        //3
            vpd.put("var4", varOList.get(i).getString("CREATTIME"));        //4
            vpd.put("var5", varOList.get(i).getString("OPERATOR"));        //5
            vpd.put("var6", varOList.get(i).getString("OPERATTIME"));        //6
            vpd.put("var7", varOList.get(i).get("STATE").toString());    //7
            varList.add(vpd);
        }
        dataMap.put("varList", varList);
        ObjectExcelView erv = new ObjectExcelView();
        mv = new ModelAndView(erv, dataMap);
        return mv;
    }

    /**
     * 隐患延时确认
     * 1.找到延时信息
     * 2.修改隐患完成时间
     *
     * @throws Exception
     */
    @RequestMapping(value = "/delayedExamine")
    @RequiresPermissions("hidden:edit")
    @ResponseBody
    @DockAnnotation()
    public Object delayedExamine() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        PageData hiddenExa = hiddenexamineService.findById(pd);
        if (Tools.isEmpty(hiddenExa)) {
            errInfo = "ERROR";
            map.put("pd", pd);
            map.put("result", errInfo);
            map.put("msg", "未找到该隐患的审批信息,请联系管理员确认!");
            return map;
        }
        hiddenExa.put("OPERATTIME", DateUtil.date2Str(new Date()));
        hiddenService.updateHiddenRectificationDeadline(hiddenExa); // 修改隐患的整改期限
        hiddenExa.put("STATE", pd.getString("STATE"));
        pd.put("OPERATOR", Jurisdiction.getUSER_ID());
        pd.put("OPERATTIME", DateUtil.date2Str(new Date()));
        hiddenexamineService.edit(hiddenExa);

        if (Tools.isEmpty(hiddenExa)) {
        } else {
            pd.put("HIDDEN_ID", hiddenExa.getString("HIDDEN_ID"));
            PageData hiddenpd = hiddenService.findById(pd);
            messageService.sendMessageByParameter("HIDDEN_MAIL_007", "友情提示:有一条隐患需要确认", hiddenpd.getString("CORPINFO_ID"),
                    hiddenpd.getString("RECTIFICATIONOR"), pd.getString("HIDDEN_ID"),
                    hiddenpd.getString("HIDDENDESCR"), "隐患整改", "确认", "", "");
        }
        map.put("result", errInfo);
        map.put("dockData", JSON.toJSONString(pd));
        return map;
    }

    /**
     * 延时申请
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/delayed")
    @ResponseBody
    @Transactional
    public Object delayed(@RequestParam(value = "FFILE", required = false) MultipartFile file) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();

        PageData examine = new PageData();
        examine.put("TYPE", "2");
        examine.put("STATE", "-1");
        examine.put("CREATTIME", DateUtil.date2Str(new Date()));
        examine.put("EXAMINE", pd.getString("TEMPORARY_MEASURES")); //临时措施
        examine.put("DISPOSAL_PLAN", pd.getString("disposalPlan")); //临时措施
        examine.put("DELAY_TIME", pd.getString("DELAY_TIME")); //申请延期日期
        examine.put("HIDDEN_ID", pd.getString("HIDDEN_ID"));

        if (file != null) {
            String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1).toLowerCase();
            if (!"pdf".equals(suffixName) && !"jpg".equals(suffixName) && !"jpeg".equals(suffixName) && !"png".equals(suffixName) && !"mp4".equals(suffixName)) {
                errInfo = "fail";
                map.put("result", errInfo);
                map.put("msg", "文件格式不正确!");
                return map;
            }
            String ffile = DateUtil.getDays();
            String fileName = this.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            Smb.sshSftp(file, fileName, Const.FILEPATHYHTP + Jurisdiction.getCORPINFO_ID() + "/" + ffile);
            examine.put("DISPOSAL_FILE", Const.FILEPATHYHTP + Jurisdiction.getCORPINFO_ID() + "/" + ffile + "/" + fileName);
        }
        examine = hiddenexamineService.save(examine);

        pd.put("HIDDEN_ID", pd.getString("HIDDEN_ID"));
        PageData hiddenpd = hiddenService.findById(pd);
        messageService.sendMessageByParameter("HIDDEN_MAIL_007", "友情提示:有一条隐患需要延期审核",
                Jurisdiction.getCORPINFO_ID(), hiddenpd.getString("CONFIRM_USER"), pd.getString("HIDDEN_ID"),
                hiddenpd.getString("HIDDENDESCR"), "延期审核", "审核", "", "");


        map.put("result", errInfo);
        map.put("msg", "隐患延期申成功。请通知隐患确认人进行延期确认操作!");
        return map;
    }

    /**
     * 特殊处理申请
     *
     * @param
     * @throws Exception
     */
    @RequestMapping(value = "/special")
    @ResponseBody
    @Transactional
    public Object special() throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();

        PageData examine = new PageData();
        examine.put("TYPE", "1");
        examine.put("STATE", "-1");
        examine.put("EXAMINE", pd.getString("disposalPlan")); //临时措施
        examine.put("HIDDEN_ID", pd.getString("HIDDEN_ID"));
        examine = hiddenexamineService.save(examine);
        hiddenService.updateStateByHidden("7", pd.getString("HIDDEN_ID"));
        PageData hiddenPd = hiddenService.findById(pd);
        if (Tools.notEmpty(hiddenPd.getString("CONFIRM_USER"))) {
            messageService.sendMessageByParameter("HIDDEN_MAIL_007", "友情提示:有一条隐患需要特殊审核",
                    Jurisdiction.getCORPINFO_ID(), hiddenPd.getString("CONFIRM_USER"), hiddenPd.getString("HIDDEN_ID"),
                    hiddenPd.getString("HIDDENDESCR"), "特殊处置审核", "审核", "", "");


        }
        map.put("result", errInfo);
        map.put("msg", "隐患特殊处理申请成功。请通知隐患确认人进行特殊处理确认操作!");
        return map;
    }


    /**
     * 特殊处理审核
     * 1.找到延时信息
     * 2.修改隐患完成时间
     *
     * @throws Exception
     */
    @RequestMapping(value = "/specialExamine")
    @RequiresPermissions("hidden:edit")
    @ResponseBody
    @DockAnnotation
    public Object specialExamine(@RequestParam(value = "FFILE", required = false) MultipartFile file) throws Exception {
        Map<String, Object> map = new HashMap<String, Object>();
        String errInfo = "success";
        PageData pd = new PageData();
        pd = this.getPageData();
        PageData hiddenExa = hiddenexamineService.findById(pd); // 获取该隐患的未通过的隐患信息
        PageData hidden = hiddenService.findById(hiddenExa);
        if (Tools.isEmpty(hiddenExa)) {
            errInfo = "ERROR";
            map.put("pd", pd);
            map.put("result", errInfo);
            map.put("msg", "未找到该隐患的审批信息错误,请联系管理员确认!");
            return map;
        }
        if ("1".equals(pd.getString("TYPE"))) { //通过
            if (file != null) {
                String suffixName = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1).toLowerCase();
                if (!"pdf".equals(suffixName) && !"jpg".equals(suffixName) && !"jpeg".equals(suffixName) && !"png".equals(suffixName) && !"mp4".equals(suffixName)) {
                    errInfo = "fail";
                    map.put("result", errInfo);
                    map.put("msg", "文件格式不正确!");
                    return map;
                }
                String ffile = DateUtil.getDays();
                String fileName = this.get32UUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
                Smb.sshSftp(file, fileName, Const.FILEPATHYHTP + Jurisdiction.getCORPINFO_ID() + "/" + ffile);
                hiddenExa.put("DISPOSAL_FILE", Const.FILEPATHYHTP + Jurisdiction.getCORPINFO_ID() + "/" + ffile + "/" + fileName);
            }
            hiddenExa.put("DISPOSAL_PLAN", pd.get("disposalPlan"));
            hiddenExa.put("STATE", "2");
            hiddenExa.put("OPERATOR", Jurisdiction.getUSER_ID());
            hiddenExa.put("OPERATTIME", DateUtil.date2Str(new Date()));
            hiddenexamineService.updateBySpecial(hiddenExa);
            hiddenService.updateStateByHidden("8", hiddenExa.getString("HIDDEN_ID")); //修改隐患状态 -- 特殊审核通过
            hiddenExa.put("TYPE", pd.getString("TYPE"));

            String synpsis, parameter1 = "";
            if (pd.get("TYPE").equals("1")) {
                synpsis = "友情提示:有一条特殊处置隐患审核通过";
                parameter1 = "审核通过";
            } else {
                synpsis = "友情提示:有一条隐患验收不合格";
                parameter1 = "验收不合格";
            }

            messageService.sendMessageByParameter("HIDDEN_MAIL_008", synpsis,
                    Jurisdiction.getCORPINFO_ID(), hidden.getString("RECTIFICATIONOR"), hidden.getString("HIDDEN_ID"),
                    hidden.getString("HIDDENDESCR"), parameter1, "", "", "");
            applicationContext.publishEvent(new DeviceHiddenEvent(new Object(), hiddenExa.getString("HIDDEN_ID"), "0"));
            if (Tools.notEmpty(hidden.getString("FOREIGN_ID"))) {    //安全环保检查验收
                pd.put("ACCEPTSTEP", 6);
                List<PageData> list = hiddenService.listOtherNotAccept(pd); //获取没有验收的隐患
                PageData inspection = new PageData();
                if (list.size() == 0) { //CREATOR
                    inspection.put("INSPECTION_ID", hidden.getString("FOREIGN_ID"));
                    inspection.put("OPERATOR", Jurisdiction.getUSER_ID());
                    inspection.put("OPERATTIME", DateUtil.date2Str(new Date()));
                    inspection.put("INSPECTION_STATUS", "6");    // 已验收
                    safetyenvironmentalService.editStatus(inspection);
                    inspection.put("HIDDEN_vector", hidden.getString("HIDDEN_ID"));
                }
                inspection.put("INSPECTION_ID", hidden.getString("FOREIGN_ID"));
                inspection.put("OPERATOR", Jurisdiction.getUSER_ID());
                inspection.put("HIDDEN_vector", hidden.getString("HIDDEN_ID"));
                noticeUtil.SE_ThreeStepUtil(inspection);
            }
        } else if ("2".equals(pd.getString("TYPE"))) { // 不通过
            hiddenExa.put("spare1", "0");
            if ("1".equals(pd.getString("isChange"))) {  // 修改整改负责人
                hiddenExa.put("spare1", "1");
                hiddenExa.put("spare2", pd.getString("OLD_RECTIFICATIONOR"));
                hiddenExa.put("spare3", pd.getString("OLD_RECTIFICATIONDEPT"));
                hiddenExa.put("NEW_RECTIFICATIONOR", pd.getString("changeUser"));
                hiddenService.updateRectificationUserId(pd.getString("changeUser"), pd.getString("changeUserDepartment"), hiddenExa.getString("HIDDEN_ID"), pd.getString("RECTIFICATIONDEADLINE"));
            }
            hiddenService.updateStateByHidden("1", hiddenExa.getString("HIDDEN_ID")); //打回 原路返回
            hiddenExa.put("STATE", "1");
            hiddenExa.put("OPERATOR", Jurisdiction.getUSER_ID());
            hiddenExa.put("OPERATTIME", DateUtil.date2Str(new Date()));
            hiddenexamineService.updateBySpecial(hiddenExa);
            hiddenService.editstate(hiddenExa);
            pd.put("HIDDEN_ID", hiddenExa.getString("HIDDEN_ID"));
            String messUserID = "";
            if ("0".equals(pd.getString("isChange"))) {
                messUserID = pd.getString("OLD_RECTIFICATIONOR");    // 申请人
            } else {
                messUserID = pd.getString("changeUser");    // 申请人
            }
            messageService.sendMessageByParameter("HIDDEN_MAIL_008", "友情提示:有一条特殊处置隐患审核不通过",
                    Jurisdiction.getCORPINFO_ID(), messUserID, hidden.getString("HIDDEN_ID"),
                    hidden.getString("HIDDENDESCR"), "审核不通过,请及时整改隐患", "", "", "");
        }
        map.put("pd", pd);
        map.put("result", errInfo);
        map.put("dockData",JSON.toJSONString(pd));
        return map;
    }
}