package com.ruoyi.service.impl;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.DataStatisticsUtils;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.domain.*;
import com.ruoyi.mapper.*;
import com.ruoyi.service.*;
import com.ruoyi.system.service.ISysUserService;
import com.ruoyi.web.request.*;
import com.ruoyi.web.response.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

@Transactional
@Service
public class TaskServiceImpl extends ServiceImpl<TaskMapper, Task>implements TaskService {

    @Autowired
    private TaskMapper taskMapper;

    @Autowired
    private ISysUserService sysUserService;

    @Autowired
    private StandardService standardService;

    @Autowired
    private TaskUserRelationService taskUserRelationService;

    @Autowired
    private TaskService taskService;

    @Autowired
    private SystemReviewTaskService systemReviewTaskService;

    @Autowired
    private CarReviewTaskService carReviewTaskService;

    @Autowired
    private SystemReviewTaskMapper systemReviewTaskMapper;

    @Autowired
    private CarReviewTaskMapper carReviewTaskMapper;

    @Autowired
    private ReviewDetailsMapper reviewDetailsMapper;

    @Autowired
    private TaskStateFacade taskStateFacade;

    @Autowired
    private TaskSampleRelationService taskSampleRelationService;

    @Autowired
    private SampleManagementMapper sampleManagementMapper;

    @Autowired
    private TaskSampleRelationMapper taskSampleRelationMapper;

    @Autowired
    private ReviewEnterpriseArchiveMapper reviewEnterpriseArchiveMapper;

    @Autowired
    private ReviewEnterpriseArchiveService reviewEnterpriseArchiveService;

    @Autowired
    private ReviewStandardService reviewStandardService;

    @Autowired
    private ReviewDetailsResultService reviewDetailsResultService;

    @Autowired
    private AutomobileEnterpriseMapper automobileEnterpriseMapper;

    @Autowired
    private ModelTestTaskService modelTestTaskService;

    @Autowired
    private TaskScenarioRelationMapper taskScenarioRelationMapper;

    @Autowired
    private TaskFileRelationService taskFileRelationService;

    @Autowired
    private ModelTestTaskMapper modelTestTaskMapper;

    @Autowired
    private TaskUserRelationMapper taskUserRelationMapper;

    @Autowired
    private TestRecordsMapper testRecordsMapper;

    @Override
    public List<Task> findList(TaskListRequest request) {
        return taskMapper.findList(request);
    }

    @Override
    public void createTask(TaskCreateRequest request) {

        // 构建任务创建者
        LoginUser loginUser = SecurityUtils.getLoginUser();

        TaskGetInfoResponse temporaryStorageTask = taskService.getByUserId(loginUser.getUserId());
        if(temporaryStorageTask != null) {
            taskMapper.deleteById(temporaryStorageTask.getId());

            // 删除暂存任务与整车样品的信息
            List<TaskSampleRelation> sampleRelations = taskSampleRelationService.selectByTaskId(temporaryStorageTask.getId(),TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE);
            if (sampleRelations != null && sampleRelations.size() != 0) {
                taskSampleRelationService.removeBatchByIds(sampleRelations);
            }

            // 删除暂存任务与零件样品的信息
            List<TaskSampleRelation> partRelationList = taskSampleRelationService.selectByTaskId(temporaryStorageTask.getId(),TaskSampleRelation.PART_VEHICLE_SAMPLE);
            if (partRelationList != null && partRelationList.size() != 0) {
                taskSampleRelationService.removeBatchByIds(partRelationList);
            }

            // 删除暂存任务与小组的信息
            List<TaskUserRelation> list = taskUserRelationService.selectQTeamMembers(temporaryStorageTask.getId());
            if (list != null && list.size() != 0) {
                taskUserRelationService.removeBatchByIds(list);
            }

            // 删除暂存任务与文件的信息
            List<TaskFileRelation> fileRelations = taskFileRelationService.findByTaskId(temporaryStorageTask.getId());
            if (fileRelations != null && fileRelations.size() != 0) {
                taskFileRelationService.removeBatchByIds(fileRelations);
            }
        }

        Long sum = taskMapper.findTaskName(request.getTaskName());

        // TODO 任务名称验重
//        if (sum > 0) {
//            throw new ServiceException("任务名称重复,请检查", HttpStatus.ERROR);
//        } else {

            SysUser initiator = sysUserService.selectUserById(loginUser.getUserId());
            Standard standard = standardService.findListById(request.getStandardId());

            // 找到审查组长
            TaskUserRelation leader = null;
            List<TaskUserRelation> auditors = request.getAuditors();
            for(TaskUserRelation auditor : auditors) {
                if(auditor.getIsLeader() == 1) {
                    leader = auditor;
                    break;
                }
            }

            // 构建并保存任务信息
            // 总任务
            Task task = new Task();
            task.setTaskInitiatorId(loginUser.getUserId());
            task.setTaskInitiator(initiator.getNickName());
            if (initiator.getDept() != null) {
                task.setTaskInitiatorDept(initiator.getDept().getDeptName());
            }
            task.setTaskStatus(Task.TASK_STATUS_NEW);
            task.setRunStatus(Task.RUN_STATUS_RUNNABLE);
            task.setLeaderId(leader.getUserId());
            task.setLeader(leader.getName());
            task.setCreateTime(new Date());
            task.setName(standard.getName());
            task.setStandardNo(standard.getStandardNo());
            task.setFile(standard.getFile());
            setTaskList(request.getTaskList(),task);
            BeanUtils.copyBeanProp(task, request);

            if(request.getTaskList().contains(Task.SUB_TASK_GRFIS)) {
                // 保存车型审查问卷任务
                task.setCarReviewTaskId(saveCarReview(request,initiator,standard,leader));
            }
            if(request.getTaskList().contains(Task.SUB_TASK_SRAIF)) {
                // 保存体系审查任务
                task.setSystemReviewTaskId(saveSystemReview(request,initiator,standard,leader));
            }
            if (request.getTaskList().contains(Task.SUB_TASK_TRFIS)) {
                task.setModelTestTaskId(saveModelTest(request, initiator, standard, leader));
            }

            taskService.save(task);

            // 总任务包含车型试验,添加任务-场景关联信息
            saveTaskScenario(task.getId(), request.getTestScenarioList());

            // 构建并保存该任务所关联的审核组信息
            saveUserRelation(auditors,task);

            // 保存关联的整车样品信息和零部件样品信息
            List<TaskSampleRelation> relations = request.getSample();
            List<TaskSampleRelation> partRelations = request.getPartSample();
            saveSampleRelation(relations,partRelations,task);

            // 保存任务关联的文件信息
            saveFileList(request.getFileList(),task);

            taskStateFacade.doCreate(task, request.getTaskList());

//        }
    }

