<?php
namespace App\Services\Statistics;

use App\Repositories\JobsRepository;
use App\Repositories\CategoryJobsRepository;
use App\Repositories\Jobfair\JobfairPutJobRepository;
use Illuminate\Support\Facades\Cache;

class JobsService
{
    protected $jobsRepository;
    protected $categoryJobsRepository;
    protected $jobfairPutJobRepository;

    public function __construct(JobsRepository $jobsRepository, CategoryJobsRepository $categoryJobsRepository, JobfairPutJobRepository $jobfairPutJobRepository)
    {
        $this->jobsRepository = $jobsRepository;
        $this->categoryJobsRepository = $categoryJobsRepository;
        $this->jobfairPutJobRepository       = $jobfairPutJobRepository;
    }

    //获取职位分类信息
    public function getJobsCategoryInfo()
    {
        $result = Cache::get('jobs_cate_list');
        if (null === $result) {
            $result = $this->categoryJobsRepository->jobsCateInfoCache();
            Cache::put('jobs_cate_list', $result, '86400');
        }
        return $result;
    }

    public function getValidJobNum($where)
    {
        return $this->jobsRepository->getJobCount($where);
    }

    public function getJobNumGroup($where, $company_where, $group_by)
    {
        $rst = $this->jobsRepository->getJobNumGroup($where, $company_where, $group_by);
        return $rst->pluck('count(id)', 'DATE(created_at)')->toArray();
    }

    public function getJobNumsByGroup($where, $company_where, $fields, $group_by, $order_by = '')
    {
        $rst = $this->jobsRepository->getNumsByGroup($where, $company_where, $fields, $group_by, $order_by);
        return $rst->toArray();
    }
    public function getJobNumsByCategory($where, $company_where, $fields, $group_by, $order_by = '')
    {
        $rst = $this->jobsRepository->getNumsByGroup($where, $company_where, $fields, $group_by, $order_by);
        return $rst->pluck('num', 'cate')->toArray();
    }

    public function getJobNumByTradeGroup($where, $fields, $group_by, $order_by = '', $limit = '')
    {
        $rst = $this->jobsRepository->getJobNumByTradeGroup($where, $fields, $group_by, $order_by, $limit);
        return $rst->toArray();
    }

    public function getAvgWageByGroup($where, $company_where, $fields, $group_by, $order_by = '', $limit = '')
    {
        $rst = $this->jobsRepository->getAvgWageByGroup($where, $company_where, $fields, $group_by, $order_by, $limit);
        $list = $rst->toArray();
        $cates = $this->getJobsCategoryInfo();
        $cates = $cates['id'];
        if ($list) {
            foreach ($list as $k => $v) {
                if ($cates && array_has($cates, $v[$group_by])) {
                    $list[$k]['name'] = $cates[$v[$group_by]]['name'];
                } else {
                    $list[$k]['name'] = '';
                }
            }
        }
        return $list;
    }
    public function getJobsTopclass($job_where, $whereIn, $fields, $group_by, $order_by, $limit = '')
    {
        $rst = $this->jobfairPutJobRepository->getTopClassRand($job_where, $whereIn, $fields, $group_by, $order_by, $limit);
        $list = $rst->pluck('num', 'topclass')->toArray();
        $cates = $this->getJobsCategoryInfo();
        $cates = $cates['id'];

        $data = [];
        if ($list) {
            foreach ($list as $k => $v) {
                $data[$k]['value'] = $v;
                if ($cates && array_has($cates, $k)) {
                    $data[$k]['name'] = $cates[$k]['name'];
                } else {
                    $data[$k]['name'] = '';
                }
            }
        }
        return $data;
    }

