文件还在测试中

This commit is contained in:
2026-08-08 15:53:53 +08:00
parent 5f1e7adb64
commit 8101177cb5
241 changed files with 18074 additions and 22 deletions
+103
View File
@@ -0,0 +1,103 @@
<?php
namespace App\Controllers\CRM;
use App\Controllers\Controller;
use App\Models\CRM\Customer;
/** 客户管理(CRM 系统)。super_admin / crm_admin 可增删改;crm_user 仅查看。 */
class CustomersController extends Controller
{
private function nav(): array
{
return [
['k' => 'dashboard', 'label' => '仪表盘', 'icon' => '📊', 'url' => 'CRM'],
['k' => 'customers', 'label' => '客户管理', 'icon' => '🤝', 'url' => 'CRM/customers'],
['k' => 'leads', 'label' => '商机线索', 'icon' => '💡', 'url' => 'CRM/leads'],
['k' => 'followups', 'label' => '跟进记录', 'icon' => '📞', 'url' => 'CRM/followups'],
];
}
public function index()
{
$customers = (new Customer())->all();
$contactCounts = $this->contactCounts();
return $this->renderSubsys('crm', 'crm/customers', [
'customers' => $customers,
'contactCounts' => $contactCounts,
], $this->nav(), 'customers');
}
/** 每个客户的联系人数量(键=customer_id */
private function contactCounts(): array
{
$out = [];
try {
$rows = \Core\Db::query("SELECT customer_id, COUNT(*) AS n FROM crm_contacts GROUP BY customer_id");
foreach ($rows->fetchAll() as $r) { $out[(int)$r['customer_id']] = (int)$r['n']; }
} catch (\Throwable $e) {}
return $out;
}
public function create()
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
return $this->renderSubsys('crm', 'crm/customer_form', ['customer' => null], $this->nav(), 'customers');
}
public function store()
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
if (!csrf_check()) { return $this->renderSubsys('crm', 'crm/customer_form', ['customer' => null], $this->nav(), 'customers'); }
$data = $this->collect();
(new Customer())->insert($data);
return $this->redirect('CRM/customers');
}
public function edit($id)
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
$customer = (new Customer())->find($id);
if (!$customer) return $this->redirect('CRM/customers');
return $this->renderSubsys('crm', 'crm/customer_form', ['customer' => $customer], $this->nav(), 'customers');
}
public function update($id)
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
if (!csrf_check()) return $this->redirect('CRM/customers');
$customer = (new Customer())->find($id);
if (!$customer) return $this->redirect('CRM/customers');
(new Customer())->update($id, $this->collect());
return $this->redirect('CRM/customers');
}
public function destroy($id)
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
(new Customer())->delete($id);
return $this->redirect('CRM/customers');
}
private function collect(): array
{
return [
'name' => trim($this->post('name')),
'company' => trim($this->post('company')),
'contact' => trim($this->post('contact')),
'phone' => trim($this->post('phone')),
'email' => trim($this->post('email')),
'country' => trim($this->post('country')),
'type' => $this->post('type') ?: 'brand',
'source' => trim($this->post('source')),
'level' => $this->post('level') ?: 'C',
'customer_no' => trim($this->post('customer_no')),
'industry' => trim($this->post('industry')),
'region' => trim($this->post('region')),
'credit_limit'=> (float)$this->post('credit_limit'),
'status' => $this->post('status') ?: 'lead',
'remark' => trim($this->post('remark')),
'owner' => trim($this->post('owner')) ?: ($_SESSION['admin_name'] ?? ''),
'created_at' => date('Y-m-d'),
];
}
}