package com.artfess.rescue.patrol.controller;


import com.alibaba.fastjson.JSONObject;
import com.artfess.base.annotation.ApiGroup;
import com.artfess.base.constants.ApiGroupConsts;
import com.artfess.base.enums.ResponseErrorEnums;
import com.artfess.base.model.CommonResult;
import com.artfess.base.query.*;
import com.artfess.base.util.JsonUtil;
import com.artfess.base.valid.AddGroup;
import com.artfess.poi.util.ExcelUtil;
import com.artfess.rescue.event.model.BizEventInfo;
import com.artfess.rescue.patrol.vo.*;
import com.artfess.rescue.report.dto.FilterDto;
import com.artfess.sysConfig.persistence.manager.SysDictionaryDetailManager;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import com.artfess.base.controller.BaseController;
import com.artfess.rescue.patrol.model.BizInspectionTask;
import com.artfess.rescue.patrol.manager.BizInspectionTaskManager;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

/**
 * 巡检任务表:由计划生成的具体巡检任务 前端控制器
 *
 * @author 系统管理员
 * @company 阿特菲斯信息技术有限公司
 * @since 2024-08-02
 */
@RestController
@RequestMapping("/patrol/bizInspectionTask/v1/")
@Api(tags = "巡检任务")
@ApiGroup(group = {ApiGroupConsts.GROUP_BIZ_RESCUE})
public class BizInspectionTaskController extends BaseController<BizInspectionTaskManager, BizInspectionTask> {
    @Resource
    SysDictionaryDetailManager sysDictionaryDetailManager;

    @PostMapping(value = "/queryByPower")
    @ApiOperation(value = "带权限分页查询", httpMethod = "POST", notes = "带权限分页查询")
    public PageList<BizInspectionTask> queryByPower(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        return baseService.powerList(queryFilter);
    }

    @Override
    @PostMapping(value = "/query")
    @ApiOperation(value = "分页查询-巡检任务", httpMethod = "POST", notes = "分页查询")
    public PageList<BizInspectionTask> query(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        List<Integer> status = Arrays.asList(0, 1, 2, 3, 5);
        queryFilter.addFilter("t.task_status_", status, QueryOP.IN);
        return baseService.queryPage(queryFilter);
    }

    @PostMapping(value = "/complete/query")
    @ApiOperation(value = "分页查询-巡检异常", httpMethod = "POST", notes = "分页查询")
    public PageList<BizInspectionTask> completeQuery(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        List<Integer> status = Arrays.asList(3, 4, 5);
        queryFilter.addFilter("t.task_status_", status, QueryOP.IN);
        return baseService.queryPage(queryFilter);
    }

    @PostMapping(value = "/query/open")
    @ApiOperation(value = "分页查询-巡检任务", httpMethod = "POST", notes = "分页查询")
    public PageList<BizInspectionTask> queryNoStatus(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        return baseService.queryPage(queryFilter);
    }


    @Override
    @GetMapping(value = "/{id}")
    @ApiOperation("根据id查询实体")
    public BizInspectionTask getById(@ApiParam(name = "id", value = "实体id") @PathVariable String id) {
        return baseService.findById(id);
    }

    @Override
    @PostMapping("/")
    @ApiOperation("添加实体的接口")
    public CommonResult<String> create(@ApiParam(name = "model", value = "实体信息") @Validated({AddGroup.class}) @RequestBody BizInspectionTask t) {
        boolean result = baseService.saveInfo(t);
        if (!result) {
            return new CommonResult<>(ResponseErrorEnums.FAIL_OPTION, null);
        }
        return new CommonResult<>();
    }

    @PostMapping("/updateByStatus")
    @ApiOperation("根据id修改状态")
    public CommonResult<String> updateByStatus(@RequestParam("id") String id, @RequestParam("taskStatus") String taskStatus) {
        boolean result = baseService.updateByStatus(id, taskStatus);
        if (!result) {
            return new CommonResult<>(ResponseErrorEnums.FAIL_OPTION, null);
        }
        return new CommonResult<>();
    }


    @PostMapping(value = "/count/road")
    @ApiOperation(value = "巡检统计-巡查部门汇总统计", httpMethod = "POST", notes = "巡检统计-巡查部门汇总统计")
    public CommonResult<JSONObject> countByRoad(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        return baseService.countByRoad(queryFilter);
    }

