明树Git Lab

Commit e91d68aa authored by zhanghan's avatar zhanghan

体系建设 投资规划 开发完毕

parent 7d1f1f9a
<template>
<div class="common-selector-container">
<el-select
v-if="!radio"
v-model="innerValue"
:placeholder="placeholder"
:no-data-text="noDataText"
:disabled="disabled"
style="width: 100%"
@change="handleChange"
>
<el-option
v-for="(item, index) in currentOptions"
:key="`${dictName}-${index}`"
:label="item[labelKey]"
:value="item[valueKey]"
></el-option>
</el-select>
<el-radio-group
v-else
v-model="innerValue"
:disabled="disabled"
@change="handleChange"
class="common-radio-group"
>
<el-radio
v-for="(item, index) in currentOptions"
:key="`${dictName}-${index}`"
:value="item[valueKey]"
>
{{ item[labelKey] }}
</el-radio>
</el-radio-group>
</div>
</template>
<script setup>
import {
ref,
watch,
defineProps,
defineEmits,
onMounted,
onUnmounted,
} from "vue";
// 极简Props:仅传 v-model + dictName(必传),其余可选
const props = defineProps({
// 双向绑定值(必传)
modelValue: {
type: [String, Number, Object],
default: undefined,
},
// 必传:指定从resourceData中取哪个字典(如dqlx/ zdfx-type/ fileHierarchy)
dictName: {
type: String,
required: true,
},
// 可选:自定义选项标签字段(默认name)
labelKey: {
type: String,
default: "name",
},
// 可选:自定义选项值字段(默认key)
valueKey: {
type: String,
default: "key",
},
// 可选:是否切换为单选组(默认false=下拉)
radio: {
type: Boolean,
default: false,
},
// 可选:是否禁用
disabled: {
type: Boolean,
default: false,
},
// 可选:自定义占位符
placeholder: {
type: String,
default: "请选择",
},
// 可选:自定义无数据文本
noDataText: {
type: String,
default: "暂无数据",
},
});
// 事件派发(v-model规范 + 自定义change)
const emit = defineEmits(["update:modelValue", "change"]);
// 内部状态
const innerValue = ref(props.modelValue); // 内部绑定值
const currentOptions = ref([]); // 最终渲染的字典数据
// 核心方法:从sessionStorage读取resourceData并匹配字典
const getDictFromStorage = () => {
try {
// 读取并解析sessionStorage中的resourceData
const resourceStr = sessionStorage.getItem("resourceData") || "{}";
const resourceData = JSON.parse(resourceStr);
// 根据dictName取对应字典,容错:非数组则置空
const targetDict = resourceData[props.dictName] || [];
currentOptions.value = Array.isArray(targetDict) ? targetDict : [];
} catch (e) {
currentOptions.value = [];
console.warn(`【通用选择器】读取${props.dictName}字典失败:`, e);
}
};
// 监听sessionStorage变化(适配resourceData动态更新的场景)
const handleStorageChange = (e) => {
if (e.key === "resourceData") getDictFromStorage();
};
// 初始化+监听
onMounted(() => {
getDictFromStorage(); // 首次加载读取字典
window.addEventListener("storage", handleStorageChange); // 监听storage变化
});
// 销毁时移除监听,避免内存泄漏
onUnmounted(() => {
window.removeEventListener("storage", handleStorageChange);
});
// 监听1:外部v-model值变化,同步到组件内部
watch(
() => props.modelValue,
(newVal) => {
innerValue.value = newVal;
},
{ immediate: true }
);
// 监听2:dictName/labelKey/valueKey变化,重新读取字典(适配动态切换字典的场景)
watch(
() => [props.dictName, props.labelKey, props.valueKey],
() => {
getDictFromStorage();
},
{ deep: true }
);
// 核心:值变化时更新外部v-model
const handleChange = (val) => {
emit("update:modelValue", val);
emit("change", val);
};
</script>
<style scoped lang="less">
.common-selector-container {
width: 100%; // 自适应布局
}
// 单选组间距优化
.common-radio-group {
display: flex;
flex-wrap: wrap;
gap: 16px 32px;
align-items: center;
width: 100%;
}
// 修复下拉选项宽度继承
:deep(.el-select) {
width: 100%;
}
</style>
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import * as ElIcons from '@element-plus/icons'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import router from './router'
import { createPinia } from 'pinia';
import { createApp } from "vue";
import "./style.css";
import App from "./App.vue";
import ElementPlus from "element-plus";
import "element-plus/dist/index.css";
import CommonSelector from "@/components/CommonSelector.vue";
import * as ElIcons from "@element-plus/icons";
import zhCn from "element-plus/dist/locale/zh-cn.mjs";
import router from "./router";
import { createPinia } from "pinia";
import "./assets/fonts/font.less"; // 字体样式
import "../public/iconFont/iconfont.css"; // 图标字体样式
import { $get, $post } from "@/data/https.js";
import windowConfig from "@/window";
import moment from "moment";
const pinia = createPinia()
const app = createApp(App)
const pinia = createPinia();
const app = createApp(App);
app.config.globalProperties.$get = $get;
app.config.globalProperties.$post = $post;
app.config.globalProperties.windowConfig = windowConfig;
app.config.globalProperties.moment = moment;
for (const [key, component] of Object.entries(ElIcons)) {
app.component(key, component)
app.component(key, component);
}
app.use(ElementPlus, {locale: zhCn}).use(router).use(pinia).mount('#app')
app.component("CommonSelector", CommonSelector);
app.use(ElementPlus, { locale: zhCn }).use(router).use(pinia).mount("#app");
......@@ -14,30 +14,69 @@
<div class="project-tab-content">
<div class="tab-content">
<el-form :model="formData" :label-width="200" :disabled="isPreview">
<el-collapse v-model="activeCollapse">
<!-- 项目信息 -->
<el-collapse-item title="项目信息" name="项目信息">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="文件名称">
<el-input
v-model="formData.qsmbgbzdw"
placeholder="请输入文件名称"
/>
<el-form-item label-width="0" required>
<el-select
v-model="formData.projectId"
placeholder="请选择项目信息"
no-data-text="暂无数据"
@change="changeProject"
>
<el-option
v-for="item in projectList"
:key="item.key"
:label="item.projectName"
:value="item.id"
></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item
title="项目公司自查报告"
name="项目公司自查报告"
>
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.xmgszcbg" />
</el-form-item>
</el-collapse-item>
<el-collapse-item title="投资后评价报告" name="投资后评价报告">
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.hpjbg" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="颁布时间">
<el-form-item label="评价时间">
<el-date-picker
v-model="formData.qsmsj"
v-model="formData.hpjsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择颁布时间"
placeholder="请选择评价时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告编制单位">
<el-input
v-model="formData.hpjbgbzdw"
placeholder="请输入报告编制单位"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评审单位">
<el-input
v-model="formData.qsmpsdw"
v-model="formData.hpjpsdw"
placeholder="请输入评审单位"
/>
</el-form-item>
......@@ -45,18 +84,75 @@
<el-col :span="12">
<el-form-item label="评价结果">
<el-input
v-model="formData.qsmpjjg"
v-model="formData.hpjpjjg"
placeholder="请输入评价结果"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
<el-collapse-item title="问题整改" name="问题整改">
<DynamicTable
v-model="formData.tzhpjwtzgs"
:columns="problemColumns"
:default-row="problemDefaultRow"
:select-options="selectOptions"
:show-import-export="true"
export-name="问题整改数据"
:scrollbar-always-on="true"
:disabled="isPreview"
/>
</el-collapse-item>
<el-collapse-item
title="全生命周期评价报告"
name="全生命周期评价报告"
>
<el-row :gutter="20">
<el-col :span="24">
<el-form-item label-width="0" label="">
<FileUploader v-model="formData.qsmzqpj" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价时间">
<el-date-picker
v-model="formData.qsmsj"
type="datetime"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择评价时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="报告编制单位">
<el-input
v-model="formData.qsmbgbzdw"
placeholder="请输入报告编制单位"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评审单位">
<el-input
v-model="formData.qsmpsdw"
placeholder="请输入评审单位"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="评价结果">
<el-input
v-model="formData.qsmpjjg"
placeholder="请输入评价结果"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-form>
</div>
</div>
......
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
<el-button type="primary" @click="investmentAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,39 +64,44 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
label: "项目全称",
prop: "itemName",
label: "事项名称",
showOverflowTooltip: true,
},
{
prop: "jc",
label: "项目简称",
prop: "itemType",
label: "事项类型",
showOverflowTooltip: true,
},
{
prop: "nbtzglzt",
label: "内部投资管理主体",
prop: "planYear",
label: "编制年度",
showOverflowTooltip: true,
},
{
prop: "planCycle",
label: "规划周期(年)",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmscjd",
label: "项目所处阶段",
prop: "planUnit",
label: "编制单位",
showOverflowTooltip: true,
width: 120,
},
{
prop: "gqjg",
label: "股权结构",
prop: "leadingDepartment",
label: "牵头部门",
showOverflowTooltip: true,
width: 120,
},
{
prop: "xmzbjze",
label: "项目资本金总额(亿元)",
prop: "creatorName",
label: "填报人",
showOverflowTooltip: true,
},
{
prop: "creatorTime",
label: "填报时间",
showOverflowTooltip: true,
width: 180,
},
{
......@@ -116,13 +121,18 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
url: "/api/project/getTzghList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
tableData.value = data.rows.map((it) => {
return {
...it,
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
loading.value = false;
},
......@@ -138,12 +148,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
const investmentAdd = () => {
router.push("/investmentAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
id: item.id,
},
......@@ -151,7 +161,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
isPreview: true,
id: item.id,
......@@ -166,7 +176,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
url: "/api/project/deleteTzgh",
data: {
id: item.id,
},
......@@ -184,5 +194,5 @@ onMounted(() => {
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
@import "@/styles/verticalManages.less";
</style>
This diff is collapsed.
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
<el-button type="primary" @click="investmentAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,39 +64,44 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
label: "项目全称",
prop: "itemName",
label: "事项名称",
showOverflowTooltip: true,
},
{
prop: "jc",
label: "项目简称",
prop: "itemType",
label: "事项类型",
showOverflowTooltip: true,
},
{
prop: "nbtzglzt",
label: "内部投资管理主体",
prop: "planYear",
label: "编制年度",
showOverflowTooltip: true,
},
{
prop: "planCycle",
label: "规划周期(年)",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmscjd",
label: "项目所处阶段",
prop: "planUnit",
label: "编制单位",
showOverflowTooltip: true,
width: 120,
},
{
prop: "gqjg",
label: "股权结构",
prop: "leadingDepartment",
label: "牵头部门",
showOverflowTooltip: true,
width: 120,
},
{
prop: "xmzbjze",
label: "项目资本金总额(亿元)",
prop: "creatorName",
label: "填报人",
showOverflowTooltip: true,
},
{
prop: "creatorTime",
label: "填报时间",
showOverflowTooltip: true,
width: 180,
},
{
......@@ -116,13 +121,18 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
url: "/api/project/getTzghList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
tableData.value = data.rows.map((it) => {
return {
...it,
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
loading.value = false;
},
......@@ -138,12 +148,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
const investmentAdd = () => {
router.push("/investmentAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
id: item.id,
},
......@@ -151,7 +161,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
name: "investmentAdd",
query: {
isPreview: true,
id: item.id,
......@@ -166,7 +176,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
url: "/api/project/deleteTzgh",
data: {
id: item.id,
},
......@@ -184,5 +194,5 @@ onMounted(() => {
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
@import "@/styles/verticalManages.less";
</style>
This diff is collapsed.
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="evaluateAdd">新增</el-button>
<el-button type="primary" @click="systemAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,34 +64,29 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "projectName",
label: "项目信息",
showOverflowTooltip: true,
},
{
prop: "xmgszcbgLen",
prop: "wjmc",
label: "文件名称",
showOverflowTooltip: true,
},
{
prop: "hpjbgLen",
prop: "wjcj",
label: "文件层级",
showOverflowTooltip: true,
},
{
prop: "qsmzqpjLen",
prop: "wjlb",
label: "文件类别",
showOverflowTooltip: true,
},
{
prop: "附件上传",
label: "文件类别",
prop: "fjscLen",
label: "附件上传",
showOverflowTooltip: true,
},
{
prop: "颁布时间",
label: "文件类别",
prop: "bbsj",
label: "颁布时间",
showOverflowTooltip: true,
},
......@@ -112,7 +107,7 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getTzhpjList",
url: "/api/project/getTxjsList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
......@@ -121,10 +116,7 @@ const getStatementData = () => {
tableData.value = data.rows.map((it) => {
return {
...it,
xmgszcbgLen: it.xmgszcbg?.length + "个",
hpjbgLen: it.hpjbg?.length + "个",
qsmzqpjLen: it.qsmzqpj?.length + "个",
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
......@@ -142,12 +134,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const evaluateAdd = () => {
router.push("/evaluateAdd");
const systemAdd = () => {
router.push("/systemAdd");
};
const editStatement = (item) => {
router.push({
name: "evaluateAdd",
name: "systemAdd",
query: {
id: item.id,
},
......@@ -155,7 +147,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "evaluateAdd",
name: "systemAdd",
query: {
isPreview: true,
id: item.id,
......@@ -170,7 +162,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteTzhpj",
url: "/api/project/deleteTxjs",
data: {
id: item.id,
},
......
This diff is collapsed.
......@@ -4,7 +4,7 @@
<div class="manage-header">
<div class="header-left"></div>
<div class="header-right">
<el-button type="primary" @click="shareAdd">新增</el-button>
<el-button type="primary" @click="vscouncilAdd">新增</el-button>
</div>
</div>
<div class="manage-content" v-loading="loading">
......@@ -64,39 +64,39 @@ const { proxy } = getCurrentInstance();
let tableData = ref([]);
let tableColumns = ref([
{
prop: "qc",
label: "项目全称",
prop: "meetingCode",
label: "会议编号",
showOverflowTooltip: true,
},
{
prop: "jc",
label: "项目简称",
prop: "meetingName",
label: "会议名称",
showOverflowTooltip: true,
},
{
prop: "nbtzglzt",
label: "内部投资管理主体",
prop: "meetingDate",
label: "会议时间",
showOverflowTooltip: true,
},
{
prop: "meetingLocation",
label: "会议地点",
showOverflowTooltip: true,
width: 170,
},
{
prop: "xmscjd",
label: "项目所处阶段",
prop: "attendingLeaders",
label: "参会领导",
showOverflowTooltip: true,
width: 120,
},
{
prop: "gqjg",
label: "股权结构",
prop: "attendingDepartments",
label: "参会部门",
showOverflowTooltip: true,
width: 120,
},
{
prop: "xmzbjze",
label: "项目资本金总额(亿元)",
prop: "meetingMinutesAttachmentLen", // 会议纪要附件数量(表meetingMinutesAttachment数组长度)
label: "会议纪要",
showOverflowTooltip: true,
width: 180,
},
{
......@@ -116,13 +116,18 @@ let pageSize = ref(10);
const getStatementData = () => {
loading.value = true;
proxy.$post({
url: "/api/project/getCgqyglList",
url: "/api/project/getTwhglList",
data: {
page: currentPage.value,
pagesize: pageSize.value,
},
callback: (data) => {
tableData.value = data.rows;
tableData.value = data.rows.map((it) => {
return {
...it,
fjscLen: it.fjsc?.length + "个",
};
});
total.value = data.count;
loading.value = false;
},
......@@ -138,12 +143,12 @@ const handleCurrentPageChange = (page) => {
currentPage.value = page;
getStatementData();
};
const shareAdd = () => {
router.push("/shareAdd");
const vscouncilAdd = () => {
router.push("/vscouncilAdd");
};
const editStatement = (item) => {
router.push({
name: "shareAdd",
name: "vscouncilAdd",
query: {
id: item.id,
},
......@@ -151,7 +156,7 @@ const editStatement = (item) => {
};
const previewStatement = (item) => {
router.push({
name: "shareAdd",
name: "vscouncilAdd",
query: {
isPreview: true,
id: item.id,
......@@ -166,7 +171,7 @@ const deleteStatement = (item) => {
})
.then(() => {
proxy.$post({
url: "/api/project/deleteCgqygl",
url: "/api/project/deleteTwhgl",
data: {
id: item.id,
},
......@@ -184,5 +189,5 @@ onMounted(() => {
</script>
<style scoped lang="less">
@import "@/styles/manage.less";
@import "@/styles/verticalManages.less";
</style>
This diff is collapsed.
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