    @Override
    public List<TaskFindResponse> findPending(TaskFindPendingRequest request,Long userId) {
        List<TaskFindResponse> responses = taskMapper.findPending(request,userId);

        if (responses != null && responses.size() != 0) {
            // 小组成员
            List<UserNameResponse> userList = taskMapper.findByUserIdList(responses);
            setLeader(userList,responses);

            // 体系审查子任务列表
            List<SystemReviewTask> systemReviewTaskList = systemReviewTaskMapper.findByTaskList(responses);
            setSystemProgress(systemReviewTaskList,responses);

            // 车型问卷子任务列表
            List<CarReviewTask> carReviewTaskList = carReviewTaskMapper.findByTaskList(responses);
            setCarProgress(carReviewTaskList,responses);

            // 车型试验子任务列表
//            List<ModelTestTask> modelTestTaskList = modelTestTaskMapper.findByTaskList(responses);
//            setModelProgress(modelTestTaskList,responses);
            // 设置车型试验进度
            setModelSchedule(responses);

            // 任务是否有选择场景
//            List<TaskScenarioResponse> scenarioResponseList = taskMapper.findByTaskList(responses);
//            setTaskScenario(scenarioResponseList,responses);


            for (TaskFindResponse response : responses) {
                String[] taskList = response.getTaskList().split(",");
                if (response.getPointer() < taskList.length) {
                    response.setNextSubTask(taskList[response.getPointer()]);
                } else {
                    response.setNextSubTask(taskList[taskList.length - 1]);
                }
            }

        }

        return responses;
    }

    @Override
    public List<Task> findFinish(TaskFindFinishRequest request) {

        List<Task> taskList = taskMapper.findFinish(request);

        if (taskList != null && taskList.size() != 0) {

            List<UserNameResponse> responseList = taskMapper.findByFinishTaskList(taskList);

            setFinishLeader(responseList,taskList);
        }

        return taskList;
    }

    @Override
    public void editTask(TaskEditRequest request) {

        Task oldTask = taskMapper.findByName(request.getTaskName());

        // TODO 任务名称验重
//        if (oldTask == null || Objects.equals(oldTask.getId(), request.getId())) {
            // 构建任务创建者
            LoginUser loginUser = SecurityUtils.getLoginUser();
            SysUser initiator = sysUserService.selectUserById(loginUser.getUserId());
            Standard standard = standardService.findListById(request.getStandardId());

            // 找到审查组长
            TaskUserRelation leader = null;
            List<TaskUserRelation> auditors = request.getAuditors();
            for(TaskUserRelation auditor : auditors) {
                if(auditor.getIsLeader() == 1) {
                    leader = auditor;
                    break;
                }
            }

            // 构建并保存任务信息
            // 总任务
            Task task = taskMapper.selectById(request.getId());
            task.setLeaderId(leader.getUserId());
            task.setLeader(leader.getName());
            setTaskList(request.getTaskList(),task);
            BeanUtils.copyBeanProp(task, request);

            // 子任务发送变化
            changeSubTask(request,task,initiator,standard,leader);

            task.setMaxPointer(request.getTaskList().size());

            taskService.updateById(task);

            // 构建并保存该任务所关联的审核组信息
            saveUserRelation(auditors,task);

            // 判断第一个整车样品的生产企业是否变化
            judgmentSample(request);

            // 保存关联的整车样品信息和零部件样品信息
            List<TaskSampleRelation> relations = request.getSample();
            List<TaskSampleRelation> partRelations = request.getPartSample();
            saveSampleRelation(relations,partRelations,task);

            // 保存任务关联的文件信息
            saveFileList(request.getFileList(),task);
//        } else {
//            throw new ServiceException("任务名称重复,请检查", HttpStatus.ERROR);
//        }


    }

    @Override
    public void deleteTask(TaskDeleteRequest request) {
        Task task = taskMapper.selectById(request.getId());

        systemReviewTaskMapper.deleteById(task.getSystemReviewTaskId());
        carReviewTaskMapper.deleteById(task.getCarReviewTaskId());
        modelTestTaskMapper.deleteById(task.getModelTestTaskId());

        // 小组
        List<TaskUserRelation> list = taskUserRelationService.selectQTeamMembers(task.getId());
        if (list != null && list.size() != 0) {
            taskFileRelationService.removeBatchByIds(list);
        }

        // 样品
        List<TaskSampleRelation> relationList = taskSampleRelationService.selectByTaskId(task.getId(),TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE);
        if (relationList != null && relationList.size() != 0) {
            taskSampleRelationService.removeBatchByIds(relationList);
        }
        List<TaskSampleRelation> partRelationList = taskSampleRelationService.selectByTaskId(task.getId(),TaskSampleRelation.PART_VEHICLE_SAMPLE);
        if (partRelationList != null && partRelationList.size() != 0) {
            taskSampleRelationService.removeBatchByIds(partRelationList);
        }

        // 文件
        List<TaskFileRelation> fileList = taskFileRelationService.findByTaskId(task.getId());
        if (fileList != null && fileList.size() != 0) {
            taskFileRelationService.removeBatchByIds(fileList);
        }

        taskMapper.deleteById(request.getId());
    }

    @Override
    public void startTask(TaskStartRequest request) {
        Task task = taskMapper.selectById(request.getId());
        taskStateFacade.doStart(task, request);
    }

