package com.zehong.system.service.impl;

import java.io.IOException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;

import com.alibaba.excel.EasyExcel;
import com.zehong.common.core.domain.entity.SysDictData;
import com.zehong.common.utils.DateUtils;
import com.zehong.common.utils.StringUtils;
import com.zehong.system.config.easyexcel.CustomCellWriteHeightConfig;
import com.zehong.system.config.easyexcel.CustomCellWriteWidthConfig;
import com.zehong.system.domain.TComplainDealManSysSet;
import com.zehong.system.domain.dto.TComplainDealDTO;
import com.zehong.system.domain.vo.ComplainDealSummaryAnalysisTableVo;
import com.zehong.system.domain.vo.ComplainDealSummaryAnalysisVo;
import com.zehong.system.domain.vo.HomepageVo;
import com.zehong.system.mapper.SysDictDataMapper;
import com.zehong.system.mapper.TComplainDealManSysSetMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TComplainDealMapper;
import com.zehong.system.domain.TComplainDeal;
import com.zehong.system.service.ITComplainDealService;

import javax.servlet.http.HttpServletResponse;

/**
 * 投诉处置Service业务层处理
 * 
 * @author zehong
 * @date 2022-02-15
 */
@Service("complainDealServiceImpl")
public class TComplainDealServiceImpl implements ITComplainDealService 
{
    @Autowired
    private TComplainDealMapper tComplainDealMapper;

    @Autowired
    private TComplainDealManSysSetMapper tComplainDealManSysSetMapper;

    @Autowired
    private SysDictDataMapper sysDictDataMapper;

    /**
     * 查询投诉处置
     * 
     * @param complainDealId 投诉处置ID
     * @return 投诉处置
     */
    @Override
    public TComplainDeal selectTComplainDealById(Long complainDealId)
    {
        return tComplainDealMapper.selectTComplainDealById(complainDealId);
    }

    /**
     * 查询投诉处置列表
     * 
     * @param tComplainDeal 投诉处置
     * @return 投诉处置
     */
    @Override
    public List<TComplainDeal> selectTComplainDealList(TComplainDeal tComplainDeal)
    {
        return tComplainDealMapper.selectTComplainDealList(tComplainDeal);
    }

    /**
     * 投诉处置统计
     *
     * @return 投诉处置统计
     */
    public HomepageVo countTComplainDeal()
    {
        return tComplainDealMapper.countTComplainDeal();
    }

    /**
     * 新增投诉处置
     * 
     * @param tComplainDeal 投诉处置
     * @return 结果
     */
    @Override
    public int insertTComplainDeal(TComplainDeal tComplainDeal)
    {
        tComplainDeal.setCreateTime(DateUtils.getNowDate());
        return tComplainDealMapper.insertTComplainDeal(tComplainDeal);
    }

    /**
     * 修改投诉处置
     * 
     * @param tComplainDeal 投诉处置
     * @return 结果
     */
    @Override
    public int updateTComplainDeal(TComplainDeal tComplainDeal)
    {
        tComplainDeal.setUpdateTime(DateUtils.getNowDate());
        return tComplainDealMapper.updateTComplainDeal(tComplainDeal);
    }

    /**
     * 批量删除投诉处置
     * 
     * @param complainDealIds 需要删除的投诉处置ID
     * @return 结果
     */
    @Override
    public int deleteTComplainDealByIds(Long[] complainDealIds)
    {
        return tComplainDealMapper.deleteTComplainDealByIds(complainDealIds);
    }

    /**
     * 删除投诉处置信息
     * 
     * @param complainDealId 投诉处置ID
     * @return 结果
     */
    @Override
    public int deleteTComplainDealById(Long complainDealId)
    {
        return tComplainDealMapper.deleteTComplainDealById(complainDealId);
    }
    @Override
    public  List<Map<String,Object>> selectUserByenterproseId(String enterproseId){
        return tComplainDealMapper.selectUserByenterproseId(enterproseId);
    }

