import React, { useState, useEffect } from 'react'; import styles from './incident.less'; import { Form, Card, Space, Table, Popconfirm, Spin, Tooltip, notification, Tree, Button, } from 'antd'; import { DoubleLeftOutlined, DoubleRightOutlined, PlusSquareFilled, RightOutlined, EditTwoTone, DeleteOutlined, OrderedListOutlined, ApartmentOutlined, DesktopOutlined } from '@ant-design/icons'; import {GetCM_Event_LoadEventTable, CM_Event_RemoveEventTable, CM_Event_ReOrder, GetCM_Event_LoadEventTypeTable} from '@/services/standingBook/api'; import classnames from 'classnames'; import AddModal from './AddModal' import ProcessModal from './ProcessModal' import SortModal from './SortModal' import ViewModal from './ViewModal' const incident = () => { const [treeLoading, setTreeLoading] = useState(false); const [treeVisible, setTreeVisible] = useState(true); // 左边列表是否可见 const [treeData, setTreeData] = useState([]); // 事件表数据 const [tableData, setTableData] = useState([]); // 事件表 const [addVisible, setAddvisible] = useState(false); const [processVisible, setProcessVisible] = useState(false); const [sortVisible, setSortVisible] = useState(false); const [viewVisible, setViewVisible] = useState(false) const [isType, setIsType] = useState(''); // 弹窗类型 const [formObj, setFormObj] = useState(''); const [flag, setFlag] = useState(0); const [title1, setTitle1] = useState('') const [title2, setTitle2] = useState('') const [select, setSelect] = useState('') const [sortData,setSortData] = useState([]) const [rember, setRember] = useState(0) const [rember1, setRember1] = useState() const [maxLength, setMaxLength] = useState(0); const [pickItem, setPickItem] = useState(''); const columns = [ { title: '事件名称', dataIndex: 'name', key: 'name', width: 150, }, { title: '事件主表', dataIndex: 'tableName', key: 'tableName', width: 200, ellipsis: true, } , { title: '编码', dataIndex: 'code', key: 'code', width: 50, } , { title: '摘要字段', dataIndex: 'summaryFields', key: 'summaryFields', width: 200, ellipsis: true } , { title: '权限', dataIndex: 'roles', key: 'roles', width: 50, } , { title: '流程', dataIndex: 'flowCount', key: 'flowCount', width: 50, } , { title: '上报', dataIndex: 'reportable', key: 'reportable', width: 50, } , { title: '上报字段', dataIndex: 'reportPage', key: 'reportPage', width: 100, render: item => ( <div ref={r => { if (r) { r.innerHTML = item; } }} /> ), } , { title: '显示字段', dataIndex: 'displayFields', key: 'displayFields', width: 100, render: item => ( <div ref={r => { if (r) { r.innerHTML = item; } }} /> ), } , { title: '编辑', dataIndex: 'editable', key: 'editable', width: 50, render: item =>( <div ref={r => { if (r) { r.innerHTML = item; } }} /> ) } , { title: '编辑字段', dataIndex: 'editableFields', key: 'editableFields', width: 100, render: item =>( <div ref={r => { if (r) { r.innerHTML = item; } }} /> ) } , { title: '上报方式', dataIndex: 'createMode', key: 'createMode', width: 100, } , // { // title: '置顶条件', // dataIndex: 'topWhere', // key: 'topWhere', // width: 100, // render: item =>( // <div // ref={r => { // if (r) { // r.innerHTML = item; // } // }} // /> // ) // } // , // { // title: '接口配置', // dataIndex: 'interfaceConfig', // key: 'interfaceConfig', // width: 100, // render: item =>( // <div // ref={r => { // if (r) { // r.innerHTML = item; // } // }} // /> // ) // }, { title: '操作', key: 'action', align: 'center', render: record => ( <Space size="middle"> <Tooltip title="编辑事件类型"> <EditTwoTone onClick={() => editEventType(record)} style={{ fontSize: '16px' }} /> </Tooltip> <Tooltip title="删除事件类型"> <Popconfirm placement="bottomRight" title={ <p> 即将删除事件类型表,是否确认删除? </p> } okText="确认" cancelText="取消" onConfirm={() => deleteEventType(record)} > <DeleteOutlined style={{ fontSize: '16px', color: '#e86060' }} /> </Popconfirm> </Tooltip> <Tooltip title="受理流程"> <ApartmentOutlined onClick={() => process(record)} style={{ fontSize: '16px', color: '#1890FF' }} /> </Tooltip> <Tooltip title="辅助视图"> <DesktopOutlined onClick={() => auxiliaryView(record)} style={{ fontSize: '16px', color: '#1890FF' }} /> </Tooltip> </Space> ) } ] useEffect(()=>{ setTreeLoading(true); GetCM_Event_LoadEventTable().then(res =>{ setTreeLoading(false); if(res.msg==='Ok'){ console.log(res.data) // setMaxLength(res.data.root.length + 1) let arr = formateArrDataA(res.data, 'businessType') console.log(arr) let newArr = [] let newapp = [] let newabb = [] let aa= [] let zz = [] Object.keys(arr).map((item, index) => { newArr.push(item) }) console.log(arr) Object.values(arr).map((item, index) => { newapp.push(item) }) console.log(newapp) newapp.map((item, index)=>{ console.log(item) item.map((item1, index)=>{ newabb.push(item1.root) console.log(item1.root) }) }) console.log(newabb) newabb.map((item, index)=>{ console.log(item) aa.push(item) }) console.log(aa) aa.map((item, index)=>{ console.log(item) item.map((item1, index)=>{ console.log(item1) zz.push({...item1}) }) }) console.log(zz) let arrr = formateArrDataA(zz, 'businessType') console.log(arrr) setTableData(arrr) setPickItem(newArr[rember]) setRember1(newArr[0]) console.log(newArr, 'newArr'); setTreeData(newArr) } }) },[flag]) useEffect(()=>{ GetCM_Event_LoadEventTypeTable().then(res => { if (res.msg === 'Ok') { let arr = [] res.data.map((item, index)=>{ arr.push(item.text) }) setSelect(arr) } }) },[]) const formateArrDataA = (initialArr, name) => { console.log(initialArr) console.log(name) // 判定传参是否符合规则 if (!(initialArr instanceof Array)) { return '请传入正确格式的数组' } if (!name) { return '请传入对象属性' } //先获取一下这个数组中有多少个"name" let nameArr = [] for (let i in initialArr) { if (nameArr.indexOf(initialArr[i][`${name}`]) === -1) { nameArr.push(initialArr[i][`${name}`]) } } //新建一个包含多个list的结果对象 let tempObj = {} // 根据不同的"name"生成多个数组 for (let k in nameArr) { for (let j in initialArr) { if (initialArr[j][`${name}`] == nameArr[k]) { // 每次外循环时新建一个对应"name"的数组, 内循环时当前数组不变 tempObj[nameArr[k]] = tempObj[nameArr[k]] || [] tempObj[nameArr[k]].push(initialArr[j]) } } } for (let keys in tempObj) { let arr = [] tempObj[keys].map((item, index) => { tempObj[keys] = arr; item.key = index arr.push(item) }) } return tempObj } //添加事件 const addIncident = () => { setAddvisible(true) setIsType('add') } //修改事件类型 const editEventType = record => { setFormObj(record); setIsType('edit'); setAddvisible(true); } //删除事件类型 const deleteEventType = record => { CM_Event_RemoveEventTable(record.ID).then(res =>{ if (res.msg === '') { notification.success({ message: '提示', duration: 3, description: '删除成功', }); setFlag(flag + 1); } else { notification.error({ message: '提示', duration: 3, description: res.msg, }); } }) } const sort = () => { setSortVisible(true); console.log(tableData) console.log(pickItem) console.log(tableData[pickItem]) setSortData(tableData[pickItem]) } const process = record => { setProcessVisible(true); setFormObj(record); setTitle1(record.name) } const auxiliaryView = record => { setFormObj(record); setViewVisible(true) setTitle2(record.name) } const onSubmit =()=>{ setAddvisible(false) setFlag(flag + 1) } const onOK = prop =>{ setSortVisible(false) let aa= (prop.str).toString() console.log(aa) CM_Event_ReOrder(aa).then(res =>{ if (res.msg === 'Ok') { notification.success({ message: '提示', duration: 3, description: '调整成功', }); setFlag(flag + 1); } else { notification.error({ message: '提示', duration: 3, description: res.msg, }); } }) } const onOK1 =()=>{ setProcessVisible(false) } const onOK11 =()=>{ setViewVisible(false) } return ( <div className={styles.incidentContainer}> <div className={styles.contentContainers}> {/*左侧事件树 */} <Spin spinning={treeLoading} tip="loading..."> <Card className={classnames({ [styles.orgContainer]: true, [styles.orgContainerHide]: !treeVisible, })} > <div> <span style={{ fontSize: '15px ', fontWeight: 'bold', }} > 事件列表 </span> <Tooltip title="添加事件类型"> <PlusSquareFilled onClick={() => addIncident()} style={{ color: '#1890FF', fontSize: '25px', verticalAlign: 'middle', marginLeft: '58%' }} /> </Tooltip> <hr style={{ width: '100%', color: '#eeecec' }} /> { treeData.length>0 && (treeData.map((item, index) => { return <div className={classnames({ [styles.listItem]: true, [styles.pickItem]: item === pickItem, })} onClick={e => {setPickItem(item);setRember(index);setRember1(item)}} key={index}>{item}({tableData[item] ? tableData[item].length : ''}) {item === pickItem ? <RightOutlined /> : ''} </div> }) )} </div> <div className={styles.switcher}> {treeVisible && ( <Tooltip title="隐藏机构列表"> <DoubleLeftOutlined onClick={() => setTreeVisible(false)} /> </Tooltip> )} {!treeVisible && ( <Tooltip title="显示机构列表"> <DoubleRightOutlined onClick={() => setTreeVisible(true)} /> </Tooltip> )} </div> </Card> </Spin> {/*右侧 */} <div className={classnames({ [styles.userContainer]: true, [styles.userContainerHide]: !treeVisible, })} > <div style={{ height: '50px' }}> <span style={{ float: 'right', marginRight: '10px' }}> <Button icon={<OrderedListOutlined className={styles.icon} />} onClick={sort} style={{ marginLeft: '30px', verticalAlign: 'middle', marginTop: '10px' }}> 调序 </Button> </span> </div> <Table // rowClassName={setRowClassName} size="small" rowKey='ID' bordered onRow={record => { return { onDoubleClick: event => {event.stopPropagation(); editEventType(record)}, //双击 }; }} columns={columns} dataSource={tableData[pickItem]} scroll={{ y: 'calc(100vh - 155px)' }} pagination={{ showTotal: (total, range) => `第${range[0]}-${range[1]} 条/共 ${total} 条`, pageSizeOptions: [10, 20, 50, 100], defaultPageSize: 20, showQuickJumper: true, showSizeChanger: true, }} /> </div> {/* Modal弹框 */} {/* 添加事件 */} <AddModal visible={addVisible} type={isType} formObj={formObj} rember1={rember1} maxLength={maxLength} onCancel={() => setAddvisible(false)} treeData={treeData} selectData={select} callBackSubmit={onSubmit} /> <ProcessModal visible={processVisible} formObj={formObj} title1={title1} maxLength={maxLength} onCancel={() => setProcessVisible(false)} callBackSubmit={onOK1} /> <SortModal title="调整顺序" visible={sortVisible} sortData1={sortData} pickItem={pickItem} onCancel={() => setSortVisible(false)} callBackSubmit={onOK} /> <ViewModal formObj={formObj} visible={viewVisible} onCancel={() => setViewVisible(false)} title2={title2} callBackSubmit={onOK11} /> </div> </div> ) }; export default incident;