    @Override
    public List<TaskFindResponse> findCreate(TaskFindRequest request,Long userId) {
        List<TaskFindResponse> responses = taskMapper.findByUserId(request,userId);

        if (responses != null && responses.size() != 0) {
            // 小组成员
            List<UserNameResponse> userList = taskMapper.findByUserIdList(responses);
            setLeader(userList,responses);

            // 体系审查子任务列表
            List<SystemReviewTask> systemReviewTaskList = systemReviewTaskMapper.findByTaskList(responses);
            setSystemProgress(systemReviewTaskList,responses);

            // 车型问卷子任务列表
            List<CarReviewTask> carReviewTaskList = carReviewTaskMapper.findByTaskList(responses);
            setCarProgress(carReviewTaskList,responses);

            // 车型试验子任务列表
//            List<ModelTestTask> modelTestTaskList = modelTestTaskMapper.findByTaskList(responses);
//            setModelProgress(modelTestTaskList,responses);
            // 设置车型试验进度
            setModelSchedule(responses);

            for (TaskFindResponse response : responses) {
                String[] taskList = response.getTaskList().split(",");
                if (response.getPointer() < taskList.length) {
                    response.setNextSubTask(taskList[response.getPointer()]);
                } else {
                    response.setNextSubTask(taskList[taskList.length - 1]);
                }
            }
        }

        return responses;
    }

    @Override
    public TaskGetInfoResponse getInfo(TaskGetInfoRequest request) {

        TaskGetInfoResponse response = new TaskGetInfoResponse();
        Task task = taskService.getById(request.getId());

        if (task != null) {
            BeanUtils.copyBeanProp(response, task);

            if (response.getTaskList().startsWith(",")) {
                String taskList = response.getTaskList().substring(1);
                response.setTaskList(taskList);
            }

            // 测试场景
            response.setTestScenarioList(selectTestScenarioList(task));

            // 小组成员
            response.setAuditors(setAuditors(request.getId()));

            // 整车样品信息
            response.setCompleteVehicleSample(setSampleList(request.getId(),TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE));

            // 零部件样品信息
            response.setPartVehicleSample(setSampleList(request.getId(),TaskSampleRelation.PART_VEHICLE_SAMPLE));

            // 上传的文件
            response.setFileList(taskFileRelationService.findByTaskId(request.getId()));

            return response;
        } else {
            return null;
        }

    }

    /**
     * 查询测试列表
     * @param task
     * @return
     */
    private List<Long> selectTestScenarioList(Task task) {
        List<Long> list = new ArrayList<>();
        List<String> taskList = Arrays.asList(task.getTaskList().split(","));
        if (taskList.contains(Task.SUB_TASK_TRFIS) && taskList.size() == 1
        || taskList.contains(Task.SUB_TASK_TRFIS) && taskList.contains(Task.SUB_TASK_SRAIF) && taskList.size() == 2) {
            list = taskScenarioRelationMapper
                    .selectList(new QueryWrapper<TaskScenarioRelation>().eq("task_id", task.getId()))
                    .stream()
                    .map(TaskScenarioRelation::getTestScenarioId)
                    .collect(Collectors.toList());
        }
        return list;
    }

    @Override
    public List<Task> findUserFinish(TaskFindFinishRequest request,Long userId) {

        List<Task> taskList = taskMapper.findUserFinish(request,userId);

        if (taskList != null && taskList.size() != 0) {

            List<UserNameResponse> responseList = taskMapper.findByFinishTaskList(taskList);

            setFinishLeader(responseList,taskList);
        }

        return taskList;
    }

    @Override
    public void temporaryStorageTask(TaskCreateRequest request) {

        Long sum = taskMapper.findTaskName(request.getTaskName());
        // TODO 任务名称验重
//        if (sum > 0) {
//            throw new ServiceException("任务名称重复,请检查", HttpStatus.ERROR);
//        } else {
            // 构建任务创建者
            LoginUser loginUser = SecurityUtils.getLoginUser();
            SysUser initiator = sysUserService.selectUserById(loginUser.getUserId());
            Standard standard = standardService.findListById(request.getStandardId());

            // 构建并保存任务信息
            // 总任务
            Task task = new Task();
            task.setTaskInitiatorId(loginUser.getUserId());
            task.setTaskInitiator(initiator.getNickName());
            if (initiator.getDept() != null) {
                task.setTaskInitiatorDept(initiator.getDept().getDeptName());
            }
            task.setTaskStatus(Task.TASK_STATUS_TEMPORARILY);
            String joinTaskList = StringUtils.join(request.getTaskList(),",");
            task.setTaskList(joinTaskList);
            BeanUtils.copyBeanProp(task, request);

            if (standard != null) {
                task.setName(standard.getName());
                task.setStandardNo(standard.getStandardNo());
                task.setFile(standard.getFile());
            }

            // 找到审查组长
            TaskUserRelation leader = null;
            List<TaskUserRelation> auditors = request.getAuditors();
            if (auditors != null && auditors.size() != 0) {
                for(TaskUserRelation auditor : auditors) {
                    if(auditor.getIsLeader() == 1) {
                        leader = auditor;
                        break;
                    }
                }

                // 任务组长
                task.setLeaderId(leader.getUserId());
                task.setLeader(leader.getName());
            }

            // 暂存
            taskService.save(task);

            // 测试场景
            saveTaskScenario(task.getId(), request.getTestScenarioList());

            // 保存任务与小组信息
            saveUserRelation(auditors,task);

            // 保存关联的整车样品信息和零部件样品信息
            List<TaskSampleRelation> relations = request.getSample();
            List<TaskSampleRelation> partRelations = request.getPartSample();
            saveSampleRelation(relations,partRelations,task);

            // 保存任务关联的文件信息
            saveFileList(request.getFileList(),task);
//        }

    }