    /**
     * 投诉处置 统计分析 table 方式 方法
     * @return list
     */
    @Override
    public List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisMethodTableViews(ComplainDealSummaryAnalysisTableVo complainDealSummaryAnalysisTableVo) {

        // 管理制度
        List<TComplainDealManSysSet> tComplainDealManSysSets = tComplainDealManSysSetMapper.selectTComplainDealManSysSetList(new TComplainDealManSysSet());

        //1-投诉举报 管理制度时间
        long fType1 = 0;
        //2-服务申请 管理制度时间
        long fType2 = 0;
        //3-咨询建议 管理制度时间
        long fType3 = 0;

        //总发生量
        BigDecimal totalAmount = BigDecimal.ZERO;

        //总办结量
        BigDecimal totalCompletionRate = BigDecimal.ZERO;

        //总及时办结量
        BigDecimal totalTimelyCompletionRate = BigDecimal.ZERO;

        for (TComplainDealManSysSet tComplainDealManSysSet : tComplainDealManSysSets) {
            Long days = tComplainDealManSysSet.getfDay();
            Long hours = tComplainDealManSysSet.getfHours();
            Long minutes = tComplainDealManSysSet.getfMinutes();
            Long seconds = tComplainDealManSysSet.getfSeconds();
            Long allTime = days * 24L * 60 * 60 * 1000
                    + hours * 60 * 60 * 1000
                    + minutes * 60 * 1000
                    + seconds * 1000;
            if ("1".equals(tComplainDealManSysSet.getfType())) {
                fType1= allTime;
            } else if ("2".equals(tComplainDealManSysSet.getfType())) {
                fType2= allTime;
            } else if ("3".equals(tComplainDealManSysSet.getfType())) {
                fType3 = allTime;
            }
        }

        String date1 = complainDealSummaryAnalysisTableVo.getDate();
        if(StringUtils.isEmpty(date1)) {
            return initEmptyList();
        }

        //查询当前年的开始时间和结束时间
        Date startOfMonth = DateUtils.parseDate(date1 + "-01-01 00:00:00");
        Date endOfMonth = DateUtils.parseDate(date1 + "-12-31 23:59:59");;
        String complaintCategory = complainDealSummaryAnalysisTableVo.getComplainType();
        String township = complainDealSummaryAnalysisTableVo.getTownship();

        //所有所有发生的投诉
        List<TComplainDealDTO> tComplainDeals = tComplainDealMapper.queryAllByNotDeleteAndCreateTime(startOfMonth,endOfMonth,complaintCategory,township);

        List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisTableVos = new ArrayList<>();

        //先初始化一个空的，然后再循环往里面放值
        List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisTableVosEmpty = initEmptyList();
        //如果没数据，就返回一个都是null的数据的集合
        if(tComplainDeals.size() == 0) {
            return complainDealSummaryAnalysisTableVosEmpty;
        }

        Map<String, List<TComplainDealDTO>> collect = tComplainDeals.stream().collect(Collectors.groupingBy(TComplainDealDTO::getCreateTimeYear));
        ComplainDealSummaryAnalysisTableVo complainDealSummaryAnalysisTableVo1;
        for (Map.Entry<String, List<TComplainDealDTO>> stringListEntry : collect.entrySet()) {
            String key = stringListEntry.getKey();
            List<TComplainDealDTO> value = stringListEntry.getValue();
            BigDecimal count = new BigDecimal(value.size());

            // 发生量统计
            totalAmount = totalAmount.add(count);

            complainDealSummaryAnalysisTableVo1 = new ComplainDealSummaryAnalysisTableVo();
            complainDealSummaryAnalysisTableVo1.setDate(key + "月");
            // 发生量
            complainDealSummaryAnalysisTableVo1.setAmount(value.size() + "");

            // 如果有发生量
            if (value.size() > 0) {
                //办结率
                List<TComplainDealDTO> completionRateCollect = value.stream().filter(item -> "3".equals(item.getComplainStatus())).collect(Collectors.toList());

                if (completionRateCollect.size() == 0) {
                    complainDealSummaryAnalysisTableVo1.setCompletionRate("0");
                } else {
                    BigDecimal completedCount = new BigDecimal(completionRateCollect.size());

                    BigDecimal divide = completedCount.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                    //统计 发生率
                    totalCompletionRate = totalCompletionRate.add(completedCount);

                    complainDealSummaryAnalysisTableVo1.setCompletionRate(divide.toString());
                }

                // 及时办结率
                if( completionRateCollect.size() == 0) {
                    complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate("0");
                } else {
                    int timelyCompletionRateInt = 0;
                    for (TComplainDealDTO tComplainDealDTO : completionRateCollect) {
                        String complainType = tComplainDealDTO.getComplainType();
                        Date createTime = tComplainDealDTO.getCreateTime();
                        Date updateTime = tComplainDealDTO.getUpdateTime();

                        if (complainType != null && !"".equals(complainType)
                                && createTime != null && updateTime != null) {
                            long diff = updateTime.getTime() - createTime.getTime();

                            // 是类型1 并且小于 类型1的管理制度
                            if ("1".equals(complainType)) {
                                if (diff - fType1 < 0) {
                                    timelyCompletionRateInt ++;
                                }
                            } else if ("2".equals(complainType)) {
                                if (diff - fType2 < 0) {
                                    timelyCompletionRateInt ++;
                                }
                            } else if ("3".equals(complainType)) {
                                if (diff - fType3 < 0) {
                                    timelyCompletionRateInt ++;
                                }
                            }
                        }
                    }

                    if (timelyCompletionRateInt > 0) {
                        BigDecimal CompletionRateIntDecimal = new BigDecimal(timelyCompletionRateInt);

                        BigDecimal divide = CompletionRateIntDecimal.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                        //统计 及时办结率
                        totalTimelyCompletionRate = totalTimelyCompletionRate.add(CompletionRateIntDecimal);

                        complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate(divide.toString());
                    } else {
                        complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate("0");
                    }
                }
                // 如果没有发生量则别的都是0
            } else {
                complainDealSummaryAnalysisTableVo1.setCompletionRate("0");
                complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate("0");
            }

            complainDealSummaryAnalysisTableVos.add(complainDealSummaryAnalysisTableVo1);
        }
        // 如果有数据，则往 empty集合里面放值
        if (complainDealSummaryAnalysisTableVos.size() > 0) {
            for (int i = 0; i < complainDealSummaryAnalysisTableVosEmpty.size(); i++) {
                ComplainDealSummaryAnalysisTableVo dealSummaryAnalysisTableVo = complainDealSummaryAnalysisTableVosEmpty.get(i);
                for (ComplainDealSummaryAnalysisTableVo summaryAnalysisTableVo : complainDealSummaryAnalysisTableVos) {
                    if (dealSummaryAnalysisTableVo.getDate().equals(summaryAnalysisTableVo.getDate())) {
                        dealSummaryAnalysisTableVo.setAmount(summaryAnalysisTableVo.getAmount());
                        dealSummaryAnalysisTableVo.setCompletionRate(summaryAnalysisTableVo.getCompletionRate());
                        dealSummaryAnalysisTableVo.setTimelyCompletionRate(summaryAnalysisTableVo.getTimelyCompletionRate());
                    }
                }

                //说明是 统计
                if (i == 12 ) {
                    dealSummaryAnalysisTableVo.setAmount(totalAmount.toString());

                    // 统计 办结率
                    BigDecimal divide = totalCompletionRate.multiply(new BigDecimal(100)).divide(totalAmount, 2, BigDecimal.ROUND_HALF_UP);
                    dealSummaryAnalysisTableVo.setCompletionRate(divide.toString());

                    // 统计 及时办结率
                    BigDecimal divide1 = totalTimelyCompletionRate.multiply(new BigDecimal(100)).divide(totalAmount, 2, BigDecimal.ROUND_HALF_UP);
                    dealSummaryAnalysisTableVo.setTimelyCompletionRate(divide1.toString());
                }
            }
        }
        return complainDealSummaryAnalysisTableVosEmpty;
    }

