feat: 恢复重建pc端 项目填报 项目驳回

This commit is contained in:
huangchenhao 2026-04-09 16:12:48 +08:00
parent 895741ec4a
commit 58b4720b94
7 changed files with 683 additions and 264 deletions

View File

@ -85,6 +85,23 @@ const generateBreadcrumb = () => {
name: 'ledgerManagement', name: 'ledgerManagement',
meta: { title: '驻地台账' } meta: { title: '驻地台账' }
}) })
} else if (currentPath.includes('/projectAdd')) {
//
//
breadcrumbList.value.push({
title: '项目管理',
path: '/projectManagement',
name: 'projectManagement',
meta: { title: '项目管理' }
})
//
breadcrumbList.value.push({
title: '项目填报',
path: currentPath,
name: 'projectAdd',
meta: { title: '项目填报' }
})
} else { } else {
// //
matched.forEach((record, index) => { matched.forEach((record, index) => {

View File

@ -1,4 +1,3 @@
import component from 'element-plus/es/components/tree-select/src/tree-select-option.mjs'
import { createRouter, createWebHistory } from 'vue-router' import { createRouter, createWebHistory } from 'vue-router'
const routes = [ const routes = [
@ -149,6 +148,16 @@ const routes = [
breadcrumb: true breadcrumb: true
} }
}, },
{
path: '/projectAdd/:data?',
name: 'projectAdd',
component: () => import('../views/ProjectManagement_Rebuild/projectAddPage.vue'),
meta: {
title: '项目填报',
breadcrumb: true,
parentRoute: 'projectManagement' // 用于在面包屑中建立父子关系
}
},
{ {
path: '/disasterManagement', path: '/disasterManagement',
name: 'disasterManagement', name: 'disasterManagement',

View File

@ -1,71 +1,83 @@
<template> <template>
<div class="detail-container"> <div class="detail-container">
<el-form ref="formRef" :model="form" label-position="right" label-width="150px" <el-form ref="formRef" :model="form" label-position="right" label-width="150px"
style="max-height: 60vh; overflow-y: auto; padding-right: 50px" :rules="rules" :disabled="disabled"> style="max-height: 60vh; overflow-y: auto; padding-right: 50px" :rules="rules">
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="区县名称" prop="区县名称"> <el-form-item label="区县名称" prop="区县名称">
<el-input v-model="form.project.districtName"></el-input> <el-input disabled v-model="form.districtName"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="路线编码" prop="路线编码"> <el-form-item label="路线编码" prop="路线编码">
<el-input v-model="form.project.routeNo"></el-input> <el-input disabled v-model="form.routeNo"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="实施里程(公里)" prop="实施里程"> <el-form-item label="实施里程" prop="实施里程">
<el-input-number v-model="form.project.implementMileage" :controls="false"></el-input-number> <el-input-number disabled v-model="form.implementMileage" :controls="false">
<template #suffix>
<span>公里</span>
</template>
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="塌方及损失" prop="塌方及损失"> <el-form-item label="塌方及损失" prop="塌方及损失">
<el-input-number v-model="form.project.earthworkLoss" :controls="false"></el-input-number> <el-input-number disabled v-model="form.earthworkLoss" :controls="false">
<template #suffix>
<span>/万元</span>
</template>
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="起点桩号" prop="起点桩号"> <el-form-item label="起点桩号" prop="起点桩号">
<el-input v-model="form.project.startStakeNo"></el-input> <el-input disabled v-model="form.startStakeNo"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="止点桩号" prop="止点桩号"> <el-form-item label="止点桩号" prop="止点桩号">
<el-input v-model="form.project.endStakeNo"></el-input> <el-input disabled v-model="form.endStakeNo"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="路况位置" prop="路况位置"> <el-form-item label="路况位置" prop="路况位置">
<el-input v-model="form.project.roadLocation"></el-input> <el-input disabled v-model="form.roadLocation"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="阻断点小地名" prop="阻断点小地名"> <el-form-item label="阻断点小地名" prop="阻断点小地名">
<el-input v-model="form.project.blockedPointName"></el-input> <el-input disabled v-model="form.blockedPointName"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="灾害类型" prop="灾害类型"> <el-form-item label="灾害类型" prop="灾害类型">
<el-input v-model="form.project.disasterType"></el-input> <el-input disabled v-model="form.disasterType"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="预估费用" prop="预估费用"> <el-form-item label="预估费用" prop="预估费用">
<el-input-number v-model="form.project.estimatedCost" :controls="false"></el-input-number> <el-input-number disabled v-model="form.estimatedCost" :controls="false">
<template #suffix>
<span>万元</span>
</template>
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="技术等级" prop="技术等级"> <el-form-item label="技术等级" prop="技术等级">
<el-select v-model="form.project.technicalGrade"> <el-select v-model="form.technicalGrade">
<el-option <el-option
v-for="item in [{ value: '三级', label: '三级' }, { value: '二级', label: '二级' }, { value: '一级', label: '一级' }]" v-for="item in [{ value: '三级', label: '三级' }, { value: '二级', label: '二级' }, { value: '一级', label: '一级' }]"
:key="item.value" :label="item.label" :value="item.value" /> :key="item.value" :label="item.label" :value="item.value" />
@ -74,31 +86,35 @@
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="资金来源" prop="资金来源"> <el-form-item label="资金来源" prop="资金来源">
<el-input v-model="form.project.fundingSource"></el-input> <el-input v-model="form.fundingSource"></el-input>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="处置灾毁处数" prop="处置灾毁处数"> <el-form-item label="处置灾毁处数" prop="处置灾毁处数">
<el-input-number v-model="form.project.disposalCount" :controls="false"></el-input-number> <el-input-number v-model="form.disposalCount" :controls="false"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="已完工处数" prop="已完工处数"> <el-form-item label="已完工处数" prop="已完工处数">
<el-input-number v-model="form.project.completedCount" :controls="false"></el-input-number> <el-input-number v-model="form.completedCount" :controls="false"></el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row> <el-row>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="总投资" prop="总投资"> <el-form-item label="总投资" prop="总投资">
<el-input-number v-model="form.project.totalInvestment" :controls="false"></el-input-number> <el-input-number v-model="form.totalInvestment" :controls="false">
<template #suffix>
<span>万元</span>
</template>
</el-input-number>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="项目费用类型" prop="项目费用类型"> <el-form-item label="项目费用类型" prop="项目费用类型">
<el-radio-group v-model="form.project.projectExpenseType"> <el-radio-group v-model="form.projectExpenseType">
<el-radio value="自费重修">自费重修</el-radio> <el-radio value="自费重修">自费重修</el-radio>
<el-radio value="申报重修">申报重修</el-radio> <el-radio value="申报重修">申报重修</el-radio>
</el-radio-group> </el-radio-group>
@ -120,163 +136,83 @@ const props = defineProps({
type: Object, type: Object,
default: () => ({}), default: () => ({}),
}, },
disabled: {
type: Boolean,
default: false,
}
}); });
const sfjwd = ref("是");
const qx = ref("");
const loading = ref(false);
const selectOptions = ref([]);
const qxList = ref([]);
//
const getUserList = async (key) => {
try {
const keyword = key;
let url = "";
if (keyword) {
url = `/snow-ops-platform/yhzry/getUserByKey?key=${keyword}`;
} else {
url = `/snow-ops-platform/yhzry/getUserByKey?key=`;
}
const res = await request({
url: url,
method: "GET",
});
if (res.code === "00000") {
return res.data;
} else {
throw new Error(res.message);
}
} catch (error) {
ElMessage.error(error.message);
console.log(error);
}
};
//
const remoteMethod = async (query) => {
if (query === "") {
selectOptions.value = [];
return [];
}
loading.value = true;
const res = await getUserList(query);
if (res) {
selectOptions.value = res;
}
loading.value = false;
};
//
const getQxList = async (key) => {
try {
const keyword = key;
let url = "";
if (keyword) {
url = `/snow-ops-platform/district/listDistricts?qxmc=${keyword}`;
} else {
url = `/snow-ops-platform/district/listDistricts?qxmc=`;
}
const res = await request({
url: url,
method: "GET",
});
if (res.code === "00000") {
return res.data;
} else {
throw new Error(res.message);
}
} catch (error) { }
};
//
const remoteMethod_qx = async (query) => {
loading.value = true;
const res = await getQxList(query);
if (res) {
qxList.value = res;
}
loading.value = false;
};
//
const handleSelect_qx = (value) => {
props.form.qxmc = value;
};
//
const handleSelect = (value) => {
console.log("value", value);
props.form.fzrXm = value.realName;
props.form.fzrSjhm = value.phone;
props.form.fzrUserId = value.userId;
};
const rules = computed(() => { const rules = computed(() => {
return { return {
mc: [ 技术等级: [
{ {
required: true, required: true,
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (props.form.mc) { if (props.form.technicalGrade) {
callback(); callback();
} else { } else {
callback(new Error("请输入服务站名称")); callback(new Error("请选择技术等级"));
} }
}, },
trigger: "blur", trigger: "blur",
}, },
], ],
qxmc: [ 资金来源: [
{ {
required: true, required: true,
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (props.form.qxmc) { if (props.form.fundingSource) {
callback(); callback();
} else { } else {
callback(new Error("请选择所属区县")); callback(new Error("请填写资金来源"));
} }
}, },
trigger: "blur", trigger: "blur",
}, },
], ],
fzr: [ 处置灾毁处数: [
{ {
required: true, required: true,
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (props.form.fzrUserId && props.form.fzrXm && props.form.fzrSjhm) { if (props.form.disposalCount) {
callback(); callback();
} else { } else {
callback(new Error("请选择负责人")); callback(new Error("请填写处置灾毁处数"));
} }
}, },
trigger: "blur", trigger: "blur",
}, },
], ],
jd: [ 已完工处数: [
{ {
required: sfjwd.value === "否", required: true,
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (props.form.jd) { if (props.form.completedCount) {
callback(); callback();
} else { } else {
callback(new Error("请输入站点经度")); callback(new Error("请填写已完工处数"));
} }
}, },
trigger: "blur", trigger: "blur",
}, },
], ],
wd: [ 总投资: [
{ {
required: sfjwd.value === "否", required: true,
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (props.form.wd) { if (props.form.totalInvestment) {
callback(); callback();
} else { } else {
callback(new Error("请输入站点纬度")); callback(new Error("请填写总投资数"));
}
},
trigger: "blur",
},
],
项目费用类型: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.projectExpenseType) {
callback();
} else {
callback(new Error("请选择项目费用类型"));
} }
}, },
trigger: "blur", trigger: "blur",