    @Override
    public void editTemporaryStorageTask(TaskEditRequest request) {

        Task oldTask = taskMapper.findByName(request.getTaskName());

        // TODO 任务名称验重
//        if (oldTask == null || Objects.equals(oldTask.getId(), request.getId())) {
            // 构建任务创建者
            LoginUser loginUser = SecurityUtils.getLoginUser();
            SysUser initiator = sysUserService.selectUserById(loginUser.getUserId());
            Standard standard = standardService.findListById(request.getStandardId());

            // 构建并保存任务信息
            // 总任务
            Task task = new Task();
            String joinTaskList = StringUtils.join(request.getTaskList(),",");
            task.setTaskList(joinTaskList);
            BeanUtils.copyBeanProp(task, request);

            if (standard != null) {
                task.setName(standard.getName());
                task.setStandardNo(standard.getStandardNo());
                task.setFile(standard.getFile());
            }

            taskScenarioRelationMapper.delete(new QueryWrapper<TaskScenarioRelation>().lambda().eq(TaskScenarioRelation::getTaskId, task.getId()));
            saveTaskScenario(task.getId(), request.getTestScenarioList());

            // 找到审查组长
            TaskUserRelation leader = null;
            List<TaskUserRelation> auditors = request.getAuditors();
            if (auditors != null && auditors.size() != 0) {
                for(TaskUserRelation auditor : auditors) {
                    if(auditor.getIsLeader() == 1) {
                        leader = auditor;
                        break;
                    }
                }
                // 任务组长
                task.setLeaderId(leader.getUserId());
                task.setLeader(leader.getName());
            }

            // 更新暂存
            taskService.updateById(task);

            // 保存任务与小组信息
            saveUserRelation(auditors,task);


            // 保存关联的整车样品信息
            List<TaskSampleRelation> relations = request.getSample();
            List<TaskSampleRelation> partRelations = request.getPartSample();
            saveSampleRelation(relations,partRelations,task);

            // 保存任务关联的文件信息
            saveFileList(request.getFileList(),task);
//        } else {
//            throw new ServiceException("任务名称重复,请检查", HttpStatus.ERROR);
//        }

    }

    @Override
    public TaskGetInfoResponse getByUserId(Long userId) {

        TaskGetInfoResponse response = new TaskGetInfoResponse();
        Task task = taskMapper.getByUserIdTemporary(userId);

        if (task != null && task.getId() != null) {

            BeanUtils.copyBeanProp(response, task);

            if (response.getTaskList().startsWith(",")) {
                String taskList = response.getTaskList().substring(1);
                response.setTaskList(taskList);
            }

            // 测试场景
            response.setTestScenarioList(selectTestScenarioList(task));

            // 小组成员
            response.setAuditors(setAuditors(task.getId()));

            // 整车样品信息
            response.setCompleteVehicleSample(setSampleList(task.getId(), TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE));

            // 零部件样品信息
            response.setPartVehicleSample(setSampleList(task.getId(), TaskSampleRelation.PART_VEHICLE_SAMPLE));

            // 上传的文件
            response.setFileList(taskFileRelationService.findByTaskId(task.getId()));

            return response;
        } else {
            return null;
        }


    }

    @Override
    public TaskGetInfoResponse getBySubtaskId(TaskSubGetInfoRequest request) {
        TaskGetInfoResponse response = new TaskGetInfoResponse();
        Task task = taskMapper.getBySubtaskId(request.getId());

        if (task != null) {
            BeanUtils.copyBeanProp(response, task);
            // 小组成员
            response.setAuditors(setAuditors(task.getId()));

            // 整车样品信息
            response.setCompleteVehicleSample(setSampleList(task.getId(),TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE));

            // 零部件样品信息
            response.setPartVehicleSample(setSampleList(task.getId(),TaskSampleRelation.PART_VEHICLE_SAMPLE));

            return response;
        } else {
            return null;
        }

    }

    @Override
    public DataStatisticsResponse dataStatistics(TaskGetInfoRequest request) {

        Task task = taskMapper.selectById(request.getId());
        DataStatisticsResponse response = new DataStatisticsResponse();

        if (task.getSystemReviewTaskId() != null) {

            response.setSystemExist(true);

            systemReviewTaskService.view(task.getSystemReviewTaskId());

            SystemReviewTask systemReviewTask = systemReviewTaskMapper.selectById(task.getSystemReviewTaskId());
            // 获取最新问卷
            List<ReviewStandard> standardTree = reviewStandardService.findTree(systemReviewTask.getStandardId(), ReviewStandard.TYPE_SYSTEM);

            // 获取当前问卷答案
            List<ReviewDetailsResult> results = reviewDetailsResultService.findByTaskId(systemReviewTask.getId());

            // 体系审查
            setSystemDataStatistics(standardTree,results,response,systemReviewTask);

        } else {
            response.setSystemExist(false);
        }

        if (task.getCarReviewTaskId() != null) {

            response.setCarExist(true);

            carReviewTaskService.viewReviewTask(task.getCarReviewTaskId());

            CarReviewTask carReviewTask = carReviewTaskMapper.selectById(task.getCarReviewTaskId());

            // 获取最新问卷
            List<ReviewStandard> carStandardTree = reviewStandardService.findTree(carReviewTask.getStandardId(), ReviewStandard.TYPE_CAR);

            // 获取当前问卷答案
            List<ReviewDetailsResult> carResults = reviewDetailsResultService.findByTaskId(carReviewTask.getId());

            // 车型审查
            setCarDataStatistics(carStandardTree,carResults,response,carReviewTask);

        } else {
            response.setCarExist(false);
        }

        return response;

    }


    private void setFinishLeader(List<UserNameResponse> responseList, List<Task> taskList) {

        if (responseList != null && responseList.size() != 0) {
            for (UserNameResponse response : responseList) {
                for (Task task : taskList) {
                    if (Objects.equals(response.getUserId(), task.getLeaderId())) {
                        task.setLeader(response.getName());
                    }
                }
            }
        }
    }

    private void setLeader(List<UserNameResponse> userList, List<TaskFindResponse> responses) {

        if (userList != null && userList.size() != 0) {
            for (UserNameResponse response : userList) {
                for (TaskFindResponse findResponse : responses) {
                    if (Objects.equals(findResponse.getLeaderId(), response.getUserId())) {
                        findResponse.setLeader(response.getName());
                    }
                }
            }
        }

    }

