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.
683 lines
19 KiB
683 lines
19 KiB
<template>
|
|
<div class="m-pop">
|
|
<div class="wrap">
|
|
<cpt-card>
|
|
<div class="title">
|
|
<img src="@/assets/img/shuju/title-tip.png" />
|
|
<span>项目详情</span>
|
|
</div>
|
|
|
|
<div class="btn-close"
|
|
@click="handleClose">
|
|
<img src="@/assets/img/shuju/people/close.png" />
|
|
</div>
|
|
<div class="m-top">
|
|
<div class="m-info">
|
|
<div class="info-prop">
|
|
<span>项目标题:</span>
|
|
<span>{{ projectInfo.projectTitle }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>项目背景:</span>
|
|
<span>{{ projectInfo.backGround }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>项目方案:</span>
|
|
<span>{{ projectInfo.projectTitle }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>内部备注:</span>
|
|
<span>{{ projectInfo.internalRemark || "--" }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>当前处理部门:</span>
|
|
<span>{{ projectInfo.departmentNameList.join("、") }}</span>
|
|
</div>
|
|
<div class="info-prop"
|
|
v-if="projectCate.length > 0">
|
|
<span>分类:</span>
|
|
<fold-text :row="3">
|
|
<div :key="item.name"
|
|
v-for="item in projectCate">
|
|
{{ item.name }}
|
|
</div>
|
|
</fold-text>
|
|
</div>
|
|
<div class="info-prop"
|
|
v-if="projectTag.length > 0">
|
|
<span>标签:</span>
|
|
<fold-text :row="3">
|
|
<div :key="item.name"
|
|
v-for="item in projectTag">
|
|
{{ item.name }}
|
|
</div>
|
|
</fold-text>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="m-process"
|
|
v-if="projectProcess.length > 0">
|
|
<div class="process-title">处理进展</div>
|
|
<div class="list">
|
|
<div class="item"
|
|
:class="index === 0 ? 'z-on' : ''"
|
|
:key="item.processId"
|
|
v-for="(item, index) in projectProcess">
|
|
<div class="item-row">
|
|
<div class="name">{{ item.processName }}</div>
|
|
<div class="date">
|
|
{{ item.processTime }}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="detail">
|
|
<div class="detail-field">处理部门:</div>
|
|
<div class="detail-value">{{ item.departmentName }}</div>
|
|
</div>
|
|
|
|
<div class="detail"
|
|
v-if="item.processName != '转项目' && item.publicReply">
|
|
<div class="detail-field">说 明:</div>
|
|
<div class="detail-value">
|
|
<fold-text :row="3">{{ item.publicReply }}</fold-text>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="detail"
|
|
v-if="item.processName != '转项目' && item.internalRemark">
|
|
<div class="detail-field">内部备注:</div>
|
|
<div class="detail-value">
|
|
<fold-text :row="3">{{
|
|
item.internalRemark
|
|
}}</fold-text>
|
|
</div>
|
|
</div>
|
|
<div class="detail">
|
|
<div class="attachement-list">
|
|
<a :href="att.url"
|
|
target="_blank"
|
|
:key="att.url"
|
|
v-for="att in item.internalFile">
|
|
<i class="el-icon-folder-opened"></i>
|
|
{{ att.name }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div v-if="projectInfo.origin!=='agency'"
|
|
class="tabs">
|
|
<div class="tab-btn"
|
|
@click="subStartGroupIndex"
|
|
v-if="groupList.length > 9">
|
|
<img src="@/assets/img/shuju/people/arrow-double-left.png" />
|
|
</div>
|
|
<div v-show="index >= startGroupIndex && index < startGroupIndex + 9"
|
|
class="tab"
|
|
:class="groupIndex % groupList.length == index ? 'z-on' : ''"
|
|
:key="'tab' + index"
|
|
@click="groupIndex = index"
|
|
v-for="(item, index) in groupList">
|
|
{{ item.label }}
|
|
</div>
|
|
<div class="tab-btn"
|
|
@click="addStartGroupIndex"
|
|
v-if="groupList.length > 9">
|
|
<img src="@/assets/img/shuju/people/arrow-double-right.png" />
|
|
</div>
|
|
</div>
|
|
|
|
<div class="m-case"
|
|
v-if="projectInfo.origin!=='agency'">
|
|
<div class="m-yanpan"
|
|
v-if="groupIndex == 0">
|
|
<div v-if="projectId">
|
|
<analyse v-if="yanPan.loading"
|
|
singleTitle="楼院小组"
|
|
:userList="yanPan.homeUserList"
|
|
:userName="yanPan.icUserName"
|
|
:singleList="yanPan.singleList"
|
|
:hasEvent="yanPan.hasEvent"
|
|
:moreList="yanPan.moreList"
|
|
@user="toUserInfo"
|
|
@project="toProjectInfo" />
|
|
<screen-loading v-else>加载中</screen-loading>
|
|
</div>
|
|
<div v-else
|
|
class="m-hint">
|
|
<img src="@/assets/img/modules/visual/noData.png"
|
|
class="no-data-img" />
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if="groupIndex == 1">
|
|
<div class="m-row"
|
|
v-if="projectInfo.originId">
|
|
<div v-if="projectInfo.origin==='issue'"
|
|
class="m-info">
|
|
<div class="info-prop">
|
|
<span>议题标题:</span>
|
|
<span>{{ issueInfo.issueTitle }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>议题建议:</span>
|
|
<span>{{ issueInfo.issueSuggestion }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>所属网格:</span>
|
|
<span>{{ issueInfo.belongsGridName || "--" }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>议题发起人:</span>
|
|
<span>{{ issueInfo.issueInitiator }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>议题来源:</span>
|
|
<span>{{ issueInfo.topicInfo.groupName }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>转议题时间:</span>
|
|
<span>{{ issueInfo.shiftIssueTime }}</span>
|
|
</div>
|
|
</div>
|
|
<div v-if="projectInfo.origin==='resi_event'"
|
|
class="m-info">
|
|
<div class="info-title">事件内容</div>
|
|
<div class="info-content">{{ info.eventContent }}</div>
|
|
<div class="info-pics">
|
|
<img :src="src"
|
|
:key="src"
|
|
v-for="src in info.eventImgs"
|
|
@click="watchImg(src)" />
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>提交时间:</span>
|
|
<span>{{ info.eventTime }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>报事人:</span>
|
|
<span>{{ info.eventPeopleName }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>所属网格:</span>
|
|
<span>{{ info.gridName }}</span>
|
|
</div>
|
|
<div class="info-prop">
|
|
<span>提报给:</span>
|
|
<span>{{ info.eventPerson.join("、") || "--" }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div v-if="projectInfo.origin==='issue'"
|
|
class="m-line">
|
|
<div class="stat">
|
|
<div class="stat-item">
|
|
<div>
|
|
{{ issueTrend.realityVoteCount }}/{{
|
|
issueTrend.shouldVoteCount
|
|
}}
|
|
</div>
|
|
<div class="z-weak">已表决/应表决</div>
|
|
</div>
|
|
<div class="stat-item">
|
|
<div>{{ issueTrend.supportAmount }}</div>
|
|
<div class="z-weak">支持</div>
|
|
</div>
|
|
<div class="stat-item">
|
|
<div>{{ issueTrend.oppositionAmount }}</div>
|
|
<div class="z-weak">反对</div>
|
|
</div>
|
|
</div>
|
|
|
|
<line-chart v-if="issueChartData.length > 0"
|
|
:list="issueChartData" />
|
|
</div>
|
|
</div>
|
|
<div v-else
|
|
class="m-hint">
|
|
<img src="@/assets/img/modules/visual/noData.png"
|
|
class="no-data-img" />
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</cpt-card>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import cptCard from "@/views/modules/visual/cpts/card";
|
|
import screenLoading from "@/views/modules/visual/cpts/loading";
|
|
import { requestPost } from "@/js/dai/request";
|
|
import cptTb from "@/views/modules/visual/cpts/tb";
|
|
import lineChart from "@/views/modules/visual/cpts/line-chart";
|
|
import analyse from "@/views/modules/visual/cpts/analyse";
|
|
import foldText from "@/views/components/foldText";
|
|
import dateFormat from "dai-js/tools/dateFormat";
|
|
|
|
function iniData () {
|
|
return {
|
|
projectIdCopy: this.projectId,
|
|
groupList: [
|
|
{ label: "研判分析" },
|
|
{ label: "项目来源" },
|
|
],
|
|
groupIndex: 0,
|
|
startGroupIndex: 0,
|
|
|
|
projectProcess: [],
|
|
|
|
projectInfo: {
|
|
backGround: "",
|
|
departmentList: [
|
|
// { departmentName: "南宁社区-南宁第二网格", staffList: ["周相成"] },
|
|
],
|
|
departmentNameList: [],
|
|
internalRemark: "",
|
|
isSend: false,
|
|
locateAddress: "",
|
|
locateDimension: "",
|
|
locateLongitude: "",
|
|
origin: "",
|
|
originId: "",
|
|
platformIds: [],
|
|
processable: false,
|
|
projectId: "",
|
|
projectStatus: "pending",
|
|
projectTitle: "",
|
|
publicReply: "",
|
|
returnable: false,
|
|
},
|
|
|
|
issueInfo: {
|
|
attitude: "",
|
|
belongsGridName: "",
|
|
issueIdea: "",
|
|
issueInitiator: "",
|
|
issueStatus: "",
|
|
issueSuggestion: "",
|
|
issueTitle: "",
|
|
joinVote: true,
|
|
projectId: "",
|
|
projectStatus: false,
|
|
publishIdeaFlag: false,
|
|
},
|
|
|
|
issueTrend: {},
|
|
issueChartData: [],
|
|
|
|
eventInfo: {
|
|
eventTime: "",
|
|
eventContent: "",
|
|
eventAddress: "",
|
|
gridName: "",
|
|
isClosed: true,
|
|
isResolve: true,
|
|
isRollback: true,
|
|
eventImgs: [],
|
|
eventPerson: [],
|
|
eventOrg: [],
|
|
eventPeopleName: "",
|
|
projectInfo: {
|
|
projectId: "",
|
|
operationName: "",
|
|
operationTime: "",
|
|
projectDeclare: "",
|
|
},
|
|
},
|
|
|
|
projectCate: [],
|
|
projectTag: [],
|
|
|
|
yanPan: {
|
|
loading: false,
|
|
|
|
icResiUserId: "",
|
|
houseId: "",
|
|
icUserName: "",
|
|
|
|
homeUserList: [
|
|
// {
|
|
// homeId: '',
|
|
// icUserId: '',
|
|
// icUserName: '',
|
|
// }
|
|
],
|
|
singleList: [],//楼院小组
|
|
projectData: [
|
|
// {
|
|
// firstCategoryCode: '',
|
|
// firstCategoryName: '',
|
|
// projectList: [],
|
|
// }
|
|
],
|
|
hasEvent: false,
|
|
moreList: [],//
|
|
|
|
},
|
|
};
|
|
}
|
|
|
|
export default {
|
|
name: "demandInfo",
|
|
props: {
|
|
projectId: {
|
|
type: String,
|
|
default: "",
|
|
},
|
|
userId: {
|
|
type: String,
|
|
default: "",
|
|
},
|
|
categoryCodes: {
|
|
type: Array,
|
|
default: [],
|
|
},
|
|
|
|
},
|
|
|
|
components: {
|
|
cptCard,
|
|
cptTb,
|
|
analyse,
|
|
screenLoading,
|
|
lineChart,
|
|
foldText,
|
|
},
|
|
|
|
data: iniData,
|
|
|
|
computed: {},
|
|
|
|
watch: {
|
|
projectId () {
|
|
let data = iniData();
|
|
Object.keys(data).forEach((k) => {
|
|
this[k] = data[k];
|
|
});
|
|
this.getApiData();
|
|
},
|
|
// projectIdCopy () {
|
|
|
|
|
|
// },
|
|
},
|
|
|
|
mounted () {
|
|
console.log(this.projectIdCopy)
|
|
this.getApiData();
|
|
},
|
|
|
|
methods: {
|
|
watchImg (src) {
|
|
window.open(src);
|
|
},
|
|
|
|
addStartGroupIndex () {
|
|
const { startGroupIndex, groupList } = this;
|
|
if (startGroupIndex < groupList.length - 9) {
|
|
this.startGroupIndex = startGroupIndex + 1;
|
|
} else {
|
|
this.startGroupIndex = groupList.length - 9;
|
|
}
|
|
},
|
|
subStartGroupIndex () {
|
|
const { startGroupIndex, groupList } = this;
|
|
if (startGroupIndex > 0) {
|
|
this.startGroupIndex = startGroupIndex - 1;
|
|
} else {
|
|
this.startGroupIndex = 0;
|
|
}
|
|
},
|
|
handleClose () {
|
|
this.$emit("close");
|
|
},
|
|
|
|
async getApiData () {
|
|
|
|
await this.getProjectInfo()
|
|
this.getProjectCate();
|
|
this.getProjectProcess();
|
|
if (this.projectInfo.origin === 'issue') {
|
|
this.getIssueInfo();
|
|
this.getIssueTrend();
|
|
} else if (this.projectInfo.origin === 'resi_event') {
|
|
this.getEventInfo()
|
|
}
|
|
if (this.projectInfo.origin !== 'agency') {
|
|
await this.getYanPan();
|
|
|
|
}
|
|
},
|
|
|
|
//加载组织数据
|
|
async getProjectInfo () {
|
|
|
|
const url = "/gov/project/trace/projectdetail";
|
|
|
|
const { data, code, msg } = await requestPost(url, {
|
|
projectId: this.projectIdCopy,
|
|
});
|
|
|
|
if (code === 0) {
|
|
this.projectInfo = data;
|
|
|
|
|
|
} else {
|
|
this.$message.error(msg);
|
|
}
|
|
},
|
|
|
|
//加载组织数据
|
|
async getIssueInfo () {
|
|
|
|
const url = "/resi/hall/issue/detail";
|
|
|
|
const { data, code, msg } = await requestPost(url, {
|
|
issueId: this.projectInfo.originId,
|
|
});
|
|
|
|
if (code === 0) {
|
|
this.issueInfo = data;
|
|
} else {
|
|
this.$message.error(msg);
|
|
}
|
|
},
|
|
|
|
//加载组织数据
|
|
async getIssueTrend () {
|
|
|
|
const url = "/resi/hall/issue/votingtrend";
|
|
|
|
const { data, code, msg } = await requestPost(url, {
|
|
issueId: this.projectInfo.originId,
|
|
});
|
|
|
|
if (code === 0) {
|
|
this.issueTrend = data;
|
|
let chartData = [];
|
|
data.polyLine.forEach((item) => {
|
|
let date = dateFormat(new Date(item.voteDate * 1000), "yyyy-MM-dd");
|
|
console.log("date:" + date);
|
|
chartData.push(
|
|
{
|
|
date,
|
|
value: item.supportIncrement,
|
|
type: "支持",
|
|
},
|
|
{
|
|
date,
|
|
value: item.oppositionIncrement,
|
|
type: "反对",
|
|
}
|
|
);
|
|
});
|
|
this.issueChartData = chartData;
|
|
} else {
|
|
this.$message.error(msg);
|
|
}
|
|
},
|
|
|
|
//加载组织数据
|
|
async getEventInfo () {
|
|
const url = "/gov/project/resievent/eventdetail-icdata";
|
|
|
|
const { data, code, msg } = await requestPost(url, {
|
|
resiEventId: this.projectInfo.originId,
|
|
});
|
|
|
|
if (code === 0) {
|
|
this.info = data;
|
|
} else {
|
|
this.$message.error(msg);
|
|
}
|
|
},
|
|
|
|
//加载组织数据
|
|
async getProjectProcess () {
|
|
|
|
const url = "/gov/project/trace/processlist-v2";
|
|
|
|
const { data, code, msg } = await requestPost(url, {
|
|
projectId: this.projectIdCopy,
|
|
});
|
|
|
|
if (code === 0) {
|
|
this.projectProcess = data.map((item) => {
|
|
item.processTime = dateFormat(
|
|
new Date(item.processTime * 1000),
|
|
"yyyy-MM-dd hh:mm"
|
|
);
|
|
return item;
|
|
});
|
|
} else {
|
|
this.$message.error(msg);
|
|
}
|
|
},
|
|
|
|
async getProjectCate () {
|
|
|
|
const url = "/gov/project/projectcategory/categorytaglist";
|
|
|
|
const { data, code, msg } = await requestPost(url, {
|
|
projectId: this.projectIdCopy,
|
|
});
|
|
|
|
if (code === 0) {
|
|
this.projectCate = data.categoryList;
|
|
this.projectTag = data.tagList;
|
|
} else {
|
|
this.$message.error(msg);
|
|
}
|
|
},
|
|
|
|
//加载组织数据
|
|
async getYanPan () {
|
|
const url = "/data/aggregator/project/projectanalysis";
|
|
|
|
const { data, code, msg } = await requestPost(url, {
|
|
categoryCodeList: this.categoryCodes,
|
|
userId: this.userId,
|
|
|
|
});
|
|
|
|
if (code === 0) {
|
|
data.icResiUserId = data.icUserId
|
|
data.homeUserList.forEach(item => {
|
|
item.icResiUserId = item.icUserId
|
|
});
|
|
|
|
let array1 = []
|
|
let array2 = []
|
|
// debugger
|
|
//楼院小组、居民上报都存在是,研判分析显示两个分支
|
|
if (data.groupProjectList && data.groupProjectList.length > 0 && data.eventProjectList && data.eventProjectList.length > 0) {
|
|
this.yanPan.hasEvent = true
|
|
array1 = [...data.groupProjectList]
|
|
array2 = [...data.eventProjectList]
|
|
} else {
|
|
this.yanPan.hasEvent = false
|
|
if (data.groupProjectList && data.groupProjectList.length > 0) {
|
|
array1 = [...data.groupProjectList]
|
|
} else if (data.eventProjectList && data.eventProjectList.length > 0) {
|
|
array1 = [...data.eventProjectList]
|
|
} else {
|
|
array1 = []
|
|
}
|
|
|
|
}
|
|
|
|
if (array1.length > 0) {
|
|
data.singleList = array1.map((item) => {
|
|
return {
|
|
categoryCode: item.categoryCode,
|
|
categoryName: item.categoryName,
|
|
showItem: true,
|
|
projectList: item.projectList.map((subItem) => {
|
|
return {
|
|
title: subItem.title,
|
|
status: subItem.status,
|
|
statusName:
|
|
subItem.status == "pending" ? "待处理" : "结案",
|
|
projectId: subItem.projectId,
|
|
};
|
|
}),
|
|
};
|
|
});
|
|
}
|
|
if (array2.length > 0) {
|
|
data.moreList = array2.map((item) => {
|
|
return {
|
|
categoryCode: item.categoryCode,
|
|
categoryName: item.categoryName,
|
|
showItem: true,
|
|
projectList: item.projectList.map((subItem) => {
|
|
return {
|
|
title: subItem.title,
|
|
status: subItem.status,
|
|
statusName:
|
|
subItem.status == "pending" ? "待处理" : "结案",
|
|
projectId: subItem.projectId,
|
|
};
|
|
}),
|
|
};
|
|
});
|
|
}
|
|
|
|
|
|
|
|
this.yanPan = { ...this.yanPan, ...data };
|
|
console.log(this.yanPan)
|
|
this.yanPan.loading = true;
|
|
} else {
|
|
this.$message.error(msg);
|
|
}
|
|
},
|
|
|
|
toUserInfo (item) {
|
|
this.$router.push({
|
|
path: `/main-shuju/visual-basicinfo-people/${item.icResiUserId}`,
|
|
});
|
|
},
|
|
|
|
toProjectInfo (item) {
|
|
console.log(item);
|
|
this.projectIdCopy = item.projectId;
|
|
// let data = iniData();
|
|
// Object.keys(data).forEach((k) => {
|
|
// this[k] = data[k];
|
|
// });
|
|
this.getApiData();
|
|
},
|
|
},
|
|
};
|
|
</script>
|
|
|
|
<style
|
|
lang="scss"
|
|
src="@/assets/scss/modules/visual/incident-info.scss"
|
|
scoped
|
|
></style>
|
|
|