You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			310 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			310 lines
		
	
	
		
			9.2 KiB
		
	
	
	
		
			JavaScript
		
	
| import React from 'react';
 | |
| import {
 | |
|     DeleteOutlined,
 | |
|     EditOutlined,
 | |
|     PlusOutlined,
 | |
|     SearchOutlined,
 | |
|     RedoOutlined,
 | |
|     DownOutlined,
 | |
|     ExclamationCircleFilled,
 | |
|     UpOutlined,
 | |
|     InfoCircleFilled,
 | |
|     QuestionCircleFilled,
 | |
|     DownloadOutlined
 | |
| } from '@ant-design/icons';
 | |
| import {connect, history} from '@umijs/max';
 | |
| import {Button, Card, Divider, Dropdown, message, Modal, Popconfirm, Space, Switch, Tag, Row, Col} from 'antd';
 | |
| import StandardTable from '@/components/StandardTable';
 | |
| 
 | |
| import { MyIcon } from "@/components/Icon"
 | |
| import style from "@/global.less";
 | |
| import styles from './SystemOrganizationList.less';
 | |
| import datadictionary from "@/utils/dataDictionary";
 | |
| import {formatDate} from "@/utils/formatUtils";
 | |
| import { formatDictText, checkButtonAuthority } from "@/utils/globalCommon";
 | |
| 
 | |
| const { confirm } = Modal;
 | |
| 
 | |
| // 组织类型
 | |
| const organization_type = datadictionary.organization_type || [];
 | |
| const organization_status = datadictionary.organization_status || [];
 | |
| 
 | |
| const mockData = {
 | |
|     list: [
 | |
|         {
 | |
|             id: '1',
 | |
|             name: '总部',
 | |
|             code: 'HQ',
 | |
|             type: '1',
 | |
|             parentId: '0',
 | |
|             status: '1',
 | |
|             createTime: '2023-01-01 10:00:00',
 | |
|             createUser: 'admin'
 | |
|         },
 | |
|         {
 | |
|             id: '2',
 | |
|             name: '研发部',
 | |
|             code: 'R&D',
 | |
|             type: '2',
 | |
|             parentId: '1',
 | |
|             status: '1',
 | |
|             createTime: '2023-01-02 14:30:00',
 | |
|             createUser: 'admin'
 | |
|         },
 | |
|         {
 | |
|             id: '3',
 | |
|             name: '市场部',
 | |
|             code: 'MKT',
 | |
|             type: '2',
 | |
|             parentId: '1',
 | |
|             status: '1',
 | |
|             createTime: '2023-01-03 09:15:00',
 | |
|             createUser: 'admin'
 | |
|         }
 | |
|     ],
 | |
|     pagination: {
 | |
|         total: 3,
 | |
|         pageSize: 10,
 | |
|         current: 1
 | |
|     }
 | |
| };
 | |
| 
 | |
| @connect(({ systemOrganization, loading }) => ({
 | |
|     systemOrganization,
 | |
|     loading: loading.models.systemOrganization
 | |
| }))
 | |