    private void setTaskScenario(List<TaskScenarioResponse> scenarioResponseList, List<TaskFindResponse> responses) {

        if (scenarioResponseList != null && scenarioResponseList.size() != 0) {
            for (TaskScenarioResponse response : scenarioResponseList) {
                for (TaskFindResponse findResponse : responses) {
                    if (Objects.equals(findResponse.getId(), response.getTaskId())) {
                        if (response.getNum() > 0) {
                            findResponse.setTaskScenario(true);
                        }
                    }
                }
            }
        }
    }

    private void setModelSchedule(List<TaskFindResponse> responses) {

        if (responses != null && responses.size() != 0) {

            for (TaskFindResponse response : responses) {
                if (response.getTestSchemeId() != null) {
                    // 获取任务的用例数量
                    Map<String, Object> map = new HashMap<>();
                    map.put("id", response.getTestSchemeId());
                    map.put("verbose", "BASIC");

                    //以post形式请求接口
                    String result= HttpUtil.post("https://10.12.48.78:8090/DescribeProjectTestResult", JSONObject.toJSONString(map));

                    JSONObject jsonObject = JSONObject.parseObject(result);

                    // 获取项目id
                    Integer useCaseNum = (Integer) jsonObject.get("case_count");

                    // 任务是否有选择用例
                    response.setTaskScenario(useCaseNum > 0);

                    // 任务用例结果数量
                    Long resultNum = testRecordsMapper.countResult(response.getTestSchemeId());

                    if (Objects.equals(response.getTestStatus(), ModelTestTask.TASK_STATUS_FINISH)) {
                        response.setTest(100.0);
                    } else if (Objects.equals(response.getTestStatus(), ModelTestTask.TASK_STATUS_SIGNED)) {
                        response.setTest(90.0);
                    } else if(resultNum == null) {
                        response.setTest(0.0);
                    } else {
                        BigDecimal num = new BigDecimal((1.0 * resultNum / useCaseNum) * 90);
                        response.setTest(num.setScale(1,BigDecimal.ROUND_UP).doubleValue());
                    }

                } else {
                    // 任务是否有选择用例
                    response.setTaskScenario(false);
                }
            }

        }
    }

    private void setModelProgress(List<ModelTestTask> modelTestTaskList, List<TaskFindResponse> responses) {

        if (modelTestTaskList != null && modelTestTaskList.size() != 0) {
            // 子任务进度列表
            List<ResultCountResponse> testResponseList = modelTestTaskMapper.testAnswerCount(responses);

            if (testResponseList != null && testResponseList.size() != 0) {
                // 设置子任务不为finish时,最大进度为90 进度为null时,改为0
                for (ResultCountResponse response : testResponseList) {
                    if (Objects.equals(response.getTaskStatus(), ModelTestTask.TASK_STATUS_FINISH)) {
                        response.setSchedule(100.0);
                    } else if (Objects.equals(response.getTaskStatus(), ModelTestTask.TASK_STATUS_SIGNED)) {
                        response.setSchedule(90.0);
                    } else if (response.getSchedule() == null) {
                        response.setSchedule(0.0);
                    } else {
                        BigDecimal num = new BigDecimal(response.getSchedule());
                        response.setSchedule(num.setScale(1,BigDecimal.ROUND_UP).doubleValue());
                    }
                }

                for (ResultCountResponse responseList : testResponseList) {
                    for (TaskFindResponse response : responses) {
                        if (responseList.getTaskId().equals(response.getModelTestTaskId())) {
                            response.setTest(responseList.getSchedule());
                        }
                    }
                }
            }

        }

    }

    private void setCarProgress(List<CarReviewTask> carReviewTaskList, List<TaskFindResponse> responses) {

        if (carReviewTaskList != null && carReviewTaskList.size() != 0) {
            // 子任务列表进度
            List<ResultCountResponse> carResponseList = reviewDetailsMapper.carAnswerCount(carReviewTaskList,CarReviewTask.TYPE);

            if (carResponseList != null && carResponseList.size() != 0) {
                // 设置子任务不为finish时,最大进度为90
                for (ResultCountResponse response : carResponseList) {
                    if (Objects.equals(response.getTaskStatus(), CarReviewTask.TASK_STATUS_FINISH)) {
                        response.setSchedule(100.0);
                    } else {
                        BigDecimal num = new BigDecimal(response.getSchedule());
                        response.setSchedule(num.setScale(1,BigDecimal.ROUND_UP).doubleValue());
                    }
                }

                for (ResultCountResponse responseList : carResponseList) {
                    for (TaskFindResponse response : responses) {
                        if (responseList.getTaskId().equals(response.getCarReviewTaskId())) {
                            response.setCarReview(responseList.getSchedule());
                        }
                    }
                }
            }
        }
    }

    private void setSystemProgress(List<SystemReviewTask> systemReviewTaskList,List<TaskFindResponse> responses) {

        if (systemReviewTaskList != null && systemReviewTaskList.size() != 0) {
            // 子任务列表进度
            List<ResultCountResponse> responseLists = reviewDetailsMapper.systemAnswerCount(systemReviewTaskList,SystemReviewTask.TYPE);

            if (responseLists != null && responseLists.size() != 0) {

                // 设置子任务不为finish时,最大进度为90
                for (ResultCountResponse response : responseLists) {
                    if (Objects.equals(response.getTaskStatus(), SystemReviewTask.STATUS_FINISH)) {
                        response.setSchedule(100.0);
                    } else {
                        BigDecimal num = new BigDecimal(response.getSchedule());
                        response.setSchedule(num.setScale(1,BigDecimal.ROUND_UP).doubleValue());
                    }
                }

                for (ResultCountResponse responseList : responseLists) {
                    for (TaskFindResponse response : responses) {
                        if (responseList.getTaskId().equals(response.getSystemReviewTaskId())) {
                            response.setSystemReview(responseList.getSchedule());
                        }
                    }
                }
            }
        }
    }

