Files
2026-08-08 15:53:53 +08:00

124 lines
4.8 KiB
PHP

<?php
namespace App\Controllers\CRM;
use App\Controllers\Controller;
use App\Models\CRM\Contact;
use App\Models\CRM\Customer;
/** 客户联系人(一个客户下可多人)。super_admin / crm_admin 可增删改;crm_user 仅查看。 */
class ContactsController 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'],
['k' => 'contacts', 'label' => '客户联系人', 'icon' => '👥', 'url' => 'CRM/contacts'],
];
}
/** 列表:/CRM/contacts(全部)或 /CRM/contacts?customer_id=ID(某客户) */
public function index($customerId = null)
{
$customerId = $customerId ? (int)$customerId : (int)($_GET['customer_id'] ?? 0);
$customer = null;
if ($customerId) {
$customer = (new Customer())->find($customerId);
$contacts = (new Contact())->where('customer_id', $customerId);
} else {
$contacts = $this->allWithCustomer();
}
return $this->renderSubsys('crm', 'crm/contacts', [
'contacts' => $contacts,
'customer' => $customer,
], $this->nav(), 'contacts');
}
public function create()
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
$preId = (int)($_GET['customer_id'] ?? 0);
$customers = (new Customer())->all();
return $this->renderSubsys('crm', 'crm/contact_form', [
'contact' => null,
'customers' => $customers,
'preId' => $preId,
], $this->nav(), 'contacts');
}
public function store()
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
if (!csrf_check()) return $this->redirect('CRM/contacts');
$cid = (int)$this->post('customer_id');
$data = $this->collect();
(new Contact())->insert($data);
return $this->redirect($cid ? "CRM/contacts?customer_id={$cid}" : 'CRM/contacts');
}
public function edit($id)
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
$contact = (new Contact())->find($id);
if (!$contact) return $this->redirect('CRM/contacts');
$customers = (new Customer())->all();
return $this->renderSubsys('crm', 'crm/contact_form', [
'contact' => $contact,
'customers' => $customers,
'preId' => (int)($contact['customer_id'] ?? 0),
], $this->nav(), 'contacts');
}
public function update($id)
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
if (!csrf_check()) return $this->redirect('CRM/contacts');
$contact = (new Contact())->find($id);
if (!$contact) return $this->redirect('CRM/contacts');
$cid = (int)$this->post('customer_id');
(new Contact())->update($id, $this->collect());
return $this->redirect($cid ? "CRM/contacts?customer_id={$cid}" : 'CRM/contacts');
}
public function destroy($id)
{
subsys_admin('crm') or \Core\App::forbidden('需要 CRM 管理员权限');
$contact = (new Contact())->find($id);
$cid = $contact ? (int)($contact['customer_id'] ?? 0) : 0;
(new Contact())->delete($id);
return $this->redirect($cid ? "CRM/contacts?customer_id={$cid}" : 'CRM/contacts');
}
private function collect(): array
{
return [
'customer_id' => (int)$this->post('customer_id'),
'name' => trim($this->post('name')),
'title' => trim($this->post('title')),
'phone' => trim($this->post('phone')),
'email' => trim($this->post('email')),
'wechat' => trim($this->post('wechat')),
'is_primary' => $this->post('is_primary') ? 1 : 0,
'remark' => trim($this->post('remark')),
'created_at' => date('Y-m-d'),
];
}
/** 全部联系人 + 客户名称(用于「全部联系人」视图) */
private function allWithCustomer(): array
{
try {
$rows = \Core\Db::query(
"SELECT c.*, cu.name AS customer_name FROM crm_contacts c
LEFT JOIN crm_customers cu ON cu.id=c.customer_id
ORDER BY c.customer_id, c.id"
)->fetchAll();
return $rows;
} catch (\Throwable $e) {
return (new Contact())->all();
}
}
}