You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

523 lines
18 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="bigone">
<!-- 标题 -->
<div class="containerheadone" id="listtop">
<Title :basicInfo="basicInformation"></Title>
<el-button type="primary" size="medium" plain
style="border: none;background-color: rgba(43,98,241,0.1);color: #2B62F1;" @click="goBack">
</el-button>
</div>
<div style="display: flex;justify-content: center;">
<el-button type="primary" v-if="isSubmitted" disabled>已提交</el-button>
</div>
<div class="containerbody" v-if="isContainerVisible">
<!-- 目录 -->
<div class="containerhead">
<el-menu :default-active="activeSection" mode="horizontal" @select="scrollToSection"
class="custom-menu">
<el-menu-item v-for="(item, index) in sections" :key="index" :index="item.id"
class="custom-menu-item">
{{ item.label }}
</el-menu-item>
</el-menu>
</div>
<!-- 基本信息 -->
<div id="basic">
<Basic :action="action" :basicInfo="basicInformation"
@update-data="handleDataUpdate('basicInformation', $event)">
</Basic>
</div>
<!-- 规划信息 -->
<div id="programme">
<Programme :action="action" :planInfo="planInformation" :xmId="projectId"
@update-data="handleDataUpdate('planInformation', $event)">
</Programme>
</div>
<!-- 建筑信息 -->
<div id="buildings">
<Buildings :action="action" :xmId="projectId"></Buildings>
</div>
<!-- 要素模型信息 -->
<div id="models">
<Models :action="action" :wysmxInfo="wysmxInformations"
@updata-data="handleDataUpdate('wysmxInformations', $event)">
</Models>
</div>
<!-- 月度进展信息 -->
<div id="months">
<Months :action="action"></Months>
</div>
<!-- 企业入驻信息 -->
<div id="companyenter">
<Companyenter :xmId="projectId" :action="action" :qyrzInfo="qyrzInformation"
@update-data="handleDataUpdate('qyrzInformation', $event)">
</Companyenter>
</div>
<!-- 项目画像 -->
<div id="projectpicture">
<Projectpicture :action="action" :id="projectId"></Projectpicture>
</div>
<!-- 项目图例 -->
<div id="projectpicturetwo">
<Projectpicturetwo22 :action="action" :xmId="projectId"> </Projectpicturetwo22>
</div>
<!-- 项目巡礼 -->
<div id="projectgift">
<Projectgift :action="action" :xmId="projectId"></Projectgift>
</div>
<!-- 现场实况 -->
<div id="liver">
<Liver :action="action"></Liver>
</div>
<!-- 项目备忘录 -->
<div id="memo">
<Memo :action="action" :xmId="projectId"></Memo>
</div>
<!-- -->
<div class="bottombox" id="others">
<Others :action="action" :xmId="projectId" :anotherInfo="projectOtherInfos"
@update-data="handleDataUpdate('projectOtherInfos', $event)">
</Others>
</div>
<div class="footer">
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="submitAll">提交审核</el-button>
<el-button type="primary"
v-if="(checkRole(['company']) && !isSubmitted && action === 'fill') || action === 'fill'"
@click="saveAll"></el-button>
</div>
</div>
<!-- 返回顶部 -->
<el-button icon="el-icon-caret-top" circle id="back-to-top" @click="scrollToTop" plain></el-button>
</div>
</template>
<script>
import Title from '@/views/components/ProjectDetails/Title.vue';
import Basic from '@/views/components/ProjectDetails/Basic.vue';
import Buildings from '@/views/components/ProjectDetails/Buildings.vue';
import Companyenter from '@/views/components/ProjectDetails/Companyenter.vue';
import Liver from '@/views/components/ProjectDetails/Liver.vue';
import Memo from '@/views/components/ProjectDetails/Memo.vue';
import Models from '@/views/components/ProjectDetails/Models.vue';
import Months from '@/views/components/ProjectDetails/Months.vue';
import Programme from '@/views/components/ProjectDetails/Programme.vue';
import Projectgift from '@/views/components/ProjectDetails/Projectgift.vue';
import Projectpicture from '@/views/components/ProjectDetails/Projectpicture.vue';
import Projectpicturetwo22 from '@/views/components/ProjectDetails/Projectpicturetwo22.vue';
import Others from '@/views/components/ProjectDetails/Others.vue';
import { checkPermi, checkRole } from "@/utils/permission";
import { getBasicInformationById, fillBasicInformation, auditBasicInformation, tempBasicInformation, getqyBasicInformationPage } from '@/api/ManageApi/index';
export default {
components: {
Title,
Basic,
Buildings,
Companyenter,
Liver,
Memo,
Models,
Months,
Programme,
Projectgift,
Projectpicture,
Projectpicturetwo22,
Others,
},
data() {
return {
activeSection: 'basic',
sections: [
{ id: 'basic', label: '基本信息' },
{ id: 'programme', label: '规划信息' },
{ id: 'buildings', label: '建筑信息' },
{ id: 'models', label: '要素模型信息' },
{ id: 'months', label: '月度进展信息' },
{ id: 'companyenter', label: '企业入驻信息' },
{ id: 'projectpicture', label: '项目画像' },
{ id: 'projectpicturetwo', label: '项目图例' },
{ id: 'projectgift', label: '项目巡礼' },
{ id: 'liver', label: '现场实况' },
{ id: 'memo', label: '项目备忘录' },
{ id: 'others', label: '其他信息' }
],
projectId: null,
isContainerVisible: true,
isSubmitted: false,
basicInformation: {
acceptanceTime: "",
begainTime: "",
endTime: "",
fj: "",
introduction: "",
issuingTime: "",
jsdd: "",
jsjd: "",
jsms: 0,
label: "",
latitude: "",
longitude: "",
name: "",
nature: 0,
id: 0,
phone: "",
prioritize: "",
projectLeader: "",
sgdw: "",
sjdw: "",
ssgnq: 0,
status: 0,
tyshxydm: "",
unitIntroduction: "",
xmfrdwxz: "",
xzfl: 0,
zjzmj: 0,
ztze: 0,
zydmj: 0
},
planInformation: {
bzcjzmj: 0,
dsjzmj: 0,
dxjzmj: 0,
fhdj: "",
fjdctcw: 0,
ghwj: "",
jdctcw: 0,
jrjljzmj: 0,
jzds: 0,
jzmd: 0,
ldl: 0,
id: 0,
rjl: 0,
xmId: 0,
zgjzcs: 0,
zgjzgd: 0,
zjzmj: 0,
zydmj: 0
},
projectOtherInfos: [],
wysmxInformations: [],
qyrzInformation: {
gycfpjwyf: 0,
gycfpjzj: 0,
kzczmj: 0,
params: {},
remark: "",
rysl: 0,
id: 0,
rzl: 0,
rzqyhylx: "",
rzqys: 0,
xmId: 0,
yczmj: 0
},
projectRemarks: [],
loading: false,
};
},
created() {
// 从路由参数中获取 projectId
this.projectId = Number(this.$route.params.id);
this.loadData();
this.action = this.$route.query.action;
},
methods: {
checkPermi,
checkRole,
loadData() {
console.log('Loading data for project ID:', this.projectId);
this.loading = true; // 添加加载状态
getBasicInformationById(this.projectId).then(response => {
const data = response.data;
this.basicInformation = data.basicInformation;
this.planInformation = data.planInformation;
this.projectOtherInfos = data.projectOtherInfos;
this.wysmxInformations = data.wysmxResponses;
this.qyrzInformation = data.qyrzInformation;
this.projectRemarks = data.projectRemarks;
// 确保数据已加载
console.log('Loaded qyrzInformation111111111111:', this.qyrzInformation);
}).finally(() => {
this.loading = false;
});
},
scrollToSection(id) {
this.activeSection = id;
const element = document.getElementById(id);
if (element) {
element.scrollIntoView({ behavior: 'smooth' });
}
},
scrollToTop() {
const basicSection = document.getElementById('listtop');
if (basicSection) {
basicSection.scrollIntoView({ behavior: 'smooth' });
}
},
goBack() {
this.$router.go(-1); // 返回上一个页面
},
// 处理来自子组件的数据更新
handleDataUpdate(dataKey, updatedData) {
if (dataKey === 'projectOtherInfos' || dataKey === 'wysmxInformations') {
if (Array.isArray(updatedData)) {
this[dataKey] = updatedData;
} else {
this[dataKey].push(updatedData);
}
} else {
this[dataKey] = updatedData;
}
console.log(`接收到 ${dataKey} 1234更新:`, updatedData);
},
isDefault(obj, defaultObj) {
for (const key in defaultObj) {
if (obj[key] !== defaultObj[key]) {
return false;
}
}
return true;
},
// 暂存数据
saveAll() {
this.loading = true;
const tempData = this.prepareSubmitData(); // 复用数据准备逻辑
// console.log('准备暂存的完整数据:', JSON.stringify(tempData, null, 2)); // 打印完整数据
tempBasicInformation(tempData)
.then(response => {
this.$message.success('暂存成功');
console.log('暂存数据:', response);
})
.catch(error => {
this.$message.error('暂存失败');
console.error('暂存错误:', error);
})
.finally(() => {
this.loading = false;
});
},
// 获取企业入驻总数
async getEnterpriseCount() {
try {
const params = { xmId: this.projectId, current: 1, size: 1 }; // 只需要总数size=1
const response = await getqyBasicInformationPage(params);
return response.data.total || 0; // 返回总数默认为0
} catch (error) {
console.error('获取企业总数失败:', error);
return 0;
}
},
// 提交数据
async submitAll() {
this.loading = true;
// 校验 wysmxInformations
if (this.wysmxInformations.length === 0 || this.wysmxInformations.includes(null)) {
this.$message.error('请填写模型管理信息');
this.loading = false;
return;
}
// 校验 qyrzInformation 的 rzqys
const rzqys = await this.getEnterpriseCount();
if (rzqys === 0 || rzqys === null || rzqys === undefined) {
this.$message.error('请先导入企业入驻信息');
this.loading = false;
return;
}
// 校验 planInformation
const planRequiredFields = ['zydmj', 'rjl', 'zjzmj', 'jzds', 'zgjzcs', 'fhdj'];
const planMissingFields = planRequiredFields.filter(field => !this.planInformation[field]);
if (planMissingFields.length > 0) {
this.$message.error('请填写完整的规划信息');
this.loading = false;
return;
}
// 校验 basicInformation
const basicRequiredFields = ['ssgnq', 'begainTime', 'endTime', 'xzfl', 'jsms'];
const basicMissingFields = basicRequiredFields.filter(field => !this.basicInformation[field]);
if (basicMissingFields.length > 0) {
this.$message.error('请填写完整的基本信息');
this.loading = false;
return;
}
// 准备数据并提交
const submitData = this.prepareSubmitData();
// console.log('准备提交的完整数据:', JSON.stringify(submitData, null, 2)); // 打印完整数据
fillBasicInformation(submitData)
.then(response => {
this.$message.success('提交成功');
this.isSubmitted = true;
this.$router.push('/manage');
})
.catch(error => {
this.$message.error('提交失败');
console.error('提交错误:', error);
})
.finally(() => {
this.loading = false;
});
},
// 审核通过的提交数据
aduitAll() {
this.loading = true;
const submitData = this.prepareSubmitData();
auditBasicInformation(submitData)
.then(response => {
console.log('提交成功:', response);
this.$message.success('审核通过');
this.isContainerVisible = false;
this.isSubmitted = true;
this.$router.push('/manage');
})
.finally(() => {
this.loading = false;
});
},
// 准备数据(供暂存和提交共用)
prepareSubmitData() {
return {
basicInformation: this.basicInformation,
planInformation: this.planInformation,
projectOtherInfos: this.projectOtherInfos,
qyrzInformation: this.qyrzInformation,
wysmxInformations: this.formatWysmxData() // 格式化要素模型数据
};
},
// 格式化要素模型数据
formatWysmxData() {
return this.wysmxInformations.flatMap(item =>
item.list.map(listItem => ({
id: listItem.id,
createTime: this.formatDate(new Date()),
updateTime: this.formatDate(new Date()),
xmId: this.projectId,
ysmc: item.ysmc,
zdinfor: listItem.zdinfor,
zdname: listItem.zdname,
createBy: "",
updateBy: "",
createId: 0,
updateId: 0
}))
);
},
// 日期格式化方法
formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
const seconds = String(date.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
},
}
};
</script>
<style scoped>
.containerbody {
height: auto;
padding: .3rem .5rem;
display: flex;
flex-direction: column;
gap: 1rem;
position: relative;
overflow: auto;
}
.containerheadone {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
padding: 0 1rem 0 .7rem;
}
.containerhead {
display: flex;
justify-content: space-between;
align-items: center;
width: 100%;
background-color: #FFFFFF;
box-shadow: 0rem 0.13rem 0.63rem 0rem rgba(177, 177, 177, 0.1);
border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;
}
.custom-menu {
margin: 1rem 0rem;
display: flex;
gap: 1rem;
border: none;
}
.custom-menu-item {
color: #3D424C;
width: auto;
height: 2rem;
background: #F4F7FE;
border-radius: 0.25rem 0.25rem 0.25rem 0.25rem;
display: flex;
align-items: center;
justify-content: center;
}
/* 高亮 */
.custom-menu-item.is-active {
background-color: #2B62F1;
color: #fff !important;
}
/* 悬停 */
.custom-menu-item:hover {
background-color: #2B62F1;
color: #fff !important;
}
/* 默认的下划线 */
.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,
.el-menu--horizontal .el-menu-item:not(.is-disabled):hover {
background-color: #2B62F1;
border-bottom: none;
}
.bottombox {
margin-bottom: 2rem;
}
.bigone {
position: relative;
}
#back-to-top {
position: fixed;
bottom: 40%;
right: 5px;
z-index: 99;
font-size: 23px;
}
.footer {
display: flex;
padding: 0 0 2rem 0;
justify-content: center;
}
</style>