    public function getIndustryAmount($job_where, $company_where, $trades)
    {
        $rst = $this->jobsRepository->getIndustryAmount($job_where, $company_where, $trades);
        return $rst;
    }
    public function getTradeAmount($start_time, $end_time, $subsite_id)
    {
        $trade_num1 = $this->getTradeAmountByGruop($start_time, $end_time, [44], $subsite_id);
        $trade_num2 = $this->getTradeAmountByGruop($start_time, $end_time, [39,40], $subsite_id);
        $trade_num3 = $this->getTradeAmountByGruop($start_time, $end_time, [6,7,13,14,15,16,17,18,19,21,25], $subsite_id);
        $trade_num4 = $this->getTradeAmountByGruop($start_time, $end_time, [41], $subsite_id);
        $trade_num5 = $this->getTradeAmountByGruop($start_time, $end_time, [27,28], $subsite_id);
        $trade_num6 = $this->getTradeAmountByGruop($start_time, $end_time, [37,38], $subsite_id);
        $trade_num7 = $this->getTradeAmountByGruop($start_time, $end_time, [1,2,3,4], $subsite_id);
        $trade_num8 = $this->getTradeAmountByGruop($start_time, $end_time, [12], $subsite_id);
        $trade_num9 = $this->getTradeAmountByGruop($start_time, $end_time, [35,36], $subsite_id);
        $trade_num10 = $this->getTradeAmountByGruop($start_time, $end_time, [9,10], $subsite_id);
        $trade_num11 = $this->getTradeAmountByGruop($start_time, $end_time, [26], $subsite_id);
        $trade_num12 = $this->getTradeAmountByGruop($start_time, $end_time, [8,11,22,23,29,31,32], $subsite_id);
        $trade_num13 = $this->getTradeAmountByGruop($start_time, $end_time, [34], $subsite_id);
        $trade_num14 = $this->getTradeAmountByGruop($start_time, $end_time, [45], $subsite_id);
        $trade_num15 = $this->getTradeAmountByGruop($start_time, $end_time, [30], $subsite_id);
        $trade_num16 = $this->getTradeAmountByGruop($start_time, $end_time, [33], $subsite_id);
        $trade_num17 = $this->getTradeAmountByGruop($start_time, $end_time, [20], $subsite_id);
        $trade_num18 = $this->getTradeAmountByGruop($start_time, $end_time, [5,24], $subsite_id);
        $trade_num19 = $this->getTradeAmountByGruop($start_time, $end_time, [42,43], $subsite_id);

        $total = (int)$trade_num1 + (int)$trade_num2+ (int)$trade_num3+ (int)$trade_num4+ (int)$trade_num5+ (int)$trade_num6+ (int)$trade_num7+ (int)$trade_num8+ (int)$trade_num9+ (int)$trade_num10+ (int)$trade_num11+ (int)$trade_num12+ (int)$trade_num13+ (int)$trade_num14+ (int)$trade_num15+ (int)$trade_num16+ (int)$trade_num17+ (int)$trade_num18+ (int)$trade_num19;

        $data = [
            ['name'=>'农、林、牧、渔业','number'=>1,'job_amount'=>$trade_num1,'rate'=>$total>0?round($trade_num1/$total, 4)*100:'0'],
            ['name'=>'采矿业','number'=>2,'job_amount'=>$trade_num2,'rate'=>$total>0?round($trade_num2/$total, 4)*100:'0'],
            ['name'=>'制造业','number'=>3,'job_amount'=>$trade_num3,'rate'=>$total>0?round($trade_num3/$total, 4)*100:'0'],
            ['name'=>'电力、煤气及水的生产和供应业','number'=>4,'job_amount'=>$trade_num4,'rate'=>$total>0?round($trade_num4/$total, 4)*100:'0'],
            ['name'=>'建筑业','number'=>5,'job_amount'=>$trade_num5,'rate'=>$total>0?round($trade_num5/$total, 4)*100:'0'],
            ['name'=>'交通运输、仓储及邮电通信业','number'=>6,'job_amount'=>$trade_num6,'rate'=>$total>0?round($trade_num6/$total, 4)*100:'0'],
            ['name'=>'信息传输、计算机服务和软件业','number'=>7,'job_amount'=>$trade_num7,'rate'=>$total>0?round($trade_num7/$total, 4)*100:'0'],
            ['name'=>'批发和零售业','number'=>8,'job_amount'=>$trade_num8,'rate'=>$total>0?round($trade_num8/$total, 4)*100:'0'],
            ['name'=>'住宿和餐饮业','number'=>9,'job_amount'=>$trade_num9,'rate'=>$total>0?round($trade_num9/$total, 4)*100:'0'],
            ['name'=>'金融业','number'=>10,'job_amount'=>$trade_num10,'rate'=>$total>0?round($trade_num10/$total, 4)*100:'0'],
            ['name'=>'房地产业','number'=>11,'job_amount'=>$trade_num11,'rate'=>$total>0?round($trade_num11/$total, 4)*100:'0'],
            ['name'=>'租赁和商业服务业','number'=>12,'job_amount'=>$trade_num12,'rate'=>$total>0?round($trade_num12/$total, 4)*100:'0'],
            ['name'=>'科学研究、技术服务和地质勘查业','number'=>13,'job_amount'=>$trade_num13,'rate'=>$total>0?round($trade_num13/$total, 4)*100:'0'],
            ['name'=>'水利、环境和公共设施管理业','number'=>14,'job_amount'=>$trade_num14,'rate'=>$total>0?round($trade_num14/$total, 4)*100:'0'],
            ['name'=>'居民服务和其他服务业','number'=>15,'job_amount'=>$trade_num15,'rate'=>$total>0?round($trade_num15/$total, 4)*100:'0'],
            ['name'=>'教育','number'=>16,'job_amount'=>$trade_num16,'rate'=>$total>0?round($trade_num16/$total, 4)*100:'0'],
            ['name'=>'卫生、社会保险和社会福利业','number'=>17,'job_amount'=>$trade_num17,'rate'=>$total>0?round($trade_num17/$total, 4)*100:'0'],
            ['name'=>'文化、体育和娱乐业','number'=>18,'job_amount'=>$trade_num18,'rate'=>$total>0?round($trade_num18/$total, 4)*100:'0'],
            ['name'=>'公共管理和社会组织','number'=>19,'job_amount'=>$trade_num19,'rate'=>$total>0?round($trade_num19/$total, 4)*100:'0'],
            ['name'=>'国际组织','number'=>20,'job_amount'=>'0','rate'=>'0'],
        ];
        return ['data'=>$data, 'total'=>$total];
    }
    public function getTradeAmountByGruop($start_time, $end_time, $trades, $subsite_id)
    {
        $job_where = [
            ['created_at', '<=', $end_time],
            ['created_at', '>=', $start_time],
            ['valid', '=', 1],
            ['display', '=', 1]
        ];
        if (config('aix.companyset.comset.show_set.jobs_display') == 1) {
            $job_where[] = array('audit', '=', 1);
        } else {
            $job_where[] = array('audit', '<>', 3);
        }
        $company_where = [
            ['utype', '=', 1],
            ['user_status', '=', 1]
        ];
        if ($subsite_id !='-1') {
            $company_where[] = ['subsite_id', '=', $subsite_id];
        }
        $rst = $this->jobsRepository->getIndustryAmount($job_where, $company_where, $trades);
        return $rst;
    }

