<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/3/5 0005
 * Time: 14:19
 */

namespace App\Http\Controllers\Admin\Plan;

use App\Exports\BasicExport;
use App\Http\Controllers\Controller;
use App\Http\Models\GoogleTrendsKeyword;
use App\Http\Models\Mailbox;
use App\Http\Models\Role;
use App\Http\Models\ScheduledTasks;
use App\Http\Models\User;
use App\Http\Models\WeekTaskHistory;
use App\Http\Models\WeekTaskInfo;
use App\Http\Services\SendMessageService;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Illuminate\Contracts\View\Factory;
use Illuminate\View\View;
use Illuminate\Http\JsonResponse;

/**
 * 任务计划
 * Class TaskController
 * @package App\Http\Controllers\Admin\Plan
 */
class TaskController extends Controller
{
    //当前任务和下周任务 根据 type 区别
    public function index(Request $request, $userId = 0)
    {
        $weekTaskInfo = WeekTaskInfo::query();
        $type = $request->input('type');
        $dutyId = $request->input('duty_id');
        if (!empty($dutyId)) {
            $weekTaskInfo->where('duty_id', $dutyId);
        }
        if ($userId != 0) {
            $weekTaskInfo->where('duty_id', auth()->user()->id);
        }

        $type = $type == 'next' ? 'next' : 'now';
        $condition = ['type' => $type];

        list($web, $design, $exam, $siteExam, $site, $seo, $allUserList) = $this->getTaskByUserList();

        $taskInfoList = $weekTaskInfo->where($condition)
            ->orderBy('deadline', 'asc')
            ->get()->groupBy('user_type')
            ->map(function (Collection $item) {
                return $item->groupBy('day')->toArray();
            })->toArray();

        $user = User::query()->where('status', 1)->pluck('nickname', 'id');
        $condList = DB::table('week_task_cond')->pluck('name', 'id')->toArray();

        foreach ($taskInfoList as $key => $value) {

            foreach ($value as $kk => $vv) {

                foreach ($vv as $kkk => $vvv) {
                    if (substr($vvv['user_type'], 0, 3) == 'wfp') {
                        $vv[$kkk]['user_name'] = '未分配';
                    } else {
                        $vv[$kkk]['user_name'] = $user[$vvv['user_type']] ?? '';
                    }
                    $vv[$kkk]['cond_name'] = $condList[$vvv['cond_id']] ?? '';
                    $vv[$kkk]['web_name'] = $web[$vvv['web_id']] ?? '';
                    $vv[$kkk]['design_name'] = $design[$vvv['design_id']] ?? '';
                    $vv[$kkk]['duty_name'] = $allUserList[$vvv['duty_id']] ?? '';

                }
                $value[$kk] = $vv;
            }
            $taskInfoList[$key] = $value;
        }

        $taskStaffList = [
            'web' => [],
            'design' => [],
            'exam' => [],
            'site-exam' => [],
            'site' => [],
            'seo' => [],
        ];
        //前端
        $taskStaffList['web']['wfp-web'] = '未分配';
        foreach ($web as $key => $item) {
            $taskStaffList['web'][$key] = $item;
        }
        //设计
        $taskStaffList['design']['wfp-design'] = '未分配';
        foreach ($design as $key => $item) {
            $taskStaffList['design'][$key] = $item;
        }
        //seo质检
        $taskStaffList['exam']['wfp-exam'] = '未分配';
        foreach ($exam as $key => $item) {
            $taskStaffList['exam'][$key] = $item;
        }
        //建站质检
        $taskStaffList['site-exam']['wfp-site-exam'] = '未分配';
        foreach ($siteExam as $key => $item) {
            $taskStaffList['site-exam'][$key] = $item;
        }
        //策划部
        $taskStaffList['site']['wfp-site'] = '未分配';
        foreach ($site as $key => $item) {
            $taskStaffList['site'][$key] = $item;
        }
        //优化部
        $taskStaffList['seo']['wfp-seo'] = '未分配';
        foreach ($seo as $key => $item) {
            $taskStaffList['seo'][$key] = $item;
        }

        $weekDateList = $this->getWeek(time());
        $weekDate = [];
        foreach ($weekDateList as $item) {
            $weekDate[] = $item['date'];
        }

        return view('admin/plan/task', [
            'allUserList' => $allUserList,
            'designerList' => $design,
            'webList' => $web,
            'taskInfoList' => $taskInfoList,
            'type' => $type,
            'dutyId' => $dutyId,
            'taskStaffList' => $taskStaffList,
            'is_user' => $userId,
            'weekDate' => $weekDate,
        ]);
    }

