소스 검색

支持补充人材机

Xiaopeng Zhang 5 달 전
부모
커밋
abf5b6a3a1
7개의 변경된 파일200개의 추가작업 그리고 85개의 파일을 삭제
  1. 1 0
      .gitignore
  2. 138 72
      front/src/Qingdan3.js
  3. 50 8
      front/src/Service.js
  4. 2 2
      front/src/Tbxx.js
  5. 5 0
      front/src/editor.js
  6. 2 2
      main.py
  7. 2 1
      subdir/db.py

+ 1 - 0
.gitignore

@@ -9,3 +9,4 @@ lib/
 package-lock.json
 share/
 front/node_modules/
+front/dist/

+ 138 - 72
front/src/Qingdan3.js

@@ -19,7 +19,7 @@ import Service from './Service';
 import Button from '@mui/material/Button';
 import ButtonGroup from '@mui/material/ButtonGroup';
 import {extractFuzhu} from './utils';
-import {shanchu, undo, redo, danxiangdinge, updateDercj, changguidinge, handleBeizhu, huan, updateShuliang, handleYuban, updateDeMingcheng} from './editor';
+import {shanchu, undo, redo, danxiangdinge, updateDercj, changguidinge, handleBeizhu, huan, updateShuliang, handleYuban, updateDeMingcheng, handleRcjbc} from './editor';
 import Backdrop from '@mui/material/Backdrop';
 import CircularProgress from '@mui/material/CircularProgress';
 import { DataGrid, GridRowModes, Toolbar, ToolbarButton, GridActionsCellItem, GridRowEditStopReasons } from '@mui/x-data-grid';
@@ -217,6 +217,9 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
           //get row data
           //console.log(cell);
           if(isQdrcj.current) return false;
+          if (cell._cell.row.getData()['人材机编码'] == '410000F') {
+               return false;
+          }
           return true;
       }
 
@@ -239,6 +242,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                selectedRowKeysTableParent.current = row._row['data']['key'];
 
                setFuzhu([]);
+               setRcjrows([]);
                setYubanEnable(false);
                setSelectedRowKeys2([]);
                setShowToolbar(false);
@@ -333,6 +337,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                  setFuzhuEnable(x[1]);
                  setYubanEnable(x[1]);
                  setSelectedRowKeys2(x[2]);
+                 setRcjrows(x[3]);
                  //hotRcjRef.current?.hotInstance?.loadData(x);
                  isQdrcj.current = false;
                  let toHighlight = [];
@@ -408,7 +413,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
 
      /**补充人材机 */
      const [rcjrows, setRcjrows] = React.useState([]);
-     const [rowModesModel, setRowModesModel] = React.useState({});
+     //const [rowModesModel, setRowModesModel] = React.useState({});
      const [showToolbar, setShowToolbar] = React.useState(false);
      const rcjcolumns = [
           {
@@ -418,38 +423,12 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                width: 100,
                cellClassName: 'actions',
                getActions: ({ id }) => {
-                 const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit;
+                
          
-                 if (isInEditMode) {
-                   return [
-                     <GridActionsCellItem
-                       icon={<SaveIcon />}
-                       label="Save"
-                       material={{
-                         sx: {
-                           color: 'primary.main',
-                         },
-                       }}
-                       onClick={handleSaveClick(id)}
-                     />,
-                     <GridActionsCellItem
-                       icon={<CancelIcon />}
-                       label="Cancel"
-                       className="textPrimary"
-                       onClick={handleCancelClick(id)}
-                       color="inherit"
-                     />,
-                   ];
-                 }
+                
          
                  return [
-                   <GridActionsCellItem
-                     icon={<EditIcon />}
-                     label="Edit"
-                     className="textPrimary"
-                     onClick={handleEditClick(id)}
-                     color="inherit"
-                   />,
+               
                    <GridActionsCellItem
                      icon={<DeleteIcon />}
                      label="Delete"
@@ -459,7 +438,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                  ];
                },
              },
-          { field: '人材机编码', headerName: '人材机编码', width: 120, editable: true },
+          { field: '人材机编码', headerName: '人材机编码', width: 120, editable: false },
           {
             field: '名称',
             headerName: '名称',
@@ -549,56 +528,130 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
        
         ];
 
-        const handleEditClick = (id) => () => {
-          setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.Edit } });
-        };
-      
-        const handleSaveClick = (id) => () => {
-          setRowModesModel({ ...rowModesModel, [id]: { mode: GridRowModes.View } });
-        };
+    
       
         const handleDeleteClick = (id) => () => {
           setRcjrows(rcjrows.filter((row) => row.id !== id));
+          const [newData, newHl] = handleRcjbc(selectedRowKeysTable.current[0], rcjrows.filter((row) => row.id !== id));
+          if (newData) {
+               myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
+               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] 
+
+               });
+             }
+              setRcjhl(y);
+              if (rcjTable.current) {
+                 rcjTable.current.replaceData(y);
+              }
+
+            }
+
         };
       