    @PostMapping(value = "/export/road")
    @ApiOperation(value = "excel导出-巡查部门汇总统计", httpMethod = "POST", notes = "巡检统计-巡查部门汇总统计")
    public void exportByRoad(HttpServletResponse response,@RequestBody QueryFilter<BizInspectionTask> queryFilter) throws Exception {
        CommonResult<JSONObject> result = baseService.countByRoad(queryFilter);
        JSONObject object = result.getValue();
        List<CountByRoadVO> voList = (List<CountByRoadVO>) object.get("data");
        List<Map<String, Object>> list = new ArrayList<>();
        if (voList != null && voList.size() > 0) {
            int i = 1;
            for (CountByRoadVO vo : voList) {
                String jsonStr = JsonUtil.toJson(vo);
                Map<String, Object> map = JsonUtil.toMap(jsonStr);
                //序号
                map.put("sn", i);
                i++;
                list.add(map);
            }
        }
        String tempName = "巡查路段汇总统计";
        Map<String, String> exportMaps = new LinkedHashMap<>();
        exportMaps.put("roadName", "路段名称");
        exportMaps.put("teamName", "巡检队伍");
        exportMaps.put("taskMileage", "巡检里程（km）");
        exportMaps.put("taskTime", "巡检时间（小时））");
        exportMaps.put("taskNum", "巡查次数（次）");
        exportMaps.put("outlierPoint", "异常点数（个）");
        exportMaps.put("handleAll", "上报总数（个）");
        exportMaps.put("handleScene", "上报中心数（个）");
        exportMaps.put("handleCenter", "现场处置数（个）");
        HSSFWorkbook book = ExcelUtil.exportExcel(tempName, 24, exportMaps, list);
        ExcelUtil.downloadExcel(book, tempName, response);
    }

    @PostMapping(value = "/count/user")
    @ApiOperation(value = "巡检统计-巡查人员汇总统计", httpMethod = "POST", notes = "巡检统计-巡查人员汇总统计")
    public CommonResult<JSONObject> countByUser(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        return baseService.countByUser(queryFilter);
    }

    @PostMapping(value = "/export/user")
    @ApiOperation(value = "excel导出-巡查部门汇总统计", httpMethod = "POST", notes = "巡检统计-巡查部门汇总统计")
    public void exportByUser(HttpServletResponse response,@RequestBody QueryFilter<BizInspectionTask> queryFilter) throws Exception {
        CommonResult<JSONObject> result = baseService.countByUser(queryFilter);
        JSONObject object = result.getValue();
        List<CountByRoadVO> voList = (List<CountByRoadVO>) object.get("data");
        List<Map<String, Object>> list = new ArrayList<>();
        if (voList != null && voList.size() > 0) {
            int i = 1;
            for (CountByRoadVO vo : voList) {
                String jsonStr = JsonUtil.toJson(vo);
                Map<String, Object> map = JsonUtil.toMap(jsonStr);
                //序号
                map.put("sn", i);
                i++;
                list.add(map);
            }
        }
        String tempName = "巡查人员汇总统计";
        Map<String, String> exportMaps = new LinkedHashMap<>();
        exportMaps.put("userName", "巡检人员");
        exportMaps.put("roadName", "路段名称");
        exportMaps.put("taskMileage", "巡检里程（km）");
        exportMaps.put("taskTime", "巡检时间（小时））");
        exportMaps.put("taskNum", "巡查次数（次）");
        exportMaps.put("outlierPoint", "异常点数（个）");
        exportMaps.put("handleAll", "上报总数（个）");
        exportMaps.put("handleScene", "上报中心数（个）");
        exportMaps.put("handleCenter", "现场处置数（个）");
        HSSFWorkbook book = ExcelUtil.exportExcel(tempName, 24, exportMaps, list);
        ExcelUtil.downloadExcel(book, tempName, response);
    }

    @PostMapping(value = "/count/content")
    @ApiOperation(value = "巡检统计-巡查内容汇总统计", httpMethod = "POST", notes = "巡检统计-巡查内容汇总统计")
    public CommonResult<JSONObject> countContent(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        return baseService.countContent(queryFilter);
    }

    @PostMapping(value = "/export/content")
    @ApiOperation(value = "excel导出-巡查部门汇总统计", httpMethod = "POST", notes = "巡检统计-巡查部门汇总统计")
    public void exportByContent(HttpServletResponse response,@RequestBody QueryFilter<BizInspectionTask> queryFilter) throws Exception {
        CommonResult<JSONObject> result = baseService.countContent(queryFilter);
        JSONObject object = result.getValue();
        List<CountByContentVO> voList = (List<CountByContentVO>) object.get("data");
        List<Map<String, Object>> list = new ArrayList<>();
        if (voList != null && voList.size() > 0) {
            int i = 1;
            for (CountByContentVO vo : voList) {
                String jsonStr = JsonUtil.toJson(vo);
                Map<String, Object> map = JsonUtil.toMap(jsonStr);
                //序号
                map.put("sn", i);
                i++;
                if (map.get("type") != null) {
                    String type = map.get("type").toString();
                    String typeText = sysDictionaryDetailManager.getTextByValue("xcdwlx", type);
                    map.put("typeText", typeText);
                } else {
                    map.put("typeText", "");
                }
                list.add(map);
            }
        }
        String tempName = "巡查内容汇总统计";
        Map<String, String> exportMaps = new LinkedHashMap<>();
        exportMaps.put("sn", "序号");
        exportMaps.put("taskNum", "巡检次数");
        exportMaps.put("typeText", "点位类型");
        exportMaps.put("outlierPoint", "异常点数(个)");
        exportMaps.put("handleAll", "异常点上报总数(个)");
        exportMaps.put("disposalAll", "现场处置总数(个)");
        HSSFWorkbook book = ExcelUtil.exportExcel(tempName, 24, exportMaps, list);
        ExcelUtil.downloadExcel(book, tempName, response);
    }

