Ver Fonte

support fuzhu with todo in the future

Xiaopeng Zhang há 6 meses atrás
pai
commit
b288f5cd1e
5 ficheiros alterados com 228 adições e 102 exclusões
  1. 50 13
      front/src/App2.js
  2. 57 73
      front/src/Qingdan.js
  3. 100 16
      front/src/Service.js
  4. 3 0
      front/src/editor.js
  5. 18 0
      front/src/utils.js

+ 50 - 13
front/src/App2.js

@@ -2,6 +2,8 @@ import * as React from 'react';
 import Box from "@mui/material/Box";
 import 'handsontable/dist/handsontable.full.min.css';
 //import 'handsontable/styles/ht-theme-main.min.css';
+import { styled, alpha } from '@mui/material/styles';
+
 import { HandsonTable } from 'handsontable/base';
 import {HotTable} from "@handsontable/react";
 import { registerAllModules } from 'handsontable/registry';
@@ -32,6 +34,7 @@ import Stack from '@mui/material/Stack';
 import { DataGrid } from '@mui/x-data-grid';
 import Backdrop from '@mui/material/Backdrop';
 import CircularProgress from '@mui/material/CircularProgress';
+import { TreeItem, treeItemClasses } from '@mui/x-tree-view/TreeItem';
 
 registerAllModules();
 const MUI_X_PRODUCTS = [
@@ -77,6 +80,25 @@ const MUI_X_PRODUCTS = [
   ];
 
 
+  const CustomTreeItem = styled(TreeItem)(({ theme }) => ({
+    
+    [`& .${treeItemClasses.content}`]: {
+      
+      padding: theme.spacing(0.5, 1),
+      margin: theme.spacing(0.2, 0),
+      [`& .${treeItemClasses.label}`]: {
+        fontSize: '0.8rem',
+        fontWeight: 500,
+      },
+    }
+    
+    
+   
+  }));
+
+
+
+
   export default function App2() {
 
 
@@ -636,22 +658,24 @@ const MUI_X_PRODUCTS = [
 
 
 
-                <Accordion expanded={expandedQd}
+                <Accordion expanded={expandedQd} disableGutters
                      onChange={handleChangeAccord('qingdan')}>
-                   <AccordionSummary
+                   <AccordionSummary 
                      expandIcon={<ExpandMoreIcon />}
                      aria-controls="panel1-content"
                      id="panel1-header"
                    >
-                     <Typography component="span">清单</Typography>
+                     <Typography  component="span">清单</Typography>
                    </AccordionSummary>
                    <AccordionDetails>
-                     <RichTreeView sx={{overflow: "scroll", maxHeight: "98vh"}}
+                     <RichTreeView sx={{overflow: "scroll", maxHeight: "90vh"}}
                      onItemSelectionToggle={handleItemSelectionToggle}
+                     slots={{ item: CustomTreeItem }}
+
                      items={outline}/>
                    </AccordionDetails>
                  </Accordion>
-                <Accordion expanded={expandedDe}
+                <Accordion expanded={expandedDe} disableGutters
                       onChange={handleChangeAccord('dinge')}>
                    <AccordionSummary
                      expandIcon={<ExpandMoreIcon />}
@@ -661,7 +685,7 @@ const MUI_X_PRODUCTS = [
                      <Typography component="span">定额</Typography>
                    </AccordionSummary>
                    <AccordionDetails>
-                     <FormControl fullWidth>
+                     <FormControl  size="small">
                      <InputLabel id="demo-multiple-name-label">专业</InputLabel>
                      <Select
                        labelId="demo-multiple-name-label"
@@ -678,15 +702,25 @@ const MUI_X_PRODUCTS = [
                      <MenuItem value={60}>修缮(安装)</MenuItem>
                      </Select>
                    </FormControl> 
-                   <Stack spacing={2}>
+                   <Stack spacing={1}>
                     <RichTreeView sx={{overflow: "scroll", maxHeight: "48vh"}}
                      onItemSelectionToggle={handleItemSelectionToggleDes}
+                     slots={{ item: CustomTreeItem }}
+
                      selectedItems={selectedItems}
                      expandedItems={expandedItems}
                      items={outlineDes}/>
                   <div style={{ height: 350 }}>
 
                     <DataGrid
+                    sx={{
+                      '& .MuiDataGrid-cell': {
+                        fontSize: '0.8rem', // Adjust font size for cells
+                      },
+                    /*  '& .MuiDataGrid-columnHeaders': {
+                        fontSize: '1rem', // Adjust font size for column headers
+                      },*/
+                    }}
                        getRowHeight={() => 'auto'}
                       rows={deXilie}
                       columns={columns}
@@ -697,7 +731,7 @@ const MUI_X_PRODUCTS = [
                    </Stack>
                    </AccordionDetails>
                  </Accordion>
-                <Accordion expanded={expandedPb}
+                <Accordion expanded={expandedPb} disableGutters
                      onChange={handleChangeAccord('peibi')}>
                    <AccordionSummary
                      expandIcon={<ExpandMoreIcon />}
@@ -707,8 +741,10 @@ const MUI_X_PRODUCTS = [
                      <Typography component="span">配合比</Typography>
                    </AccordionSummary>
                    <AccordionDetails>
-                   <Stack spacing={2}>
+                   <Stack spacing={1}>
                      <RichTreeView sx={{overflow: "scroll", maxHeight: "38vh"}}
+                             slots={{ item: CustomTreeItem }}
+
                      onItemSelectionToggle={handleItemSelectionTogglePbs}
                      items={peibishu}/>
                     <div style={{ height: 350 }}>
@@ -762,11 +798,12 @@ const MUI_X_PRODUCTS = [
                    <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
                       <TabList scrollButtons='auto' 
                               variant="scrollable"
+                              sx={{minHeight: '24px'}}
                       onChange={handleChange} aria-label="lab API tabs example">
-                        {qdbt.map((x, index)=> <Tab label={x} value={(index+1).toString()} />)}
+                        {qdbt.map((x, index)=> <Tab sx={{p: 0, minHeight: '24px'}} label={x} value={(index+1).toString()} />)}
                       </TabList>
                    </Box>
-                   {qdbt.map((x, index)=><TabPanel value={(index+1).toString()}>
+                   {qdbt.map((x, index)=><TabPanel sx={{p: 1}} value={(index+1).toString()}>
                              <Qingdan
                                 name={location["id"]}
                                 bh={qdbh}
@@ -792,10 +829,10 @@ const MUI_X_PRODUCTS = [
                         <Tab label="单价措施" value="2" />
                       </TabList>
                    </Box>
-                   <TabPanel value="1">
+                   <TabPanel sx={{p: 1}} value="1">
                      <Zjcs name={location["id"]} bh={dwgc}/>
                    </TabPanel>
-                   <TabPanel value="2">
+                   <TabPanel sx={{p: 1}} value="2">
                      <Djcs 
                          name={location["id"]} 
                          bh={dwgc}

+ 57 - 73
front/src/Qingdan.js

@@ -3,7 +3,7 @@ import Box from "@mui/material/Box";
 import 'handsontable/dist/handsontable.full.min.css';
 //import 'handsontable/styles/ht-theme-main.min.css';
 import { HandsonTable } from 'handsontable/base';
-import { Table } from "antd";
+import { Table, ConfigProvider } from "antd";
 import {HotTable} from "@handsontable/react";
 import { registerAllModules } from 'handsontable/registry';
 import {RichTreeView } from "@mui/x-tree-view/RichTreeView";
@@ -47,6 +47,12 @@ function copy(input) {
 
 
 export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuFK, clickCallback, loadingCallback, dingeclick}) {
+
+
+     
+
+
+
      const hyperformulaInstance = HyperFormula.buildEmpty({
           // to use an external HyperFormula instance,
           // initialize it with the `'internal-use-in-handsontable'` license key
@@ -65,41 +71,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
            setSelectedRowKeys([record.key]);
      }
      
-     function coverRenderer(_instance, td, _row, _col, _prop, value, _cellProperties) {
-     
-          let z = _instance.getDataAtRow(_row);
-          if(z[1] == null || z[1].length == 0) {
-               const button = document.createElement('button');
-               button.innerText="删除";
-               //img.src = value;
-               /*button.addEventListener('click', (event) => {
-                    console.log(hotRef.current?.hotInstance?.getData()[selectedRow.current]);
-                    hotRef.current?.hotInstance?.alter('remove_row', selectedRow.current, 1);
-                    //console.log(plugin);
-                   event.preventDefault();
-               });*/
-               button.addEventListener('mousedown', (event) => {
-                    setDetail(shanchu(hotRef, selectedRow));
-                    //console.log(plugin);
-                   event.preventDefault();
-               });
-               td.innerText = '';
-               td.appendChild(button);
-          } else {
-               const button = document.createElement('button');
-               button.innerText="全部删除";
-               //img.src = value;
-               button.addEventListener('mousedown', (event) => {
-                    setDetail(quanbushanchu(hotRef, selectedRow));
-                    event.preventDefault();
-               });
-               td.innerText = '';
-               td.appendChild(button);
-          }
-          
-      
-          return td;
-        }
+
 
 
 
@@ -115,20 +87,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
          }
          
        });
-       registerRenderer('highlightRowRenderer', (hotInstance, TD, row, column, ...rest) => {
-          if (row == selectedRow.current) {
-          if(column > 0 ) {
-              textRenderer(hotInstance, TD, row, column, ...rest);
-              TD.style.color = 'green';
-              TD.style.background = '#d7f1e1';
-          }
-          if (column == 0) {
-               coverRenderer(hotInstance, TD, row, column, ...rest);
-          }
-          } else {
-               textRenderer(hotInstance, TD, row, column, ...rest);
-          }
-        });
+ 
 
 
     const [detail, setDetail] = React.useState([
@@ -159,6 +118,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
     const highlight = React.useRef([]);
     const selectedRow = React.useRef(-1);
     const hotRef = React.useRef(null);
+    const detailRef = React.useRef(null);
     const hotRcjRef = React.useRef(null);
     const hotTuijianRef = React.useRef(null);
     const rgdeRef = React.useRef(null);
@@ -202,6 +162,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
              '暂估价' : '', '综合人工工日' : '', '备注' : '',  'key' : '1'}]; */
             
           setDetail(x);
+          detailRef.current = x;
 
           setRcjhl([]);
           setFuzhu([]);
@@ -217,7 +178,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                 let keys = Object.keys(beizhu["BZBH"]);
                 for(let i = 0; i < keys.length; i++) {
                     let key = keys[i];
-                    result.push({'id': i+1, '序号': i+1, '编号': beizhu["BZBH"][key], '说明': beizhu["SM"][key]});
+                    result.push({'id': i+1, '序号': i+1, '编号': beizhu["BZBH"][key], '说明': beizhu["SM"][key]});//序号很重要
                 }
                 setFuzhu(result);
                 setRowSelectionModel({type: 'include',
@@ -246,11 +207,12 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                     const [success, data] = changguidinge(JSON.parse(dingeclick), selectedRowKeys[0]);
                     if (success) {
                          setDetail(data);
+                         detailRef.current = data;
                          setExpandedRowKeys([...expandedRowKeys, selectedRowKeys[0]]);
                     }
                }
                
-          }, [dingeclick]
+          }, [dingeclick]//常规添加定额
       );
     React.useEffect(
         () => {
@@ -365,6 +327,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
           
           let newData = updateDercj(selectedRowKeys[0], data);
           setDetail(newData);
+          detailRef.current = newData;
           }
         };
 
@@ -406,7 +369,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                            });
                         }else{
                             let qdbm = null;
-                            let qd = detail.filter(x=>
+                            let qd = detailRef.current.filter(x=>
                               x["children"].filter(y=>y['key'] == row[0]).length > 0
                             )[0];
                             qdbm = qd['清单编码'];
@@ -501,11 +464,12 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
 
                    <Box>
                    <Stack direction='row' spacing={2}>
-                   <Button variant="outlined" onClick={() => {
+                   <Button variant="outlined" size="small" onClick={() => {
                       if (selectedRowKeys.length > 0) {
                          const [success, data] = danxiangdinge(selectedRowKeys[0]);
                          if(success) {
                             setDetail(data);
+                            detailRef.current = data;
                             setExpandedRowKeys([...expandedRowKeys, selectedRowKeys[0]]);
                          }
                       }
@@ -513,10 +477,11 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                       
                       }}
                    >单项定额</Button>
-                      <Button variant="outlined" onClick={() => {
+                      <Button variant="outlined" size="small" onClick={() => {
                       if (selectedRowKeys.length > 0) {
                           let newData = shanchu(selectedRowKeys[0]);
                           setDetail(newData);
+                          detailRef.current = newData;
                           if (newData.filter(x=>x['key'] == selectedRowKeys[0]).length == 0) {
                               setSelectedRowKeys([]);
                               handleSelection([]);
@@ -529,9 +494,10 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                       
                       }}
                    >删除</Button>
-                   <Button variant="outlined" onClick={() => {
+                   <Button variant="outlined" size="small" onClick={() => {
                       let newData = undo();
                       setDetail(newData);
+                      detailRef.current = newData;
                       if (newData.filter(x=>x['key'] == selectedRowKeys[0]).length == 0
                       && newData.filter(x=>x["children"].filter(y=>y['key']==selectedRowKeys[0]).length > 0).length == 0) {
                          setSelectedRowKeys([]);
@@ -542,9 +508,10 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                       
                       }}
                    >撤销</Button>
-                   <Button variant="outlined" onClick={() => {
+                   <Button variant="outlined" size="small" onClick={() => {
                       let newData = redo();
                       setDetail(newData);
+                      detailRef.current = newData;
                       if (newData.filter(x=>x['key'] == selectedRowKeys[0]).length == 0
                       && newData.filter(x=>x["children"].filter(y=>y['key']==selectedRowKeys[0]).length > 0).length == 0) {
                          setSelectedRowKeys([]);
@@ -555,7 +522,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                       
                       }}
                    >重做</Button>
-                   <Button variant="outlined" onClick={() => {
+                   <Button variant="outlined" size="small" onClick={() => {
                             console.log("save to cloud");
                             loadingCallback();
                       
@@ -564,9 +531,19 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
 
                   
                    </Stack>
+                   <ConfigProvider
+                   theme={{
+                    components: {
+                      Table: {
+                        /* here is your component tokens */
+                        cellPaddingBlock : 8
+                      },
+                    },
+                  }}
+                   >
                  <Table 
                     dataSource={detail}
-                   
+                    
                     
                     //afterSelection={handleSelection}
                     //afterSelection={handleSelection}
@@ -591,7 +568,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                               selectRow(record);
                             }
                     })}
-                    scroll={{ x: 'max-content' , y : 500}}
+                    scroll={{ x: 'max-content' , y : 'calc(100vh - 400px)'}}
                     pagination={{ position: ['none', 'none'] }}
                     columns = {[
                          
@@ -624,19 +601,21 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                        ]}
                    
                   />
+                  </ConfigProvider>
                   </Box>
                    <Box >
                    
                    <TabContext value={value}>
                        <Box sx={{ borderBottom: 1, borderColor: 'divider' }}>
-                         <TabList onChange={handleChange} aria-label="lab API tabs example">
-                           <Tab label="人材机含量" value="1" />
-                           <Tab label="标准定额人材机含量" value="2" />
-                           <Tab label="定额附注" value="3" />
-                           <Tab label="组价推荐" value="4" />
+                         <TabList sx={{minHeight: '24px'}} onChange={handleChange} aria-label="lab API tabs example">
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="人材机含量" value="1" />
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="标准定额人材机含量" value="2" />
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="定额附注" value="3" />
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="组价推荐" value="4" />
                          </TabList>
                        </Box>
-                       <TabPanel value="1">
+                       
+                       <TabPanel sx={{p: 1}} value="1">
                           <HotTable 
                           nestedRows={false}
                              data={rcjhl
@@ -645,13 +624,14 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                              manualColumnResize={true}
                              rowHeaders={true}
                              colHeaders={true}
-                             height="300"
+                             height="200"
                              formulas={{
                               engine: hyperformulaInstance,
                               sheetName: 'Rcj',
                             }}
                              
                               cells={(row, col) => {
+                                   if (isQdrcj.current) return {readOnly: true, renderer: "customStylesRenderer"};
                                    if (row === 0) {
                                      return { readOnly: true, renderer: "customStylesRenderer" };
                                    }
@@ -671,7 +651,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                            />
 
                        </TabPanel>
-                       <TabPanel value="2">
+                       <TabPanel sx={{p: 1}} value="2">
                           <HotTable 
                           nestedRows={false}
                              data={rcjhl2
@@ -679,7 +659,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                              manualColumnResize={true}
                              rowHeaders={true}
                              colHeaders={true}
-                             height="300"
+                             height="200"
                              readOnly={true}
                              fixedRowsTop={1}
                              selectionMode="single"
@@ -689,7 +669,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                            />
 
                        </TabPanel>
-                       <TabPanel value="3">
+                       <TabPanel sx={{p: 1}} value="3">
                           <DataGrid 
                           getRowHeight={(params) => "auto"}
                           columns={
@@ -709,18 +689,22 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                                   
                                  ]
                              }
+                         scroll={{ x: 'max-content' , y : 200}}
                          rows={fuzhu}
                          hideFooter={true}
                          checkboxSelection={fuzhuEnable}
                          rowSelectionModel={rowSelectionModel}
                          onRowSelectionModelChange={(newRowSelectionModel) => {
                               setRowSelectionModel(newRowSelectionModel);
-                              handleBeizhu(beizhuFKRef.current, selectedRowKeys[0], newRowSelectionModel.ids, fuzhu);
+                              const [newData, newHl] = handleBeizhu(beizhuFKRef.current, selectedRowKeys[0], newRowSelectionModel.ids, fuzhu);
+                              setDetail(newData);
+                              detailRef.current = newData;
+                              setRcjhl(newHl);
                             }}
                            />
 
                        </TabPanel>
-                       <TabPanel value="4">
+                       <TabPanel sx={{p: 1}} value="4">
                           <HotTable 
                           nestedRows={false}
                              data={tuijian
@@ -729,7 +713,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu, beizhuF
                              manualColumnResize={true}
                              rowHeaders={true}
                              colHeaders={true}
-                             height="300"
+                             height="200"
                              readOnly={true}
                              fixedRowsTop={1}
                              selectionMode="single"

+ 100 - 16
front/src/Service.js

@@ -1,5 +1,5 @@
 import { getTableHeadUtilityClass } from '@mui/material';
-import {copy, danxiangdinge_index} from './utils';
+import {copy, danxiangdinge_index, renameDingE} from './utils';
 import { v4 as uuidv4 } from 'uuid';
 class Service{
     
@@ -539,6 +539,8 @@ class Service{
         
     }
     async generateDingercj(name, bh, bt, qdbm, debm, danwei) {
+        console.log('generateDingercj');
+        console.log(debm);
         if (bt == 'Djcs') {
             const response = await fetch(this.ip().concat( ":8000/dingercj/"), {
                 method : "POST",
@@ -811,7 +813,7 @@ async generateQingdanTuijian(name, bh, bt, bm) {
             let desl = Number(de['数量']);
             let dercj = de['dercj'];
             for (let j = 1; j < dercj.length; j++) {
-                let hl = dercj[j];
+                let hl = copy(dercj[j]);
                 hl[10] = desl * Number(hl[10]);
                 hl[11] = desl * Number(hl[11]);
                 let a = hl[1];//"人材机编码", 
@@ -980,9 +982,50 @@ async generateQingdanTuijian(name, bh, bt, bm) {
 
     }
 
-    updateDercj_(row, data) {///change qd inplace
+    updateDercj_(row, data, xuhao) {///change 一条定额 inplace, 汇总一条定额的rcj, xuhao is for rename
         console.log("data updated");
-        console.log(this.cache);
+        //处理附注
+        let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
+        let de = qd["children"].filter(x=>x['key'] == row)[0];
+        if (de.hasOwnProperty("rcjdg")) {
+            for (let i = 1; i < de['rcjdg'].length; i++) {
+                de['rcjdg'][i][5] = data[i][5];//更新单价
+                /****ToDo 更新其他字段 */
+            }
+
+            if (de['fuzhuEnable'] && de.hasOwnProperty('fuzhu')) {
+                for(let i = 0; i < de['fuzhu'].length; i++) {
+                    let selected = de['fuzhu'][i];
+                    //更新底稿含量
+                    if (selected[2] == '含量') {
+                        let target = selected[0];
+                        for(let j = 1; j < de['rcjdg'].length; j++) {
+                            if (de['rcjdg'][j][1] == target) {
+                                let origin = de['rcjdg'][j][10];
+                                for(let k = 1; k < de['dercj'].length; k++) {
+                                    if (de['dercj'][k][1] == target) {
+                                        de['dercj'][k][5] = de['rcjdg'][j][5];
+                                        de['dercj'][k][10] =  selected[3];
+                                        de['dercj'][k][11] = Number(de['dercj'][k][5]) * Number(selected[3]);
+                                    }
+                                }
+                            }
+                        }
+
+                    }
+                }
+            } else {
+                de['dercj'] = copy(de['rcjdg']);
+            }
+        
+
+            
+            data = de['dercj'];
+        }
+        //模拟formula计算每一行的合价
+        for(let i = 1; i < data.length; i++) {
+            data[i][11] = Number(data[i][10]) * Number(data[i][5]);
+        }
         let sum = 0;
         let rgf_sum = 0;
         let jxf_sum = 0;
@@ -1000,11 +1043,12 @@ async generateQingdanTuijian(name, bh, bt, bm) {
             }
         }
         console.log("sum=".concat(sum));
-        let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
+        
         let shuliang = Number(qd['数量']);
         for(let i = 0; i< qd["children"].length; i++) {
             if(qd["children"][i]['key'] == row) {
                 let desl = Number(qd["children"][i]['数量']);
+                let oldname = qd["children"][i]['清单编码'];
                 qd["children"][i]['综合单价'] = sum.toFixed(2);
                 qd["children"][i]['合价'] = (sum * shuliang * desl).toFixed(2);
                 qd["children"][i]['辅材费'] = clf_sum.toFixed(2);
@@ -1016,24 +1060,35 @@ async generateQingdanTuijian(name, bh, bt, bm) {
                 qd["children"][i]['管理费'] = 0;
                 qd["children"][i]['利润'] = 0;
                 qd["children"][i]["dercj"] = copy(data);
-                for (let j = 1; j < qd["children"][i]["dercj"].length; j++) {
-                    
-                    let A =  "=F".concat((j+1).toString());
-                    let B = A.concat("*K");//2";
-                    let C = B.concat((j+1).toString());
-                    //qd["children"][i]["dercj"][j][11] = C;
-                }
+                qd["children"][i]['清单编码'] = renameDingE(oldname, xuhao);
 
             }
         }
     }
 
     updateDercj(row, data) {
+        //是否手动设置含量
+        let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
+        let de = qd["children"].filter(x=>x['key'] == row)[0];
+        let origin = de['dercj'];
+        let change = false;
         for(let i = 1; i < data.length; i++) {
-            data[i][11] = Number(data[i][10]) * Number(data[i][5]);
+            let before = origin[i][10];
+            let after = data[i][10];
+            if (Number(before) - Number(after) < 0.0001 && Number(before) - Number(after) > -0.0001) {
+                //no change
+            } else {
+                change = true;
+                break;
+            }
         }
-        this.updateDercj_(row, data);
-        let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
+        if (change) {
+            de['fuzhuEnable'] = false;
+        }
+
+        
+        this.updateDercj_(row, data, []);
+        //let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
 
         let newData = this.cache.map(x=>{
             if (x['key'] == qd['key']) {
@@ -1052,6 +1107,34 @@ async generateQingdanTuijian(name, bh, bt, bm) {
     }
 
 
+    updateBeizhu(row, selected, xuhao) {//xuhao is for rename
+        let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
+        let de = qd["children"].filter(x=>x['key'] == row)[0];
+        if (de.hasOwnProperty("rcjdg")) {//底稿
+
+        } else {
+            de['rcjdg'] = copy(de['dercj']);
+
+        }
+        de['fuzhu'] = copy(selected);
+        this.updateDercj_(row, de['dercj'], xuhao);
+
+        let newData = this.cache.map(x=>{
+            if (x['key'] == qd['key']) {
+                return qd;
+            } else {
+                return x;
+            }
+        });
+        let summarized = this.summarize(newData);
+        this.push_op(summarized);
+        /////////////////
+        this.cache = copy(summarized);
+        return [copy(this.cache), copy(de['dercj'])];
+
+    }
+
+
     changguidinge(dingeclick, row) {
         if (this.cache.filter(x=>x['key'] == row).length > 0) {
             
@@ -1101,12 +1184,13 @@ async generateQingdanTuijian(name, bh, bt, bm) {
                     '综合人工工日': null,
                     '备注': null,
                     "dercj": dercj,
+                    'rcjdg': copy(dercj),
                     'key' :   newKey,
                     "fuzhuEnable": true
     
                     
                 });
-                this.updateDercj_(newKey, dercj);
+                this.updateDercj_(newKey, dercj, []);
                 let summarized = this.summarize(this.cache);
                 this.push_op(copy(summarized));
                 /////////////////

+ 3 - 0
front/src/editor.js

@@ -56,6 +56,7 @@ export const changguidinge = (dingeclick, selectedRow) => {
 export const handleBeizhu = (beizhuFK, derow, fuzhuSelect, fuzhu ) => {
     console.log(beizhuFK);
     let bianma = [];
+    let xuhao = [];
     let fuzhuSelect_ = Array.from(fuzhuSelect);
     let keys = beizhuFK['BZBH'];
     for(let j = 0; j < fuzhuSelect_.length; j++) {
@@ -63,6 +64,7 @@ export const handleBeizhu = (beizhuFK, derow, fuzhuSelect, fuzhu ) => {
         for(let i = 0; i < fuzhu.length; i++) {
             if (fuzhu[i]['id'] == entry) {
                 bianma.push(fuzhu[i]['编号']);
+                xuhao.push(fuzhu[i]['序号']);
             }
         }
     }
@@ -78,6 +80,7 @@ export const handleBeizhu = (beizhuFK, derow, fuzhuSelect, fuzhu ) => {
         }
     }
     console.log(result);
+    return Service.updateBeizhu(derow, result, xuhao);
 };
 
 

+ 18 - 0
front/src/utils.js

@@ -26,6 +26,24 @@ export const copy = (input) => {
 };
 
 
+export const renameDingE = (oldname, xuhao) => {
+    let index = oldname.indexOf('附注', 0);
+    let raw = oldname;
+    if (index == -1) {
+
+    } else {
+        raw = oldname.substring(0, index);
+    }
+    for(let i = 0; i < xuhao.length; i++) {
+        raw = raw.concat("附注");
+        raw = raw.concat(xuhao[i].toString());
+    }
+    if (oldname.indexOf('换', 0) > -1) {
+        raw = raw.concat('换');
+    }
+    return raw;
+};
+
 export const extractFuzhu = (debm) => {
     if (debm) {
         let start = 0;