feat: 业务部门 项目管理
This commit is contained in:
parent
c1c1ea1b8d
commit
b1f5cedd67
@ -138,11 +138,11 @@ const routes = [
|
||||
parentRoute: 'warningManagement' // 用于在面包屑中建立父子关系
|
||||
}
|
||||
},
|
||||
// 项目管理
|
||||
// 项目管理 - 区县
|
||||
{
|
||||
path: '/projectManagement',
|
||||
name: 'projectManagement',
|
||||
component: () => import('../views/ProjectManagement_Rebuild/index.vue'),
|
||||
component: () => import('../views/ProjectManagement_Rebuild/district/index.vue'),
|
||||
meta: {
|
||||
title: '项目管理',
|
||||
breadcrumb: true
|
||||
@ -151,7 +151,7 @@ const routes = [
|
||||
{
|
||||
path: '/projectAdd/:data?',
|
||||
name: 'projectAdd',
|
||||
component: () => import('../views/ProjectManagement_Rebuild/projectAddPage.vue'),
|
||||
component: () => import('../views/ProjectManagement_Rebuild/district/projectAddPage.vue'),
|
||||
meta: {
|
||||
title: '项目填报',
|
||||
breadcrumb: true,
|
||||
@ -161,13 +161,24 @@ const routes = [
|
||||
{
|
||||
path: '/projectDetail/:data?',
|
||||
name: 'projectDetail',
|
||||
component: () => import('../views/ProjectManagement_Rebuild/projectDetailPage.vue'),
|
||||
component: () => import('../views/ProjectManagement_Rebuild/district/projectDetailPage.vue'),
|
||||
meta: {
|
||||
title: '项目详情',
|
||||
breadcrumb: true,
|
||||
parentRoute: 'projectManagement' // 用于在面包屑中建立父子关系
|
||||
}
|
||||
},
|
||||
// 项目管理 - 业务部门
|
||||
{
|
||||
path: '/projectManagement2',
|
||||
name: 'projectManagement2',
|
||||
component: () => import('../views/ProjectManagement_Rebuild/business/index.vue'),
|
||||
meta: {
|
||||
title: '项目管理',
|
||||
breadcrumb: true
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: '/disasterManagement',
|
||||
name: 'disasterManagement',
|
||||
@ -186,7 +197,7 @@ const routes = [
|
||||
breadcrumb: true
|
||||
}
|
||||
},
|
||||
{
|
||||
{
|
||||
path: '/waterDisasterDetail',
|
||||
name: 'WaterDisasterDetail',
|
||||
component: () => import('../views/DisasterManagement/DisasterDetail/WaterDisasterDetail.vue'),
|
||||
|
||||
@ -0,0 +1,440 @@
|
||||
<template>
|
||||
<div class="detail-container">
|
||||
<el-form ref="formRef" :model="form" label-position="right" label-width="150px"
|
||||
style="max-height: 60vh; overflow-y: auto; padding-right: 50px" :rules="rules">
|
||||
<div class="basic-info">
|
||||
<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 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 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 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 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 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 v-model="form.projectExpenseType">
|
||||
<el-radio value="自费重修">自费重修</el-radio>
|
||||
<el-radio value="申报重修">申报重修</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
<div class="performance-info">
|
||||
<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 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 disabled 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 disabled 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 disabled 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 disabled 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 disabled 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 disabled v-model="form.constructionUnit"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设单位联系人" prop="建设单位联系人">
|
||||
<el-input disabled 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 disabled v-model="form.constructionUnitPhone"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工单位名称" prop="施工单位名称">
|
||||
<el-input disabled 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 disabled v-model="form.executionUnitContact"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工单位联系电话" prop="施工单位联系电话">
|
||||
<el-input disabled 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 disabled v-model="form.designUnit"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="设计单位联系人" prop="设计单位联系人">
|
||||
<el-input disabled 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 disabled v-model="form.designUnitPhone"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="监理单位名称" prop="监理单位名称">
|
||||
<el-input disabled 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 disabled v-model="form.supervisionUnitContact"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="监理单位联系电话" prop="监理单位联系电话">
|
||||
<el-input disabled 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 disabled 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="施工图设计批复文件" label-width="200px">
|
||||
<FileUpload type="image" :limit="9" v-model="form.designApprovalFiles" :fileType=2 />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="施工合同时间" prop="施工合同时间">
|
||||
<el-date-picker disabled type="date" v-model="form.contractTime" 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-number disabled v-model="form.contractAmount" :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="施工合同">
|
||||
<FileUpload type="image" :limit="9" v-model="form.contractFiles" :fileType=3 />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="建设完成投资" prop="建设完成投资">
|
||||
<el-input-number disabled v-model="form.completedInvestment" :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-date-picker disabled type="date" v-model="form.acceptanceTime" 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="交竣工证书" label-width="200px">
|
||||
<FileUpload type="image" :limit="9" v-model="form.acceptanceFiles" :fileType=4 />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="其他佐证文件" prop="其他佐证文件">
|
||||
<FileUpload type="image" :limit="9" v-model="form.otherFiles" :fileType=6 />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="完工项目上传图片(附件)" prop="完工项目上传图片" label-width="200px">
|
||||
<FileUpload type="image" :limit="9" v-model="form.completedFiles" :fileType=5 />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, onMounted, watch, computed } from "vue";
|
||||
import { request } from "@/utils/request";
|
||||
import FileUpload from '@/component/FileUpload/FileUpload.vue'
|
||||
|
||||
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.technicalGrade) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请选择技术等级"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
资金来源: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.fundingSource) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请填写资金来源"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
处置灾毁处数: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.disposalCount) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请填写处置灾毁处数"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
已完工处数: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.completedCount) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请填写已完工处数"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
总投资: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.totalInvestment) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请填写总投资数"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
项目费用类型: [
|
||||
{
|
||||
required: true,
|
||||
validator: (rule, value, callback) => {
|
||||
if (props.form.projectExpenseType) {
|
||||
callback();
|
||||
} else {
|
||||
callback(new Error("请选择项目费用类型"));
|
||||
}
|
||||
},
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<style></style>
|
||||
@ -0,0 +1,438 @@
|
||||
import { h, ref, onMounted, reactive, watch, toRaw, nextTick } from "vue";
|
||||
import { request } from "@/utils/request";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import ExamineDialog from "./examineDialog.vue";
|
||||
import RejectDialog from './rejectDialog.vue';
|
||||
|
||||
const tableData = ref([]); // 表格数据
|
||||
const modelVisible = ref(false); // 弹窗状态
|
||||
const drawerVisible = ref(false); // 抽屉状态
|
||||
// 弹窗内容
|
||||
const model = reactive({
|
||||
title: '',
|
||||
content: null,
|
||||
props: {},
|
||||
onCancel: null,
|
||||
onConfirm: null,
|
||||
width: '',
|
||||
footerPosition: null,
|
||||
onCancelType: null,
|
||||
onConfirmName: null,
|
||||
onCancelName: null,
|
||||
tagContent: null,
|
||||
tagType: null,
|
||||
});
|
||||
const form = reactive({
|
||||
});
|
||||
// 抽屉内容
|
||||
const drawer = reactive({
|
||||
title: '',
|
||||
content: null,
|
||||
props: {},
|
||||
onCancel: null,
|
||||
onConfirm: null,
|
||||
direction: 'rtl',
|
||||
size: '50%'
|
||||
});
|
||||
const dialogRef = ref(null); // 弹窗实例
|
||||
const drawerRef = ref(null); // 抽屉实例
|
||||
|
||||
// 第二个弹窗
|
||||
const model2 = reactive({
|
||||
title: '',
|
||||
content: null,
|
||||
props: {},
|
||||
onCancel: null,
|
||||
onConfirm: null,
|
||||
width: '',
|
||||
footerPosition: null,
|
||||
onCancelType: null,
|
||||
onConfirmName: null,
|
||||
onCancelName: null,
|
||||
tagContent: null,
|
||||
tagType: null,
|
||||
});
|
||||
const modelVisible2 = ref(false);
|
||||
const dialogRef2 = ref(null);
|
||||
|
||||
|
||||
|
||||
// 过滤条件
|
||||
const filterData = reactive({
|
||||
})
|
||||
// 分页
|
||||
const pagination = reactive({
|
||||
current: 1,
|
||||
pageSize: 10,
|
||||
total: 0,
|
||||
pageSizes: [10, 20, 50],
|
||||
layout: "prev, pager, next, jumper",
|
||||
onChange: (page, pageSize) => {
|
||||
pagination.current = page;
|
||||
pagination.pageSize = pageSize;
|
||||
getTableData(filterData);
|
||||
},
|
||||
});
|
||||
|
||||
// 获取项目列表
|
||||
const getTableData = async (filterData = {}) => {
|
||||
try {
|
||||
// 过滤空字符串属性
|
||||
const filteredParams = {};
|
||||
Object.keys(filterData).forEach(key => {
|
||||
if (filterData[key] !== '' && filterData[key] != null) {
|
||||
filteredParams[key] = filterData[key];
|
||||
}
|
||||
});
|
||||
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/recovery/list',
|
||||
method: "GET",
|
||||
params: {
|
||||
...filteredParams,
|
||||
submitTimeStart: filteredParams?.submitTimeStart ? filteredParams.submitTimeStart + `-01-01 00:00:00` : null,
|
||||
pageNum: pagination.current,
|
||||
pageSize: pagination.pageSize,
|
||||
}
|
||||
})
|
||||
if (res.code === '00000') {
|
||||
tableData.value = res.data.records
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取项目列表失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// 驳回项目
|
||||
const rejectProject = async () => {
|
||||
try {
|
||||
const loading = ElLoading.service({
|
||||
lock: true,
|
||||
text: '操作中',
|
||||
background: 'rgba(0, 0, 0, 0.7)',
|
||||
})
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/recovery/approve',
|
||||
method: 'POST',
|
||||
data: {
|
||||
id: form.id,
|
||||
approveLevel: 2,
|
||||
isPass: false,
|
||||
rejectReason: form.rejectReason,
|
||||
}
|
||||
})
|
||||
loading.close();
|
||||
if (res.code === '00000') {
|
||||
ElMessage.success('操作成功');
|
||||
modelVisible.value = false;
|
||||
modelVisible2.value = false;
|
||||
getTableData(filterData);
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error('操作失败');
|
||||
console.error('驳回项目失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 审批通过项目
|
||||
const approveProject = async () => {
|
||||
try {
|
||||
const loading = ElLoading.service({
|
||||
lock: true,
|
||||
text: '操作中',
|
||||
background: 'rgba(0, 0, 0, 0.7)',
|
||||
})
|
||||
const res = await request({
|
||||
url: '/snow-ops-platform/recovery/approve',
|
||||
method: 'POST',
|
||||
data: {
|
||||
id: form.id,
|
||||
approveLevel: 2,
|
||||
isPass: true,
|
||||
}
|
||||
})
|
||||
loading.close();
|
||||
if (res.code === '00000') {
|
||||
ElMessage.success('操作成功');
|
||||
modelVisible.value = false;
|
||||
modelVisible2.value = false;
|
||||
getTableData(filterData);
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error('操作失败');
|
||||
console.error('审批项目失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取项目详情
|
||||
const getDetailData = async (id) => {
|
||||
try {
|
||||
const res = await request({
|
||||
url: `/snow-ops-platform/recovery/getById`,
|
||||
method: 'GET',
|
||||
params: {
|
||||
id: id,
|
||||
}
|
||||
});
|
||||
if (res.code === '00000') {
|
||||
return res.data;
|
||||
} else {
|
||||
throw new Error(res.message);
|
||||
}
|
||||
} catch (error) {
|
||||
ElMessage.error('获取项目详情失败');
|
||||
console.error('获取项目详情失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
export default () => {
|
||||
|
||||
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: "subsidyAmount",
|
||||
label: "补助金额(万元)",
|
||||
},
|
||||
{
|
||||
prop: "fundingSource",
|
||||
label: "资金来源",
|
||||
},
|
||||
{
|
||||
prop: "startTime",
|
||||
label: "开工或预计开工时间",
|
||||
},
|
||||
{
|
||||
prop: "endTime",
|
||||
label: "完工或预计完工时间",
|
||||
},
|
||||
{
|
||||
prop: "projectProgress",
|
||||
label: "项目进度情况",
|
||||
},
|
||||
// {
|
||||
// prop: "reportStatus",
|
||||
// label: "申报状态",
|
||||
// formatter: (row) => {
|
||||
// const colorMap = {
|
||||
// 0: '#409EFF', // 蓝色 - 未申报
|
||||
// 1: '#67C23A', // 绿色 - 已申报
|
||||
// };
|
||||
// const textMap = {
|
||||
// 0: '未申报',
|
||||
// 1: '已申报',
|
||||
// };
|
||||
// const status = row.reportStatus;
|
||||
// const color = colorMap[status] || '#909399';
|
||||
// const text = textMap[status] || '未知状态';
|
||||
// return h(ElText, { style: { color } }, text);
|
||||
// }
|
||||
// },
|
||||
{
|
||||
prop: "approvalStatus",
|
||||
width: 150,
|
||||
label: "审批状态",
|
||||
formatter: (row) => {
|
||||
const colorMap = {
|
||||
0: '#409EFF', // 蓝色 - 待区县审批
|
||||
1: '#67C23A', // 绿色 - 区县审批通过
|
||||
2: '#F56C6C', // 红色 - 区县审批驳回
|
||||
3: '#67C23A', // 绿色 - 业务部门审批通过
|
||||
4: '#F56C6C', // 红色 - 业务部门审批驳回
|
||||
};
|
||||
const textMap = {
|
||||
0: '待区县审批',
|
||||
1: '区县审批通过(待业务部门审批)',
|
||||
2: '区县审批驳回',
|
||||
3: '业务部门审批通过',
|
||||
4: '业务部门审批驳回',
|
||||
};
|
||||
const status = row.approvalStatus;
|
||||
const color = colorMap[status] || '#909399';
|
||||
const text = textMap[status] || '未知状态';
|
||||
return h(ElText, { style: { color } }, text);
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: "updateTime",
|
||||
label: "更新日期",
|
||||
},
|
||||
{
|
||||
label: "操作",
|
||||
fixed: "right",
|
||||
width: 150,
|
||||
render: (row) => () =>
|
||||
h("div", { class: "action-btns" }, [
|
||||
row.approvalStatus === 1 ? h(
|
||||
ElButton,
|
||||
{
|
||||
type: "primary",
|
||||
link: true,
|
||||
onClick: async () => {
|
||||
openExamineDialog(row);
|
||||
},
|
||||
},
|
||||
() => "审批"
|
||||
) : null,
|
||||
h(
|
||||
ElButton,
|
||||
{
|
||||
type: "primary",
|
||||
link: true,
|
||||
style: row.approvalStatus === 1 ? "margin-left: 10px;" : "",
|
||||
onClick: async () => {
|
||||
gotoDetaillPage(row);
|
||||
},
|
||||
},
|
||||
() => "详情"
|
||||
),
|
||||
]),
|
||||
},
|
||||
]
|
||||
|
||||
// 打开审批弹窗
|
||||
const openExamineDialog = async (row) => {
|
||||
const data = await getDetailData(row.id)
|
||||
model.title = '项目审批';
|
||||
Object.assign(form, data);
|
||||
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(async () => {
|
||||
try {
|
||||
await ElMessageBox.confirm(
|
||||
'确定该项目申请通过恢复重建?',
|
||||
'审批确认',
|
||||
{
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
}
|
||||
);
|
||||
await approveProject();
|
||||
} catch {
|
||||
ElMessage.info('已取消审批');
|
||||
}
|
||||
})
|
||||
.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;
|
||||
}
|
||||
|
||||
// 跳转至详情页面
|
||||
const gotoDetaillPage = (row) => {
|
||||
router.push({
|
||||
name: 'projectDetail',
|
||||
params: {
|
||||
data: encodeURIComponent(JSON.stringify(row.id)),
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
getTableData();
|
||||
})
|
||||
|
||||
|
||||
watch(filterData, (val) => {
|
||||
getTableData(filterData);
|
||||
}, { deep: true })
|
||||
|
||||
|
||||
return {
|
||||
tableData,
|
||||
filterData,
|
||||
pagination,
|
||||
columns,
|
||||
|
||||
modelVisible,
|
||||
model,
|
||||
drawerVisible,
|
||||
drawer,
|
||||
dialogRef,
|
||||
drawerRef,
|
||||
openExamineDialog,
|
||||
|
||||
model2,
|
||||
modelVisible2,
|
||||
dialogRef2,
|
||||
}
|
||||
}
|
||||
@ -40,10 +40,10 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import DynamicTable from "../../component/DynamicTable";
|
||||
import DynamicTable from "../../../component/DynamicTable/index.js";
|
||||
import { Search } from "@element-plus/icons-vue";
|
||||
import MyDialog from "../../component/MyDialog";
|
||||
import MyDrawer from "../../component/MyDrawer";
|
||||
import MyDialog from "../../../component/MyDialog/index.js";
|
||||
import MyDrawer from "../../../component/MyDrawer/index.js";
|
||||
import scriptFn from "./index.js";
|
||||
const script = scriptFn();
|
||||
const { dialogRef, drawerRef, dialogRef2 } = script;
|
||||
@ -3,7 +3,7 @@ import { request } from "@/utils/request";
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import ExamineDialog from "./examineDialog.vue";
|
||||
import RejectDialog from './rejectDialog.vue';
|
||||
import { ElLoading } from 'element-plus'
|
||||
import { ElLoading, ElText } from 'element-plus'
|
||||
|
||||
const tableData = ref([]); // 表格数据
|
||||
const modelVisible = ref(false); // 弹窗状态
|
||||
@ -216,25 +216,43 @@ export default () => {
|
||||
prop: "reportStatus",
|
||||
label: "申报状态",
|
||||
formatter: (row) => {
|
||||
const statusMap = {
|
||||
const colorMap = {
|
||||
0: '#409EFF', // 蓝色 - 未申报
|
||||
1: '#67C23A', // 绿色 - 已申报
|
||||
};
|
||||
const textMap = {
|
||||
0: '未申报',
|
||||
1: '已申报',
|
||||
};
|
||||
return statusMap[row.reportStatus] || '未知状态';
|
||||
const status = row.reportStatus;
|
||||
const color = colorMap[status] || '#909399';
|
||||
const text = textMap[status] || '未知状态';
|
||||
return h(ElText, { style: { color } }, text);
|
||||
}
|
||||
},
|
||||
{
|
||||
prop: "approvalStatus",
|
||||
width: 150,
|
||||
label: "审批状态",
|
||||
formatter: (row) => {
|
||||
const statusMap = {
|
||||
const colorMap = {
|
||||
0: '#409EFF', // 蓝色 - 待区县审批
|
||||
1: '#67C23A', // 绿色 - 区县审批通过
|
||||
2: '#F56C6C', // 红色 - 区县审批驳回
|
||||
3: '#67C23A', // 绿色 - 业务部门审批通过
|
||||
4: '#F56C6C', // 红色 - 业务部门审批驳回
|
||||
};
|
||||
const textMap = {
|
||||
0: '待区县审批',
|
||||
1: '区县审批通过(待业务部门审批)',
|
||||
2: '区县审批驳回',
|
||||
3: '业务部门审批通过',
|
||||
4: '业务部门审批驳回',
|
||||
};
|
||||
return statusMap[row.approvalStatus] || '未知状态';
|
||||
const status = row.approvalStatus;
|
||||
const color = colorMap[status] || '#909399';
|
||||
const text = textMap[status] || '未知状态';
|
||||
return h(ElText, { style: { color } }, text);
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -247,7 +265,7 @@ export default () => {
|
||||
width: 150,
|
||||
render: (row) => () =>
|
||||
h("div", { class: "action-btns" }, [
|
||||
h(
|
||||
row.approvalStatus === 0 ? h(
|
||||
ElButton,
|
||||
{
|
||||
type: "primary",
|
||||
@ -257,13 +275,13 @@ export default () => {
|
||||
},
|
||||
},
|
||||
() => "审批"
|
||||
),
|
||||
) : null,
|
||||
h(
|
||||
ElButton,
|
||||
{
|
||||
type: "primary",
|
||||
link: true,
|
||||
style: "margin-left: 10px;",
|
||||
style: row.approvalStatus === 0 ? "margin-left: 10px;" : "",
|
||||
onClick: async () => {
|
||||
gotoDetaillPage(row);
|
||||
},
|
||||
@ -0,0 +1,63 @@
|
||||
<template>
|
||||
<div class="root">
|
||||
<div class="search-box">
|
||||
<el-date-picker v-model="script.filterData.submitTimeStart" type="year" placeholder="年度" format="YYYY"
|
||||
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"
|
||||
placeholder="路线编码" :suffix-icon="Search" />
|
||||
</div>
|
||||
<div class="event-box">
|
||||
<el-button type="primary" color="#952DE6" @click="">导出</el-button>
|
||||
</div>
|
||||
<DynamicTable :dataSource="script.tableData.value" :columns="script.columns" :autoHeight="true"
|
||||
:pagination="script.pagination">
|
||||
|
||||
</DynamicTable>
|
||||
<div class="model-box">
|
||||
<MyDialog v-model="script.modelVisible.value" :title="script.model?.title"
|
||||
:dynamicComponent="script.model?.content" :component-props="script.model?.props"
|
||||
:onConfirm="script.model?.onConfirm" :onCancel="script.model?.onCancel" ref="dialogRef"
|
||||
:width="script.model?.width" :footer-position="script.model?.footerPosition"
|
||||
:onCancelType="script.model?.onCancelType" :onConfirmName="script.model?.onConfirmName"
|
||||
:onCancelName="script.model?.onCancelName" :tagContent="script.model?.tagContent"
|
||||
: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>
|
||||
<MyDrawer v-model="script.drawerVisible.value" :title="script.drawer?.title"
|
||||
:dynamicComponent="script.drawer?.content" :component-props="script.drawer?.props"
|
||||
:onConfirm="script.drawer?.onConfirm" :onCancel="script.drawer?.onCancel" ref="drawerRef"
|
||||
:direction="script.drawer?.direction" :size="script.drawer?.size">
|
||||
</MyDrawer>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import DynamicTable from "../../../component/DynamicTable/index.js";
|
||||
import { Search } from "@element-plus/icons-vue";
|
||||
import MyDialog from "../../../component/MyDialog/index.js";
|
||||
import MyDrawer from "../../../component/MyDrawer/index.js";
|
||||
import scriptFn from "./index.js";
|
||||
const script = scriptFn();
|
||||
const { dialogRef, drawerRef, dialogRef2 } = script;
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.root {
|
||||
height: 100%;
|
||||
padding: 25px;
|
||||
}
|
||||
|
||||
.event-box {
|
||||
margin: 20px 0;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
</style>
|
||||
@ -344,7 +344,7 @@
|
||||
import { ref, onMounted, watch, reactive, toRaw } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import FileUpload from '@/component/FileUpload/FileUpload.vue'
|
||||
import { request } from '../../../../shared/utils/request'
|
||||
import { request } from '../../../../../shared/utils/request'
|
||||
import { ElLoading } from 'element-plus'
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
@ -358,7 +358,7 @@
|
||||
import { ref, onMounted, watch, reactive, toRaw } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import FileUpload from '@/component/FileUpload/FileUpload.vue'
|
||||
import { request } from '../../../../shared/utils/request'
|
||||
import { request } from '../../../../../shared/utils/request'
|
||||
import { ElLoading, ElMessage } from 'element-plus'
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
@ -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>
|
||||
Loading…
x
Reference in New Issue
Block a user