    private List<ComplainDealSummaryAnalysisTableVo> initEmptyList() {
        List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisTableVos = new ArrayList<>(13);
        ComplainDealSummaryAnalysisTableVo complainDealSummaryAnalysisTableVo;
        for (int i = 0; i < 13; i++) {
            complainDealSummaryAnalysisTableVo = new ComplainDealSummaryAnalysisTableVo();
            if (i <12) {
                complainDealSummaryAnalysisTableVo.setDate((i + 1) + "月");
            } else {
                complainDealSummaryAnalysisTableVo.setDate("统计");
            }
            complainDealSummaryAnalysisTableVo.setAmount(null);
            complainDealSummaryAnalysisTableVo.setCompletionRate(null);
            complainDealSummaryAnalysisTableVo.setTimelyCompletionRate(null);
            complainDealSummaryAnalysisTableVos.add(complainDealSummaryAnalysisTableVo);
        }
        return complainDealSummaryAnalysisTableVos;
    }

    /**
     * 统计分析导出
     * @param complainDealSummaryAnalysisTableVo c
     */
    @Override
    public void complainDealSummaryAnalysisExport(HttpServletResponse response, ComplainDealSummaryAnalysisTableVo complainDealSummaryAnalysisTableVo) throws IOException {
        List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisTableVos = complainDealSummaryAnalysisMethodTableViews(complainDealSummaryAnalysisTableVo);
        // 设置动态头
        String dynamicTitle = complainDealSummaryAnalysisTableVo.getDynamicTitle();
        List<List<String>> headList = new ArrayList<>();
        List<String> head0 = new ArrayList<>();
        head0.add(dynamicTitle);
        head0.add("日期");
        List<String> head1 = new ArrayList<>();
        head1.add(dynamicTitle);
        head1.add("发生量");
        List<String> head2 = new ArrayList<>();
        head2.add(dynamicTitle);
        head2.add("办结率");
        List<String> head3 = new ArrayList<>();
        head3.add(dynamicTitle);
        head3.add("办结及时率");
        headList.add(head0);
        headList.add(head1);
        headList.add(head2);
        headList.add(head3);

        List<List<Object>> dataList = complainDealSummaryAnalysisTableVos.stream().map(vo -> {
            List<Object> objectList = new ArrayList<>();
            objectList.add(vo.getDate());
            objectList.add(vo.getAmount());
            objectList.add(vo.getCompletionRate());
            objectList.add(vo.getTimelyCompletionRate());
            return objectList;
        }).collect(Collectors.toList());

        // 设置响应头
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 设置防止中文名乱码
        String filename = URLEncoder.encode("投诉汇总分析", "utf-8");
        response.setHeader("content-disposition", "attachment;filename=" + filename + ".xlsx");

        // 先仅仅写入头，再以不写入头的方式写入数据
        EasyExcel.write(response.getOutputStream())
                .registerWriteHandler(new CustomCellWriteHeightConfig())
                .registerWriteHandler(new CustomCellWriteWidthConfig()).head(headList).sheet("投诉汇总分析列表").doWrite(dataList);
    }

