Qingdan3.js 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439
  1. import * as React from 'react';
  2. import Box from "@mui/material/Box";
  3. import { Table, ConfigProvider, Button as AButton } from "antd";
  4. import {TreeView } from "@mui/x-tree-view/TreeView";
  5. import { Grid } from '@mui/material';
  6. import Tooltip from '@mui/material/Tooltip';
  7. import AddIcon from '@mui/icons-material/Add';
  8. import SaveIcon from '@mui/icons-material/Save';
  9. import CancelIcon from '@mui/icons-material/Close';
  10. import EditIcon from '@mui/icons-material/Edit';
  11. import DeleteIcon from '@mui/icons-material/DeleteOutlined';
  12. import Tab from "@mui/material/Tab";
  13. import TabContext from "@mui/lab/TabContext";
  14. import TabList from "@mui/lab/TabList";
  15. import TabPanel from "@mui/lab/TabPanel";
  16. import Stack from "@mui/material/Stack";
  17. import Service from './Service';
  18. import Button from '@mui/material/Button';
  19. import ButtonGroup from '@mui/material/ButtonGroup';
  20. import {extractFuzhu} from './utils';
  21. import {shanchu, undo, redo, danxiangdinge, updateDercj, changguidinge, handleBeizhu, huan, updateShuliang, handleYuban, updateDeMingcheng, handleRcjbc} from './editor';
  22. import Backdrop from '@mui/material/Backdrop';
  23. import CircularProgress from '@mui/material/CircularProgress';
  24. import { DataGrid, GridRowModes, GridActionsCellItem, GridRowEditStopReasons, zhCN as zhCN_MUI, GridToolbarContainer } from '@mui/x-data-grid';
  25. import Dialog from '@mui/material/Dialog';
  26. import DialogTitle from '@mui/material/DialogTitle';
  27. import DialogContent from '@mui/material/DialogContent';
  28. import IconButton from '@mui/material/IconButton';
  29. import Typography from '@mui/material/Typography';
  30. import {
  31. SettingFilled,
  32. } from '@ant-design/icons';
  33. import { v4 as uuidv4 } from 'uuid';
  34. import zhCN from 'antd/locale/zh_CN';
  35. import {copy} from './utils';
  36. import {TabulatorFull as Tabulator} from "tabulator-tables"; //import Tabulator library
  37. import "tabulator-tables/dist/css/tabulator.min.css"; //import Tabulator stylesheet
  38. import './Tabulator.css';
  39. /**
  40. *
  41. 本条规定了工程量清单编码的表示方式:十二位阿拉伯数字及其设置规定。
  42. 各位数字的含义是:一、二位为专业工程代码(01—房屋建筑与装饰工程;02—仿古建筑工程;
  43. 03—通用安装工程;04—市政工程;05—园林绿化工程;06—矿山工程;07—构筑物工程;08—城市
  44. 轨道交通工程;09—爆破工程。以后进入国标的专业工程代码以此类推);三、四位为附录分类顺序码;
  45. 五、六位为分部工程顺序码;七、八、九位为分项工程项目名称顺序码;十至十二位为清单项目名称
  46. 顺序码。
  47. */
  48. export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台传回来的附注信息,要整理后才能成为展示用的行*/ , beizhuFK, clickCallback, loadingCallback, dingeclick, tihuanCallback, tihuanClick, suanshiCallback}) {
  49. const myTable = React.useRef(null);
  50. const myRef = React.useRef(null);
  51. const [valueTab, setValueTab] = React.useState("1");
  52. const handleChange = (event, newValue) => {
  53. setValueTab(newValue);
  54. };
  55. const [rcjhl, setRcjhl] = React.useState([]);
  56. const [rcjhl2, setRcjhl2] = React.useState([]);
  57. const [fuzhu, setFuzhu] = React.useState([]);//展示用的附注行
  58. const [yuban, setYuban] = React.useState([{'key': '0', '说明': '无'}, {'key': '1', '说明': '湿拌砂浆'}, {'key': '2', '说明': '散装干拌(混)砂浆'}, {'key': '3', '说明': '袋装干拌(混)砂浆'}]);
  59. const [tuijian, setTuijian] = React.useState([]);
  60. const [fuzhuEnable, setFuzhuEnable] = React.useState(false);
  61. const [yubanEnable, setYubanEnable] = React.useState(false);
  62. const hotRcjRef = React.useRef(null);
  63. const hotTuijianRef = React.useRef(null);
  64. const highlight = React.useRef([]);
  65. const debmRef = React.useRef(null);
  66. const lastClickRef = React.useRef(null);
  67. const tuijianRef = React.useRef(null);
  68. const tuijianTable = React.useRef(null);
  69. const rcj2Ref = React.useRef(null);
  70. const rcj2Table = React.useRef(null);
  71. const rcjRef = React.useRef(null);
  72. const rcjTable = React.useRef(null);
  73. const [detail, setDetail] = React.useState([
  74. ]);
  75. const selectedRowKeysTable = React.useRef([]);
  76. const selectedRowKeysTableParent = React.useRef(null);
  77. const beizhuFKRef = React.useRef(null);
  78. const rgdeRef = React.useRef(null);
  79. const jxdeRef = React.useRef(null);
  80. const cldeRef = React.useRef(null);
  81. const isQdrcj = React.useRef(false);
  82. const [selectedRowKeys, setSelectedRowKeys] = React.useState([]);
  83. const [selectedRowKeys2, setSelectedRowKeys2] = React.useState([]);
  84. const onSelectChange = (newSelectedRowKeys) => {
  85. console.log('selectedRowKeys changed: ', newSelectedRowKeys);
  86. setSelectedRowKeys(newSelectedRowKeys);
  87. const [newData, newHl] = handleBeizhu(beizhuFKRef.current, selectedRowKeysTable.current[0], newSelectedRowKeys, fuzhu);
  88. if (newData) {
  89. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
  90. let y =[];
  91. for (let i = 1; i < newHl.length; i++) {
  92. y.push({
  93. 'ID' : newHl[i][0],
  94. '人材机编码' : newHl[i][1],
  95. '名称' : newHl[i][2],
  96. '规格型号': newHl[i][3],
  97. '单位' : newHl[i][4],
  98. '单价' : newHl[i][5],
  99. '产地' : newHl[i][6],
  100. '供应厂商' : newHl[i][7],
  101. '人材机类别' : newHl[i][8],
  102. '甲供标志': newHl[i][9],
  103. '含量' : newHl[i][10],
  104. '合价' : newHl[i][11],
  105. '暂估价标志' : newHl[i][12],
  106. '主要材料标志' : newHl[i][13],
  107. '主材标志' : newHl[i][14],
  108. '设备标志' : newHl[i][15]
  109. });
  110. }
  111. setRcjhl(y);
  112. if (rcjTable.current) {
  113. rcjTable.current.replaceData(y);
  114. }
  115. }
  116. };
  117. const onSelectChange2 = (newSelectedRowKeys) => {
  118. setSelectedRowKeys2(newSelectedRowKeys);
  119. const [newData, newHl] = handleYuban(selectedRowKeysTable.current[0], newSelectedRowKeys);
  120. if (newData) {
  121. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
  122. let y =[];
  123. for (let i = 1; i < newHl.length; i++) {
  124. y.push({
  125. 'ID' : newHl[i][0],
  126. '人材机编码' : newHl[i][1],
  127. '名称' : newHl[i][2],
  128. '规格型号': newHl[i][3],
  129. '单位' : newHl[i][4],
  130. '单价' : newHl[i][5],
  131. '产地' : newHl[i][6],
  132. '供应厂商' : newHl[i][7],
  133. '人材机类别' : newHl[i][8],
  134. '甲供标志': newHl[i][9],
  135. '含量' : newHl[i][10],
  136. '合价' : newHl[i][11],
  137. '暂估价标志' : newHl[i][12],
  138. '主要材料标志' : newHl[i][13],
  139. '主材标志' : newHl[i][14],
  140. '设备标志' : newHl[i][15]
  141. });
  142. }
  143. setRcjhl(y);
  144. if (rcjTable.current) {
  145. rcjTable.current.replaceData(y);
  146. }
  147. }
  148. };
  149. /**fuzhu select */
  150. const rowSelection = {
  151. selectedRowKeys,
  152. onChange: onSelectChange,
  153. getCheckboxProps: (record) => {
  154. return {
  155. disabled: !fuzhuEnable
  156. };
  157. }
  158. };
  159. const rowSelection2 = {
  160. type: 'radio',
  161. selectedRowKeys: selectedRowKeys2,
  162. selections: [Table.SELECTION_NONE],
  163. onChange: onSelectChange2,
  164. getCheckboxProps: (record) => {
  165. return {
  166. disabled: !yubanEnable
  167. };
  168. }
  169. };
  170. var editCheck = function(cell){
  171. //cell - the cell component for the editable cell
  172. //get row data
  173. //console.log(cell);
  174. if(cell._cell.row.data['序号']) return false;
  175. return true;
  176. }
  177. var editCheckRcj = function(cell){
  178. //cell - the cell component for the editable cell
  179. //get row data
  180. //console.log(cell);
  181. if(isQdrcj.current) return false;
  182. if (cell._cell.row.getData()['人材机编码'] == '410000F') {
  183. return false;
  184. }
  185. return true;
  186. }
  187. var sparklineFormatter = function(cell, formatterParams, onRendered){
  188. for (let i = 0; i < highlight.current.length; i++) {
  189. let entry = highlight.current[i];
  190. if (entry.row + 1 == cell._cell.row.position && entry.col + 1 == cell._cell.column.getPosition()) {
  191. cell.getElement().style.fontWeight = 'bold';
  192. cell.getElement().style.color = 'green';
  193. cell.getElement().style.background = '#d7f1e1';
  194. }
  195. }
  196. return Number(cell.getValue()).toFixed(2).toString();
  197. };
  198. function handleSelect(row){
  199. selectedRowKeysTable.current = [row._row['data']['key']];
  200. if (row._row.data['序号'] != null && row._row.data['序号'].length >0) {
  201. selectedRowKeysTableParent.current = row._row['data']['key'];
  202. setFuzhu([]);
  203. setRcjrows([]);
  204. setYubanEnable(false);
  205. setSelectedRowKeys2([]);
  206. setShowToolbar(false);
  207. Service.generateQingdanrcj(name, bh,bt,row._row.data['清单编码']).then(x=>{
  208. let y =[];
  209. for (let i = 1; i < x.length; i++) {
  210. y.push({
  211. 'ID' : x[i][0],
  212. '人材机编码' : x[i][1],
  213. '名称' : x[i][2],
  214. '规格型号': x[i][3],
  215. '单位' : x[i][4],
  216. '单价' : x[i][5],
  217. '产地' : x[i][6],
  218. '供应厂商' : x[i][7],
  219. '人材机类别' : x[i][8],
  220. '甲供标志': x[i][9],
  221. '含量' : x[i][10],
  222. '合价' : x[i][11],
  223. '暂估价标志' : x[i][12],
  224. '主要材料标志' : x[i][13],
  225. '主材标志' : x[i][14],
  226. '设备标志' : x[i][15]
  227. });
  228. }
  229. setRcjhl(y);
  230. if (rcjTable.current) {
  231. rcjTable.current.replaceData(y);
  232. }
  233. isQdrcj.current = true;
  234. highlight.current = [];
  235. });
  236. Service.generateQingdanTuijian(name, bh,bt,row._row.data['清单编码']).then(x=>{
  237. setTuijian(x);
  238. if (tuijianTable.current) tuijianTable.current.replaceData(x);
  239. });
  240. }else{
  241. setTuijian([]);
  242. if (tuijianTable.current) tuijianTable.current.replaceData([]);
  243. let row_parent = row._row;
  244. while(row_parent.modules.dataTree.parent) {
  245. row_parent = row_parent.modules.dataTree.parent;
  246. }
  247. //console.log(name, bh,bt,qdbm, selected[1]);
  248. debmRef.current = row._row['data']['清单编码'];
  249. selectedRowKeysTableParent.current = row_parent['data']['key'];
  250. let qdbm = row_parent['data']['清单编码'];
  251. let debm = row._row['data']['清单编码'];
  252. console.log('debm=');
  253. console.log(debm);
  254. let danwei = row._row['data']['单位'];
  255. clickCallback(qdbm, debm);
  256. Service.generateDingercj(name, bh,bt,qdbm, debm, danwei).then(x=>{
  257. console.log(x);
  258. let y =[];
  259. for (let i = 1; i < x[0].length; i++) {
  260. y.push({
  261. 'ID' : x[0][i][0],
  262. '人材机编码' : x[0][i][1],
  263. '名称' : x[0][i][2],
  264. '规格型号': x[0][i][3],
  265. '单位' : x[0][i][4],
  266. '单价' : x[0][i][5],
  267. '产地' : x[0][i][6],
  268. '供应厂商' : x[0][i][7],
  269. '人材机类别' : x[0][i][8],
  270. '甲供标志': x[0][i][9],
  271. '含量' : x[0][i][10],
  272. '合价' : x[0][i][11],
  273. '暂估价标志' : x[0][i][12],
  274. '主要材料标志' : x[0][i][13],
  275. '主材标志' : x[0][i][14],
  276. '设备标志' : x[0][i][15]
  277. });
  278. }
  279. setRcjhl(y);
  280. if (rcjTable.current) {
  281. rcjTable.current.replaceData(y);
  282. }
  283. setShowToolbar(true);
  284. setFuzhuEnable(x[1]);
  285. setYubanEnable(x[1]);
  286. setSelectedRowKeys2(x[2]);
  287. setRcjrows(x[3]);
  288. //hotRcjRef.current?.hotInstance?.loadData(x);
  289. isQdrcj.current = false;
  290. let toHighlight = [];
  291. for(let i = 0; i < y.length; i++) {
  292. let entry = y[i];
  293. let bianhao = entry['人材机编码'];
  294. let rcjlb = entry['人材机类别'];
  295. let hit = false;
  296. if (Number(rcjlb) == 1 && rgdeRef.current ) {
  297. for (let j = 0;j < rgdeRef.current.length; j++) {
  298. if (rgdeRef.current[j]["CLBH"] == bianhao) {
  299. if(rgdeRef.current[j]["CLMC"] == entry['名称'])hit = true;
  300. let danjia = Number(entry['单价']);
  301. if (danjia != rgdeRef.current[j]["YSJG"]) {
  302. //console.log(`[${i},5]danjia bu yizhi`);
  303. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  304. }
  305. let hanliang = Number(entry['含量']);
  306. if (hanliang != rgdeRef.current[j]["gr"]) {
  307. //console.log(`[${i}, 10]hanliang bu yizhi`);
  308. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  309. }
  310. }
  311. }
  312. }
  313. if (Number(rcjlb) == 3 && jxdeRef.current ) {
  314. for (let j = 0; j < jxdeRef.current.length; j++) {
  315. if (jxdeRef.current[j]["jxbh"] == bianhao) {
  316. if(jxdeRef.current[j]["jxmc"] == entry['名称'])hit = true;
  317. let danjia = Number(entry['单价']);
  318. if (danjia != jxdeRef.current[j]["tbdj"]) {
  319. //console.log(`[${i},5]danjia bu yizhi`);
  320. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  321. }
  322. let hanliang = Number(entry['含量']);
  323. if (hanliang != jxdeRef.current[j]["sl"]) {
  324. //console.log(`[${i}, 10]hanliang bu yizhi`);
  325. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  326. }
  327. }
  328. }
  329. }
  330. if (Number(rcjlb) == 2 && cldeRef.current ) {
  331. for (let j = 0; j < cldeRef.current.length; j++) {
  332. if (cldeRef.current[j]["CLBH"] == bianhao) {
  333. if(cldeRef.current[j]["CLMC"] == entry['名称'])hit = true;
  334. let danjia = Number(entry['单价']);
  335. if (danjia != cldeRef.current[j]["YSJG"]) {
  336. //console.log(`[${i},5]danjia bu yizhi`);
  337. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  338. }
  339. let hanliang = Number(entry['含量']);
  340. if (hanliang != cldeRef.current[j]["SL"]) {
  341. //console.log(`[${i}, 10]hanliang bu yizhi`);
  342. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  343. }
  344. }
  345. }
  346. }
  347. if (!hit) {
  348. toHighlight.push({row: i, col: 1, renderer: "customStylesRenderer"});
  349. }
  350. }
  351. highlight.current = toHighlight;
  352. });
  353. }
  354. }
  355. /**补充人材机 */
  356. const [rcjrows, setRcjrows] = React.useState([]);
  357. //const [rowModesModel, setRowModesModel] = React.useState({});
  358. const [showToolbar, setShowToolbar] = React.useState(false);
  359. const rcjcolumns = [
  360. {
  361. field: 'actions',
  362. type: 'actions',
  363. headerName: '操作',
  364. width: 100,
  365. cellClassName: 'actions',
  366. getActions: ({ id }) => {
  367. return [
  368. <GridActionsCellItem
  369. icon={<DeleteIcon />}
  370. label="Delete"
  371. onClick={handleDeleteClick(id)}
  372. color="inherit"
  373. />,
  374. ];
  375. },
  376. },
  377. { field: '人材机编码', headerName: '人材机编码', width: 120, editable: false },
  378. {
  379. field: '名称',
  380. headerName: '名称',
  381. width: 120,
  382. align: 'left',
  383. headerAlign: 'left',
  384. editable: true,
  385. },
  386. {
  387. field: '规格型号',
  388. headerName: '规格型号',
  389. width: 100,
  390. editable: true,
  391. },
  392. {
  393. field: '单位',
  394. headerName: '单位',
  395. width: 80,
  396. editable: true,
  397. },
  398. {
  399. field: '单价',
  400. headerName: '单价',
  401. width: 80,
  402. editable: true,
  403. },
  404. {
  405. field: '产地',
  406. headerName: '产地',
  407. width: 80,
  408. editable: true,
  409. },
  410. {
  411. field: '供应厂商',
  412. headerName: '供应厂商',
  413. width: 80,
  414. editable: true,
  415. },
  416. {
  417. field: '人材机类别',
  418. headerName: '人材机类别',
  419. width: 120,
  420. editable: true,
  421. },
  422. {
  423. field: '甲供标志',
  424. headerName: '甲供标志',
  425. width: 80,
  426. editable: true,
  427. },
  428. {
  429. field: '含量',
  430. headerName: '含量',
  431. width: 80,
  432. editable: true,
  433. },
  434. /* {
  435. field: '合价',
  436. headerName: '合价',
  437. width: 80,
  438. editable: true,
  439. },*/
  440. {
  441. field: '暂估价标志',
  442. headerName: '暂估价标志',
  443. width: 100,
  444. editable: true,
  445. },
  446. {
  447. field: '主要材料标志',
  448. headerName: '主要材料标志',
  449. width: 120,
  450. editable: true,
  451. },
  452. {
  453. field: '主材标志',
  454. headerName: '主材标志',
  455. width: 80,
  456. editable: true,
  457. },
  458. {
  459. field: '设备标志',
  460. headerName: '设备标志',
  461. width: 80,
  462. editable: true,
  463. },
  464. ];
  465. const handleDeleteClick = (id) => () => {
  466. setRcjrows(rcjrows.filter((row) => row.id !== id));
  467. const [newData, newHl] = handleRcjbc(selectedRowKeysTable.current[0], rcjrows.filter((row) => row.id !== id));
  468. if (newData) {
  469. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
  470. let y =[];
  471. for (let i = 1; i < newHl.length; i++) {
  472. y.push({
  473. 'ID' : newHl[i][0],
  474. '人材机编码' : newHl[i][1],
  475. '名称' : newHl[i][2],
  476. '规格型号': newHl[i][3],
  477. '单位' : newHl[i][4],
  478. '单价' : newHl[i][5],
  479. '产地' : newHl[i][6],
  480. '供应厂商' : newHl[i][7],
  481. '人材机类别' : newHl[i][8],
  482. '甲供标志': newHl[i][9],
  483. '含量' : newHl[i][10],
  484. '合价' : newHl[i][11],
  485. '暂估价标志' : newHl[i][12],
  486. '主要材料标志' : newHl[i][13],
  487. '主材标志' : newHl[i][14],
  488. '设备标志' : newHl[i][15]
  489. });
  490. }
  491. setRcjhl(y);
  492. if (rcjTable.current) {
  493. rcjTable.current.replaceData(y);
  494. }
  495. }
  496. };
  497. const processRowUpdate = (newRow) => {
  498. const updatedRow = { ...newRow, isNew: false };
  499. setRcjrows(rcjrows.map((row) => (row.id === newRow.id ? updatedRow : row)));
  500. const [newData, newHl] = handleRcjbc(selectedRowKeysTable.current[0], rcjrows.map((row) => (row.id === newRow.id ? updatedRow : row)));
  501. if (newData) {
  502. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
  503. let y =[];
  504. for (let i = 1; i < newHl.length; i++) {
  505. y.push({
  506. 'ID' : newHl[i][0],
  507. '人材机编码' : newHl[i][1],
  508. '名称' : newHl[i][2],
  509. '规格型号': newHl[i][3],
  510. '单位' : newHl[i][4],
  511. '单价' : newHl[i][5],
  512. '产地' : newHl[i][6],
  513. '供应厂商' : newHl[i][7],
  514. '人材机类别' : newHl[i][8],
  515. '甲供标志': newHl[i][9],
  516. '含量' : newHl[i][10],
  517. '合价' : newHl[i][11],
  518. '暂估价标志' : newHl[i][12],
  519. '主要材料标志' : newHl[i][13],
  520. '主材标志' : newHl[i][14],
  521. '设备标志' : newHl[i][15]
  522. });
  523. }
  524. setRcjhl(y);
  525. if (rcjTable.current) {
  526. rcjTable.current.replaceData(y);
  527. }
  528. }
  529. return updatedRow;
  530. };
  531. function EditToolbar(props) {
  532. const { setRcjrows } = props;
  533. const handleClick = () => {
  534. const id = uuidv4();
  535. let a = [];
  536. setRcjrows((oldRows) => {
  537. a = [
  538. ...oldRows,
  539. { id, '人材机编码': '410000F', '名称': '', '规格型号': '', '单位': '', '单价':'0','产地': '', '供应厂商': '', '人材机类别':'2',
  540. '甲供标志':'', '含量':'1', '暂估价标志':'', '主要材料标志':'true', '主材标志':'true', '设备标志':'' },
  541. ];
  542. return a;
  543. });
  544. const [newData, newHl] = handleRcjbc(selectedRowKeysTable.current[0], a);
  545. if (newData) {
  546. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
  547. let y =[];
  548. for (let i = 1; i < newHl.length; i++) {
  549. y.push({
  550. 'ID' : newHl[i][0],
  551. '人材机编码' : newHl[i][1],
  552. '名称' : newHl[i][2],
  553. '规格型号': newHl[i][3],
  554. '单位' : newHl[i][4],
  555. '单价' : newHl[i][5],
  556. '产地' : newHl[i][6],
  557. '供应厂商' : newHl[i][7],
  558. '人材机类别' : newHl[i][8],
  559. '甲供标志': newHl[i][9],
  560. '含量' : newHl[i][10],
  561. '合价' : newHl[i][11],
  562. '暂估价标志' : newHl[i][12],
  563. '主要材料标志' : newHl[i][13],
  564. '主材标志' : newHl[i][14],
  565. '设备标志' : newHl[i][15]
  566. });
  567. }
  568. setRcjhl(y);
  569. if (rcjTable.current) {
  570. rcjTable.current.replaceData(y);
  571. }
  572. }
  573. };
  574. return (
  575. <GridToolbarContainer>
  576. <Button disabled={!showToolbar}
  577. color="primary" startIcon={<AddIcon />} onClick={handleClick}>
  578. 补充
  579. </Button>
  580. </GridToolbarContainer>
  581. );
  582. }
  583. React.useEffect(() => {
  584. myTable.current = new Tabulator(myRef.current, {
  585. index: "key",
  586. height: 380,
  587. data: detail, //link data to table
  588. reactiveData: false, //enable data reactivity
  589. dataTreeStartExpanded:true,
  590. dataTree: true,
  591. selectableRows:1, //make rows selectable
  592. editTriggerEvent:"dblclick", //trigger edit on double click
  593. dataTreeStartExpanded:function(row, level){
  594. //console.log(row);
  595. //console.log(level);
  596. return true; //expand rows where the "driver" data field is true;
  597. },
  598. columns: [ //Define Table Columns
  599. {title:"序号", field:"序号", width:80, headerSort:false, frozen: true}, //never hide this column
  600. {title:"清单编码", field:"清单编码", width:120,headerSort:false, frozen: true ,formatter:"textarea" },
  601. {title:"名称", field:"名称", width:150, headerSort:false, formatter:"textarea", editor: "input", editable: editCheck}, //hide this column first
  602. {title:"项目特征", field:"项目特征", width:200 , headerSort:false, formatter:"textarea"},
  603. {title:"计算规则", field:"计算规则", width:200, headerSort:false, formatter:"textarea"},
  604. {title:"单位", field:"单位", width:100, headerSort:false},
  605. {title:"数量", field:"数量", width:100, headerSort:false, editor: "input", editable: editCheck },
  606. {title:"综合单价", field:"综合单价", width:100, headerSort:false, formatter:"money"},
  607. {title:"合价", field:"合价", width:100, headerSort:false, formatter:"money"},
  608. {title:"人工费", field:"人工费", width:100, headerSort:false, formatter:"money"},
  609. {title:"主材费", field:"主材费", width:100, headerSort:false, formatter:"money"},
  610. {title:"设备费", field:"设备费", width:100, headerSort:false, formatter:"money"},
  611. {title:"辅材费", field:"辅材费", width:100, headerSort:false, formatter:"money"},
  612. {title:"材料费", field:"材料费", width:100, headerSort:false, formatter:"money"},
  613. {title:"机械费", field:"机械费", width:100, headerSort:false, formatter:"money"},
  614. {title:"管理费", field:"管理费", width:100, headerSort:false, formatter:"money"},
  615. {title:"利润", field:"利润", width:100, headerSort:false, formatter:"money"},
  616. {title:"暂估价", field:"暂估价", width:100, headerSort:false, formatter:"money"},
  617. {title:"综合人工工日", field:"综合人工工日", width:100, headerSort:false},
  618. ]
  619. });
  620. myTable.current.on("cellDblClick", function(e, cell){
  621. //e - the click event object
  622. //cell - cell component
  623. console.log(cell);
  624. });
  625. myTable.current.on("rowSelected", handleSelect);
  626. myTable.current.on("cellEdited", function(cell){
  627. //console.log("edited");
  628. //console.log();
  629. let key = cell._cell.row.data['key'];
  630. myTable.current.deselectRow();
  631. if(cell._cell.column.field == '名称') {
  632. let newData = updateDeMingcheng(cell._cell.row.data['名称'], selectedRowKeysTable.current[0]);
  633. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function() {
  634. let getRow = myTable.current.getRows(); //get array of currently selected row components.
  635. let component = null;
  636. for(let i = 0; i < getRow.length; i++) {
  637. let entry = getRow[i]._row.modules.dataTree.children;
  638. for(let j = 0; j < entry.length; j++) {
  639. let child = entry[j];
  640. if(child.data['key'] == key) {
  641. //console.log(child);
  642. component = child.component;
  643. break;
  644. }
  645. }
  646. }
  647. component.select();
  648. handleSelect(component);
  649. //handleSelect(getRow[0]);
  650. });
  651. }
  652. else{
  653. let [success, data] = updateShuliang(cell._cell.row.data['数量'], selectedRowKeysTable.current[0]);
  654. if (success) {
  655. myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function() {
  656. let getRow = myTable.current.getRows(); //get array of currently selected row components.
  657. let component = null;
  658. for(let i = 0; i < getRow.length; i++) {
  659. let entry = getRow[i]._row.modules.dataTree.children;
  660. for(let j = 0; j < entry.length; j++) {
  661. let child = entry[j];
  662. if(child.data['key'] == key) {
  663. //console.log(child);
  664. component = child.component;
  665. break;
  666. }
  667. }
  668. }
  669. component.select();
  670. handleSelect(component);
  671. //handleSelect(getRow[0]);
  672. });
  673. }
  674. }
  675. });
  676. myTable.current.on("tableBuilt", () => {
  677. Service.generateQingdanmingxi(name, bh, bt).then(x=>{
  678. myTable.current.replaceData(x);
  679. });
  680. });
  681. }, [bh, bt]);
  682. React.useEffect(
  683. () => {
  684. //console.log("rgde changed");
  685. //console.log(rgde);
  686. rgdeRef.current = rgde;
  687. jxdeRef.current = jxde;
  688. cldeRef.current = clde;
  689. if (isQdrcj.current) {
  690. highlight.current = [];
  691. } else {
  692. let toHighlight = [];
  693. for(let i = 0; i < rcjhl.length; i++) {
  694. let entry = rcjhl[i];
  695. let bianhao = entry['人材机编码'];
  696. let rcjlb = entry['人材机类别'];
  697. let hit = false;
  698. if (Number(rcjlb) == Number(1) && rgde) {
  699. for (let j = 0; j < rgde.length; j++) {
  700. if (rgde[j]["CLBH"] == bianhao) {
  701. if(rgde[j]["CLMC"] == entry['名称'])hit = true;
  702. let danjia = Number(entry['单价']);
  703. if (danjia != rgde[j]["YSJG"]) {
  704. //console.log(`[${i},5]danjia bu yizhi`);
  705. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  706. }
  707. let hanliang = Number(entry['含量']);
  708. if (hanliang != rgde[j]["gr"]) {
  709. //console.log(`[${i}, 10]hanliang bu yizhi`);
  710. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  711. }
  712. }
  713. }
  714. }
  715. if (Number(rcjlb) == Number(3) && jxde ) {
  716. for (let j = 0; j < jxde.length; j++) {
  717. if (jxde[j]["jxbh"] == bianhao) {
  718. if(jxde[j]["jxmc"] == entry['名称'])hit = true;
  719. let danjia = Number(entry['单价']);
  720. if (danjia != jxde[j]["tbdj"]) {
  721. //console.log(`[${i},5]danjia bu yizhi`);
  722. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  723. }
  724. let hanliang = Number(entry['含量']);
  725. if (hanliang != jxde[j]["sl"]) {
  726. //console.log(`[${i}, 10]hanliang bu yizhi`);
  727. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  728. }
  729. }
  730. }
  731. }
  732. if (Number(rcjlb) == Number(2) && clde ) {
  733. for (let j = 0; j < clde.length; j++) {
  734. if (clde[j]["CLBH"] == bianhao) {
  735. if(clde[j]["CLMC"] == entry['名称'])hit = true;
  736. let danjia = Number(entry['单价']);
  737. if (danjia != clde[j]["YSJG"]) {
  738. //console.log(`[${i},5]danjia bu yizhi`);
  739. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  740. }
  741. let hanliang = Number(entry['含量']);
  742. if (hanliang != clde[j]["SL"]) {
  743. //console.log(`[${i}, 10]hanliang bu yizhi`);
  744. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  745. }
  746. }
  747. }
  748. }
  749. if (!hit) {
  750. toHighlight.push({row: i, col: 1, renderer: "customStylesRenderer"});
  751. }
  752. }
  753. //console.log(toHighlight);
  754. highlight.current = toHighlight;
  755. }
  756. let bzrcjhl = [/*["人材机编码", "名称", "单位", "单价", "合价", "含量"]*/]
  757. if (rgde)
  758. for (let i = 0; i < rgde.length; i++) {
  759. bzrcjhl.push({'人材机编码': rgde[i]["CLBH"], '名称': rgde[i]["CLMC"], '单位': rgde[i]["JLDW"], '单价': rgde[i]["YSJG"], '合价': rgde[i]["gf"], '含量': rgde[i]["gr"]});
  760. }
  761. if (clde)
  762. for (let i = 0; i < clde.length; i++) {
  763. bzrcjhl.push({'人材机编码': clde[i]["CLBH"], '名称': clde[i]["CLMC"], '单位': clde[i]["JLDW"], '单价': clde[i]["YSJG"], '合价': clde[i]["HJ"], '含量': clde[i]["SL"]});
  764. }
  765. if (jxde)
  766. for (let i = 0; i < jxde.length; i++) {
  767. bzrcjhl.push({'人材机编码': jxde[i]["jxbh"], '名称': jxde[i]["jxmc"], '单位': jxde[i]["DW"], '单价': jxde[i]["tbdj"], '合价': jxde[i]["hj"], '含量': jxde[i]["sl"]});
  768. }
  769. setRcjhl2(bzrcjhl);
  770. }, [rgde, jxde, clde]
  771. );
  772. React.useEffect(
  773. () => {
  774. console.log(beizhu);
  775. let result = [];
  776. if (beizhu != null) {
  777. let keys = Object.keys(beizhu["BZBH"]);
  778. for(let i = 0; i < keys.length; i++) {
  779. let key = keys[i];
  780. result.push({'key': i+1, '序号': i+1, '编号': beizhu["BZBH"][key], '说明': beizhu["SM"][key]});//序号很重要
  781. }
  782. setFuzhu(result);
  783. let newSelect = extractFuzhu(debmRef.current);
  784. setSelectedRowKeys(newSelect);
  785. //setSelectedRowKeys([1]);
  786. }
  787. }, [beizhu]
  788. );
  789. React.useEffect(
  790. () => {
  791. beizhuFKRef.current = beizhuFK;
  792. }, [beizhuFK]
  793. );
  794. React.useEffect(
  795. () => {
  796. myTable.current.deselectRow();
  797. //console.log(dingeclick);
  798. if (selectedRowKeysTable.current.length > 0 ) {
  799. const [success, data, key] = changguidinge(JSON.parse(dingeclick), selectedRowKeysTable.current[0]);
  800. if (success) {
  801. myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
  802. let getRow = myTable.current.getRows(); //get array of currently selected row components.
  803. let component = null;
  804. for(let i = 0; i < getRow.length; i++) {
  805. let entry = getRow[i]._row.modules.dataTree.children;
  806. for(let j = 0; j < entry.length; j++) {
  807. let child = entry[j];
  808. if(child.data['key'] == key) {
  809. //console.log(child);
  810. component = child.component;
  811. break;
  812. }
  813. }
  814. }
  815. component.select();
  816. handleSelect(component);
  817. });
  818. }
  819. }
  820. }, [dingeclick]//常规添加定额
  821. );
  822. React.useEffect(
  823. () => {
  824. //console.log(dingeclick);
  825. if (selectedRowKeysTable.current.length > 0 ) {
  826. const data = huan(JSON.parse(tihuanClick), selectedRowKeysTable.current[0]);
  827. myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
  828. let getRow = myTable.current.getRows(); //get array of currently selected row components.
  829. let component = null;
  830. for(let i = 0; i < getRow.length; i++) {
  831. let entry = getRow[i]._row.modules.dataTree.children;
  832. for(let j = 0; j < entry.length; j++) {
  833. let child = entry[j];
  834. if(child.data['key'] == selectedRowKeysTable.current[0]) {
  835. //console.log(child);
  836. component = child.component;
  837. break;
  838. }
  839. }
  840. }
  841. handleSelect(component);
  842. });
  843. }
  844. }, [tihuanClick]//替换定额人材机
  845. );
  846. React.useEffect(
  847. () => {
  848. if (tuijianRef.current != null ) {
  849. tuijianTable.current = new Tabulator(tuijianRef.current, {
  850. index: "key",
  851. height: 200,
  852. data: tuijian, //link data to table
  853. reactiveData: false, //enable data reactivity
  854. dataTreeStartExpanded:false,
  855. dataTree: false,
  856. selectableRows:1, //make rows selectable
  857. columns: [ //Define Table Columns
  858. {title:"ID", field:"ID", width:80, headerSort:false, }, //never hide this column
  859. {title:"定额编号", field:"定额编号", width:120,headerSort:false, formatter:"textarea" },
  860. {title:"工程量名称", field:"工程量名称", width:150, headerSort:false, formatter:"textarea"}, //hide this column first
  861. {title:"工作内容", field:"工作内容", width:150 , headerSort:false, formatter:"textarea"},
  862. ]
  863. });
  864. tuijianTable.current.on("tableBuilt", () => {
  865. tuijianTable.current.replaceData(tuijian);
  866. });
  867. }
  868. if (rcj2Ref.current != null ) {
  869. rcj2Table.current = new Tabulator(rcj2Ref.current, {
  870. index: "key",
  871. height: 200,
  872. data: rcjhl2, //link data to table
  873. reactiveData: false, //enable data reactivity
  874. dataTreeStartExpanded:false,
  875. dataTree: false,
  876. selectableRows:1, //make rows selectable
  877. columns: [ //Define Table Columns
  878. {title:"人材机编码", field:"人材机编码", width:80, headerSort:false, }, //never hide this column
  879. {title:"名称", field:"名称", width:120,headerSort:false, formatter:"textarea" },
  880. {title:"单位", field:"单位", width:150, headerSort:false, formatter:"textarea"}, //hide this column first
  881. {title:"单价", field:"单价", width:150 , headerSort:false, formatter:"money"},
  882. {title:"合价", field:"合价", width:150 , headerSort:false, formatter:"money"},
  883. {title:"含量", field:"含量", width:150 , headerSort:false, formatter:"textarea"},
  884. ]
  885. });
  886. rcj2Table.current.on("tableBuilt", () => {
  887. rcj2Table.current.replaceData(rcjhl2);
  888. });
  889. }
  890. if (rcjRef.current != null ) {
  891. rcjTable.current = new Tabulator(rcjRef.current, {
  892. index: "key",
  893. height: 250,
  894. data: rcjhl, //link data to table
  895. reactiveData: false, //enable data reactivity
  896. dataTreeStartExpanded:false,
  897. dataTree: false,
  898. selectableRows:1, //make rows selectable
  899. editTriggerEvent:"dblclick",
  900. rowFormatter:function(row){
  901. //row - row component
  902. var data = row.getData();
  903. if (data['人材机编码'] == '410000F') {
  904. row.getElement().style.backgroundColor = "#ffff00";
  905. }
  906. },
  907. columns: [ //Define Table Columns
  908. {title:"ID", field:"ID", width:80, headerSort:false, },
  909. {title:"人材机编码", field:"人材机编码", width:100, headerSort:false, }, //never hide this column
  910. {title:"名称", field:"名称", width:120,headerSort:false, formatter:"textarea", editor: "input", editable: editCheckRcj },
  911. {title:"规格型号", field:"规格型号", width:80, headerSort:false, editor: "input", editable: editCheckRcj },
  912. {title:"单位", field:"单位", width:80, headerSort:false, formatter:"textarea"}, //hide this column first
  913. {title:"单价", field:"单价", width:80 , headerSort:false, formatter: sparklineFormatter, editor: "input", editable: editCheckRcj },
  914. {title:"产地", field:"产地", width:80, headerSort:false, },
  915. {title:"供应厂商", field:"供应厂商", width:80, headerSort:false, },
  916. {title:"人材机类别", field:"人材机类别", width:80, headerSort:false, },
  917. {title:"甲供标志", field:"甲供标志", width:80 , headerSort:false, formatter:"textarea"},
  918. {title:"含量", field:"含量", width:80 , headerSort:false, formatter:"money", formatterParams:{precision:4}, editor: "input", editable: editCheckRcj },
  919. {title:"合价", field:"合价", width:80 , headerSort:false, formatter:"money"},
  920. {title:"暂估价标志", field:"暂估价标志", width:80 , headerSort:false, formatter:"textarea"},
  921. {title:"主要材料标志", field:"主要材料标志", width:100 , headerSort:false, formatter:"textarea"},
  922. {title:"主材标志", field:"主材标志", width:80 , headerSort:false, formatter:"textarea"},
  923. {title:"设备标志", field:"设备标志", width:80 , headerSort:false, formatter:"textarea"},
  924. ]
  925. });
  926. rcjTable.current.on("tableBuilt", () => {
  927. rcjTable.current.replaceData(rcjhl);
  928. });
  929. rcjTable.current.on("cellDblClick", function(e, cell){
  930. //e - the click event object
  931. //cell - cell component
  932. let determine = cell._cell.row.getData()['人材机编码'] != '410000F';
  933. if(cell._cell.column.getPosition() == 2 && !isQdrcj.current && determine) {
  934. tihuanCallback(cell._cell.row.position, cell._cell.column.getPosition());
  935. }
  936. });
  937. rcjTable.current.on("cellEdited", function(cell){
  938. let data = copy(cell._cell.table.getData());
  939. for(let i = 0; i < data.length; i++) {
  940. data[i]['合价'] = Number(data[i]['单价']) * Number(data[i]['含量']);
  941. }
  942. setRcjhl(data);
  943. if (rcjTable.current) {
  944. rcjTable.current.replaceData(data);
  945. }
  946. let data2 = [['ID', '人材机编码', '名称', '规格型号', '单位', '单价', '产地', '供应厂商', '人材机类别', '甲供标志', '含量', '合价', '暂估价标志', '主要材料标志', '主材标志', '设备标志']]
  947. for (let i = 0; i < data.length; i++) {
  948. data2.push([data[i]['ID'], data[i]['人材机编码'], data[i]['名称'], data[i]['规格型号'], data[i]['单位'],
  949. data[i]['单价'], data[i]['产地'], data[i]['供应厂商'], data[i]['人材机类别'],
  950. data[i]['甲供标志'], data[i]['含量'], data[i]['合价'], data[i]['暂估价标志'], data[i]['主要材料标志'], data[i]['主材标志'], data[i]['设备标志']]);
  951. }
  952. let newData = updateDercj(selectedRowKeysTable.current[0], data2);
  953. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function() {
  954. let getRow = myTable.current.getRows(); //get array of currently selected row components.
  955. let component = null;
  956. for(let i = 0; i < getRow.length; i++) {
  957. let entry = getRow[i]._row.modules.dataTree.children;
  958. for(let j = 0; j < entry.length; j++) {
  959. let child = entry[j];
  960. if(child.data['key'] == selectedRowKeysTable.current[0]) {
  961. //console.log(child);
  962. component = child.component;
  963. break;
  964. }
  965. }
  966. }
  967. handleSelect(component);
  968. });
  969. });
  970. }
  971. }, [valueTab]
  972. );
  973. return (
  974. <Stack spacing={2}>
  975. <Box>
  976. <Stack direction='row' spacing={2}>
  977. <Button variant="outlined" size="small" onClick={() => {
  978. if (selectedRowKeysTable.current.length > 0) {
  979. let getRow = myTable.current.getRows(); //get array of currently selected row components.
  980. let hit = false;
  981. for(let i = 0; i < getRow.length; i++) {
  982. if (getRow[i]._row.data['key'] == selectedRowKeysTable.current[0]) {
  983. hit = true;
  984. }
  985. }
  986. if (hit) {
  987. suanshiCallback();
  988. }
  989. }
  990. }}
  991. >定额(算式)</Button>
  992. <Button variant="outlined" size="small" onClick={() => {
  993. if (selectedRowKeysTable.current.length > 0) {
  994. const [success, data] = danxiangdinge(selectedRowKeysTable.current[0]);
  995. if(success) {
  996. myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
  997. selectedRowKeysTable.current = [];
  998. selectedRowKeysTableParent.current = null;
  999. setRcjhl([]);
  1000. if (rcjTable.current) {
  1001. rcjTable.current.replaceData([]);
  1002. }
  1003. setFuzhu([]);
  1004. setRcjrows([]);
  1005. setShowToolbar(false);
  1006. setSelectedRowKeys2([]);
  1007. setYubanEnable(false);
  1008. isQdrcj.current = true;
  1009. highlight.current = [];
  1010. });
  1011. }
  1012. }
  1013. }}
  1014. >单项定额</Button>
  1015. <Button variant="outlined" size="small" onClick={() => {
  1016. if (selectedRowKeysTable.current.length > 0) {
  1017. let newData = shanchu(selectedRowKeysTable.current[0]);
  1018. myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
  1019. if (newData.filter(x=>x['key'] == selectedRowKeysTable.current[0]).length == 0) {
  1020. selectedRowKeysTable.current = [];
  1021. selectedRowKeysTableParent.current = [];
  1022. setRcjhl([]);
  1023. if (rcjTable.current) {
  1024. rcjTable.current.replaceData([]);
  1025. }
  1026. setFuzhu([]);
  1027. setRcjrows([]);
  1028. setShowToolbar(false);
  1029. setSelectedRowKeys2([]);
  1030. setYubanEnable(false);
  1031. isQdrcj.current = true;
  1032. highlight.current = [];
  1033. }
  1034. });
  1035. }
  1036. }}
  1037. >删除</Button>
  1038. <Button variant="outlined" size="small" onClick={() => {
  1039. let newData = undo();
  1040. myTable.current.updateData(newData).then(function(){
  1041. selectedRowKeysTable.current = [];
  1042. selectedRowKeysTableParent.current = null;
  1043. setRcjhl([]);
  1044. if (rcjTable.current) {
  1045. rcjTable.current.replaceData([]);
  1046. }
  1047. setFuzhu([]);
  1048. setRcjrows([]);
  1049. setShowToolbar(false);
  1050. setSelectedRowKeys2([]);
  1051. setYubanEnable(false);
  1052. isQdrcj.current = true;
  1053. highlight.current = [];
  1054. });
  1055. }}
  1056. >撤销</Button>
  1057. <Button variant="outlined" size="small" onClick={() => {
  1058. let newData = redo();
  1059. myTable.current.updateData(newData).then(function(){
  1060. selectedRowKeysTable.current = [];
  1061. selectedRowKeysTableParent.current = null;
  1062. setRcjhl([]);
  1063. if (rcjTable.current) {
  1064. rcjTable.current.replaceData([]);
  1065. }
  1066. setFuzhu([]);
  1067. setRcjrows([]);
  1068. setShowToolbar(false);
  1069. setSelectedRowKeys2([]);
  1070. setYubanEnable(false);
  1071. isQdrcj.current = true;
  1072. highlight.current = [];
  1073. });
  1074. }}
  1075. >重做</Button>
  1076. <Button variant="outlined" size="small" onClick={() => {
  1077. console.log("save to cloud");
  1078. loadingCallback();
  1079. }}
  1080. >保存</Button>
  1081. </Stack>
  1082. <div style={{width: "70vw"}}>
  1083. <div ref={myRef}>
  1084. </div>
  1085. </div>
  1086. </Box>
  1087. <Box >
  1088. <TabContext value={valueTab}>
  1089. <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
  1090. <TabList sx={{minHeight: '24px'}} onChange={handleChange} aria-label="lab API tabs example">
  1091. <Tab sx={{p: 0, minHeight: '24px'}} label="人材机含量" value="1" />
  1092. <Tab sx={{p: 0, minHeight: '24px'}} label="标准定额人材机含量" value="2" />
  1093. <Tab sx={{p: 0, minHeight: '24px'}} label="人材机补充" value="3" />
  1094. <Tab sx={{p: 0, minHeight: '24px'}} label="定额附注" value="4" />
  1095. <Tab sx={{p: 0, minHeight: '24px'}} label="预拌砂浆" value="5" />
  1096. <Tab sx={{p: 0, minHeight: '24px'}} label="组价推荐" value="6" />
  1097. </TabList>
  1098. </Box>
  1099. <TabPanel sx={{p: 1}} value="1">
  1100. <div style={{width:"70vw"}}>
  1101. <div ref={rcjRef}></div>
  1102. </div>
  1103. </TabPanel>
  1104. <TabPanel sx={{p: 1}} value="2">
  1105. <div ref={rcj2Ref}></div>
  1106. </TabPanel>
  1107. <TabPanel sx={{p: 1}} value="3">
  1108. <Box
  1109. sx={{
  1110. height: 200,
  1111. width: '100%',
  1112. '& .actions': {
  1113. color: 'text.secondary',
  1114. },
  1115. '& .textPrimary': {
  1116. color: 'text.primary',
  1117. },
  1118. }}
  1119. >
  1120. <DataGrid disableColumnMenu disableColumnSorting
  1121. hideFooter={true}
  1122. rows={rcjrows}
  1123. columns={rcjcolumns}
  1124. processRowUpdate={processRowUpdate}
  1125. slotProps={{
  1126. toolbar: { setRcjrows },
  1127. }}
  1128. slots={{
  1129. toolbar: EditToolbar,
  1130. }}
  1131. localeText={zhCN_MUI.components.MuiDataGrid.defaultProps.localeText}
  1132. />
  1133. </Box>
  1134. </TabPanel>
  1135. <TabPanel sx={{p: 1}} value="4">
  1136. <Box sx={{maxHeight: `190px`}}>
  1137. <ConfigProvider
  1138. locale={zhCN}
  1139. theme={{
  1140. components: {
  1141. Table: {
  1142. /* here is your component tokens */
  1143. cellPaddingBlock : 8
  1144. },
  1145. },
  1146. }}
  1147. >
  1148. <Table
  1149. scroll={{ x: 'max-content' , y : 190}}
  1150. pagination={false}
  1151. rowSelection={rowSelection}
  1152. columns={
  1153. [
  1154. { title: '序号', dataIndex: '序号', width : 80},
  1155. {
  1156. title: '编号',
  1157. dataIndex: '编号',
  1158. },
  1159. {
  1160. title: '说明',
  1161. dataIndex: '说明',
  1162. width: 550
  1163. },
  1164. ]
  1165. }
  1166. dataSource={fuzhu} />
  1167. </ConfigProvider>
  1168. </Box>
  1169. </TabPanel>
  1170. <TabPanel sx={{p: 1}} value="5">
  1171. <Box sx={{maxHeight: `190px`}}>
  1172. <ConfigProvider
  1173. locale={zhCN}
  1174. theme={{
  1175. components: {
  1176. Table: {
  1177. /* here is your component tokens */
  1178. cellPaddingBlock : 8
  1179. },
  1180. },
  1181. }}
  1182. >
  1183. <Table
  1184. scroll={{ x: 'max-content' , y : 190}}
  1185. pagination={false}
  1186. rowSelection={rowSelection2}
  1187. columns={
  1188. [
  1189. {
  1190. title: '说明',
  1191. dataIndex: '说明',
  1192. width: 550
  1193. },
  1194. ]
  1195. }
  1196. dataSource={yuban} />
  1197. </ConfigProvider>
  1198. </Box>
  1199. </TabPanel>
  1200. <TabPanel sx={{p: 1}} value="6">
  1201. <div ref={tuijianRef}></div>
  1202. </TabPanel>
  1203. </TabContext>
  1204. </Box>
  1205. </Stack>
  1206. );
  1207. }