| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 | <?phpnamespace 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;    }}
 |