    /**
     * 添加任务页面
     * @param $taskId
     * @param $auth
     * @return Factory|View
     */
    public function addTask($taskId, $auth)
    {


        $auth = explode(':', $auth);
        $condList = DB::table('week_task_cond')
            ->where('type', $auth[0])
            ->pluck('name', 'id')
            ->toArray();

        if ($auth[4] == 1) {
            $differenceCondId = WeekTaskInfo::query()
                ->where('id', $taskId)
                ->value('cond_id');

            $condIds = DB::table('week_task_cond')
                ->where('id', $differenceCondId)
                ->pluck('name', 'id')
                ->toArray();
            //兼容
            foreach ($condList as $key => $value) {
                foreach ($condIds as $kk => $vv) {
                    if ($key !== $kk) {
                        $condList[$kk] = $vv;
                    }
                }
            }
        }

        list($web, $design, $exam, $siteExam, $site, $seo, $allUserList) = $this->getTaskByUserList();
        $weekTaskInfo = WeekTaskInfo::query()->where('id', $taskId)->first();
        $user = auth()->user();

        return view('admin/plan/add_task', [
            'condList' => $condList,
            'web' => $web,
            'design' => $design,
            'exam' => $exam,
            'siteExam' => $siteExam,
            'site' => $site,
            'seo' => $seo,
            'allUserList' => $allUserList,
            'role' => 'wfp-' . $auth[0],
            'type' => $auth[1],
            'taskId' => $taskId,
            'weekTaskInfo' => $weekTaskInfo,
            'week' => date('w'),
            'day' => $auth[2],
            'role_id' => $user->role_id,
            'user_id' => $auth[3],
        ]);
    }

    /**
     * 保存
     * @param Request $request
     * @param int $taskId
     * @return JsonResponse
     */
    public function saveTask(Request $request, $taskId = 0)
    {
        $data = [];
        $type = $request->input('type');
        $role = $request->input('role');
        $condId = $request->input('cond_id');
        if (empty($condId)) {
            return response()->json(['message' => '请选择任务类型'], 400);
        }

        $data['cond_id'] = $condId;
        $describe = $request->input('describe') ?? '';
        if (empty($describe)) {
            return response()->json(['message' => '请填写任务描述'], 400);
        }
        $data['describe'] = $describe;

        $userType = $request->input('user_type') ?? $role;
        $data['user_type'] = $userType;

        $dutyId = $request->input('duty_id');
        if (empty($dutyId)) {
            return response()->json(['message' => '请填写负责人'], 400);
        }
        $data['duty_id'] = $dutyId;

        $designId = $request->input('design_id') ?? 0;
        if (!empty($designId) && $designId == 'wfp-design') {
            $data['design_id'] = null;
        } else {
            $data['design_id'] = $designId;
        }

        $webId = $request->input('web_id') ?? 0;
        if (!empty($webId) && $webId == 'wfp-web') {
            $data['web_id'] = null;
        } else {
            $data['web_id'] = $webId;
        }

        $checkScore = $request->input('check_score') ?? 0;
        $data['check_score'] = $checkScore;

        $remark = $request->input('remark');
        if (in_array($condId, [5, 1]) && !$remark) {
            return response()->json(['message' => '请填写上测试站链接'], 400);
        }
        if ($condId == 16 && !$remark) {
            return response()->json(['message' => '请填写上内页链接'], 400);
        }

        $data['remark'] = $remark;
        $day = $request->input('day');
        if (substr($userType, 0, 3) == 'wfp') {
            $day = 0;
        }
        $user = auth()->user();

        $deadline = $request->input('deadline');
        if (empty($taskId)) {
            if (empty($deadline)) {
                return response()->json(['message' => '请填写上最后期限时间'], 400);
            }
            if (strtotime($deadline) == strtotime(date('Y-m-d')) || strtotime($deadline) < strtotime(date('Y-m-d'))) {
                return response()->json(['message' => '不允许创建截止时间为当天或小于当天的任务'], 400);
            }
            $data['deadline'] = $deadline;

        } else {

            if (!in_array($user->role_id, [14, 27])) {
                if (empty($deadline)) {
                    return response()->json(['message' => '请填写上最后期限时间'], 400);
                } else {
                    $data['deadline'] = $deadline;
                }
            }
        }

        $data['day'] = $day;
        $data['type'] = $type;
        $data['created_at'] = date('Y-m-d H:i:s');

        if (empty($taskId)) {
            $id = WeekTaskInfo::query()->insertGetId($data);
            $this->createTask($id);
        } else {
            unset($data['created_at']);
            WeekTaskInfo::query()->where('id', $taskId)->update($data);
            $this->createTask($taskId);
        }

        return response()->json(['message' => '操作成功']);

    }