    /**
     * 投诉处置 统计分析 echart 方式 方法
     * @return
     */
    @Override
    public ComplainDealSummaryAnalysisVo complainDealSummaryAnalysisMethod() {

        ComplainDealSummaryAnalysisVo complainDealSummaryAnalysisVo = new ComplainDealSummaryAnalysisVo();
        /*
         * 类型 发生量统计分析*/
        List<Map<String,String>> typeOfNumberOfComplaints = new ArrayList<>();
        /*
         * 区域 发生量统计分析*/
        List<Map<String,String>> regionOfNumberOfComplaints = new ArrayList<>();
        /*
         * 类型 办结率分析*/
        List<Map<String,String>> typeOfCompletionRate = new ArrayList<>();
        /*
         * 区域 办结率分析*/
        List<Map<String,String>> regionOfCompletionRate = new ArrayList<>();
        /*
         * 类型 办结及时率分析*/
        List<Map<String,String>> typeOfTimelyCompletionRate = new ArrayList<>();
        /*
         * 区域 办结及时率分析*/
        List<Map<String,String>> regionOfTimelyCompletionRate = new ArrayList<>();

        // 管理制度
        List<TComplainDealManSysSet> tComplainDealManSysSets = tComplainDealManSysSetMapper.selectTComplainDealManSysSetList(new TComplainDealManSysSet());

        List<SysDictData> t_township = sysDictDataMapper.selectDictDataByType("t_township");

        //1-投诉举报 管理制度时间
        long fType1 = 0;
        //2-服务申请 管理制度时间
        long fType2 = 0;
        //3-咨询建议 管理制度时间
        long fType3 = 0;

        for (TComplainDealManSysSet tComplainDealManSysSet : tComplainDealManSysSets) {
            Long days = tComplainDealManSysSet.getfDay();
            Long hours = tComplainDealManSysSet.getfHours();
            Long minutes = tComplainDealManSysSet.getfMinutes();
            Long seconds = tComplainDealManSysSet.getfSeconds();
            Long allTime = days * 24L * 60 * 60 * 1000
                    + hours * 60 * 60 * 1000
                    + minutes * 60 * 1000
                    + seconds * 1000;
            if ("1".equals(tComplainDealManSysSet.getfType())) {
                fType1= allTime;
            } else if ("2".equals(tComplainDealManSysSet.getfType())) {
                fType2= allTime;
            } else if ("3".equals(tComplainDealManSysSet.getfType())) {
                fType3 = allTime;
            }
        }

        //所有所有发生的投诉
        List<TComplainDeal> tComplainDeals = tComplainDealMapper.queryAllByNotDelete();
        if (tComplainDeals.size() > 0) {

            Map<String,String> itemMap;
            // 先过滤调 区域不为空的
            List<TComplainDeal> townShipNotEmptyList = tComplainDeals.stream().filter(item -> item.getTownship() != null).collect(Collectors.toList());
            if(townShipNotEmptyList.size() > 0) {
                //区域分组
                Map<String, List<TComplainDeal>> townShipCollect = townShipNotEmptyList.stream().collect(Collectors.groupingBy(TComplainDeal::getTownship));

                if(townShipCollect.size() > 0) {
                    for (Map.Entry<String, List<TComplainDeal>> stringListEntry : townShipCollect.entrySet()) {
                        String key = stringListEntry.getKey();
                        for (SysDictData sysDictData : t_township) {
                            if (sysDictData.getDictValue().equals(key)) {
                                key = sysDictData.getDictLabel();
                            }
                        }
                        List<TComplainDeal> value = stringListEntry.getValue();

                        // 总量
                        itemMap = new HashMap<>();
                        itemMap.put("name", key);
                        itemMap.put("value", value.size() + "");
                        regionOfNumberOfComplaints.add(itemMap);
                        BigDecimal count = new BigDecimal(value.size());

                        // 办结率 - 完成的占比
                        List<TComplainDeal> collect = value.stream().filter(item -> "3".equals(item.getComplainStatus())).collect(Collectors.toList());
                        itemMap = new HashMap<>();
                        itemMap.put("name", key);
                        if (collect.size() == 0) {
                            itemMap.put("value", "0");
                        } else {

                            BigDecimal completedCount = new BigDecimal(collect.size());

                            BigDecimal divide = completedCount.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                            itemMap.put("value", divide.toString());

                        }
                        regionOfCompletionRate.add(itemMap);

                        // 办结及时率 - 完成的在 制度时间内的占比
                        itemMap = new HashMap<>();
                        itemMap.put("name", key);
                        if (collect.size() == 0) {
                            itemMap.put("value", "0");
                        } else {
                            int timelyCompletionRateInt = 0;
                            for (TComplainDeal tComplainDeal : collect) {
                                String complainType = tComplainDeal.getComplainType();
                                Date createTime = tComplainDeal.getCreateTime();
                                Date updateTime = tComplainDeal.getUpdateTime();

                                if (complainType != null && !"".equals(complainType)
                                        && createTime != null && updateTime != null) {
                                    long diff = updateTime.getTime() - createTime.getTime();

                                    // 是类型1 并且小于 类型1的管理制度
                                    if ("1".equals(complainType)) {
                                        if (diff - fType1 < 0) {
                                            timelyCompletionRateInt ++;
                                            continue;
                                        }
                                    } else if ("2".equals(complainType)) {
                                        if (diff - fType2 < 0) {
                                            timelyCompletionRateInt ++;
                                            continue;
                                        }
                                    } else if ("3".equals(complainType)) {
                                        if (diff - fType3 < 0) {
                                            timelyCompletionRateInt ++;
                                            continue;
                                        }
                                    }

                                    if (timelyCompletionRateInt > 0) {
                                        BigDecimal CompletionRateIntDecimal = new BigDecimal(timelyCompletionRateInt);

                                        BigDecimal divide = CompletionRateIntDecimal.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                                        itemMap.put("value", divide.toString());
                                    } else {
                                        itemMap.put("value", "0");
                                    }
                                } else {
                                    itemMap.put("value", "0");
                                }
                            }
                        }
                        regionOfTimelyCompletionRate.add(itemMap);
                    }
                }

            }

            List<TComplainDeal> complainTypeNotEmptyList = tComplainDeals.stream().filter(item -> item.getComplainType() != null).collect(Collectors.toList());
            if (complainTypeNotEmptyList.size() > 0) {

                //类型分组
                Map<String, List<TComplainDeal>> typeCollect = complainTypeNotEmptyList.stream().collect(Collectors.groupingBy(TComplainDeal::getComplainType));

                //类型分类 一共三种 循环循环三次
                if (typeCollect.size() > 0) {
                    for (Map.Entry<String, List<TComplainDeal>> stringListEntry : typeCollect.entrySet()) {
                        String key = stringListEntry.getKey();
                        List<TComplainDeal> value = stringListEntry.getValue();
                        if ("1".equals(key)) {
                            key = "投诉举报";
                        } else if ("2".equals(key)) {
                            key = "服务申请";
                        } else if ("3".equals(key)) {
                            key = "咨询建议";
                        }

                        // 总量
                        itemMap = new HashMap<>();
                        itemMap.put("name", key);
                        itemMap.put("value", value.size() + "");
                        typeOfNumberOfComplaints.add(itemMap);
                        BigDecimal count = new BigDecimal(value.size());

                        // 办结率 - 完成的占比
                        List<TComplainDeal> collect = value.stream().filter(item -> "3".equals(item.getComplainStatus())).collect(Collectors.toList());
                        itemMap = new HashMap<>();
                        itemMap.put("name", key);
                        if (collect.size() == 0) {
                            itemMap.put("value", "0");
                        } else {

                            BigDecimal completedCount = new BigDecimal(collect.size());

                            BigDecimal divide = completedCount.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                            itemMap.put("value", divide.toString());

                        }
                        typeOfCompletionRate.add(itemMap);

                        // 办结及时率 - 完成的在 制度时间内的占比
                        itemMap = new HashMap<>();
                        itemMap.put("name", key);
                        if (collect.size() == 0) {
                            itemMap.put("value", "0");
                        } else {
                            int timelyCompletionRateInt = 0;
                            for (TComplainDeal tComplainDeal : collect) {
                                Date createTime = tComplainDeal.getCreateTime();
                                Date updateTime = tComplainDeal.getUpdateTime();

                                if (createTime != null && updateTime != null) {
                                    long diff = updateTime.getTime() - createTime.getTime();

                                    // 是类型1 并且小于 类型1的管理制度
                                    if ("1".equals(key)) {
                                        if (diff - fType1 < 0) {
                                            timelyCompletionRateInt ++;
                                            continue;
                                        }
                                    } else if ("2".equals(key)) {
                                        if (diff - fType2 < 0) {
                                            timelyCompletionRateInt ++;
                                            continue;
                                        }
                                    } else if ("3".equals(key)) {
                                        if (diff - fType3 < 0) {
                                            timelyCompletionRateInt ++;
                                            continue;
                                        }
                                    }

                                    if (timelyCompletionRateInt > 0) {
                                        BigDecimal completionRateIntDecimal = new BigDecimal(timelyCompletionRateInt);

                                        BigDecimal divide = completionRateIntDecimal.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                                        itemMap.put("value", divide.toString());
                                    } else {
                                        itemMap.put("value", "0");
                                    }
                                } else {
                                    itemMap.put("value", "0");
                                }
                            }
                        }
                        typeOfTimelyCompletionRate.add(itemMap);
                    }
                }
            }
        }

        complainDealSummaryAnalysisVo.setRegionOfNumberOfComplaints(regionOfNumberOfComplaints);
        complainDealSummaryAnalysisVo.setTypeOfNumberOfComplaints(typeOfNumberOfComplaints);
        complainDealSummaryAnalysisVo.setRegionOfCompletionRate(regionOfCompletionRate);
        complainDealSummaryAnalysisVo.setTypeOfCompletionRate(typeOfCompletionRate);
        complainDealSummaryAnalysisVo.setRegionOfTimelyCompletionRate(regionOfTimelyCompletionRate);
        complainDealSummaryAnalysisVo.setTypeOfTimelyCompletionRate(typeOfTimelyCompletionRate);

        return complainDealSummaryAnalysisVo;
    }


