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 @@ +