    /**
     * 自动创建设计任务
     * @param $taskId
     * @param int $status
     */
    public function createTask($taskId, $status = 0)
    {
        $weekTaskInfo = WeekTaskInfo::query()->where('id', $taskId)->first();
        //筛选出最近2个礼拜的时间排除周末
        $dayList = $this->getDay();
        $data['describe'] = $weekTaskInfo->describe ?? '';
        $data['duty_id'] = $weekTaskInfo->duty_id ?? 0;
        $data['web_id'] = $weekTaskInfo->web_id ?? 0;
        $data['design_id'] = $weekTaskInfo->design_id ?? 0;
        $data['created_at'] = date('Y-m-d H:i:s');
        $data['remark'] = $weekTaskInfo->remark ?? '';

        //前端 首页切片创建时 创建 设计 移动端设计(历史任务和当前任务都没有才创建)
        $taskHistory = WeekTaskHistory::query()->where(['cond_id' => 18, 'describe' => $weekTaskInfo->describe])->first();
        $task = WeekTaskInfo::query()->where(['cond_id' => 18, 'describe' => $weekTaskInfo->describe])->first();

        if (in_array($weekTaskInfo->cond_id, [1]) && !$taskHistory && !$task) {
            $data['user_type'] = 'wfp-design';
            $data['type'] = 'now';
            $data['status'] = '';
            $data['day'] = 0;
            $data['cond_id'] = '18';
            $data['deadline'] = $dayList[2];
            WeekTaskInfo::query()->insert($data);
        }
        //完成时触发
        if ($status == 1) {

            //前端 测试站检查触 发建站质检的 测试站检查 (暂停)
            /*     if (in_array($weekTaskInfo->cond_id, [5]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 66, 'describe' => $weekTaskInfo->describe])->exists()) {

                     $data['user_type'] = 'wfp-site-exam';
                     $data['type'] = 'now';
                     $data['status'] = '';
                     $data['day'] = 0;
                     $data['cond_id'] = '66';
                     $data['deadline'] = $dayList[1];
                     WeekTaskInfo::query()->insert($data);
                 }*/

            //前端 首页切片、内页切片
            if (in_array($weekTaskInfo->cond_id, [1, 16]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 65, 'describe' => $weekTaskInfo->describe])->exists()) {

                $data['user_type'] = 'wfp-site-exam';
                $data['type'] = 'now';
                $data['status'] = '';
                $data['day'] = 0;
                $data['cond_id'] = '65';
                $data['deadline'] = $dayList[1];
                WeekTaskInfo::query()->insert($data);
            }

            //建站质检 上线表格检查 触发seo质检 上线前质检
            /* if (in_array($weekTaskInfo->cond_id, [67]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 70, 'describe' => $weekTaskInfo->describe])->exists()) {

                 $data['user_type'] = 'wfp-exam';
                 $data['type'] = 'now';
                 $data['status'] = '';
                 $data['day'] = 0;
                 $data['cond_id'] = '70';
                 $data['deadline'] = $dayList[0];
                 WeekTaskInfo::query()->insert($data);
             }*/

            //建站质检 上线后检查表 触发seo质检 上线后质检
            if (in_array($weekTaskInfo->cond_id, [68]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 71, 'describe' => $weekTaskInfo->describe])->exists()) {
                //延时任务
                $data['user_type'] = 'wfp-exam';
                $data['type'] = 'now';
                $data['status'] = '';
                $data['day'] = 0;
                $data['cond_id'] = '71';
                unset($data['deadline']);
                ScheduledTasks::query()->insert($data);//入库定时拉取
            }

            //建站质检 中的 上线表格检查 点击完成 三天后在 SEO质检 中自动生成 上线前质检 任务,且任务时限为三天
            if (in_array($weekTaskInfo->cond_id, [67]) && $weekTaskInfo->status == 'ok' && !ScheduledTasks::query()->where(['cond_id' => 70, 'describe' => $weekTaskInfo->describe])->exists()) {
                //延时任务
                $data['user_type'] = 'wfp-exam';
                $data['type'] = 'now';
                $data['status'] = '';
                $data['day'] = 0;
                $data['cond_id'] = '70';
                unset($data['deadline']);
                ScheduledTasks::query()->insert($data);//入库定时拉取
            }

            //前端百千读取读取 触发 建站质检的百千还原度检查
            if (in_array($weekTaskInfo->cond_id, [74]) && $weekTaskInfo->status == 'ok' && !WeekTaskInfo::query()->where(['cond_id' => 75, 'describe' => $weekTaskInfo->describe])->exists()) {

                $data['user_type'] = 'wfp-site-exam';
                $data['type'] = 'now';
                $data['status'] = '';
                $data['day'] = 0;
                $data['cond_id'] = '75';
                $data['deadline'] = $dayList[1];
                WeekTaskInfo::query()->insert($data);
            }

