Procházet zdrojové kódy

人材机补充,to be continued

Xiaopeng Zhang před 5 měsíci
rodič
revize
f236607c04

+ 0 - 1
front/src/Djcs3.js

@@ -11,7 +11,6 @@ import Service from './Service';
 import {TabulatorFull as Tabulator} from "tabulator-tables"; //import Tabulator library
 import "tabulator-tables/dist/css/tabulator.min.css"; //import Tabulator stylesheet
 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_djcs, handleBeizhu_djcs, huan, updateShuliang_djcs} from './editor';

+ 0 - 1
front/src/Editable.js

@@ -20,7 +20,6 @@ import AccordionActions from '@mui/material/AccordionActions';
 import AccordionSummary from '@mui/material/AccordionSummary';
 import AccordionDetails from '@mui/material/AccordionDetails';
 import Stack from '@mui/material/Stack';
-import { DataGrid } from '@mui/x-data-grid';
 
 import Button from '@mui/material/Button';
 import TextField from '@mui/material/TextField';

+ 0 - 1
front/src/EditableSelect.js

@@ -20,7 +20,6 @@ import AccordionActions from '@mui/material/AccordionActions';
 import AccordionSummary from '@mui/material/AccordionSummary';
 import AccordionDetails from '@mui/material/AccordionDetails';
 import Stack from '@mui/material/Stack';
-import { DataGrid } from '@mui/x-data-grid';
 
 import Button from '@mui/material/Button';
 import TextField from '@mui/material/TextField';

+ 0 - 1
front/src/EditableSelectGC.js

@@ -20,7 +20,6 @@ import AccordionActions from '@mui/material/AccordionActions';
 import AccordionSummary from '@mui/material/AccordionSummary';
 import AccordionDetails from '@mui/material/AccordionDetails';
 import Stack from '@mui/material/Stack';
-import { DataGrid } from '@mui/x-data-grid';
 
 import Button from '@mui/material/Button';
 import TextField from '@mui/material/TextField';

+ 271 - 10
front/src/Qingdan3.js

@@ -3,6 +3,13 @@ import Box from "@mui/material/Box";
 import { Table, ConfigProvider, Button as AButton } from "antd";
 import {RichTreeView } from "@mui/x-tree-view/RichTreeView";
 import { Grid } from '@mui/material';
+import Tooltip from '@mui/material/Tooltip';
+import AddIcon from '@mui/icons-material/Add';
+import SaveIcon from '@mui/icons-material/Save';
+import CancelIcon from '@mui/icons-material/Close';
+import EditIcon from '@mui/icons-material/Edit';
+import DeleteIcon from '@mui/icons-material/DeleteOutlined';
+
 import Tab from "@mui/material/Tab";
 import TabContext from "@mui/lab/TabContext";
 import TabList from "@mui/lab/TabList";
@@ -15,7 +22,7 @@ import {extractFuzhu} from './utils';
 import {shanchu, undo, redo, danxiangdinge, updateDercj, changguidinge, handleBeizhu, huan, updateShuliang, handleYuban, updateDeMingcheng} from './editor';
 import Backdrop from '@mui/material/Backdrop';
 import CircularProgress from '@mui/material/CircularProgress';
-import { DataGrid } from '@mui/x-data-grid';
+import { DataGrid, GridRowModes, Toolbar, ToolbarButton, GridActionsCellItem, GridRowEditStopReasons } from '@mui/x-data-grid';
 import Dialog from '@mui/material/Dialog';
 import DialogTitle from '@mui/material/DialogTitle';
 import DialogContent from '@mui/material/DialogContent';
@@ -27,6 +34,7 @@ import {
      SettingFilled,
 
    } from '@ant-design/icons';
+import { v4 as uuidv4 } from 'uuid';
 
 import zhCN from 'antd/locale/zh_CN';
 import {copy} from './utils';
@@ -233,6 +241,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                setFuzhu([]);
                setYubanEnable(false);
                setSelectedRowKeys2([]);
