From 872bcd397b5d8b81e92d1d5d07835336da616350 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 09:58:06 +0800 Subject: [PATCH 01/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Mobile/VisitController.php | 98 +++++++++---------- app/Models/VisitAudit.php | 35 ++++++- app/Notifications/CancelEmailNotify.php | 56 +++++++++++ 3 files changed, 138 insertions(+), 51 deletions(-) create mode 100644 app/Notifications/CancelEmailNotify.php diff --git a/app/Http/Controllers/Mobile/VisitController.php b/app/Http/Controllers/Mobile/VisitController.php index 1437545..d3d75fe 100644 --- a/app/Http/Controllers/Mobile/VisitController.php +++ b/app/Http/Controllers/Mobile/VisitController.php @@ -82,65 +82,63 @@ class VisitController extends CommonController try { if (isset($all['id'])) { $model = Visit::find($all['id']); + $model->fill($all); + $model->save(); + VisitLog::add('', $this->getUser(), $model->id, isset($all['id']) ? '更新拜访记录' : '新增拜访记录'); + DB::commit(); + // 当状态为取消(status=5)时,给被访人发送取消邮件 + if (isset($all['audit_status']) && $all['audit_status'] == Visit::AUDIT_STATUS_CANCELLED) { + VisitAudit::emailCancelNotify($model); + } } else { + // 新增拜访 $model = new Visit(); $all['user_id'] = $this->getUserId(); $all['code'] = randStr(6, true); - } - $model->fill($all); - $model->save(); - // 创建时候审核流程写入 - // 被访问做第一级审核 - VisitAudit::create([ - 'visit_id' => $model->id, - 'audit_admin_id' => $all['accompany_id'], - 'status' => 0, - 'level' => 0 - ]); - $area = VisitArea::find($all['visit_area_id']); - if ($area->audit_admin && !isset($all['id'])) { - // 其他按设置审核 - $audit_admin = collect($area->audit_admin)->sortBy('level'); - foreach ($audit_admin as $key => $item) { - if (empty($item['admin_id'])) { - // 上级审核 - $admin = Admin::find($all['accept_admin_id']); - if (empty($admin->department_id)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在']); + $model->fill($all); + $model->save(); + // 创建时候审核流程写入 + // 被访问做第一级审核 + VisitAudit::create([ + 'visit_id' => $model->id, + 'audit_admin_id' => $all['accompany_id'], + 'status' => 0, + 'level' => 0 + ]); + $area = VisitArea::find($all['visit_area_id']); + if ($area->audit_admin && !isset($all['id'])) { + // 其他按设置审核 + $audit_admin = collect($area->audit_admin)->sortBy('level'); + foreach ($audit_admin as $key => $item) { + if (empty($item['admin_id'])) { + // 上级审核 + $admin = Admin::find($all['accept_admin_id']); + if (empty($admin->department_id)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在']); + } + $department = Department::find($admin->department_id); + if (empty($department->manager_id)) { + return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在负责人']); + } + $item['admin_id'] = $department->manager_id; } - $department = Department::find($admin->department_id); - if (empty($department->manager_id)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '接待人部门不存在负责人']); + // 判断不能重复 + if ($item['admin_id'] == $all['accept_admin_id']) { + continue; } - $item['admin_id'] = $department->manager_id; + VisitAudit::create([ + 'visit_id' => $model->id, + 'audit_admin_id' => $item['admin_id'], + 'status' => 0, + 'level' => $item['level'] + 1 + ]); } - // 判断不能重复 - if ($item['admin_id'] == $all['accept_admin_id']) { - continue; - } - VisitAudit::create([ - 'visit_id' => $model->id, - 'audit_admin_id' => $item['admin_id'], - 'status' => 0, - 'level' => $item['level'] + 1 - ]); } + VisitLog::add('', $this->getUser(), $model->id, isset($all['id']) ? '更新拜访记录' : '新增拜访记录'); + DB::commit(); + // 邮件通知第一个审核人 + VisitAudit::emailNextAudit($model, -1); } - VisitLog::add('', $this->getUser(), $model->id, isset($all['id']) ? '更新拜访记录' : '新增拜访记录'); - - // 被访人信息 - $acceptAdmin = Admin::find($all['accept_admin_id']); - // 邮件通知被访人 - $visitData = [ - 'date' => $all['date'], - 'name' => $all['name'], - 'mobile' => $all['mobile'], - 'reason' => $all['reason'] ?? '' - ]; - $acceptAdmin->notify(new VisitEmailNotify($visitData)); - // 邮件通知第一个审核人 - VisitAudit::emailNextAudit($model, -1); - DB::commit(); return $this->success('更新成功'); } catch (\Exception $exception) { DB::rollBack(); diff --git a/app/Models/VisitAudit.php b/app/Models/VisitAudit.php index b00e1a7..371bb45 100644 --- a/app/Models/VisitAudit.php +++ b/app/Models/VisitAudit.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Notifications\AuditEmailNotify; +use App\Notifications\CancelEmailNotify; class VisitAudit extends SoftDeletesModel { @@ -19,7 +20,7 @@ class VisitAudit extends SoftDeletesModel } /** - * 邮件通知下一个审核人 + * 邮件通知下一个审核人审核 */ public static function emailNextAudit($visit, $nowVisitAuditLevel = -1) { @@ -71,4 +72,36 @@ class VisitAudit extends SoftDeletesModel return true; } + /** + * 邮件通知被访人拜访已取消 + */ + public static function emailCancelNotify($visit) + { + // 获取被访人(第一个审核人,level最小的) + $admin = Admin::where('id', function ($query) use ($visit) { + $query->select('audit_admin_id') + ->from('visit_audits') + ->where('visit_id', $visit->id) + ->orderBy('level', 'asc') + ->limit(1); + })->first(); + + if (empty($admin)) { + return false; + } + + // 准备邮件数据 + $visitData = [ + 'date' => $visit->date, + 'name' => $visit->name, + 'mobile' => $visit->mobile, + 'reason' => $visit->reason ?? '' + ]; + + // 发送取消邮件通知 + $admin->notify(new CancelEmailNotify($visitData)); + + return true; + } + } diff --git a/app/Notifications/CancelEmailNotify.php b/app/Notifications/CancelEmailNotify.php new file mode 100644 index 0000000..03cb2b2 --- /dev/null +++ b/app/Notifications/CancelEmailNotify.php @@ -0,0 +1,56 @@ +visitData = $visitData; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + $visitData = $this->visitData; + + return (new MailMessage) + ->subject('拜访预约取消通知 - ' . $visitData['name']) + ->greeting('您好 ' . $notifiable->name . ',') + ->line('访客 ' . $visitData['name'] . ' 原预约于 ' . $visitData['date'] . ' 的拜访已取消。') + ->line('访客联系电话:' . $visitData['mobile']) + ->line('拜访事由:' . ($visitData['reason'] ?? '无')) + ->line('如有疑问,请联系访客确认。'); + } +} + From 16c3975515e7bf2f33c104e86a418d75a20260f4 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 10:16:26 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/VisitAuditController.php | 21 ++++++++++--------- .../Controllers/Mobile/VisitController.php | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/Http/Controllers/Admin/VisitAuditController.php b/app/Http/Controllers/Admin/VisitAuditController.php index 2676d77..6c17ab4 100644 --- a/app/Http/Controllers/Admin/VisitAuditController.php +++ b/app/Http/Controllers/Admin/VisitAuditController.php @@ -164,16 +164,17 @@ class VisitAuditController extends CommonController $auditResult = '通过'; Visit::where('id', $all['visit_id'])->update(['audit_status' => 1]); // 发邮件通知接待人审核通过 - if (!empty($acceptAdmin->email)) { - $visitData = [ - 'date' => $visit->date, - 'name' => $visit->name, - 'visitor_name' => $visit->name, - 'accept_admin_name' => $acceptAdmin->name, - 'company_name' => $visit->company_name ?? '' - ]; - $acceptAdmin->notify(new AuditResultEmailNotify($visitData, '通过')); - } + // todo::这里改成拜访人发短信通知 +// if (!empty($acceptAdmin->email)) { +// $visitData = [ +// 'date' => $visit->date, +// 'name' => $visit->name, +// 'visitor_name' => $visit->name, +// 'accept_admin_name' => $acceptAdmin->name, +// 'company_name' => $visit->company_name ?? '' +// ]; +// $acceptAdmin->notify(new AuditResultEmailNotify($visitData, '通过')); +// } } if ($auditResult) { // 发通知订阅消息 diff --git a/app/Http/Controllers/Mobile/VisitController.php b/app/Http/Controllers/Mobile/VisitController.php index d3d75fe..b3d4dd0 100644 --- a/app/Http/Controllers/Mobile/VisitController.php +++ b/app/Http/Controllers/Mobile/VisitController.php @@ -107,7 +107,7 @@ class VisitController extends CommonController ]); $area = VisitArea::find($all['visit_area_id']); if ($area->audit_admin && !isset($all['id'])) { - // 其他按设置审核 + // 其他按设置审核,level从0开始的审核人 $audit_admin = collect($area->audit_admin)->sortBy('level'); foreach ($audit_admin as $key => $item) { if (empty($item['admin_id'])) { From bbc091a5a204be99813aaf2ba34084a7987fbb95 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 11:04:43 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2025_11_26_104139_alert_visits_table.php | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 database/migrations/2025_11_26_104139_alert_visits_table.php diff --git a/database/migrations/2025_11_26_104139_alert_visits_table.php b/database/migrations/2025_11_26_104139_alert_visits_table.php new file mode 100644 index 0000000..e929e0b --- /dev/null +++ b/database/migrations/2025_11_26_104139_alert_visits_table.php @@ -0,0 +1,34 @@ +string('accompany_person_no')->nullable()->comment('随访人员人牌'); + // 时间 + $table->time('time')->nullable()->comment('拜访时间'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('visits', function (Blueprint $table) { + // + }); + } +}; From 03aded6aaf2ae52d453c99bc60ca62c451e18e7c Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 11:06:55 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database/migrations/2025_11_26_104139_alert_visits_table.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/database/migrations/2025_11_26_104139_alert_visits_table.php b/database/migrations/2025_11_26_104139_alert_visits_table.php index e929e0b..031d2d5 100644 --- a/database/migrations/2025_11_26_104139_alert_visits_table.php +++ b/database/migrations/2025_11_26_104139_alert_visits_table.php @@ -13,8 +13,6 @@ return new class extends Migration { public function up() { Schema::table('visits', function (Blueprint $table) { - // 随访人员人牌 - $table->string('accompany_person_no')->nullable()->comment('随访人员人牌'); // 时间 $table->time('time')->nullable()->comment('拜访时间'); }); From 1912c7fb638de34487f44a0dc64d6c32d8abdcdd Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 11:14:48 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/ResetLongTermVisitsCommand.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/ResetLongTermVisitsCommand.php b/app/Console/Commands/ResetLongTermVisitsCommand.php index 9d08c3e..222a2af 100644 --- a/app/Console/Commands/ResetLongTermVisitsCommand.php +++ b/app/Console/Commands/ResetLongTermVisitsCommand.php @@ -52,10 +52,16 @@ class ResetLongTermVisitsCommand extends Command foreach ($longTermVisits as $visit) { // 重置审核状态为已通过(1) $visit->audit_status = 1; + // 数组follw_people中的follw_people数据置空置 + $list = []; + foreach ($visit['follw_people'] as $follwPerson) { + unset($follwPerson['follw_people_person_no']); + $list[] = $follwPerson; + } + $visit['follw_people'] = $list; $visit->save(); - // 记录重置日志 - // VisitLog::log($visit->id, VisitLog::TYPE_UPDATE, "系统自动重置:长期拜访预约审核状态已重置为待审核"); + // VisitLog::log($visit->id, VisitLog::TYPE_UPDATE, "系统自动重置:长期拜访预约审核状态已重置为待审核"); $resetCount++; $this->info("已重置访客:{$visit->name}({$visit->code})"); From f2bf487d96cfa9c7b0703a88f391c4fc235d4225 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 11:16:12 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Console/Commands/ResetLongTermVisitsCommand.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/Console/Commands/ResetLongTermVisitsCommand.php b/app/Console/Commands/ResetLongTermVisitsCommand.php index 222a2af..a481c72 100644 --- a/app/Console/Commands/ResetLongTermVisitsCommand.php +++ b/app/Console/Commands/ResetLongTermVisitsCommand.php @@ -52,13 +52,14 @@ class ResetLongTermVisitsCommand extends Command foreach ($longTermVisits as $visit) { // 重置审核状态为已通过(1) $visit->audit_status = 1; + $visit->person_no = null; // 数组follw_people中的follw_people数据置空置 $list = []; - foreach ($visit['follw_people'] as $follwPerson) { + foreach ($visit->follw_people as $follwPerson) { unset($follwPerson['follw_people_person_no']); $list[] = $follwPerson; } - $visit['follw_people'] = $list; + $visit->follw_people = $list; $visit->save(); // 记录重置日志 // VisitLog::log($visit->id, VisitLog::TYPE_UPDATE, "系统自动重置:长期拜访预约审核状态已重置为待审核"); From 01db45dfbfc4535641a28fa554b2c8f9273c9595 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 11:36:29 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Admin/ChartController.php | 22 ++++++++++++++++--- app/Models/Visit.php | 10 ++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/ChartController.php b/app/Http/Controllers/Admin/ChartController.php index 65d9a82..a4951a5 100644 --- a/app/Http/Controllers/Admin/ChartController.php +++ b/app/Http/Controllers/Admin/ChartController.php @@ -51,14 +51,22 @@ class ChartController extends CommonController $list = [ 'common_visit' => [ + // 总人数 'total' => $buildQuery(1)->count(), + // 总入场人数 'enter_visit' => $buildQuery(1)->whereNotNull('accept_admin_sign')->count(), - 'today_total' => Visit::where('type', 1)->where('date', date('Y-m-d'))->count(), - 'today_enter_visit' => Visit::where('type', 1)->where('date', date('Y-m-d'))->whereNotNull('accept_admin_sign')->count(), // 离厂统计 'leave_total' => $buildQuery(1)->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), + // 总随访人数 + 'follow_total' => $buildQuery(1)->get()->sum('follw_people_total'), + // 今日总人数 + 'today_total' => $buildQuery(1)->where('date', date('Y-m-d'))->count(), + // 今日入场人数 + 'today_enter_visit' => $buildQuery(1)->where('date', date('Y-m-d'))->whereNotNull('accept_admin_sign')->count(), // 今日离厂 - 'today_leave_total' => Visit::where('type', 1)->where('date', date('Y-m-d'))->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), + 'today_leave_total' => $buildQuery(1)->where('date', date('Y-m-d'))->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), + // 今日随访人数 + 'today_follow_total' => $buildQuery(1)->where('date', date('Y-m-d'))->get()->sum('follw_people_total'), ], 'work_visit' => [ 'total' => $buildQuery(2)->count(), @@ -69,6 +77,10 @@ class ChartController extends CommonController 'leave_total' => $buildQuery(2)->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), // 今日离厂 'today_leave_total' => Visit::where('type', 2)->where('date', date('Y-m-d'))->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), + // 总随访人数 + 'follow_total' => $buildQuery(2)->get()->sum('follw_people_total'), + // 今日随访人数 + 'today_follow_total' => $buildQuery(2)->where('date', date('Y-m-d'))->get()->sum('follw_people_total'), ], 'car_visit' => [ 'total' => $buildQuery(3)->count(), @@ -79,6 +91,10 @@ class ChartController extends CommonController 'leave_total' => $buildQuery(3)->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), // 今日离厂 'today_leave_total' => Visit::where('type', 3)->where('date', date('Y-m-d'))->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), + // 总随访人数 + 'follow_total' => $buildQuery(3)->get()->sum('follw_people_total'), + // 今日随访人数 + 'today_follow_total' => $buildQuery(3)->where('date', date('Y-m-d'))->get()->sum('follw_people_total'), ], ]; diff --git a/app/Models/Visit.php b/app/Models/Visit.php index 48c2be2..ba3505a 100644 --- a/app/Models/Visit.php +++ b/app/Models/Visit.php @@ -32,7 +32,7 @@ class Visit extends SoftDeletesModel protected $guarded = ['id']; - protected $appends = ['type_text', 'audit_status_text', 'file_detail', 'vehicle_images_detail']; + protected $appends = ['type_text', 'audit_status_text', 'file_detail', 'vehicle_images_detail', 'follw_people_total']; protected $casts = [ 'follw_people' => 'json', @@ -51,6 +51,14 @@ class Visit extends SoftDeletesModel return Upload::whereIn('id', $this->file)->get(); } + /** + * 获取随访人数 + */ + public function getFollwPeopleTotalAttribute() + { + return $this->follw_people ? count($this->follw_people) : 0; + } + public function getVehicleImagesDetailAttribute() { if (empty($this->vehicle_images)) { From b54b934499db5e90ab87c6d16e800d4eb050d19b Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 13:20:03 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Admin/ChartController.php | 74 ++++++++----------- app/Models/Visit.php | 34 +++++++++ 2 files changed, 65 insertions(+), 43 deletions(-) diff --git a/app/Http/Controllers/Admin/ChartController.php b/app/Http/Controllers/Admin/ChartController.php index a4951a5..3135a71 100644 --- a/app/Http/Controllers/Admin/ChartController.php +++ b/app/Http/Controllers/Admin/ChartController.php @@ -36,65 +36,53 @@ class ChartController extends CommonController $startDate = $all['start_date'] ?? null; $endDate = $all['end_date'] ?? null; - // 构建查询条件 - $buildQuery = function ($type) use ($startDate, $endDate) { - $query = Visit::where('type', $type); - if ($startDate && $endDate) { - $query->whereBetween('date', [$startDate, $endDate]); - } elseif ($startDate) { - $query->where('date', '>=', $startDate); - } elseif ($endDate) { - $query->where('date', '<=', $endDate); - } - return $query; - }; - + $today = date('Y-m-d'); $list = [ 'common_visit' => [ // 总人数 - 'total' => $buildQuery(1)->count(), + 'total' => Visit::visitHome(1, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 总入场人数 - 'enter_visit' => $buildQuery(1)->whereNotNull('accept_admin_sign')->count(), + 'enter_visit' => Visit::visitHome(1, $startDate, $endDate, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 离厂统计 - 'leave_total' => $buildQuery(1)->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), - // 总随访人数 - 'follow_total' => $buildQuery(1)->get()->sum('follw_people_total'), + 'leave_total' => Visit::visitHome(1, $startDate, $endDate, [Visit::AUDIT_STATUS_LEFT]), + // 今日总人数 - 'today_total' => $buildQuery(1)->where('date', date('Y-m-d'))->count(), + 'today_total' => Visit::visitHome(1, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 今日入场人数 - 'today_enter_visit' => $buildQuery(1)->where('date', date('Y-m-d'))->whereNotNull('accept_admin_sign')->count(), + 'today_enter_visit' => Visit::visitHome(1, $today, $today, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 今日离厂 - 'today_leave_total' => $buildQuery(1)->where('date', date('Y-m-d'))->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), - // 今日随访人数 - 'today_follow_total' => $buildQuery(1)->where('date', date('Y-m-d'))->get()->sum('follw_people_total'), + 'today_leave_total' => Visit::visitHome(1, $today, $today, [Visit::AUDIT_STATUS_LEFT]), + ], 'work_visit' => [ - 'total' => $buildQuery(2)->count(), - 'enter_visit' => $buildQuery(2)->whereNotNull('accept_admin_sign')->count(), - 'today_total' => Visit::where('type', 2)->where('date', date('Y-m-d'))->count(), - 'today_enter_visit' => Visit::where('type', 2)->where('date', date('Y-m-d'))->whereNotNull('accept_admin_sign')->count(), + // 总人数 + 'total' => Visit::visitHome(2, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + // 总入场人数 + 'enter_visit' => Visit::visitHome(2, $startDate, $endDate, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 离厂统计 - 'leave_total' => $buildQuery(2)->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), + 'leave_total' => Visit::visitHome(2, $startDate, $endDate, [Visit::AUDIT_STATUS_LEFT]), + + // 今日总人数 + 'today_total' => Visit::visitHome(2, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + // 今日入场人数 + 'today_enter_visit' => Visit::visitHome(2, $today, $today, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 今日离厂 - 'today_leave_total' => Visit::where('type', 2)->where('date', date('Y-m-d'))->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), - // 总随访人数 - 'follow_total' => $buildQuery(2)->get()->sum('follw_people_total'), - // 今日随访人数 - 'today_follow_total' => $buildQuery(2)->where('date', date('Y-m-d'))->get()->sum('follw_people_total'), + 'today_leave_total' => Visit::visitHome(2, $today, $today, [Visit::AUDIT_STATUS_LEFT]), ], 'car_visit' => [ - 'total' => $buildQuery(3)->count(), - 'enter_visit' => $buildQuery(3)->whereNotNull('accept_admin_sign')->count(), - 'today_total' => Visit::where('type', 3)->where('date', date('Y-m-d'))->count(), - 'today_enter_visit' => Visit::where('type', 3)->where('date', date('Y-m-d'))->whereNotNull('accept_admin_sign')->count(), + // 总人数 + 'total' => Visit::visitHome(3, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + // 总入场人数 + 'enter_visit' => Visit::visitHome(3, $startDate, $endDate, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 离厂统计 - 'leave_total' => $buildQuery(3)->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), + 'leave_total' => Visit::visitHome(3, $startDate, $endDate, [Visit::AUDIT_STATUS_LEFT]), + + // 今日总人数 + 'today_total' => Visit::visitHome(3, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + // 今日入场人数 + 'today_enter_visit' => Visit::visitHome(3, $today, $today, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 今日离厂 - 'today_leave_total' => Visit::where('type', 3)->where('date', date('Y-m-d'))->where('audit_status', Visit::AUDIT_STATUS_LEFT)->count(), - // 总随访人数 - 'follow_total' => $buildQuery(3)->get()->sum('follw_people_total'), - // 今日随访人数 - 'today_follow_total' => $buildQuery(3)->where('date', date('Y-m-d'))->get()->sum('follw_people_total'), + 'today_leave_total' => Visit::visitHome(3, $today, $today, [Visit::AUDIT_STATUS_LEFT]), ], ]; diff --git a/app/Models/Visit.php b/app/Models/Visit.php index ba3505a..9fc2822 100644 --- a/app/Models/Visit.php +++ b/app/Models/Visit.php @@ -146,4 +146,38 @@ class Visit extends SoftDeletesModel return $app->subscribe_message->send($data); } + /** + * 首页统计 + */ + public static function visitHome($type, $startDate, $endDate, $auditStatus) + { + $visit = self::visitQuery($type, $startDate, $endDate, $auditStatus); + $visitTotal = $visit->count(); + $follwPeopleTotal = $visit->sum('follw_people_total'); + return $visitTotal + $follwPeopleTotal; + } + + /** + * 首页统计 + */ + public static function visitQuery($type, $startDate, $endDate, $auditStatus) + { + $visit = Visit::where(function ($query) use ($type, $startDate, $endDate, $auditStatus) { + if ($type) { + $query->where('type', $type); + } + if ($auditStatus) { + $query->whereIn('audit_status', $auditStatus); + } + if ($startDate) { + $query->where('date', '>=', $startDate); + } + if ($endDate) { + $query->where('date', '<=', $endDate); + } + })->get(); + return $visit; + } + + } From cad38e90d2e9c9025a5d78ff07c095c0cb48df50 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 13:23:29 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/ChartController.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Admin/ChartController.php b/app/Http/Controllers/Admin/ChartController.php index 3135a71..8fc7861 100644 --- a/app/Http/Controllers/Admin/ChartController.php +++ b/app/Http/Controllers/Admin/ChartController.php @@ -39,15 +39,15 @@ class ChartController extends CommonController $today = date('Y-m-d'); $list = [ 'common_visit' => [ - // 总人数 - 'total' => Visit::visitHome(1, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + // 总预约数 + 'total' => Visit::visitQuery(1, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT])->count(), // 总入场人数 'enter_visit' => Visit::visitHome(1, $startDate, $endDate, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), - // 离厂统计 + // 离厂统计人数 'leave_total' => Visit::visitHome(1, $startDate, $endDate, [Visit::AUDIT_STATUS_LEFT]), // 今日总人数 - 'today_total' => Visit::visitHome(1, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + 'today_total' => Visit::visitQuery(1, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT])->count(), // 今日入场人数 'today_enter_visit' => Visit::visitHome(1, $today, $today, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 今日离厂 @@ -56,14 +56,14 @@ class ChartController extends CommonController ], 'work_visit' => [ // 总人数 - 'total' => Visit::visitHome(2, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + 'total' => Visit::visitQuery(2, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT])->count(), // 总入场人数 'enter_visit' => Visit::visitHome(2, $startDate, $endDate, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 离厂统计 'leave_total' => Visit::visitHome(2, $startDate, $endDate, [Visit::AUDIT_STATUS_LEFT]), // 今日总人数 - 'today_total' => Visit::visitHome(2, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + 'today_total' => Visit::visitQuery(2, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT])->count(), // 今日入场人数 'today_enter_visit' => Visit::visitHome(2, $today, $today, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 今日离厂 @@ -71,14 +71,14 @@ class ChartController extends CommonController ], 'car_visit' => [ // 总人数 - 'total' => Visit::visitHome(3, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + 'total' => Visit::visitQuery(3, $startDate, $endDate, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT])->count(), // 总入场人数 'enter_visit' => Visit::visitHome(3, $startDate, $endDate, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 离厂统计 'leave_total' => Visit::visitHome(3, $startDate, $endDate, [Visit::AUDIT_STATUS_LEFT]), // 今日总人数 - 'today_total' => Visit::visitHome(3, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), + 'today_total' => Visit::visitQuery(3, $today, $today, [Visit::AUDIT_STATUS_APPROVED, Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT])->count(), // 今日入场人数 'today_enter_visit' => Visit::visitHome(3, $today, $today, [Visit::AUDIT_STATUS_ENTERED, Visit::AUDIT_STATUS_LEFT]), // 今日离厂 From 7f96fc997b9b609976550cfb70f7f7221e074afb Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 13:26:46 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/VisitController.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/VisitController.php b/app/Http/Controllers/Admin/VisitController.php index a98806f..ada588e 100644 --- a/app/Http/Controllers/Admin/VisitController.php +++ b/app/Http/Controllers/Admin/VisitController.php @@ -54,8 +54,11 @@ class VisitController extends CommonController if (isset($all['audit_status'])) { $query->where('audit_status', $all['audit_status']); } - if (isset($all['start_date']) && isset($all['end_date'])) { - $query->whereBetween('date', [$all['start_date'], $all['end_date']]); + if (isset($all['start_date'])) { + $query->where('date', '>=', isset($all['start_date'])); + } + if (isset($all['end_date'])) { + $query->where('date', '<=', $all['end_date']); } if (isset($all['my_self']) && !empty($all['my_self'])) { $query->where('admin_id', $this->getUserId()); From c9bb9b0217685296898590c91112b42c5a057a50 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 13:32:20 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/VisitController.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Http/Controllers/Admin/VisitController.php b/app/Http/Controllers/Admin/VisitController.php index ada588e..c688332 100644 --- a/app/Http/Controllers/Admin/VisitController.php +++ b/app/Http/Controllers/Admin/VisitController.php @@ -54,6 +54,9 @@ class VisitController extends CommonController if (isset($all['audit_status'])) { $query->where('audit_status', $all['audit_status']); } + if (isset($all['type'])) { + $query->where('type', $all['type']); + } if (isset($all['start_date'])) { $query->where('date', '>=', isset($all['start_date'])); } From 4f7f7cfb874bea6dee6133061c7beabd0bf4b8bf Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 13:33:24 +0800 Subject: [PATCH 12/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/VisitController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/VisitController.php b/app/Http/Controllers/Admin/VisitController.php index c688332..3f0ab36 100644 --- a/app/Http/Controllers/Admin/VisitController.php +++ b/app/Http/Controllers/Admin/VisitController.php @@ -78,7 +78,7 @@ class VisitController extends CommonController }); } // 权限设置 - if ($is_auth) { + if ($is_auth && $this->getUser()->id != 1) { $user = $this->getUser(); $adminIds = Admin::roleAllowAdminIds($user, $departmentIds); $query->where(function ($qry) use ($adminIds, $departmentIds, $user) { From ed16866f1ec3a262bbb88a432161e313c1db91d9 Mon Sep 17 00:00:00 2001 From: cody <648753004@qq.com> Date: Wed, 26 Nov 2025 13:35:36 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/GateController.php | 9 ++++++--- app/Http/Controllers/Admin/VisitController.php | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/GateController.php b/app/Http/Controllers/Admin/GateController.php index d627791..f88cda2 100644 --- a/app/Http/Controllers/Admin/GateController.php +++ b/app/Http/Controllers/Admin/GateController.php @@ -83,8 +83,11 @@ class GateController extends CommonController if (isset($all['idcard'])) { $query->where('idcard', $all['idcard']); } - if (isset($all['start_date']) && isset($all['end_date'])) { - $query->whereBetween('date', [$all['start_date'], $all['end_date']]); + if (isset($all['start_date'])) { + $query->where('date', '>=', $all['start_date']); + } + if (isset($all['end_date'])) { + $query->where('date', '<=', $all['end_date']); } })->orderBy($all['sort_name'] ?? 'id', $all['sort_type'] ?? 'desc')->paginate($all['page_size'] ?? 20);; return $this->success($list); @@ -125,7 +128,7 @@ class GateController extends CommonController $query->where('person_no', "{$all['code']}") ->orWhere('idcard', "{$all['code']}") ->orWhere('code', "{$all['code']}"); - })->first(); + })->first(); if (empty($check)) { return $this->fail([ResponseCode::ERROR_BUSINESS, '拜访记录不存在']); } diff --git a/app/Http/Controllers/Admin/VisitController.php b/app/Http/Controllers/Admin/VisitController.php index 3f0ab36..b80c4ae 100644 --- a/app/Http/Controllers/Admin/VisitController.php +++ b/app/Http/Controllers/Admin/VisitController.php @@ -58,7 +58,7 @@ class VisitController extends CommonController $query->where('type', $all['type']); } if (isset($all['start_date'])) { - $query->where('date', '>=', isset($all['start_date'])); + $query->where('date', '>=', $all['start_date']); } if (isset($all['end_date'])) { $query->where('date', '<=', $all['end_date']);