            //接单关键词查询完成发送短信给销售
            if (in_array($weekTaskInfo->cond_id, [87]) && $weekTaskInfo->status == 'ok') {

                $result = GoogleTrendsKeyword::query()->where('keyword', $weekTaskInfo->describe)->first();
                if (!empty($result)) {
                    //自动创建任务并发短信给优化
                    $sendMessageService = new SendMessageService();
                    $user = User::query()->where('id', $weekTaskInfo->duty_id)->first();
                    if (!empty($user->phone)) {
                        $sendMessageService->sendMessage($user->phone, $weekTaskInfo->describe ?? '', 2);
                    }
                }
            }
        }

    }

    public function condItems(Request $request)
    {
        $condId = $request->input('condId');
        $taskItems = DB::table('week_task_items')->where(['cond_id' => $condId])->get()->toArray();
        return response()->json(['data' => $taskItems]);
    }


    public function del(Request $request)
    {
        $taskId = $request->input('taskId');
        $user = auth()->user();
        if (!in_array($user->role_id, [14, 27])) {
            WeekTaskInfo::query()->where(['id' => $taskId])->delete();
            return response()->json(['message' => '操作成功']);

        } else {
            return response()->json(['message' => '操作失败'], 400);
        }
    }

    public function release(Request $request)
    {
        $taskId = $request->input('taskId');
        $type = $request->input('type');
        WeekTaskInfo::query()->where(['id' => $taskId])->update(['user_type' => 'wfp-' . $type, 'day' => 0]);
        return response()->json(['message' => '操作成功']);
    }

    public function changeStatus(Request $request)
    {
        $taskId = $request->input('taskId');
        $statusType = $request->input('statusType');
        $type = $request->input('type');
        if ($statusType == 'ok') {
            //完成
            $update = ['status' => $statusType, 'type' => $type, 'complete' => date('Y-m-d H:i:s')];
        } else {
            $update = ['status' => $statusType, 'type' => $type, 'complete' => null];
        }

        $weekTaskInfo = WeekTaskInfo::query()->where(['id' => $taskId])->first();
        if (!empty($weekTaskInfo)) {
            WeekTaskInfo::query()->where(['id' => $taskId])->update($update);
            $this->createTask($taskId, 1);

            //通知后台邮箱
            $user = User::query()->where('id', $weekTaskInfo->user_type)->value('nickname') ?? '';
            $string = $user . ' 完成了 ' . '" ' . $weekTaskInfo->describe . ' "' . ' 这个任务';
            Mailbox::query()->insert(['message' => $string, 'user_id' => $weekTaskInfo->duty_id]);
        }

        return response()->json(['message' => '操作成功']);
    }


    //任务迁移
    public function migrate()
    {
        WeekTaskInfo::query()->where(['type' => 'now', 'status' => 'ok'])->delete();
        WeekTaskInfo::query()->where(['type' => 'now'])->whereNotIn('user_type', ['wfp-web', 'wfp-design', 'wfp-exam', 'wfp-site-exam', 'wfp-site', 'wfp-seo'])->update(['day' => 1]);
        WeekTaskInfo::query()->where(['type' => 'next'])->update(['type' => 'now']);
        return response()->json(['message' => '操作成功,清刷新当前任务的页面']);
    }

    //任务历史
    public function taskHistory(Request $request)
    {
        if (!$request->ajax()) {
            //采编、项目经理
            $userList = User::query()->where('status', 1)->whereIn('role_id', [2, 25, 26, 29])->get();
            $webList = User::query()->where('status', 1)->whereIn('role_id', [14, 27])->get();

            return view('admin/plan/task_history', [
                'user' => $userList ?? [],
                'web' => $webList,
            ]);
        }
        $pageSize = $request->input('pageSize') ?? TABLE_PAGE_SIZE;
        //$builder = WeekTaskHistory::query()->with(['designer', 'dutyMan', 'webMan']);
        $builder = WeekTaskHistory::query();

        if ($insertDate = $request->input('insert_date')) {
            $builder->whereDate('insert_date', '=', $insertDate);
        }
        if ($desc = $request->input('desc')) {
            $builder->where('describe', 'like', '%' . $desc . '%');
        }
        if ($user_type = $request->input('user_type')) {
            $builder->where('user_type', '=', $user_type);
        }
        if ($duty_id = $request->input('duty_id')) {
            $builder->where('duty_id', '=', $duty_id);
        }
        $articles = $builder->where($condition ?? [])->orderByDesc('id')
            ->paginate($pageSize);
        $items = $articles->items();

        $userList = User::query()->pluck('nickname', 'id');
        $roles = Role::query()->pluck('name', 'id');

        $mapCondScore = DB::table('week_task_cond')->pluck('score', 'id')->toArray();

        if ($insertDate && $user_type) {
            $totalScore = 0;
        } else {
            $totalScore = '';
        }

        $overdueList = [];
        $array = [];
        array_walk($items,
            function ($item) use (&$userList, &$mapCondScore, &$totalScore, &$insertDate, &$user_type, &$count, &$array, &$roles, &$overdueList) {
                if ($item->slices_number != 0) {
                    $item->cond_name = $item->cond_name . '*' . $item->slices_number;
                }
                if (empty($item->cond_item_id)) {
                    $item->cond_item_id = 0;
                }

                $item->beOverdueDay = '';
                if ($item->status !== 'ok' && $item->deadline && strtotime($item->deadline) < strtotime(date('Y-m-d'))) {
                    $beOverdueDay = (strtotime(date('Y-m-d')) - strtotime($item->deadline)) / 3600 / 24;
                    $item->beOverdueDay = '逾期' . round($beOverdueDay) . '天';
                    /*  $overdueList[] = [
                          'user_id' => $item->user_type ?? '',
                          'day' => $beOverdueDay,
                      ];*/
                }

                $item->completeBeOverdueDay = '';
                if ($item->status == 'ok' && $item->complete && strtotime(date('Y-m-d', strtotime($item->complete))) > strtotime($item->deadline)) {
                    $completeBeOverdueDay = (strtotime(date('Y-m-d', strtotime($item->complete))) - strtotime($item->deadline)) / 3600 / 24;
                    $item->completeBeOverdueDay = '逾期' . round($completeBeOverdueDay) . '天';
                    $overdueList[] = [
                        'user_id' => $item->user_type ?? '',
                        'day' => $completeBeOverdueDay,
                        'task' => $item->id,
                    ];
                }

                $item->deadline = substr($item->deadline, 0, 10);
                //$item->complete = substr($item->complete, 0, 10);

                $item->cond_item_list = DB::table('week_task_items')->where('cond_id', $item->cond_id)->pluck('name', 'id')->toArray() ?? [];
                $item->username = $userList[$item->user_type] ?? '';
                $item->role_id = User::query()->where('id', $item->user_type)->first()->role_id ?? '';

                $item->role_type = $roles[$item->role_id] ?? '';

                $item->designerName = $userList[$item->design_id] ?? '';
                $item->dutyName = $userList[$item->duty_id] ?? '';
                $item->webName = $userList[$item->web_id] ?? '';
                $item->statusTitle = WeekTaskInfo::StatusMap[$item->status] ?? '';

                if ($item->status == 'ok' && $insertDate && $user_type) {
                    //切片数量,没有默认为1
                    if ($item->slices_number == 0) {
                        $slicesNumber = 1;
                    } else {
                        $slicesNumber = $item->slices_number;
                    }
                    if ($item['cond_id'] == 16) {
                        $totalScore = floatval(bcadd(($mapCondScore[$item['cond_id']] ?? 0) * $slicesNumber, $totalScore, 2));
                    } else {
                        $totalScore = floatval(bcadd($mapCondScore[$item['cond_id']] ?? 0, $totalScore, 2));
                    }

                    $array[] = $item->cond_id;
                }
            });


        if (!empty($array)) {
            //过滤null
            foreach ($array as $key => $v) {
                if (empty($v)) {
                    $array[$key] = 15;
                }
            }
            $result = array_count_values($array);
            $list = [];
            foreach ($result as $key => $value) {
                $list[$key]['key'] = $key;
                $list[$key]['value'] = $value;
            }
            $condIdList = WeekTaskHistory::query()->groupBy('cond_id', 'cond_name')->pluck('cond_name', 'cond_id')->toArray();
            foreach ($list as $key => $value) {
                $list[$key]['cond'] = $condIdList[$value['key']];
            }
            $string = '';
            foreach ($list as $key => $value) {
                $string .= $value['cond'] . ':' . $value['value'] . ' ';
            }
        }
        $webs = User::query()->where('role_id', 14)->pluck('id')->toArray();
        $design = User::query()->where('role_id', 27)->pluck('id')->toArray();

        $webOverdueDay = 0;
        $webTask = 0;
        $designOverdueDay = 0;
        $designTask = 0;

        foreach ($overdueList as $value) {
            if (in_array($value['user_id'], $webs)) {
                $webOverdueDay += $value['day'];
                $webTask++;
            }
            if (in_array($value['user_id'], $design)) {
                $designOverdueDay += $value['day'];
                $designTask++;
            }
        }

        return response()->json([
            'rows' => $items,
            'total' => $articles->total(),
            'totalScore' => $totalScore,
            'listCount' => $string ?? '',
            'webOverdueDay' => $webOverdueDay,
            'webTask' => $webTask,
            'designOverdueDay' => $designOverdueDay,
            'designTask' => $designTask,
        ]);

    }


    public function historyExport(Request $request)
    {
        $request = $request->all();
        $builder = WeekTaskHistory::query();

        if (!empty($request['duty_id'])) {
            $builder->where('duty_id', $request['duty_id']);
        }
        if (!empty($request['user_type'])) {
            $builder->where('user_type', $request['user_type']);
        }
        if (!empty($request['desc'])) {
            $builder->where('describe', 'like', '%' . $request['desc'] . '%');
        }
        if (!empty($request['insert_date'])) {
            $builder->whereDate('insert_date', '=', $request['insert_date']);
        } else {
            $builder->whereDate('insert_date', '=', date("Y-m-d", strtotime("-1 day")));
        }

        $userList = User::query()->pluck('nickname', 'id');
        $roles = Role::query()->pluck('name', 'id');

        $items = $builder->orderByDesc('id')->get();
        $overdueList = [];
        foreach ($items as $item) {
            $item->beOverdueDay = '';
            if ($item->status !== 'ok' && $item->deadline && strtotime($item->deadline) < strtotime(date('Y-m-d'))) {
                $beOverdueDay = (strtotime(date('Y-m-d')) - strtotime($item->deadline)) / 3600 / 24;
                $item->beOverdueDay = '逾期' . round($beOverdueDay) . '天';
            }

            $item->completeBeOverdueDay = '';
            if ($item->status == 'ok' && $item->complete && strtotime(date('Y-m-d', strtotime($item->complete))) > strtotime($item->deadline)) {
                $completeBeOverdueDay = (strtotime(date('Y-m-d', strtotime($item->complete))) - strtotime($item->deadline)) / 3600 / 24;
                $item->completeBeOverdueDay = '逾期' . round($completeBeOverdueDay) . '天';
                $overdueList[] = [
                    'user_id' => $item->user_type ?? '',
                    'day' => $completeBeOverdueDay,
                    'task' => $item->id,
                ];
            }

            $item->deadline = substr($item->deadline, 0, 10);
            $item->username = $userList[$item->user_type] ?? '';
            $item->role_id = User::query()->where('id', $item->user_type)->first()->role_id ?? '';

            $item->role_type = $roles[$item->role_id] ?? '';
            $item->designerName = $userList[$item->design_id] ?? '';
            $item->dutyName = $userList[$item->duty_id] ?? '';
            $item->webName = $userList[$item->web_id] ?? '';
            $item->statusTitle = WeekTaskInfo::StatusMap[$item->status] ?? '';
        }

        $result = [];
        foreach ($items as $key => $item) {

            if ($item->status == 'ok') {
                $status = '完成';
            } else {
                $status = '未完成';
            }

            if ($item->check_score == 0) {
                $evaluation = '未评价';
            } elseif ($item->check_score == 1) {
                $evaluation = '非常满意';
            } elseif ($item->check_score == 2) {
                $evaluation = '满意';
            } elseif ($item->check_score == 3) {
                $evaluation = '一般';
            } else {
                $evaluation = '';
            }

            $data = [
                'date' => $item->insert_date,
                'user' => $userList[$item->user_type] ?? [],
                'user_type' => $roles[$item->role_id] ?? '',
                'describe' => $item->describe ?? '',
                'dutyMan' => $item->dutyName ?? '',
                'designerName' => $item->designerName ?? '',
                'webMan' => $item->webName ?? '',
                'cond_name' => $item->cond_name ?? '',
                'deadline' => $item->deadline ?? '',
                'remark' => $item->remark ?? '',
                'beOverdueDay' => $item->beOverdueDay,
                'status' => $status,
                'complete' => $item->complete,
                'completeBeOverdueDay' => $item->completeBeOverdueDay,
                'evaluation' => $evaluation,
            ];
            $result[] = $data;
        }

        array_unshift($result, ['时间', '用户', '类型', '任务描述', '负责人', '设计', '前端', '检查类型', '截止时间', '备注', '逾期时长', '状态', '完成时间', '完成逾期时长', '检查反馈']);
        return (new BasicExport($result))->download(sprintf('任务历史记录%s.xls', date('YmdHis')));
    }

    public function historyUpdate(Request $request, $id)
    {
        $checkScore = $request->input('check_score');

        if (!$request->ajax()) {
            $weekTaskHistory = WeekTaskHistory::query()->where('id', $id)->first() ?? '';
            return view('admin/plan/task_history_update', [
                'weekTaskHistory' => $weekTaskHistory,
            ]);
        }

        $result = WeekTaskHistory::query()->where('id', $id)->update(['check_score' => $checkScore]);
        if (!empty($result)) {
            return response()->json(['message' => '操作成功']);
        }
    }

    public function rank(Request $request, $type)
    {
        $userList = User::query()->where('role_id', $type)->where('status', 1)->pluck('nickname', 'id')->toArray();
        $userId = User::query()->where('role_id', $type)->where('status', 1)->value('id');

        if ($type == 14) {
            $auth = 'web';
        } else {
            $auth = 'design';
        }
        list($cond, $condList) = $this->getWeekTaskCondList($auth);

        $user = $request->input('user') ?? $userId;
        $date = $request->input('date') ?? date('Y-m');

        $userRank = [];

        foreach ($userList as $key => $item) {

            //这个月
            $thisMonth = $this->getSunday($date);
            list($thisMonth, $thisMonthSum) = $this->getRankList($thisMonth, $key, $condList, $cond, $userList);

            $data = [
                'user' => $item,
                'rank' => $thisMonthSum,
            ];
            $userRank[] = $data;
        }

        array_multisort(array_column($userRank, 'rank'), SORT_DESC, $userRank);

        //这个月
        $thisMonth = $this->getSunday($date);
        list($thisMonth, $thisMonthSum) = $this->getRankList($thisMonth, $user, $condList, $cond, $userList);

        return view('admin.plan.rank', [
            'type' => $type,
            'userList' => $userList,
            'user' => $user,
            'rank' => $userRank,
            'date' => $date,
            'list' => $thisMonth,
        ]);
    }

    public function getRankList($dateList, $user, $condList, $cond, $userList)
    {
        $result = [];
        foreach ($dateList as $key => $value) {

            $condition = [
                ['status', '=', 'ok'],
                ['user_type', '=', $user],
                ['insert_date', '=', $value],
            ];

            $historyList1 = WeekTaskHistory::query()
                ->select('cond_id', DB::raw('COUNT(id) as complete_total'), DB::raw('SUM(slices_number) as complete_slices_total'))
                ->whereIn('cond_id', $condList)
                ->where($condition)
                ->groupBy('cond_id')
                ->get()->toArray();

            $list1 = [];
            foreach ($historyList1 as $kk => $vv) {
                $list1[$vv['cond_id']] = $vv['complete_total'];
            }

            $list2 = [];
            foreach ($historyList1 as $kk => $vv) {
                $list2[$vv['cond_id']] = $vv['complete_slices_total'];
            }

            $condition = [
                ['user_type', '=', $user],
                ['insert_date', '=', $value],
            ];
            $historyList = WeekTaskHistory::query()
                ->select('cond_id', 'user_type', 'cond_name', 'insert_date', DB::raw('COUNT(id) as total'), DB::raw('SUM(slices_number) as slices_total'))
                ->whereIn('cond_id', $condList)
                ->where($condition)
                ->groupBy('cond_id', 'user_type', 'cond_name', 'insert_date')
                ->get()->toArray();

            foreach ($historyList as $kkk => $vvv) {
                $historyList[$kkk]['user'] = $userList[$vvv['user_type']] ?? '';
                $historyList[$kkk]['complete_total'] = $list1[$vvv['cond_id']] ?? 0;
                $historyList[$kkk]['complete_slices_total'] = $list2[$vvv['cond_id']] ?? 0;
            }

            $result[] = $historyList;
        }

        $res = [];
        foreach ($result as $key => $value) {
            foreach ($value as $kk => $vv) {
                $res[] = $vv;
            }
        }

        foreach ($cond as $key => $value) {
            $cond[$key]['user'] = '';
            $cond[$key]['complete_total'] = 0;
            $cond[$key]['complete_slices_total'] = 0;
            $cond[$key]['count'] = 0;
            $cond[$key]['end_date'] = '';
            $cond[$key]['slices_number'] = 0;

            foreach ($res as $kk => $vv) {
                if ($value['id'] == $vv['cond_id']) {
                    $cond[$key]['user'] = $vv['user'];
                    $cond[$key]['complete_total'] += $vv['complete_total'];
                    $cond[$key]['complete_slices_total'] += $vv['complete_slices_total'];
                    $cond[$key]['count'] += $vv['total'];
                    $cond[$key]['end_date'] = $vv['insert_date'];
                    $cond[$key]['slices_number'] += $vv['slices_total'];
                }
            }
        }

        $sum = 0;
        foreach ($cond as $key => $item) {
            $sum += ($item['score'] * $item['complete_total']);

            /*    if ($item['id'] == 16) {
                    $sum += ($item['score'] * $item['complete_slices_total']);
                } else {
                    $sum += ($item['score'] * $item['complete_total']);
                }*/
        }
        return [$cond, $sum];
    }


    public function getSunday($month = '')
    {
        if (empty($month)) {
            $month = date("Y-m");
        }
        $maxDay = date('t', strtotime($month . "-01"));
        $mondays = array();
        for ($i = 1; $i <= $maxDay; $i++) {
            if (date('w', strtotime($month . "-" . $i)) == 0) {
                $mondays[] = $month . "-" . ($i > 9 ? '' : '0') . $i;
            }
        }

        if (count($mondays) > 4) {
            array_shift($mondays);
        }
        return $mondays;
    }

    public function getWeekTaskCondList($type = 'web')
    {
        $cond = DB::table('week_task_cond')
            ->where('type', $type)->get()->toJson();
        $cond = json_decode($cond, true) ?? [];

        $condList = DB::table('week_task_cond')
                ->where('type', $type)->pluck('id')->toArray() ?? [];
        return [$cond, $condList];
    }

    /**
     * 部门人员列表
     * @return array
     */
    public function getTaskByUserList()
    {
        $web = User::query()->where('status', 1)
            ->where('role_id', Role::TYPE_WEB)
            ->pluck('nickname', 'id')->toArray();

        $design = User::query()->where('status', 1)
            ->where('role_id', Role::TYPE_DESIGNER)
            ->pluck('nickname', 'id')->toArray();

        $exam = User::query()->where('status', 1)
            ->whereIn('role_id', [Role::TYPE_OPTIMIZER, Role::TYPE_MANAGE_HELPER])
            ->pluck('nickname', 'id')->toArray();

        $siteExam = User::query()->where('status', 1)
            ->where('role_id', Role::TYPE_QUALITY)
            ->pluck('nickname', 'id')->toArray();

        $site = User::query()->where('status', 1)
            ->whereIn('role_id', [Role::TYPE_MANAGE_HELPER, Role::TYPE_AE])
            ->pluck('nickname', 'id')->toArray();

        $seo = User::query()->where('status', 1)
            ->whereIn('role_id', [Role::TYPE_OPTIMIZER, Role::TYPE_OPTIMIZATION_EDITING])
            ->pluck('nickname', 'id')->toArray();


        $web['wfp-web'] = '未分配';
        $design['wfp-design'] = '未分配';
        $exam['wfp-exam'] = '未分配';
        $siteExam['wfp-site-exam'] = '未分配';
        $site['wfp-site'] = '未分配';
        $seo['wfp-seo'] = '未分配';

        ksort($web);
        ksort($design);
        ksort($exam);
        ksort($siteExam);
        ksort($site);
        ksort($seo);

        //负责人
        $allUserList = User::query()
            ->where('status', 1)
            ->whereIn('role_id', [1, 2, 6, 16, 17, 18, 25, 26, 29, 30, 32])
            ->orderBy('role_id', 'asc')
            ->pluck('nickname', 'id')->toArray();
        $allUserList[0] = '未分配';
        ksort($allUserList);

        return [$web, $design, $exam, $siteExam, $site, $seo, $allUserList];
    }

    public function getDay()
    {
        //筛选出最近2个礼拜的时间排除周末
        $days = 12;
        $dayList = [];
        for ($i = 1; $i <= $days; $i++) {
            $day = date('Y-m-d', strtotime(date('Y-m-d')) + 86400 * $i);
            $result = $this->isWeekend($day);
            if (!$result) {
                $dayList[] = $day;
            }
        }
        return $dayList;
    }

    public function isWeekend($date)
    {
        if ((date('w', strtotime($date)) == 6) || (date('w', strtotime($date)) == 0)) {
            return true;
        } else {
            return false;
        }
    }

    function getWeek($time, $format = "Y-m-d")
    {
        //最近一个礼拜的日期
        $week = date('w', $time);
        $weekList = array('星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六');
        //星期日排到末位
        if (empty($week)) {
            $week = 7;
        }
        $data = [];
        for ($i = 0; $i <= 6; $i++) {
            $day = '+' . ($i + 1 - $week - 1) . ' days';
            $data[$i]['date'] = date($format, strtotime($day, $time));
            $data[$i]['week'] = $weekList[$i];
        }
        return $data;
    }


}