+               setShowToolbar(false);
                Service.generateQingdanrcj(name, bh,bt,row._row.data['清单编码']).then(x=>{
                 
                 
@@ -274,6 +283,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
           }else{
                setTuijian([]);
                
+               
                if (tuijianTable.current) tuijianTable.current.replaceData([]);
               let row_parent = row._row;
               while(row_parent.modules.dataTree.parent) {
@@ -319,6 +329,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                               if (rcjTable.current) {
                                    rcjTable.current.replaceData(y);
                               }
+                 setShowToolbar(true);
                  setFuzhuEnable(x[1]);
                  setYubanEnable(x[1]);
                  setSelectedRowKeys2(x[2]);
@@ -395,6 +406,211 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
 
       }
 
+     /**补充人材机 */
+     const [rcjrows, setRcjrows] = React.useState([]);
+     const [rowModesModel, setRowModesModel] = React.useState({});
+     const [showToolbar, setShowToolbar] = React.useState(false);
+     const rcjcolumns = [
+          {
+               field: 'actions',
+               type: 'actions',
+               headerName: '操作',
+               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"
+                     onClick={handleDeleteClick(id)}
+                     color="inherit"
+                   />,
+                 ];
+               },
+             },
+          { field: '人材机编码', headerName: '人材机编码', width: 120, editable: true },
+          {
+            field: '名称',
+            headerName: '名称',
+            width: 120,
+            align: 'left',
+            headerAlign: 'left',
+            editable: true,
+          },
+          {
+            field: '规格型号',
+            headerName: '规格型号',
+            width: 100,
+            editable: true,
+          },
+          {
+            field: '单位',
+            headerName: '单位',
+            width: 80,
+            editable: true,
+          },
+          {
+               field: '单价',
+               headerName: '单价',
+               width: 80,
+               editable: true,
+             },
+             {
+               field: '产地',
+               headerName: '产地',
+               width: 80,
+               editable: true,
+             },
+             {
+               field: '供应厂商',
+               headerName: '供应厂商',
+               width: 80,
+               editable: true,
+             },
+          {
+               field: '人材机类别',
+               headerName: '人材机类别',
+               width: 120,
+               editable: true,
+             },
+             {
+               field: '甲供标志',
+               headerName: '甲供标志',
+               width: 80,
+               editable: true,
+             },
+             {
+               field: '含量',
+               headerName: '含量',
+               width: 80,
+               editable: true,
+             },
+            /* {
+               field: '合价',
+               headerName: '合价',
+               width: 80,
+               editable: true,
+             },*/
+             {
+               field: '暂估价标志',
+               headerName: '暂估价标志',
+               width: 100,
+               editable: true,
+             },
+             {
+               field: '主要材料标志',
+               headerName: '主要材料标志',
+               width: 120,
+               editable: true,
+             },
+             {
+               field: '主材标志',
+               headerName: '主材标志',
+               width: 80,
+               editable: true,
+             },
+             {
+               field: '设备标志',
+               headerName: '设备标志',
+               width: 80,
+               editable: true,
+             },
+       
+        ];
+
+        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 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)));
+          return updatedRow;
+        };
+   
+     function EditToolbar(props) {
+          const { setRcjrows, setRowModesModel } = props;
+        
+          const handleClick = () => {
+            const id = uuidv4();
+            setRcjrows((oldRows) => [
+              ...oldRows,
+              { id, '人材机编码': '', '名称': '', '规格型号': '', isNew: true },
+            ]);
+            setRowModesModel((oldModel) => ({
+              ...oldModel,
+              [id]: { mode: GridRowModes.Edit, fieldToFocus: '名称' },
+            }));
+          };
+        
+          return (
+            <Toolbar>
+              <Tooltip title="补充">
+                <ToolbarButton onClick={handleClick}>
+                  <AddIcon fontSize="small" />
+                </ToolbarButton>
+              </Tooltip>
+            </Toolbar>
+          );
+        }
 
    
      
@@ -421,8 +637,8 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                           {title:"序号", field:"序号", width:80, headerSort:false, frozen: true}, //never hide this column
                           {title:"清单编码", field:"清单编码", width:120,headerSort:false, frozen: true ,formatter:"textarea" },
                           {title:"名称", field:"名称", width:150, headerSort:false, formatter:"textarea", editor: "input", editable: editCheck}, //hide this column first
-                          {title:"项目特征", field:"项目特征", width:150 , headerSort:false, formatter:"textarea"},
-                          {title:"计算规则", field:"计算规则", width:150, headerSort:false, formatter:"textarea"},
+                          {title:"项目特征", field:"项目特征", width:200 , headerSort:false, formatter:"textarea"},
+                          {title:"计算规则", field:"计算规则", width:200, headerSort:false, formatter:"textarea"},
                           {title:"单位", field:"单位", width:100, headerSort:false},
                           {title:"数量", field:"数量", width:100, headerSort:false, editor: "input", editable: editCheck },
                           {title:"综合单价", field:"综合单价", width:100, headerSort:false, formatter:"money"},
