index.tsx 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948
  1. /*
  2. * @Author: code4eat awesomedema@gmail.com
  3. * @Date: 2022-12-16 09:42:52
  4. * @LastEditors: code4eat awesomedema@gmail.com
  5. * @LastEditTime: 2023-07-24 09:30:42
  6. * @FilePath: /BudgetManaSystem/src/pages/budgetMana/monthlySet/index.tsx
  7. * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
  8. */
  9. import BMSPagecontainer from '@/components/BMSPageContainer';
  10. import { useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
  11. import './style.less';
  12. import { Tree, TreeProps, Tabs, Input, Modal, Transfer, Popconfirm, message, Popover } from 'antd';
  13. import { DataNode } from 'antd/es/tree';
  14. import expandedIcon from '../../../../static/treenode_open.png';
  15. import closeIcon from '../../../../static/treenode_collapse.png';
  16. import { BMSTable } from '@/components/BMSTable';
  17. import { ActionType, ProColumns, ProColumnType } from '@ant-design/pro-components';
  18. import { createFromIconfontCN } from '@ant-design/icons';
  19. import { checkRequest, delPersonRequest, generateDataRequest, getDepInfoTableData, getPersonInfoTableData, getProjectInfoTableData, getTotalEmps, getTransactionInfo, getTreeData, getTreeDataRespType, jixiaoDataImport, PersonInfoTableDataType, saveEmpsRequest } from './service';
  20. import { TransferDirection, TransferItem, TransferProps } from 'antd/es/transfer';
  21. import { getComputeDate } from '@/pages/Home/service';
  22. import 'dayjs/locale/zh-cn';
  23. import locale from 'antd/es/date-picker/locale/zh_CN';
  24. import { getCurrentCheckStatus } from '@/services/auth';
  25. import React from 'react';
  26. import DirectoryTree from 'antd/es/tree/DirectoryTree';
  27. import { getDeepestTreeData } from '@/utils/tooljs';
  28. import { ColumnsType, TableRowSelection } from 'antd/es/table/interface';
  29. import { difference } from 'lodash';
  30. import '../../../../src/utils/zhongtaiA'
  31. import { getJiezhuanStatus } from '../monthlySet/service';
  32. const IconFont = createFromIconfontCN({
  33. scriptUrl: '',
  34. });
  35. const SearchIcon = createFromIconfontCN({
  36. scriptUrl: '',
  37. });
  38. const depInfoTableColumn = [
  39. {
  40. title: '科室代码',
  41. dataIndex: 'deptCode',
  42. key: 'deptCode',
  43. },
  44. {
  45. title: '科室名称',
  46. dataIndex: 'deptName',
  47. key: 'deptName',
  48. },
  49. {
  50. title: '类型',
  51. dataIndex: 'deptTypeName',
  52. key: 'deptTypeName',
  53. },
  54. ]
  55. const chargeInfoTableColumn = [
  56. {
  57. title: '项目代码',
  58. dataIndex: 'itemCode',
  59. key: 'itemCode',
  60. },
  61. {
  62. title: '项目名称',
  63. dataIndex: 'itemName',
  64. key: 'itemName',
  65. },
  66. {
  67. title: '类型',
  68. dataIndex: 'itemType',
  69. key: 'itemType',
  70. },
  71. {
  72. title: '点值',
  73. dataIndex: 'itemPoint',
  74. key: 'itemPoint',
  75. },
  76. {
  77. title: '核心',
  78. dataIndex: 'coreFlag',
  79. key: 'coreFlag',
  80. render: (_: any) => {
  81. return _ == 1 ? '是' : '否'
  82. }
  83. },
  84. ]
  85. export type TableListItem = {
  86. key: number;
  87. name: string;
  88. };
  89. const MonthlyInfoCheck: React.FC = () => {
  90. const [treeData, set_treeData] = useState<getTreeDataRespType[]>([]);
  91. const [tableColumn, set_tableColumn] = useState<ProColumns[]>([]);
  92. const [currentSelectedTreeNode, set_currentSelectedTreeNode] = useState<any | undefined>();
  93. const [currentSelectedTabKey, set_currentSelectedTabKey] = useState<string>('1');
  94. const [currentComputeDate, set_currentComputeDate] = useState<string | undefined>();
  95. const [ifShowTip, set_ifShowTip] = useState(false);
  96. const [auditType, set_auditType] = useState('0');
  97. const [empInfoSearchKeywords, set_empInfoSearchKeywords] = useState('');
  98. const [empFilterParams, set_empFilterParams] = useState<any | undefined>(undefined);
  99. const [depInfoSearchKeywords, set_depInfoSearchKeywords] = useState('');
  100. const [depFilterParams, set_depFilterParams] = useState<any | undefined>(undefined);
  101. const [itemInfoSearchKeywords, set_itemInfoSearchKeywords] = useState('');
  102. const [itemFilterParams, set_itemFilterParams] = useState<any | undefined>(undefined);
  103. const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);
  104. const [searchValue, setSearchValue] = useState('');
  105. const [autoExpandParent, setAutoExpandParent] = useState(true);
  106. const [ifBanAllAction, set_ifBanAllAction] = useState(true); //是否掩藏所有操作
  107. const tableRef = useRef<ActionType>();
  108. const personTableColumn = [
  109. {
  110. title: '工号',
  111. dataIndex: 'empNo',
  112. key: 'empNo',
  113. },
  114. {
  115. title: '姓名',
  116. dataIndex: 'empName',
  117. key: 'empName',
  118. },
  119. {
  120. title: '岗位层级',
  121. dataIndex: 'positionLevelName',
  122. key: 'positionLevelName',
  123. },
  124. {
  125. title: '职务',
  126. dataIndex: 'jobTitleName',
  127. key: 'jobTitleName',
  128. },
  129. {
  130. title: '岗位系数',
  131. dataIndex: 'positionRate',
  132. key: 'positionRate',
  133. },
  134. {
  135. title: '年资',
  136. dataIndex: 'seniority',
  137. key: 'seniority',
  138. },
  139. ];
  140. const delPersonHandle = async (record: any) => {
  141. const { props: { record: { id } } } = record;
  142. const currentComputeDateResp = await getComputeDate();
  143. if (currentComputeDateResp) {
  144. const resp = await delPersonRequest({
  145. computeDate: currentComputeDateResp,
  146. id: id
  147. });
  148. if (resp) {
  149. tableRef.current?.reload();
  150. }
  151. }
  152. }
  153. const onSelect: TreeProps['onSelect'] = (selectedKeys, info) => {
  154. // console.log('selected', selectedKeys, info);
  155. const { node } = info;
  156. set_currentSelectedTreeNode(node);
  157. };
  158. const getCurrentComputeDate = async () => {
  159. const resp = await getComputeDate();
  160. set_currentComputeDate(resp);
  161. }
  162. const onTabChange = (activeKey: string) => {
  163. set_currentSelectedTabKey(activeKey);
  164. }
  165. const getJiezhuanStatusHandle =async () => {
  166. const resp = await getJiezhuanStatus(currentComputeDate as string);
  167. if(resp == 2){
  168. set_ifBanAllAction(true);
  169. }else{
  170. set_ifBanAllAction(false);
  171. }
  172. }
  173. const getTableData = async (type: 'PERSON' | 'DEP' | 'CHARGE', params: any, sort: any, filter: any) => {
  174. // console.log({ currentSelectedTreeNode });
  175. // console.log({ params, sort, filter });
  176. if (currentSelectedTreeNode && currentComputeDate) {
  177. if (type == 'PERSON') {
  178. const resp = await getPersonInfoTableData({
  179. computeDate: currentComputeDate,
  180. unitCode: currentSelectedTreeNode.code,
  181. ...params,
  182. });
  183. if (resp) {
  184. return {
  185. data: resp.list,
  186. success: true,
  187. total: resp.totalCount,
  188. pageSize: resp.pageSize,
  189. totalPage: resp.totalPage,
  190. }
  191. }
  192. return {
  193. data: [],
  194. success: true
  195. }
  196. }
  197. if (type == 'DEP') {
  198. const resp = await getDepInfoTableData({
  199. computeDate: currentComputeDate,
  200. unitCode: currentSelectedTreeNode.code,
  201. ...params
  202. });
  203. if (resp) {
  204. return {
  205. data: resp.list,
  206. success: true,
  207. total: resp.totalCount,
  208. pageSize: resp.pageSize,
  209. totalPage: resp.totalPage,
  210. }
  211. }
  212. return {
  213. data: [],
  214. success: true
  215. }
  216. }
  217. if (type == 'CHARGE') {
  218. const resp = await getProjectInfoTableData({
  219. computeDate: currentComputeDate,
  220. unitCode: currentSelectedTreeNode.code,
  221. ...params
  222. });
  223. if (resp) {
  224. return {
  225. data: resp.list,
  226. success: true,
  227. total: resp.totalCount,
  228. pageSize: resp.pageSize,
  229. totalPage: resp.totalPage,
  230. }
  231. }
  232. return {
  233. data: [],
  234. success: true
  235. }
  236. }
  237. }
  238. return []
  239. }
  240. interface TableTransferProps extends TransferProps<TransferItem> {
  241. leftColumns: ColumnsType<any>;
  242. rightColumns: ColumnsType<any>;
  243. }
  244. const transferTableColumn = [
  245. {
  246. title: '工号',
  247. dataIndex: 'empNo',
  248. },
  249. {
  250. title: '姓名',
  251. dataIndex: 'name',
  252. },
  253. ]
  254. const addPersonFunc = () => {
  255. const ref = React.createRef<{ save: any }>();
  256. Modal.confirm({
  257. title: '添加人员',
  258. icon: <></>,
  259. width: 640,
  260. okText: '确定',
  261. centered: true,
  262. cancelText: '取消',
  263. content: <TableTransfer
  264. ref={ref}
  265. leftColumns={transferTableColumn}
  266. rightColumns={transferTableColumn}
  267. ></TableTransfer>,
  268. onOk: () => {
  269. return ref.current && ref.current.save();
  270. }
  271. })
  272. }
  273. const TableTransfer = React.forwardRef(({ leftColumns, rightColumns, ...restProps }: TableTransferProps, ref) => {
  274. const [_data, _set_data] = useState<any>();
  275. const [targetKeys, setTargetKeys] = useState<string[]>([]);
  276. const [datasource, set_datasource] = useState<any[]>([]);
  277. const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
  278. //获取单元
  279. const getFuncList = async () => {
  280. const resp = await getTotalEmps({
  281. computeDate: currentComputeDate as string,
  282. unitCode: currentSelectedTreeNode.code
  283. });
  284. if (resp) {
  285. //_set_data(resp);
  286. const allData = resp.allEmployees.concat(resp.checkEmployees);
  287. set_datasource(allData);
  288. const defaultSelctedkeys = resp.checkEmployees.map((item: any) => item.empNo);
  289. setTargetKeys(defaultSelctedkeys);
  290. }
  291. }
  292. const onChange = (nextTargetKeys: string[]) => {
  293. setTargetKeys(nextTargetKeys);
  294. };
  295. const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => {
  296. //console.log('sourceSelectedKeys:', sourceSelectedKeys,'targetSelectedKeys:',targetSelectedKeys);
  297. setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
  298. };
  299. useImperativeHandle(ref, () => ({
  300. save: async () => {
  301. const items = datasource.filter(a => targetKeys.includes(a.empNo));
  302. const resp = await saveEmpsRequest(items);
  303. if (resp) {
  304. tableRef.current?.reload();
  305. }
  306. }
  307. }));
  308. useEffect(() => {
  309. getFuncList();
  310. }, [])
  311. return (
  312. <Transfer className='TableTransfer' showSearch
  313. titles={['待选项', '已选项']}
  314. locale={{
  315. itemUnit: '项',
  316. itemsUnit: '项',
  317. searchPlaceholder: '请输入',
  318. }}
  319. oneWay={true}
  320. onChange={onChange}
  321. onSelectChange={onSelectChange}
  322. dataSource={datasource}
  323. rowKey={record => record.empNo}
  324. targetKeys={targetKeys}
  325. selectedKeys={selectedKeys}
  326. filterOption={(inputValue, item) => {
  327. return item.name!.indexOf(inputValue) !== -1
  328. }}
  329. >
  330. {({
  331. direction,
  332. filteredItems,
  333. onItemSelectAll,
  334. onItemSelect,
  335. selectedKeys: listSelectedKeys,
  336. disabled: listDisabled,
  337. }) => {
  338. // console.log({ filteredItems, listSelectedKeys,direction });
  339. const columns = direction === 'left' ? leftColumns : rightColumns;
  340. const rowSelection: TableRowSelection<TransferItem> = {
  341. getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }),
  342. onSelectAll(selected, selectedRows) {
  343. const treeSelectedKeys = selectedRows.map(({ empNo }) => empNo);
  344. const diffKeys = selected
  345. ? difference(treeSelectedKeys, listSelectedKeys)
  346. : difference(listSelectedKeys, treeSelectedKeys);
  347. onItemSelectAll(diffKeys as string[], selected);
  348. },
  349. onSelect({ empNo }, selected) {
  350. onItemSelect(empNo as string, selected);
  351. },
  352. selectedRowKeys: listSelectedKeys,
  353. };
  354. return (
  355. <BMSTable
  356. rowSelection={rowSelection}
  357. columns={columns as TransferItem[]}
  358. dataSource={filteredItems}
  359. size="small"
  360. bordered={false}
  361. rowKey={'empNo'}
  362. pagination={{ showTitle: false, pageSize: 9, showLessItems: false, simple: true, showTotal: () => false }}
  363. tableAlertRender={false}
  364. style={{ pointerEvents: listDisabled ? 'none' : undefined }}
  365. onRow={({ empNo, disabled: itemDisabled }) => ({
  366. onClick: () => {
  367. if (itemDisabled || listDisabled) return;
  368. onItemSelect(empNo as string, !listSelectedKeys.includes(empNo as string));
  369. },
  370. })}
  371. />
  372. );
  373. }}
  374. </Transfer>
  375. )
  376. })
  377. const confirmGenerateHandle = async (type: number) => {
  378. const resp = await generateDataRequest({
  379. computeDate: currentComputeDate as string,
  380. generateType: type
  381. });
  382. if (resp) {
  383. message.success('生成数据成功');
  384. tableRef.current?.reload();
  385. } else {
  386. message.success('生成数据错误!');
  387. }
  388. }
  389. const generateFunc = (type: number) => {
  390. let msg = '';
  391. if (type == 1) msg = '生成操作会根据基础设定的单元人员对照信息重新生成数据,手动调整的人员信息将会丢失,确定继续生成操作?';
  392. if (type == 2) msg = '生成操作会覆盖现有的科室数据,确定继续生成操作?';
  393. if (type == 3) msg = '生成操作会覆盖现有的收费项目数据,确定继续生成操作?';
  394. Modal.confirm({
  395. title: '注意',
  396. content: msg,
  397. okText: '确定',
  398. cancelText: '取消',
  399. onOk: () => confirmGenerateHandle(type)
  400. })
  401. }
  402. const searchEmpHandle = () => {
  403. set_empFilterParams({
  404. empInfo: empInfoSearchKeywords
  405. })
  406. // tableRef.current?.reload();
  407. }
  408. const searchDepHandle = () => {
  409. set_depFilterParams({
  410. deptName: depInfoSearchKeywords
  411. })
  412. }
  413. const searchItemHandle = () => {
  414. set_itemFilterParams({
  415. itemName: itemInfoSearchKeywords
  416. })
  417. }
  418. const checkHandle = async (type: string) => {
  419. const resp = await checkRequest({
  420. computeDate: currentComputeDate as string,
  421. auditType: type == '0' ? '1' : '0', //审核类型 1审核 0取消审核
  422. });
  423. if (resp) {
  424. if (type == '0') {
  425. message.success('审核提交成功!');
  426. set_auditType('1');
  427. }
  428. if (type == '1') {
  429. message.success('取消审核提交成功!');
  430. set_auditType('0');
  431. }
  432. }
  433. }
  434. const getCheckStatus = async (computeDate: string) => {
  435. const resp = await getCurrentCheckStatus(computeDate);
  436. if (resp) {
  437. set_auditType(`${resp}`); //0 未审核 1 已审核
  438. }
  439. }
  440. const dataList: any[] = [];
  441. const getParentKey = (key: React.Key, tree: any[]): React.Key => {
  442. let parentKey: React.Key;
  443. for (let i = 0; i < tree.length; i++) {
  444. const node = tree[i];
  445. if (node.child) {
  446. if (node.child.some((item: { code: React.Key; }) => item.code === key)) {
  447. parentKey = node.code;
  448. } else if (getParentKey(key, node.child)) {
  449. parentKey = getParentKey(key, node.child);
  450. }
  451. }
  452. }
  453. return parentKey!;
  454. };
  455. const onTreeSearchKeyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  456. const { value } = e.target;
  457. const newExpandedKeys = dataList
  458. .map((item) => {
  459. if (item.name.indexOf(value) > -1) {
  460. return getParentKey(item.code, treeData);
  461. }
  462. return null;
  463. });
  464. const b = newExpandedKeys.filter((item, i, self) => item && self.indexOf(item) === i);
  465. setExpandedKeys(newExpandedKeys as React.Key[]);
  466. setSearchValue(value);
  467. setAutoExpandParent(true);
  468. }
  469. const onExpand = (newExpandedKeys: React.Key[]) => {
  470. setExpandedKeys(newExpandedKeys);
  471. setAutoExpandParent(false);
  472. };
  473. const generateList = (data: getTreeDataRespType[]) => {
  474. for (let i = 0; i < data.length; i++) {
  475. const node = data[i];
  476. const { code, name } = node;
  477. dataList.push({ code: code, name: name });
  478. if (node.child) {
  479. generateList(node.child);
  480. }
  481. }
  482. };
  483. generateList(treeData as any);
  484. const getTreeReqFunc = async (computeDate: string) => {
  485. const resp = await getTreeData(computeDate);
  486. set_treeData(resp);
  487. }
  488. const importHandle = async () => {
  489. const resp = await jixiaoDataImport(currentComputeDate as string);
  490. if (resp) {
  491. message.success('操作成功!');
  492. tableRef.current?.reload();
  493. }
  494. }
  495. const checkBtnHandle = () => {
  496. //点击检查按钮事件
  497. const _tableColumns: ProColumns[] = [
  498. {
  499. title: '异动类型',
  500. width: 120,
  501. dataIndex: 'messageType'
  502. },
  503. {
  504. title: '异动信息',
  505. dataIndex: 'message',
  506. ellipsis: true
  507. }
  508. ];
  509. const getInfo = async () => {
  510. const resp = await getTransactionInfo(currentComputeDate as string);
  511. if (resp) {
  512. return {
  513. data: resp,
  514. success: true,
  515. }
  516. }
  517. return []
  518. }
  519. Modal.info({
  520. title: '异动详情',
  521. icon: <></>,
  522. width: 640,
  523. okText: '知道了',
  524. centered: true,
  525. cancelText: '',
  526. content: (
  527. <BMSTable columns={[..._tableColumns]} request={async () => getInfo()} />
  528. ),
  529. onOk: () => {
  530. // return ref.current && ref.current.save();
  531. }
  532. })
  533. }
  534. useEffect(() => {
  535. if (currentComputeDate) {
  536. getTreeReqFunc(currentComputeDate);
  537. getCheckStatus(currentComputeDate);
  538. getJiezhuanStatusHandle();
  539. }
  540. }, [currentComputeDate]);
  541. useEffect(() => {
  542. tableRef.current?.reload();
  543. }, [currentSelectedTreeNode]);
  544. useEffect(() => {
  545. if (currentSelectedTabKey == '1') {
  546. set_tableColumn(personTableColumn as ProColumns[]);
  547. }
  548. if (currentSelectedTabKey == '2') {
  549. set_tableColumn(depInfoTableColumn as ProColumns[]);
  550. }
  551. if (currentSelectedTabKey == '3') {
  552. set_tableColumn(chargeInfoTableColumn as ProColumns[]);
  553. }
  554. }, [currentSelectedTabKey]);
  555. useEffect(() => {
  556. //初始化左侧树结构数据后
  557. if (treeData?.length > 0) {
  558. if (treeData[0].child && treeData[0].child.length > 0) {
  559. const [node, nodeParent] = getDeepestTreeData(treeData[0], 'child');
  560. set_currentSelectedTreeNode(node);
  561. setExpandedKeys([nodeParent.code]);
  562. }
  563. }
  564. }, [treeData]);
  565. useEffect(() => {
  566. set_tableColumn(personTableColumn as ProColumns[]);
  567. getCurrentComputeDate();
  568. }, []);
  569. return (
  570. <div className='MonthlyInfoCheck'>
  571. <div className='leftTree'>
  572. <div className='search'>
  573. <Input
  574. className='searchInput'
  575. placeholder="请输入类目名称"
  576. size='small'
  577. allowClear
  578. style={{ marginBottom: 16 }}
  579. onChange={onTreeSearchKeyChange}
  580. suffix={
  581. <SearchIcon type='iconsousuo' />
  582. }
  583. />
  584. </div>
  585. {
  586. treeData && treeData.length > 0 && currentSelectedTreeNode && (
  587. <DirectoryTree
  588. fieldNames={{ title: 'name', key: 'code', children: 'child' }}
  589. rootStyle={{ height: '100%', paddingBottom: 50, overflowY: 'scroll', overflowX: 'hidden' }}
  590. onSelect={onSelect}
  591. onExpand={onExpand}
  592. expandedKeys={expandedKeys}
  593. autoExpandParent={autoExpandParent}
  594. selectedKeys={[currentSelectedTreeNode.code]}
  595. blockNode={true}
  596. icon={() => null}
  597. titleRender={
  598. (nodeData: any) => {
  599. const strTitle = nodeData.name as string;
  600. const index = strTitle.indexOf(searchValue);
  601. const beforeStr = strTitle.substring(0, index);
  602. const afterStr = strTitle.slice(index + searchValue.length);
  603. const title =
  604. index > -1 ? (
  605. <span>
  606. {beforeStr}
  607. <span className="site-tree-search-value" style={{ color: 'red', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{searchValue}</span>
  608. {afterStr}
  609. </span>
  610. ) : (
  611. <span className='strTitle'>{strTitle}</span>
  612. );
  613. return <div style={{
  614. display: 'flex', flexDirection: 'row',
  615. width: '100%',
  616. justifyContent: 'flex-start', alignItems: 'center', height: 32,
  617. borderRadius: '4px',
  618. overflow: 'hidden',
  619. color: '#17181A',
  620. textOverflow: 'ellipsis',
  621. whiteSpace: 'nowrap'
  622. }}>{title}</div>
  623. }
  624. }
  625. defaultSelectedKeys={[treeData[0].child[0].code]}
  626. treeData={treeData as unknown as DataNode[]}
  627. // treeData={treeDataNew}
  628. switcherIcon={(props: any) => {
  629. const { expanded } = props;
  630. return !expanded ? <img style={{ width: 20, height: 20, position: 'relative', top: 5 }} src={expandedIcon} /> : <img style={{ width: 20, height: 20, position: 'relative', top: 5 }} src={closeIcon} />
  631. }}
  632. />
  633. )
  634. }
  635. </div>
  636. {/* <div style={{width:16,height:'92vh',background:'#F5F7FA'}}></div> */}
  637. <div className='rightContent'>
  638. <BMSPagecontainer title={`核算年月:${currentComputeDate}`} ghost>
  639. {
  640. !ifBanAllAction && (
  641. <>
  642. <div className={auditType == '0' ? 'importBtn disabled' : 'importBtn '} onClick={() => importHandle()} style={{ right: auditType == '0' ? '64px' : '93px' }}>绩效数据导入</div>
  643. <div className='checkBtn' onClick={() => checkHandle(`${auditType}`)}>{auditType == '0' ? '审核' : '取消审核'}</div>
  644. {!ifBanAllAction&&(
  645. <div className='midLine'>
  646. <span onClick={() => checkBtnHandle()}>点击检查</span>
  647. 是否有未对照的人员信息、未对照的科室信息及未设置的收费项目信息
  648. </div>
  649. )}
  650. </>
  651. )
  652. }
  653. <Tabs
  654. defaultActiveKey="1"
  655. onChange={onTabChange}
  656. items={[
  657. {
  658. label: `人员信息`,
  659. key: '1',
  660. },
  661. {
  662. label: `科室信息`,
  663. key: '2',
  664. },
  665. {
  666. label: `收费项目信息`,
  667. key: '3',
  668. },
  669. ]}
  670. />
  671. {
  672. currentSelectedTabKey == '1' && (
  673. <div className='tabContent'>
  674. <div className='tableToolbar'>
  675. <div className='search'>
  676. <span>人员:</span><Input className='searchInput' allowClear onChange={(e) => {
  677. set_empInfoSearchKeywords(e.target.value)
  678. if (e.target.value.length == 0) {
  679. set_empFilterParams({
  680. ...empFilterParams,
  681. empInfo: ''
  682. });
  683. }
  684. }} placeholder="输入工号/姓名" suffix={
  685. <IconFont type="iconsousuo" onClick={() => searchEmpHandle()} />
  686. } />
  687. </div>
  688. {
  689. !ifBanAllAction && (
  690. <Popover open={ifShowTip} content={'当前处于审核中,无法操作!'} >
  691. <div className={auditType != '0' ? 'btnGroup disabled' : 'btnGroup'}
  692. onMouseEnter={() => auditType == '0' ? set_ifShowTip(false) : set_ifShowTip(true)}
  693. onMouseLeave={() => set_ifShowTip(false)}
  694. >
  695. {/* <span key="1">调整</span> */}
  696. <span key="2" onClick={auditType == '0' ? () => generateFunc(1) : () => { }}>生成</span>
  697. <span key="3" onClick={auditType == '0' ? () => addPersonFunc() : () => { }}>添加</span>
  698. </div>
  699. </Popover>
  700. )
  701. }
  702. </div>
  703. {currentSelectedTreeNode && <BMSTable params={empFilterParams} actionRef={tableRef} rowKey='empNo' columns={(auditType == '0' && !ifBanAllAction) ? [...tableColumn, {
  704. title: '操作',
  705. key: 'option',
  706. valueType: 'option',
  707. render: (record: any) => [
  708. <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delPersonHandle(record)}>
  709. <a key={'del'}>删除</a>
  710. </Popconfirm>
  711. ],
  712. },] : [...tableColumn]} request={(params, sort, filter) => getTableData('PERSON', params, sort, filter)} />}
  713. </div>
  714. )
  715. }
  716. {
  717. currentSelectedTabKey == '2' && (
  718. <div className='tabContent'>
  719. <div className='tableToolbar'>
  720. <div className='search'>
  721. <span>科室名称:</span><Input className='searchInput' allowClear placeholder="请输入" onChange={(e) => {
  722. set_depInfoSearchKeywords(e.target.value);
  723. if (e.target.value.length == 0) {
  724. set_depFilterParams({
  725. ...depFilterParams,
  726. deptName: ''
  727. });
  728. }
  729. }} suffix={
  730. <IconFont type="iconsousuo" onClick={() => searchDepHandle()} />
  731. } />
  732. </div>
  733. {
  734. !ifBanAllAction && (
  735. <>
  736. <Popover open={ifShowTip} content={'当前处于审核中,无法操作!'} >
  737. <div className={auditType != '0' ? 'btnGroup disabled' : 'btnGroup'}
  738. onMouseEnter={() => auditType == '0' ? set_ifShowTip(false) : set_ifShowTip(true)}
  739. onMouseLeave={() => set_ifShowTip(false)}
  740. >
  741. {/* <span key="1">调整</span> */}
  742. <span key="2" onClick={auditType == '0' ? () => generateFunc(2) : () => { }}>生成</span>
  743. </div>
  744. </Popover>
  745. </>
  746. )
  747. }
  748. </div>
  749. {currentSelectedTreeNode && <BMSTable actionRef={tableRef} params={depFilterParams} rowKey='deptCode' columns={tableColumn} request={(params, sort, filter) => getTableData('DEP', params, sort, filter)} />}
  750. </div>
  751. )
  752. }
  753. {
  754. currentSelectedTabKey == '3' && (
  755. <div className='tabContent'>
  756. <div className='tableToolbar'>
  757. <div className='search'>
  758. <span>项目名称:</span><Input className='searchInput' allowClear placeholder="请输入" onChange={(e) => {
  759. set_itemInfoSearchKeywords(e.target.value);
  760. if (e.target.value.length == 0) {
  761. set_depFilterParams({
  762. ...itemFilterParams,
  763. itemName: ''
  764. });
  765. }
  766. }} suffix={
  767. <IconFont type="iconsousuo" onClick={() => searchItemHandle()} />
  768. } />
  769. </div>
  770. {
  771. !ifBanAllAction && (
  772. <Popover open={ifShowTip} content={'当前处于审核中,无法操作!'} >
  773. <div className={auditType != '0' ? 'btnGroup disabled' : 'btnGroup'}
  774. onMouseEnter={() => auditType == '0' ? set_ifShowTip(false) : set_ifShowTip(true)}
  775. onMouseLeave={() => set_ifShowTip(false)}
  776. >
  777. {/* <span key="1">调整</span> */}
  778. <span key="2" onClick={auditType == '0' ? () => generateFunc(3) : () => { }}>生成</span>
  779. </div>
  780. </Popover>
  781. )
  782. }
  783. </div>
  784. {currentSelectedTreeNode && <BMSTable actionRef={tableRef} params={itemFilterParams} rowKey='id' columns={tableColumn} request={(params, sort, filter) => getTableData('CHARGE', params, sort, filter)} />}
  785. </div>
  786. )
  787. }
  788. </BMSPagecontainer>
  789. </div>
  790. </div>
  791. );
  792. };
  793. export default MonthlyInfoCheck;