package com.ruoyi.system.service.impl;

import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.domain.entity.SysDictData;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.SysConfig;
import com.ruoyi.system.domain.SysReport;
import com.ruoyi.system.mapper.SysConfigMapper;
import com.ruoyi.system.mapper.SysDictDataMapper;
import com.ruoyi.system.mapper.SysReportMapper;
import com.ruoyi.system.service.ISysReportService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * 【请填写功能名称】Service业务层处理
 *
 * @author ruoyi
 * @date 2022-06-20
 */
@Service
public class SysReportServiceImpl implements ISysReportService
{
    @Autowired
    private SysReportMapper sysReportMapper;

    @Autowired
    private SysDictDataMapper sysDictDataMapper;

    @Autowired
    private SysConfigMapper sysConfigMapper;

    /**
     * 查询【请填写功能名称】
     *
     * @param id 【请填写功能名称】主键
     * @return 【请填写功能名称】
     */
    @Override
    public SysReport selectSysReportById(Long id)
    {
        return sysReportMapper.selectSysReportById(id);
    }

    /**
     * 查询【请填写功能名称】列表
     *
     * @param sysReport 【请填写功能名称】
     * @return 【请填写功能名称】
     */
    @Override
    public List<SysReport> selectSysReportList(SysReport sysReport)
    {
       List<SysReport>  list = sysReportMapper.selectSysReportList(sysReport);
       SysReport p = new SysReport();
       Map<String,Object> pm = sysReport.getParams();
       if(pm==null) pm = new HashMap<>();
       pm.put("isMerge","-1");
       p.setParams(pm);
       List<SysReport>  list2 = sysReportMapper.selectSysReportList(p);
        for (SysReport r:list
             ) {
            for (SysReport r1:list2
            ) {
                for (SysReport r2:list2
                ) {
                    if((r1.getId()+"").equals(r2.getIsMerge())){
                        if(r1.getChildren()==null){
                            r1.setChildren(new ArrayList<>());
                        }
                        r1.getChildren().add(r2);
                    }

                }

                if((r.getId()+"").equals(r1.getIsMerge())){
                    if(r.getChildren()==null){
                        r.setChildren(new ArrayList<>());
                    }
                    r.getChildren().add(r1);
                }
           }
        }
        return list;
    }

