<?php
namespace app\adminVue\controller;

use app\BaseController;
use think\facade\Db;
use think\facade\Cache;
use think\facade\Session;
use think\Request;
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use app\admin\model\MemberList;

class HrGet extends TokenCheck
{
    // 题库管理使用 mid=4 的有效项目，不沿用考试安排的 title=2 限制。
    public function getExamPaperOptions()
    {
        $data = Db::name('quality_base')->where(['mid'=>4, 'status'=>1])->field('id as value,content as label')->order('id')->select()->toArray();
        return json(['code'=>0, 'data'=>$data]);
    }

    public function getExamQuestions()
    {
        $id = filter_var(input('get.item_type'), FILTER_VALIDATE_INT, ['options'=>['min_range'=>1]]);
        if ($id === false || !Db::name('quality_base')->where(['mid'=>4, 'status'=>1, 'id'=>$id])->count()) return json(['code'=>1, 'msg'=>'请选择有效试卷'], 440);
        $data = Db::name('quality_ppi_exam')->where(['item_type'=>$id, 'status'=>1])->order('exam_type,id')->select()->toArray();
        foreach ($data as &$row) $row['version'] = \app\adminVue\service\ExamQuestionBank::version($row);
        unset($row);
        return json(['code'=>0, 'data'=>$data]);
    }

