package com.qmth.sop.server.api;

import com.qmth.boot.api.constant.ApiConstant;
import com.qmth.sop.business.entity.TBService;
import com.qmth.sop.business.service.SopAnalyseService;
import com.qmth.sop.common.enums.SopAnalyseGroupEnum;
import com.qmth.sop.common.enums.SopAnalyseSortEnum;
import com.qmth.sop.common.util.Result;
import com.qmth.sop.common.util.ResultUtil;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * sop分析 控制器
 *
 * @author: shudonghui
 * @date: 2023-08-14 15:55:18
 * @version: 1.0
 * @email: shudonghui@qmth.com.cn
 * @Company: www.qmth.com.cn
 */
@Api(tags = "sop分析 Controller")
@RestController
@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/sop/analyse")
public class SopAnalyseController {


    @Resource
    SopAnalyseService sopAnalyseService;


    @ApiOperation(value = "服务单元列表接口")
    @RequestMapping(value = "/list", method = RequestMethod.POST)
    @ApiResponses({@ApiResponse(code = 200, message = "服务单元列表", response = TBService.class)})
    public Result list(@ApiParam(value = "开始时间", required = true) @RequestParam Long startTime,
                       @ApiParam(value = "结束时间", required = true) @RequestParam Long endTime) {
        List<TBService> list = sopAnalyseService.list(startTime,endTime);
        return ResultUtil.ok(list);
    }

    /*
     * 1.监控台是对当前SOP执行情况（延期、违规预警），以及项目管理角色（大区、供应商）对SOP预警处理情况、考勤异常的实时监控；
     * 2.动态查询条件：时间周期（年度等）、服务单元（已发布状态）；
     * 3.总体概况（中间上面一部分的数据看板）
     * ①可按照大区/人力供应商进行切换如图；
     * ②按照派单数TOP3的大区、人力供应商显示；
     * ③完成进度：该大区/供应商派单的完成进度，按照派单已有完成SOP，且没有在执行的SOP认为是已完成的派单；
     * ④平均处理时限：该大区/供应商预警处理的平均时限。按照预警产生到关闭的时长的均值，≥1小时，按小时显示；＜小时，按分钟显示；
     * 若预警为关闭后重启，则需要重新从预警产生到最后一次关闭的时长进行计算；
     */

    @ApiOperation(value = "总体概况接口")
    @RequestMapping(value = "/overview", method = RequestMethod.POST)
    @ApiResponses({@ApiResponse(code = 200, message = "总体概况", response = Map.class)})
    public Result overview(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceId,
                           @ApiParam(value = "分组", required = true) @RequestParam SopAnalyseGroupEnum group) {
        return ResultUtil.ok(sopAnalyseService.overview(serviceId, group));
    }


    /*
     * 4.项目/供应商/大区预警待处理TOP10：
     * ①待处理(待处理预警)：按派单统计待处理的预警数（违规+延期）；
     * ②处理最慢（已处理完毕的预警）：
     * A.平均时限：按照预警产生到关闭的时长的均值，≥1小时，按小时显示；＜小时，按分钟显示；
     * 若预警为关闭后重启，则需要重新从预警产生到最后一次关闭的时长进行计算；
     * B.排序：按平均时限的倒序排列；
     * ③处理最快（已处理完毕的预警）：
     * A.平均时限：同上；
     * B.排序：按平均时限的顺序排列。
     * ④（预警数）均值：由于供应商分配的项目数量不同，所以单从总数无法判定供应商对预警处理的力度。均值=预警总数/派单数；
     * ⑤【数据下钻】不提供。
     */

    @ApiOperation(value = "项目/供应商/大区预警待处理TOP10接口")
    @RequestMapping(value = "/processing", method = RequestMethod.POST)
    @ApiResponses({@ApiResponse(code = 200, message = "项目/供应商/大区预警待处理TOP10", response = Map.class)})
    public Result processing(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceId,
                             @ApiParam(value = "分组", required = true) @RequestParam SopAnalyseGroupEnum group,
                             @ApiParam(value = "排序", required = true) @RequestParam SopAnalyseSortEnum sort) {
        List<Map<String, Object>> list = sopAnalyseService.processing(serviceId, group,sort);
        return ResultUtil.ok(list);
    }

    /*
     * 5.供应商预警均值走势：
     * 供应商近一周预警数的均值走势。
     * ④（预警数）均值：由于供应商分配的项目数量不同，所以单从总数无法判定供应商对预警处理的力度。均值=预警总数/派单数；
     */

    @ApiOperation(value = "供应商预警均值走势接口")
    @RequestMapping(value = "/trend", method = RequestMethod.POST)
    @ApiResponses({@ApiResponse(code = 200, message = "供应商预警均值走势", response = Map.class)})
    public Result trend(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceId) {
        return ResultUtil.ok(sopAnalyseService.trend(serviceId));
    }

    /*
      6.项目/大区/供应商考勤异常TOP：
      ①（异常）均值=异常总数/派单数；
      ②【数据下钻】不提供；
     */

    @ApiOperation(value = "项目/大区/供应商考勤异常TOP接口")
    @RequestMapping(value = "/attendance", method = RequestMethod.POST)
    @ApiResponses({@ApiResponse(code = 200, message = "项目/大区/供应商考勤异常TOP", response = Map.class)})
    public Result attendance(@ApiParam(value = "服务单元", required = true) @RequestParam Long serviceId,
                             @ApiParam(value = "分组", required = true) @RequestParam SopAnalyseGroupEnum group) {
        List<Map<String, Object>> list = sopAnalyseService.attendance(serviceId, group);
        return ResultUtil.ok(list);
    }


}