Qingdan3.js 73 KB

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