Qingdan3.js 75 KB

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