    // 按顺序设置taskList
    private void setTaskList(List<String> taskList, Task task) {
        // 定义一个比较器,按照 "sraif, grfis, trfis" 的顺序排序
        Comparator<String> customComparator = Comparator.comparingInt(str -> {
            if (str.equals(Task.SUB_TASK_SRAIF)) return 0;
            else if (str.equals(Task.SUB_TASK_GRFIS)) return 1;
            else if (str.equals(Task.SUB_TASK_TRFIS)) return 2;
            else return -1; // 处理其他情况
        });

        // 使用自定义的比较器进行排序
        List<String> sortedTaskList = taskList.stream()
                .sorted(customComparator)
                .collect(Collectors.toList());

        // 将排序后的结果用逗号连接起来存入一个字段中
        String concatenatedTasks = String.join(",", sortedTaskList);

        task.setTaskList(concatenatedTasks);
    }

    // 保存任务与小组信息
    private void saveUserRelation(List<TaskUserRelation> auditors,Task task) {
        // 构建并保存该任务所关联的审核组信息
        List<TaskUserRelation> list = taskUserRelationService.selectQTeamMembers(task.getId());
        if (list != null && list.size() != 0) {
            taskUserRelationService.removeBatchByIds(list);
        }

        if (auditors != null && auditors.size() != 0) {
            // 构建并保存该任务所关联的审核组信息
            for(TaskUserRelation auditor : auditors) {
                auditor.setTaskId(task.getId());
            }

            taskUserRelationService.saveBatch(auditors);
        }
    }

    private void saveFileList(List<TaskFileRelation> fileList,Task task) {

        List<TaskFileRelation> list = taskFileRelationService.findByTaskId(task.getId());

        if (list != null&& list.size() != 0) {
            taskFileRelationService.removeBatchByIds(list);
        }

        if (fileList != null && fileList.size() != 0 ) {
            for (TaskFileRelation relation : fileList) {
                relation.setTaskId(task.getId());
            }

            taskFileRelationService.saveBatch(fileList);
        }

    }

    // 保存任务与样品信息
    private void saveSampleRelation(List<TaskSampleRelation> relations,List<TaskSampleRelation> partRelations,Task task) {
        // 整车
        List<TaskSampleRelation> relationList = taskSampleRelationService.selectByTaskId(task.getId(),TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE);
        if (relationList != null && relationList.size() != 0) {
            taskSampleRelationService.removeBatchByIds(relationList);
        }

        if (relations != null && relations.size() != 0) {
            for (TaskSampleRelation sampleRelation : relations) {
                sampleRelation.setTaskId(task.getId());
            }

            taskSampleRelationService.saveBatch(relations);
        }

        // 零件
        List<TaskSampleRelation> partRelationList = taskSampleRelationService.selectByTaskId(task.getId(),TaskSampleRelation.PART_VEHICLE_SAMPLE);
        if (partRelationList != null && partRelationList.size() != 0) {
            taskSampleRelationService.removeBatchByIds(partRelationList);
        }

        if (partRelations != null && partRelations.size() != 0) {
            for (TaskSampleRelation sampleRelation : partRelations) {
                sampleRelation.setTaskId(task.getId());
            }

            taskSampleRelationService.saveBatch(partRelations);
        }

    }

    // 判断编辑任务时,第一整车样品的生成企业有无变化
    private void judgmentSample(TaskEditRequest request) {
        // 获取传入的样品列表
        List<TaskSampleRelation> relations = request.getSample();

        // 任务与整车样品关系
        List<TaskSampleRelation> sampleRelations = taskSampleRelationMapper.selectByTaskId(request.getId(),TaskSampleRelation.COMPLETE_VEHICLE_SAMPLE);

        if (sampleRelations != null && sampleRelations.size() != 0) {
            // 获取之前的第一个企业名称
            TaskSampleRelation taskSampleRelation = sampleRelations.get(0);
            Sample oldSample = sampleManagementMapper.selectSampleManagementById(taskSampleRelation.getSampleId());
            AutomobileEnterprise oldAutomobileEnterprise = automobileEnterpriseMapper.selectAutomobileEnterpriseById(oldSample.getManufacturingEnterpriseId());

            // 获取编辑任务后的第一个企业名称
            TaskSampleRelation newTaskSampleRelation = relations.get(0);
            Sample newSample = sampleManagementMapper.selectSampleManagementById(newTaskSampleRelation.getSampleId());
            AutomobileEnterprise newAutomobileEnterprise = automobileEnterpriseMapper.selectAutomobileEnterpriseById(newSample.getManufacturingEnterpriseId());

            // 第一个企业名称不相同则修改
            if (!Objects.equals(oldAutomobileEnterprise.getEnterpriseName(), newAutomobileEnterprise.getEnterpriseName())){
                // 留档文件
                List<ReviewEnterpriseArchive> reviewEnterpriseArchiveList = reviewEnterpriseArchiveMapper.findList(request.getId());

                if (reviewEnterpriseArchiveList != null && reviewEnterpriseArchiveList.size() != 0) {
                    for (ReviewEnterpriseArchive reviewEnterpriseArchive : reviewEnterpriseArchiveList) {
                        reviewEnterpriseArchive.setEnterpriseName(newAutomobileEnterprise.getEnterpriseName());
                    }

                    reviewEnterpriseArchiveService.updateBatchById(reviewEnterpriseArchiveList);
                }

            }
        }
    }

