Djcs.js 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. import * as React from 'react';
  2. import Box from "@mui/material/Box";
  3. import 'handsontable/dist/handsontable.full.min.css';
  4. //import 'handsontable/styles/ht-theme-main.min.css';
  5. import { HandsonTable } from 'handsontable/base';
  6. import {HotTable} from "@handsontable/react";
  7. //import { registerAllModules } from 'handsontable/registry';
  8. import {RichTreeView } from "@mui/x-tree-view/RichTreeView";
  9. import { Grid } from '@mui/material';
  10. import Tab from "@mui/material/Tab";
  11. import TabContext from "@mui/lab/TabContext";
  12. import TabList from "@mui/lab/TabList";
  13. import TabPanel from "@mui/lab/TabPanel";
  14. import Stack from "@mui/material/Stack";
  15. //import { registerPlugin, NestedRows } from 'handsontable/plugins';
  16. //registerPlugin(NestedRows);
  17. import Service from './Service';
  18. import { textRenderer, registerRenderer } from 'handsontable/renderers';
  19. export default function Djcs({name, bh, rgde, jxde, clde, beizhu, clickCallback}) {
  20. registerRenderer('customStylesRenderer', (hotInstance, TD, ...rest) => {
  21. textRenderer(hotInstance, TD, ...rest);
  22. TD.style.fontWeight = 'bold';
  23. TD.style.color = 'green';
  24. TD.style.background = '#d7f1e1';
  25. });
  26. registerRenderer('highlightRowRenderer', (hotInstance, TD, ...rest) => {
  27. textRenderer(hotInstance, TD, ...rest);
  28. TD.style.color = 'green';
  29. TD.style.background = '#d7f1e1';
  30. });
  31. const [detail, setDetail] = React.useState([
  32. {
  33. "序号": null, "清单编码": null, "名称" : null, "项目特征" : null,
  34. "计算规则" : null, "单位" : null, "数量" : null,
  35. "综合单价" : null, "合价" : null, "人工费" : null, "主材费" : null,
  36. "设备费" : null, "辅材费" : null, "材料费" : null,
  37. "机械费" : null, "管理费" : null, "利润" : null, "暂估价" : null, "综合人工工日" : null }
  38. ]);
  39. const hotRef = React.useRef(null);
  40. const [value, setValue] = React.useState("1");
  41. const [rcjhl, setRcjhl] = React.useState([]);
  42. const [rcjhl2, setRcjhl2] = React.useState([]);
  43. const [fuzhu, setFuzhu] = React.useState([]);
  44. const [tuijian, setTuijian] = React.useState([]);
  45. const [highlight, setHighlight] = React.useState([]);
  46. const selectedRow = React.useRef(-1);
  47. const rgdeRef = React.useRef(null);
  48. const jxdeRef = React.useRef(null);
  49. const cldeRef = React.useRef(null);
  50. const isQdrcj = React.useRef(false);
  51. React.useEffect(
  52. () => {
  53. Service.generateDjcs(name, bh).then(x=>{
  54. setDetail(x);
  55. selectedRow.current = -1;
  56. });
  57. }, [bh]
  58. );
  59. React.useEffect(
  60. () => {
  61. console.log(beizhu);
  62. let result = [["序号", "编号", "说明"]];
  63. if (beizhu != null) {
  64. let keys = Object.keys(beizhu["BZBH"]);
  65. for(let i = 0; i < keys.length; i++) {
  66. let key = keys[i];
  67. result.push([i+1, beizhu["BZBH"][key], beizhu["SM"][key]]);
  68. }
  69. setFuzhu(result);
  70. }
  71. }, [beizhu]
  72. );
  73. React.useEffect(
  74. () => {
  75. console.log("rgde changed");
  76. console.log(rgde);
  77. rgdeRef.current = rgde;
  78. jxdeRef.current = jxde;
  79. cldeRef.current = clde;
  80. if (isQdrcj.current) {
  81. setHighlight([]);
  82. } else {
  83. let toHighlight = [];
  84. for(let i = 1; i < rcjhl.length; i++) {
  85. let entry = rcjhl[i];
  86. let bianhao = entry[1];
  87. let rcjlb = entry[8];
  88. if (Number(rcjlb) == Number(1) && rgde) {
  89. for (let j = 0; j < rgde.length; j++) {
  90. if (rgde[j]["CLBH"] == bianhao) {
  91. let danjia = Number(entry[5]);
  92. if (danjia != rgde[j]["YSJG"]) {
  93. console.log(`[${i},5]danjia bu yizhi`);
  94. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  95. }
  96. let hanliang = Number(entry[10]);
  97. if (hanliang != rgde[j]["gr"]) {
  98. console.log(`[${i}, 10]hanliang bu yizhi`);
  99. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  100. }
  101. }
  102. }
  103. }
  104. if (Number(rcjlb) == Number(3) && jxde ) {
  105. for (let j = 0; j < jxde.length; j++) {
  106. if (jxde[j]["jxbh"] == bianhao) {
  107. let danjia = Number(entry[5]);
  108. if (danjia != jxde[j]["tbdj"]) {
  109. console.log(`[${i},5]danjia bu yizhi`);
  110. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  111. }
  112. let hanliang = Number(entry[10]);
  113. if (hanliang != jxde[j]["sl"]) {
  114. console.log(`[${i}, 10]hanliang bu yizhi`);
  115. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  116. }
  117. }
  118. }
  119. }
  120. if (Number(rcjlb) == Number(2) && clde ) {
  121. for (let j = 0; j < clde.length; j++) {
  122. if (clde[j]["CLBH"] == bianhao) {
  123. let danjia = Number(entry[5]);
  124. if (danjia != clde[j]["YSJG"]) {
  125. console.log(`[${i},5]danjia bu yizhi`);
  126. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  127. }
  128. let hanliang = Number(entry[10]);
  129. if (hanliang != clde[j]["SL"]) {
  130. console.log(`[${i}, 10]hanliang bu yizhi`);
  131. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  132. }
  133. }
  134. }
  135. }
  136. }
  137. console.log(toHighlight);
  138. setHighlight(toHighlight);
  139. }
  140. let bzrcjhl = [["人材机编码", "名称", "单位", "单价", "合价", "含量"]]
  141. if (rgde)
  142. for (let i = 0; i < rgde.length; i++) {
  143. bzrcjhl.push([rgde[i]["CLBH"], rgde[i]["CLMC"], rgde[i]["JLDW"], rgde[i]["YSJG"], rgde[i]["gf"], rgde[i]["gr"]]);
  144. }
  145. if (clde)
  146. for (let i = 0; i < clde.length; i++) {
  147. bzrcjhl.push([clde[i]["CLBH"], clde[i]["CLMC"], clde[i]["JLDW"], clde[i]["YSJG"], clde[i]["HJ"], clde[i]["SL"]]);
  148. }
  149. if (jxde)
  150. for (let i = 0; i < jxde.length; i++) {
  151. bzrcjhl.push([jxde[i]["jxbh"], jxde[i]["jxmc"], jxde[i]["DW"], jxde[i]["tbdj"], jxde[i]["hj"], jxde[i]["sl"]]);
  152. }
  153. setRcjhl2(bzrcjhl);
  154. }, [rgde, jxde, clde]
  155. );
  156. const handleChange = (event, newValue) => {
  157. setValue(newValue);
  158. };
  159. return (
  160. <Stack spacing={2}>
  161. <Box>
  162. <HotTable
  163. nestedRows={true}
  164. data={detail
  165. }
  166. afterSelection={(row, column)=>{
  167. selectedRow.current = row;
  168. console.log(row);
  169. let bt = "Djcs" ;
  170. let selected = hotRef.current?.hotInstance?.getData()[row];
  171. if (selected[0] != null) {
  172. Service.generateQingdanrcj(name, bh,bt,selected[1]).then(x=>{
  173. setRcjhl(x);
  174. isQdrcj.current=true;
  175. setHighlight([]);
  176. });
  177. Service.generateQingdanTuijian(name, bh,bt,selected[1]).then(x=>{
  178. setTuijian(x);
  179. //isQdrcj.current = true;
  180. //setHighlight([]);
  181. });
  182. }else{
  183. let qdbm = null;
  184. for (let i = row - 1; i > -1; i= i - 1) {
  185. let above = hotRef.current?.hotInstance?.getData()[i];
  186. if (above[0] != null) {
  187. qdbm = above[1];
  188. break;
  189. }
  190. }
  191. clickCallback(qdbm, selected[1]);
  192. Service.generateDingercj(name, bh,bt,qdbm, selected[1]).then(x=>{
  193. setRcjhl(x);
  194. isQdrcj.current = false;
  195. let toHighlight = [];
  196. for(let i = 1; i < x.length; i++) {
  197. let entry = x[i];
  198. let bianhao = entry[1];
  199. let rcjlb = entry[8];
  200. if (Number(rcjlb) == 1 && rgdeRef.current ) {
  201. for (let j = 0;j < rgdeRef.current.length; j++) {
  202. if (rgdeRef.current[j]["CLBH"] == bianhao) {
  203. let danjia = Number(entry[5]);
  204. if (danjia != rgdeRef.current[j]["YSJG"]) {
  205. console.log(`[${i},5]danjia bu yizhi`);
  206. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  207. }
  208. let hanliang = Number(entry[10]);
  209. if (hanliang != rgdeRef.current[j]["gr"]) {
  210. console.log(`[${i}, 10]hanliang bu yizhi`);
  211. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  212. }
  213. }
  214. }
  215. }
  216. if (Number(rcjlb) == 3 && jxdeRef.current ) {
  217. for (let j = 0; j < jxdeRef.current.length; j++) {
  218. if (jxdeRef.current[j]["jxbh"] == bianhao) {
  219. let danjia = Number(entry[5]);
  220. if (danjia != jxdeRef.current[j]["tbdj"]) {
  221. console.log(`[${i},5]danjia bu yizhi`);
  222. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  223. }
  224. let hanliang = Number(entry[10]);
  225. if (hanliang != jxdeRef.current[j]["sl"]) {
  226. console.log(`[${i}, 10]hanliang bu yizhi`);
  227. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  228. }
  229. }
  230. }
  231. }
  232. if (Number(rcjlb) == 2 && cldeRef.current ) {
  233. for (let j = 0; j < cldeRef.current.length; j++) {
  234. if (cldeRef.current[j]["CLBH"] == bianhao) {
  235. let danjia = Number(entry[5]);
  236. if (danjia != cldeRef.current[j]["YSJG"]) {
  237. console.log(`[${i},5]danjia bu yizhi`);
  238. toHighlight.push({row: i, col: 5, renderer: "customStylesRenderer"});
  239. }
  240. let hanliang = Number(entry[10]);
  241. if (hanliang != cldeRef.current[j]["SL"]) {
  242. console.log(`[${i}, 10]hanliang bu yizhi`);
  243. toHighlight.push({row: i, col: 10, renderer: "customStylesRenderer"});
  244. }
  245. }
  246. }
  247. }
  248. }
  249. setHighlight(toHighlight);
  250. });
  251. }
  252. }}
  253. cells={(row, col, prop) => {
  254. if (row == selectedRow.current) {
  255. return {
  256. // row options, which apply to each cell of the second row
  257. // and to each cell of the fifth row
  258. renderer: "highlightRowRenderer"
  259. };
  260. }
  261. }
  262. }
  263. ref = {hotRef}
  264. contextMenu={true}
  265. bindRowsWithHeaders={true}
  266. fixedRowsTop={0}
  267. fixedColumnsStart={2}
  268. manualColumnResize={true}
  269. rowHeaders={true}
  270. colHeaders={["ID", "序号", "清单编码", "名称", "项目特征", "计算规则", "单位", "数量", "综合单价", "合价", "人工费", "主材费", "设备费", "辅材费", "材料费", "机械费", "管理费", "利润" , "暂估价", "综合人工工日" ]}
  271. height="400"
  272. selectionMode="single"
  273. autoWrapRow={false}
  274. autoWrapCol={false}
  275. readOnly={true}
  276. licenseKey="non-commercial-and-evaluation" // for non-commercial use only
  277. />
  278. </Box>
  279. <Box >
  280. <TabContext value={value}>
  281. <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
  282. <TabList onChange={handleChange} aria-label="lab API tabs example">
  283. <Tab label="人材机含量" value="1" />
  284. <Tab label="标准定额人材机含量" value="2" />
  285. <Tab label="定额附注" value="3" />
  286. <Tab label="组价推荐" value="4" />
  287. </TabList>
  288. </Box>
  289. <TabPanel value="1">
  290. <HotTable
  291. nestedRows={false}
  292. data={rcjhl
  293. }
  294. cell={highlight}
  295. manualColumnResize={true}
  296. rowHeaders={true}
  297. colHeaders={true}
  298. height="300"
  299. readOnly={true}
  300. fixedRowsTop={1}
  301. selectionMode="single"
  302. autoWrapRow={false}
  303. autoWrapCol={false}
  304. licenseKey="non-commercial-and-evaluation" // for non-commercial use only
  305. />
  306. </TabPanel>
  307. <TabPanel value="2">
  308. <HotTable
  309. nestedRows={false}
  310. data={rcjhl2
  311. }
  312. manualColumnResize={true}
  313. rowHeaders={true}
  314. colHeaders={true}
  315. height="300"
  316. readOnly={true}
  317. fixedRowsTop={1}
  318. selectionMode="single"
  319. autoWrapRow={false}
  320. autoWrapCol={false}
  321. licenseKey="non-commercial-and-evaluation" // for non-commercial use only
  322. />
  323. </TabPanel>
  324. <TabPanel value="3">
  325. <HotTable
  326. nestedRows={false}
  327. data={fuzhu
  328. }
  329. manualColumnResize={true}
  330. rowHeaders={true}
  331. colHeaders={true}
  332. height="300"
  333. readOnly={true}
  334. fixedRowsTop={1}
  335. selectionMode="single"
  336. autoWrapRow={false}
  337. autoWrapCol={false}
  338. licenseKey="non-commercial-and-evaluation" // for non-commercial use only
  339. />
  340. </TabPanel>
  341. <TabPanel value="4">
  342. <HotTable
  343. nestedRows={false}
  344. data={tuijian
  345. }
  346. manualColumnResize={true}
  347. rowHeaders={true}
  348. colHeaders={true}
  349. height="300"
  350. readOnly={true}
  351. fixedRowsTop={1}
  352. selectionMode="single"
  353. autoWrapRow={false}
  354. autoWrapCol={false}
  355. licenseKey="non-commercial-and-evaluation" // for non-commercial use only
  356. />
  357. </TabPanel>
  358. </TabContext>
  359. </Box>
  360. </Stack>
  361. );
  362. }