    public function getEconomicAmount($start_time, $end_time, $subsite_id)
    {
        $job_where = [
            ['j.created_at', '<=', $end_time],
            ['j.created_at', '>=', $start_time],
            ['j.valid', '=', 1],
            ['j.display', '=', 1]
        ];
        if (config('aix.companyset.comset.show_set.jobs_display') == 1) {
            $job_where[] = array('j.audit', '=', 1);
        } else {
            $job_where[] = array('j.audit', '<>', 3);
        }
        $company_where = [['p.utype', '=', 1], ['p.user_status', '=', 1]];
        if ($subsite_id !='-1') {
            $company_where[] = ['p.subsite_id', '=', $subsite_id];
        }
        $where = 'j.deleted_at is null and p.deleted_at is null';
        $nature_data = $this->getJobAmountByNature($where, $job_where, $company_where)->pluck('num', 'nature')->toArray();
        $nature_data1 = 0;  //企业
        $nature_data2 = 0; //事业
        $nature_data3 = 0;  //机关
        $nature_data4 = 0;   //其他
        $nature_total = 0;
        if ($nature_data) {
            foreach ($nature_data as $k => $v) {
                if ($k == 46) {
                    $nature_data1 = $nature_data['46'];
                } elseif ($k == 47) {
                    $nature_data2 = $nature_data['47'];
                } elseif ($k == 48) {
                    $nature_data3 = $nature_data['48'];
                } else {
                    $nature_data4 = (int)$nature_data4 + (int)$v;
                }
                $nature_total = (int)$nature_total + (int)$v;
            }
        }
        $nature_arr = [
            ['name'=>'企业','job_amount'=>$nature_data1],
            ['name'=>'事业','job_amount'=>$nature_data2],
            ['name'=>'机关','job_amount'=>$nature_data3],
            ['name'=>'其他','job_amount'=>$nature_data4],
        ];
        //按经济类型分组获取需求人数
        $economy_rst = $this->getJobAmountByEconomy($where, $job_where, $company_where, [46]);
        $economy_data1  = 0; //国有企业
        $economy_data2  = 0;//集体企业
        $economy_data3  = 0;//股份合作企业
        $economy_data4  = 0;//联营企业
        $economy_data5  = 0;//有限责任公司
        $economy_data6  = 0;//股份有限公司
        $economy_data7  = 0;//私营企业
        $economy_data8  = 0;//其他企业
        $economy_data9  = 0;//港澳台投资企业
        $economy_data10 = 0;//外商投资企业
        $economy_data11 = 0;//个体经营
        if ($economy_rst->toArray()) {
            foreach ($economy_rst->toArray() as $k => $v) {
                if (in_array($v->economy, [382,383,392])) {
                    $economy_data1 = (int)$economy_data1 + (int)$v->num;
                } elseif (in_array($v->economy, [384])) {
                    $economy_data2 = (int)$economy_data2 + (int)$v->num;
                } elseif (in_array($v->economy, [385])) {
                    $economy_data3 = (int)$economy_data3 + (int)$v->num;
                } elseif (in_array($v->economy, [386,387,388,389,390])) {
                    $economy_data4 = (int)$economy_data4 + (int)$v->num;
                } elseif (in_array($v->economy, [391,393])) {
                    $economy_data5 = (int)$economy_data5 + (int)$v->num;
                } elseif (in_array($v->economy, [394])) {
                    $economy_data6 = (int)$economy_data6 + (int)$v->num;
                } elseif (in_array($v->economy, [395,396,397,398,399])) {
                    $economy_data7 = (int)$economy_data7 + (int)$v->num;
                } elseif (in_array($v->economy, [381,401,402,415,416])) {
                    $economy_data8 = (int)$economy_data8 + (int)$v->num;
                } elseif (in_array($v->economy, [403,404,405,406,407,408])) {
                    $economy_data9 = (int)$economy_data9 + (int)$v->num;
                } elseif (in_array($v->economy, [409,410,411,412,413,414])) {
                    $economy_data10 = (int)$economy_data10 + (int)$v->num;
                } elseif (in_array($v->economy, [400])) {
                    $economy_data11 = (int)$economy_data11 + (int)$v->num;
                }
            }
        }
        $domestic_data = (int)$economy_data1 + (int)$economy_data2+ (int)$economy_data3+ (int)$economy_data4+ (int)$economy_data5+ (int)$economy_data6+ (int)$economy_data7+ (int)$economy_data8;
        //dump($economy_data1);
        //处理数据
        $data[] = ['name'=>'企业','number'=>'1','amount'=>$nature_data1,'rate'=>$nature_total>0?sprintf("%.4f", (int)$nature_data1/(int)$nature_total)*100:'0', 'padding'=>50];

        $data[] = ['name'=>'其中:内资企业','number'=>'2','amount'=>$domestic_data,'rate'=>$nature_total>0?sprintf("%.4f", (int)$domestic_data/(int)$nature_total)*100:'0', 'padding'=>80];

        $data[] = ['name'=>'  国有企业','number'=>'3','amount'=>$economy_data1,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data1/(int)$domestic_data)*100:'0', 'padding'=>120];
        $data[] = ['name'=>'  集体企业','number'=>'4','amount'=>$economy_data2,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data2/(int)$domestic_data)*100:'0', 'padding'=>120];
        $data[] = ['name'=>'  股份合作企业','number'=>'5','amount'=>$economy_data3,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data3/(int)$domestic_data)*100:'0', 'padding'=>120];
        $data[] = ['name'=>'  联营企业','number'=>'6','amount'=>$economy_data4,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data4/(int)$domestic_data)*100:'0', 'padding'=>120];
        $data[] = ['name'=>'  有限责任公司','number'=>'7','amount'=>$economy_data5,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data5/(int)$domestic_data)*100:'0', 'padding'=>120];
        $data[] = ['name'=>'  股份有限公司','number'=>'8','amount'=>$economy_data6,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data6/(int)$domestic_data)*100:'0', 'padding'=>120];
        $data[] = ['name'=>'  私营企业','number'=>'9','amount'=>$economy_data7,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data7/(int)$domestic_data)*100:'0', 'padding'=>120];
        $data[] = ['name'=>'  其他企业','number'=>'10','amount'=>$economy_data8,'rate'=>$domestic_data>0?sprintf("%.4f", (int)$economy_data8/(int)$domestic_data)*100:'0', 'padding'=>120];

        $data[] = ['name'=>'港、澳、台投资企业','number'=>'11','amount'=>$economy_data9,'rate'=>$nature_data1>0?sprintf("%.4f", (int)$economy_data9/(int)$nature_data1)*100:'0', 'padding'=>80];
        $data[] = ['name'=>'外商投资企业','number'=>'12','amount'=>$economy_data10,'rate'=>$nature_data1>0?sprintf("%.4f", (int)$economy_data10/(int)$nature_data1)*100:'0', 'padding'=>80];
        $data[] = ['name'=>'个体经营','number'=>'13','amount'=>$economy_data11,'rate'=>$nature_data1>0?sprintf("%.4f", (int)$economy_data11/(int)$nature_data1)*100:'0', 'padding'=>80];

        $data[] = ['name'=>'事业','number'=>'14','amount'=>$nature_data2,'rate'=>$nature_total>0?sprintf("%.4f", (int)$nature_data2/(int)$nature_total)*100:'0', 'padding'=>50];
        $data[] = ['name'=>'机关','number'=>'15','amount'=>$nature_data3,'rate'=>$nature_total>0?sprintf("%.4f", (int)$nature_data3/(int)$nature_total)*100:'0', 'padding'=>50];
        $data[] = ['name'=>'其他','number'=>'16','amount'=>$nature_data4,'rate'=>$nature_total>0?sprintf("%.4f", (int)$nature_data4/(int)$nature_total)*100:'0', 'padding'=>50];
        $data[] = ['name'=>'合计','number'=>'17','amount'=>$nature_total,'rate'=>$nature_total>0?sprintf("%.4f", (int)$nature_total/(int)$nature_total)*100:'0', 'padding'=>50];
        return [
            'chart_data'=>$nature_arr,
            'table_data'=>$data,
            'nature_total'=>$nature_total,
            'domestic_data'=>$domestic_data,
        ];
    }
    public function getJobAmountByEconomy($where, $job_where, $company_where, $nature_ids)
    {
        return $this->jobsRepository->getJobAmountByEconomy($where, $job_where, $company_where, $nature_ids);
    }
    public function getJobAmountByNature($where, $job_where, $company_where)
    {
        return $this->jobsRepository->getJobAmountByNature($where, $job_where, $company_where);
    }
    public function getJobTypeAmount($start_time, $end_time, $types, $subsite_id)
    {
        $job_where = [
            ['created_at', '<=', $end_time],
            ['created_at', '>=', $start_time],
            ['valid', '=', 1],
            ['display', '=', 1]
        ];
        if (config('aix.companyset.comset.show_set.jobs_display') == 1) {
            $job_where[] = array('audit', '=', 1);
        } else {
            $job_where[] = array('audit', '<>', 3);
        }
        $company_where = [
            ['utype', '=', 1],
            ['user_status', '=', 1]
        ];
        if ($subsite_id !='-1') {
            $company_where[] = ['subsite_id', '=', $subsite_id];
        }
        $rst = $this->jobsRepository->getJobTypeAmount($job_where, $company_where, $types);
        return $rst;
    }

    public function getJobNumsByEducationGroup($start_time, $end_time, $subsite_id)
    {
        //需求人数
        $job_where = [
            ['created_at','<=',$end_time],
            ['created_at','>=',$start_time],
            ['valid','=',1],
            ['display','=',1]
        ];
        if (config('aix.companyset.comset.show_set.jobs_display')==1) {
            $job_where[] = array('audit','=',1);
        } else {
            $job_where[] = array('audit','<>',3);
        }
        $company_where = ['utype'=>1,'user_status'=>1];
        if ($subsite_id != -1) {
            $company_where[] = ['subsite_id','=',$subsite_id];
        }
        $job_group = "education";
        $job_fields = 'IFNULL(sum(amount),0) as num, education';
        $job_order  = 'education asc';
        $rst = $this->getJobNumsByGroup($job_where, $company_where, $job_fields, $job_group, $job_order);
        return $rst;
    }

    //按年龄分组
    public function getJobAmountByAge($filter, $ages, $age_text)
    {
        $age_data = [];
        $age_count = count($ages);
        //获取年龄符合条件的职位招聘人数
        $job_ids = [];
        $job_where = [];
        $company_where = [];
        if (array_has($filter, 'job_where')) {
            $job_where = $filter['job_where'];
        }
        if (array_has($filter, 'company_where')) {
            $company_where = $filter['company_where'];
        }
        $age_where = '';
        if ($ages) {
            foreach ($ages as $k => $v) {
                //组合年龄查询条件
                $min_age = $v['min_age'];
                $max_age = $v['max_age'];
                if ($max_age > 0) {
                    $age_where = "((substring_index(age,'-',1) >= $min_age) AND (substring_index(age,'-',-1) <= $max_age)) AND !(substring_index(age,'-',1) = 0 AND substring_index(age,'-',-1) = 0)";
                } else {
                    $age_where = "substring_index(age,'-',1) >= ".$min_age;
                }
                $rst = $this->jobsRepository->getJobAmountByAge($age_where, $job_where, $company_where, 'id, IFNULL(amount,0) as num')->pluck('num', 'id');
                $age_data[$age_text[$k]] = $rst->sum();
                $job_ids = array_merge($job_ids, $rst->keys()->toArray());
            }
        }
        //获取年龄不限的职位招聘人数
        $age_where = "(substring_index(age,'-',1) = 0 AND substring_index(age,'-',-1) = 0)";
        $unlimit_rst = $this->jobsRepository->getJobAmountByAge($age_where, $job_where, $company_where, 'id, IFNULL(amount,0) as num')->pluck('num', 'id');
        //获取年龄不限的职位招聘人数
        $unlimit_amounts = $unlimit_rst->sum();
        //将年龄不限的招聘人数平均分配该给个年龄段,余数分配给第一个年龄段
        $unlimit_quotient = intval(floor($unlimit_amounts/$age_count));
        $unlimit_remainder = $unlimit_amounts%$age_count;
        if ($age_data) {
            foreach ($age_data as $k => $v) {
                $age_data[$k] = (int)$v + (int)$unlimit_quotient;
                if ($k == key($age_data)) {
                    $age_data[$k] = (int)$age_data[$k] + (int)$unlimit_remainder;
                }
            }
        }
        $job_ids = array_merge($job_ids, $unlimit_rst->keys()->toArray());

        //获取年龄段有跨度的职位信息(剩余职位)
        $map = '';
        if ($job_ids) {
            $map = 'id not in ( '.implode(',', $job_ids).' ) and amount>0';
        }
        $lave_field= "id, IFNULL(amount,0) as num,substring_index(age,'-',1) as min_age,substring_index(age,'-',-1) as max_age";
        $age_job_amount = $this->jobsRepository->getJobAmountByAges($age_data, $age_text, $ages, $map, $job_where, $company_where, $lave_field);
        return $age_job_amount;
    }

    public function getJobNum($where, $company_where)
    {
        $rst = $this->jobsRepository->getJobNum($where, $company_where);
        return $rst;
    }

}