package com.ruoyi.project.patrol.commonuse.controller;

import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.ExcelUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.interceptor.annotation.RepeatSubmit;
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.patrol.commonuse.domain.TCommonuseMovement;
import com.ruoyi.project.patrol.commonuse.service.ITCommonuseMovementService;
import com.ruoyi.project.patrol.dev.domain.TDevMovement;
import com.ruoyi.project.patrol.dev.service.ITDevMovementService;
import com.ruoyi.project.patrol.patrol.domain.TPatrolIssues;
import com.ruoyi.project.patrol.patrol.domain.TPatrolPlan;
import com.ruoyi.project.patrol.patrol.service.ITPatrolIssuesService;
import com.ruoyi.project.patrol.patrol.service.ITPatrolPlanService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.service.ISysUserService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * 移动平台及移动梯Controller
 *
 * @author admin
 * @date 2023-11-08
 */
@RestController
@RequestMapping("/commonuse/movement")
public class TCommonuseMovementController extends BaseController {
    @Autowired
    private ITCommonuseMovementService tCommonuseMovementService;

    @Autowired
    private ITDevMovementService tDevMovementService;

    @Autowired
    private ITPatrolPlanService tPatrolPlanService;

    @Autowired
    private ITPatrolIssuesService tPatrolIssuesService;

    @Autowired
    private ISysUserService sysUserService;

    /**
     * 查询移动平台及移动梯列表
     */
    @PreAuthorize("@ss.hasPermi('commonuse:movement:list')")
    @GetMapping("/list")
    public TableDataInfo list(TCommonuseMovement tCommonuseMovement) {
        startPage();
        if (StringUtils.isEmpty(tCommonuseMovement.getIssuesFlag()))
            tCommonuseMovement.setIssuesFlag("0");
        List<TCommonuseMovement> list = tCommonuseMovementService.selectTCommonuseMovementList(tCommonuseMovement);
        return getDataTable(list);
    }

    /**
     * 导出移动平台及移动梯列表
     */
    
