index.tsx 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475
  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-06 15:22:46
  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 { Fragment, Key, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
  11. import './style.less';
  12. import { Tree, TreeProps, Tabs, Input, Modal, Transfer, Popconfirm, message, Popover, Select } 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, ModalForm, ProColumns, ProColumnType, ProFormDigit, ProFormSelect } from '@ant-design/pro-components';
  18. import { createFromIconfontCN } from '@ant-design/icons';
  19. import { delRequest, getIndicTableData, getBillingItemTableData, getTreeDataRespType, getTreeData, getAllCheckUnit, saveCopyRequest, getAllCheckUnitProjectData, addBillingItemData, editBillingItemData, addIndicItemData, editIndicItemData, getNonCheckTableData, addNonCheckItemData, getCostItemsTableData, addCostItemData, editCostItemData } from './service';
  20. import { TransferItem, TransferProps } from 'antd/es/transfer';
  21. import { getComputeDate } from '@/pages/Home/service';
  22. import 'dayjs/locale/zh-cn';
  23. import React from 'react';
  24. import DirectoryTree from 'antd/es/tree/DirectoryTree';
  25. import { findAllParents, findParentCodes, getDeepestTreeData, getNodesWithChildren } from '@/utils/tooljs';
  26. import { ColumnsType, TableRowSelection } from 'antd/es/table/interface';
  27. import { difference } from 'lodash';
  28. import { getBillProjectData } from '../bilingProjectMana/service';
  29. import { getIndicProjectTableData } from '../indicProjectMana/service';
  30. import { getNonCheckProjectTableData } from '../nonAssessmentProjectMana/service';
  31. import '../../../../utils/zhongtaiB';
  32. import { getCostProjectTable } from '../costIncomeProjectSet/service';
  33. const IconFont = createFromIconfontCN({
  34. scriptUrl: '',
  35. });
  36. const SearchIcon = createFromIconfontCN({
  37. scriptUrl: '',
  38. });
  39. export type TableListItem = {
  40. key: number;
  41. name: string;
  42. };
  43. interface TreeNode {
  44. id: number;
  45. name: string;
  46. code?: string;
  47. children?: TreeNode[];
  48. }
  49. function getAllLeafCodes(data: TreeNode[]): string[] {
  50. let result: string[] = [];
  51. for (let i = 0; i < data.length; i++) {
  52. const node = data[i];
  53. if (node.children) {
  54. result = result.concat(getAllLeafCodes(node.children));
  55. } else if (node.code) {
  56. result.push(node.code);
  57. }
  58. }
  59. return result;
  60. }
  61. const CheckUnitProjectSet: React.FC = () => {
  62. const [treeData, set_treeData] = useState<getTreeDataRespType[]>([]);
  63. const [tableColumn, set_tableColumn] = useState<ProColumns[]>([]);
  64. const [currentSelectedTreeNode, set_currentSelectedTreeNode] = useState<any | undefined>();
  65. const [currentSelectedTabKey, set_currentSelectedTabKey] = useState<string>('1');
  66. const [currentComputeDate, set_currentComputeDate] = useState<string | undefined>();
  67. const [currentEditRow, set_currentEditRow] = useState<any>(undefined);
  68. const [searchKeywords, set_searchKeywords] = useState('');
  69. const [searchParams, set_searchParams] = useState<any>({});
  70. const [expandedKeys, setExpandedKeys] = useState<React.Key[]>([]);
  71. const [searchValue, setSearchValue] = useState('');
  72. const [autoExpandParent, setAutoExpandParent] = useState(true);
  73. const [ifEdit, set_ifEdit] = useState(false);
  74. const [ifShowModal, set_ifShowModal] = useState(false);
  75. const ref = React.createRef<{ save: any; getSelectedKeys: any }>();
  76. const [currentEditCoreFlag, set_currentEditCoreFlag] = useState(0);
  77. const [tableSelecterColumn, set_tableSelecterColumn] = useState<ProColumns[]>([]);
  78. const [isCopy, set_isCopy] = useState(false);
  79. const tableRef = useRef<ActionType>();
  80. const billingTableColumn: ProColumns[] = [
  81. {
  82. title: '项目代码',
  83. dataIndex: 'itemPointCode',
  84. renderText(text, record, index, action) {
  85. return <span style={{ display: 'inline-block', height: '26px', lineHeight: '26px' }}>{text}</span>
  86. },
  87. ellipsis: true
  88. },
  89. {
  90. title: '项目名称',
  91. dataIndex: 'itemName',
  92. ellipsis: true
  93. },
  94. {
  95. title: '项目类别',
  96. dataIndex: 'itemType',
  97. ellipsis: true
  98. },
  99. {
  100. title: '点值',
  101. width: 120,
  102. ellipsis: true,
  103. dataIndex: 'orderPointValue',
  104. renderText: (text, record, index, action) => {
  105. if (ifEdit && currentEditRow?.id == record.id) {
  106. return <ProFormDigit noStyle fieldProps={{
  107. defaultValue: text, onChange(value) {
  108. // console.log({value,currentEditRow});
  109. if (value && currentEditRow) {
  110. set_currentEditRow({ ...currentEditRow, orderPointValue: value })
  111. }
  112. },
  113. }} width={80} />
  114. } else {
  115. return <span style={{ display: 'inline-block', width: 80 }}>{text}</span>
  116. }
  117. },
  118. },
  119. {
  120. title: '类型',
  121. width: 120,
  122. ellipsis: true,
  123. dataIndex: 'coreFlagName',
  124. renderText: (text, record, index, action) => {
  125. if (ifEdit && currentEditRow && currentEditRow?.id == record.id) {
  126. return <Select defaultValue={record.coreFlag} style={{ width: '100%' }} options={
  127. [
  128. { label: '核心', value: 1 }, { label: '非核心', value: 0 }, { label: '不计', value: 2 }
  129. ]
  130. } onChange={(a, b) => { set_currentEditCoreFlag(a) }} />
  131. } else {
  132. return <span style={{ display: 'inline-block', width: 120 }}>{text}</span>
  133. }
  134. },
  135. }
  136. ];
  137. const indicTableColumn: ProColumns[] = [
  138. {
  139. title: '项目代码',
  140. dataIndex: 'indicatorCode',
  141. ellipsis: true,
  142. renderText(text, record, index, action) {
  143. return <span style={{ display: 'inline-block', height: '26px', lineHeight: '26px' }}>{text}</span>
  144. },
  145. },
  146. {
  147. title: '项目名称',
  148. ellipsis: true,
  149. dataIndex: 'indicatorName',
  150. },
  151. {
  152. title: '类型',
  153. ellipsis: true,
  154. dataIndex: 'indicatorTypeName',
  155. },
  156. {
  157. title: '定义',
  158. ellipsis: true,
  159. dataIndex: 'indicatorDefinition',
  160. },
  161. {
  162. title: '点值',
  163. width: 120,
  164. ellipsis: true,
  165. dataIndex: 'orderPointValue',
  166. renderText(text, record, index, action) {
  167. if (ifEdit && currentEditRow?.id == record.id) {
  168. return <ProFormDigit noStyle fieldProps={{
  169. defaultValue: text, onChange(value) {
  170. console.log({ value, currentEditRow });
  171. if (value && currentEditRow) {
  172. set_currentEditRow({ ...currentEditRow, orderPointValue: value })
  173. }
  174. },
  175. }} width={80} />
  176. } else {
  177. return <span style={{ display: 'inline-block', width: 80 }}>{text}</span>
  178. }
  179. },
  180. }
  181. ];
  182. const nonCheckTableColumn: ProColumns[] = [
  183. {
  184. title: '项目名称',
  185. ellipsis: true,
  186. dataIndex: 'nonAssessmentName',
  187. renderText(text, record, index, action) {
  188. return <span style={{ display: 'inline-block', height: '26px', lineHeight: '26px' }}>{text}</span>
  189. },
  190. },
  191. {
  192. title: '分配方式',
  193. ellipsis: true,
  194. dataIndex: 'distributionTypeName',
  195. },
  196. {
  197. title: '分配对象',
  198. ellipsis: true,
  199. dataIndex: 'distributionTargetName',
  200. },
  201. {
  202. title: '上限值',
  203. ellipsis: true,
  204. dataIndex: 'ceiling',
  205. },
  206. {
  207. title: '评分项',
  208. width: 260,
  209. dataIndex: 'orderPointValue',
  210. ellipsis: true,
  211. renderText(text, record) {
  212. return record.secondItem ? record.secondItem.reduce((prev: any, cur: any) => `${prev.length > 0 ? prev + '|' : prev}${cur.secondItemName}`, '') : ''
  213. },
  214. }
  215. ];
  216. const costTableColumn: ProColumns[] = [
  217. {
  218. title: '项目名称',
  219. ellipsis: true,
  220. dataIndex: 'name',
  221. // renderText(text, record, index, action) {
  222. // return <span style={{ display: 'inline-block', height: '26px', lineHeight: '26px' }}>{text}</span>
  223. // },
  224. },
  225. {
  226. title: '类型',
  227. ellipsis: true,
  228. dataIndex: 'itemTypeName',
  229. },
  230. {
  231. title: '可控',
  232. ellipsis: true,
  233. dataIndex: 'ctrlFlag',
  234. renderText(text, record, index, action) {
  235. return ifEdit ? <ProFormSelect noStyle fieldProps={{
  236. defaultValue: text, onChange(value, option) {
  237. set_currentEditRow({ ...currentEditRow, ctrlFlag: value })
  238. },
  239. }} options={[{ label: '是', value: 1 }, { label: '否', value: 0 }]} /> : text == 1 ? '是' : '否'
  240. },
  241. },
  242. {
  243. title: '序号',
  244. ellipsis: true,
  245. dataIndex: 'seqNo',
  246. },
  247. ];
  248. const delHandle = async (record: any) => {
  249. const { id } = record;
  250. const resp = await delRequest({ id: id }, currentSelectedTabKey);
  251. if (resp) {
  252. message.success('操作成功');
  253. tableRef.current?.reload();
  254. }
  255. }
  256. const onSelect: TreeProps['onSelect'] = (selectedKeys, info: any) => {
  257. // console.log('selected', selectedKeys, info);
  258. const { node } = info;
  259. if (!node.child) set_currentSelectedTreeNode(node);
  260. };
  261. const getCurrentComputeDate = async () => {
  262. const resp = await getComputeDate();
  263. set_currentComputeDate(resp);
  264. }
  265. const onTabChange = (activeKey: string) => {
  266. set_currentSelectedTabKey(activeKey);
  267. }
  268. const getTableData = async (type: 'BILL' | 'INDIC' | 'NONCHECK' | 'COST', params: any, sort: any, filter: any) => {
  269. // console.log({ currentSelectedTreeNode });
  270. // console.log({ params, sort, filter });
  271. if (currentSelectedTreeNode && currentComputeDate) {
  272. if (type == 'BILL') {
  273. const resp = await getBillingItemTableData({
  274. unitCode: currentSelectedTreeNode.code,
  275. ...params,
  276. });
  277. if (resp) {
  278. return {
  279. data: resp.list,
  280. success: true,
  281. total: resp.totalCount,
  282. pageSize: resp.pageSize,
  283. totalPage: resp.totalPage,
  284. }
  285. }
  286. return {
  287. data: [],
  288. success: true
  289. }
  290. }
  291. if (type == 'INDIC') {
  292. const resp = await getIndicTableData({
  293. unitCode: currentSelectedTreeNode.code,
  294. ...params
  295. });
  296. if (resp) {
  297. return {
  298. data: resp.list,
  299. success: true,
  300. total: resp.totalCount,
  301. pageSize: resp.pageSize,
  302. totalPage: resp.totalPage,
  303. }
  304. }
  305. return {
  306. data: [],
  307. success: true
  308. }
  309. }
  310. if (type == 'NONCHECK') {
  311. const resp = await getNonCheckTableData({
  312. unitCode: currentSelectedTreeNode.code,
  313. ...params
  314. });
  315. if (resp) {
  316. return {
  317. data: resp.list,
  318. success: true,
  319. total: resp.totalCount,
  320. pageSize: resp.pageSize,
  321. totalPage: resp.totalPage,
  322. }
  323. }
  324. return {
  325. data: [],
  326. success: true
  327. }
  328. }
  329. if (type == 'COST') {
  330. const resp = await getCostItemsTableData({
  331. unitCode: currentSelectedTreeNode.code,
  332. ...params
  333. });
  334. if (resp) {
  335. return {
  336. data: resp,
  337. success: true,
  338. }
  339. }
  340. return {
  341. data: [],
  342. success: true
  343. }
  344. }
  345. }
  346. return []
  347. }
  348. interface TableTransferProps extends TransferProps<TransferItem> {
  349. leftColumns: ColumnsType<any>;
  350. rightColumns: ColumnsType<any>;
  351. }
  352. const transferTableColumn = [
  353. {
  354. title: '项目名称',
  355. dataIndex: 'itemName',
  356. ellipsis: true,
  357. width: 220
  358. },
  359. {
  360. title: '类型',
  361. dataIndex: 'itemType',
  362. },
  363. ];
  364. const checkUnitColumns = [
  365. {
  366. title: '核算单元名称',
  367. dataIndex: 'unitName',
  368. },
  369. {
  370. title: '职类',
  371. dataIndex: 'unitTypeName',
  372. },
  373. ];
  374. const costItemColumns = [
  375. {
  376. title: '项目名称',
  377. dataIndex: 'name',
  378. }
  379. ]
  380. const openCopyHandleModal = () => {
  381. set_ifShowModal(true);
  382. set_isCopy(true);
  383. }
  384. const openTransfer = () => {
  385. const ref = React.createRef<{ save: any }>();
  386. Modal.confirm({
  387. title: '添加',
  388. icon: <></>,
  389. width: 800,
  390. centered: true,
  391. okText: '确定',
  392. cancelText: '取消',
  393. content: <TableTransfer
  394. ref={ref}
  395. leftColumns={transferTableColumn}
  396. rightColumns={transferTableColumn}
  397. ></TableTransfer>,
  398. onOk: () => {
  399. return ref.current && ref.current.save();
  400. }
  401. })
  402. }
  403. interface TableSelecterProps extends TransferProps<TransferItem> {
  404. tableSelecterColumn: any[];
  405. record: any
  406. }
  407. const TableSelecter = React.forwardRef(({ tableSelecterColumn, record }: TableSelecterProps, ref) => {
  408. const [datasource, set_datasource] = useState<any[]>([]);
  409. const [selectedKeys, setSelectedKeys] = useState<React.Key[]>([]);
  410. const [selectedRows, set_selectedRows] = useState<any[]>([])
  411. const [showList, set_showList] = useState<any[]>([]);
  412. const [tableParams, set_tableParams] = useState<any>({});
  413. const [keywords, set_keywords] = useState('');
  414. const [allParentsNode,set_allParentsNode] = useState<any[]>([]);
  415. //获取表格数据
  416. const getFuncList = async () => {
  417. if (isCopy) {
  418. const resp = await getAllCheckUnit();
  419. if (resp) {
  420. const filteredData = resp.filter((a: any) => a.code != currentSelectedTreeNode.code);
  421. set_datasource(filteredData);
  422. set_showList(filteredData);
  423. }
  424. } else {
  425. //成本项目添加
  426. const resp2 = await getCostItemsTableData({
  427. unitCode: currentSelectedTreeNode.code,
  428. });
  429. if (resp2) {
  430. const resp = await getCostProjectTable();
  431. if (resp) {
  432. //const filteredData = resp.filter((a:any)=>a.code != currentSelectedTreeNode.code);
  433. set_datasource(resp);
  434. set_showList(resp);
  435. const parents = getNodesWithChildren(resp2);
  436. let codes = getAllLeafCodes(resp2);
  437. let _codes = Array.from(new Set(codes.map(obj => JSON.stringify(obj)))).map(str => JSON.parse(str));
  438. console.log({parents,_codes})
  439. setSelectedKeys(_codes);
  440. set_allParentsNode(parents);
  441. }
  442. }
  443. }
  444. }
  445. const onSelectHandle = (record: any, selected:boolean, selectedRows:any[], nativeEvent: any) => {
  446. // console.log({selectedRows});
  447. if(selected){
  448. let data = [...datasource];
  449. let parent = record.parentCode != 0 ? findAllParents([...data],`${record.parentCode}`):undefined;
  450. parent = parent?parent.filter(obj => Object.keys(obj).length !== 0):[];
  451. set_allParentsNode([...allParentsNode,...parent]);
  452. let result = [...selectedRows,...parent];
  453. result = result.filter(obj => Object.keys(obj).length !== 0);
  454. const _result = Array.from(new Set(result.map(obj => JSON.stringify(obj)))).map(str => JSON.parse(str));
  455. setSelectedKeys([...selectedRows.map((a: { code: any; })=>a.code)]);
  456. set_selectedRows([...selectedRows,..._result]);
  457. }else {
  458. if(record.children){
  459. const parentCodes = findParentCodes(record);
  460. //除去取消勾选的父级
  461. const _allParentsNode = allParentsNode.filter(a=>!parentCodes.includes(a.code));
  462. set_allParentsNode([..._allParentsNode]);
  463. setSelectedKeys([...selectedRows.map((a: { code: any; })=>a.code)]);
  464. set_selectedRows([...selectedRows]);
  465. }else{
  466. setSelectedKeys([...selectedRows.map((a: { code: any; })=>a.code)]);
  467. set_selectedRows([...selectedRows]);
  468. }
  469. }
  470. };
  471. const onSelectAllHandle = (selected: boolean, selectedRows: any[], changeRows: any[])=>{
  472. if(selected){
  473. setSelectedKeys([...selectedRows.map((a: { code: any; })=>a.code)]);
  474. set_selectedRows([...selectedRows]);
  475. }else{
  476. set_allParentsNode([]);
  477. setSelectedKeys([]);
  478. set_selectedRows([]);
  479. }
  480. }
  481. const save = async () => {
  482. if (!isCopy && currentSelectedTabKey == '4') {
  483. let _selectedRows = Object.values([...allParentsNode,...selectedRows].reduce((acc, cur) => {
  484. acc[cur.code] = cur; // 如果 id 相同,后来的元素将替换前者
  485. return acc;
  486. }, {}));
  487. const result = {
  488. itemList: _selectedRows.map((a: any) => ({
  489. code: a.code,
  490. ctrlFlag: a.ctrlFlag,
  491. itemType: a.itemType,
  492. name: a.name,
  493. parentCode: a.parentCode,
  494. seqNo: a.seqNo,
  495. statFlag: a.statFlag,
  496. summaryFlag: a.summaryFlag
  497. })),
  498. unitCode: currentSelectedTreeNode.code
  499. };
  500. const resp = await addCostItemData(result);
  501. if (resp) {
  502. message.success('操作成功!');
  503. set_ifShowModal(false);
  504. tableRef.current?.reload();
  505. }
  506. } else {
  507. const result = {
  508. unitCodeList: selectedKeys,
  509. unitCode: currentSelectedTreeNode.code
  510. };
  511. const resp = await saveCopyRequest(result, currentSelectedTabKey);
  512. if (resp) {
  513. message.success('复制成功!');
  514. set_ifShowModal(false);
  515. tableRef.current?.reload();
  516. }
  517. }
  518. }
  519. useEffect(() => {
  520. getFuncList();
  521. }, [])
  522. return (
  523. <div className='TableSelecter'>
  524. <Input placeholder={'请输入'} allowClear
  525. suffix={
  526. <IconFont type="iconsousuo" onClick={() => {
  527. //console.log('iconsousuo', currentSelectedTabKey, keywords);
  528. if (isCopy) {
  529. set_tableParams({ ...tableParams, name: keywords })
  530. }
  531. }} />
  532. }
  533. style={{ marginBottom: 8 }}
  534. onChange={(e) => {
  535. if (isCopy) {
  536. if (e.target.value.length != 0) {
  537. const result = datasource.filter(item => item.unitName.indexOf(e.target.value) != -1);
  538. set_showList(result);
  539. } else {
  540. set_showList(datasource);
  541. }
  542. }
  543. if (!isCopy) {
  544. //set_keywords(e.target.value);
  545. const search: any = (data: any, name: string) => {
  546. let result = [];
  547. for (let i = 0; i < data.length; i++) {
  548. const item = data[i];
  549. if (item.name.indexOf(name) != -1) {
  550. result.push(item);
  551. }
  552. if (item.children) {
  553. result.push(...search(item.children, name));
  554. }
  555. }
  556. return result;
  557. }
  558. if (e.target.value.length > 0) {
  559. const foundItem = search(datasource, e.target.value);
  560. set_showList(foundItem);
  561. } else {
  562. set_showList(datasource);
  563. }
  564. }
  565. }}
  566. />
  567. <div className='wrapper' style={{maxHeight:'491px',overflowY:'scroll'}}>
  568. <BMSTable columns={tableSelecterColumn}
  569. options={{
  570. density: true,
  571. setting: {
  572. listsHeight: 100,
  573. },
  574. }}
  575. params={tableParams}
  576. rowKey='code'
  577. tableAlertRender={false}
  578. rowSelection={{
  579. // 自定义选择项参考: https://ant.design/components/table-cn/#components-table-demo-row-selection-custom
  580. // 注释该行则默认不显示下拉选项
  581. selectedRowKeys:selectedKeys,
  582. onSelect: onSelectHandle,
  583. checkStrictly: false,
  584. onSelectAll(selected, selectedRows, changeRows) {
  585. onSelectAllHandle(selected, selectedRows, changeRows);
  586. },
  587. }}
  588. pagination={false}
  589. dataSource={showList}
  590. />
  591. </div>
  592. <div className='footer'>
  593. <span className='cancel' onClick={() => set_ifShowModal(false)}>取消</span>
  594. <span className='ok' onClick={() => save()}>{`确认(${selectedKeys.length > 0 && selectedKeys.length})`}</span>
  595. </div>
  596. </div>
  597. )
  598. });
  599. const TableTransfer = React.forwardRef(({ leftColumns, rightColumns, ...restProps }: TableTransferProps, ref) => {
  600. const [_data, _set_data] = useState<any>();
  601. const [targetKeys, setTargetKeys] = useState<string[]>([]);
  602. const [datasource, set_datasource] = useState<any[]>([]);
  603. const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
  604. const [targetData, set_targetData] = useState<any[]>([]);
  605. const [loading, set_loading] = useState(true);
  606. //获取单元
  607. const getFuncList = async () => {
  608. if (currentSelectedTabKey == '1') {
  609. const resp = await getAllCheckUnitProjectData();
  610. if (resp) {
  611. const resp1 = await getBillingItemTableData({
  612. unitCode: currentSelectedTreeNode.code,
  613. pageSize: 500, current: 1
  614. });
  615. if (resp1) {
  616. let allData = resp;
  617. set_targetData(resp1.list);
  618. const defaultSelctedkeys = (resp1.list).map((a: any) => a.itemPointCode);
  619. set_datasource(allData);
  620. setTargetKeys(defaultSelctedkeys);
  621. }
  622. }
  623. }
  624. if (currentSelectedTabKey == '2') {
  625. const resp = await getIndicProjectTableData({ pageSize: 500, current: 1 });
  626. if (resp) {
  627. const resp1 = await getIndicTableData({
  628. unitCode: currentSelectedTreeNode.code,
  629. pageSize: 500, current: 1
  630. });
  631. if (resp1) {
  632. set_targetData(resp1.list);
  633. set_datasource(resp.list.map((a: any) => ({ ...a, itemName: a.indicatorName, itemType: a.indicatorTypeName })));
  634. const defaultSelctedkeys = (resp1.list).map((a: any) => a.indicatorCode);
  635. setTargetKeys(defaultSelctedkeys);
  636. }
  637. }
  638. }
  639. if (currentSelectedTabKey == '3') {
  640. const resp = await getNonCheckProjectTableData({ pageSize: 500, current: 1 });
  641. if (resp) {
  642. const resp1 = await getNonCheckTableData({
  643. unitCode: currentSelectedTreeNode.code,
  644. pageSize: 1000000, current: 1
  645. });
  646. if (resp1) {
  647. set_targetData(resp1.list);
  648. set_datasource(resp.list.map((a: any) => ({ ...a, itemName: a.name, itemType: a.distributionTypeName })));
  649. const defaultSelctedkeys = (resp1.list).map((a: any) => a.nonAssessmentCode);
  650. setTargetKeys(defaultSelctedkeys);
  651. }
  652. }
  653. }
  654. set_loading(false);
  655. }
  656. const onChange = (nextTargetKeys: string[]) => {
  657. setTargetKeys(nextTargetKeys);
  658. };
  659. const onSelectChange = (sourceSelectedKeys: string[], targetSelectedKeys: string[]) => {
  660. //console.log('sourceSelectedKeys:', sourceSelectedKeys,'targetSelectedKeys:',targetSelectedKeys);
  661. setSelectedKeys([...sourceSelectedKeys, ...targetSelectedKeys]);
  662. };
  663. useImperativeHandle(ref, () => ({
  664. save: async () => {
  665. let flag = false;
  666. if (currentSelectedTabKey == '1') {
  667. const items = datasource.filter(a => targetKeys.includes(a.code));
  668. //拿到当前的表格数据覆盖全量表格数据
  669. //console.log({items,targetKeys});
  670. const uodatedData = items.map(a => {
  671. if (targetData.length > 0) {
  672. const result = targetData.filter(b => b.itemPointCode == a.code);
  673. if (result.length > 0) {
  674. return {
  675. ...a,
  676. orderPointValue: result[0].orderPointValue,
  677. coreFlag: result[0].coreFlag,
  678. }
  679. } else {
  680. return a
  681. }
  682. } else {
  683. return a
  684. }
  685. })
  686. const result = {
  687. unitCode: currentSelectedTreeNode.code,
  688. item: uodatedData.map(a => ({
  689. itemPointCode: a.itemCode,
  690. itemName: a.itemName,
  691. orderPointValue: a.orderPointValue,
  692. coreFlag: a.coreFlag
  693. }))
  694. }
  695. const resp = await addBillingItemData(result);
  696. if (resp) {
  697. flag = true
  698. }
  699. }
  700. if (currentSelectedTabKey == '2') {
  701. const items = datasource.filter(a => targetKeys.includes(a.code));
  702. //拿到当前的表格数据覆盖全量表格数据
  703. const uodatedData = items.map(a => {
  704. if (targetData.length > 0) {
  705. const result = targetData.filter(b => b.indicatorCode == a.code);
  706. if (result.length > 0) {
  707. return {
  708. ...a,
  709. orderPointValue: result[0].orderPointValue
  710. }
  711. } else {
  712. return a
  713. }
  714. } else {
  715. return a
  716. }
  717. })
  718. const commitData = uodatedData.map((a: any) => ({
  719. indicatorCode: a.code,
  720. indicatorName: a.indicatorName,
  721. orderPointValue: a.orderPointValue,
  722. executePointValue: a.executePointValue
  723. }))
  724. const result = {
  725. unitCode: currentSelectedTreeNode.code,
  726. indicatorValues: commitData
  727. }
  728. const resp = await addIndicItemData(result);
  729. if (resp) {
  730. flag = true
  731. }
  732. }
  733. if (currentSelectedTabKey == '3') {
  734. const items = datasource.filter(a => targetKeys.includes(a.code));
  735. const commitData = items.map(a => ({
  736. code: a.code,
  737. name: a.name
  738. }))
  739. const result = {
  740. unitCode: currentSelectedTreeNode.code,
  741. assessments: commitData
  742. }
  743. const resp = await addNonCheckItemData(result);
  744. if (resp) {
  745. flag = true
  746. }
  747. }
  748. if (flag) {
  749. message.success('操作成功!');
  750. tableRef.current?.reload();
  751. }
  752. }
  753. }));
  754. useEffect(() => {
  755. getFuncList();
  756. }, [])
  757. return (
  758. <Transfer className='TableTransfer' showSearch
  759. titles={['待选项', '已选项']}
  760. locale={{
  761. itemUnit: '项',
  762. itemsUnit: '项',
  763. searchPlaceholder: '请输入',
  764. }}
  765. // oneWay={true}
  766. onChange={onChange}
  767. onSelectChange={onSelectChange}
  768. dataSource={datasource}
  769. rowKey={record => record.code}
  770. targetKeys={targetKeys}
  771. selectedKeys={selectedKeys}
  772. filterOption={(inputValue, item) => {
  773. if (item.itemName!.indexOf(inputValue) !== -1) {
  774. console.log({ item });
  775. }
  776. return item.itemName!.indexOf(inputValue) !== -1
  777. }}
  778. >
  779. {({
  780. direction,
  781. filteredItems,
  782. onItemSelectAll,
  783. onItemSelect,
  784. selectedKeys: listSelectedKeys,
  785. disabled: listDisabled,
  786. }) => {
  787. //console.log({ filteredItems, listSelectedKeys, direction });
  788. const columns = direction === 'left' ? leftColumns : rightColumns;
  789. const rowSelection: TableRowSelection<TransferItem> = {
  790. getCheckboxProps: (item) => ({ disabled: listDisabled || item.disabled }),
  791. onSelectAll(selected, selectedRows) {
  792. const treeSelectedKeys = selectedRows.map(({ code }) => code);
  793. const diffKeys = selected
  794. ? difference(treeSelectedKeys, listSelectedKeys)
  795. : difference(listSelectedKeys, treeSelectedKeys);
  796. onItemSelectAll(diffKeys as string[], selected);
  797. },
  798. onSelect({ code }, selected) {
  799. console.log({ code, selected })
  800. onItemSelect(code as string, selected);
  801. },
  802. selectedRowKeys: listSelectedKeys,
  803. };
  804. return (
  805. <BMSTable
  806. rowSelection={rowSelection}
  807. columns={columns as TransferItem[]}
  808. dataSource={filteredItems}
  809. size="small"
  810. loading={loading}
  811. bordered={false}
  812. rowKey={'code'}
  813. pagination={{ showTitle: false, pageSize: 9, showLessItems: false, simple: true, showTotal: () => false }}
  814. tableAlertRender={false}
  815. style={{ pointerEvents: listDisabled ? 'none' : undefined }}
  816. onRow={({ code, disabled: itemDisabled }) => ({
  817. onClick: () => {
  818. if (itemDisabled || listDisabled) return;
  819. onItemSelect(code as string, !listSelectedKeys.includes(code as string));
  820. },
  821. })}
  822. />
  823. );
  824. }}
  825. </Transfer>
  826. )
  827. });
  828. //成本项目添加
  829. const addCostProject = () => {
  830. set_isCopy(false);
  831. set_ifShowModal(true);
  832. }
  833. const tableSearchHandle = () => {
  834. set_searchParams({
  835. name: searchKeywords
  836. })
  837. }
  838. //编辑按钮操作
  839. const editBtnHandle = async () => {
  840. let flag = false;
  841. if (ifEdit) {
  842. //保存操作
  843. if (currentSelectedTabKey == '1' && currentEditRow) {
  844. //收费项目
  845. console.log({ currentEditRow });
  846. const result = {
  847. id: currentEditRow.id,
  848. unitCode: currentSelectedTreeNode.code,
  849. orderPointValue: `${currentEditRow.orderPointValue}`,
  850. coreFlag: currentEditCoreFlag
  851. }
  852. const resp = await editBillingItemData(result);
  853. if (resp) flag = true;
  854. }
  855. if (currentSelectedTabKey == '2' && currentEditRow) {
  856. //收费项目
  857. const result = {
  858. id: currentEditRow.id,
  859. unitCode: currentSelectedTreeNode.code,
  860. indicatorCode: currentEditRow.indicatorCode,
  861. indicatorName: currentEditRow.indicatorName,
  862. orderPointValue: currentEditRow.orderPointValue,
  863. executePointValue: currentEditRow.executePointValue
  864. }
  865. const resp = await editIndicItemData(result);
  866. if (resp) flag = true;
  867. }
  868. if (currentSelectedTabKey == '4' && currentEditRow) {
  869. //成本项目
  870. //console.log({ currentEditRow });
  871. const result = {
  872. id: currentEditRow.id,
  873. ctrlFlag: currentEditRow.ctrlFlag
  874. }
  875. const resp = await editCostItemData(result);
  876. if (resp) flag = true;
  877. }
  878. } else {
  879. //开启编辑模式
  880. set_ifEdit(true);
  881. }
  882. if (flag) {
  883. set_ifEdit(false);
  884. message.success('操作成功!');
  885. tableRef.current?.reload();
  886. }
  887. }
  888. const dataList: any[] = [];
  889. const getParentKey = (key: React.Key, tree: any[]): React.Key => {
  890. let parentKey: React.Key;
  891. for (let i = 0; i < tree.length; i++) {
  892. const node = tree[i];
  893. if (node.child) {
  894. if (node.child.some((item: { code: React.Key; }) => item.code === key)) {
  895. parentKey = node.code;
  896. } else if (getParentKey(key, node.child)) {
  897. parentKey = getParentKey(key, node.child);
  898. }
  899. }
  900. }
  901. return parentKey!;
  902. };
  903. const onTreeSearchKeyChange = (e: React.ChangeEvent<HTMLInputElement>) => {
  904. const { value } = e.target;
  905. const newExpandedKeys = dataList
  906. .map((item) => {
  907. if (item.name.indexOf(value) > -1) {
  908. return getParentKey(item.code, treeData);
  909. }
  910. return null;
  911. });
  912. const b = newExpandedKeys.filter((item, i, self) => item && self.indexOf(item) === i);
  913. setExpandedKeys(newExpandedKeys as React.Key[]);
  914. setSearchValue(value);
  915. setAutoExpandParent(true);
  916. }
  917. const onExpand = (newExpandedKeys: React.Key[]) => {
  918. setExpandedKeys(newExpandedKeys);
  919. setAutoExpandParent(false);
  920. };
  921. const generateList = (data: getTreeDataRespType[]) => {
  922. for (let i = 0; i < data.length; i++) {
  923. const node = data[i];
  924. const { code, name } = node;
  925. dataList.push({ code: code, name: name });
  926. if (node.child) {
  927. generateList(node.child);
  928. }
  929. }
  930. };
  931. generateList(treeData as any);
  932. const getTreeReqFunc = async (computeDate: string) => {
  933. const resp = await getTreeData(computeDate);
  934. set_treeData(resp);
  935. }
  936. const setTableColumn = () => {
  937. if (currentSelectedTabKey == '1') {
  938. set_tableColumn(billingTableColumn);
  939. }
  940. if (currentSelectedTabKey == '2') {
  941. set_tableColumn(indicTableColumn);
  942. }
  943. if (currentSelectedTabKey == '3') {
  944. set_tableColumn(nonCheckTableColumn);
  945. }
  946. if (currentSelectedTabKey == '4') {
  947. set_tableColumn(costTableColumn);
  948. }
  949. }
  950. useEffect(() => {
  951. if (currentComputeDate) {
  952. getTreeReqFunc(currentComputeDate);
  953. }
  954. }, [currentComputeDate]);
  955. useEffect(() => {
  956. setTableColumn();
  957. }, [ifEdit]);
  958. useEffect(() => {
  959. tableRef.current?.reload();
  960. }, [currentSelectedTreeNode]);
  961. useEffect(() => {
  962. setTableColumn();
  963. }, [currentSelectedTabKey]);
  964. useEffect(() => {
  965. if (!isCopy) {
  966. set_tableSelecterColumn(costItemColumns);
  967. } else {
  968. set_tableSelecterColumn(checkUnitColumns);
  969. }
  970. }, [isCopy])
  971. useEffect(() => {
  972. //初始化左侧树结构数据后
  973. if (treeData?.length > 0) {
  974. if (treeData[0].child && treeData[0].child.length > 0) {
  975. const [node, nodeParent] = getDeepestTreeData(treeData[0], 'child');
  976. set_currentSelectedTreeNode(node);
  977. setExpandedKeys([nodeParent.code]);
  978. }
  979. }
  980. }, [treeData]);
  981. useEffect(() => {
  982. set_tableColumn(billingTableColumn as ProColumns[]);
  983. getCurrentComputeDate();
  984. }, []);
  985. return (
  986. <div className='CheckUnitProjectSet'>
  987. <ModalForm title={isCopy ? `复制(${currentSelectedTreeNode ? currentSelectedTreeNode.name : ''})` : `添加成本项目(${currentSelectedTreeNode ? currentSelectedTreeNode.name : ''})`} width={400} submitter={{
  988. render: (props, defaultDoms) => []
  989. }} open={ifShowModal} modalProps={{
  990. closable: false,
  991. }}>
  992. <TableSelecter
  993. ref={ref}
  994. record={undefined}
  995. tableSelecterColumn={tableSelecterColumn}
  996. ></TableSelecter>
  997. </ModalForm>
  998. <div className='leftTree'>
  999. <div className='search'>
  1000. <Input
  1001. className='searchInput'
  1002. placeholder="请输入类目名称"
  1003. size='small'
  1004. allowClear
  1005. style={{ marginBottom: 16 }}
  1006. onChange={onTreeSearchKeyChange}
  1007. suffix={
  1008. <SearchIcon type='iconsousuo' />
  1009. }
  1010. />
  1011. </div>
  1012. {
  1013. treeData && treeData.length > 0 && currentSelectedTreeNode && (
  1014. <DirectoryTree
  1015. fieldNames={{ title: 'name', key: 'code', children: 'child' }}
  1016. rootStyle={{ height: '100%', paddingBottom: 50, overflowY: 'scroll', overflowX: 'hidden' }}
  1017. onSelect={onSelect}
  1018. onExpand={onExpand}
  1019. expandedKeys={expandedKeys}
  1020. autoExpandParent={autoExpandParent}
  1021. selectedKeys={[currentSelectedTreeNode.code]}
  1022. blockNode={true}
  1023. icon={() => null}
  1024. titleRender={
  1025. (nodeData: any) => {
  1026. const strTitle = nodeData.name as string;
  1027. const index = strTitle.indexOf(searchValue);
  1028. const beforeStr = strTitle.substring(0, index);
  1029. const afterStr = strTitle.slice(index + searchValue.length);
  1030. const title =
  1031. index > -1 ? (
  1032. <span>
  1033. {beforeStr}
  1034. <span className="site-tree-search-value" style={{ color: 'red', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>{searchValue}</span>
  1035. {afterStr}
  1036. </span>
  1037. ) : (
  1038. <span className='strTitle'>{strTitle}</span>
  1039. );
  1040. return <div style={{
  1041. display: 'flex', flexDirection: 'row',
  1042. width: '100%',
  1043. justifyContent: 'flex-start', alignItems: 'center', height: 32,
  1044. borderRadius: '4px',
  1045. overflow: 'hidden',
  1046. color: '#17181A',
  1047. textOverflow: 'ellipsis',
  1048. whiteSpace: 'nowrap'
  1049. }}>{title}</div>
  1050. }
  1051. }
  1052. defaultSelectedKeys={[treeData[0].child[0].code]}
  1053. treeData={treeData as unknown as DataNode[]}
  1054. // treeData={treeDataNew}
  1055. switcherIcon={(props: any) => {
  1056. const { expanded } = props;
  1057. 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} />
  1058. }}
  1059. />
  1060. )
  1061. }
  1062. </div>
  1063. {/* <div style={{width:16,height:'92vh',background:'#F5F7FA'}}></div> */}
  1064. <div className='rightContent'>
  1065. <BMSPagecontainer title={false} ghost>
  1066. <div></div>
  1067. <Tabs
  1068. defaultActiveKey="1"
  1069. onChange={onTabChange}
  1070. items={[
  1071. {
  1072. label: `收费项目`,
  1073. key: '1',
  1074. },
  1075. {
  1076. label: `指标项目`,
  1077. key: '2',
  1078. },
  1079. {
  1080. label: `非考核项目`,
  1081. key: '3',
  1082. },
  1083. {
  1084. label: `成本项目`,
  1085. key: '4',
  1086. },
  1087. ]}
  1088. />
  1089. {
  1090. currentSelectedTabKey == '1' && (
  1091. <div className='tabContent'>
  1092. <div className='tableToolbar'>
  1093. <div className='search'>
  1094. <span>检索:</span><Input className='searchInput' allowClear onChange={(e) => {
  1095. set_searchKeywords(e.target.value)
  1096. if (e.target.value.length == 0) {
  1097. set_searchParams({
  1098. ...searchParams,
  1099. name: e.target.value
  1100. })
  1101. }
  1102. }} placeholder="请输入项目名称" suffix={
  1103. <IconFont type="iconsousuo" onClick={() => tableSearchHandle()} />
  1104. } />
  1105. </div>
  1106. <div className={'btnGroup'}>
  1107. <span key="2" onClick={() => openCopyHandleModal()}>复制</span>
  1108. <span key="3" onClick={() => openTransfer()}>添加</span>
  1109. </div>
  1110. </div>
  1111. {currentSelectedTreeNode && <BMSTable params={searchParams} actionRef={tableRef} rowKey='id' columns={[...tableColumn, {
  1112. title: '操作',
  1113. key: 'option',
  1114. width: 140,
  1115. valueType: 'option',
  1116. render: (text, record: any) => [
  1117. <a key={'edit'} onClick={() => {
  1118. if (!ifEdit) {
  1119. set_ifEdit(true);
  1120. set_currentEditRow(record)
  1121. }
  1122. if (ifEdit) {
  1123. editBtnHandle();
  1124. }
  1125. }}>{(ifEdit && currentEditRow?.id == record.id) ? '保存' : '编辑'}</a>,
  1126. <Fragment key={'cancel'}>{(ifEdit && currentEditRow?.id == record.id) && <a onClick={() => set_ifEdit(false)}>取消</a>}</Fragment>,
  1127. <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delHandle(record)}>
  1128. {(currentEditRow?.id != record.id || !ifEdit) && <a key={'del'}>删除</a>}
  1129. </Popconfirm>
  1130. ],
  1131. }]} request={(params, sort, filter) => getTableData('BILL', params, sort, filter)} />}
  1132. </div>
  1133. )
  1134. }
  1135. {
  1136. currentSelectedTabKey == '2' && (
  1137. <div className='tabContent'>
  1138. <div className='tableToolbar'>
  1139. <div className='search'>
  1140. <span>检索:</span><Input className='searchInput' allowClear placeholder="请输入项目名称" onChange={(e) => {
  1141. set_searchKeywords(e.target.value);
  1142. if (e.target.value.length == 0) {
  1143. set_searchParams({
  1144. ...searchParams,
  1145. name: ''
  1146. });
  1147. }
  1148. }} suffix={
  1149. <IconFont type="iconsousuo" onClick={() => tableSearchHandle()} />
  1150. } />
  1151. </div>
  1152. <div className={'btnGroup'}>
  1153. <span key="2" onClick={() => openCopyHandleModal()}>复制</span>
  1154. <span key="3" onClick={() => openTransfer()}>添加</span>
  1155. </div>
  1156. </div>
  1157. {currentSelectedTreeNode && <BMSTable actionRef={tableRef} params={searchParams} rowKey='id' columns={[...tableColumn, {
  1158. title: '操作',
  1159. key: 'option',
  1160. width: 140,
  1161. valueType: 'option',
  1162. render: (text, record: any) => [
  1163. <a key={'edit'} onClick={() => {
  1164. if (!ifEdit) {
  1165. set_ifEdit(true);
  1166. set_currentEditRow(record)
  1167. }
  1168. if (ifEdit) {
  1169. editBtnHandle();
  1170. }
  1171. }}>{(ifEdit && currentEditRow?.id == record.id) ? '保存' : '编辑'}</a>,
  1172. <Fragment key={'cancel'}>{(ifEdit && currentEditRow?.id == record.id) && <a onClick={() => set_ifEdit(false)}>取消</a>}</Fragment>,
  1173. <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delHandle(record)}>
  1174. {(currentEditRow?.id != record.id || !ifEdit) && <a key={'del'}>删除</a>}
  1175. </Popconfirm>
  1176. ],
  1177. }]} request={(params, sort, filter) => getTableData('INDIC', params, sort, filter)} />}
  1178. </div>
  1179. )
  1180. }
  1181. {
  1182. currentSelectedTabKey == '3' && (
  1183. <div className='tabContent'>
  1184. <div className='tableToolbar'>
  1185. <div className='search'>
  1186. <span>检索:</span><Input className='searchInput' allowClear placeholder="请输入项目名称" onChange={(e) => {
  1187. set_searchKeywords(e.target.value);
  1188. if (e.target.value.length == 0) {
  1189. set_searchParams({
  1190. ...searchParams,
  1191. name: ''
  1192. });
  1193. }
  1194. }} suffix={
  1195. <IconFont type="iconsousuo" onClick={() => tableSearchHandle()} />
  1196. } />
  1197. </div>
  1198. <div className={'btnGroup'}>
  1199. <span key="2" onClick={() => openCopyHandleModal()}>复制</span>
  1200. <span key="3" onClick={() => openTransfer()}>添加</span>
  1201. </div>
  1202. </div>
  1203. {currentSelectedTreeNode && <BMSTable actionRef={tableRef} params={searchParams} rowKey='id' columns={[...tableColumn, {
  1204. title: '操作',
  1205. key: 'option',
  1206. valueType: 'option',
  1207. render: (text, record: any) => [
  1208. <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delHandle(record)}>
  1209. {<a key={'del'}>删除</a>}
  1210. </Popconfirm>
  1211. ],
  1212. }]} request={(params, sort, filter) => getTableData('NONCHECK', params, sort, filter)} />}
  1213. </div>
  1214. )
  1215. }
  1216. {
  1217. currentSelectedTabKey == '4' && (
  1218. <div className='tabContent'>
  1219. <div className='tableToolbar'>
  1220. <div className='search'>
  1221. <span>检索:</span><Input className='searchInput' allowClear placeholder="请输入项目名称" onChange={(e) => {
  1222. set_searchKeywords(e.target.value);
  1223. if (e.target.value.length == 0) {
  1224. set_searchParams({
  1225. ...searchParams,
  1226. name: ''
  1227. });
  1228. }
  1229. }} suffix={
  1230. <IconFont type="iconsousuo" onClick={() => tableSearchHandle()} />
  1231. } />
  1232. </div>
  1233. <div className={'btnGroup'}>
  1234. <span key="2" onClick={() => openCopyHandleModal()}>复制</span>
  1235. <span key="3" onClick={() => addCostProject()}>添加</span>
  1236. </div>
  1237. </div>
  1238. {currentSelectedTreeNode && <BMSTable actionRef={tableRef} pagination={false} params={searchParams} rowKey='id' columns={[...tableColumn, {
  1239. title: '操作',
  1240. key: 'option',
  1241. width: 140,
  1242. valueType: 'option',
  1243. render: (text, record: any) => [
  1244. <a key={'edit'} onClick={() => {
  1245. if (!ifEdit) {
  1246. set_ifEdit(true);
  1247. set_currentEditRow(record)
  1248. }
  1249. if (ifEdit) {
  1250. editBtnHandle();
  1251. }
  1252. }}>{(ifEdit && currentEditRow?.id == record.id) ? '保存' : '编辑'}</a>,
  1253. <Fragment key={'cancel'}>{(ifEdit && currentEditRow?.id == record.id) && <a onClick={() => set_ifEdit(false)}>取消</a>}</Fragment>,
  1254. <Popconfirm key="popconfirm" title={`确认删除吗?`} okText="是" cancelText="否" onConfirm={() => delHandle(record)}>
  1255. {(currentEditRow?.id != record.id || !ifEdit) && <a key={'del'}>删除</a>}
  1256. </Popconfirm>
  1257. ],
  1258. }]} request={(params, sort, filter) => getTableData('COST', params, sort, filter)} />}
  1259. </div>
  1260. )
  1261. }
  1262. </BMSPagecontainer>
  1263. </div>
  1264. </div>
  1265. );
  1266. };
  1267. export default CheckUnitProjectSet;