/* * @Author: code4eat awesomedema@gmail.com * @Date: 2022-12-16 09:42:52 * @LastEditors: code4eat awesomedema@gmail.com * @LastEditTime: 2023-05-30 11:01:02 * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE */ import BMSPagecontainer from '@/components/BMSPageContainer'; import { useEffect, useImperativeHandle, useRef, useState } from 'react'; import './style.less'; import { TreeProps, Input, Modal, Transfer, Popconfirm, Table, message } from 'antd'; import { DataNode } from 'antd/es/tree'; import expandedIcon from '../../../../../static/treenode_open.png'; import closeIcon from '../../../../../static/treenode_collapse.png'; import { BMSTable } from '@/components/BMSTable'; import { ActionType, ProColumns } from '@ant-design/pro-components'; import { createFromIconfontCN } from '@ant-design/icons'; import { CheckUnitDepMapTableDataType, delTableData, addMapDep, getCheckUnitDepMapTableDataByUnitClass, getMapDepList, getTreeData, getTreeDataRespType } from './service'; import { TransferItem, TransferProps } from 'antd/es/transfer'; import difference from 'lodash/difference'; import 'dayjs/locale/zh-cn'; import React from 'react'; import DirectoryTree from 'antd/es/tree/DirectoryTree'; import { getDeepestTreeData } from '@/utils/tooljs'; import { ColumnsType, TableRowSelection } from 'antd/es/table/interface'; import '../../../../utils/zhongtaiB'; import '../../../../utils/zhongtaiC'; const IconFont = createFromIconfontCN({ scriptUrl: '', }); const SearchIcon = createFromIconfontCN({ scriptUrl: '', }); export type TableListItem = { key: number; name: string; }; const CheckUnitDepMap: React.FC = () => { const [treeData, set_treeData] = useState([]); const [tableColumn, set_tableColumn] = useState([]); const [currentSelectedTreeNode, set_currentSelectedTreeNode] = useState(); const [tableDataFilterParams, set_tableDataFilterParams] = useState(undefined); const [tableDataSearchKeywords, set_tableDataSearchKeywords] = useState(''); const [tableData, set_tableData] = useState([]); const [expandedKeys, setExpandedKeys] = useState([]); const [searchValue, setSearchValue] = useState(''); const [autoExpandParent, setAutoExpandParent] = useState(true); const tableRef = useRef(); const column = [ { title: '科室代码', dataIndex: 'deptCode' }, { title: '科室名称', dataIndex: 'deptName', }, { title: '类型', dataIndex: 'deptTypeName', }, { title: '操作', key: 'option', valueType: 'option', render: (_: any, record: any) => { return [ delTableDataHandle(record)} > 删除 ] }, }, ]; const delTableDataHandle = async (record: any) => { const resp: any = await delTableData(record.id); if (resp) { getTreeReqFunc(); tableRef.current?.reload(); } } const onSelect: TreeProps['onSelect'] = (selectedKeys, info) => { // console.log('selected', selectedKeys, info); const { node } = info; set_currentSelectedTreeNode(node); }; const getTableData = async (type: 'PERSON' | 'DEP' | 'CHARGE', params: any, sort: any, filter: any) => { // console.log({ currentSelectedTreeNode }); // console.log({ params, sort, filter }); if (currentSelectedTreeNode) { const resp = await getCheckUnitDepMapTableDataByUnitClass({ ...params, unitCode: currentSelectedTreeNode.code, }); if (resp) { set_tableData(resp.list); return { data: resp.list, success: true, total: resp.totalCount, pageSize: resp.pageSize, totalPage: resp.totalPage, } } return { data: [], success: true } } return [] } interface DataType { key: string; title: string; description: string; disabled: boolean; tag: string; } const transferTableColumn: any[] = [ { title: '科室名称', dataIndex: 'deptName', with: 100, ellipsis: true, }, { title: '科室类型', width: 120, dataIndex: 'deptTypeName', ellipsis: true }, ]; const addHandle = () => { const ref = React.createRef<{ save: any; }>(); Modal.confirm({ title: `添加单元对照科室(${currentSelectedTreeNode.name})`, icon: <>, width: 750, centered: true, okText:'确定', cancelText:'取消', content: , onOk: () => { return ref.current && ref.current.save(); } }) } const TableTransfer = React.forwardRef(({ leftColumns, rightColumns, record }: any, ref) => { const [targetKeys, setTargetKeys] = useState([]); const [datasource, set_datasource] = useState([]); const [selectedKeys, setSelectedKeys] = useState([]); //获取对照科室 const getFuncList = async () => { const resp = await getMapDepList(); if (resp) { const defaultSelctedkeys = tableData.map((item: any) => item.deptCode); const hasSelectedData = tableData.map((a: any) => ({ deptCode: a.deptCode, deptName: a.deptName, deptType: a.deptType, deptTypeName: a.deptTypeName })) set_datasource([...resp, ...hasSelectedData]); setTargetKeys(defaultSelctedkeys); } } const onChange = (nextTargetKeys: string[]) => { setTargetKeys(nextTargetKeys); }; const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => { //console.log('sourceSelectedKeys:', sourceSelectedKeys,'targetSelectedKeys:',targetSelectedKeys); setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]); }; useImperativeHandle(ref, () => ({ save: async () => { const needData = datasource.filter(item => targetKeys.includes(item.deptCode)); const result = { unitCode: record.code, unitType: record.unitType, department: needData }; const resp = await addMapDep(result); if (resp) { message.success('添加成功!'); getTreeReqFunc(); tableRef.current?.reload(); } } })); useEffect(() => { getFuncList(); }, []) return ( record.deptCode} targetKeys={targetKeys} selectedKeys={selectedKeys} filterOption={(inputValue, item) => { return item.deptName!.indexOf(inputValue) !== -1 }} > {({ direction, filteredItems, onItemSelectAll, onItemSelect, selectedKeys: listSelectedKeys, disabled: listDisabled, }) => { // console.log({ filteredItems, listSelectedKeys,direction }); const columns = direction === 'left' ? leftColumns : rightColumns; const rowSelection: TableRowSelection = { getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }), onSelectAll(selected, selectedRows) { const treeSelectedKeys = selectedRows.map(({ deptCode }) => deptCode); const diffKeys = selected ? difference(treeSelectedKeys, listSelectedKeys) : difference(listSelectedKeys, treeSelectedKeys); onItemSelectAll(diffKeys as string[], selected); }, onSelect({ deptCode }, selected) { onItemSelect(deptCode as string, selected); }, selectedRowKeys: listSelectedKeys, }; return ( ({ onClick: () => { if (itemDisabled || listDisabled) return; onItemSelect(deptCode as string, !listSelectedKeys.includes(deptCode as string)); }, })} /> ); }} ) }) const dataList: any[] = []; const getParentKey = (key: React.Key, tree: any[]): React.Key => { let parentKey: React.Key; for (let i = 0; i < tree.length; i++) { const node = tree[i]; if (node.child) { if (node.child.some((item: { code: React.Key; }) => item.code === key)) { parentKey = node.code; } else if (getParentKey(key, node.child)) { parentKey = getParentKey(key, node.child); } } } return parentKey!; }; const onTreeSearchKeyChange = (e: React.ChangeEvent) => { const { value } = e.target; const newExpandedKeys = dataList .map((item) => { if (item.name.indexOf(value) > -1) { return getParentKey(item.code, treeData); } return null; }); const b = newExpandedKeys.filter((item, i, self) => item && self.indexOf(item) === i); setExpandedKeys(newExpandedKeys as React.Key[]); setSearchValue(value); setAutoExpandParent(true); } const onExpand = (newExpandedKeys: React.Key[]) => { setExpandedKeys(newExpandedKeys); setAutoExpandParent(false); }; const generateList = (data: any[]) => { for (let i = 0; i < data.length; i++) { const node = data[i]; const { code, name } = node; dataList.push({ code, name }); if (node.child) { generateList(node.child); } } }; generateList(treeData as any); const getTreeReqFunc = async () => { const resp = await getTreeData(); // function checkMap(node:any) { // if (!node.child || node.child.length === 0) { // // 如果当前节点没有子节点,说明是最里层的节点 // return node.map === false; // } else { // // 如果当前节点有子节点,递归遍历所有子节点 // let flag = false; //子节点是否存在false // for (let i = 0; i < node.child.length; i++) { // if (checkMap(node.child[i])) { // // 如果子节点存在 map 为 false,设置当前节点的 map 为 false // flag = true; // break; // } // } // return flag; // } // } // function setParentMapVal(node:any,val:boolean) { // if (!node.child) { // // 如果当前节点没有子节点,则直接返回 // return; // } // for (let item of node.child) { // // 递归处理子节点,将子节点的 map 属性改为 false // node.map = val, // setParentMapVal(item,val); // } // } // const newData = resp.map((item: any) => { // const flag = checkMap(item); // console.log({flag}); // if(flag){ // //将所有父级map改为false // setParentMapVal(item,false); // }else{ // setParentMapVal(item,true); // } // return item; // }); set_treeData(resp); } const tableDataSearchHandle = (paramName: string) => { set_tableDataFilterParams({ ...tableDataFilterParams, [`${paramName}`]: tableDataSearchKeywords }) } useEffect(() => { if (currentSelectedTreeNode && currentSelectedTreeNode.unitType) { tableRef.current?.reload(); } }, [currentSelectedTreeNode]); useEffect(() => { //初始化左侧树结构数据后 if (currentSelectedTreeNode) return; if (treeData?.length > 0) { if (treeData[0].child && treeData[0].child.length > 0) { const [node, nodeParent] = getDeepestTreeData(treeData[0], 'child'); console.log({currentSelectedTreeNode}); set_currentSelectedTreeNode(node); setExpandedKeys([nodeParent.code]); } } }, [treeData]); useEffect(() => { set_tableColumn(column as ProColumns[]); getTreeReqFunc(); }, []); return (
} />
{ treeData && treeData.length > 0 && currentSelectedTreeNode && ( null} titleRender={ (nodeData: any) => { const strTitle = nodeData.name as string; const index = strTitle.indexOf(searchValue); const beforeStr = strTitle.substring(0, index); const afterStr = strTitle.slice(index + searchValue.length); const title = index > -1 ? ( {beforeStr} {searchValue} {afterStr} ) : ( {strTitle} ); return
{title} {!nodeData.map&&}
} } defaultSelectedKeys={[treeData[0].child[0].code]} treeData={treeData as unknown as DataNode[]} // treeData={treeDataNew} switcherIcon={(props: any) => { const { expanded } = props; return !expanded ? : }} /> ) }
{/*
*/}
检索: { set_tableDataSearchKeywords(e.target.value); if (e.target.value.length == 0) { set_tableDataFilterParams({ ...tableDataFilterParams, deptName: '' }); } }} suffix={ tableDataSearchHandle('deptName')} /> } onPressEnter={(e) => { set_tableDataFilterParams({ ...tableDataFilterParams, deptName: (e.target as HTMLInputElement).value }); }} />
addHandle()}>添加
{currentSelectedTreeNode && getTableData('CHARGE', params, sort, filter)} />}
); }; export default CheckUnitDepMap;