    @PostMapping(value = "/count/user/content")
    @ApiOperation(value = "巡检统计-巡查人员内容统计", httpMethod = "POST", notes = "巡检统计-巡查人员内容统计")
    public CommonResult<List<CountByContentToUserVO>> countUserContent(@RequestBody QueryFilter<BizInspectionTask> queryFilter) {
        return baseService.countUserContent(queryFilter);
    }

    @PostMapping(value = "/export/user/content")
    @ApiOperation(value = "excel导出-巡查部门汇总统计", httpMethod = "POST", notes = "巡检统计-巡查部门汇总统计")
    public void exportByUserContent(HttpServletResponse response,@RequestBody QueryFilter<BizInspectionTask> queryFilter) throws Exception {
        CommonResult<List<CountByContentToUserVO>> result = baseService.countUserContent(queryFilter);
        List<CountByContentToUserVO> userVOS = result.getValue();
        List<Map<String, Object>> list = new ArrayList<>();
        if (userVOS != null && userVOS.size() > 0) {
            for (CountByContentToUserVO vo : userVOS) {
                String jsonStr = JsonUtil.toJson(vo);
                Map<String, Object> map = JsonUtil.toMap(jsonStr);
                list.add(map);
            }
        }
        String tempName = "巡查路段汇总统计";
        Map<String, String> exportMaps = new LinkedHashMap<>();
        exportMaps.put("roadName", "路段名称");
        exportMaps.put("teamName", "巡检队伍");
        exportMaps.put("taskMileage", "巡检里程（km）");
        exportMaps.put("taskTime", "巡检时间（小时））");
        exportMaps.put("taskNum", "巡查次数（次）");
        exportMaps.put("outlierPoint", "异常点数（个）");
        exportMaps.put("handleAll", "上报总数");
        exportMaps.put("handleScene", "上报中心数");
        exportMaps.put("handleCenter", "现场处置数");
        HSSFWorkbook book = ExcelUtil.exportExcel(tempName, 24, exportMaps, list);
        ExcelUtil.downloadExcel(book, tempName, response);
    }

    @PostMapping(value = "/task/content")
    @ApiOperation(value = "巡检统计-巡查任务完成情况统计", httpMethod = "POST", notes = "巡检统计-巡查人员内容统计")
    public CommonResult taskContent(@RequestBody FilterDto dto) {
        return CommonResult.success(baseService.countTaskSummary(dto),"查询成功");
    }

    @PostMapping(value = "/export/task/content")
    @ApiOperation(value = "excel导出-巡查任务完成情况统计", httpMethod = "POST", notes = "巡检统计-巡查部门汇总统计")
    public void exportByTaskContent(HttpServletResponse response,@RequestBody FilterDto dto) throws Exception {
        JSONObject object = baseService.countTaskSummary(dto);
        List<TaskSummaryVO> voList = (List<TaskSummaryVO>)object.get("data");
        List<Map<String, Object>> list = new ArrayList<>();
        Integer no=1;
        if (voList != null && voList.size() > 0) {
            for (TaskSummaryVO vo : voList) {
                String jsonStr = JsonUtil.toJson(vo);
                Map<String, Object> map = JsonUtil.toMap(jsonStr);
                map.put("no",no);
                list.add(map);
                no++;
            }
        }
        String tempName = "巡查任务完成情况统计";
        Map<String, String> exportMaps = new LinkedHashMap<>();
        exportMaps.put("no", "序号");
        exportMaps.put("roadName", "路段名称");
        exportMaps.put("taskNum", "任务总数");
        exportMaps.put("taskFinishNum", "任务完成数量");
        exportMaps.put("taskFinishRate", "任务完成率");
        exportMaps.put("pointNum", "计划打卡点数量");
        exportMaps.put("pointFinishNum", "完成打卡点数量");
        exportMaps.put("pointFinishRate", "打卡点完成率");
        HSSFWorkbook book = ExcelUtil.exportExcel(tempName, 24, exportMaps, list,0,10);
        ExcelUtil.downloadExcel(book, tempName, response);
    }

    @PostMapping("/ledger/export")
    @ApiOperation(value = "台账导出", httpMethod = "POST", notes = "台账导出")
    public ResponseEntity<?> exportToBrowser(@RequestBody QueryFilter<BizInspectionTask> queryFilter){
       return baseService.exportLedger(queryFilter);
    }

    @PostMapping("/ledger")
    @ApiOperation(value = "台账详情", httpMethod = "POST", notes = "台账详情")
    public BaseTaskLedgerVO getEventTaskLedger(@RequestBody QueryFilter<BizInspectionTask> queryFilter){
        return baseService.getTaskLedger(queryFilter);
    }

    @PostMapping("/ledger/excelExport")
    @ApiOperation(value = "台账详情", httpMethod = "POST", notes = "台账详情导出")
    public void getEventTaskLedger(HttpServletResponse response, @RequestBody QueryFilter<BizInspectionTask> queryFilter){
        baseService.ledgerExport(response,queryFilter);
    }
}
