Bladeren bron

DJCS yuban

Ubuntu 1 maand geleden
bovenliggende
commit
ecebd868dd
6 gewijzigde bestanden met toevoegingen van 576 en 28 verwijderingen
  1. 26 2
      src/App2.js
  2. 157 3
      src/Djcs3.js
  3. 20 3
      src/Qingdan3.js
  4. 329 19
      src/Service.js
  5. 7 0
      src/editor.js
  6. 37 1
      src/index.js

+ 26 - 2
src/App2.js

@@ -273,9 +273,9 @@ function a11yProps(index) {
       });
     };
 
- const AICallback = (data) => {
+ const AICallback = (data, maxN) => {
         setBopen(true); 
-        Service.pushTask(data, navigate);
+        Service.pushTask(data, maxN, outlineLabelRef.current, navigate);
     };
 
 
@@ -783,6 +783,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(false);
                   setFbrgycl(false);
+		  setAIClick(null);
                   //setColumnHeaders(["序号", "名称", "金额", "暂估价", "类别"]);
                 });
         }
@@ -805,6 +806,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(false);
                   setFbrgycl(false);
+		  setAIClick(null);
                   //setColumnHeaders(["序号", "名称", "取费基数", "计算基础","费率", "金额", "类别"]);
                 });
 
@@ -840,6 +842,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(false);
                   setFbrgycl(false);
+		  setAIClick(null);
                   //setColumnHeaders(["序号", "名称", "取费基数", "计算基础", "金额", "类别"]);
                 });
 
@@ -847,6 +850,16 @@ function a11yProps(index) {
         else if (itemId.includes("cuo shi xiang mu")) {
           let regex = /[0-9]*/; 
           let id = itemId.match(regex)[0];     
+          for (let i = 0; i < outlineRef.current.length; i++) {
+            if (outlineRef.current[i].hasOwnProperty('children')) {
+              let children = outlineRef.current[i]['children'];
+              for(let j = 0; j < children.length; j++) {
+                if (children[j]['id'] == id) {
+                  outlineLabelRef.current = children[j]['label'];
+                }
+              }
+            }
+          }    
           setValue("1");
           setNest(false);
           setQingdan(false);
@@ -863,6 +876,7 @@ function a11yProps(index) {
           setJrg(false);
           setZcbfwf(false);
           setFbrgycl(false);
+		  setAIClick(null);
           //setColumnHeaders(["序号", "名称", "取费基数", "计算基础", "金额", "类别"]);
 
         }
@@ -889,6 +903,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(false);
                   setFbrgycl(false);
+		  setAIClick(null);
                  //setColumnHeaders(["序号", "名称", "金额", "项目类别", "备注"]);
                 });
 
@@ -913,6 +928,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(false);
                   setFbrgycl(false);
+		  setAIClick(null);
                   //setColumnHeaders(["序号", "名称", "金额", "项目类别", "备注"]);
                 });
         }
@@ -938,6 +954,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(false);
                   setFbrgycl(false);
+		  setAIClick(null);
                 });
 
         }
@@ -962,6 +979,7 @@ function a11yProps(index) {
                   setJrg(true);
                   setZcbfwf(false);
                   setFbrgycl(false);
+		  setAIClick(null);
                 });
 
         }
@@ -986,6 +1004,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(true);
                   setFbrgycl(false);
+		  setAIClick(null);
                 });
 
         }
@@ -1010,6 +1029,7 @@ function a11yProps(index) {
                   setJrg(false);
                   setZcbfwf(false);
                   setFbrgycl(true);
+		  setAIClick(null);
                 });
 
         }
@@ -1035,6 +1055,7 @@ function a11yProps(index) {
                   setZcbfwf(false);
                   setFbrgycl(false);
                   setQdbh(id);
+		  setAIClick(null);
                 //}
                 //)
                 ;
@@ -1057,6 +1078,7 @@ function a11yProps(index) {
             setJrg(false);
             setZcbfwf(false);
             setFbrgycl(false);
+		  setAIClick(null);
         });
 
         }