    // 员工信息列表
    public function memberList()
    {
        $item = input('get.');
        $obj = Db::name('member_list')->where('status', $item['status']);
        if (isset($item['kw']) && $item['kw'] !== "") {
            $tid_list = Db::name('team_list')->where('team', 'like', '%' . trim($item['kw']) . '%')->column('id');
            if ($tid_list) {
                $obj = $obj->whereIn('tid', $tid_list);
            } else {
                $obj = $obj->where('eid|ename', 'like', '%' . trim($item['kw']) . '%');
            }
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $project = Db::name('team_base')->where('mid', 1)->field('id,title')->cates('id');
        $team = Db::name('team_list')->field('id,team,project')->cates('id');
        $poid_list = array_column($data['lists'], 'poid');
        $poid = Db::name('team_plan_position')->whereIn('id', array_column($data['lists'], 'poid'))->field('id,position')->cates('id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['project'] = $project[$team[$v['tid']]['project']]['title'];
            $data['lists'][$k]['team'] = $team[$v['tid']]['team'];
            $data['lists'][$k]['position'] = $v['poid'] > 0 ? (isset($poid[$v['poid']]['position'])?$poid[$v['poid']]['position']:'') : '';
            $data['lists'][$k]['hire_date'] = $v['hiredate'] > 0 ? date('Y-m-d', $data['lists'][$k]['hiredate']) : '';
            $data['lists'][$k]['leave_date'] = $v['leavedate'] > 0 ? date('Y-m-d', $data['lists'][$k]['leavedate']) : '';
        }

        exit($this->lay_table($data));
    }
    //获取员工个人具体信息
    public function memberInfo()
    {
        $data = Db::name('member_interview')->where('m_id', input('get.mid'))->find();
        exit(json_encode(array('code' => 0, 'data' => $data)));
    }
    // 预离职员工信息列表
    public function getMemberPerleaveList()
    {

        // $sub = Db::name('member_perleave')->where('leave_date',0)->lists();
        // foreach ($sub as $key => $value) {
        //    Db::name('member_perleave')->where('id',$value['id'])->update(['leave_date'=>strtotime(date('Y-m-d',$value['submit_date']))]);
        // }
        $item = input('get.');
        $obj = Db::name('member_perleave');
        if (isset($item['status']) && $item['status'] > 0) {
            if($item['status']==2){
                $obj = $obj->where('status','>',2);
            }else{
                $obj = $obj->where('status',$item['status']);
            }
        }
        if (isset($item['kw']) && $item['kw'] != "") {
            $mid = Db::name('member_list')->where('ename', 'like', '%' . $item['kw'] . '%')->where('status', 1)->column('id');
            $obj = $obj->whereIn('mid', $mid);
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        // print_r($data);die;
        $mid_info = Db::name('member_list')->whereIn('id', array_column($data['lists'], 'mid'))->field('id,ename,eid')->cates('id');
        $team_info = Db::name('team_list')->column('team', 'id');
        $aid_info = Db::name('admin_user')->column('truename', 'id');
        $type_info = Db::name('member_base')->where('mid', 1)->cates('id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['eid'] = $mid_info[$v['mid']]['eid'];
            $data['lists'][$k]['ename'] = $mid_info[$v['mid']]['ename'];
            $data['lists'][$k]['team'] = $team_info[$v['tid']];
            $data['lists'][$k]['teamleader'] = $v['aid']>0?$aid_info[$v['aid']]:'';
            $data['lists'][$k]['type'] = $type_info[$v['type']]['title'] . ' - ' . $type_info[$v['type']]['content'];
            $data['lists'][$k]['update'] = date('Y-m-d H:i:s', $v['update']);
            $data['lists'][$k]['perleave_date'] = date('Y-m-d', $v['perleave_date']);
            switch ($v['status']) {
                case 1:
                    $data['lists'][$k]['status_text'] = '预离职';
                    break;
                case 2:
                    $data['lists'][$k]['status_text'] = '已离职';
                    break;
                case 3:
                    $data['lists'][$k]['status_text'] = '已撤销';
                    break;
                case 4:
                    $data['lists'][$k]['status_text'] = '超期取消';
                    break;
                default:
                    # code...
                    break;
            }
        }
        exit($this->lay_table($data));
    }
    // 预离职员工信息导出
    public function memberPerleaveExport()
    {
        $item = input('get.');
        $stay = Db::name('member_perleave')->where('status', 1)->lists();
        $today = strtotime('today');
        foreach ($stay as $k => $v) {
            if($today - $v['perleave_date'] > 15*86400){
                Db::name('member_perleave')->where('id', $v['id'])->update(['status'=>4,'mark'=>'超期15天，自动取消']);
                unset($stay[$k]);
            }
        }
        $leave = Db::name('member_perleave')->where('status', 2)->where('submit_date', 'between', [strtotime($item['start']), strtotime($item['end']) + 86399])->lists();
        return json(['code' => 0, 'data' => array_values(array_merge($stay, $leave))]);
    }

    //培训期员工列表
    public function getNewComerList()
    {
        $item = input('get.');
        $obj = Db::name('member_newcomer');
        if (isset($item['kw']) && $item['kw'] != "") {
            $obj = $obj->where('name|phone', 'like', '%' . $item['kw'] . '%');
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $aid_info = Db::name('admin_user')->column('truename', 'id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['creator_name'] = $aid_info[$v['creator']];
            $data['lists'][$k]['create_time'] = date('Y-m-d', $v['create_time']);
        }
        exit($this->lay_table($data));
    }
    //领餐列表
    public function getMealSignList()
    {
        $item = input('get.');
        $obj = Db::name('common_meal_sign');
        if (isset($item['kw']) && $item['kw'] != "") {
            $obj = $obj->where('eid', 'like', '%' . $item['kw'] . '%');
        }
        if (isset($item['date']) && $item['date'] != "") {
            $date = explode(",", $item['date']);
            $obj = $obj->where('meal_date', 'between', [strtotime($date[0]), strtotime($date[1])]);
        }
        if (isset($item['type']) && (int) $item['type'] > 0) {
            $obj = $obj->where('type', (int) $item['type']);
        }
        if (isset($item['status']) && (int) $item['status'] > 0) {
            $obj = $obj->where('status', (int) $item['status']);
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $aid_info = Db::name('admin_user')->field('id,username,truename,dpt')->cates('username');
        $dpt_info = Db::name('admin_org')->where('mid', 0)->column('title', 'id');
        $mid_info = Db::name('member_list')->whereIn('eid', array_column($data['lists'], 'eid'))->column('ename', 'eid');
        $visit_info = Db::name('common_visitor_list')->whereIn('id', array_column($data['lists'], 'visitor_id'))->column('reason', 'id');
        $phone_info = Db::name('member_newcomer')->whereIn('phone', array_column($data['lists'], 'phone'))->field('phone,name,supplier')->cates('phone');
        foreach ($data['lists'] as $k => $v) {
            if ($v['type'] === 1) {
                $data['lists'][$k]['ename'] = $phone_info[$v['phone']]['name'];
                $data['lists'][$k]['dpt'] = $phone_info[$v['phone']]['supplier'];
            } else {
                $data['lists'][$k]['ename'] = isset($aid_info[$v['eid']]) ? $aid_info[$v['eid']]['truename'] : $mid_info[$v['eid']];
                $data['lists'][$k]['dpt'] = isset($aid_info[$v['eid']]) ? $dpt_info[$aid_info[$v['eid']]['dpt']] : '一线员工';
            }
            if ($v['type'] === 3) {
                $data['lists'][$k]['mark'] = $visit_info[$v['visitor_id']];
            }
            // $data['lists'][$k]['creator_name'] = $aid_info[$v['creator']];
            $data['lists'][$k]['meal_date'] = date('Y-m-d', $v['meal_date']);
        }
        exit($this->lay_table($data));
    }
    //领餐记录导出
    public function mealSignExport()
    {
        $item = input('get.');
        $data = Db::name('common_meal_sign')->where('meal_date', 'between', [strtotime($item['start']), strtotime($item['end'])])->lists();
        if (!$data) {
            http_response_code(440);
            exit(json_encode(array('code' => 1, 'msg' => '无任何有效记录！')));
        }
        $aid_info = Db::name('admin_user')->field('id,username,truename,dpt')->cates('username');
        $dpt_info = Db::name('admin_org')->where('mid', 0)->column('title', 'id');
        $mid_info = Db::name('member_list')->whereIn('eid', array_column($data, 'eid'))->column('ename', 'eid');
        $visit_info = Db::name('common_visitor_list')->whereIn('id', array_column($data, 'visitor_id'))->column('reason', 'id');
        $info_list = Db::name('admin_base')->whereIn('mid', [10, 11])->field('mid,title,content')->lists();
        foreach ($info_list as $k => $v) {
            if ($v['mid'] === 10) {
                $type_info[$v['content']] = $v['title'];
            } else {
                $item_info[$v['content']] = $v['title'];
            }
        }
        $phone_info = Db::name('member_newcomer')->whereIn('phone', array_column($data, 'phone'))->field('phone,name,supplier')->cates('phone');
        foreach ($data as $k => $v) {
            $res[$k]['ID'] = $v['id'];
            $res[$k]['用餐日期'] = date('Y-m-d', $v['meal_date']);
            $res[$k]['类型'] = $type_info[$v['type']];
            $res[$k]['工号'] = $v['eid'];
            if ($v['type'] === 1) {
                $res[$k]['姓名'] = $phone_info[$v['phone']]['name'];
                $res[$k]['部门'] = $phone_info[$v['phone']]['supplier'];
            } else {
                $res[$k]['姓名'] = isset($aid_info[$v['eid']]) ? $aid_info[$v['eid']]['truename'] : $mid_info[$v['eid']];
                $res[$k]['部门'] = isset($aid_info[$v['eid']]) ? $dpt_info[$aid_info[$v['eid']]['dpt']] : '一线员工';
            }
            $res[$k]['餐别'] = $item_info[$v['item']];
            $res[$k]['餐别备注'] = $v['itemMark'];
            $res[$k]['数量'] = $v['num'];
            if ($v['type'] === 3) {
                $res[$k]['备注'] = $visit_info[$v['visitor_id']];
            } else {
                $res[$k]['备注'] = $v['mark'];
            }
            $res[$k]['创建日期'] = date('Y-m-d H:i:s', $v['create_time']);
            $res[$k]['状态'] = $v['status'] === 1 ? '未验码' : '已验证';
            $res[$k]['验码时间'] = $v['check_time'] > 0 ? date('Y-m-d H:i:s', $v['check_time']) : '';
        }
        exit(json_encode(array('code' => 0, 'data' => $res)));
    }
    // 员工信息列表
    public function getNewComerExamList()
    {
        $item = input('get.');
        $obj = Db::name('member_newcomer_score')->where('status', 1);
        if (isset($item['kw']) && $item['kw'] !== "") {
            $obj = $obj->where('phone|ename', 'like', '%' . trim($item['kw']) . '%');
        }
        if (isset($item['date']) && $item['date'] !== "") {
            $date = explode(",", $item['date']);
            $obj = $obj->where('exam_date', 'between', [strtotime($date[0]), strtotime($date[1])]);
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $start = min(array_column($data['lists'], 'exam_date'));
        $all = Db::name('member_newcomer_score')->where('status', 1)->where('exam_date', '>', $start - 10 * 3600)->lists();
        foreach ($all as $k => $v) {
            if (isset($all[$v['phone'] . $v['ename']]) === false) {
                $all[$v['phone'] . $v['ename']] = 1;
                $res[$v['id']] = 1;
            } else {
                ++$all[$v['phone'] . $v['ename']];
                $res[$v['id']] = $all[$v['phone'] . $v['ename']];
            }
        }

        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['exam_date'] = date('Y-m-d H:i:s', $v['exam_date']);
            $data['lists'][$k]['item_type'] = $v['item_type'] == 1 ? "A卷" : "B卷";
            $data['lists'][$k]['times'] = $res[$v['id']];
        }

        exit($this->lay_table($data));
    }
    // 新人考试记录导出（与列表一致，仅包含合格记录）
    public function newComerExamExport()
    {
        $item = input('get.');
        $start = is_string($item['start'] ?? null) ? strtotime($item['start']) : false;
        $end = is_string($item['end'] ?? null) ? strtotime($item['end']) : false;
        if ($start === false || $end === false || date('Y-m-d', $start) !== $item['start'] || date('Y-m-d', $end) !== $item['end'] || $start > $end) {
            http_response_code(440);
            exit(json_encode(['code' => 1, 'msg' => '请选择有效的日期范围！']));
        }
        $data = Db::name('member_newcomer_score')->where('status', 1)
            ->where('exam_date', '>=', $start)->where('exam_date', '<', strtotime('+1 day', $end))
            ->order('id desc')->lists();
        if (!$data) {
            http_response_code(440);
            exit(json_encode(['code' => 1, 'msg' => '所选日期范围内无有效考试记录！']));
        }
        $rows = [];
        foreach ($data as $v) {
            $rows[] = [
                '姓名' => $v['ename'],
                '手机号' => (string)$v['phone'],
                '考试得分' => $v['score'],
                '考试日期' => date('Y-m-d H:i:s', $v['exam_date']),
                'AB卷' => $v['item_type'] == 1 ? 'A卷' : 'B卷',
                '考试次数' => max(1, (int)($v['type'] ?? 1)),
            ];
        }
        exit(json_encode(['code' => 0, 'data' => $rows]));
    }
    // 夜间班车列表
    public function getNightCarList()
    {
        $item = input('get.');
        $obj = Db::name('common_night_bus');
        if (isset($item['kw']) && $item['kw'] !== "") {
            $obj = $obj->where('eid', 'like', '%' . $item['kw'] . '%');
        }
        if (isset($item['date']) && $item['date'] !== "") {
            $date = explode(",", $item['date']);
            $obj = $obj->where('eff_date', 'between', [strtotime($date[0]), strtotime($date[1])]);
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $mid_info = Db::name('member_list')->whereIn('eid', array_column($data['lists'], 'eid'))->field('eid,ename,tid')->cates('eid');
        $team_info = Db::name('team_list')->column('team', 'id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['ename'] = isset($mid_info[$v['eid']])?$mid_info[$v['eid']]['ename']:'-';
            $data['lists'][$k]['team'] = isset($mid_info[$v['eid']])?$team_info[$mid_info[$v['eid']]['tid']]:'';
            $data['lists'][$k]['item'] = $v['item'] == 1?'两江名居':'三溪口';
            $data['lists'][$k]['status'] = $v['status'] == 1?'待确认':($v['status'] == 2?'已确认':'已取消');
            $data['lists'][$k]['eff_date'] = date('Y-m-d', $v['eff_date']);
            $data['lists'][$k]['update'] = $v['update'] > 0 ? date('Y-m-d H:i:s', $v['update']) : '';
        }
        exit($this->lay_table($data));
    }
    //夜班班车导出
    public function exportNightCarList()
    {
        $item = input('get.');
        $data = Db::name('common_night_bus')->where('eff_date', 'between', [strtotime($item['start']), strtotime($item['end'])])->order('eff_date')->lists();
        $mid_info = Db::name('member_list')->whereIn('eid', array_column($data, 'eid'))->field('eid,ename,tid')->cates('eid');
        $aid_info = Db::name('admin_user')->whereIn('username', array_column($data, 'eid'))->column('truename', 'username');
        $team_info = Db::name('team_list')->column('team', 'id');
        foreach ($data as $k => $v) {
            $data[$k]['ename'] = isset($mid_info[$v['eid']]['ename'])?$mid_info[$v['eid']]['ename']:($aid_info[$v['eid']]?$aid_info[$v['eid']]:'');
            $data[$k]['team'] = isset($mid_info[$v['eid']]['ename'])?$team_info[$mid_info[$v['eid']]['tid']]:'办公室人员';
            $data[$k]['item'] = $v['item'] == 1?'两江名居':'三溪口';
            $data[$k]['status'] = $v['status'] == 1?'待确认':($v['status'] == 2?'已确认':'已取消');
            $data[$k]['eff_date'] = date('Y-m-d', $v['eff_date']);
            $data[$k]['update'] = $v['update'] > 0 ? date('Y-m-d H:i:s', $v['update']) : '';
        }
        return json(['code'=>0,'data'=>$data]);
    }
    // 工衣尺码下载
    public function closthsExport()
    {
        $data = Db::name('admin_user_mobile')->where('size', '>', 0)->field('username,size')->lists();
        return json(['code' => 0, 'data' => $data]);
    }
    //领餐列表
    public function getKpiList()
    {
        $item = input('get.');
        $obj = Db::name('kpi_record')->where('status', '>', 0);
        if (isset($item['kw']) && $item['kw'] != "") {
            $obj = $obj->where('eid', 'like', '%' . $item['kw'] . '%');
        }
        if (isset($item['date']) && $item['date'] != "") {
            $date = explode(",", $item['date']);
            $obj = $obj->where('kpi_date', 'between', [strtotime($date[0]), strtotime($date[1])]);
        }
        if (isset($item['status']) && (int) $item['status'] > 0) {
            if ($item['status'] == 1) {
                $obj = $obj->where('status', 1);
            } else {
                $obj = $obj->where('status', '>', 1);
            }
        }
        if (isset($item['team']) && $item['team'] != '') {
            $team = explode(',', $item['team']);
            if(isset($team[1])){
                $obj = $obj->where('tid', $team[1]);
            }else{
                $tids = Db::name('team_list')->where('project', $team[0])->column('id');
                $obj = $obj->whereIn('tid', $tids);
            }
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $aid_info = Db::name('admin_user')->whereIn('id', array_column($data['lists'], 'aid'))->column('truename', 'id');
        $kpi_info = Db::name('kpi_list')->whereIn('id', array_column($data['lists'], 'item'))->column('job,item,content,scores', 'id');
        $eid_info = Db::name('member_list')->whereIn('eid', array_column($data['lists'], 'eid'))->column('ename','eid');
        $team_info = Db::name('team_list')->column('team', 'id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['aid_name'] = $aid_info[$v['aid']];
            $data['lists'][$k]['ename'] = $eid_info[$v['eid']];
            $data['lists'][$k]['team'] = $team_info[$v['tid']];
            $data['lists'][$k]['item'] = $kpi_info[$v['item']]['job'] . ' - ' . $kpi_info[$v['item']]['item'];
            $data['lists'][$k]['content'] = $kpi_info[$v['item']]['content'];
            $data['lists'][$k]['scores'] = $kpi_info[$v['item']]['scores'];
            $data['lists'][$k]['create_time'] = date('Y-m-d H:i:s', $v['create_time']);
            $data['lists'][$k]['kpi_date'] = date('Y-m-d', $v['kpi_date']);
        }
        exit($this->lay_table($data));
    }
    public function getKpiSumarry(){
        $obj = Db::name('kpi_record')->where('status', '>', 0);
        $team = explode(',', $team = input('get.team'));
        $type = 1;
        if(isset($team[1])){
            $obj = $obj->where('tid', $team[1]);
            $name = Db::name('team_list')->where('id', $team[1])->value('team');
        }else{
            $tids = Db::name('team_list')->where('project', $team[0])->column('id');
            $obj = $obj->whereIn('tid', $tids);
            $type = 2;
            $name = Db::name('team_base')->where('id',$team[0])->value('title');
        }
        $data = $obj->lists();
        $addScore = 0;
        $subScore = 0;
        foreach ($data as $k => $v) {
            if($v['score'] > 0){
                $addScore += $v['score'];
            }else{
                $subScore -= $v['score'];
            }
        }
        $totalScore = $addScore - $subScore;
        return json(['code' => 0, 'data' => ['add_score' => $addScore, 'sub_score' => $subScore, 'total_score' => $totalScore,'name'=>($type==1?'班组：':'项目：').$name]]);
	}
    //绩效条款 - 级联选择器选项
    public function getKpiItemOptions(){
        $list = Db::name('kpi_list')->where('status', 1)->order('dpt,job,item')->lists();

        $options = [];
        $dptMap = [];
        $jobMap = [];
        $itemMap = [];

        foreach ($list as $row) {
            $dptId = $row['dpt'];
            $job = $row['job'];
            $item = $row['item'];
            $contentId = $row['id'];

            // 第一层：部门
            if (!isset($dptMap[$dptId])) {
                $dptMap[$dptId] = count($options);
                $options[] = [
                    'value' => (string)$dptId,
                    'label' => $this->getDptName($dptId),
                    'children' => [],
                ];
            }

            // 第二层：岗位
            $dptIndex = $dptMap[$dptId];
            $jobKey = $dptId . '_' . $job;
            if (!isset($jobMap[$jobKey])) {
                $jobMap[$jobKey] = count($options[$dptIndex]['children']);
                $options[$dptIndex]['children'][] = [
                    'value' => $job,
                    'label' => $job,
                    'children' => [],
                ];
            }

            // 第三层：项目（item）
            $jobIndex = $jobMap[$jobKey];
            if (!isset($itemMap[$jobKey . '_' . $item])) {
                $itemMap[$jobKey . '_' . $item] = count($options[$dptIndex]['children'][$jobIndex]['children']);
                $options[$dptIndex]['children'][$jobIndex]['children'][] = [
                    'value' => $item,
                    'label' => $item,
                    'children' => [],
                ];
            }

            // 第四层：具体内容（叶子节点）
            $itemIndex = $itemMap[$jobKey . '_' . $item];
            $options[$dptIndex]['children'][$jobIndex]['children'][$itemIndex]['children'][] = [
                'value' => (string)$contentId,
                'label' => $row['content'] . ' (' . $row['scores'] . '分)',
            ];
        }

        exit(json_encode(['code' => 0, 'data' => $options]));
    }

    // 获取部门名称
    private function getDptName($dptId){
        static $dptCache = null;
        if ($dptCache === null) {
            $dptCache = Db::name('admin_org')->column('title', 'id');
        }
        return isset($dptCache[$dptId]) ? $dptCache[$dptId] : '未知部门';
    }
    // 绩效记录导出
    public function kpiExport()
    {
        $item = input('get.');
        $data = Db::name('kpi_record')->where('kpi_date', 'between', [strtotime($item['start']), strtotime($item['end'])])->where('status', '>', 0)->lists();
        if (!$data) {
            http_response_code(440);
            exit(json_encode(array('code' => 1, 'msg' => '无任何有效记录！')));
        }
        $aid_info = Db::name('admin_user')->whereIn('id', array_column($data, 'aid'))->column('truename', 'id');
        $kpi_info = Db::name('kpi_list')->whereIn('id', array_column($data, 'item'))->column('job,item,content,scores', 'id');
        $eid_info = Db::name('member_list')->whereIn('eid', array_column($data, 'eid'))->field('id,eid,ename,tid')->cates('eid');
        $team_info = Db::name('team_list')->column('team', 'id');
        foreach ($data as $k => $v) {
            $res[$k]['ID'] = $v['id'];
            $res[$k]['绩效日期'] = date('Y-m-d', $v['kpi_date']);
            $res[$k]['工号'] = $v['eid'];
            $res[$k]['姓名'] = $eid_info[$v['eid']]['ename'];
            $res[$k]['班组'] = $team_info[$eid_info[$v['eid']]['tid']];
            $res[$k]['评估条款'] = $kpi_info[$v['item']]['job'] . ' - ' . $kpi_info[$v['item']]['item'];
            $res[$k]['评估内容'] = $kpi_info[$v['item']]['content'];
            $res[$k]['分数标准'] = $kpi_info[$v['item']]['scores'];
            $res[$k]['评估分数'] = $v['score'];
            $res[$k]['创建日期'] = date('Y-m-d H:i:s', $v['create_time']);
            $res[$k]['评估班长'] = $aid_info[$v['aid']];
            $res[$k]['状态'] = $v['status'] == 1 ? '待确认' : ($v['status'] == 2 ? '已拒绝' : ($v['status'] == 3 ? '已完成' : '自动确认'));
            $res[$k]['备注'] = $v['mark'];
            $res[$k]['拒绝原因'] = $v['rej_mark'];
            $res[$k]['更新时间'] = date('Y-m-d H:i:s', $v['update']);
        }
        exit(json_encode(array('code' => 0, 'data' => $res)));
    }
    //领餐列表
    public function getMealList()
    {
        $item = input('get.');
        $obj = Db::name('common_meal_list');
        if (isset($item['kw']) && $item['kw'] != "") {
            $obj = $obj->where('eid', 'like', '%' . $item['kw'] . '%');
        }
        if (isset($item['dpt']) && $item['dpt'] > 0) {
            $obj = $obj->where('dpt', $item['dpt']);
        }
        if (isset($item['date']) && $item['date'] != "") {
            $date = explode(",", $item['date']);
            $obj = $obj->where('meal_date', 'between', [strtotime($date[0]), strtotime($date[1])]);
        }
        if (isset($item['view']) && (int) $item['view'] == 1) {
            $obj = $obj->where('owner', '>',0);
        }else{
            $obj = $obj->where('owner', null);
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $aid_info = Db::name('admin_user')->field('id,username,truename,dpt')->cates('id');
        $dpt_info = Db::name('admin_org')->where('mid',0)->column('title','id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['meal_date'] = date('Y-m-d', $v['meal_date']);
            $data['lists'][$k]['owner_name'] = $v['owner']>0?$aid_info[$v['owner']]['truename']:"";
            $data['lists'][$k]['dpt_name'] = $v['dpt']>0?$dpt_info[$v['dpt']]:'汇总';
        }
        exit($this->lay_table($data));
    }
    //领餐记录导出
    public function exportMealList()
    {
        $item = input('get.');
        $data = Db::name('common_meal_list')->where('meal_date', 'between', [strtotime($item['start']), strtotime($item['end'])])->where('owner','>',0)->lists();
        if (!$data) {
            http_response_code(440);
            exit(json_encode(array('code' => 1, 'msg' => '无任何有效记录！')));
        }
        $aid_info = Db::name('admin_user')->column('truename','id');
        $dpt_info = Db::name('admin_org')->where('mid',0)->column('title','id');
        foreach ($data as $k => $v) {
            $res[$k]["部门"] = $dpt_info[$v['dpt']];
            $res[$k]["申请人"] = $aid_info[$v['owner']];
            $res[$k]["用餐日期"] = date('Y-m-d', $v['meal_date']);
            $res[$k]["描述"] = $v['title'];
            $res[$k]["中餐"] = $v['meal1'];
            $res[$k]["晚餐"] = $v['meal2'];
            $res[$k]["夜宵"] = $v['meal3'];
            $res[$k]["早餐"] = $v['meal4'];
            $res[$k]["备注"] = $v['mark'];
        }
        exit(json_encode(array('code' => 0, 'data' => $res)));
    }
    // 考试列表
    public function getKeyExamList()
    {
        $item = input('get.');
        $obj = Db::name('quality_newskill_score');
        if (isset($item['kw']) && $item['kw'] !== "") {
            $obj = $obj->where('phone|ename', 'like', '%' . trim($item['kw']) . '%');
        }
        if (isset($item['date']) && $item['date'] !== "") {
            $date = explode(",", $item['date']);
            $obj = $obj->where('exam_date', 'between', [strtotime($date[0]), strtotime($date[1])]);
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $mid_info = Db::name('member_list')->whereIn('id', array_column($data['lists'], 'mid'))->field('id,eid,ename')->cates('id');
        $item_info = Db::name('quality_base')->whereIn('id', array_column($data['lists'], 'item_type'))->column('content','id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['exam_date'] = date('Y-m-d H:i:s', $v['exam_date']);
            $data['lists'][$k]['ename'] = $mid_info[$v['mid']]['ename'];
            $data['lists'][$k]['eid'] = $mid_info[$v['mid']]['eid'];
            $data['lists'][$k]['item_type'] = $item_info[$v['item_type']];
        }
        exit($this->lay_table($data));
    }
    private function keyExamExportRange($item)
    {
        $zone=new \DateTimeZone('Asia/Shanghai');$dates=[];
        foreach(['start','end'] as $key){$value=$item[$key]??'';$date=is_string($value)?\DateTimeImmutable::createFromFormat('!Y-m-d',$value,$zone):false;
            if(!$date||$date->format('Y-m-d')!==$value){http_response_code(440);exit(json_encode(['code'=>1,'msg'=>'请选择有效考试日期区间']));}$dates[]=$date;}
        if($dates[0]>$dates[1]){http_response_code(440);exit(json_encode(['code'=>1,'msg'=>'开始日期不能晚于结束日期']));}
        return [$dates[0]->getTimestamp(),$dates[1]->modify('+1 day')->getTimestamp()];
    }
    // 考试记录导出
    public function exportKeyExamList()
    {
        $item = input('get.');
        $query = Db::name('quality_newskill_score')->withoutField('training_job_id');
        list($start,$end)=$this->keyExamExportRange($item);$query->where('exam_date','>=',$start)->where('exam_date','<',$end);
        $data = $query->order('id desc')->lists();
        $members = Db::name('member_list')->whereIn('id', array_column($data, 'mid'))->field('id,eid,ename')->cates('id');
        $projects = Db::name('quality_base')->column('content', 'id');
        foreach ($data as &$row) { $row['ename']=$members[$row['mid']]['ename'] ?? ''; $row['eid']=$members[$row['mid']]['eid'] ?? ''; $row['item_name']=$projects[$row['item_type']] ?? ''; }
        unset($row);
        exit(json_encode(['code'=>0,'data'=>$data]));
    }
    //获取考试技能选项
    public function getSkillOptions()
    {
        $exam = Db::name('quality_ppi_exam')->where('status', 1)->column('item_type');
        $data = Db::name('quality_base')->where(['mid'=>4, 'status'=>1, 'title'=>2])->whereIn('id', $exam)->field('id as value,content as label')->lists();
        exit(json_encode(array('code' => 0, 'data' => $data)));
    }
    //导出离职记录(劳务公司使用)
    public function getPerLeaveListForSupplier()
    {
        $data = Db::name('member_perleave')->where('status', 1)->lists();
        if (!$data) {
            http_response_code(440);
            exit(json_encode(array('code' => 1, 'msg' => '无任何有效记录！')));
        }
        $mid_info = Db::name('member_list')->whereIn('id', array_column($data, 'mid'))->cates('id');
        $mid_detail = Db::name('member_interview')->whereIn('m_id', array_column($data, 'mid'))->cates('m_id');
        $aid_info = Db::name('admin_user')->whereIn('id', array_column($data, 'aid'))->column('truename','id');
        $team_info = Db::name('team_list')->column('team', 'id');
        $type_info = Db::name('member_base')->where('mid',1)->cates('id');
        foreach ($data as $k => $v) {
            $res[$k]['ID'] = $v['id'];
            $res[$k]['姓名'] = $mid_info[$v['mid']]['ename'];
            $res[$k]['工号'] = $mid_info[$v['mid']]['eid'];
            $res[$k]['班组'] = $team_info[$v['tid']];
            $res[$k]['班长'] = $aid_info[$v['aid']];
            $res[$k]['入职时间'] = date('Y-m-d', $mid_info[$v['mid']]['hiredate']);
            $res[$k]['劳务公司'] = $mid_detail[$v['mid']]['supplier'];
            $res[$k]['福利类型'] = $mid_detail[$v['mid']]['source_type'] == 1? '小时工':($mid_detail[$v['mid']]['source_type'] == 2? '重庆社保':'学生工');
            $res[$k]['手机号'] = $mid_detail[$v['mid']]['phone'];
            $res[$k]['申请离职时间'] = date('Y-m-d H:i:s', $v['update']);
            $res[$k]['预离职时间'] = date('Y-m-d', $v['perleave_date']);
            $res[$k]['离职类型'] = $type_info[$v['type']]['title'] . ' - ' . $type_info[$v['type']]['content'];
            $res[$k]['离职原因'] = $v['reason'];
        }
        exit(json_encode(array('code' => 0, 'data' => $res)));
    }
    // 获取新员工技能考核列表
    public function getNewSkillScoreList()
    {
        $item = input('get.');
        $obj = Db::name('quality_newskill_score');
        if (isset($item['kw']) && $item['kw'] !== "") {
            $obj = $obj->where('ename', 'like', '%' . trim($item['kw']) . '%');
        }
        if (isset($item['date']) && $item['date'] !== "") {
            $date = explode(",", $item['date']);
            $obj = $obj->where('exam_date', 'between', [strtotime($date[0]), strtotime($date[1])]);
        }
        $data = $obj->order('id desc')->pages($item['limit']);
        $mid_info = Db::name('member_list')->whereIn('id', array_column($data['lists'], 'mid'))->field('id,eid,ename')->cates('id');
        $item_info = Db::name('quality_base')->whereIn('id', array_column($data['lists'], 'item_type'))->column('content','id');
        foreach ($data['lists'] as $k => $v) {
            $data['lists'][$k]['exam_date'] = date('Y-m-d H:i:s', $v['exam_date']);
            $data['lists'][$k]['ename'] = $mid_info[$v['mid']]['ename'];
            $data['lists'][$k]['eid'] = $mid_info[$v['mid']]['eid'];
            $data['lists'][$k]['item_type'] = $item_info[$v['item_type']];
        }
        exit($this->lay_table($data));
    }
    // 导出新员工技能考核列表
    public function newSkillScoreListExport()
    {
        $item = input('get.');
        list($start,$end)=$this->keyExamExportRange($item);
        $data = Db::name('quality_newskill_score')->withoutField('training_job_id')->where('exam_date','>=',$start)->where('exam_date','<',$end)->order('id desc')->lists();
        if (!$data) {
            http_response_code(440);
            exit(json_encode(array('code' => 1, 'msg' => '无任何有效记录！')));
        }
        exit(json_encode(array('code' => 0, 'data' => $data)));
    }
    // 考题设置列表
    public function getExamSetList()
    {
        $item_info = Db::name('quality_base')->where('mid', 4)->where('status', 1)->column('content', 'id');
        $exam = Db::name('quality_ppi_exam')->where('status', 1)->whereIn('item_type', array_keys($item_info))->field('id,exam_type,item_type')->lists();
        $item_type = array_unique(array_column($exam, 'item_type'));
        $data = Db::name('quality_exam_set')->whereIn('item_type', $item_type)->order('type,item_type')->lists();
        $unset_item_type = array_diff($item_type, array_column($data, 'item_type'));
        if($unset_item_type){
            foreach ($unset_item_type as $k => $v) {
                Db::name('quality_exam_set')->insert(['item_type' => $v, 'type' => 2]);
            }
            $data = Db::name('quality_exam_set')->whereIn('item_type', $item_type)->order('type,item_type')->lists();
        }
        
        $exam_set = [];
        foreach ($exam as $k => $v) {
            if (isset($exam_set[$v['item_type']][$v['exam_type']])) {
                $exam_set[$v['item_type']][$v['exam_type']]++;
            } else {
                $exam_set[$v['item_type']][$v['exam_type']] = 1;
            }
        }
        foreach ($data as $k => $v) {
            $data[$k]['type'] = $v['type'] == 1 ? 'PPI' : '新考技能';
            $data[$k]['item_name'] = $item_info[$v['item_type']] ?? '';
            $data[$k]['total'] = $v['num1'] * $v['score1'] + $v['num2'] * $v['score2'] + $v['num3'] * $v['score3'];
            $data[$k]['total1'] = $exam_set[$v['item_type']][1] ?? 0;
            $data[$k]['total2'] = $exam_set[$v['item_type']][2] ?? 0;
            $data[$k]['total3'] = $exam_set[$v['item_type']][3] ?? 0;
        }
        exit(json_encode(array('code' => 0, 'data' => $data)));
    }
}
