diff --git a/app/admin/targets/controller/SalesAnnualTargetsController.php b/app/admin/targets/controller/SalesAnnualTargetsController.php new file mode 100644 index 0000000..6a51d08 --- /dev/null +++ b/app/admin/targets/controller/SalesAnnualTargetsController.php @@ -0,0 +1,45 @@ +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']); + 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'); + + 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/controller/SalesMonthlyTargetsController.php b/app/admin/targets/controller/SalesMonthlyTargetsController.php new file mode 100644 index 0000000..461d503 --- /dev/null +++ b/app/admin/targets/controller/SalesMonthlyTargetsController.php @@ -0,0 +1,40 @@ +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']); + 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 diff --git a/app/admin/targets/controller/StatisticsController.php b/app/admin/targets/controller/StatisticsController.php new file mode 100644 index 0000000..950f247 --- /dev/null +++ b/app/admin/targets/controller/StatisticsController.php @@ -0,0 +1,156 @@ +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); + } + +} \ 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']); + } + 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; + } +} \ 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..a093fc5 --- /dev/null +++ b/app/admin/targets/service/SalesMonthlyTargetsService.php @@ -0,0 +1,75 @@ +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']['year'] = 'desc'; + $config['order']['user_id'] = 'desc'; + $config['order']['month'] = 'asc'; + $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 @@ +