    // 编辑任务时子任务发送变化
    private void changeSubTask(TaskEditRequest request,Task task,SysUser initiator,Standard standard,TaskUserRelation leader) {
        if (Objects.equals(task.getTaskStatus(), Task.TASK_STATUS_NEW)) {
            if(request.getTaskList().contains(Task.SUB_TASK_GRFIS) && task.getCarReviewTaskId() == null) {
                // 保存车型审查问卷任务
                TaskCreateRequest createRequest = new TaskCreateRequest();
                BeanUtils.copyBeanProp(createRequest, request);
                task.setCarReviewTaskId(saveCarReview(createRequest,initiator,standard,leader));
            }
            if ( !request.getTaskList().contains(Task.SUB_TASK_GRFIS) && task.getCarReviewTaskId() != null) {
                carReviewTaskMapper.deleteById(task.getCarReviewTaskId());
                task.setCarReviewTaskIdNull();
            }
            if(request.getTaskList().contains(Task.SUB_TASK_SRAIF) && task.getSystemReviewTaskId() == null) {
                // 保存体系审查任务
                TaskCreateRequest createRequest = new TaskCreateRequest();
                BeanUtils.copyBeanProp(createRequest, request);
                task.setSystemReviewTaskId(saveSystemReview(createRequest,initiator,standard,leader));
            }
            if ( !request.getTaskList().contains(Task.SUB_TASK_SRAIF) && task.getSystemReviewTaskId() != null) {
                systemReviewTaskMapper.deleteById(task.getSystemReviewTaskId());
                task.setSystemReviewTaskIdNull();
            }
            // 判断车型试验
            if (request.getTaskList().contains(Task.SUB_TASK_TRFIS) && ObjectUtil.isNull(task.getModelTestTaskId())) {
                // 新增
                TaskCreateRequest createRequest = new TaskCreateRequest();
                BeanUtils.copyBeanProp(createRequest, request);
                task.setModelTestTaskId(saveModelTest(createRequest,initiator,standard,leader));
                // 任务-场景
                saveTaskScenario(task.getId(), createRequest.getTestScenarioList());
            }
            if (!request.getTaskList().contains(Task.SUB_TASK_TRFIS) && ObjectUtil.isNotNull(task.getModelTestTaskId())) {
                // 删除
                modelTestTaskService.removeById(task.getModelTestTaskId());
                task.setModelTestTaskIdNull();
                // 删除 任务-场景
                taskScenarioRelationMapper.delete(new QueryWrapper<TaskScenarioRelation>().lambda().eq(TaskScenarioRelation::getTaskId, task.getId()));
            }
            if (request.getTaskList().contains(Task.SUB_TASK_TRFIS) &&
                !request.getTaskList().contains(Task.SUB_TASK_GRFIS) &&
                !request.getTaskList().contains(Task.SUB_TASK_SRAIF) &&
                ObjectUtil.isNotNull(task.getModelTestTaskId())
                || request.getTaskList().contains(Task.SUB_TASK_TRFIS) &&
                   !request.getTaskList().contains(Task.SUB_TASK_GRFIS) &&
                   request.getTaskList().contains(Task.SUB_TASK_SRAIF) &&
                   ObjectUtil.isNotNull(task.getModelTestTaskId())
            ) {
                TaskCreateRequest createRequest = new TaskCreateRequest();
                BeanUtils.copyBeanProp(createRequest, request);
                taskScenarioRelationMapper.delete(new QueryWrapper<TaskScenarioRelation>().lambda().eq(TaskScenarioRelation::getTaskId, task.getId()));
                saveTaskScenario(task.getId(), createRequest.getTestScenarioList());
            }
        }
    }


    private void setSystemDataStatistics(List<ReviewStandard> standards, List<ReviewDetailsResult> results,DataStatisticsResponse response,SystemReviewTask systemReviewTask) {
        Map<Long, ReviewDetailsResult> resultMap = results.stream().collect(Collectors.toMap(ReviewDetailsResult::getReviewDetailsId, Function.identity(), (v1, v2) -> v1));

        if (Objects.equals(systemReviewTask.getTaskStatus(), SystemReviewTask.STATUS_NEW)) {
            response.setSystemStandards(DataStatisticsUtils.calculateStandards(standards));
            response.setSystemDetails(DataStatisticsUtils.calculateDetails(standards));
        } else {
            response.setSystemStandards(systemReviewTask.getStandards());
            response.setSystemDetails(systemReviewTask.getDetails());
        }

        response.setSystemStandardsPassNum(DataStatisticsUtils.calculateStandardsPass(standards, resultMap));
        response.setSystemStandardsNoPassNum(DataStatisticsUtils.calculateStandardsNoPass(standards, resultMap));
        response.setSystemStandardsUnderNum(response.getSystemStandards() -response.getSystemStandardsPassNum() - response.getSystemStandardsNoPassNum());
        BigDecimal standardPass = new BigDecimal((response.getSystemStandardsPassNum() / (double) response.getSystemStandards())*100);
        response.setSystemStandardsPass(standardPass.setScale(1,BigDecimal.ROUND_UP).doubleValue());
        response.setSystemDetailsPassNum(DataStatisticsUtils.calculateDetailsPass(standards, resultMap));
        response.setSystemDetailsNoPassNum(DataStatisticsUtils.calculateDetailsNoPass(standards, resultMap));
        response.setSystemDetailsUnderNum(response.getSystemDetails() - response.getSystemDetailsPassNum() - response.getSystemDetailsNoPassNum());
        BigDecimal detailsPass = new BigDecimal((response.getSystemDetailsPassNum() / (double) response.getSystemDetails())*100);
        response.setSystemDetailsPass(detailsPass.setScale(1,BigDecimal.ROUND_UP).doubleValue());

    }