-        const handleCancelClick = (id) => () => {
-          setRowModesModel({
-            ...rowModesModel,
-            [id]: { mode: GridRowModes.View, ignoreModifications: true },
-          });
       
-          const editedRow = rcjrows.find((row) => row.id === id);
-          if (editedRow.isNew) {
-            setRcjrows(rcjrows.filter((row) => row.id !== id));
-          }
-        };
-        const handleRowModesModelChange = (newRowModesModel) => {
-          setRowModesModel(newRowModesModel);
-        };
-        const handleRowEditStop = (params, event) => {
-          if (params.reason === GridRowEditStopReasons.rowFocusOut) {
-            event.defaultMuiPrevented = true;
-          }
-        };
         const processRowUpdate = (newRow) => {
           const updatedRow = { ...newRow, isNew: false };
           setRcjrows(rcjrows.map((row) => (row.id === newRow.id ? updatedRow : row)));
+          const [newData, newHl] = handleRcjbc(selectedRowKeysTable.current[0], rcjrows.map((row) => (row.id === newRow.id ? updatedRow : row)));
+          if (newData) {
+               myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
+               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] 
+
+               });
+             }
+              setRcjhl(y);
+              if (rcjTable.current) {
+                 rcjTable.current.replaceData(y);
+              }
+
+            }
           return updatedRow;
         };
    
      function EditToolbar(props) {
-          const { setRcjrows, setRowModesModel } = props;
+          const { setRcjrows } = props;
         
           const handleClick = () => {
             const id = uuidv4();
-            setRcjrows((oldRows) => [
-              ...oldRows,
-              { id, '人材机编码': '', '名称': '', '规格型号': '', isNew: true },
-            ]);
-            setRowModesModel((oldModel) => ({
-              ...oldModel,
-              [id]: { mode: GridRowModes.Edit, fieldToFocus: '名称' },
-            }));
+            let a = [];
+            setRcjrows((oldRows) => {
+               a = [
+                 ...oldRows,
+                 { id, '人材机编码': '410000F', '名称': '', '规格型号': '', '单位': '', '单价':'0','产地': '', '供应厂商': '', '人材机类别':'2',
+                '甲供标志':'', '含量':'1', '暂估价标志':'', '主要材料标志':'true', '主材标志':'true', '设备标志':'' },
+               ];
+               return a;
+             });
+             
+             const [newData, newHl] = handleRcjbc(selectedRowKeysTable.current[0], a);
+             if (newData) {
+               myTable.current.updateData(newData.filter(x=>x['key'] == selectedRowKeysTableParent.current));
+               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] 
+
+               });
+             }
+              setRcjhl(y);
+              if (rcjTable.current) {
+                 rcjTable.current.replaceData(y);
+              }
+
+            }
+
+            
           };
         
           return (
@@ -859,6 +912,8 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
           }, [beizhuFK]
       );
 
+  
+
 
       React.useEffect(
           () => {
@@ -1002,6 +1057,16 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                             dataTree: false,
                             selectableRows:1, //make rows selectable
                             editTriggerEvent:"dblclick",
+                            rowFormatter:function(row){
+                              //row - row component
+                              
+                              var data = row.getData();
+                              if (data['人材机编码'] == '410000F') {
+                                   row.getElement().style.backgroundColor = "#ffff00";
+                              }
+                              
+                            
+                          },
                             
                             columns: [ //Define Table Columns
                                          {title:"ID", field:"ID", width:80, headerSort:false, },
@@ -1031,7 +1096,8 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                          rcjTable.current.on("cellDblClick", function(e, cell){
                               //e - the click event object
                               //cell - cell component
-                              if(cell._cell.column.getPosition() == 2  && !isQdrcj.current) {
+                              let determine = cell._cell.row.getData()['人材机编码'] != '410000F';
+                              if(cell._cell.column.getPosition() == 2  && !isQdrcj.current && determine) {
                                   tihuanCallback(cell._cell.row.position, cell._cell.column.getPosition());
                               }
                           });
@@ -1113,6 +1179,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                                              rcjTable.current.replaceData([]);
                                         }
                                         setFuzhu([]);
+                                        setRcjrows([]);
                                         setShowToolbar(false);
                                         setSelectedRowKeys2([]);
                                         setYubanEnable(false);
@@ -1137,6 +1204,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                                    rcjTable.current.replaceData([]);
                                   }
                                   setFuzhu([]);
+                                  setRcjrows([]);
                                   setShowToolbar(false);
                                   setSelectedRowKeys2([]);
                                   setYubanEnable(false);
@@ -1164,6 +1232,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                               rcjTable.current.replaceData([]);
                          }
                          setFuzhu([]);
+                         setRcjrows([]);
                          setShowToolbar(false);
                          setSelectedRowKeys2([]);
                          setYubanEnable(false);
@@ -1186,6 +1255,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                               rcjTable.current.replaceData([]);
                          }
                          setFuzhu([]);