@@ -1444,6 +1466,8 @@ function a11yProps(index) {
                          bh={dwgc}
                          beizhu={beizhu}
                          clickCallback={clickCallback}
+                                AIClick={AIClick}
+	                        AICallback={AICallback}
                          loadingCallback={loadingCallback_djcs}
                          dingeclick={dingeclick}
                          beizhuFK={beizhuFK}

+ 157 - 3
src/Djcs3.js

@@ -12,13 +12,19 @@ import TabContext from "@mui/lab/TabContext";
 import TabList from "@mui/lab/TabList";
 import TabPanel from "@mui/lab/TabPanel";
 import Stack from "@mui/material/Stack";
+import Radio from '@mui/material/Radio';
+import Typography from '@mui/material/Typography';
+import RadioGroup from '@mui/material/RadioGroup';
+import FormControlLabel from '@mui/material/FormControlLabel';
+import FormControl from '@mui/material/FormControl';
+import FormLabel from '@mui/material/FormLabel';
 import Service from './Service';
 import SimpleService from './SimpleService';
 import {TabulatorFull as Tabulator} from "tabulator-tables"; //import Tabulator library
 import './Tabulator.css';
 import {extractFuzhu, match_target} from './utils';
 import Button from '@mui/material/Button';
-import {shanchu_djcs, undo_djcs, redo_djcs, danxiangdinge_djcs, updateDercj_djcs, changguidinge_djcs, handleBeizhu_djcs, huan, updateShuliang_djcs, azfy_djcs_eligible, azfy_djcs} from './editor';
+import {handleAI_djcs, shanchu_djcs, undo_djcs, redo_djcs, danxiangdinge_djcs, updateDercj_djcs, changguidinge_djcs, handleBeizhu_djcs, handleYuban_djcs, huan, updateShuliang_djcs, azfy_djcs_eligible, azfy_djcs} from './editor';
 import {copy} from './utils';
 import { useNavigate } from "react-router";
 
@@ -31,7 +37,7 @@ function number_equal(a, b) {
      }
      return false;
 }
-export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadingCallback, dingeclick, azfycallback, azfySelect, azfyConfirm}) {
+export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, AICallback,AIClick, loadingCallback, dingeclick, azfycallback, azfySelect, azfyConfirm}) {
      const navigate = useNavigate();
     
      var editCheck = function(cell){
@@ -133,6 +139,8 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
                selectedRowKeysTableParent.current = row._row['data']['key'];
 
                setFuzhu([]);
+               setYubanEnable(false);
+               setValueYuban("");
                Service.generateQingdanrcj(name, bh,bt,row._row.data['清单编码']).then(x=>{
                     let y =[];
                     for (let i = 1; i < x.length; i++) {
@@ -213,6 +221,13 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
                               }
                                isQdrcj.current = false;
                                setFuzhuEnable(x[1]);
+	        	       setYubanEnable(x[1]);
+                               if (x[2]== null || x[2].length == 0) {
+                                  setValueYuban("");
+                               } else {
+                                  setValueYuban(x[2][0]);
+                               }
+
                                let toHighlight = [];
                                highlight.current = toHighlight;
                              });
@@ -241,6 +256,71 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
     const beizhuFKRef = React.useRef(null);
 
     const [fuzhuEnable, setFuzhuEnable] = React.useState(false);
+    const [yubanEnable, setYubanEnable] = React.useState(false);
+    const [valueYuban, setValueYuban] = React.useState("");
+	//预拌砂浆
+    const onSelectChange2 = (event) => {
+
+          setValueYuban(event.target.value);
+          const [newData, newHl]  = handleYuban_djcs(selectedRowKeysTable.current[0], [event.target.value]);
+          if (newData) {
+                                          let former = myTable.current.element.children[1].scrollTop;
+                                          let former2 = myTable.current.element.children[1].scrollLeft;
+                                          myTable.current.deselectRow();
+               myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
+
+                                            myTable.current.element.children[1].scrollTop = former;
+                                            myTable.current.element.children[1].scrollLeft = former2;
+                                              let getRow = myTable.current.getRows(); //get array of currently selected row components.
+                                              let component = null;
+                                              for(let i = 0; i < getRow.length; i++) {
+                                                   let entry = getRow[i]._row.modules.dataTree.children;
+                                                   for(let j = 0; j < entry.length; j++) {
+                                                        let child = entry[j];
+                                                        if(child.data['key'] == selectedRowKeysTable.current[0]) {
+                                                             component = child.component;
+                                                             break;
+                                                        }
+
+                                                   }
+
+                                              }
+                                              component.select();
+
+
+                });
+               let y =[];
+               for (let i = 1; i < newHl.length; i++) {
+                 y.push({
+               'ID' : newHl[i][0],
+               '人材机编码' : newHl[i][1],
+               '名称' : newHl[i][2],
+               '规格型号': newHl[i][3],
+               '单位' : newHl[i][4],
+               '单价' : newHl[i][5],
+               '产地' : newHl[i][6],
+               '供应厂商' : newHl[i][7],
+               '人材机类别' : newHl[i][8],
+               '甲供标志': newHl[i][9],
+               '含量' : newHl[i][10],
+               '合价' : newHl[i][11],
+               '暂估价标志' : newHl[i][12],
+               '主要材料标志' : newHl[i][13],
+               '主材标志' : newHl[i][14],
+               '设备标志' : newHl[i][15] ,
+               'key' : newHl[i][16],
+               'bc': newHl[i][17]
+
+               });
+             }
+              setRcjhl(y);
+              if (rcjTable.current) {
+                 rcjTable.current.replaceData(y);
+              }
+
+            }
+
+        };
 
     const onSelectChange = (newSelectedRowKeys) => {
      
@@ -376,6 +456,8 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
           rcjTable.current.replaceData([]);
      }
      setFuzhu([]);