    @Log(title = "移动平台及移动梯", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    public AjaxResult export(TCommonuseMovement tCommonuseMovement) {
        try {
            tCommonuseMovement.setIssuesFlag("0");
            List<TCommonuseMovement> list = tCommonuseMovementService.selectTCommonuseMovementList(tCommonuseMovement);
            XSSFWorkbook workbook = new XSSFWorkbook();
            // 创建工作簿
            XSSFSheet sheet = workbook.createSheet();
            // 设置列宽
            sheet.setColumnWidth(0, 1200);
            sheet.setColumnWidth(1, 3500);
            sheet.setColumnWidth(2, 3500);
            sheet.setColumnWidth(3, 4500);
            sheet.setColumnWidth(4, 4500);
            sheet.setColumnWidth(5, 4500);
            sheet.setColumnWidth(6, 4500);
            sheet.setColumnWidth(7, 4500);
            sheet.setColumnWidth(8, 3500);
            //第一行
            XSSFRow row1 = sheet.createRow(0);
            row1.createCell(0).setCellValue("CBP-6.3.0-SCFSH-020.23  Rev:04  2021/10/01");
            ExcelUtils.createVoidCell(1, 8, row1);
            sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 8));//合并
            //第二行
            XSSFRow row2 = sheet.createRow(1);
            row2.createCell(0).setCellValue("移动平台及移动梯检查记录");
            ExcelUtils.createVoidCell(1, 8, row2);
            sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 8));
            //第三行
            XSSFRow row3 = sheet.createRow(2);
            row3.createCell(0).setCellValue("年度：" + tCommonuseMovement.getYear());
            sheet.addMergedRegion(new CellRangeAddress(2, 2, 0, 2));
            ExcelUtils.createVoidCell(1, 8, row3);
            row3.createCell(3).setCellValue("检查频率：1次/年");
            sheet.addMergedRegion(new CellRangeAddress(2, 2, 3, 8));
            //第四行
            XSSFRow row4 = sheet.createRow(3);
            row4.createCell(0).setCellValue("序号");
            row4.createCell(1).setCellValue("位号");
            row4.createCell(2).setCellValue("位置");
            row4.createCell(3).setCellValue("检查内容");
            ExcelUtils.createVoidCell(4, 8, row4);
            sheet.addMergedRegion(new CellRangeAddress(3, 3, 3, 8));
            //第五行
            XSSFRow row5 = sheet.createRow(4);
            sheet.addMergedRegion(new CellRangeAddress(3, 4, 0, 0));
            sheet.addMergedRegion(new CellRangeAddress(3, 4, 1, 1));
            sheet.addMergedRegion(new CellRangeAddress(3, 4, 2, 2));
            ExcelUtils.createVoidCell(0, 2, row5);
            row5.createCell(3).setCellValue("外观情况");
            row5.createCell(4).setCellValue("踏板情况");
            row5.createCell(5).setCellValue("锈蚀情况");
            row5.createCell(6).setCellValue("移动梯扶手");
            row5.createCell(7).setCellValue("万向轮功能");
            row5.createCell(8).setCellValue("检查人");
            Long planId = null;
            //遍历数组赋值
            for (int i = 0; i < list.size(); i++) {
                TCommonuseMovement movement = list.get(i);
                TDevMovement tDevMovement = new TDevMovement();
                tDevMovement.setDevNo(movement.getDevNo());
                tDevMovement.setPosition(movement.getPosition());
                List<TDevMovement> tDevMovements = tDevMovementService.selectTDevMovementList(tDevMovement);
                if (CollectionUtils.isNotEmpty(tDevMovements) && tDevMovements.size() == 1) {
                    TDevMovement devMovement = tDevMovements.get(0);
                    planId = movement.getPlanId();
                    XSSFRow row = sheet.createRow(5 + i);
                    row.createCell(0).setCellValue(i + 1);
                    row.createCell(1).setCellValue(movement.getDevNo());
                    row.createCell(2).setCellValue(movement.getPosition());
                    if (StringUtils.isNotEmpty(devMovement.getIgnoreColumn()) && devMovement.getIgnoreColumn().contains("corrosion")) {
                        row.createCell(3).setCellValue("/");
                    } else
                        row.createCell(3).setCellValue("1".equals(movement.getAppearance()) ? "√" : movement.getAppearance());
                    if (StringUtils.isNotEmpty(devMovement.getIgnoreColumn()) && devMovement.getIgnoreColumn().contains("appearance")) {
                        row.createCell(4).setCellValue("/");
                    } else
                        row.createCell(4).setCellValue("1".equals(movement.getFootboard()) ? "√" : movement.getFootboard());
                    if (StringUtils.isNotEmpty(devMovement.getIgnoreColumn()) && devMovement.getIgnoreColumn().contains("footboard")) {
                        row.createCell(5).setCellValue("/");
                    } else
                        row.createCell(5).setCellValue("1".equals(movement.getCorrosion()) ? "√" : movement.getCorrosion());
                    if (StringUtils.isNotEmpty(devMovement.getIgnoreColumn()) && devMovement.getIgnoreColumn().contains("handrail")) {
                        row.createCell(6).setCellValue("/");
                    } else
                        row.createCell(6).setCellValue("1".equals(movement.getHandrail()) ? "√" : movement.getHandrail());
                    if (StringUtils.isNotEmpty(devMovement.getIgnoreColumn()) && devMovement.getIgnoreColumn().contains("universalWheel")) {
                        row.createCell(7).setCellValue("/");
                    } else
                        row.createCell(7).setCellValue("1".equals(movement.getUniversalWheel()) ? "√" : movement.getUniversalWheel());
                    XSSFCell cell10 = row.createCell(8);
                    if (StringUtils.isNotEmpty(movement.getUpdaterCode())) {
                        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(movement.getUpdaterCode()));
                        cell10.setCellValue(sysUser == null ? "" : sysUser.getNickName());
                    }
                }
            }
            String confirmed = "";
            Date confirmedDate = null;
            TPatrolPlan tPatrolPlan = tPatrolPlanService.selectTPatrolPlanById(planId);
            if (Objects.nonNull(tPatrolPlan) && Objects.nonNull(tPatrolPlan.getConfirmed())) {
                SysUser sysUser = sysUserService.selectUserById(Long.valueOf(tPatrolPlan.getConfirmed()));            if (sysUser!=null) {
                confirmed = sysUser.getSignUrl();
                confirmedDate = tPatrolPlan.getConfirmDate();
            }
            }
            // 循环后下一行
            int nextRowNum = 5 + list.size();
            XSSFRow row28 = sheet.createRow(nextRowNum);
            row28.setHeightInPoints(30);
            XSSFCell row28Cell1 = row28.createCell(0);
            row28Cell1.setCellValue("签名");
            ExcelUtils.createVoidCell(1, 2, row28);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 0, 2));
            if (StringUtils.isNotEmpty(confirmed))
                ExcelUtils.insertPicture(workbook, sheet, confirmed, nextRowNum, 5, 1, 1);
            ExcelUtils.createVoidCell(3, 8, row28);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 3, 8));
            // 下一行
            nextRowNum++;
            XSSFRow row29 = sheet.createRow(nextRowNum);
            row29.setHeightInPoints(30);
            XSSFCell row29Cell1 = row29.createCell(0);
            row29Cell1.setCellValue("日期");
            ExcelUtils.createVoidCell(1, 2, row29);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 0, 2));
            row29.createCell(3).setCellValue(confirmedDate != null ? new SimpleDateFormat("yyyy-MM-dd").format(confirmedDate) : "");
            ExcelUtils.createVoidCell(4, 8, row29);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 3, 8));
            // 设置单元格样式
            // 文字居中，自动换行，四周边框
            CellStyle style = workbook.createCellStyle();
            style.setAlignment(HorizontalAlignment.CENTER);
            style.setVerticalAlignment(VerticalAlignment.CENTER);
            style.setWrapText(true);
            style.setBorderTop(BorderStyle.THIN);
            style.setBorderBottom(BorderStyle.THIN);
            style.setBorderLeft(BorderStyle.THIN);
            style.setBorderRight(BorderStyle.THIN);

            // 设置垂直居中，四周边框
            CellStyle style2 = workbook.createCellStyle();
            style2.setVerticalAlignment(VerticalAlignment.CENTER);
            style2.setBorderTop(BorderStyle.THIN);
            style2.setBorderBottom(BorderStyle.THIN);
            style2.setBorderLeft(BorderStyle.THIN);
            style2.setBorderRight(BorderStyle.THIN);
            for (Row row : sheet) {
                row.setHeightInPoints(30);
                if (row.getRowNum() == 0) {
                    continue;
                }
                if (row.getRowNum() == 2) {
                    for (Cell cell : row) {
                        if (cell.getColumnIndex() == 0 || cell.getColumnIndex() == 1 || cell.getColumnIndex() == 2)
                            cell.setCellStyle(style2);
                        else
                            cell.setCellStyle(style);
                    }
                } else {
                    for (Cell cell : row) {
                        cell.setCellStyle(style);
                    }
                }
            }
            nextRowNum++;
            XSSFRow row30 = sheet.createRow(nextRowNum);
            row30.createCell(0).setCellValue("说明：");
            ExcelUtils.createVoidCell(1, 8, row30);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 0, 8));

            nextRowNum++;
            XSSFRow row31 = sheet.createRow(nextRowNum);
            row31.createCell(0).setCellValue("1.检查正常打“√”。");
            ExcelUtils.createVoidCell(1, 8, row31);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 0, 8));

            nextRowNum++;
            XSSFRow row32 = sheet.createRow(nextRowNum);
            row32.createCell(0).setCellValue("2.检查有不正常情况打“X”，并记录存在问题，处理结果及完成时间。");
            ExcelUtils.createVoidCell(1, 8, row32);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 0, 8));

            nextRowNum++;
            XSSFRow row33 = sheet.createRow(nextRowNum);
            row33.createCell(0).setCellValue("3. 检查频率为每一年检查维护一次。");
            ExcelUtils.createVoidCell(1, 8, row33);
            sheet.addMergedRegion(new CellRangeAddress(nextRowNum, nextRowNum, 0, 8));

            //返回
            String fileName = ExcelUtil.encodingFilename("main");
            OutputStream os = Files.newOutputStream(Paths.get(ExcelUtil.getAbsoluteFile(fileName)));
            workbook.write(os);
            workbook.close();
            return AjaxResult.success(fileName);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取移动平台及移动梯详细信息
     */
    @PreAuthorize("@ss.hasPermi('commonuse:movement:query')")
    @GetMapping(value = "/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
        TCommonuseMovement movement = tCommonuseMovementService.selectTCommonuseMovementById(id);
        if (movement!=null) {
            TDevMovement tDevMovement = new TDevMovement();
            tDevMovement.setPrecision(movement.getDevNo());
            tDevMovement.setPosition(movement.getPosition());
            movement.setIgnoreColumn(tDevMovementService.selectTDevMovementList(tDevMovement).get(0).getIgnoreColumn());
        }
        return AjaxResult.success(movement);
    }

    /**
     * 获取移动平台及移动梯详细信息
     */
    @PreAuthorize("@ss.hasPermi('commonuse:movement:query')")
    @GetMapping(value = "/info")
    public AjaxResult getInfo(TCommonuseMovement tCommonuseMovement) {
        if (StringUtils.isEmpty(tCommonuseMovement.getDevNo()) || StringUtils.isNull(tCommonuseMovement.getPlanId())) {
            return AjaxResult.error("位号或计划id不能为空！");
        }
        TCommonuseMovement item = new TCommonuseMovement();
        item.setPlanId(tCommonuseMovement.getPlanId());
        item.setPrecision(tCommonuseMovement.getDevNo());
        item.setIssuesFlag("0");
        List<TCommonuseMovement> list = tCommonuseMovementService.selectTCommonuseMovementList(item);
        if (CollectionUtils.isNotEmpty(list)) {
            TCommonuseMovement movement = list.get(0);
            TDevMovement tDevMovement = new TDevMovement();
            tDevMovement.setDevNo(movement.getDevNo());
            tDevMovement.setPosition(movement.getPosition());
            TDevMovement devMovement = tDevMovementService.selectTDevMovementList(tDevMovement).get(0);
            movement.setIgnoreColumn(devMovement.getIgnoreColumn());
            return AjaxResult.success(movement);
        }
        return AjaxResult.error("此设备不在当前巡检计划中!");
    }

    /**
     * 新增移动平台及移动梯
     */
    @PreAuthorize("@ss.hasPermi('commonuse:movement:add')")
    @Log(title = "移动平台及移动梯", businessType = BusinessType.INSERT)
    @PostMapping
    public AjaxResult add(@RequestBody TCommonuseMovement tCommonuseMovement) {
        return toAjax(tCommonuseMovementService.insertTCommonuseMovement(tCommonuseMovement));
    }

    /**
     * 修改移动平台及移动梯
     */
    @PreAuthorize("@ss.hasPermi('commonuse:movement:edit')")
    @Log(title = "移动平台及移动梯", businessType = BusinessType.UPDATE)
    @PutMapping
    @RepeatSubmit
    public AjaxResult edit(@RequestBody TCommonuseMovement tCommonuseMovement) {
        tCommonuseMovement.setUpdatedate(new Date());
        tCommonuseMovement.setUpdaterCode(getUserId().toString());
        tCommonuseMovement.setCheckStatus("1");
        tCommonuseMovement.setCheckDate(new Date());
        TCommonuseMovement item = tCommonuseMovementService.selectTCommonuseMovementById(tCommonuseMovement.getId());
        TPatrolPlan tPatrolPlan = tPatrolPlanService.selectTPatrolPlanById(tCommonuseMovement.getPlanId());
        if (tPatrolPlan.getStatus() == 1) {
            return AjaxResult.error("当前选择的计划已确认！");
        }
        if (!"1".equals(item.getCheckStatus())) {
            tPatrolPlan.setUncheckedNum(tPatrolPlan.getUncheckedNum() - 1);
            tPatrolPlan.setCheckedNum(tPatrolPlan.getCheckedNum() + 1);
            tPatrolPlanService.updateTPatrolPlan(tPatrolPlan);
        }
        TDevMovement tDevMovement = new TDevMovement();
        tDevMovement.setDevNo(item.getDevNo());
        tDevMovement.setPosition(item.getPosition());
        List<TDevMovement> tDevMovements = tDevMovementService.selectTDevMovementList(tDevMovement);
        if (CollectionUtils.isNotEmpty(tDevMovements) && tDevMovements.size() == 1) {
            TDevMovement movement = tDevMovements.get(0);
            if (StringUtils.isNotEmpty(movement.getIgnoreColumn()) && movement.getIgnoreColumn().contains("corrosion")) {
                tCommonuseMovement.setCorrosion("/");
            }
            if (StringUtils.isNotEmpty(movement.getIgnoreColumn()) && movement.getIgnoreColumn().contains("appearance")) {
                tCommonuseMovement.setAppearance("/");
            }
            if (StringUtils.isNotEmpty(movement.getIgnoreColumn()) && movement.getIgnoreColumn().contains("footboard")) {
                tCommonuseMovement.setFootboard("/");
            }
            if (StringUtils.isNotEmpty(movement.getIgnoreColumn()) && movement.getIgnoreColumn().contains("handrail")) {
                tCommonuseMovement.setHandrail("/");
            }
            if (StringUtils.isNotEmpty(movement.getIgnoreColumn()) && movement.getIgnoreColumn().contains("universalWheel")) {
                tCommonuseMovement.setUniversalWheel("/");
            }
        }
        if (StringUtils.isNotEquals(tCommonuseMovement.getCorrosion(), "1", "/") || StringUtils.isNotEquals(tCommonuseMovement.getAppearance(), "1", "/") ||
                StringUtils.isNotEquals(tCommonuseMovement.getFootboard(), "1", "/") || StringUtils.isNotEquals(tCommonuseMovement.getHandrail(), "1", "/") ||
                StringUtils.isNotEquals(tCommonuseMovement.getUniversalWheel(), "1", "/")) {
            tCommonuseMovement.setIssuesStatus("1");
            tCommonuseMovement.setCheckStatus("0");
            tCommonuseMovementService.updateTCommonuseMovement(tCommonuseMovement);
            tCommonuseMovement.setIssuesFlag("1");
            tCommonuseMovement.setCheckStatus("1");
            tCommonuseMovement.setCreatedate(new Date());
            tCommonuseMovement.setCreaterCode(getUserId().toString());
            tCommonuseMovement.setDevNo(item.getDevNo());
            tCommonuseMovement.setPosition(item.getPosition());
            tCommonuseMovementService.insertTCommonuseMovement(tCommonuseMovement);
            TPatrolIssues tPatrolIssues = new TPatrolIssues();
            tPatrolIssues.setPatrolType("20");
            tPatrolIssues.setDevDescribe(tCommonuseMovement.getDevNo() + " " + tCommonuseMovement.getPosition());
            tPatrolIssues.setLinkId(tCommonuseMovement.getId());
            tPatrolIssues.setStatus(0L);
            tPatrolIssuesService.insertTPatrolIssues(tPatrolIssues);
        } else {
            if ("1".equals(item.getIssuesStatus())) {
                TPatrolIssues tPatrolIssues = new TPatrolIssues();
                tPatrolIssues.setPatrolType("20");
                tPatrolIssues.setDevDescribe(item.getDevNo()+" "+item.getPosition());
                tPatrolIssues.setCreatedate(new Date());
                for (TPatrolIssues patrolIssues : tPatrolIssuesService.selectTPatrolIssuesList(tPatrolIssues)) {
                    patrolIssues.setStatus(1L);
                    tPatrolIssuesService.updateTPatrolIssues(patrolIssues);
                }
            }
            tCommonuseMovement.setIssuesStatus("0");
            tCommonuseMovementService.updateTCommonuseMovement(tCommonuseMovement);
        }
        return AjaxResult.success();
    }

    /**
     * 删除移动平台及移动梯
     */
    @PreAuthorize("@ss.hasPermi('commonuse:movement:remove')")
    @Log(title = "移动平台及移动梯", businessType = BusinessType.DELETE)
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids) {
        return toAjax(tCommonuseMovementService.deleteTCommonuseMovementByIds(ids));
    }
}