| export default class SystemOrganizationList extends React.Component {
 | |
|     state = {
 | |
|         selectedRows: [],
 | |
|         loading: false,
 | |
|         advancedFormVisible: false,
 | |
|         filterData: {},
 | |
|         pagination: {
 | |
|             pageSize: 10,
 | |
|             current: 1
 | |
|         },
 | |
|         tableData: mockData.list
 | |
|     };
 | |
| 
 | |
|     componentDidMount() {
 | |
|         this.getOrganizationList();
 | |
|     }
 | |
| 
 | |
|     // 获取组织列表
 | |
|     getOrganizationList = () => {
 | |
|         const { dispatch } = this.props;
 | |
|         const { pagination, filterData } = this.state;
 | |
|         this.setState({ loading: true });
 | |
|         dispatch({
 | |
|             type: 'systemOrganization/fetchList',
 | |
|             payload: {
 | |
|                 pageNum: pagination.current,
 | |
|                 pageSize: pagination.pageSize,
 | |
|                 ...filterData
 | |
|             },
 | |
|             callback: (res) => {
 | |
|                 this.setState({ 
 | |
|                     loading: false,
 | |
|                     tableData: res?.list || [],
 | |
|                     pagination: {
 | |
|                         ...pagination,
 | |
|                         total: res?.total || 0
 | |
|                     }
 | |
|                 });
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     // 表格选择变化
 | |
|     handleSelectChange = (selectedRowKeys, selectedRows) => {
 | |
|         this.setState({ selectedRows });
 | |
|     };
 | |
| 
 | |
|     // 分页变化
 | |
|     handleTableChange = (pagination) => {
 | |
|         this.setState({
 | |
|             pagination: {
 | |
|                 ...this.state.pagination,
 | |
|                 current: pagination.current
 | |
|             }
 | |
|         }, () => {
 | |
|             this.getOrganizationList();
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     // 新增组织
 | |
|     handleAdd = () => {
 | |
|         // 新增逻辑
 | |
|         message.success('新增组织功能');
 | |
|     };
 | |
| 
 | |
|     // 编辑组织
 | |
|     handleEdit = (record) => {
 | |
|         // 编辑逻辑
 | |
|         message.success('编辑组织功能');
 | |
|     };
 | |
| 
 | |
|     // 删除组织
 | |
|     handleDelete = (record) => {
 | |
|         confirm({
 | |
|             title: '确定要删除这个组织吗?',
 | |
|             icon: <ExclamationCircleFilled />,
 | |
|             onOk: () => {
 | |
|                 // 删除逻辑
 | |
|                 message.success('删除组织成功');
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     // 批量删除
 | |
|     handleBatchDelete = () => {
 | |
|         const { selectedRows } = this.state;
 | |
|         if (selectedRows.length === 0) {
 | |
|             message.warning('请选择要删除的组织');
 | |
|             return;
 | |
|         }
 | |
|         confirm({
 | |
|             title: `确定要删除选中的${selectedRows.length}个组织吗?`,
 | |
|             icon: <ExclamationCircleFilled />,
 | |
|             onOk: () => {
 | |
|                 // 批量删除逻辑
 | |
|                 message.success('批量删除组织成功');
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     // 启用/禁用组织
 | |
|     handleStatusChange = (record) => {
 | |
|         const newStatus = record.status === '1' ? '0' : '1';
 | |
|         confirm({
 | |
|             title: `确定要${newStatus === '1' ? '启用' : '禁用'}这个组织吗?`,
 | |
|             icon: <ExclamationCircleFilled />,
 | |
|             onOk: () => {
 | |
|                 // 状态变更逻辑
 | |
|                 message.success(`${newStatus === '1' ? '启用' : '禁用'}组织成功`);
 | |
|             }
 | |
|         });
 | |
|     };
 | |
| 
 | |
|     render() {
 | |
|         const { selectedRows, loading, tableData, pagination } = this.state;
 | |
| 
 | |
|         const columns = [
 | |
|             {
 | |
|                 title: '组织名称',
 | |
|                 dataIndex: 'name',
 | |
|                 key: 'name',
 | |
|                 ellipsis: true
 | |
|             },
 | |
|             {
 | |
|                 title: '组织编码',
 | |
|                 dataIndex: 'code',
 | |
|                 key: 'code',
 | |
|                 ellipsis: true
 | |
|             },
 | |
|             {
 | |
|                 title: '组织类型',
 | |
|                 dataIndex: 'type',
 | |
|                 key: 'type',
 | |
|                 render: text => formatDictText(organization_type, text)
 | |
|             },
 | |
|             {
 | |
|                 title: '状态',
 | |
|                 dataIndex: 'status',
 | |
|                 key: 'status',
 | |
|                 render: text => (
 | |
|                     <Tag color={text === '1' ? 'green' : 'red'}>
 | |
|                         {text === '1' ? '启用' : '禁用'}
 | |
|                     </Tag>
 | |
|                 )
 | |
|             },
 | |
|             {
 | |
|                 title: '创建时间',
 | |
|                 dataIndex: 'createTime',
 | |
|                 key: 'createTime',
 | |
|                 ellipsis: true
 | |
|             },
 | |
|             {
 | |
|                 title: '创建人',
 | |
|                 dataIndex: 'createUser',
 | |
|                 key: 'createUser',
 | |
|                 ellipsis: true
 | |
|             },
 | |
|             {
 | |
|                 title: '操作',
 | |
|                 key: 'action',
 | |
|                 fixed: 'right',
 | |
|                 width: 160,
 | |
|                 render: (_, record) => (
 | |
|                     <Space size="middle">
 | |
|                         <Button 
 | |
|                             type="link" 
 | |
|                             size="small" 
 | |
|                             icon={<EditOutlined />} 
 | |
|                             onClick={() => this.handleEdit(record)}
 | |
|                         >
 | |
|                             编辑
 | |
|                         </Button>
 | |
|                         <Button 
 | |
|                             type="link" 
 | |
|                             size="small" 
 | |
|                             danger 
 | |
|                             icon={<DeleteOutlined />} 
 | |
|                             onClick={() => this.handleDelete(record)}
 | |
|                         >
 | |
|                             删除
 | |
|                         </Button>
 | |
|                         <Switch
 | |
|                             checked={record.status === '1'}
 | |
|                             onChange={() => this.handleStatusChange(record)}
 | |
|                         />
 | |
|                     </Space>
 | |
|                 )
 | |
|             }
 | |
|         ];
 | |
| 
 | |
|         return (
 | |
|             <div className={style.contentWrapper}>
 | |
|                 <Card className={style.contentCard}>
 | |
|                     <div className={styles.header}>
 | |
|                         <div className={styles.headerLeft}>
 | |
|                             <h2 className={styles.title}>组织管理</h2>
 | |
|                         </div>
 | |
|                         <div className={styles.headerRight}>
 | |
|                             <Button 
 | |
|                                 type="primary" 
 | |
|                                 icon={<PlusOutlined />} 
 | |
|                                 onClick={this.handleAdd}
 | |
|                             >
 | |
|                                 新增组织
 | |
|                             </Button>
 | |
|                             <Button 
 | |
|                                 danger 
 | |
|                                 style={{ marginLeft: 8 }} 
 | |
|                                 onClick={this.handleBatchDelete}
 | |
|                                 disabled={selectedRows.length === 0}
 | |
|                             >
 | |
|                                 批量删除
 | |
|                             </Button>
 | |
|                         </div>
 | |
|                     </div>
 | |
|                     
 | |
|                     <Divider />
 | |
|                     
 | |
|                     <StandardTable
 | |
|                         rowKey="id"
 | |
|                         selectedRows={selectedRows}
 | |
|                         loading={loading}
 | |
|                         data={{
 | |
|                             list: tableData,
 | |
|                             pagination
 | |
|                         }}
 | |
|                         columns={columns}
 | |
|                         onSelectRow={this.handleSelectChange}
 | |
|                         onChange={this.handleTableChange}
 | |
|                     />
 | |
|                 </Card>
 | |
|             </div>
 | |
|         );
 | |
|     }
 | |
| } |