@@ -779,7 +995,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                if (rcjRef.current != null ) {
                          rcjTable.current = new Tabulator(rcjRef.current, {
                               index: "key",
-                              height: 200,
+                              height: 250,
                             data: rcjhl, //link data to table
                             reactiveData: false, //enable data reactivity
                             dataTreeStartExpanded:false,
@@ -789,7 +1005,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                             
                             columns: [ //Define Table Columns
                                          {title:"ID", field:"ID", width:80, headerSort:false, },
-                                         {title:"人材机编码", field:"人材机编码", width:80, headerSort:false, }, //never hide this column
+                                         {title:"人材机编码", field:"人材机编码", width:100, headerSort:false, }, //never hide this column
                                          {title:"名称", field:"名称", width:120,headerSort:false,  formatter:"textarea", editor: "input", editable: editCheckRcj },
                                          {title:"规格型号", field:"规格型号", width:80, headerSort:false, editor: "input", editable: editCheckRcj },
                                          {title:"单位", field:"单位", width:80, headerSort:false, formatter:"textarea"}, //hide this column first
@@ -897,6 +1113,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                                              rcjTable.current.replaceData([]);
                                         }
                                         setFuzhu([]);
+                                        setShowToolbar(false);
                                         setSelectedRowKeys2([]);
                                         setYubanEnable(false);
                                         isQdrcj.current = true;
@@ -920,6 +1137,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                                    rcjTable.current.replaceData([]);
                                   }
                                   setFuzhu([]);
+                                  setShowToolbar(false);
                                   setSelectedRowKeys2([]);
                                   setYubanEnable(false);
                                   isQdrcj.current = true;
@@ -946,6 +1164,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                               rcjTable.current.replaceData([]);
                          }
                          setFuzhu([]);
+                         setShowToolbar(false);
                          setSelectedRowKeys2([]);
                          setYubanEnable(false);
                          isQdrcj.current = true;
@@ -967,6 +1186,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                               rcjTable.current.replaceData([]);
                          }
                          setFuzhu([]);
+                         setShowToolbar(false);
                          setSelectedRowKeys2([]);
                          setYubanEnable(false);
                          isQdrcj.current = true;
@@ -998,9 +1218,10 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                          <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" />
-                           <Tab sx={{p: 0, minHeight: '24px'}} label="组价推荐" value="5" />
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="人材机补充" value="3" />
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="定额附注" value="4" />
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="预拌砂浆" value="5" />
+                           <Tab sx={{p: 0, minHeight: '24px'}} label="组价推荐" value="6" />
                          </TabList>
                        </Box>
                        
@@ -1015,6 +1236,46 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
 
                        </TabPanel>
                        <TabPanel sx={{p: 1}} value="3">
+                         
+                       <Box
+                       sx={{
+                         height: 200,
+                         width: '100%',
+                         '& .actions': {
+                           color: 'text.secondary',
+                         },
+                         '& .textPrimary': {
+                           color: 'text.primary',
+                         },
+                       }}
+                     >
+                       <DataGrid disableColumnMenu disableColumnSorting
+                         hideFooter={true}
+                         rows={rcjrows}
+                         columns={rcjcolumns}
+                         editMode="row"
+                         rowModesModel={rowModesModel}
+                         onRowModesModelChange={handleRowModesModelChange}
+                         onRowEditStop={handleRowEditStop}
+                         processRowUpdate={processRowUpdate}
+                         slots={{ toolbar: EditToolbar }}
+                         slotProps={{
+                           toolbar: { setRcjrows, setRowModesModel },
+                         }}
+                         showToolbar={showToolbar}
+                         localeText={{
+                              noRowsLabel: '无数据',
+                              paginationRowsPerPage: '每页行数',
+                              footerRowSelected: (count) => `共选中了${count.toLocaleString()}行`,
+                             
+                              
+                            }}
+                       />
+                     </Box>
+                             
+  
+                         </TabPanel>
+                       <TabPanel sx={{p: 1}} value="4">
                        <Box sx={{maxHeight: `190px`}}>
                        <ConfigProvider
                           locale={zhCN}
@@ -1056,7 +1317,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                           
 
                        </TabPanel>
-                       <TabPanel sx={{p: 1}} value="4">
+                       <TabPanel sx={{p: 1}} value="5">
                         <Box sx={{maxHeight: `190px`}}>
                         <ConfigProvider
                           locale={zhCN}
@@ -1093,7 +1354,7 @@ export default function Qingdan3({name, bh, bt, rgde, jxde, clde, beizhu/*后台
                         </Box>
                        </TabPanel>
                        
-                       <TabPanel sx={{p: 1}} value="5">
+                       <TabPanel sx={{p: 1}} value="6">
                        <div ref={tuijianRef}></div>
 
                        </TabPanel>

+ 1 - 1
front/webpack.config.js

@@ -55,7 +55,7 @@ module.exports = {
     extensions: [".js", ".jsx"]
   },
 
-  mode: 'production',
+  mode: 'development',
   performance: {
     hints: false,
     maxEntrypointSize: 512000,

+ 1 - 1
main.py

@@ -560,7 +560,7 @@ async def read_singledexilie(r: SingleDingeXilieRequest):
             result3["reverse"] = 'None'
             return json.dumps(result3, ensure_ascii=False)
         debh = r.debh[position1+1: position2]
-        if result3['GLDE']:
+        if result3['GLDE']: ##csv文件里的字段,表示这个定额有没有配套的增减定额
             hit = False
             for key, value in result3['GLDE'].items():
                 if value == debh: