From be8c526a454aa9081000d15f26bebdef8c183aea Mon Sep 17 00:00:00 2001
From: wsj <593216709@qq.com>
Date: Mon, 26 Oct 2026 23:34:23 +0800
Subject: [PATCH] feat: 提交

---
 src/pages/customers/list/columns.tsx |  158 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 158 insertions(+), 0 deletions(-)

diff --git a/src/pages/customers/list/columns.tsx b/src/pages/customers/list/columns.tsx
new file mode 100644
index 0000000..8184b97
--- /dev/null
+++ b/src/pages/customers/list/columns.tsx
@@ -0,0 +1,158 @@
+import { Tag } from 'antd';
+import type { ProColumns } from '@ant-design/pro-components';
+import type {
+  CustomerLevel,
+  CustomerStage,
+  CustomerType,
+  CustomerVO,
+} from './types';
+
+const customerTypeMeta: Record<CustomerType, { text: string; color: string }> = {
+  ENTERPRISE: { text: '企业', color: 'blue' },
+  PERSONAL: { text: '个人', color: 'default' },
+};
+
+const levelMeta: Record<CustomerLevel, { text: string; color: string }> = {
+  VIP: { text: 'VIP', color: 'purple' },
+  A: { text: 'A 类', color: 'gold' },
+  B: { text: 'B 类', color: 'blue' },
+  C: { text: 'C 类', color: 'default' },
+};
+
+const stageMeta: Record<CustomerStage, { text: string; color: string }> = {
+  NEW_LEAD: { text: '新线索', color: 'default' },
+  PENDING_ASSIGN: { text: '待分配', color: 'orange' },
+  CONTACTING: { text: '沟通中', color: 'processing' },
+  NEEDS_COMM: { text: '需求沟通', color: 'cyan' },
+  QUOTING: { text: '报价中', color: 'blue' },
+  NEGOTIATING: { text: '谈判中', color: 'gold' },
+  DEAL: { text: '已成交', color: 'success' },
+  LOST: { text: '已流失', color: 'error' },
+};
+
+const renderTags = (tags?: string) => {
+  const items = tags?.split(/[,,]/).map((tag) => tag.trim()).filter(Boolean) ?? [];
+  if (!items.length) return '-';
+
+  return (
+    <>
+      {items.map((tag) => (
+        <Tag key={tag} bordered={false}>
+          {tag}
+        </Tag>
+      ))}
+    </>
+  );
+};
+
+export const customerColumns: ProColumns<CustomerVO>[] = [
+  {
+    title: '客户名称',
+    dataIndex: 'name',
+    width: 220,
+    ellipsis: true,
+    copyable: true,
+    search: false,
+  },
+  {
+    title: '客户类型',
+    dataIndex: 'customerType',
+    width: 100,
+    search: false,
+    render: (_value, record) => {
+      const meta = record.customerType ? customerTypeMeta[record.customerType] : null;
+      return meta ? (
+        <Tag color={meta.color} bordered={false}>
+          {meta.text}
+        </Tag>
+      ) : (
+        '-'
+      );
+    },
+  },
+  {
+    title: '所属行业',
+    dataIndex: 'industry',
+    width: 130,
+    ellipsis: true,
+    search: false,
+    render: (_value, record) => record.industry ?? '-',
+  },
+  {
+    title: '所在地区',
+    dataIndex: 'region',
+    width: 120,
+    ellipsis: true,
+    search: false,
+    render: (_value, record) => record.region ?? '-',
+  },
+  {
+    title: '联系人',
+    dataIndex: 'contactName',
+    width: 110,
+    search: false,
+    render: (_value, record) => record.contactName ?? '-',
+  },
+  {
+    title: '联系电话',
+    dataIndex: 'contactPhone',
+    width: 140,
+    search: false,
+    render: (_value, record) => record.contactPhone ?? '-',
+  },
+  {
+    title: '客户等级',
+    dataIndex: 'level',
+    width: 100,
+    search: false,
+    render: (_value, record) => {
+      const meta = record.level ? levelMeta[record.level] : null;
+      return meta ? (
+        <Tag color={meta.color} bordered={false}>
+          {meta.text}
+        </Tag>
+      ) : (
+        '-'
+      );
+    },
+  },
+  {
+    title: '客户阶段',
+    dataIndex: 'stage',
+    width: 110,
+    search: false,
+    render: (_value, record) => {
+      const meta = record.stage ? stageMeta[record.stage] : null;
+      return meta ? (
+        <Tag color={meta.color} bordered={false}>
+          {meta.text}
+        </Tag>
+      ) : (
+        '-'
+      );
+    },
+  },
+  {
+    title: '归属销售员',
+    dataIndex: 'ownerId',
+    width: 130,
+    valueType: 'digit',
+    tooltip: '按归属销售员 ID 筛选,不填表示全部',
+    fieldProps: { placeholder: '销售员 ID', min: 1, precision: 0 },
+    render: (_value, record) => (record.ownerId ? `#${record.ownerId}` : '-'),
+  },
+  {
+    title: '最近跟进',
+    dataIndex: 'lastFollowAt',
+    width: 170,
+    valueType: 'dateTime',
+    search: false,
+  },
+  {
+    title: '标签',
+    dataIndex: 'tags',
+    width: 180,
+    search: false,
+    render: (_value, record) => renderTags(record.tags),
+  },
+];

--
Gitblit v1.9.3