    private void setCarDataStatistics(List<ReviewStandard> standards, List<ReviewDetailsResult> results,DataStatisticsResponse response,CarReviewTask carReviewTask) {
        Map<Long, ReviewDetailsResult> resultMap = results.stream().collect(Collectors.toMap(ReviewDetailsResult::getReviewDetailsId, Function.identity(), (v1, v2) -> v1));

        if (Objects.equals(carReviewTask.getTaskStatus(), CarReviewTask.TASK_STATUS_NEW)) {
            response.setCarStandards(DataStatisticsUtils.calculateStandards(standards));
            response.setCarDetails(DataStatisticsUtils.calculateDetails(standards));
        } else {
            response.setCarStandards(carReviewTask.getStandards());
            response.setCarDetails(carReviewTask.getDetails());
        }
        response.setCarStandardsPassNum(DataStatisticsUtils.calculateStandardsPass(standards, resultMap));
        response.setCarStandardsNoPassNum(DataStatisticsUtils.calculateStandardsNoPass(standards, resultMap));
        response.setCarStandardsUnderNum(response.getCarStandards() -response.getCarStandardsPassNum() - response.getCarStandardsNoPassNum());
        BigDecimal standardPass = new BigDecimal((response.getCarStandardsPassNum() / (double) response.getCarStandards())*100);
        response.setCarStandardsPass(standardPass.setScale(1,BigDecimal.ROUND_UP).doubleValue());
        response.setCarDetailsPassNum(DataStatisticsUtils.calculateDetailsPass(standards, resultMap));
        response.setCarDetailsNoPassNum(DataStatisticsUtils.calculateDetailsNoPass(standards, resultMap));
        response.setCarDetailsUnderNum(response.getCarDetails() - response.getCarDetailsPassNum() - response.getCarDetailsNoPassNum());
        BigDecimal detailsPass = new BigDecimal((response.getCarDetailsPassNum() / (double) response.getCarDetails())*100);
        response.setCarDetailsPass(detailsPass.setScale(1,BigDecimal.ROUND_UP).doubleValue());

    }

    public List<TaskUserRelation> setAuditors ( Long id) {

        // 小组成员
        List<TaskUserRelation> relation = taskUserRelationService.selectQTeamMembers(id);

        if(relation != null && relation.size() != 0) {

            // 小组成员姓名、部门
            List<UserNameResponse> userList = taskMapper.findByRelation(relation);

            for (UserNameResponse response : userList) {
                for (TaskUserRelation taskUserRelation : relation) {
                    if (Objects.equals(response.getUserId(), taskUserRelation.getUserId())) {
                        taskUserRelation.setName(response.getName());
                        taskUserRelation.setDeptName(response.getDeptName());
                    }
                }
            }

            // 小组成员状态
            List<TaskUserRelation> relationList = taskUserRelationMapper.findByIdList(relation);

            for ( TaskUserRelation userRelation : relationList) {
                for (TaskUserRelation taskUserRelation : relation) {
                    if (Objects.equals(userRelation.getUserId(), taskUserRelation.getUserId())) {
                        taskUserRelation.setStatus(userRelation.getStatus());
                    }
                }
            }
        }

        return relation;
    }

    public List<Sample> setSampleList(Long id,String type) {
        // 样品信息
        List<TaskSampleRelation> relationList = taskSampleRelationService.selectByTaskId(id,type);
        if (relationList != null && relationList.size() != 0) {
            List<Sample> SampleList = sampleManagementMapper.findByIdList(relationList,id);
            return SampleList;
        } else {
            return null;
        }


    }

    public Long saveSystemReview(TaskCreateRequest request,SysUser initiator,Standard standard,TaskUserRelation leader) {

        // 构建并保存任务信息
        SystemReviewTask task = new SystemReviewTask()
                .setTaskNo(request.getTaskNo())
                .setTaskInitiator(initiator.getNickName())
                .setTaskStatus(SystemReviewTask.STATUS_NEW)
                .setLeaderId(leader.getUserId())
                .setLeader(leader.getName())
                .setCreateTime(new Date())
                .setStandardId(standard.getId())
                .setName(standard.getName())
                .setStandardNo(standard.getStandardNo())
                .setFile(standard.getFile());

        if (initiator.getDept() != null) {
            task.setTaskInitiatorDept(initiator.getDept().getDeptName());
        }

        systemReviewTaskService.save(task);
        return task.getId();
    }

    public Long saveCarReview(TaskCreateRequest request,SysUser initiator,Standard standard,TaskUserRelation leader) {

        List<String> taskList = request.getTaskList();

        // 构建并保存任务信息
        CarReviewTask task = new CarReviewTask()
                .setTaskNo(request.getTaskNo())
                .setTaskInitiator(initiator.getNickName())
                .setTaskStatus(CarReviewTask.TASK_STATUS_NEW)
                .setLeaderId(leader.getUserId())
                .setLeader(leader.getName())
                .setCreateTime(new Date())
                .setStandardId(standard.getId())
                .setName(standard.getName())
                .setStandardNo(standard.getStandardNo())
                .setFile(standard.getFile());

        if (initiator.getDept() != null) {
            task.setTaskInitiatorDept(initiator.getDept().getDeptName());
        }

        carReviewTaskService.save(task);
        return task.getId();
    }

    /**
     * 保存车型试验任务
     * @param request
     * @param initiator
     * @param standard
     * @param leader
     * @return
     */
    public Long saveModelTest(TaskCreateRequest request,SysUser initiator,Standard standard,TaskUserRelation leader) {

        // 构建并保存任务信息
        ModelTestTask modelTestTask = ModelTestTask.builder()
                .taskNo(request.getTaskNo())
                .taskInitiator(initiator.getNickName())
                .taskStatus(ModelTestTask.TASK_STATUS_NEW)
                .leaderId(leader.getUserId())
                .leader(leader.getName())
                .createTime(DateUtils.getNowDate())
                .standardId(standard.getId())
                .name(standard.getName())
                .standardNo(standard.getStandardNo())
                .build();

        if (initiator.getDept() != null) {
            modelTestTask.setTaskInitiatorDept(initiator.getDept().getDeptName());
        }

        modelTestTaskService.save(modelTestTask);
        return modelTestTask.getId();
    }

    /**
     * 保存任务-测试场景中间表数据
     * @param taskId 总任务ID
     * @param testScenarioList 测试场景集合
     */
    private void saveTaskScenario(Long taskId, List<Long> testScenarioList) {
        if (CollUtil.isNotEmpty(testScenarioList)) {
            for (Long sceneId : testScenarioList) {
                TaskScenarioRelation taskScenario = TaskScenarioRelation.builder()
                        .taskId(taskId)
                        .testScenarioId(sceneId)
                        .build();
                taskScenarioRelationMapper.insert(taskScenario);
            }
        }
    }

}