View File

@ -2,6 +2,8 @@ import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue";
import { request } from "@/utils/request"; import { request } from "@/utils/request";
import { useRoute, useRouter } from 'vue-router' import { useRoute, useRouter } from 'vue-router'
import ExamineDialog from "./examineDialog.vue"; import ExamineDialog from "./examineDialog.vue";
import RejectDialog from './rejectDialog.vue';
import { ElLoading } from 'element-plus'
const tableData = ref([]); // 表格数据 const tableData = ref([]); // 表格数据
const modelVisible = ref(false); // 弹窗状态 const modelVisible = ref(false); // 弹窗状态
@ -23,10 +25,6 @@ const model = reactive({
}); });
const form = reactive({ const form = reactive({
}); });
const INIT_FORM = {
project: {},
fileList: []
};
// 抽屉内容 // 抽屉内容
const drawer = reactive({ const drawer = reactive({
title: '', title: '',
@ -40,102 +38,28 @@ const drawer = reactive({
const dialogRef = ref(null); // 弹窗实例 const dialogRef = ref(null); // 弹窗实例
const drawerRef = ref(null); // 抽屉实例 const drawerRef = ref(null); // 抽屉实例
const columns = [ // 第二个弹窗
{ const model2 = reactive({
prop: "districtName", title: '',
label: "区县", content: null,
}, props: {},
{ onCancel: null,
prop: "routeNo", onConfirm: null,
label: "路线编码", width: '',
}, footerPosition: null,
{ onCancelType: null,
prop: "disasterType", onConfirmName: null,
label: "灾害类型", onCancelName: null,
}, tagContent: null,
{ tagType: null,
prop: "startStakeNo", });
label: "起点桩号", const modelVisible2 = ref(false);
}, const dialogRef2 = ref(null);
{
prop: "endStakeNo",
label: "止点桩号",
},
{
prop: "implementMileage",
label: "实施里程(公里)",
},
{
prop: "technicalGrade",
label: "技术等级",
},
{
prop: "totalInvestment",
label: "总投资金额(万元)",
},
{
prop: "estimatedCost",
label: "投资估算(万元)",
},
{
prop: "startTime",
label: "开工或预计开工时间",
},
{
prop: "endTime",
label: "完工或预计完工时间",
},
{
prop: "approvalStatus",
label: "审批状态",
formatter: (row) => {
const statusMap = {
0: '待审批',
1: '审批通过',
2: '审批驳回'
};
return statusMap[row.approvalStatus] || '未知状态';
}
},
{
prop: "updateTime",
label: "更新日期",
},
{
label: "操作",
fixed: "right",
width: 150,
render: (row) => () =>
h("div", { class: "action-btns" }, [
h(
ElButton,
{
type: "primary",
link: true,
onClick: async () => {
},
},
() => "审批"
),
h(
ElButton,
{
type: "primary",
link: true,
style: "margin-left: 10px;",
onClick: async () => {
},
},
() => "详情"
),
]),
},
]
// 过滤条件 // 过滤条件
const filterData = reactive({ const filterData = reactive({
submitTimeStart: "",
routeNo: "",
}) })
// 分页 // 分页
const pagination = reactive({ const pagination = reactive({
@ -152,52 +76,66 @@ const pagination = reactive({
}); });
// 获取项目列表 // 获取项目列表
const getTableData = async (filterData) => { const getTableData = async (filterData = {}) => {
try { try {
// 过滤空字符串属性
const filteredParams = {};
Object.keys(filterData).forEach(key => {
if (filterData[key] !== '' && filterData[key] != null) {
filteredParams[key] = filterData[key];
}
});
const res = await request({ const res = await request({
url: '/snow-ops-platform/recovery/list', url: '/snow-ops-platform/recovery/list',
method: "GET", method: "GET",
params: { params: {
...filterData, ...filteredParams,
submitTimeStart: filterData.submitTimeStart ? filterData.submitTimeStart+`-01-01 00:00:00` : null, submitTimeStart: filteredParams?.submitTimeStart ? filteredParams.submitTimeStart + `-01-01 00:00:00` : null,
pageNum: pagination.current, pageNum: pagination.current,
pageSize: pagination.pageSize, pageSize: pagination.pageSize,
} }
}) })
if (res.code === '00000') {
tableData.value = res.data.records
}
} catch (error) { } catch (error) {
console.error('获取项目列表失败:', error); console.error('获取项目列表失败:', error);
} }
} }
// 打开审批弹窗
const openExamineDialog = async () => {
model.title = '项目审批'; // 驳回项目
Object.assign(form, INIT_FORM); const rejectProject = async () => {
model.props = { try {
form: form, const loading = ElLoading.service({
}; lock: true,
model.content = ExamineDialog; text: '操作中',
model.onCancel = () => { background: 'rgba(0, 0, 0, 0.7)',
modelVisible.value = false;
};
model.onConfirm = async () => {
dialogType.value = '';
await dialogRef?.value?.dynamicComponentRef?.formRef.validate().then(() => {
console.log('@@@@@填报项目', form);
}) })
.catch((err) => { const res = await request({
ElMessage.error('请处理表单中的错误项'); url: '/snow-ops-platform/recovery/approve',
}); method: 'POST',
}; data: {
model.width = "50%" id: form.id,
model.footerPosition = 'flex-end' approveLevel: 1,
model.onCancelType = 'danger' isPass: false,
model.onConfirmName = '审批通过' rejectReason: form.rejectReason,
model.onCancelName = '审批驳回' }
// model.tagType = 'warning' })
// model.tagContent = '测试' loading.close();
modelVisible.value = true; if (res.code === '00000') {
ElMessage.success('操作成功');
modelVisible.value = false;
modelVisible2.value = false;
getTableData(filterData);
}
} catch (error) {
ElMessage.error('操作失败');
console.error('驳回项目失败:', error);
}
} }
@ -208,6 +146,157 @@ export default () => {
const router = useRouter(); const router = useRouter();
const columns = [
{
prop: "districtName",
label: "区县",
},
{
prop: "routeNo",
label: "路线编码",
},
{
prop: "disasterType",
label: "灾害类型",
},
{
prop: "startStakeNo",
label: "起点桩号",
},
{
prop: "endStakeNo",
label: "止点桩号",
},
{
prop: "implementMileage",
label: "实施里程(公里)",
},
{
prop: "technicalGrade",
label: "技术等级",
},
{
prop: "totalInvestment",
label: "总投资金额(万元)",
},
{
prop: "estimatedCost",
label: "投资估算(万元)",
},
{
prop: "startTime",
label: "开工或预计开工时间",
},
{
prop: "endTime",
label: "完工或预计完工时间",
},
{
prop: "approvalStatus",
label: "审批状态",
formatter: (row) => {
const statusMap = {
0: '待审批',
1: '审批通过',
2: '审批驳回'
};
return statusMap[row.approvalStatus] || '未知状态';
}
},
{
prop: "updateTime",
label: "更新日期",
},
{
label: "操作",
fixed: "right",
width: 150,
render: (row) => () =>
h("div", { class: "action-btns" }, [
h(
ElButton,
{
type: "primary",
link: true,
onClick: async () => {
openExamineDialog(row);
},
},
() => "审批"
),
h(
ElButton,
{
type: "primary",
link: true,
style: "margin-left: 10px;",
onClick: async () => {
},
},
() => "详情"
),
]),
},
]
// 打开审批弹窗
const openExamineDialog = async (row) => {
model.title = '项目审批';
Object.assign(form, row);
model.props = {
form: form,
};
model.content = ExamineDialog;
model.onCancel = () => {
model2.title = '驳回原因';
model2.props = {
form: form,
}
model2.content = RejectDialog;
model2.onCancel = () => {
modelVisible2.value = false;
}
model2.onConfirm = async () => {
await dialogRef2?.value?.dynamicComponentRef?.formRef.validate().then(async () => {
await rejectProject()
})
.catch((err) => {
ElMessage.error('请处理表单中的错误项');
});
}
model2.width = '30%'
model2.footerPosition = 'center'
model2.onConfirmName = '确定'
model2.onCancelName = '取消'
modelVisible2.value = true;
};
model.onConfirm = async () => {
await dialogRef?.value?.dynamicComponentRef?.formRef.validate().then(() => {
if (form.projectExpenseType === '自费重修') {
router.push({
name: 'projectAdd',
params: {
data: encodeURIComponent(JSON.stringify(form))
}
})
modelVisible.value = false;
}
})
.catch((err) => {
ElMessage.error('请处理表单中的错误项');
});
};
model.width = "50%"
model.footerPosition = 'flex-end'
model.onCancelType = 'danger'
model.onConfirmName = '审批通过'
model.onCancelName = '审批驳回'
// model.tagType = 'warning'
// model.tagContent = '测试'
modelVisible.value = true;
}
onMounted(() => { onMounted(() => {
getTableData(); getTableData();
}) })
@ -231,5 +320,9 @@ export default () => {
dialogRef, dialogRef,
drawerRef, drawerRef,
openExamineDialog, openExamineDialog,
model2,
modelVisible2,
dialogRef2,
} }
} }

View File

@ -1,8 +1,8 @@
<template> <template>
<div class="root"> <div class="root">
<div class="search-box"> <div class="search-box">
<el-date-picker v-model="script.filterData.submitTimeStart" type="year" placeholder="年度" format="YYYY" value-format="YYYY" <el-date-picker v-model="script.filterData.submitTimeStart" type="year" placeholder="年度" format="YYYY"
style="width: 240px; margin-right: 10px" size="large" /> value-format="YYYY" style="width: 240px; margin-right: 10px" size="large" />
<el-input v-model="script.filterData.routeNo" style="width: 240px; margin-right: 10px" size="large" <el-input v-model="script.filterData.routeNo" style="width: 240px; margin-right: 10px" size="large"
placeholder="路线编码" :suffix-icon="Search" /> placeholder="路线编码" :suffix-icon="Search" />
</div> </div>
@ -19,10 +19,16 @@
:onConfirm="script.model?.onConfirm" :onCancel="script.model?.onCancel" ref="dialogRef" :onConfirm="script.model?.onConfirm" :onCancel="script.model?.onCancel" ref="dialogRef"
:width="script.model?.width" :footer-position="script.model?.footerPosition" :width="script.model?.width" :footer-position="script.model?.footerPosition"
:onCancelType="script.model?.onCancelType" :onConfirmName="script.model?.onConfirmName" :onCancelType="script.model?.onCancelType" :onConfirmName="script.model?.onConfirmName"
:onCancelName="script.model?.onCancelName" :onCancelName="script.model?.onCancelName" :tagContent="script.model?.tagContent"
:tagContent="script.model?.tagContent" :tagType="script.model?.tagType">
:tagType="script.model?.tagType" </MyDialog>
> <MyDialog v-model="script.modelVisible2.value" :title="script.model2?.title"
:dynamicComponent="script.model2?.content" :component-props="script.model2?.props"
:onConfirm="script.model2?.onConfirm" :onCancel="script.model2?.onCancel" ref="dialogRef2"
:width="script.model2?.width" :footer-position="script.model2?.footerPosition"
:onCancelType="script.model2?.onCancelType" :onConfirmName="script.model2?.onConfirmName"
:onCancelName="script.model2?.onCancelName" :tagContent="script.model2?.tagContent"
:tagType="script.model2?.tagType">
</MyDialog> </MyDialog>
<MyDrawer v-model="script.drawerVisible.value" :title="script.drawer?.title" <MyDrawer v-model="script.drawerVisible.value" :title="script.drawer?.title"
:dynamicComponent="script.drawer?.content" :component-props="script.drawer?.props" :dynamicComponent="script.drawer?.content" :component-props="script.drawer?.props"
@ -40,7 +46,7 @@ import MyDialog from "../../component/MyDialog";
import MyDrawer from "../../component/MyDrawer"; import MyDrawer from "../../component/MyDrawer";
import scriptFn from "./index.js"; import scriptFn from "./index.js";
const script = scriptFn(); const script = scriptFn();
const { dialogRef, drawerRef } = script; const { dialogRef, drawerRef, dialogRef2 } = script;
</script> </script>
<style scoped> <style scoped>

View File

@ -1,11 +1,306 @@
<template> <template>
<div class="root"> <div class="root">
<div class="form-box">
<el-form ref="formRef" :model="form" label-position="right" label-width="150px" style="padding-right: 50px"
:rules="rules">
<el-row>
<h4 style="margin:0 0 20px 50px;">基本信息</h4>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="区县名称" prop="区县名称">
<el-input disabled v-model="form.districtName"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="路线编码" prop="路线编码">
<el-input disabled v-model="form.routeNo"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="实施里程" prop="实施里程">
<el-input-number disabled v-model="form.implementMileage" :controls="false">
<template #suffix>
<span>公里</span>
</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="塌方及损失" prop="塌方及损失">
<el-input-number disabled v-model="form.earthworkLoss" :controls="false">
<template #suffix>
<span>/万元</span>
</template>
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="起点桩号" prop="起点桩号">
<el-input disabled v-model="form.startStakeNo"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="止点桩号" prop="止点桩号">
<el-input disabled v-model="form.endStakeNo"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="路况位置" prop="路况位置">
<el-input disabled v-model="form.roadLocation"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="阻断点小地名" prop="阻断点小地名">
<el-input disabled v-model="form.blockedPointName"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="灾害类型" prop="灾害类型">
<el-input disabled v-model="form.disasterType"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预估费用" prop="预估费用">
<el-input-number disabled v-model="form.estimatedCost" :controls="false">
<template #suffix>
<span>万元</span>
</template>
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="技术等级" prop="技术等级">
<el-select disabled v-model="form.technicalGrade">
<el-option
v-for="item in [{ value: '三级', label: '三级' }, { value: '二级', label: '二级' }, { value: '一级', label: '一级' }]"
:key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资金来源" prop="资金来源">
<el-input disabled v-model="form.fundingSource"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="处置灾毁处数" prop="处置灾毁处数">
<el-input-number disabled v-model="form.disposalCount" :controls="false"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已完工处数" prop="已完工处数">
<el-input-number disabled v-model="form.completedCount" :controls="false"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="总投资" prop="总投资">
<el-input-number disabled v-model="form.totalInvestment" :controls="false">
<template #suffix>
<span>万元</span>
</template>
</el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目费用类型" prop="项目费用类型">
<el-radio-group disabled v-model="form.projectExpenseType">
<el-radio value="自费重修">自费重修</el-radio>
<el-radio value="申报重修">申报重修</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<h4 style="margin:0 0 20px 50px;">实施情况</h4>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="主要建设内容" prop="主要建设内容">
<el-input type="textarea" v-model="form.mainConstructionContent" clearable>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="开工或预计开工时间" prop="开工或预计开工时间">
<el-date-picker type="date" v-model="form.startTime" clearable format="YYYY-MM-DD"
value-format="YYYY-MM-DD">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="完工或预计完工时间" prop="完工或预计完工时间">
<el-date-picker type="date" v-model="form.endTime" clearable format="YYYY-MM-DD"
value-format="YYYY-MM-DD">
</el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="是否在部交通统计报表管理系统报送投资" prop="是否在部交通统计报表管理系统报送投资" label-width="300px">
<el-radio-group v-model="form.isReportedToMinistry">
<el-radio value="0"></el-radio>
<el-radio value="1"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="已报送投资额" prop="已报送投资额">
<el-input-number v-model="form.reportedInvestment" :controls="false">
<template #suffix>
<span>万元</span>
</template>
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="项目实施进度" prop="项目实施进度">
<el-select v-model="form.projectProgress">
<el-option v-for="item in [
{ value: '立项', label: '立项' },
{ value: '财政评审', label: '财政评审' },
{ value: '开展施工图设计', label: '开展施工图设计' },
{ value: '完成施设于批复', label: '完成施设于批复' }
]"
:key="item.value"
:label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="建设单位名称" prop="建设单位名称">
<el-input v-model="form.constructionUnit"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="建设单位联系人" prop="建设单位联系人">
<el-input v-model="form.constructionUnitContact"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="建设单位联系人电话" prop="建设单位联系人电话">
<el-input v-model="form.constructionUnitPhone"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工单位名称" prop="施工单位名称">
<el-input v-model="form.executionUnit"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="施工单位联系人" prop="施工单位联系人">
<el-input v-model="form.designUnitContact"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="施工单位联系电话" prop="施工单位联系电话">
<el-input v-model="form.executionUnitPhone"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="设计单位名称" prop="设计单位名称">
<el-input v-model="form.designUnit"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设计单位联系人" prop="设计单位联系人">
<el-input v-model="form.designUnitContact"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="设计单位联系人电话" prop="设计单位联系人电话">
<el-input v-model="form.designUnitPhone"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="监理单位名称" prop="监理单位名称">
<el-input v-model="form.supervisionUnit"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="监理单位联系人" prop="监理单位联系人">
<el-input v-model="form.supervisionUnitContact"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="监理单位联系电话" prop="监理单位联系电话">
<el-input v-model="form.supervisionUnitPhone"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="施工图批复时间" prop="施工图批复时间">
<el-date-picker type="date" v-model="form.designApprovalTime" clearable format="YYYY-MM-DD"
value-format="YYYY-MM-DD">
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="监理单位联系电话" prop="监理单位联系电话">
<el-input v-model="form.supervisionUnitPhone"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
<div class="button-box">
<el-button type="primary" size="large">提交</el-button>
</div>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, onMounted, watch, reactive, toRaw } from 'vue'
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute()
const form = ref({})
const formRef = ref(null)
onMounted(() => {
if (route.params.data) {
const data = JSON.parse(decodeURIComponent(route.params.data));
form.value = data
// console.log('@@@@data', data);
} else {
}
})
</script> </script>
<style scoped> <style scoped>
@ -15,4 +310,19 @@
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
} }
.form-box {
width: 100%;
height: 90%;
overflow-y: auto;
padding: 20px;
}
.button-box {
flex: 1;
padding: 20px;
display: flex;
flex-direction: row;
justify-content: flex-end;
}
</style> </style>

View File

@ -0,0 +1,48 @@
<template>
<div class="detail-container">
<el-form ref="formRef" :model="form" label-position="right" label-width="auto"
style="max-height: 60vh; overflow-y: auto;" :rules="rules">
<el-row>
<el-col :span="24">
<el-form-item label="" prop="驳回原因">
<el-input v-model="form.rejectReason"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script setup>
import { ref, onMounted, watch, computed } from "vue";
import { request } from "@/utils/request";
const formRef = ref(null);
defineExpose({ formRef });
const props = defineProps({
form: {
type: Object,
default: () => ({}),
},
});
const rules = computed(() => {
return {
驳回原因: [
{
required: true,
validator: (rule, value, callback) => {
if (props.form.rejectReason) {
callback();
} else {
callback(new Error("请输入驳回原因"));
}
},
trigger: "blur",
},
],
};
});
</script>
<style></style>