    /**
     * 新增【请填写功能名称】
     *
     * @param sysReport 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int insertSysReport(SysReport sysReport)
    {
        sysReport.setCreateTime(DateUtils.getNowDate());
        sysReport.setCreateUser(SecurityUtils.getUserId()+"");
        //设置施工单位
        sysReport.setDept(SecurityUtils.getLoginUser().getUser().getDept().getDeptName());
        sysReport.setClashId("[\""+SecurityUtils.getLoginUser().getDeptId()+"\"]");
        //创建施工日志
        if(sysReport.getAuditDept()!=null){
            try{
                List<String> depts = JSON.parseArray(sysReport.getClashId(),String.class);
                depts.add(sysReport.getAuditDept());
                sysReport.setClashId(JSON.toJSONString(depts));

                sysReport.setExt1("[{\"content\":\"创建施工报备\",\"timestamp\":\""+DateUtils.getTime()+"\",\"deptname\":\""+SecurityUtils.getLoginUser().getUser().getDept().getDeptName()+"\"}]");
                List c= JSON.parseArray(sysReport.getExt1(),Object.class);

                c.add(0,JSON.parse("{\"content\":\"提交审核\",\"timestamp\":\""+ DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,DateUtils.addSeconds(new Date(),1))+"\",\"deptname\":\""+SecurityUtils.getLoginUser().getUser().getDept().getDeptName()+"\"}"));
                sysReport.setExt1( JSON.toJSONString(c));
            }catch (Exception e){}
        }else{
            sysReport.setExt1("[{\"content\":\"创建施工报备\",\"timestamp\":\""+DateUtils.getTime()+"\",\"deptname\":\""+SecurityUtils.getLoginUser().getUser().getDept().getDeptName()+"\"}]");

        }
        return sysReportMapper.insertSysReport(sysReport);
    }

    /**
     * 修改【请填写功能名称】
     *
     * @param sysReport 【请填写功能名称】
     * @return 结果
     */
    @Override
    public int updateSysReport(SysReport sysReport)
    {
        sysReport.setUpdateTime(DateUtils.getNowDate());
        List<SysDictData> sysDictDatas = sysDictDataMapper.selectDictDataByType("report_status");
        if(sysReport.getAuditDept()!=null){
            List<String> depts = JSON.parseArray(sysReport.getClashId(),String.class);
            depts.add(sysReport.getAuditDept());
            sysReport.setClashId(JSON.toJSONString(depts));
        }




        if(sysReport.getStatus()!=null){
            for ( SysDictData d:sysDictDatas
                 ) {
                if(d.getDictValue().equals(sysReport.getStatus()) && d.getRemark()!=null && !d.getDictValue().equals("")){
                    try{
                        SysReport report = sysReportMapper.selectSysReportById(sysReport.getId());
                        List c= JSON.parseArray(report.getExt1(),Object.class);
                        c.add(JSON.parse("{\"content\":\""+d.getRemark()+"\",\"timestamp\":\""+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,DateUtils.addSeconds(new Date(),1))+"\",\"deptname\":\""+SecurityUtils.getLoginUser().getUser().getDept().getDeptName()+"\"}"));
                        sysReport.setExt1( JSON.toJSONString(c));
                    }catch (Exception e){}
                }
            }

        }
        try{

            if(sysReport.getExt1()!=null){
                List c = JSON.parseArray(sysReport.getExt1(),Map.class);
                Map<String,String> last = (Map<String, String>) c.get(c.size()-1);
                if(last.get("content").contains("审批结果：同意")){
                    //当审批同意时 自动转入下一部门审批
//                    Map<String,Object> stringObjectMap = new HashMap<>();
//                    stringObjectMap.put("config_key","spflow");
                    SysConfig config = new SysConfig();
                    config.setConfigKey("spflow");
                    List<SysConfig> configs =  sysConfigMapper.selectConfigList(config);

                    if(configs.size()>0 && sysReport.getStatus()==null && sysReport.getAuditDept()==null ){
                        List<List> lclist = JSON.parseArray(configs.get(0).getConfigValue(),List.class);
                        if(lclist.size()>0){
                            for (List c1:
                                lclist) {
                                if(c1.size()>0){
                                    //包含审批部门
                                    if(c1.contains(SecurityUtils.getLoginUser().getDeptId()+"")){
                                        int index =  c1.indexOf(SecurityUtils.getLoginUser().getDeptId()+"");
                                        if(index+1<c1.size()){
                                            String deptid = (String) c1.get(index+1);
                                            try{
                                                //写审批部门
                                                sysReport.setAuditDept(deptid);

                                                SysReport report = sysReportMapper.selectSysReportById(sysReport.getId());
                                                List<String> depts = JSON.parseArray(report.getClashId(),String.class);
                                                depts.add(sysReport.getAuditDept());
                                                sysReport.setClashId(JSON.toJSONString(depts));

                                                //写审批日志
                                                List c2= JSON.parseArray(sysReport.getExt1(),Object.class);
                                                c2.add(JSON.parse("{\"content\":\"提交审批\",\"timestamp\":\""+DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,DateUtils.addSeconds(new Date(),1))+"\",\"deptname\":\""+SecurityUtils.getLoginUser().getUser().getDept().getDeptName()+"\"}"));
                                                sysReport.setExt1( JSON.toJSONString(c2));
                                            }catch (Exception e){}

                                        }else {
                                            //完成审批
                                            sysReport.setStatus("3");
                                        }
                                    }
                                }

                            }

                        }
                    }


                }else if((last.get("content").contains("审批结果：不同意")&&(("2").equals(sysReport.getStatus())||sysReport.getStatus()==null))||("4").equals(sysReport.getStatus())){
                    //当审批不同意是 自动关闭
                    sysReport.setStatus("4");
                }


            }


        }catch (Exception w){}



        return sysReportMapper.updateSysReport(sysReport);
    }

    /**
     * 批量删除【请填写功能名称】
     *
     * @param ids 需要删除的【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteSysReportByIds(Long[] ids)
    {
        return sysReportMapper.deleteSysReportByIds(ids);
    }

    /**
     * 删除【请填写功能名称】信息
     *
     * @param id 【请填写功能名称】主键
     * @return 结果
     */
    @Override
    public int deleteSysReportById(Long id)
    {
        return sysReportMapper.deleteSysReportById(id);
    }

    @Override
    public List<SysReport> collisionDetection(Long[] ids) {
        return sysReportMapper.collisionDetection(ids);
    }

    @Override
    public List<SysReport> mergeQuery(Long[] ids) {
        return sysReportMapper.mergeQuery(ids);
    }

    @Override
    public Map mergeReport(Long[] ids) {
        //合并
        boolean canmerge = true;
        List<SysReport>  mreports = sysReportMapper.mergeQuery(ids);


        List<String> depts = new ArrayList<>();

        for (SysReport r:mreports
             ) {
            //拒绝合并 无合并项 的情况
            if(r.getCids()==null || r.getCids().equals("")){
                canmerge = false;
                break;
            }
            //拒绝合并 A与B B与C A不与C 的情况
            if(r.getCids().split(",").length != mreports.size()-1){
                canmerge = false;
                break;
            }
        }
        if(!canmerge) {
            throw  new RuntimeException("所选id存在不可以合并报备单");
        }

        List<SysReport> reportList = sysReportMapper.selectSysReportByIds(ids);
        for (SysReport s:reportList
        ) {
            List<String> dept = JSON.parseArray(s.getClashId(),String.class);
            depts.addAll(dept);
        }


        List<SysReport> reports = sysReportMapper.selectSysReportByIds(ids);
        SysReport sysReport = new SysReport();
        sysReport.setIsMerge("-1");
        //合并后待审核是当前部门
        sysReport.setAuditDept(SecurityUtils.getDeptId()+"");
        //合并后可见范围为合并子任务可见范围的合集
        sysReport.setClashId(JSON.toJSONString(depts));

        sysReport.setExt1("[{\"content\":\"创建合并施工报备\",\"timestamp\":\""+DateUtils.getTime()+"\",\"deptname\":\""+SecurityUtils.getLoginUser().getUser().getDept().getDeptName()+"\"}]");
//        List c= JSON.parseArray(sysReport.getExt1(),Object.class);
//        sysReport.setExt1( JSON.toJSONString(c));



        sysReportMapper.insertSysReport(sysReport);
        Long id =sysReport.getId();
        for (SysReport r:reports
             ) {
            r.setIsMerge(id+"");
            r.setStatus("5");
            sysReportMapper.updateSysReport(r);
        }
        sysReport.setId(Long.parseLong(id+""));
        Map<String, Object> map = new HashMap<>();
        map.put("childlist",reports);
        map.put("p",sysReport);
        return map;
    }


}
