|
|
@@ -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>
|