package com.ruoyi.project.sems.controller;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.document.ZipUtil;
import com.ruoyi.common.utils.file.ExcelUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.config.RuoYiConfig;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.security.service.TokenService;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.project.common.domain.TCommonfile;
import com.ruoyi.project.common.service.ITCommonfileService;
import com.ruoyi.project.sems.domain.ParamData;
import com.ruoyi.project.sems.domain.TSpecCheck;
import com.ruoyi.project.sems.domain.TSpecdevDzsb;
import com.ruoyi.project.sems.his.controller.TApproveSpecModifyController;
import com.ruoyi.project.sems.his.controller.TSpechiDzsbController;
import com.ruoyi.project.sems.his.domain.TApproveSpecModify;
import com.ruoyi.project.sems.his.service.ITApproveSpecModifyService;
import com.ruoyi.project.sems.mapper.TSpecdevDzsbMapper;
import com.ruoyi.project.sems.service.ITSpecCheckService;
import com.ruoyi.project.sems.service.ITSpecdevDzsbService;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysDictData;
import com.ruoyi.project.system.domain.SysPlant;
import com.ruoyi.project.system.domain.TAlarmtype;
import com.ruoyi.project.system.mapper.SysPlantMapper;
import com.ruoyi.project.system.service.ISysDeptService;
import com.ruoyi.project.system.service.ISysDictTypeService;
import com.ruoyi.project.system.service.ITAlarmtypeService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.runtime.ProcessInstance;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;

/**
 * 特种设备吊装设备台账Controller
 *
 * @author ruoyi
 * @date 2021-07-26
 */
