Эх сурвалжийг харах

support djcs changguidinge and fuzhu, need perf optimization, need add huan

Xiaopeng Zhang 6 сар өмнө
parent
commit
176e13cafe

+ 3 - 0
front/src/App2.js

@@ -992,6 +992,9 @@ const MUI_X_PRODUCTS = [
                          beizhu={beizhu}
                          clickCallback={clickCallback}
                          loadingCallback={loadingCallback_djcs}
+                         dingeclick={dingeclick}
+                         beizhuFK={beizhuFK}
+
                      />
                    </TabPanel>
                       

+ 117 - 49
front/src/Djcs2.js

@@ -21,11 +21,13 @@ import './Tabulator.css';
 import { DataGrid } from '@mui/x-data-grid';
 import {extractFuzhu, match_target} from './utils';
 import Button from '@mui/material/Button';
-import {shanchu_djcs, undo_djcs, redo_djcs, danxiangdinge_djcs, updateDercj_djcs, changguidinge, handleBeizhu, huan, updateShuliang_djcs} from './editor';
+import {shanchu_djcs, undo_djcs, redo_djcs, danxiangdinge_djcs, updateDercj_djcs, changguidinge_djcs, handleBeizhu_djcs, huan, updateShuliang_djcs} from './editor';
 
 import { textRenderer, registerRenderer } from 'handsontable/renderers';
 
+import { Table, ConfigProvider, Button as AButton } from "antd";
 
+import zhCN from 'antd/locale/zh_CN';
 
 
 function number_equal(a, b) {
@@ -34,7 +36,7 @@ function number_equal(a, b) {
      }
      return false;
 }
-export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback, loadingCallback}) {
+export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, beizhuFK, clickCallback, loadingCallback, dingeclick}) {
 
 
      var editCheck = function(cell){
@@ -51,10 +53,11 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
           //e - the click event object
           //cell - cell component
           console.log('rowSelected');
-          selectedRowKeys.current = [row._row['data']['key']];
+          selectedRowKeysTable.current = [row._row['data']['key']];
           let bt = "Djcs" ;
           
           if (row._row.data['序号'] != null && row._row.data['序号'].length >0) {
+               setFuzhu([]);
                Service.generateQingdanrcj(name, bh,bt,row._row.data['清单编码']).then(x=>{
                     setRcjhl(x);
                     isQdrcj.current=true;
@@ -166,11 +169,33 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
     const [rcjhl2, setRcjhl2] = React.useState([]);
     const [fuzhu, setFuzhu] = React.useState([]);
     const [tuijian, setTuijian] = React.useState([]);
+    const beizhuFKRef = React.useRef(null);
+
     const [fuzhuEnable, setFuzhuEnable] = React.useState(false);
     const [rowSelectionModel, setRowSelectionModel] = React.useState({
      type: 'include',
      ids: new Set(),
    });
+   const [selectedRowKeys, setSelectedRowKeys] = React.useState([]);
+   const onSelectChange = (newSelectedRowKeys) => {
+     console.log('selectedRowKeys changed: ', newSelectedRowKeys);
+     setSelectedRowKeys(newSelectedRowKeys);
+     const [newData, newHl] = handleBeizhu_djcs(beizhuFKRef.current, selectedRowKeysTable.current[0], newSelectedRowKeys, fuzhu);
+                                  if (newData) {
+                                     myTable.current.updateData(newData);
+                                     setRcjhl(newHl);
+
+                                  }
+   };
+   const rowSelection = {
+     selectedRowKeys,
+     onChange: onSelectChange,
+     getCheckboxProps: (record) => {
+          return {
+               disabled: !fuzhuEnable
+          };
+     }
+   };
     const highlight = React.useRef([]);
 
     
@@ -179,7 +204,7 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
     const cldeRef = React.useRef(null);
     const isQdrcj = React.useRef(false);
     const debmRef = React.useRef(null);
-    const selectedRowKeys = React.useRef([]);
+    const selectedRowKeysTable = React.useRef([]);
     const afterChange = (changes, source) => {
      if (changes == null || changes.every(x=>x[2] == x[3])) {
 
@@ -190,7 +215,7 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
            }
            setRcjhl(data);
      
-          let newData = updateDercj_djcs(selectedRowKeys.current[0], data);
+          let newData = updateDercj_djcs(selectedRowKeysTable.current[0], data);
           myTable.current.updateData(newData).then(function() {
                let getRow = myTable.current.getSelectedRows(); //get array of currently selected row components.
                //getRow[0].select();
@@ -252,8 +277,8 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
           //console.log("edited");
           //console.log();
           let key = cell._cell.row.data['key'];
-          
-          let [success, data] = updateShuliang_djcs(cell._cell.row.data['数量'], selectedRowKeys.current[0]);
+          myTable.current.deselectRow();
+          let [success, data] = updateShuliang_djcs(cell._cell.row.data['数量'], selectedRowKeysTable.current[0]);
           if (success) {
                            myTable.current.updateData(data).then(function() {
                               let getRow = myTable.current.getRows(); //get array of currently selected row components.
@@ -289,6 +314,11 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
    }, [bh]);
 
 
+   React.useEffect(
+     () => {
+          beizhuFKRef.current = beizhuFK;
+     }, [beizhuFK]
+   );
  
     React.useEffect(
         () => {
@@ -298,15 +328,55 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
                 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({'key': i+1, '序号': i+1, '编号': beizhu["BZBH"][key], '说明': beizhu["SM"][key]});//序号很重要
                 }
                 setFuzhu(result);
-                setRowSelectionModel({type: 'include', 
-                ids: new Set(extractFuzhu(debmRef.current))});
+                let newSelect = extractFuzhu(debmRef.current);
+                setSelectedRowKeys(newSelect);
+                //setSelectedRowKeys([1]);
+                
             }
         }, [beizhu]
       );
 
+
+
+      React.useEffect(
+          () => {
+               myTable.current.deselectRow();
+               //console.log(dingeclick);
+               if (selectedRowKeysTable.current.length > 0 ) {
+                    const [success, data, key] = changguidinge_djcs(JSON.parse(dingeclick), selectedRowKeysTable.current[0]);
+                    if (success) {
+                         myTable.current.updateData(data).then(function(){
+                              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'] == key) {
+                                             //console.log(child);
+                                             component = child.component;
+                                             break;
+                                        }
+                                        
+                                   }
+
+                              }
+                              
+                              component.select();
+                              handleSelect(component);
+
+                                   
+                               
+                          });
+                    }
+               }
+               
+          }, [dingeclick]//常规添加定额
+      );
+
     React.useEffect(
         () => {
           console.log("rgde changed");
@@ -408,11 +478,11 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
                <Stack spacing={1}>
                          <Stack direction='row' spacing={2}>
                    <Button variant="outlined" size="small" onClick={() => {
-                      if (selectedRowKeys.current.length > 0) {
-                         const [success, data] = danxiangdinge_djcs(selectedRowKeys.current[0]);
+                      if (selectedRowKeysTable.current.length > 0) {
+                         const [success, data] = danxiangdinge_djcs(selectedRowKeysTable.current[0]);
                          if(success) {
                             myTable.current.updateData(data).then(function(){
-                              selectedRowKeys.current = [];
+                              selectedRowKeysTable.current = [];
                                    setRcjhl([]);
                                    setFuzhu([]);
                                    isQdrcj.current = true;
@@ -426,11 +496,11 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
                       }}
                    >单项定额</Button>
                       <Button variant="outlined" size="small" onClick={() => {
-                      if (selectedRowKeys.current.length > 0) {
-                          let newData = shanchu_djcs(selectedRowKeys.current[0]);
+                      if (selectedRowKeysTable.current.length > 0) {
+                          let newData = shanchu_djcs(selectedRowKeysTable.current[0]);
                           myTable.current.updateData(newData).then(function(){
-                              if (newData.filter(x=>x['key'] == selectedRowKeys.current[0]).length == 0) {
-                                   selectedRowKeys.current = [];
+                              if (newData.filter(x=>x['key'] == selectedRowKeysTable.current[0]).length == 0) {
+                                   selectedRowKeysTable.current = [];
                                    setRcjhl([]);
                                    setFuzhu([]);
                                    isQdrcj.current = true;
@@ -450,7 +520,7 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
                       let newData = undo_djcs();
                       myTable.current.updateData(newData).then(function(){
                          
-                            selectedRowKeys.current = [];
+                            selectedRowKeysTable.current = [];
                             setRcjhl([]);
                             setFuzhu([]);
                             isQdrcj.current = true;
@@ -465,7 +535,7 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
                    <Button variant="outlined" size="small" onClick={() => {
                       let newData = redo_djcs();
                       myTable.current.updateData(newData).then(function(){
-                         selectedRowKeys.current = [];
+                         selectedRowKeysTable.current = [];
                             setRcjhl([]);
                             setFuzhu([]);
                             isQdrcj.current = true;
@@ -551,47 +621,45 @@ export default function Djcs2({name, bh, rgde, jxde, clde, beizhu, clickCallback
 
                        </TabPanel>
                        <TabPanel value="3">
-                         <div style={{ height: 200}}>
-                       <DataGrid  disableColumnMenu
-                          getRowHeight={(params) => "auto"}
-                          localeText={{
-                              noRowsLabel: '无数据',
-                              paginationRowsPerPage: '每页行数',
-                              footerRowSelected: (count) => `共选中了${count.toLocaleString()}行`,
-                             
-                              
-                            }}
-                          columns={
+                       <Box sx={{maxHeight: `200px`}}>
+                       <ConfigProvider
+                          locale={zhCN}
+                          theme={{
+                            components: {
+                              Table: {
+                                 /* here is your component tokens */
+                                 cellPaddingBlock : 8
+                              },
+                            },
+                          }}
+                        >
+
+                          <Table 
+                             scroll={{ x: 'max-content' , y : 200}}
+                             pagination={false}
+                             rowSelection={rowSelection}
+                             columns={
                               [
-                                   { field: '序号', headerName: '序号', },
+                                   { title: '序号', dataIndex: '序号', width : 80},
                                    {
-                                     field: '编号',
-                                     headerName: '编号',
+                                        title: '编号',
+                                        dataIndex: '编号',
                                      
                                    },
                                    {
-                                     field: '说明',
-                                     headerName: '说明',
+                                        title: '说明',
+                                        dataIndex: '说明',
                                      width: 550
                                     
                                    },
                                   
                                  ]
                              }
-                         scroll={{ x: 'max-content' }}
-                         rows={fuzhu}
-                         hideFooter={true}
-                         checkboxSelection={fuzhuEnable}
-                         rowSelectionModel={rowSelectionModel}
-                         onRowSelectionModelChange={(newRowSelectionModel) => {
-                              console.log(newRowSelectionModel);
-                             
-                              setRowSelectionModel(newRowSelectionModel);
-                            
-                              
-                            }}
-                           />
-                           </div>
+                           dataSource={fuzhu} />
+
+                        </ConfigProvider>
+                       </Box>
+                      
 
                        </TabPanel>
 

+ 3 - 0
front/src/Qingdan.js

@@ -825,6 +825,8 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                              licenseKey="non-commercial-and-evaluation" // for non-commercial use only
                            />
 
+                           
+
                        </TabPanel>
                        <TabPanel sx={{p: 1}} value="3">
                        <div style={{ height: 190}}>
@@ -877,6 +879,7 @@ export default function Qingdan({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                             }}
                            />
                            </div>
+                          
 
                        </TabPanel>
                        <TabPanel sx={{p: 1}} value="4">

+ 100 - 0
front/src/Service.js

@@ -1615,6 +1615,35 @@ async generateQingdanTuijian(name, bh, bt, bm) {
 
     }
 
+
+    updateBeizhu_djcs(row, selected, xuhao) {//xuhao is for rename
+        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];
+        if (de.hasOwnProperty("rcjdg")) {//底稿
+
+        } else {///老数据不能有底稿,附注功能也不使能
+            //de['rcjdg'] = copy(de['dercj']);
+
+        }
+        de['fuzhu'] = copy(selected);
+        this.updateDercj_djcs_(row, de['dercj'], xuhao);
+
+        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'])];
+
+    }
+
     huan(old_index, new_bianhao, new_name, new_jia, row) {
         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];
@@ -1694,6 +1723,77 @@ async generateQingdanTuijian(name, bh, bt, bm) {
     }
 
 
+    changguidinge_djcs(dingeclick, row) {
+        if (this.cache_djcs.filter(x=>x['key'] == row).length > 0) {
+            
+                let res =dingeclick;
+                let keys = Object.keys(res['DEBH']);
+                let key = keys[0];
+                //console.log(res);
+                let qd = this.cache_djcs.filter(x=>x['key'] == row)[0];
+                let dercj = [["ID", "人材机编码", "名称", "规格型号", "单位", "单价", "产地", 
+                "供应厂商", "人材机类别", "甲供标志", "含量", "合价", "暂估价标志", "主要材料标志", "主材标志", "设备标志" ]];
+                for(let i = 0; i < res['rgde'].length; i++) {
+                    dercj.push(['', res['rgde'][i]['CLBH'], res['rgde'][i]['CLMC'], '', res['rgde'][i]['JLDW'], 
+                    res['rgde'][i]['YSJG'], '', '', '1', '', res['rgde'][i]['gr'], res['rgde'][i]['gf'],
+                    '', '', '', '' ]);
+                }
+                for(let i = 0; i < res['clde'].length; i++) {
+                    dercj.push(['', res['clde'][i]['CLBH'], res['clde'][i]['CLMC'], '', res['clde'][i]['JLDW'], 
+                    res['clde'][i]['YSJG'], '', '', '2', '', res['clde'][i]['SL'], res['clde'][i]['HJ'],
+                    '', '', '', '' ]);
+                }
+                for(let i = 0; i < res['jxde'].length; i++) {
+                    dercj.push(['', res['jxde'][i]['jxbh'], res['jxde'][i]['jxmc'], '', res['jxde'][i]['DW'], 
+                    res['jxde'][i]['tbdj'], '', '', '3', '', res['jxde'][i]['sl'], res['jxde'][i]['hj'],
+                    '', '', '', '' ]);
+                }
+                let newKey = uuidv4();
+                qd["_children"].push({
+                    '操作': '',
+                    '序号': null,
+                    '清单编码': res['DEBH'][key],
+                    '名称': res['GCLMC'][key],
+                    '项目特征': null,
+                    '计算规则': null,
+                    '单位': res['DW'][key],
+                    '数量': '1',
+                    '综合单价': '0',
+                    '合价': '0',
+                    '人工费': '0',
+                    '主材费': '0',
+                    '设备费': '0',
+                    '辅材费': '0',
+                    '材料费': '0',
+                    '机械费': '0',
+                    '管理费': '0',
+                    '利润': '0',
+                    '暂估价': null,
+                    '综合人工工日': null,
+                    '备注': null,
+                    "dercj": dercj,
+                    'rcjdg': copy(dercj),
+                    'key' :   newKey,
+                    "fuzhuEnable": true
+    
+                    
+                });
+                this.updateDercj_djcs_(newKey, dercj, []);
+                let summarized = this.summarize_djcs(this.cache_djcs);
+                this.push_op_djcs(copy(summarized));
+                /////////////////
+                this.cache_djcs = copy(summarized);
+                //return copy(this.cache);
+            
+
+            return [true, copy(this.cache_djcs), newKey];
+        } else {
+            return [false, null, null];
+        }
+    }
+
+
+
     changguidinge(dingeclick, row) {
         if (this.cache.filter(x=>x['key'] == row).length > 0) {
             

+ 37 - 0
front/src/editor.js

@@ -92,6 +92,13 @@ export const changguidinge = (dingeclick, selectedRow) => {
 
 };
 
+
+
+export const changguidinge_djcs = (dingeclick, selectedRow) => {
+    return Service.changguidinge_djcs(dingeclick, selectedRow);
+
+};
+
 export const handleBeizhu = (beizhuFK, derow, fuzhuSelect, fuzhu ) => {
     console.log(beizhuFK);
     let bianma = [];
@@ -122,5 +129,35 @@ export const handleBeizhu = (beizhuFK, derow, fuzhuSelect, fuzhu ) => {
     return Service.updateBeizhu(derow, result, xuhao);
 };
 
+export const handleBeizhu_djcs = (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++) {
+        let entry = fuzhuSelect_[j];
+        for(let i = 0; i < fuzhu.length; i++) {
+            if (fuzhu[i]['key'] == entry) {
+                bianma.push(fuzhu[i]['编号']);
+                xuhao.push(fuzhu[i]['序号']);
+            }
+        }
+    }
+    let result = [];
+    for(let i = 0; i < bianma.length; i++) {
+        let bh = bianma[i];
+        for(let j = 0; j < Object.keys(keys).length; j++) {
+            let BZBH_ = Object.keys(keys)[j];
+            let BZBH = keys[BZBH_];
+            if (BZBH == bh) {
+                result.push([beizhuFK['BH'][BZBH_], beizhuFK['MC'][BZBH_], beizhuFK['LB'][BZBH_], beizhuFK['SL'][BZBH_], beizhuFK['DW'][BZBH_]]);
+            }
+        }
+    }
+    console.log(result);
+    return Service.updateBeizhu_djcs(derow, result, xuhao);
+};
+
 
 

+ 8 - 0
front/src/utils.js

@@ -111,6 +111,14 @@ export const match_target = (input ,target) => {
         } else {
             return false;
         }
+    } else if (target == '100000') {//全部材料
+        if (input.startsWith('99')) {
+            return false;
+        } else if (input.startsWith("0001")) {
+            return false;
+        } else {
+            return true;
+        }
     }
     return input == target;
 };