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/system/users/columns.tsx |  141 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 141 insertions(+), 0 deletions(-)

diff --git a/src/pages/system/users/columns.tsx b/src/pages/system/users/columns.tsx
new file mode 100644
index 0000000..8640ce5
--- /dev/null
+++ b/src/pages/system/users/columns.tsx
@@ -0,0 +1,141 @@
+import { Avatar, Button, Space, Tag } from 'antd';
+import type { ProColumns } from '@ant-design/pro-components';
+import type { EmployeeStatus, EmployeeVO, SelectOption } from './types';
+
+export const employeeStatusMeta: Record<EmployeeStatus, { text: string; color: string }> = {
+  ACTIVE: { text: '启用', color: 'green' },
+  DISABLED: { text: '禁用', color: 'default' },
+};
+
+/** 兼容后端返回未知或小写状态,避免直接索引得到 undefined。 */
+export const getEmployeeStatusMeta = (status?: string) => {
+  const key = String(status ?? '').toUpperCase() as EmployeeStatus;
+  return employeeStatusMeta[key] ?? { text: status || '-', color: 'default' };
+};
+
+export const createUserColumns = (options: {
+  orgOptions: SelectOption[];
+  roleOptions: SelectOption[];
+  orgNameMap: Map<number, string>;
+  roleNameMap: Map<number, string>;
+  onDetail: (record: EmployeeVO) => void;
+  onEdit: (record: EmployeeVO) => void;
+  onDelete: (record: EmployeeVO) => void;
+}): ProColumns<EmployeeVO>[] => [
+  {
+    title: '员工',
+    dataIndex: 'name',
+    width: 220,
+    ellipsis: true,
+    fieldProps: { placeholder: '姓名 / 手机号' },
+    search: {
+      transform: (value) => ({ keyword: value }),
+    },
+    render: (_value, record) => (
+      <div className="user-cell">
+        <Avatar className="user-cell__avatar" src={record.avatarUrl} size={36}>
+          {record.name?.charAt(0)}
+        </Avatar>
+        <div className="user-cell__meta">
+          <span className="user-cell__name">{record.name}</span>
+          <span className="user-cell__username">{record.phone}</span>
+        </div>
+      </div>
+    ),
+  },
+  {
+    title: '所属组织',
+    dataIndex: 'orgId',
+    width: 170,
+    valueType: 'select',
+    fieldProps: {
+      options: options.orgOptions,
+      showSearch: true,
+      optionFilterProp: 'label',
+      allowClear: true,
+      placeholder: '请选择组织',
+    },
+    render: (_value, record) =>
+      options.orgNameMap.get(record.orgId) ?? (record.orgId ? `#${record.orgId}` : '-'),
+  },
+  {
+    title: '角色',
+    dataIndex: 'roleId',
+    width: 150,
+    valueType: 'select',
+    fieldProps: {
+      options: options.roleOptions,
+      showSearch: true,
+      optionFilterProp: 'label',
+      allowClear: true,
+      placeholder: '请选择角色',
+    },
+    render: (_value, record) =>
+      options.roleNameMap.get(record.roleId) ?? (record.roleId ? `#${record.roleId}` : '-'),
+  },
+  {
+    title: '职位',
+    dataIndex: 'position',
+    width: 120,
+    search: false,
+    render: (_value, record) => record.position || '-',
+  },
+  {
+    title: '负责区域',
+    dataIndex: 'region',
+    width: 120,
+    search: false,
+    render: (_value, record) => record.region || '-',
+  },
+  {
+    title: '客户上限',
+    dataIndex: 'holdLimit',
+    width: 100,
+    search: false,
+    render: (_value, record) => record.holdLimit ?? '-',
+  },
+  {
+    title: '状态',
+    dataIndex: 'status',
+    width: 100,
+    valueType: 'select',
+    valueEnum: {
+      ACTIVE: { text: '启用' },
+      DISABLED: { text: '禁用' },
+    },
+    render: (_value, record) => {
+      const meta = getEmployeeStatusMeta(record.status);
+      return (
+        <Tag color={meta.color} bordered={false}>
+          {meta.text}
+        </Tag>
+      );
+    },
+  },
+  {
+    title: '入职日期',
+    dataIndex: 'hireDate',
+    width: 130,
+    search: false,
+    render: (_value, record) => record.hireDate || '-',
+  },
+  {
+    title: '操作',
+    key: 'action',
+    valueType: 'option',
+    width: 180,
+    render: (_value, record) => (
+      <Space size={0}>
+        <Button type="link" size="small" onClick={() => options.onDetail(record)}>
+          详情
+        </Button>
+        <Button type="link" size="small" onClick={() => options.onEdit(record)}>
+          编辑
+        </Button>
+        <Button type="link" size="small" danger onClick={() => options.onDelete(record)}>
+          删除
+        </Button>
+      </Space>
+    ),
+  },
+];

--
Gitblit v1.9.3