@RestController
@RequestMapping("/sems/specDzsb")
public class TSpecdevDzsbController extends BaseController {
    @Autowired
    private ITSpecdevDzsbService tSpecdevDzsbService;
    @Autowired
    private ITSpecCheckService tSpecCheckService;
    @Autowired
    private ISysDeptService iSysDeptService;
    @Autowired
    private ISysDictTypeService iSysDictTypeService;
    @Autowired
    private ITApproveSpecModifyService tApproveSpecModifyService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TApproveSpecModifyController approveSpecModifyController;
    @Autowired
    private TSpechiDzsbController tSpechiDzsbController;
    //注入特种设备预警接口
    @Autowired
    private ITAlarmtypeService tAlarmtypeService;
    @Resource
    private SysPlantMapper sysPlantMapper;
    @Resource
    private TSpecdevDzsbMapper tSpecdevDzsbMapper;
    @Autowired
    private ITCommonfileService tCommonfileService;
    /**
     * 查询特种设备吊装设备台账列表
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:list')")
    @GetMapping("/list")
    public TableDataInfo list(TSpecdevDzsb tSpecdevDzsb) {
        startPage();
        List<TSpecdevDzsb> list = tSpecdevDzsbService.selectTSpecdevDzsbList(tSpecdevDzsb);
        return getDataTable(list);
    }

    /**
     * 导出特种设备吊装设备台账列表
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:export')")
    @Log(title = "特种设备吊装设备台账", businessType = BusinessType.EXPORT)
    @GetMapping("/export")
    public AjaxResult export(TSpecdevDzsb tSpecdevDzsb) {
        List<TSpecdevDzsb> list = tSpecdevDzsbService.selectTSpecdevDzsbList(tSpecdevDzsb);
        ExcelUtil<TSpecdevDzsb> util = new ExcelUtil<TSpecdevDzsb>(TSpecdevDzsb.class);
        return util.exportExcel(list, "specDzsb");
    }

    /**
     * 获取特种设备吊装设备台账详细信息
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
        return AjaxResult.success(tSpecdevDzsbService.selectTSpecdevDzsbById(id));
    }

    /**
     * 新增特种设备吊装设备台账
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:add')")
    @Log(title = "特种设备吊装设备台账", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody TSpecdevDzsb tSpecdevDzsb) {
        tSpecdevDzsb.setApproveStatus(22l);
        tSpecdevDzsbService.insertTSpecdevDzsb(tSpecdevDzsb);

        TApproveSpecModify tApproveSpecModify = new TApproveSpecModify();
        Long userid = getUserId();
        tApproveSpecModify.setUserId(userid);
        tApproveSpecModify.setApproveType(3l);
        tApproveSpecModify.setDevType(3l);
        tApproveSpecModify.setDevId(String.valueOf(tSpecdevDzsb.getId()));
        //审批编号
        Date dt = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        String data = sdf.format(dt) + userid;
        tApproveSpecModify.setApNo(data);
        //
        Authentication.setAuthenticatedUserId(userid.toString());
        tApproveSpecModifyService.insertTApproveSpecModify(tApproveSpecModify);
        long bussniseeKey = tApproveSpecModify.getId();
        //开始工作流、监听
        Map<String, Object> variables = new HashMap<>();
        variables.put("applyUser", userid.toString());
        variables.put("wxjlusers", tSpecdevDzsb.getWxjl());
        //采用key来启动流程定义并设置流程变量，返回流程实例
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("semsAddDelProcess", String.valueOf(bussniseeKey), variables);
        logger.info("流程部署id：" + pi.getDeploymentId());
        logger.info("流程定义id：" + pi.getProcessDefinitionId());
        logger.info("流程实例id：" + pi.getProcessInstanceId());
        tApproveSpecModify.setProcessId(pi.getProcessInstanceId());
        new Thread(() -> {
            approveSpecModifyController.sendMail(tApproveSpecModify , tSpecdevDzsb.getWxjl());
        },"发送邮件").start();

        LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
        String userName =loginUser != null? loginUser.getUsername(): "";
        new Thread(() -> {
            tSpechiDzsbController.addOperLog(String.valueOf(tSpecdevDzsb.getId()),userName,new Date() , "新增申请" );
        },"特种设备操作日志").start();

        return AjaxResult.success();
    }

    /**
     * 修改特种设备吊装设备台账
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:edit')")
    @Log(title = "特种设备吊装设备台账", businessType = BusinessType.UPDATE)
    @PutMapping
    public AjaxResult edit(@RequestBody TSpecdevDzsb tSpecdevDzsb) {
        TSpecdevDzsb old = tSpecdevDzsbService.selectTSpecdevDzsbById(tSpecdevDzsb.getId());
        if (StringUtils.isNotEmpty(tSpecdevDzsb.getReportNo()) && !tSpecdevDzsb.getReportNo().equals(old.getReportNo())) {
            TSpecCheck tc = new TSpecCheck();
            tc.setDevType(3l);
            tc.setCheckUnit(tSpecdevDzsb.getCheckUnit());
            tc.setDevId(tSpecdevDzsb.getId());
            tc.setNextWarnDate(tSpecdevDzsb.getNextWarnDate());
            tc.setReportNo(tSpecdevDzsb.getReportNo());
            tc.setWarnDate(tSpecdevDzsb.getWarnDate());
            tc.setCheckConclusion(tSpecdevDzsb.getPerTestConclusion());
            tSpecCheckService.insertTSpecCheck(tc);
        }
        tSpecdevDzsbService.updateTSpecdevDzsb(tSpecdevDzsb);
        LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
        String userName =loginUser != null? loginUser.getUsername(): "";
        new Thread(() -> {
            tSpechiDzsbController.addOperLog(String.valueOf(tSpecdevDzsb.getId()),userName,new Date() , "修改" );
        },"特种设备操作日志").start();
        new Thread(() -> {
            this.checkWarnflag();
        },"特种设备warnflag更新").start();
        return AjaxResult.success();
    }

    /**
     * 修改特种设备吊装设备台账
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:edit')")
    @Log(title = "特种设备吊装设备台账", businessType = BusinessType.UPDATE)
    @PutMapping("/editBatch")
    public AjaxResult editBatch(@RequestBody TSpecdevDzsb tSpecdevDzsb) {
        tSpecdevDzsbMapper.updateTSpecdevDzsbByIds(tSpecdevDzsb);
        return AjaxResult.success();
    }

    /**
     * 删除特种设备吊装设备台账
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:remove')")
    @Log(title = "特种设备吊装设备台账", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids) {
        return toAjax(tSpecdevDzsbService.deleteTSpecdevDzsbByIds(ids));
    }

    /**
     * 去重
     */
    @PreAuthorize("@ss.hasRole('admin')")
    @Log(title = "特种设备起重机械台账去重", businessType = BusinessType.OTHER)
    @GetMapping("/duplicate")
    public AjaxResult duplicate() {
        tSpecdevDzsbService.duplicateTSpecdevDzsb();
        return AjaxResult.success();
    }