+     setYubanEnable(false);
+     setValueYuban("");
      isQdrcj.current = true;
      highlight.current = [];
      setTuijian([]);
@@ -385,7 +467,7 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
     React.useEffect(() => {
      myTable.current = new Tabulator(myRef.current, {
           index: "key",
-          height: 380,
+          height: 480,//adjust
           renderVertical: "basic",
         data: detail, //link data to table
         reactiveData: false, //enable data reactivity
@@ -474,6 +556,24 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
    }, [bh]);
 
 
+   React.useEffect(
+          () => {
+              if (AIClick!=null){
+		      console.log(AIClick);
+                 const [success, data, key] = handleAI_djcs(AIClick);
+                         if(success) {
+                                          let former = myTable.current.element.children[1].scrollTop;
+                                          let former2 = myTable.current.element.children[1].scrollLeft;
+                              myTable.current.updateData(data.filter(x=>x['key'] == selectedRowKeysTableParent.current)).then(function(){
+                                     myTable.current.element.children[1].scrollTop = former;
+                                     myTable.current.element.children[1].scrollLeft = former2;
+                                   resetUI();
+                                 });
+                         }
+              }
+          }, [AIClick]//AI添加定额
+      );
+
    React.useEffect(
      () => {
           beizhuFKRef.current = beizhuFK;
@@ -943,7 +1043,32 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
                       
                       }}
                    >保存</Button>
+                   <Button variant="outlined" size="small" onClick={() => {
+                            console.log("AI");
+                            console.log(selectedRowKeysTableParent.current);
+                            let target = myTable.current.getRows().filter(x=>x._row['data']['key']==selectedRowKeysTableParent.current);
+                            if (target.length > 0){
+                                let rows = myTable.current.getRows();
+                                    let maxN = 0;
+                                    for(let i = 0; i < rows.length; i++) {
+                                        let r = rows[i];
+                                        let c = (r._row['data']['_children']);
+                                            for (let j = 0;  j < c.length; j++) {
+                                                  let bm = c[j]['清单编码'];
+                                                  if (bm.startsWith("D")){
+                                                       let bm2 = bm.substring(1);
+                                                       let n = parseInt(bm2, 10);
+                                                       if (n > maxN) {
+                                                               maxN = n;
+                                                       }
+                                                  }
+                                            }
+                                    }
+                                    AICallback(target[0]._row['data'], maxN);
+                            }
 
+                      }}
+                   >小造AI</Button>
                   
                    </Stack>
                  <div ref={myRef}> 
@@ -955,6 +1080,7 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
                          <TabList onChange={handleChange} aria-label="lab API tabs example"  sx={{minHeight: '24px'}}   >
                            <Tab sx={{p: 0, minHeight: '24px'}} label="人材机含量" value="1" />
                            <Tab sx={{p: 0, minHeight: '24px'}} label="定额附注" value="3" />
+	                   <Tab sx={{p: 0, minHeight: '24px'}} label="预拌砂浆" value="5" />
                            <Tab sx={{p: 0, minHeight: '24px'}} label="组价推荐" value="4" />
                          </TabList>
                        </Box>
@@ -1012,6 +1138,34 @@ export default function Djcs3({name, bh,  beizhu, beizhuFK, clickCallback, loadi
                           <div ref={tuijianRef}></div>
 
                        </TabPanel>
+	               <TabPanel sx={{p: 1}} value="5">
+                        <Box sx={{maxHeight: `190px`}}>
+                        <FormControl>
+                         <FormLabel id="demo-controlled-radio-buttons-group">说明</FormLabel>
+                          <RadioGroup
+                           aria-labelledby="demo-controlled-radio-buttons-group"
+                           name="controlled-radio-buttons-group"
+                            value={valueYuban}
+                           onChange={onSelectChange2}
+                         >
+                         <FormControlLabel  disabled = {!yubanEnable} value="0" control={<Radio />} label={
+                                <Typography sx={{fontSize: "0.875rem"}} >无</Typography>
+                            } />
+                         <FormControlLabel disabled = {!yubanEnable} value="1" control={<Radio />} label={
+                                <Typography sx={{fontSize: "0.875rem"}} >湿拌砂浆</Typography>
+                            } />
+                         <FormControlLabel disabled = {!yubanEnable} value="2" control={<Radio />} label={
+                                <Typography sx={{fontSize: "0.875rem"}} >散装干拌(混)砂浆</Typography>
+                            } />
+                         <FormControlLabel disabled = {!yubanEnable} value="3" control={<Radio />} label={
+                                <Typography sx={{fontSize: "0.875rem"}} >袋装干拌(混)砂浆</Typography>
+                            } />
+                         </RadioGroup>
+                         </FormControl>
+                       
+                        </Box>
+                       </TabPanel>
+
                      </TabContext>
                   </Box>
 

+ 20 - 3
src/Qingdan3.js

@@ -871,7 +871,7 @@ export default function Qingdan3({name, bh, bt,  beizhu/*后台传回来的附
         
           myTable.current = new Tabulator(myRef.current, {
                index: "key",
-               height: 380,
+               height: 480,//480?adjust
                renderVertical: "basic",
              data: detail, //link data to table
              reactiveData: false, //enable data reactivity
@@ -1456,8 +1456,25 @@ const EditableCell = ({ rowData, dataType, dataKey, onChange, ...props }) => {
                             console.log("AI");
                             console.log(selectedRowKeysTableParent.current);
                             let target = myTable.current.getRows().filter(x=>x._row['data']['key']==selectedRowKeysTableParent.current);
-                            if (target.length > 0)
-                                AICallback(target[0]._row['data']);
+                            if (target.length > 0){
+                                let rows = myTable.current.getRows();
+				    let maxN = 0;
+				    for(let i = 0; i < rows.length; i++) {
+                                        let r = rows[i];
+					let c = (r._row['data']['_children']);
+					    for (let j = 0;  j < c.length; j++) {
+                                                  let bm = c[j]['清单编码'];
+						  if (bm.startsWith("D")){
+                                                       let bm2 = bm.substring(1);
+						       let n = parseInt(bm2, 10);
+                                                       if (n > maxN) {
+                                                               maxN = n;
+						       }
+						  }
+					    }
+				    }
+				    AICallback(target[0]._row['data'], maxN);
+			    }
                       
                       }}
                    >小造AI</Button>

+ 329 - 19
src/Service.js

@@ -294,7 +294,7 @@ class Service{
         if (bt == 'Djcs') {
             let qd = this.cache_djcs.filter(x=>x["清单编码"] == qdbm)[0];
             let de = qd["_children"].filter(x=>x["清单编码"]==debm && x['key'] == key)[0];
-            return [copy(de["dercj"]), de["fuzhuEnable"]];
+            return [copy(de["dercj"]), de["fuzhuEnable"], de['yuban']];
         
         }
         let qd = this.cache.filter(x=>x["清单编码"] == qdbm)[0];
@@ -895,9 +895,11 @@ class Service{
 
     }
 
-    //有预拌砂浆,没有补充
-    updateDercj_djcs_(row, data, xuhao, mode=0/**0->update by view; 1-> config change */) {///change 一条定额 inplace, 汇总一条定额的rcj, xuhao is for rename
+    //有预拌砂浆,没有补充
+    updateDercj_djcs_(row, data, xuhao, yuban, mode=0/**0->update by view; 1-> config change */) {///change 一条定额 inplace, 汇总一条定额的rcj, xuhao is for rename
         console.log("data updated");
+	let data_normal = [["ID", "人材机编码", "名称", "规格型号", "单位", "单价", "产地",
+        "供应厂商", "人材机类别", "甲供标志", "含量", "合价", "暂估价标志", "主要材料标志", "主材标志", "设备标志", 'key', 'bc' ]];//正常部分,不包括补充
         //处理附注
         let huan = false;
         let qd = this.cache_djcs.filter(x=>x["_children"].filter(y=>y['key']==row).length > 0)[0];
@@ -992,23 +994,30 @@ class Service{
             for(let j = 1; j < de['dercj'].length; j++) {
                     for (let k = 0; k < data.length; k++) {
                         if (data[k][16] == de['dercj'][j][16]) {
-                            if (de['dercj'][j][2] == data[k][2]) {//名称
-                                
-                            } else {
-                                huan = true;
-                            }
-                            
+                            let datak2 = data[k][2];
+                                if (datak2.includes('(湿拌砂浆)')) {
+                                    datak2 = datak2.replace('(湿拌砂浆)', '');
+                                }
+                                if (datak2.includes('(干拌(混)砂浆)')) {
+                                    datak2 = datak2.replace('(干拌(混)砂浆)', '');
+                                }
+                                if (de['dercj'][j][2] == datak2) {//名称
+                                    
+                                } else {
+                                    huan = true;
+                                }
+
                         }
                     }        
             }
             
 
             if (mode == 1) {
-                data = de['dercj'];
+                data_normal = de['dercj'];
                 huan = false;
             } else {
                 de['dercj'] = copy(data);
-                data = de['dercj'];
+                data_normal = de['dercj'];
             }
         
 
@@ -1017,8 +1026,236 @@ class Service{
         } else {////单项定额没有底稿,老数据没底搞,无法判断换部换,暂时统一认为不换
             //强行改含量
             de['dercj'] = copy(data);
-            data = de['dercj'];
+            data_normal = de['dercj'];
         }
+        if (yuban.length > 0) {//处理预拌砂浆
+            if (yuban.includes('1')) {//与换无关
+                for(let i = 1; i < data_normal.length; i++) {
+                    if (data_normal[i][4]=='工日') {
+                        data_normal[i][10] = Number(data_normal[i][10]) - 0.45;
+                    }
+                    if (data_normal[i][2].includes('搅拌机')) {
+                        data_normal[i][10] = 0;
+                    }
+                    if (data_normal[i][2].includes('砂浆') && !data_normal[i][2].includes('搅拌机')) {
+                        data_normal[i][2] = data_normal[i][2].concat('(湿拌砂浆)')
+                    }
+                }
+                if (mode == 0) {
+                    data_normal  = copy(data);
+                } else if (mode == 1) {
+                    //data_normal = data_normal.filter(x=>x[17]!='true');
+                    //data_normal = data_normal.concat(data.filter(x=> x[17] == 'true'));
+                } else if (mode == 2) {
+                    let data_normal_2 = copy(data_normal);
+                    data_normal = data.filter(x=>x[17]!='true');
+                    data_normal = data_normal.concat(data_normal_2.filter(x=> x[17] == 'true'));
+                }
+
+            } else if (yuban.includes('2')) {//与换无关
+                
+                let added = [];
+                for(let i = 1; i < data_normal.length; i++) {
+                  let origin = 0;
+                  if (data_normal[i][4]=='工日') {
+                    data_normal[i][10] = Number(data_normal[i][10]) - 0.3;
+                  }
+                  if (data_normal[i][2].includes('搅拌机')) {
+                    data_normal[i][10] = 0;
+                  }
+                  if (data_normal[i][2].includes('砂浆') && !data_normal[i][2].includes('搅拌机')) {
+                    data_normal[i][2] = data_normal[i][2].concat('(干拌(混)砂浆)');
+                    origin = Number(data_normal[i][10]); 
+                    data_normal[i][10] = origin * 1.75;
+                    added.push(['', 'S00001', '水', '', 't', '4.70', '', '', '2', 'false', (origin * 0.29).toString(), ''/**hj */, ''/**zgj */,''/**zycl */,''/**zc */,''/**sb */,'',data_normal[i][17]]);
+                    added.push(['', 'JD0001', '其他机械费(电)', '', '度', '0.65', '', '', '3', 'false', (origin * 2.15).toString(), ''/**hj */, ''/**zgj */,''/**zycl */,''/**zc */,''/**sb */, '',data_normal[i][17]]);
+    
+                  }
+
+                }
+                data_normal = data_normal.concat(added);
+                if (mode == 0) {
+                    data_normal  = copy(data);
+                } else if (mode == 1) {
+                    //data_normal = data_normal.filter(x=>x[17]!='true');
+                    //data_normal = data_normal.concat(data.filter(x=> x[17] == 'true'));
+                } else if (mode == 2) {
+                    let data_normal_2 = copy(data_normal);
+                    data_normal = data.filter(x=>x[17]!='true');
+                    data_normal = data_normal.concat(data_normal_2.filter(x=> x[17] == 'true'));
+                }
+
+
+            } else if (yuban.includes('3')) {//与换无关
+                let added = [];
+                for(let i = 1; i < data_normal.length; i++) {
+                  let origin = 0;
+                  if (data_normal[i][4]=='工日') {
+                    data_normal[i][10] = Number(data_normal[i][10]) - 0.2;
+                  } 
+                  if (data_normal[i][2].includes('砂浆') && !data_normal[i][2].includes('搅拌机')) {
+                    data_normal[i][2] = data_normal[i][2].concat('(干拌(混)砂浆)');
+                    origin = Number(data_normal[i][10]); 
+                    data_normal[i][10] = origin * 1.75;
+                    added.push(['', 'S00001', '水', '', 't', '4.70', '', '', '2', 'false', (origin * 0.29).toString(), '', '','','','','',data_normal[i][17]]);
+
+                  }
+                }
+                data_normal = data_normal.concat(added);
+                if (mode == 0) {
+                    data_normal  = copy(data);
+                } else if (mode == 1) {
+                    //data_normal = data_normal.filter(x=>x[17]!='true');
+                    //data_normal = data_normal.concat(data.filter(x=> x[17] == 'true'));
+                } else if (mode == 2) {
+                    let data_normal_2 = copy(data_normal);
+                    data_normal = data.filter(x=>x[17]!='true');
+                    data_normal = data_normal.concat(data_normal_2.filter(x=> x[17] == 'true'));
+                }
+
+
+            } else {
+                let data_normal_2 = [["ID", "人材机编码", "名称", "规格型号", "单位", "单价", "产地", 
+            "供应厂商", "人材机类别", "甲供标志", "含量", "合价", "暂估价标志", "主要材料标志", "主材标志", "设备标志", 'key', 'bc' ]];
+                for(let i = 1; i < data_normal.length; i++) {
+                    let bc = data_normal[i][17];
+                    let child = addChildren(10, data_normal[i][1], data_normal[i][10], data_normal[i][17], data_normal[i][16]);
+                    if (child.length > 0) {
+
+                    } else {
+                        child = addChildren(40, data_normal[i][1], data_normal[i][10], data_normal[i][17], data_normal[i][16]);
+                        if (child.length > 0) {
+
+                        } else {
+                            child = addChildren(50, data_normal[i][1], data_normal[i][10], data_normal[i][17], data_normal[i][16]);
+                        }
+                    }
+                    if (child.length > 0) {//拆分
+                        for(let j = 0; j < child.length; j++) {
+                            data_normal_2.push(child[j]);
+                            if (bc == 'true') {
+                                for (let k = 0; k < data.length; k++) {
+                                    if (data[k][16] == child[j][16]) {
+                                        let datak2 = data[k][2];
+                                    
+                                        if (child[j][2] == datak2) {//名称
+                                        
+                                        } else {
+                                            if (mode > 0) {
+
+                                            } else {
+                                                huan = true;
+                                            }
+                                        }
+                                    
+                                    }
+                                }  
+                            } else if (mode != 1){
+                                for (let k = 0; k < data.length; k++) {
+                                    if (data[k][16] == child[j][16]) {
+                                        let datak2 = data[k][2];
+                                    
+                                        if (child[j][2] == datak2) {//名称
+                                        
+                                        } else {
+                                            huan = true;
+                                        }
+                                    
+                                    }
+                                }  
+                            }
+                        }
+
+
+                    } else {
+                        data_normal_2.push(data_normal[i]);
+                    }
+                }
+                if (mode == 0) {
+                    data_normal = copy(data);
+                } else if (mode == 2) {
+                    data_normal = data.filter(x=>x[17]!='true');
+                    data_normal = data_normal.concat(data_normal_2.filter(x=> x[17] == 'true'));
+                } else if (mode == 1) {
+                    data_normal = data_normal_2;
+                    //data_normal = data_normal.concat(data.filter(x=> x[17] == 'true'));
+                }
+            }
+            
+        } else {//没有预拌
+            let data_normal_2 = [["ID", "人材机编码", "名称", "规格型号", "单位", "单价", "产地", 
+            "供应厂商", "人材机类别", "甲供标志", "含量", "合价", "暂估价标志", "主要材料标志", "主材标志", "设备标志", 'key', 'bc' ]];
+            for(let i = 1; i < data_normal.length; i++) {
+                let bc = data_normal[i][17];
+                let child = addChildren(10, data_normal[i][1], data_normal[i][10], data_normal[i][17], data_normal[i][16]);
+                if (child.length > 0) {
+
+                } else {
+                    child = addChildren(40, data_normal[i][1], data_normal[i][10], data_normal[i][17], data_normal[i][16]);
+                    if (child.length > 0) {
+
+                    } else {
+                        child = addChildren(50, data_normal[i][1], data_normal[i][10], data_normal[i][17], data_normal[i][16]);
+                    }
+                }
+                if (child.length > 0) {//拆分
+                    for(let j = 0; j < child.length; j++) {
+                        data_normal_2.push(child[j]);
+                        if (bc == 'true') {
+                            for (let k = 0; k < data.length; k++) {
+                                if (data[k][16] == child[j][16]) {
+                                    let datak2 = data[k][2];
+                                    
+                                    if (child[j][2] == datak2) {//名称
+                                        
+                                    } else {
+                                        if (mode > 0) {
+
+                                        } else {
+                                            huan = true;
+                                        }
+                                    }
+                                    
+                                }
+                            }  
+                        } else if (mode != 1){
+                            for (let k = 0; k < data.length; k++) {
+                                if (data[k][16] == child[j][16]) {
+                                    let datak2 = data[k][2];
+                                    
+                                    if (child[j][2] == datak2) {//名称
+                                        
+                                    } else {
+                                        huan = true;
+                                    }
+                                    
+                                }
+                            }  
+                        }
+                    }
+
+
+                } else {
+                    data_normal_2.push(data_normal[i]);
+                }
+
+            }
+
+            if (mode == 0) {
+                data_normal = copy(data);
+            } else if (mode == 2) {
+                data_normal = data.filter(x=>x[17]!='true');
+                data_normal = data_normal.concat(data_normal_2.filter(x=> x[17] == 'true'));
+            } else if (mode == 1) {
+                data_normal = data_normal_2;
+                //data_normal = data_normal.concat(data.filter(x=> x[17] == 'true'));
+            }
+
+        }        
+        data = copy(data_normal);
+
+
+	
         //模拟formula计算每一行的合价
         for(let i = 1; i < data.length; i++) {
             data[i][11] = Number(data[i][10]) * Number(data[i][5]);
@@ -1655,7 +1892,7 @@ class Service{
 
 
         
-        this.updateDercj_djcs_(row, data, alreadyFuzhu);
+        this.updateDercj_djcs_(row, data, alreadyFuzhu, []);
         //let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
 
         let newData = this.cache_djcs.map(x=>{
@@ -1716,7 +1953,7 @@ class Service{
 
         }
         de['fuzhu'] = copy(selected);
-        this.updateDercj_djcs_(row, de['dercj'], xuhao, 1);
+        this.updateDercj_djcs_(row, de['dercj'], xuhao, [], 1);
 
         let newData = this.cache_djcs.map(x=>{
             if (x['key'] == qd['key']) {
@@ -1939,7 +2176,7 @@ class Service{
                     
         });
 
-        this.updateDercj_djcs_(newKey, dercj, []);
+        this.updateDercj_djcs_(newKey, dercj, [], []);
         let summarized = this.summarize_djcs(this.cache_djcs);
         this.push_op_djcs(copy(summarized));
         this.cache_djcs = copy(summarized);
@@ -2041,7 +2278,7 @@ class Service{
     
                     
                 });
-                this.updateDercj_djcs_(newKey, newdercj, []);
+                this.updateDercj_djcs_(newKey, newdercj, [], [], 1);
                 let summarized = this.summarize_djcs(this.cache_djcs);
                 this.push_op_djcs(copy(summarized));
                 /////////////////
@@ -2055,13 +2292,51 @@ class Service{
         }
     }
 
+    handleAI_djcs(result) {
+        let keys = Object.keys(result);
+        let datakey = null;
+        for (let i = 0; i < keys.length; i++) {
+            let key = keys[i]
+            let hits = this.cache_djcs.filter(x=>x['清单编码']==key);
+            let qd = hits[0]
+	    if (qd == null)continue;
+            let r = result[key]
+            let rr = r['result']
+            let rrr = rr['result'][0]
+            //console.log(rrr)
+            //console.log(qd)
+            datakey = qd['key']
+            qd['rcj']=rrr['rcj']
+            qd['主材费'] = String(rrr['主材费'])
+            qd['人工费'] = String(rrr['人工费'])
+            qd['利润'] = String(rrr['利润'])
+            qd['合价'] = String(rrr['合价'])
+            qd['暂估价'] = String(rrr['暂估价'])
+            qd['机械费'] = String(rrr['机械费'])
+            qd['材料费'] = String(rrr['材料费'])
+            qd['管理费'] = String(rrr['管理费'])
+            qd['综合人工工日'] = String(rrr['综合人工工日'])
+            qd['综合单价'] = String(rrr['综合单价'])
+            qd['设备费'] = String(rrr['设备费'])
+            qd['辅材费'] = String(rrr['辅材费'])
+            qd['_children'] = rrr['_children']
+        }
+                this.push_op_djcs(copy(this.cache_djcs));
+            
+
+                return [true, copy(this.cache_djcs), datakey];
+    }
+
     handleAI(result) {
         let keys = Object.keys(result);
         let datakey = null;
+	let changed = false;
         for (let i = 0; i < keys.length; i++) {
             let key = keys[i]
             let hits = this.cache.filter(x=>x['清单编码']==key);
             let qd = hits[0]
+	    if (qd == null)continue;
+	    changed = true;
             let r = result[key]
             let rr = r['result']
             let rrr = rr['result'][0]
@@ -2083,11 +2358,15 @@ class Service{
             qd['辅材费'] = String(rrr['辅材费'])
             qd['_children'] = rrr['_children']
         }
+	    if (changed) {
                 this.push_op(copy(this.cache));
             
                 this.updateFootprint(datakey);
 
                 return [true, copy(this.cache), datakey];
+            } else {
+                return [false, null, null];
+	    }
     }
 
     changguidinge(dingeclick, row) {
@@ -2320,6 +2599,35 @@ class Service{
 
     }
 
+    handleYuban_djcs(row, selected) {
+        let qd = this.cache_djcs.filter(x=>x["_children"].filter(y=>y['key']==row).length > 0)[0];
+        if (!qd) return [null, null];
+        let de = qd["_children"].filter(x=>x['key'] == row)[0];
+        let bm = de['清单编码'];
+        let alreadyFuzhu = extractFuzhu(bm);//[xuhao]
+        if (de.hasOwnProperty("rcjdg")) {//底稿
+
+        } else {///老数据不能有底稿,附注功能也不使能,预拌也不能使
+            //de['rcjdg'] = copy(de['dercj']);
+
+        }
+        de['yuban'] = copy(selected);
+        this.updateDercj_djcs_(row, de['dercj'], alreadyFuzhu, selected,  1);
+
+        let newData = this.cache_djcs.map(x=>{
+            if (x['key'] == qd['key']) {
+                return qd;
+            } else {
+                return x;
+            }
+        });
+        let summarized = this.summarize_djcs(newData);
+        this.push_op_djcs(summarized);
+        /////////////////
+        this.cache_djcs = copy(summarized);
+        return [copy(this.cache_djcs), copy(de['dercj'])];
+    }
+
     handleYuban(row, selected) {
         let qd = this.cache.filter(x=>x["_children"].filter(y=>y['key']==row).length > 0)[0];
         if (!qd) return [null, null];
@@ -2398,7 +2706,7 @@ class Service{
         return input;
     }
 
- async   pushTask(data, navigate) {
+ async   pushTask(data, maxN, label, navigate) {
         let data2 = copy(data);
         data2['now'] = Date.now();
         const response = await fetch(this.ip().concat( "/pushtask/"), {
@@ -2413,7 +2721,9 @@ class Service{
                "mc" : data['名称'],
                "tz" : data['项目特征'],
                "dw" : data['单位'] ,
-               "sl" : data['数量']
+               "sl" : data['数量'],
+	       "n"  : maxN,
+	       "label": label
             } )
         });
         if (!response.ok) {
@@ -2449,7 +2759,7 @@ async checkTask() {
         }else {
             let now = entry['now'];
             let current = Date.now();
-            if (current - now > 100000){
+            if (current - now > 300000){
                 entry['result']="failed";
                 return "failed";
             } else {

+ 7 - 0
src/editor.js

@@ -132,9 +132,16 @@ export const handleBeizhu = (beizhuFK/**辅库json */, derow, fuzhuSelect/*被
 export const handleAI = (result ) => {
     return Service.handleAI(result);
 
+};
+export const handleAI_djcs = (result ) => {
+    return Service.handleAI_djcs(result);
+
 };
 ///////////////////////////////////////////DJCS///////////////////////////////////////////
+export const handleYuban_djcs = (derow, select ) => {
+    return Service.handleYuban_djcs(derow, select);
 
+};
 export const handleBeizhu_djcs = (beizhuFK, derow, fuzhuSelect, fuzhu ) => {
     console.log(beizhuFK);
     let bianma = [];

+ 37 - 1
src/index.js

@@ -9,10 +9,46 @@ const Home2 = React.lazy(() => import('./Home2'));
 const App2 = React.lazy(() => import('./App2'));
 const AI = React.lazy(() => import('./AI'));
 const Signin = React.lazy(() => import('./Signin'));
+const notFoundStyle = {
+    display: 'flex',
+    justifyContent: 'center',
+    alignItems: 'center',
+    height: '100vh',
+    flexDirection: 'column',
+    backgroundColor: '#f4f4f9',
+    color: '#333',
+    fontFamily: 'Arial, sans-serif',
+    textAlign: 'center',
+};
+  const headingStyle = {
+    fontSize: '4rem',
+    fontWeight: 'bold',
+    margin: '0',
+};
+  const subheadingStyle = {
+    fontSize: '1.5rem',
+    marginTop: '20px',
+};
+  const emojiStyle = {
+    fontSize: '5rem',
+    marginBottom: '20px',
+};
 
+
+
+
+function ErrorBoundary() {
+  return ( 
+<div style={notFoundStyle}>
+<div style={emojiStyle}>🚫</div>
+<h1 style={headingStyle}>小造同学遇到了一点麻烦</h1>
+<p style={subheadingStyle}>请刷新页面重试,我们会积极尝试优化体验</p>
+</div>)
+}
 const router = createBrowserRouter([
    {path: "/editor/qingdan/:id",
-     element: (<Suspense fallback={<div></div>}><SnackbarProvider><App2></App2></SnackbarProvider></Suspense>)
+     element: (<Suspense fallback={<div></div>}><SnackbarProvider><App2></App2></SnackbarProvider></Suspense>),
+     errorElement : (<ErrorBoundary />)
    },
    {path: "/editor/index.html",
    element: (<Suspense fallback={<div></div>}><Home2></Home2></Suspense>)