明树Git Lab

Commit 1dd94d13 authored by yangyajing's avatar yangyajing

投资控制

parent b5228558
Pipeline #106061 passed with stage
in 17 seconds
...@@ -142,6 +142,7 @@ ...@@ -142,6 +142,7 @@
margin: 10px 0; margin: 10px 0;
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
align-items: center;
} }
.el-table{ .el-table{
margin-bottom: 10px; margin-bottom: 10px;
......
...@@ -13,26 +13,64 @@ ...@@ -13,26 +13,64 @@
<div class="tabs-content"> <div class="tabs-content">
<div class="project-tab-content"> <div class="project-tab-content">
<div class="tab-content"> <div class="tab-content">
<el-form :model="formData" :label-width="130" :disabled="isPreview"> <el-form :model="formData" :label-width="80" :disabled="isPreview">
<el-collapse v-model="activeCollapse"> <el-collapse v-model="activeCollapse">
<el-collapse-item title="投资额控制" name="投资额控制"> <el-collapse-item title="投资额控制" name="投资额控制">
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :span="24"> <el-col :span="12">
<el-form-item label="项目信息" required> <el-form-item label="项目信息" required>
<el-select v-model="formData.projectId" placeholder="请选择" no-data-text="暂无数据" <el-select v-model="formData.projectId" placeholder="请选择" no-data-text="暂无数据">
@change="changeProject"
>
<el-option v-for="item in projectList" :key="item.id" <el-option v-for="item in projectList" :key="item.id"
:label="item.projectName" :value="item.id" :label="item.projectName" :value="item.id"
></el-option> ></el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="费用分项控制、阶段对比表" name="费用分项控制、阶段对比表">
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="本期时间">
<el-date-picker
v-model="fyfxkzFormData.bqsj"
type="month"
placeholder="请选择"
:disabled="!!selectRange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="上期时间">
<el-date-picker
v-model="fyfxkzFormData.sqsj"
type="month"
placeholder="请选择"
:disabled="!!selectRange"
/>
</el-form-item>
</el-col>
<el-col :span="6">
</el-col>
<el-col :span="6">
<div class="tab-handle">
<!-- 点击新增后,这里显示确认按钮 -->
<el-select v-model="selectRange" placeholder="请选择" no-data-text="暂无数据"
:style="{width: '200px', marginRight: '20px'}"
>
<el-option v-for="item in rangeList" :key="item.id"
:label="item.name" :value="item.id"
></el-option>
</el-select>
<el-button type="primary" size="small" @click="addFyfxkz">新增</el-button>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="费用分项控制、阶段对比表" :label-width="200"></el-form-item> <el-table :data="fyfxkzData" style="width: 100%" empty-text="暂无数据" border height="500">
<el-table :data="tzekzData" style="width: 100%" empty-text="暂无数据" border>
<el-table-column type="index" label="序号" width="60" /> <el-table-column type="index" label="序号" width="60" />
<el-table-column prop="xm" label="项目"> <el-table-column prop="xm" label="项目" width="240">
<template #default="scope"> <template #default="scope">
<el-input v-model="scope.row.xm" /> <el-input v-model="scope.row.xm" />
</template> </template>
...@@ -107,7 +145,7 @@ ...@@ -107,7 +145,7 @@
/> />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="cysm" label="本期较上期差异原因说明"> <el-table-column prop="cysm" label="本期较上期差异原因说明" width="240">
<template #default="scope"> <template #default="scope">
<el-input v-model="scope.row.cysm" type="textarea" /> <el-input v-model="scope.row.cysm" type="textarea" />
</template> </template>
...@@ -116,7 +154,195 @@ ...@@ -116,7 +154,195 @@
</el-col> </el-col>
</el-row> </el-row>
</el-collapse-item> </el-collapse-item>
<el-collapse-item title="费用分项控制、阶段对比表" name="费用分项控制、阶段对比表"></el-collapse-item> <el-collapse-item title="决策条件落实情况" name="决策条件落实情况">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="决策单位">
<el-input v-model="formData.jcdw" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="项目批复意见落实情况" :label-width="170"></el-form-item>
<div class="tab-handle">
<el-button type="primary" size="small" @click="addPfyjlsqk">新增</el-button>
</div>
<el-table :data="pfyjlsqkData" style="width: 100%" empty-text="暂无数据" border>
<el-table-column type="index" width="60" />
<el-table-column prop="zyx" label="重要性" width="180">
<template #default="scope">
<el-input v-model="scope.row.zyx" />
</template>
</el-table-column>
<el-table-column prop="ssjd" label="实施阶段" width="180">
<template #default="scope">
<el-input v-model="scope.row.ssjd" />
</template>
</el-table-column>
<el-table-column prop="pfnr" label="批复内容" width="180">
<template #default="scope">
<el-input v-model="scope.row.pfnr" type="textarea" />
</template>
</el-table-column>
<el-table-column prop="pfyjlsqkjtsm" label="批复意见落实情况具体说明" width="180">
<template #default="scope">
<el-input v-model="scope.row.pfyjlsqkjtsm" type="textarea" />
</template>
</el-table-column>
<el-table-column prop="lszxqk" label="落实(执行)情况" width="180">
<template #default="scope">
<el-input v-model="scope.row.lszxqk" type="textarea" />
</template>
</el-table-column>
<el-table-column prop="wlsyy" label="未落实原因" width="180">
<template #default="scope">
<el-input v-model="scope.row.wlsyy" type="textarea" />
</template>
</el-table-column>
<el-table-column prop="xybgzcs" label="下一步工作措施" width="180">
<template #default="scope">
<el-input v-model="scope.row.xybgzcs" type="textarea" />
</template>
</el-table-column>
<el-table-column prop="yjwcsj" label="预计完成时间" width="260">
<template #default="scope">
<el-date-picker
v-model="scope.row.yjwcsj"
type="datetime"
placeholder="请选择"
/>
</template>
</el-table-column>
<el-table-column prop="zrld" label="责任领导" width="180">
<template #default="scope">
<el-input v-model="scope.row.zrld" />
</template>
</el-table-column>
<el-table-column prop="zrbmjzrr" label="责任部门及责任人" width="180">
<template #default="scope">
<el-input v-model="scope.row.zrbmjzrr" />
</template>
</el-table-column>
<el-table-column prop="sfgx" label="是否更新" width="160">
<template #default="scope">
<el-radio-group v-model="scope.row.sfgx">
<el-radio :value="1"></el-radio>
<el-radio :value="2"></el-radio>
</el-radio-group>
</template>
</el-table-column>
<el-table-column label="文件上传" prop="wjsc" width="180">
<template #default="scope">
<el-upload
v-if="!scope.row.wjsc"
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:show-file-list="false"
:on-success="(res, file) => addWjscFile(res, file, scope.row)"
>
<el-button link type="primary">上传</el-button>
</el-upload>
<div class="upload-file-wrap" v-else>
<span class="file-name" @click="downloadFile(scope.row.wjsc)">{{ scope.row.wjsc.originalname }}</span>
<span class="delete-btn" @click="deleteWjscFile(scope.row, scope.$index)">
<el-icon><CloseBold /></el-icon>
</span>
</div>
</template>
</el-table-column>
<el-table-column prop="bz" label="备注" width="180">
<template #default="scope">
<el-input v-model="scope.row.bz" type="textarea" />
</template>
</el-table-column>
<el-table-column label="操作" width="60" fixed="right">
<template #default="scope">
<el-button link type="danger" size="small" @click="deletePfyjlsqk(scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="其他建设目标重大偏差" name="其他建设目标重大偏差">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="文件上传">
<el-upload
:action="windowConfig.baseUrl + '/api/file/upload'"
:headers="{Authorization: token}"
:show-file-list="false"
multiple
:on-success="addMbpcFile"
>
<el-button type="default">上传</el-button>
</el-upload>
<el-button type="default" @click="multiDeleteMbpc" :disabled="!mbpcSelectIds.length">删除选中文件</el-button>
</el-form-item>
<el-table :data="mbpcData" style="width: 100%" empty-text="暂无数据" border
@selection-change="mbpcSelectionChange"
>
<el-table-column type="selection" width="55" />
<el-table-column prop="originalname" label="文件名" />
<el-table-column prop="updatedAt" label="上传时间">
<template #default="{ row, index }">
<span>{{ moment(row.updatedAt).format("YYYY-MM-DD HH:mm:SS") }}</span>
</template>
</el-table-column>
<el-table-column prop="size" label="大小" />
<el-table-column fixed="right" label="操作" width="100">
<template #default="{ row, index }">
<!-- 需要在查看表单disabled时保持允许下载 -->
<span class="always-click" @click="downloadFile(row)">下载</span>
<el-button link type="danger" size="small" @click="deleteMbpc(index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="投资收益" name="投资收益">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label="财务评价主要边界条件变化对比表" :label-width="230"></el-form-item>
<el-table :data="cwpjData" style="width: 100%" empty-text="暂无数据" border height="500">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="bjtj" label="边界条件"/>
<el-table-column prop="jc" label="决策">
<template #default="scope">
<el-input v-model="scope.row.jc" />
</template>
</el-table-column>
<el-table-column prop="xz" label="现状">
<template #default="scope">
<el-input v-model="scope.row.xz" type="textarea" />
</template>
</el-table-column>
<el-table-column prop="zycysm" label="主要差异说明">
<template #default="scope">
<el-input v-model="scope.row.zycysm" type="textarea" />
</template>
</el-table-column>
</el-table>
</el-col>
<el-col :span="24">
<el-form-item label="投资收益指标变化对比表" :label-width="170"></el-form-item>
<el-table :data="tzsyData" style="width: 100%" empty-text="暂无数据" border height="500">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="pjzb" label="评价指标" />
<el-table-column prop="jczb" label="决策指标">
<template #default="scope">
<el-input v-model="scope.row.jczb" />
</template>
</el-table-column>
<el-table-column prop="xzzb" label="现状指标">
<template #default="scope">
<el-input v-model="scope.row.xz" type="textarea" />
</template>
</el-table-column>
</el-table>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse> </el-collapse>
</el-form> </el-form>
</div> </div>
...@@ -138,10 +364,287 @@ ...@@ -138,10 +364,287 @@
token.value = userStore.authToken || sessionStorage.getItem("authToken") || ""; token.value = userStore.authToken || sessionStorage.getItem("authToken") || "";
const activeCollapse = reactive([ const activeCollapse = reactive([
"投资额控制", "费用分项控制、阶段对比表" "投资额控制", "费用分项控制、阶段对比表", "决策条件落实情况", "其他建设目标重大偏差", "投资收益"
]); ]);
let formData = reactive({}); let formData = reactive({});
let loading = ref(false); let loading = ref(false);
// 项目列表
let projectList = ref([]);
const getProjectData = () => {
proxy.$post({
url: "/api/project/listProject",
data: {
page: 1,
pagesize: 1000,
attributes: [],
menuType: "xmjc"
},
callback: (data) => {
projectList.value = data.rows;
}
})
};
// 费用分项控制、阶段对比表
const fyfxkzFormData = reactive({});
let rangeList = ref([]); // 往期列表
const selectRange = ref(""); // 选择查看往期数据
const fyfxkzDefaultData = [
{
xm: "建筑安装工程费"
},
{
xm: "土地使用及拆迁补偿费"
},
{
xm: "项目建设其他费"
},
{
xm: "建设项目管理费"
},
{
xm: "建设项目前期工作费"
},
{
xm: "研究试验费"
},
{
xm: "专项评估费"
},
{
xm: "联合试运转"
},
{
xm: "生产准备费"
},
{
xm: "工程保通管理费"
},
{
xm: "工程保险费"
},
{
xm: "其他相关费用"
},
{
xm: "预备费"
},
{
xm: "建设期贷款利息"
},
{
xm: "新增费用"
},
{
xm: "合计"
}
];
let fyfxkzData = ref([]);
let isPreview = !!route.query.isPreview;
let controlId = route.query.controlId;
const getControlInfo = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzkzInfo",
data: {
id: controlId
},
callback: (res) => {
loading.value = false;
Object.assign(formData, res);
// TODO 费用分项控制、阶段对比表,获取到全周期的数据,默认显示最新的
Object.assign(pfyjlsqkData.value, res.tzkzjcpfyjs);
Object.assign(mbpcData.value, res.qtjsmbzdpc);
Object.assign(cwpjData.value, res.tzkzcwpjs);
Object.assign(tzsyData.value, res.tzkztzsys);
}
});
}
onMounted(() => {
getProjectData();
if (controlId) {
getControlInfo();
} else {
fyfxkzData.value = fyfxkzDefaultData;
}
});
// 项目批复意见落实情况
let pfyjlsqkData = ref([]);
const addPfyjlsqk = () => {
pfyjlsqkData.value.push({});
};
const addWjscFile = (res, file, row) => {
row.wjsc = {};
Object.assign(row.wjsc, res.data);
};
const deleteWjscFile = (row, index) => {
let {wjsc, ...data} = row;
pfyjlsqkData.value[index] = data;
};
const deletePfyjlsqk = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
pfyjlsqkData.value.splice(index, 1);
})
}
// 其他建设目标重大偏差
let mbpcData = ref([]);
const addMbpcFile = (res, file) => {
mbpcData.value.push(res.data);
}
const deleteMbpc = (index) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
mbpcData.value.splice(index, 1);
}).catch(() => {})
}
let mbpcSelectIds = ref([]);
const mbpcSelectionChange = (datas) => {
mbpcSelectIds.value = datas.map(item => item.id);
};
const multiDeleteMbpc = () => {
ElMessageBox.confirm("确认删除选中数据?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
mbpcData.value = mbpcData.value.filter(item => !mbpcSelectIds.value.includes(item.id));
}).catch(() => {})
};
// 下载已上传文件
const downloadFile = (data) => {
let a = document.createElement("a");
a.href = `${proxy.windowConfig.baseUrl}/api/file/download/${data.id}`;
a.download = data.originalname;
document.body.appendChild(a);
a.click();
a.remove();
};
// 财务评价主要边界条件变化对比表
const cwpjData = ref([
{
bjtj: "项目总投资(亿元)"
},
{
bjtj: "项目资本金(亿元)"
},
{
bjtj: "我方出资(亿元)"
},
{
bjtj: "政府方出资(亿元)"
},
{
bjtj: "项目融资(亿元)"
},
{
bjtj: "年度投资比例"
},
{
bjtj: "合作年限"
},
{
bjtj: "长期贷款利率"
},
{
bjtj: "债务偿还方式"
},
{
bjtj: "项目收入(亿元)"
},
{
bjtj: "通行费收入(亿元)"
},
{
bjtj: "其他收入(亿元)"
},
{
bjtj: "运营期补助收入(亿元)"
},
{
bjtj: "经营成本(亿元)"
},
{
bjtj: "税率"
},
{
bjtj: "折旧摊销方式"
}
]);
// 投资收益指标变化对比表
const tzsyData = ref([
{
pjzb: "项目全投资内部收益率"
},
{
pjzb: "项目资本金内部收益率"
},
{
pjzb: "社会资本方内部收益率"
},
{
pjzb: "资本金综合内部收益率"
},
{
pjzb: "静态投资回收期(年)"
},
{
pjzb: "累计净现金流(亿元)"
},
{
pjzb: "静态投资回收期(年)"
},
{
pjzb: "累计净现金流(亿元)"
},
{
pjzb: "现金流平衡年"
},
{
pjzb: "盈亏平衡年"
},
{
pjzb: "可供分配利润转正年"
}
]);
const backClick = () => {
router.back(-1)
}
const saveClick = () => {
if (formData.projectId) {
let url = formData.id ? "updateTzkz" : "createTzkz";
proxy.$post({
url: "/api/project/" + url,
data: {
...formData,
// tzkztzekzs: fyfxkzData.value,
tzkzjcpfyjs: pfyjlsqkData.value,
qtjsmbzdpc: mbpcData.value,
tzkzcwpjs: cwpjData.value,
tzkztzsys: tzsyData.value
},
callback: (data) => {
router.back(-1)
}
})
} else {
ElMessage.warning("请选择项目信息");
}
}
</script> </script>
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
<script setup> <script setup>
import { ref, onMounted, getCurrentInstance } from "vue"; import { ref, onMounted, getCurrentInstance } from "vue";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import CommonTable from "@/components/common/commonTable.vue"; import CommonTable from "@/components/common/commonTable.vue";
const router = useRouter(); const router = useRouter();
...@@ -49,8 +50,8 @@ ...@@ -49,8 +50,8 @@
showOverflowTooltip: true showOverflowTooltip: true
}, },
{ {
prop: "projectCode", prop: "jcdw",
label: "项目编号", label: "决策单位",
showOverflowTooltip: true showOverflowTooltip: true
}, },
{ {
...@@ -99,7 +100,7 @@ ...@@ -99,7 +100,7 @@
router.push({ router.push({
name: "addControl", name: "addControl",
query: { query: {
projectId: item.id controlId: item.id
} }
}); });
}; };
...@@ -108,10 +109,28 @@ ...@@ -108,10 +109,28 @@
name: "addControl", name: "addControl",
query: { query: {
isPreview: true, isPreview: true,
projectId: item.id controlId: item.id
} }
}) })
} }
const deleteControl = (item) => {
ElMessageBox.confirm("确认删除该项?", "提示",{
confirmButtonText: '确认',
cancelButtonText: '取消',
type: 'warning',
}).then(() => {
proxy.$post({
url: "/api/project/deleteTzkz",
data: {
id: item.id
},
callback: (data) => {
ElMessage.success("删除成功");
getControlData();
}
})
}).catch(() => {})
}
onMounted(() => { onMounted(() => {
getControlData(); getControlData();
}) })
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment