From 259271a7aa224c1fe743d9d46071a17a9d34a93d Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Fri, 5 Sep 2025 09:43:10 +0800 Subject: [PATCH 1/6] =?UTF-8?q?kpi=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SalesAnnualTargetsController.php | 33 ++++ .../SalesMonthlyTargetsController.php | 33 ++++ .../controller/StatisticsController.php | 148 ++++++++++++++++++ .../targets/logic/SalesAnnualTargetsLogic.php | 17 ++ .../logic/SalesMonthlyTargetsLogic.php | 17 ++ .../service/SalesAnnualTargetsService.php | 79 ++++++++++ .../service/SalesMonthlyTargetsService.php | 72 +++++++++ .../validate/SalesAnnualTargetsValidate.php | 29 ++++ .../validate/SalesMonthlyTargetsValidate.php | 29 ++++ app/common/model/SalesAnnualTargets.php | 49 ++++++ app/common/model/SalesMonthlyTargets.php | 49 ++++++ config/route.php | 25 +++ 12 files changed, 580 insertions(+) create mode 100644 app/admin/targets/controller/SalesAnnualTargetsController.php create mode 100644 app/admin/targets/controller/SalesMonthlyTargetsController.php create mode 100644 app/admin/targets/controller/StatisticsController.php create mode 100644 app/admin/targets/logic/SalesAnnualTargetsLogic.php create mode 100644 app/admin/targets/logic/SalesMonthlyTargetsLogic.php create mode 100644 app/admin/targets/service/SalesAnnualTargetsService.php create mode 100644 app/admin/targets/service/SalesMonthlyTargetsService.php create mode 100644 app/admin/targets/validate/SalesAnnualTargetsValidate.php create mode 100644 app/admin/targets/validate/SalesMonthlyTargetsValidate.php create mode 100644 app/common/model/SalesAnnualTargets.php create mode 100644 app/common/model/SalesMonthlyTargets.php diff --git a/app/admin/targets/controller/SalesAnnualTargetsController.php b/app/admin/targets/controller/SalesAnnualTargetsController.php new file mode 100644 index 0000000..79eb528 --- /dev/null +++ b/app/admin/targets/controller/SalesAnnualTargetsController.php @@ -0,0 +1,33 @@ +service = new SalesAnnualTargetsService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + protected function indexFormat($data) + { + if (isset($data['created_at'])) + $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + if (isset($data['updated_at'])) + $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + return $data; + } +} \ No newline at end of file diff --git a/app/admin/targets/controller/SalesMonthlyTargetsController.php b/app/admin/targets/controller/SalesMonthlyTargetsController.php new file mode 100644 index 0000000..3b3ad13 --- /dev/null +++ b/app/admin/targets/controller/SalesMonthlyTargetsController.php @@ -0,0 +1,33 @@ +service = new SalesMonthlyTargetsService(); + } + + /** + * 列表页数据格式化 + * + * @param array $data + * @return array + */ + protected function indexFormat($data) + { + if (isset($data['created_at'])) + $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); + if (isset($data['updated_at'])) + $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + return $data; + } +} \ No newline at end of file diff --git a/app/admin/targets/controller/StatisticsController.php b/app/admin/targets/controller/StatisticsController.php new file mode 100644 index 0000000..d032e2e --- /dev/null +++ b/app/admin/targets/controller/StatisticsController.php @@ -0,0 +1,148 @@ +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('month', 'asc') + ->get(); + $result = []; + foreach ($ranking as $key => $value) { + $result[$value['user_id']]['month'][] = $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'); + } + foreach ($result as $key => $value) { + $result[$key]['user_name'] = User::where(['id' => $key])->value('name'); + } + 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; + } + return $this->success($achieved); + } + +} \ No newline at end of file diff --git a/app/admin/targets/logic/SalesAnnualTargetsLogic.php b/app/admin/targets/logic/SalesAnnualTargetsLogic.php new file mode 100644 index 0000000..e184e42 --- /dev/null +++ b/app/admin/targets/logic/SalesAnnualTargetsLogic.php @@ -0,0 +1,17 @@ +validator; + } + + /** + * 构建查询条件 + */ + protected function buildQueryConfig(Request $request, string $scene = 'index'): array + { + $p = $request->all(); + + $config = []; + $config['model'] = $this->modelClass; + switch ($scene) { + case 'index': + if (isset($p['year']) && $p['year']) { + $config['where']['year'] = $p['year']; + } + $config['order']['id'] = 'desc'; + break; + case 'show': + case 'update': + case 'destroy': + $config['where']['id'] = $p['id']; + break; + case 'store': + break; + } + + return $config; + } + // ====== 前置处理 ====== + /** + * 添加前置处理 + */ + public function beforeServiceStore($data, Request $request) + { + if(isset($data['user_id']) && $data['user_id'] && empty($data['corp_id'])){ + $data['corp_id'] = User::where('id', $data['user_id'])->value('corp_id'); + } + if(isset($data['corp_id']) && empty($data['corp_id'])){ + unset($data['corp_id']); + } + if(isset($data['user_id']) && empty($data['user_id'])){ + unset($data['user_id']); + } + + return $data; + } +} \ No newline at end of file diff --git a/app/admin/targets/service/SalesMonthlyTargetsService.php b/app/admin/targets/service/SalesMonthlyTargetsService.php new file mode 100644 index 0000000..12bb203 --- /dev/null +++ b/app/admin/targets/service/SalesMonthlyTargetsService.php @@ -0,0 +1,72 @@ +validator; + } + + /** + * 构建查询条件 + */ + protected function buildQueryConfig(Request $request, string $scene = 'index'): array + { + $p = $request->all(); + + $config = []; + $config['model'] = $this->modelClass; + switch ($scene) { + case 'index': + if (isset($p['year']) && $p['year']) { + $config['where']['year'] = $p['year']; + } + $config['order']['id'] = 'desc'; + break; + case 'show': + case 'update': + case 'destroy': + $config['where']['id'] = $p['id']; + break; + case 'store': + break; + } + + return $config; + } + + // ====== 前置处理 ====== + /** + * 添加前置处理 + */ + public function beforeServiceStore($data, Request $request) + { + $data['corp_id'] = User::where('id', $data['user_id'])->value('corp_id'); + + return $data; + } +} \ No newline at end of file diff --git a/app/admin/targets/validate/SalesAnnualTargetsValidate.php b/app/admin/targets/validate/SalesAnnualTargetsValidate.php new file mode 100644 index 0000000..4a32545 --- /dev/null +++ b/app/admin/targets/validate/SalesAnnualTargetsValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/admin/targets/validate/SalesMonthlyTargetsValidate.php b/app/admin/targets/validate/SalesMonthlyTargetsValidate.php new file mode 100644 index 0000000..955adbb --- /dev/null +++ b/app/admin/targets/validate/SalesMonthlyTargetsValidate.php @@ -0,0 +1,29 @@ + [ + + ], + + 'update' => [ + + ] + ]; +} \ No newline at end of file diff --git a/app/common/model/SalesAnnualTargets.php b/app/common/model/SalesAnnualTargets.php new file mode 100644 index 0000000..387ceaf --- /dev/null +++ b/app/common/model/SalesAnnualTargets.php @@ -0,0 +1,49 @@ + Date: Tue, 16 Sep 2025 18:09:15 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=85=AC=E5=8F=B8=E4=B8=8E=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../targets/controller/SalesAnnualTargetsController.php | 8 ++++++++ .../targets/controller/SalesMonthlyTargetsController.php | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/app/admin/targets/controller/SalesAnnualTargetsController.php b/app/admin/targets/controller/SalesAnnualTargetsController.php index 79eb528..15d6652 100644 --- a/app/admin/targets/controller/SalesAnnualTargetsController.php +++ b/app/admin/targets/controller/SalesAnnualTargetsController.php @@ -2,6 +2,8 @@ namespace app\admin\targets\controller; use app\common\controller\BaseController; +use app\common\model\Corp; +use app\common\model\User; use app\common\traits\crud\CrudControllerTrait; use app\admin\targets\service\SalesAnnualTargetsService; @@ -28,6 +30,12 @@ class SalesAnnualTargetsController extends BaseController $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); if (isset($data['updated_at'])) $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + if (isset($data['corp_id'])){ + $data['corp_name'] = Corp::where('id', $data['corp_id'])->value('name'); + $data['corp_name'] = $data['corp_name']??'合塑集团'; + } + if (isset($data['user_id'])) + $data['user_name'] = User::where('id', $data['user_id'])->value('name'); return $data; } } \ No newline at end of file diff --git a/app/admin/targets/controller/SalesMonthlyTargetsController.php b/app/admin/targets/controller/SalesMonthlyTargetsController.php index 3b3ad13..461d503 100644 --- a/app/admin/targets/controller/SalesMonthlyTargetsController.php +++ b/app/admin/targets/controller/SalesMonthlyTargetsController.php @@ -2,6 +2,8 @@ namespace app\admin\targets\controller; use app\common\controller\BaseController; +use app\common\model\Corp; +use app\common\model\User; use app\common\traits\crud\CrudControllerTrait; use app\admin\targets\service\SalesMonthlyTargetsService; @@ -28,6 +30,11 @@ class SalesMonthlyTargetsController extends BaseController $data['created_at'] = date('Y-m-d H:i:s', $data['created_at']); if (isset($data['updated_at'])) $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); + if (isset($data['corp_id'])) + $data['corp_name'] = Corp::where('id', $data['corp_id'])->value('name'); + if (isset($data['user_id'])) + $data['user_name'] = User::where('id', $data['user_id'])->value('name'); + return $data; } } \ No newline at end of file From 0adbfa30f71175a9ad051c060578d1ae278fe8dd Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Wed, 17 Sep 2025 17:29:31 +0800 Subject: [PATCH 3/6] =?UTF-8?q?kpi=E7=BB=9F=E8=AE=A1=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StatisticsController.php | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/app/admin/targets/controller/StatisticsController.php b/app/admin/targets/controller/StatisticsController.php index d032e2e..14745c0 100644 --- a/app/admin/targets/controller/StatisticsController.php +++ b/app/admin/targets/controller/StatisticsController.php @@ -74,16 +74,21 @@ class StatisticsController extends BaseController $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; - $ranking[$key]['corp_name'] = Corp::where(['id' => $value['corp_id']])->value('name'); - $ranking[$key]['user_name'] = User::where(['id' => $value['user_id']])->value('name'); + $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) { - $result[$key]['user_name'] = User::where(['id' => $key])->value('name'); + for($i = 1; $i <= 12; $i++){ + $result[$key]['month'][$i] = $result[$key]['month'][$i]??0; + } + $result[$key]['corp_name'] = Corp::where(['id' => $value['corp_id']])->value('name'); + $result[$key]['user_name'] = User::where(['id' => $value['user_id']])->value('name'); } return $this->success($result); } @@ -115,7 +120,7 @@ class StatisticsController extends BaseController array_multisort($sort, SORT_DESC, SORT_NUMERIC, $achieved); foreach ($achieved as $key => $value) { - $achieved[$key]['progressh'] = $value['progressh'].'%'; + $achieved[$key]['progressh'] = $value['progressh']; } return $this->success($achieved); } @@ -140,7 +145,8 @@ class StatisticsController extends BaseController $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]['annual_target'] = empty($target) ? 0 : $target; + $achieved[$key]['total'] = [intval($value['achieved']), $achieved[$key]['annual_target']]; } return $this->success($achieved); } From 1ff4142f21d19a9ea5be10f3c4d32cec7e82cdb6 Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Wed, 17 Sep 2025 17:45:03 +0800 Subject: [PATCH 4/6] kpi --- app/admin/targets/controller/StatisticsController.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/admin/targets/controller/StatisticsController.php b/app/admin/targets/controller/StatisticsController.php index 14745c0..950f247 100644 --- a/app/admin/targets/controller/StatisticsController.php +++ b/app/admin/targets/controller/StatisticsController.php @@ -87,9 +87,11 @@ class StatisticsController extends BaseController 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); } From 9c32ae51dbc13ce47389e1d6fd22d7c0d3ef9d44 Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Thu, 18 Sep 2025 09:50:50 +0800 Subject: [PATCH 5/6] kpi --- .../targets/controller/SalesAnnualTargetsController.php | 6 +++++- app/admin/targets/service/SalesMonthlyTargetsService.php | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/admin/targets/controller/SalesAnnualTargetsController.php b/app/admin/targets/controller/SalesAnnualTargetsController.php index 15d6652..6a51d08 100644 --- a/app/admin/targets/controller/SalesAnnualTargetsController.php +++ b/app/admin/targets/controller/SalesAnnualTargetsController.php @@ -32,10 +32,14 @@ class SalesAnnualTargetsController extends BaseController $data['updated_at'] = date('Y-m-d H:i:s', $data['updated_at']); if (isset($data['corp_id'])){ $data['corp_name'] = Corp::where('id', $data['corp_id'])->value('name'); - $data['corp_name'] = $data['corp_name']??'合塑集团'; +// $data['corp_name'] = $data['corp_name']??'合塑集团'; } if (isset($data['user_id'])) $data['user_name'] = User::where('id', $data['user_id'])->value('name'); + + if (empty($data['corp_id']) || empty($data['user_id'])){ + $data['user_name'] = '合塑集团'; + } return $data; } } \ No newline at end of file diff --git a/app/admin/targets/service/SalesMonthlyTargetsService.php b/app/admin/targets/service/SalesMonthlyTargetsService.php index 12bb203..a093fc5 100644 --- a/app/admin/targets/service/SalesMonthlyTargetsService.php +++ b/app/admin/targets/service/SalesMonthlyTargetsService.php @@ -45,6 +45,9 @@ class SalesMonthlyTargetsService if (isset($p['year']) && $p['year']) { $config['where']['year'] = $p['year']; } + $config['order']['year'] = 'desc'; + $config['order']['user_id'] = 'desc'; + $config['order']['month'] = 'asc'; $config['order']['id'] = 'desc'; break; case 'show': From 9307450009ee1ebe8e7f8176d5b4db0b00909cd9 Mon Sep 17 00:00:00 2001 From: "WIN-C27C5MSVTPO\\16961" <1696136552@qq.com> Date: Thu, 18 Sep 2025 10:04:54 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=B9=B4=E5=BA=A6=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E7=A6=81=E6=AD=A2=E9=87=8D=E5=A4=8D=E5=BD=95=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../targets/service/SalesAnnualTargetsService.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/admin/targets/service/SalesAnnualTargetsService.php b/app/admin/targets/service/SalesAnnualTargetsService.php index f8547aa..67ec09b 100644 --- a/app/admin/targets/service/SalesAnnualTargetsService.php +++ b/app/admin/targets/service/SalesAnnualTargetsService.php @@ -6,6 +6,7 @@ use app\admin\targets\validate\SalesAnnualTargetsValidate; use app\common\model\User; use app\common\traits\crud\CrudServiceTrait; use app\common\model\SalesAnnualTargets; +use support\exception\BusinessException; use support\Request; class SalesAnnualTargetsService @@ -73,6 +74,15 @@ class SalesAnnualTargetsService if(isset($data['user_id']) && empty($data['user_id'])){ unset($data['user_id']); } + if(isset($data['user_id']) && isset($data['user_id'])){ + $annualTargets = SalesAnnualTargets::where('year',$data['year'])->where('corp_id',$data['corp_id'])->where('user_id', $data['user_id'])->first(); + }else{ + $annualTargets = SalesAnnualTargets::where('year',$data['year'])->whereNull('corp_id')->whereNull('user_id')->first(); + } + + if($annualTargets){ + throw new BusinessException('目标重复添加'); + } return $data; }