Files
fdesk/app/admin/targets/controller/StatisticsController.php
T
2025-09-17 17:45:03 +08:00

156 lines
6.2 KiB
PHP

<?php
namespace app\admin\targets\controller;
use app\admin\targets\service\SalesAnnualTargetsService;
use app\common\controller\BaseController;
use app\common\model\Corp;
use app\common\model\SalesAnnualTargets;
use app\common\model\SalesMonthlyTargets;
use app\common\model\User;
use app\common\traits\crud\CrudControllerTrait;
use support\Request;
use support\Db;
class StatisticsController extends BaseController
{
use CrudControllerTrait;
protected $service;
public function __construct()
{
$this->service = new SalesAnnualTargetsService();
}
public function total(Request $request)
{
$param = $request->all();
if (empty($param['year'])) {
return $this->error('year不能为空');
}
$data = SalesAnnualTargets::select('annual_target','corp_id')
->whereNull('user_id')
->where('year',$param['year'])
->orderBy('corp_id')
->get()
->toArray();
foreach ($data as &$value) {
$where = [];
$where[] = ['year', '=', $param['year']];
if (!empty($value['corp_id'])) {
$where[] = ['corp_id', '=', $value['corp_id']];
}
$value['achieved'] = SalesMonthlyTargets::where($where)->sum('achieved');
$value['progress'] = empty($value['annual_target'])?'100%':number_format(($value['achieved']/$value['annual_target']*100),2) . '%';
$value['corp_name'] = empty($value['corp_id'])?'集团':Corp::where(['id' => $value['corp_id']])->value('name');
}
return $this->success($data);
}
public function ranking(Request $request){
$param = $request->all();
$year = empty($param['year']) ? date('Y') : $param['year'];
$where = [];
$where[] = ['year', '=', $year];
$ranking = SalesMonthlyTargets::select('corp_id', 'user_id', Db::raw('SUM(achieved) AS achieved'))
->where($where)
->groupBy('corp_id', 'user_id')
->orderBy('achieved', 'desc')
->get();
foreach ($ranking as $key => $value) {
$ranking[$key]['corp_name'] = Corp::where(['id' => $value['corp_id']])->value('name');
$ranking[$key]['user_name'] = User::where(['id' => $value['user_id']])->value('name');
}
return $this->success($ranking);
}
public function achievedUserByMonth(Request $request){
$param = $request->all();
$year = empty($param['year']) ? date('Y') : $param['year'];
$where = [];
$where[] = ['year', '=', $year];
$ranking = SalesMonthlyTargets::select('corp_id', 'user_id', 'month', Db::raw('SUM(achieved) AS achieved'))
->where($where)
->groupBy('corp_id', 'user_id', 'month')
->orderBy('user_id', 'asc')
->orderBy('month', 'asc')
->get();
$result = [];
foreach ($ranking as $key => $value) {
$result[$value['user_id']]['month'][$value['month']] = $value['achieved'];
$result[$value['user_id']]['user_id'] = $value['user_id'];
$result[$value['user_id']]['corp_id'] = $value['corp_id'];
}
foreach ($result as $key => $value) {
for($i = 1; $i <= 12; $i++){
$result[$key]['month'][$i] = $result[$key]['month'][$i]??0;
}
$result[$key]['month'] = array_values($result[$key]['month']);
$result[$key]['corp_name'] = Corp::where(['id' => $value['corp_id']])->value('name');
$result[$key]['user_name'] = User::where(['id' => $value['user_id']])->value('name');
}
$result = array_values($result);
return $this->success($result);
}
/**
* 个人年度目标完成度(百分比)
* @param Request $request
* @return \support\Response
*/
public function userProgressh(Request $request){
$param = $request->all();
$year = empty($param['year']) ? date('Y') : $param['year'];
$where = [];
$where[] = ['year', '=', $year];
$achieved = SalesMonthlyTargets::select('corp_id', 'user_id', Db::raw('SUM(achieved) AS achieved'))
->where($where)
->groupBy('corp_id', 'user_id')
->orderBy('achieved', 'desc')
->get()
->toArray();
$sort = [];
foreach ($achieved as $key => $value) {
$achieved[$key]['corp_name'] = Corp::where(['id' => $value['corp_id']])->value('name');
$achieved[$key]['user_name'] = User::where(['id' => $value['user_id']])->value('name');
$target = SalesAnnualTargets::where(['user_id' => $value['user_id']])->value('annual_target');
$achieved[$key]['progressh'] = empty($target) ? 0 : round(($value['achieved'] / $target) * 100, 2);
$sort[] = $achieved[$key]['progressh'];
}
array_multisort($sort, SORT_DESC, SORT_NUMERIC, $achieved);
foreach ($achieved as $key => $value) {
$achieved[$key]['progressh'] = $value['progressh'];
}
return $this->success($achieved);
}
/**
* 个人累积完成数量(辆)
* @param Request $request
* @return \support\Response
*/
public function userAchieved(Request $request){
$param = $request->all();
$year = empty($param['year']) ? date('Y') : $param['year'];
$where = [];
$where[] = ['year', '=', $year];
$achieved = SalesMonthlyTargets::select('corp_id', 'user_id', Db::raw('SUM(achieved) AS achieved'))
->where($where)
->groupBy('corp_id', 'user_id')
->orderBy('achieved', 'desc')
->get()
->toArray();
foreach ($achieved as $key => $value) {
$achieved[$key]['corp_name'] = Corp::where(['id' => $value['corp_id']])->value('name');
$achieved[$key]['user_name'] = User::where(['id' => $value['user_id']])->value('name');
$target = SalesAnnualTargets::where(['user_id' => $value['user_id']])->value('annual_target');
$achieved[$key]['annual_target'] = empty($target) ? 0 : $target;
$achieved[$key]['total'] = [intval($value['achieved']), $achieved[$key]['annual_target']];
}
return $this->success($achieved);
}
}