Qingdan3.js 77 KB

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