    /**
     *
     * @param dataSourceName ureport2配置数据源名称
     * @param dataSetName ureport2配置数据集明恒
     * @param map 参数map
     * @return
     */
    @Override
    public List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisMethodTableViewsForUrepore2(String dataSourceName,String dataSetName,Map<String,String> map) {

        String date = map.get("date");
        String complaintCategory = map.get("complaintCategory");
        String township = map.get("township");

        // 管理制度
        List<TComplainDealManSysSet> tComplainDealManSysSets = tComplainDealManSysSetMapper.selectTComplainDealManSysSetList(new TComplainDealManSysSet());

        //1-投诉举报 管理制度时间
        long fType1 = 0;
        //2-服务申请 管理制度时间
        long fType2 = 0;
        //3-咨询建议 管理制度时间
        long fType3 = 0;

        //总发生量
        BigDecimal totalAmount = BigDecimal.ZERO;

        //总办结量
        BigDecimal totalCompletionRate = BigDecimal.ZERO;

        //总及时办结量
        BigDecimal totalTimelyCompletionRate = BigDecimal.ZERO;

        for (TComplainDealManSysSet tComplainDealManSysSet : tComplainDealManSysSets) {
            Long days = tComplainDealManSysSet.getfDay();
            Long hours = tComplainDealManSysSet.getfHours();
            Long minutes = tComplainDealManSysSet.getfMinutes();
            Long seconds = tComplainDealManSysSet.getfSeconds();
            Long allTime = days * 24L * 60 * 60 * 1000
                    + hours * 60 * 60 * 1000
                    + minutes * 60 * 1000
                    + seconds * 1000;
            if ("1".equals(tComplainDealManSysSet.getfType())) {
                fType1= allTime;
            } else if ("2".equals(tComplainDealManSysSet.getfType())) {
                fType2= allTime;
            } else if ("3".equals(tComplainDealManSysSet.getfType())) {
                fType3 = allTime;
            }
        }

        if(StringUtils.isEmpty(date)) {
            return initEmptyList();
        }

        //查询当前年的开始时间和结束时间
        Date startOfMonth = DateUtils.parseDate(date + "-01-01 00:00:00");
        Date endOfMonth = DateUtils.parseDate(date + "-12-31 23:59:59");

        //所有所有发生的投诉
        List<TComplainDealDTO> tComplainDeals = tComplainDealMapper.queryAllByNotDeleteAndCreateTime(startOfMonth,endOfMonth,complaintCategory,township);

        List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisTableVos = new ArrayList<>();

        //先初始化一个空的，然后再循环往里面放值
        List<ComplainDealSummaryAnalysisTableVo> complainDealSummaryAnalysisTableVosEmpty = initEmptyList();
        //如果没数据，就返回一个都是null的数据的集合
        if(tComplainDeals.size() == 0) {
            return complainDealSummaryAnalysisTableVosEmpty;
        }

        Map<String, List<TComplainDealDTO>> collect = tComplainDeals.stream().collect(Collectors.groupingBy(TComplainDealDTO::getCreateTimeYear));
        ComplainDealSummaryAnalysisTableVo complainDealSummaryAnalysisTableVo1;
        for (Map.Entry<String, List<TComplainDealDTO>> stringListEntry : collect.entrySet()) {
            String key = stringListEntry.getKey();
            List<TComplainDealDTO> value = stringListEntry.getValue();
            BigDecimal count = new BigDecimal(value.size());

            // 发生量统计
            totalAmount = totalAmount.add(count);

            complainDealSummaryAnalysisTableVo1 = new ComplainDealSummaryAnalysisTableVo();
            complainDealSummaryAnalysisTableVo1.setDate(key + "月");
            // 发生量
            complainDealSummaryAnalysisTableVo1.setAmount(value.size() + "");

            // 如果有发生量
            if (value.size() > 0) {
                //办结率
                List<TComplainDealDTO> completionRateCollect = value.stream().filter(item -> "3".equals(item.getComplainStatus())).collect(Collectors.toList());

                if (completionRateCollect.size() == 0) {
                    complainDealSummaryAnalysisTableVo1.setCompletionRate("0");
                } else {
                    BigDecimal completedCount = new BigDecimal(completionRateCollect.size());

                    BigDecimal divide = completedCount.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                    //统计 发生率
                    totalCompletionRate = totalCompletionRate.add(completedCount);

                    complainDealSummaryAnalysisTableVo1.setCompletionRate(divide.toString());
                }

                // 及时办结率
                if( completionRateCollect.size() == 0) {
                    complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate("0");
                } else {
                    int timelyCompletionRateInt = 0;
                    for (TComplainDealDTO tComplainDealDTO : completionRateCollect) {
                        String complainType = tComplainDealDTO.getComplainType();
                        Date createTime = tComplainDealDTO.getCreateTime();
                        Date updateTime = tComplainDealDTO.getUpdateTime();

                        if (complainType != null && !"".equals(complainType)
                                && createTime != null && updateTime != null) {
                            long diff = updateTime.getTime() - createTime.getTime();

                            // 是类型1 并且小于 类型1的管理制度
                            if ("1".equals(complainType)) {
                                if (diff - fType1 < 0) {
                                    timelyCompletionRateInt ++;
                                }
                            } else if ("2".equals(complainType)) {
                                if (diff - fType2 < 0) {
                                    timelyCompletionRateInt ++;
                                }
                            } else if ("3".equals(complainType)) {
                                if (diff - fType3 < 0) {
                                    timelyCompletionRateInt ++;
                                }
                            }
                        }
                    }

                    if (timelyCompletionRateInt > 0) {
                        BigDecimal CompletionRateIntDecimal = new BigDecimal(timelyCompletionRateInt);

                        BigDecimal divide = CompletionRateIntDecimal.multiply(new BigDecimal(100)).divide(count, 2, BigDecimal.ROUND_HALF_UP);

                        //统计 及时办结率
                        totalTimelyCompletionRate = totalTimelyCompletionRate.add(CompletionRateIntDecimal);

                        complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate(divide.toString());
                    } else {
                        complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate("0");
                    }
                }
                // 如果没有发生量则别的都是0
            } else {
                complainDealSummaryAnalysisTableVo1.setCompletionRate("0");
                complainDealSummaryAnalysisTableVo1.setTimelyCompletionRate("0");
            }

            complainDealSummaryAnalysisTableVos.add(complainDealSummaryAnalysisTableVo1);
        }
        // 如果有数据，则往 empty集合里面放值
        if (complainDealSummaryAnalysisTableVos.size() > 0) {
            for (int i = 0; i < complainDealSummaryAnalysisTableVosEmpty.size(); i++) {
                ComplainDealSummaryAnalysisTableVo dealSummaryAnalysisTableVo = complainDealSummaryAnalysisTableVosEmpty.get(i);
                for (ComplainDealSummaryAnalysisTableVo summaryAnalysisTableVo : complainDealSummaryAnalysisTableVos) {
                    if (dealSummaryAnalysisTableVo.getDate().equals(summaryAnalysisTableVo.getDate())) {
                        dealSummaryAnalysisTableVo.setAmount(summaryAnalysisTableVo.getAmount());
                        dealSummaryAnalysisTableVo.setCompletionRate(summaryAnalysisTableVo.getCompletionRate());
                        dealSummaryAnalysisTableVo.setTimelyCompletionRate(summaryAnalysisTableVo.getTimelyCompletionRate());
                    }
                }

                //说明是 统计
                if (i == 12 ) {
                    dealSummaryAnalysisTableVo.setAmount(totalAmount.toString());

                    // 统计 办结率
                    BigDecimal divide = totalCompletionRate.multiply(new BigDecimal(100)).divide(totalAmount, 2, BigDecimal.ROUND_HALF_UP);
                    dealSummaryAnalysisTableVo.setCompletionRate(divide.toString());

                    // 统计 及时办结率
                    BigDecimal divide1 = totalTimelyCompletionRate.multiply(new BigDecimal(100)).divide(totalAmount, 2, BigDecimal.ROUND_HALF_UP);
                    dealSummaryAnalysisTableVo.setTimelyCompletionRate(divide1.toString());
                }
            }
        }
        return complainDealSummaryAnalysisTableVosEmpty;
    }


}