    /**
     * 批量导入
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:add')")
    @Log(title = "特种设备批量导入", businessType = BusinessType.INSERT)
    @PostMapping("/importData")
    public AjaxResult importData(@RequestParam("file") MultipartFile file,@RequestParam("wxjl") String wxjl) throws IOException {
        //获取操作人员ID
        Long userId = getUserId();
        //报错行数统计
        List<Integer> failRow = new ArrayList<Integer>();
        Workbook workbook = ExcelUtils.getWorkBook(file);
        Sheet sheet = workbook.getSheetAt(0);
        List<TSpecdevDzsb> list = new ArrayList<TSpecdevDzsb>();
        //字典查询
        List<SysDictData> plant = iSysDictTypeService.selectDictDataByType("PLANT_DIVIDE");
        List<SysPlant> plants =  sysPlantMapper.selectSysPlantList(new SysPlant());
        //部门查询
        List<SysDept> dept = iSysDeptService.selectDeptList(new SysDept());
        int rowNum = sheet.getPhysicalNumberOfRows();
        logger.info("rowNum:" + rowNum);
        int failNumber = 0;
        for (int i = 1; i < rowNum; i++) {
            try {
                logger.info("读取行数：" + i);
                Row row = sheet.getRow(i);
                int cellNum = row.getLastCellNum();
                logger.info("cellNum:" + cellNum);
                TSpecdevDzsb entity = new TSpecdevDzsb();
                for (int j = 0; j <= cellNum; j++) {
                    Cell cell = row.getCell(j);
                    if (cell == null) {
                        continue;
                    }
                    String cellValue = ExcelUtils.getCellValue(cell);
                    logger.info("cellValue:" + cellValue);
                    if (j == 0) {
                        //序号
                    } else if (j == 1) {
                        entity.setPlantCode(cellValue);//装置
                        //判断是否存在的plant
                        boolean found = false;
                        for (SysPlant p : plants) {
                            if (p.getName().equals(cellValue)) {
                                found = true;
                                break;
                            }
                        }
                        if (!found) {
                            //未发现plant
                            throw new Exception("未发现plant");
                        }
                    } else if (j == 2) {
                        entity.setUnit(cellValue);//装置维修组
                    } else if (j == 3) {
                        entity.setPlantMaint(cellValue);//装置维修组
                    } else if (j == 4) {
                        entity.setEngineer(cellValue);//装置维修工程师
                    } else if (j == 5) {
                        entity.setDevname(cellValue);//设备名称
                    } else if (j == 6) {
                        entity.setDevno(cellValue);//设备位号
                    } else if (j == 7) {
                        entity.setDocno(cellValue);//档案号
                    } else if (j == 8) {
                        entity.setFactoryNo(cellValue);//出厂编号
                    } else if (j == 9) {
                        entity.setModel(cellValue);//设备型号
                    } else if (j == 10) {
                        entity.setCapacity(cellValue);//起吊重量
                    } else if (j == 11) {
                        entity.setLocation(cellValue);//设备使用地点
                    } else if (j == 12) {
                        entity.setRegno(cellValue);//设备注册编号
                    } else if (j == 13) {
                        entity.setDevCode(cellValue);//设备代码
                    } else if (j == 14) {
                        if (cellValue.length() > 3) {//投用日期
                            entity.setSubmitdate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                        }
                    } else if (j == 15) {
                        entity.setCreateUnit(cellValue);//制造单位
                    } else if (j == 16) {
                        entity.setIsEx(cellValue);//是否防爆
                    } else if (j == 17) {
                        entity.setCheckStrategy(cellValue);//检验策略
                    } else if (j == 18) {
                        entity.setCheckUnit(cellValue);//检验单位
                    } else if (j == 19) {
                        if (cellValue.length() > 3) {//检验日期
                            entity.setWarnDate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                        }
                    } else if (j == 20) {
                        entity.setReportNo(cellValue);//报告编号
                    } else if (j == 21) {
                        if (cellValue.length() > 3) {//下次到期日期
                            entity.setNextWarnDate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                        }
                    } else if (j == 22) {    //检验结论
                        entity.setPerTestConclusion(cellValue);
                    } else if (j == 23) {
                        entity.setRemarks(cellValue);//备注
                    }else if (j == 24) {
                        entity.setRemarks2(cellValue);//备注2
                    }/*else if (j == 20) {
                        for (SysDept d : dept) {
                            if (d.getDeptName().equals(cellValue)) {
                                entity.setDeptId(d.getDeptId());//部门编号
                            }
                        }
                    }*/

                }
                entity.setCreaterCode(userId);
                logger.info("entity:" + JSON.toJSONString(entity));
                if(entity.getPlantCode() == null) {
                    //未发现plant
                    throw new Exception("plant为空");
                }
                list.add(entity);
            } catch (Exception e) {
                failNumber++;
                logger.error("e:" + JSON.toJSONString(e));
                failRow.add(i + 1);
            }
        }
        int successNumber = 0;
        int failNum = 0;
        CopyOnWriteArrayList<String> ids = new CopyOnWriteArrayList();
        for (TSpecdevDzsb t : list
        ) {
            failNum++;
            try {
                t.setApproveStatus(22l);
                tSpecdevDzsbService.insertTSpecdevDzsb(t);
                ids.add(t.getId().toString());
                successNumber++;
            } catch (Exception e) {
                failNumber++;
                logger.error("e:" + e);
                failRow.add(failNum + 1);
            }
        }
        //申请流程
        String devIds = StringUtils.join(ids.toArray(),",");
        TApproveSpecModify tApproveSpecModify = new TApproveSpecModify();
        Long userid = getUserId();
        tApproveSpecModify.setUserId(userid);
        tApproveSpecModify.setApproveType(3l);
        tApproveSpecModify.setDevType(3l);
        tApproveSpecModify.setDevId(devIds);
        //审批编号
        Date dt = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        String data = sdf.format(dt) + userid;
        tApproveSpecModify.setApNo(data);
        //
        Authentication.setAuthenticatedUserId(userid.toString());
        tApproveSpecModifyService.insertTApproveSpecModify(tApproveSpecModify);
        long bussniseeKey = tApproveSpecModify.getId();
        //开始工作流、监听
        Map<String, Object> variables = new HashMap<>();
        variables.put("applyUser", userid.toString());
        variables.put("wxjlusers", wxjl);
        //采用key来启动流程定义并设置流程变量，返回流程实例
        ProcessInstance pi = runtimeService.startProcessInstanceByKey("semsAddDelProcess", String.valueOf(bussniseeKey), variables);
        logger.info("流程部署id：" + pi.getDeploymentId());
        logger.info("流程定义id：" + pi.getProcessDefinitionId());
        logger.info("流程实例id：" + pi.getProcessInstanceId());
        tApproveSpecModify.setProcessId(pi.getProcessInstanceId());
        new Thread(() -> {
            approveSpecModifyController.sendMail(tApproveSpecModify , wxjl);
        },"发送邮件").start();

        LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
        String userName =loginUser != null? loginUser.getUsername(): "";
        new Thread(() -> {
            tSpechiDzsbController.addOperLog(ids.toArray(),userName,new Date() , "新增申请" );
        },"特种设备操作日志").start();

        logger.info("list:" + JSON.toJSONString(list));
        logger.info("successNumber:" + String.valueOf(successNumber));
        logger.info("failNumber:" + String.valueOf(failNumber));
        logger.info("failRow:" + String.valueOf(failRow));
        return AjaxResult.success(String.valueOf(successNumber), failRow);
    }

    /**
     * 批量导入
     * 检验更新中的批量导入
     */
    @PreAuthorize("@ss.hasPermi('sems:specDzsb:add')")
    @Log(title = "特种设备批量导入", businessType = BusinessType.INSERT)
    @PostMapping("/updateData")
    public AjaxResult updateData(@RequestParam("file") MultipartFile file) throws IOException, ParseException {
        //获取操作人员ID
        Long userId = getUserId();
        //报错行数统计
        List<Integer> failRow = new ArrayList<Integer>();
        Workbook workbook = ExcelUtils.getWorkBook(file);
        Sheet sheet = workbook.getSheetAt(0);
        List<TSpecdevDzsb> list = new ArrayList<TSpecdevDzsb>();
        List<TSpecdevDzsb> oldList = new ArrayList<TSpecdevDzsb>();
        TSpecdevDzsb oldEntity = new TSpecdevDzsb();
        //字典查询
        List<SysDictData> plant = iSysDictTypeService.selectDictDataByType("PLANT_DIVIDE");
        //部门查询
        List<SysDept> dept = iSysDeptService.selectDeptList(new SysDept());
        int rowNum = sheet.getPhysicalNumberOfRows();
        int failNumber = 0;
        for (int i = 1; i < rowNum; i++) {
//            try {
            logger.info("读取行数：" + i);
            Row row = sheet.getRow(i);
            int cellNum = row.getLastCellNum();
            TSpecdevDzsb entity = new TSpecdevDzsb();
            for (int j = 0; j < cellNum; j++) {
                Cell cell = row.getCell(j);
                if (cell == null) {
                    continue;
                }
                String cellValue = ExcelUtils.getCellValue(cell);
                logger.info("cellValue:" + cellValue);

                if (j == 0) {
                    //序号
                    Double d = Double.parseDouble(cellValue);
                    long s = new Double(d).longValue();
                    entity.setId(s);
                } else if (j == 1) {    //装置
                    entity.setPlantCode(cellValue);
                } else if (j == 3) {    //设备位号
                    entity.setDevno(cellValue);
                } else if (j == 4) {    //档案号
                    entity.setDocno(cellValue);
                } else if (j == 2) {    //设备名称
                    entity.setDevname(cellValue);
                } else if (j == 5) {    //检验单位
                    entity.setCheckUnit(cellValue);
                } else if (j == 6) {    //检验日期
                    logger.info("日期格式：" + cellValue);
                    if (cellValue.length() > 3) {
                        entity.setWarnDate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                    }
                } else if (j == 7) {    //报告编号
                    entity.setReportNo(cellValue);
                } else if (j == 8) {    //下次检验日期
                    logger.info("日期格式：" + cellValue);
                    if (cellValue.length() > 3) {
                        entity.setNextWarnDate(new SimpleDateFormat(DateUtils.getDateFormat(cellValue)).parse(cellValue));
                    }
                } else if (j == 9) {    //
                    entity.setPerTestConclusion(cellValue);
                }else if (j == 10) {    //
                    entity.setRemarks(cellValue);
                }else if (j == 11) {    //
                    entity.setRemarks2(cellValue);
                }
            }
            logger.info("entity:" + JSON.toJSONString(entity));
            list.add(entity);
            oldEntity = entity;
            oldList.add(oldEntity);
//            }catch (Exception e){
//                failNumber++;
//                logger.info("e:" + JSON.toJSONString(e));
//                failRow.add(i + 1);
//            }
        }
        int successNumber = 0;
        int failNum = 0;
        List<String> ids = new ArrayList<>();
        for (TSpecdevDzsb t : list) {
            failNum++;
            try {
                tSpecdevDzsbService
                        .update(t,
                                new QueryWrapper<TSpecdevDzsb>()
                                        .eq("DOCNO", t.getDocno())
                                        .eq("PLANT_CODE", t.getPlantCode())
                        );
                successNumber++;
                ids.add(t.getId().toString());
            } catch (Exception e) {
                failNumber++;
                logger.error("e:" + e);
                failRow.add(failNum + 1);
                e.printStackTrace();
            }
        }
        for (TSpecdevDzsb t : oldList) {
            try {
                TSpecCheck tc = new TSpecCheck();
                tc.setDevType(3l);
                tc.setCheckUnit(t.getCheckUnit());
                tc.setDevId(t.getId());
                tc.setNextWarnDate(t.getNextWarnDate());
                tc.setReportNo(t.getReportNo());
                tc.setWarnDate(t.getWarnDate());
                tc.setCheckConclusion(t.getPerTestConclusion());
                tSpecCheckService.insertTSpecCheck(tc);
            } catch (Exception e) {
                logger.error("e:" + e);
                e.printStackTrace();
            }

        }
        LoginUser loginUser = SpringUtils.getBean(TokenService.class).getLoginUser(ServletUtils.getRequest());
        String userName =loginUser != null? loginUser.getUsername(): "";
        new Thread(() -> {
            tSpechiDzsbController.addOperLog(ids.toArray(),userName,new Date() , "批量更新" );
        },"特种设备操作日志").start();
        new Thread(() -> {
            this.checkWarnflag();
        },"特种设备warnflag更新").start();
        logger.info("list:" + JSON.toJSONString(list));
        logger.info("successNumber:" + String.valueOf(successNumber));
        logger.info("failNumber:" + String.valueOf(failNumber));
        logger.info("failRow:" + String.valueOf(failRow));
        return AjaxResult.success(String.valueOf(successNumber), failRow);
    }

    @GetMapping("/exportDevList")
    public AjaxResult exportbmy(ParamData params) throws IOException {
        logger.info(JSON.toJSONString(params));
        String id = params.getIds();
        String[] ids = id.split(",");
        List<TSpecdevDzsb> list = new ArrayList<>();
        for (String i : ids
        ) {
            TSpecdevDzsb t = tSpecdevDzsbService.getById(i);
            list.add(t);
        }
        SXSSFWorkbook wb = new SXSSFWorkbook(1000);
        CellStyle wrapStyle = wb.createCellStyle();
        wrapStyle.setWrapText(true);    //设置自动换行
        //创建sheet页
        Sheet sheet = wb.createSheet("sheet1");
        //设置列的宽度，第一个参数为列的序号，从0开始，第二参数为列宽，单位1/256个字节
        sheet.setColumnWidth(0, 12 * 256);
        sheet.setColumnWidth(1, 26 * 256);
        sheet.setColumnWidth(2, 26 * 256);
        sheet.setColumnWidth(3, 26 * 256);
        sheet.setColumnWidth(4, 26 * 256);
        sheet.setColumnWidth(5, 26 * 256);
        sheet.setColumnWidth(6, 26 * 256);
        sheet.setColumnWidth(7, 26 * 256);
        sheet.setColumnWidth(8, 40 * 256);
        sheet.setColumnWidth(9, 40 * 256);
        sheet.setColumnWidth(10, 40 * 256);
        //设置开始行和开始列

        Row row0 = sheet.createRow(0);
        CellStyle style = wb.createCellStyle();
        style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
//        Font headerFont = wb.createFont();
//        headerFont.setFontName("Arial");
//        headerFont.setFontHeightInPoints((short) 12);
//        headerFont.setBold(false);
//        headerFont.setColor(IndexedColors.BLACK.getIndex());
//        style.setFont(headerFont);
        Cell cell0 = row0.createCell(0);
        row0.createCell(0).setCellValue("序号");
        row0.createCell(1).setCellValue("装置");
        row0.createCell(2).setCellValue("设备位号");
        row0.createCell(3).setCellValue("档案号");
        row0.createCell(4).setCellValue("设备名称");
        row0.createCell(5).setCellValue("检验单位");
        row0.getCell(5).setCellStyle(style);
        row0.createCell(6).setCellValue("检验日期");
        row0.getCell(6).setCellStyle(style);
        row0.createCell(7).setCellValue("报告编号");
        row0.getCell(7).setCellStyle(style);
        row0.createCell(8).setCellValue("下次检验日期");
        row0.getCell(8).setCellStyle(style);
        row0.createCell(9).setCellValue("定期检验结论");
        row0.getCell(9).setCellStyle(style);
        row0.createCell(10).setCellValue("备注");
        row0.getCell(10).setCellStyle(style);
        row0.createCell(11).setCellValue("备注2（如报告未到备注在此处）");
        row0.getCell(11).setCellStyle(style);
        //填充数据
        int rowIndex = 1;
        int columnIndex = 1;
        for (TSpecdevDzsb t : list
        ) {
            Row row = sheet.createRow(rowIndex);
            row.createCell(0).setCellValue(t.getId());
            row.createCell(1).setCellValue(t.getPlantCode());
            row.createCell(2).setCellValue(t.getDevno());
            row.createCell(3).setCellValue(t.getDocno());
            row.createCell(4).setCellValue(t.getDevname());
            row.createCell(5).setCellValue(t.getCheckUnit());
            if (t.getWarnDate() != null) {
                row.createCell(6).setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(t.getWarnDate()));
            }
            row.createCell(7).setCellValue(t.getReportNo());
            if (t.getNextWarnDate() != null) {
                row.createCell(8).setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(t.getNextWarnDate()));
            }
            row.createCell(9).setCellValue(t.getPerTestConclusion());
            row.createCell(10).setCellValue(t.getRemarks());
            row.createCell(11).setCellValue(t.getRemarks2());
            rowIndex++;
        }
        OutputStream out = null;
        String filename = ExcelUtil.encodingFilename("起重机械批量更新");
        out = new FileOutputStream(ExcelUtil.getAbsoluteFile(filename));
        wb.write(out);
        wb.close();
        out.close();
        return AjaxResult.success(filename);
    }

    public void checkWarnflag(){
        //获取动态处理预警级别
        TAlarmtype tAlarmtype = this.tAlarmtypeService.selectTAlarmtypeById(1080L);
        if (tAlarmtype.getIsOpen() == 0) {
            logger.info("特种设备预警标识定时任务未启用");
            return;
        }
        Long firstlevel = tAlarmtype.getFirstlevel();//1级
        Long secondlevel = tAlarmtype.getSecondlevel();//2级
        Long thirdlevel = tAlarmtype.getThirdlevel();//3级

        List<TSpecdevDzsb> list = this.tSpecdevDzsbService.list(new QueryWrapper<TSpecdevDzsb>()
                .eq("del_flag", 0).eq("status", "1"));
        List<TSpecdevDzsb> firstList = new ArrayList<>();
        List<TSpecdevDzsb> secondList = new ArrayList<>();
        List<TSpecdevDzsb> thirdList = new ArrayList<>();
        for (TSpecdevDzsb tSpecdevDzsb : list) {
            if (tSpecdevDzsb.getNextWarnDate() != null) {
                long now = System.currentTimeMillis();
                long diff = tSpecdevDzsb.getNextWarnDate().getTime() - now;
                long nd = 1000 * 24 * 60 * 60;
                long day = diff / nd;
                // 半年内 预警标识为2级
                if (day > 0 && day <= secondlevel) {
                    this.updateForDzsb(2L, tSpecdevDzsb);
                    //只在当天发送邮件
                    if (day == secondlevel) {
                        firstList.add(tSpecdevDzsb);
                    }
                    continue;
                }
                // 半年-一年 预警标识为1级
                if (day > secondlevel && day <= thirdlevel) {
                    this.updateForDzsb(1L, tSpecdevDzsb);
                    //只在当天发送邮件
                    if (day == thirdlevel) {
                        secondList.add(tSpecdevDzsb);
                    }
                    continue;
                }
                // 超时 预警标识为3级
                if (day <= firstlevel) {
                    this.updateForDzsb(3L, tSpecdevDzsb);
                    //只在当天发送邮件
                    if (day == firstlevel) {
                        thirdList.add(tSpecdevDzsb);
                    }
                    continue;
                }
                if (day > thirdlevel ) {
                    this.updateForDzsb(0L, tSpecdevDzsb);
                    continue;
                }
            }
        }
    }

    private void updateForDzsb(Long flag, TSpecdevDzsb tSpecdevDzsb) {
        tSpecdevDzsb.setWarnFlag(flag);
        this.tSpecdevDzsbService.updateTSpecdevDzsb(tSpecdevDzsb);
    }

    /**
     * 批量导入文件
     */
    @Log(title = "特种设备文件导入", businessType = BusinessType.OTHER)
    @PostMapping("/importFiles")
    public AjaxResult importFiles(@RequestParam("file") List<MultipartFile> files,@RequestParam("plantCode") String plantCode,@RequestParam("fileType") String fileType) throws Exception {
        tSpecdevDzsbService.importFiles(files,plantCode,fileType,getUserId().toString());

        return AjaxResult.success();
    }

    /**
     * @return
     * @throws IOException
     */
    @RequestMapping("/downloadFileZip")
    public AjaxResult downloadFileZip(@RequestParam String id, String type, HttpServletRequest request, HttpServletResponse response) throws Exception {
        String[] stringIds = id.split(",");

        TCommonfile tCommonfile = new TCommonfile();
        tCommonfile.setpType("sems-dzsb-" + type);
        tCommonfile.setpIds(stringIds);
        List<TCommonfile> fileList = tCommonfileService.selectAllFileListFuzzy(tCommonfile);

        OutputStream out = null;
        out = response.getOutputStream();
        //存放所有文件路径
        List<String> urlList = new ArrayList<>();
        for (TCommonfile t:fileList
        ) {
            // 将路径字符串转换为Path对象
            Path path = Paths.get(t.getFileUrl());
            // 获取文件名
            String fileName = path.getFileName().toString();
            urlList.add(t.getFileUrl().replace("/profile",""));
        }
        logger.info(JSON.toJSONString(urlList));
        return ZipUtil.createZip(RuoYiConfig.getProfile(), "",  "特种设备.zip", urlList, response);
    }

}