+                         setRcjrows([]);
                          setShowToolbar(false);
                          setSelectedRowKeys2([]);
                          setYubanEnable(false);
@@ -1253,14 +1323,10 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                          hideFooter={true}
                          rows={rcjrows}
                          columns={rcjcolumns}
-                         editMode="row"
-                         rowModesModel={rowModesModel}
-                         onRowModesModelChange={handleRowModesModelChange}
-                         onRowEditStop={handleRowEditStop}
                          processRowUpdate={processRowUpdate}
                          slots={{ toolbar: EditToolbar }}
                          slotProps={{
-                           toolbar: { setRcjrows, setRowModesModel },
+                           toolbar: { setRcjrows },
                          }}
                          showToolbar={showToolbar}
                          localeText={{

+ 50 - 8
front/src/Service.js

@@ -707,7 +707,7 @@ class Service{
         }
         let qd = this.cache.filter(x=>x["清单编码"] == qdbm)[0];
         let de = qd["_children"].filter(x=>x["清单编码"]==debm)[0];
-        return [copy(de["dercj"]), de["fuzhuEnable"], de['yuban']];
+        return [copy(de["dercj"]), de["fuzhuEnable"], de['yuban'], de['rcjbc']];
         
         
           
@@ -1573,7 +1573,7 @@ async generateQingdanTuijian(name, bh, bt, bm) {
     }
 
 
-    updateDercj_(row, data, xuhao, yuban) {///change 一条定额 inplace, 汇总一条定额的rcj, xuhao is for rename, yuban is 预拌砂浆
+    updateDercj_(row, data, xuhao, yuban, rcjbc) {///change 一条定额 inplace, 汇总一条定额的rcj, xuhao is for rename, yuban is 预拌砂浆
         console.log("data updated");
         //处理附注
         let huan = false;//换
@@ -1717,6 +1717,12 @@ async generateQingdanTuijian(name, bh, bt, bm) {
             }
             de['dercj'] = copy(data);
         }
+        de['dercj'] = de['dercj'].filter(x=>x[1] != '410000F')
+        for(let i = 0; i < rcjbc.length; i++) {
+            de['dercj'].push(['', rcjbc[i]['人材机编码'], rcjbc[i]['名称'], rcjbc[i]['规格型号'], rcjbc[i]['单位'], rcjbc[i]['单价'], rcjbc[i]['产地'], rcjbc[i]['供应厂商'], rcjbc[i]['人材机类别'], rcjbc[i]['甲供标志'], rcjbc[i]['含量'], '', rcjbc[i]['暂估价标志'],rcjbc[i]['主要材料标志'],rcjbc[i]['主材标志'],rcjbc[i]['设备标志']]);
+        }
+        data = copy(de['dercj']);
+
         //模拟formula计算每一行的合价
         for(let i = 1; i < data.length; i++) {
             data[i][11] = Number(data[i][10]) * Number(data[i][5]);
@@ -1804,7 +1810,7 @@ async generateQingdanTuijian(name, bh, bt, bm) {
 
 
         
-        this.updateDercj_(row, data, alreadyFuzhu, de['yuban']);
+        this.updateDercj_(row, data, alreadyFuzhu, de['yuban'], de['rcjbc']);
         //let qd = this.cache.filter(x=>x["children"].filter(y=>y['key']==row).length > 0)[0];
 
         let newData = this.cache.map(x=>{
@@ -1879,7 +1885,7 @@ async generateQingdanTuijian(name, bh, bt, bm) {
 
         }
         de['fuzhu'] = copy(selected);
-        this.updateDercj_(row, de['dercj'], xuhao, de['yuban']);
+        this.updateDercj_(row, de['dercj'], xuhao, de['yuban'], de['rcjbc']);
 
         let newData = this.cache.map(x=>{
             if (x['key'] == qd['key']) {
@@ -2153,11 +2159,12 @@ async generateQingdanTuijian(name, bh, bt, bm) {
                     'rcjdg': copy(dercj),
                     'key' :   newKey,
                     "fuzhuEnable": true,
-                    'yuban': []
+                    'yuban': [],
+                    'rcjbc': []
     
                     
                 });
-                this.updateDercj_(newKey, dercj, [], []);
+                this.updateDercj_(newKey, dercj, [], [], []);
                 let summarized = this.summarize(this.cache);
                 this.push_op(copy(summarized));
                 /////////////////
@@ -2207,7 +2214,8 @@ async generateQingdanTuijian(name, bh, bt, bm) {
                       ],
                 'key' :   uuidv4(),
                 "fuzhuEnable": false,
-                'yuban': []
+                'yuban': [],
+                'rcjbc' : []
 
                 
             });
@@ -2285,7 +2293,7 @@ async generateQingdanTuijian(name, bh, bt, bm) {
 
         }
         de['yuban'] = copy(selected);
-        this.updateDercj_(row, de['dercj'], alreadyFuzhu, selected);
+        this.updateDercj_(row, de['dercj'], alreadyFuzhu, selected, de['rcjbc']);
 
         let newData = this.cache.map(x=>{
             if (x['key'] == qd['key']) {
@@ -2301,8 +2309,42 @@ async generateQingdanTuijian(name, bh, bt, bm) {
         return [copy(this.cache), copy(de['dercj'])];
     }
 
+    handleRcjbc(row, rcjbc) {
+        let qd = this.cache.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['rcjbc'] = copy(rcjbc);
+        this.updateDercj_(row, de['dercj'], alreadyFuzhu, de['yuban'], rcjbc);
+    
+        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'])];
+    }
+
     
 }
 
 
+
+
+
+
+
 export default new Service();

+ 2 - 2
front/src/Tbxx.js

@@ -41,10 +41,10 @@ export default function Tbxx({data}) {
          },
          columns: [ //Define Table Columns 序号", "名称", "取费基数", "计算基础","费率", "金额", "类别
                       {title:"名称", field:"名称", width:150, headerSort:false, formatter:"textarea"}, //hide this column first
-                      {title:"金额", field:"金额", width:100, headerSort:false, formatter:"money", },
+                      {title:"金额", field:"金额", width:150, headerSort:false, formatter:"money", },
                       {title:"暂估价", field:"暂估价", width:100, headerSort:false,  formatter:"money"},
                       {title:"安全文明施工费", field:"安全文明施工费", width:150, headerSort:false,  formatter:"money"},
-                      {title:"规费", field:"规费", width:100, headerSort:false,  formatter:"money"},
+                      {title:"规费", field:"规费", width:150, headerSort:false,  formatter:"money"},
                     
               ]
        }); 

+ 5 - 0
front/src/editor.js

@@ -109,6 +109,11 @@ export const handleYuban = (derow, select ) => {
 
 };
 
+export const handleRcjbc = (derow, rcjbc ) => {
+    return Service.handleRcjbc(derow, rcjbc);
+
+};
+
 export const handleBeizhu = (beizhuFK, derow, fuzhuSelect, fuzhu ) => {
     console.log(beizhuFK);
     let bianma = [];

+ 2 - 2
main.py

@@ -592,7 +592,7 @@ async def read_singledexilie(r: SingleDingeXilieRequest):
 @app.post("/save/")
 async def save(r: Info):
     data = json.loads(r.name)
-    print(data)
+    ##print(data)
  
     return await db.save(client, data)
 
@@ -600,7 +600,7 @@ async def save(r: Info):
 @app.post("/savedjcs/")
 async def savedjcs(r: Info):
     data = json.loads(r.name)
-    print(data)
+    ##print(data)
  
     return await db.savedjcs(client, data)
 

+ 2 - 1
subdir/db.py

@@ -555,6 +555,7 @@ async def resolve(data, client):
                         child["dercj"] = dercj
                         child['fuzhuEnable'] = False
                         child['yuban'] = []
+                        child['rcjbc'] = []
                 await collection.insert_one(qd)
             
 
@@ -1699,7 +1700,7 @@ async def tiaojia(client, biao_id, bh, bm, mingcheng, danwei, jiage, glf, lr, bz
 
             post['综合单价'] = str(float(post['人工费']) + float(post['材料费']) + float(post['机械费']) + float(post['管理费']) + float(post['利润']))
             post['合价'] = str(float(post['综合单价']) * float(qdsl))
-            print(post)
+            ##print(post)
             await collection.replace_one({'_id': post['_id']}, post )
     collection = db["Djcs"]
     async for post in collection.find({'biao_id': biao_id, "Dwgcbh": bh}):