Browse Source

合并冲突

V1.0
jiangyy 4 years ago
parent
commit
0dc78d8a59
  1. 6
      public/index.html
  2. BIN
      src/assets/img/shuju/sight.png
  3. 35
      src/assets/scss/modules/visual/heart.scss
  4. 373
      src/assets/scss/modules/visual/incident-info.scss
  5. 8
      src/router/index.js
  6. 668
      src/views/modules/visual/basicinfo/cpts/incident-info.vue
  7. 804
      src/views/modules/visual/basicinfo/cpts/topic-info.vue
  8. 43
      src/views/modules/visual/basicinfo/people.vue
  9. 111
      src/views/modules/visual/communityParty/community.vue
  10. 208
      src/views/modules/visual/communityParty/dialogInfo.vue
  11. 352
      src/views/modules/visual/communityParty/party.vue
  12. 340
      src/views/modules/visual/cpts/analyse.vue
  13. 214
      src/views/modules/visual/cpts/line-chart.vue
  14. 15
      src/views/modules/visual/cpts/tb.vue
  15. 283
      src/views/modules/visual/heart/index.vue

6
public/index.html

@ -6,6 +6,8 @@
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<link rel="shortcut icon" href="<%= BASE_URL %>favicon.ico" />
<script charset="utf-8" src="https://map.qq.com/api/gljs?v=1.exp&libraries=service&key=LWBBZ-TIGC3-VFP3L-YNMWH-FJB7T-JFBLO"></script>
<!-- f2图表 -->
<script src="https://gw.alipayobjects.com/os/antv/assets/f2/3.4.2/f2.min.js"></script>
<!-- 站点配置 -->
<script>
@ -36,8 +38,8 @@
<!-- 开发环境 -->
<% if (process.env.VUE_APP_NODE_ENV==='dev' ) { %>
<script>
window.SITE_CONFIG['apiURL'] = 'http://192.168.1.140/api'
// window.SITE_CONFIG['apiURL'] = 'https://epmet-test.elinkservice.cn/api'
window.SITE_CONFIG['apiURL'] = 'http://192.168.1.140/api'
// window.SITE_CONFIG['apiURL'] = 'https://epmet-test.elinkservice.cn/api'
// window.SITE_CONFIG['apiURL'] = 'http://118.190.150.119:41080/api'
// window.SITE_CONFIG['apiURL'] = 'https://epmet-dev.elinkservice.cn/api'
</script>

BIN
src/assets/img/shuju/sight.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

35
src/assets/scss/modules/visual/heart.scss

@ -0,0 +1,35 @@
@import "../../c/config";
@import "../../c/function";
@import "./c/common";
.g-cpt {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
margin-top: 5px;
}
.m-tb {
width: 33%;
.title {
padding: 10px;
font-size: 22px;
font-family: PingFang SC;
font-weight: 800;
color: #ffffff;
display: flex;
align-items: center;
img {
display: block;
margin-right: 5px;
}
span {
display: block;
}
}
.tb {
height: calc(100vh - 180px);
overflow-y: auto;
@include scrollBar;
}
}

373
src/assets/scss/modules/visual/incident-info.scss

@ -0,0 +1,373 @@
@import "../../c/config";
@import "../../c/function";
@import "./c/common";
.m-pop {
@include shield;
background-color: rgba(#000, 0.9);
overflow-y: auto;
.wrap {
position: relative;
margin: 120px auto;
width: 1020px;
.title {
padding: 10px;
font-size: 22px;
font-family: PingFang SC;
font-weight: 800;
color: #ffffff;
display: flex;
align-items: center;
img {
display: block;
margin-right: 5px;
}
span {
display: block;
}
}
.btn-close {
position: absolute;
top: -15px;
right: -15px;
cursor: pointer;
}
.line {
margin: 20px auto;
width: 900px;
height: 1px;
border: 1px dashed #1257c9;
}
.tabs {
margin-top: 30px;
display: flex;
align-items: center;
padding-left: 20px;
padding-left: 58px;
.tab-btn {
width: 30px;
text-align: center;
cursor: pointer;
}
.tab {
margin: 0 5px;
min-width: 76px;
padding: 0 5px;
height: 30px;
background: rgba(255, 255, 255, 0);
border: 1px solid #1257c9;
box-shadow: 0 0 10px 0 inset #1257c9;
border-radius: 2px;
text-align: center;
font-size: 14px;
font-family: PingFang SC;
font-weight: 400;
color: #ffffff;
line-height: 30px;
cursor: pointer;
transition: all ease 0.5s;
&.z-on {
background: linear-gradient(90deg, #1a5afd, #009cff);
box-shadow: none;
}
}
}
}
}
.m-info {
padding-left: 62px;
font-size: 16px;
font-family: PingFang SC;
font-weight: 400;
color: #ffffff;
line-height: 24px;
width: 500px;
.info-title {
margin-top: 30px;
font-size: 20px;
font-family: PingFang SC;
font-weight: bold;
color: #ffffff;
line-height: 30px;
}
.info-content {
margin: 20px 0;
}
.info-pics {
display: flex;
margin: 20px 0;
img {
display: block;
width: 32%;
height: 90px;
margin-right: 9px;
object-fit: cover;
}
}
.info-prop {
position: relative;
margin: 10px 0;
display: flex;
padding-left: 15px;
> span,
> div {
display: block;
max-width: 300px;
}
&::before {
content: "";
display: block;
position: absolute;
top: 9px;
left: 0;
width: 7px;
height: 7px;
background: #0c81fe;
border-radius: 3px;
margin-right: 10px;
}
}
}
.m-case {
@include scrollBar;
height: 600px;
padding: 20px 0 20px 0;
overflow-y: auto;
}
.m-row {
display: flex;
justify-content: space-between;
}
.m-yanpan {
padding-left: 62px;
padding-right: 0;
min-height: 300px;
}
.m-hint {
position: relative;
height: 300px;
// 暂无数据
img {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
margin: auto;
}
}
.m-line {
.stat {
margin: 20px 0 10px;
display: flex;
.stat-item {
width: 33%;
text-align: center;
div {
font-size: 17px;
font-family: Source Han Serif SC;
font-weight: 500;
color: rgba(#fff, 0.5);
line-height: 24px;
&.z-weak {
font-size: 12px;
font-family: Source Han Serif SC;
font-weight: 500;
color: rgba(#fff, 0.5);
line-height: 24px;
}
}
}
}
}
.m-tb {
padding-left: 62px;
padding-right: 40px;
}
.m-pagination {
box-sizing: border-box;
margin-top: 20px;
width: 100%;
height: 40px;
display: flex;
justify-content: flex-end;
/deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
background: #0266d1;
color: #000d3f;
}
/deep/ .el-pagination .el-pager li {
background: #002e74;
}
/deep/ .el-pagination .btn-prev {
background: #002e74;
}
/deep/ .el-pagination .btn-next {
background: #002e74;
}
}
.m-process {
width: 400px;
.process-title {
margin-bottom: 25px;
margin-left: -5px;
font-size: 16px;
font-family: PingFang SC;
font-weight: bold;
color: #ffffff;
line-height: 18px;
}
.list {
position: relative;
box-sizing: border-box;
margin-top: 30px/2;
margin-left: 50px/2;
padding: 0 0 0 30px/2;
width: 680px/2;
border-left: 3px solid #0c81fe;
padding-right: 10px;
&::before {
content: "";
position: absolute;
z-index: 1;
display: block;
top: -2px/2;
left: -2px/2;
width: 5px/2;
height: 20px/2;
background-color: #ffffff;
}
.item {
position: relative;
z-index: 2;
margin-bottom: 8px;
padding-bottom: 8px;
font-size: 16px;
font-family: PingFang SC;
font-weight: 400;
color: #fefefe;
line-height: 24px;
padding-left: 20px;
padding-top: 1px;
&::before {
content: "";
display: block;
position: absolute;
top: -5px;
left: -11px;
width: 18px;
height: 18px;
background: #0c81fe;
border: 4px solid lighten(#0c81fe, 15);
border-radius: 100%;
}
&.z-on {
&::before {
background: #e08400;
border-color: lighten(#e08400, 15);
}
}
&:last-child {
margin-bottom: 0;
padding-bottom: 0;
border-bottom: none;
}
.item-row {
margin-top: -10px;
margin-bottom: 10px;
display: flex;
}
.name {
position: relative;
padding: 0 10px;
font-size: 12px;
font-family: PingFang SC;
font-weight: 500;
color: #fefefe;
line-height: 22px;
height: 22px;
border-radius: 10px 0 10px 0;
background-color: #0c81fe;
// background-color: #e08400;
}
.date {
margin-left: 10px;
font-size: 12px;
font-family: PingFang SC;
font-weight: 500;
color: #7ca1d2;
line-height: 25px;
}
.detail {
@include cs;
font-size: 16px;
line-height: 20px;
margin-bottom: 5px;
display: flex;
.detail-field {
width: 22%;
text-align: justify;
text-align-last: justify;
}
.detail-value {
width: 78%;
.detail-link {
display: inline;
}
}
}
.attachement-list {
padding-left: 80px;
a {
display: block;
cursor: pointer;
color: #4df0ff;
font-size: 14px;
i {
color: #fff;
}
}
}
}
}
}

8
src/router/index.js

@ -316,6 +316,14 @@ router.beforeEach((to, from, next) => {
},
],
},
{
icon: "icon-setting",
id: "2221321fefefaewfa123",
name: "初心互助",
url: "visual/heart/index",
children: [
],
},
];
fnAddDynamicMenuRoutes2(window.SITE_CONFIG["menuShujuList"]);
// next({ ...to, replace: true })

668
src/views/modules/visual/basicinfo/cpts/incident-info.vue

@ -4,62 +4,35 @@
<cpt-card>
<div class="title">
<img src="@/assets/img/shuju/title-tip.png" />
<span>更多信息</span>
<span>事件详情</span>
</div>
<div class="btn-close" @click="handleClose">
<img src="@/assets/img/shuju/people/close.png" />
</div>
<div
:key="'fieldSubList' + index"
v-for="(fieldSubList, index) in fieldList"
>
<div class="list">
<div class="item" v-if="index == 0">
<span class="item-field">所属网格</span>
<span>{{ gridName }}</span>
</div>
<div class="item" v-if="index == 0">
<span class="item-field">所属小区</span>
<span>{{ xiaoquName }}</span>
</div>
<div class="item" v-if="index == 0">
<span class="item-field">所属楼宇</span>
<span>{{ louName }}-{{ danyuanName }}</span>
</div>
<div class="item" v-if="index == 0">
<span class="item-field">所属家庭</span>
<span>{{ homeName }}</span>
</div>
<div class="item" :key="field.itemId" v-for="field in fieldSubList">
<span class="item-field">{{ field.label }}</span>
<span
v-if="
field.itemType == 'select' ||
field.itemType == 'radio' ||
field.itemType == 'checkbox' ||
field.itemType == 'cascader'
"
>{{
info[field.columnName] == null
? "--"
: getOptionLabel(
field.options,
info[field.columnName],
field.itemType
)
}}</span
>
<span v-else>{{
info[field.columnName] == null ? "--" : info[field.columnName]
}}</span>
</div>
<div 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" />
</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 class="line"></div>
</div>
<div class="tabs">
@ -89,81 +62,136 @@
</div>
</div>
<div
:key="'group' + index"
v-show="groupIndex % groupList.length == index"
v-for="(group, index) in groupList"
>
<div v-if="group.tableName == 'ic_resi_demand' && Array.isArray(allInfo.ic_resi_demand) && allInfo.ic_resi_demand.length>0">
<div
class="list"
:key="'ic_resi_demand' + infoIndex"
v-for="(infoItem, infoIndex) in allInfo.ic_resi_demand"
>
<div
class="item"
:key="field.itemId"
v-for="field in group.itemList"
>
<span class="item-field">{{ field.label }}</span>
<span
v-if="
field.itemType == 'select' ||
field.itemType == 'radio' ||
field.itemType == 'checkbox' ||
field.itemType == 'cascader'
"
>{{
infoItem[field.columnName] == null
? "--"
: getOptionLabel(
field.options,
infoItem[field.columnName],
field.itemType
)
}}</span
>
<span v-else>{{
infoItem[field.columnName] == null
? "--"
: infoItem[field.columnName]
}}</span>
</div>
<div class="m-case">
<div class="m-yanpan" v-if="groupIndex == 0">
<div v-if="info.projectId">
<analyse
v-if="yanPan.loading"
singleTitle="智能随手拍"
:userList="yanPan.houseUserList"
:userName="yanPan.icUserName"
:singleList="yanPan.categoryList"
@user="toUserInfo"
/>
<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 class="m-tb" v-if="groupIndex == 1">
<cpt-tb
:col-list="comment.colList"
:loading="comment.loading"
:header="comment.header"
:list="comment.list"
></cpt-tb>
</div>
<div class="list" v-else>
<div
class="item"
:key="field.itemId"
v-for="field in group.itemList"
>
<span class="item-field">{{ field.label }}</span>
<span
v-if="
field.itemType == 'select' ||
field.itemType == 'radio' ||
field.itemType == 'checkbox' ||
field.itemType == 'cascader'
"
>{{
!allInfo[group.tableName] ||
allInfo[group.tableName][0][field.columnName] == null
? "--"
: getOptionLabel(
field.options,
allInfo[group.tableName][0][field.columnName],
field.itemType
)
}}</span
>
<span v-else>{{
!allInfo[group.tableName] ||
allInfo[group.tableName][0][field.columnName] == null
? "--"
: allInfo[group.tableName][0][field.columnName]
}}</span>
<div v-if="groupIndex == 2">
<div class="m-row" v-if="info.projectId">
<div class="m-info">
<div class="info-prop">
<span>项目标题</span>
<span>{{ projectInfo.projectTitle }}</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>
<div>
<div :key="item.name" v-for="item in projectCate">
{{ item.name }}
</div>
</div>
</div>
<div class="info-prop" v-if="projectTag.length>0">
<span>标签</span>
<div>
<div :key="item.name" v-for="item in projectTag">
{{ item.name }}
</div>
</div>
</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-else class="m-hint">
<img
src="@/assets/img/modules/visual/noData.png"
class="no-data-img"
/>
</div>
</div>
</div>
@ -174,16 +202,24 @@
<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 analyse from "@/views/modules/visual/cpts/analyse";
import dateFormat from "dai-js/tools/dateFormat";
export default {
name: "demandInfo",
props: {
userId: {
resiEventId: {
type: String,
default: "",
},
gridName: {
epmetUserIdList: {
type: Array,
default: [],
},
icResiUserId: {
type: String,
default: "",
},
@ -191,94 +227,117 @@ export default {
components: {
cptCard,
cptTb,
analyse,
screenLoading,
},
data() {
return {
fieldList: [],
groupList: [],
groupList: [
{ label: "研判分析" },
{ label: "查看回复" },
{ label: "查看项目" },
],
groupIndex: 0,
startGroupIndex: 0,
info: {},
allInfo: {},
xiaoquList: [],
louList: [],
danyuanList: [],
homeList: [],
info: {
eventTime: "",
eventContent: "",
eventAddress: "",
gridName: "",
isClosed: true,
isResolve: true,
isRollback: true,
eventImgs: [],
eventPerson: [],
eventOrg: [],
eventPeopleName: "",
projectInfo: {
projectId: "",
operationName: "",
operationTime: "",
projectDeclare: "",
},
},
comment: {
loading: true,
colList: [
{
align: "center",
width: "20%",
},
{
align: "center",
width: "30%",
},
{
align: "left",
width: "50%",
},
],
header: ["回复者", "回复时间", "回复内容"],
list: [],
},
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,
},
projectCate: [],
projectTag: [],
yanPan: {
loading: false,
icResiUserId: "",
houseId: "",
icUserName: "",
epmetUserIdList: [],
houseUserList: [
// {
// icResiUserId: '',
// icUserName: '',
// }
],
categoryList: [],
projectData: [
// {
// firstCategoryCode: '',
// firstCategoryName: '',
// projectList: [],
// }
],
},
};
},
computed: {
xiaoquName() {
const {
xiaoquList,
info: { VILLAGE_ID },
} = this;
if (Array.isArray(xiaoquList) && xiaoquList.length > 0 && VILLAGE_ID) {
let item = xiaoquList.find((item) => item.value == VILLAGE_ID);
if (item) {
return item.label;
}
}
return "";
},
louName() {
const {
louList,
info: { BUILD_ID },
} = this;
if (Array.isArray(louList) && louList.length > 0 && BUILD_ID) {
let item = louList.find((item) => item.value == BUILD_ID);
if (item) {
return item.label;
}
}
return "";
},
danyuanName() {
const {
danyuanList,
info: { UNIT_ID },
} = this;
if (Array.isArray(danyuanList) && danyuanList.length > 0 && UNIT_ID) {
let item = danyuanList.find((item) => item.value == UNIT_ID);
if (item) {
return item.label;
}
}
return "";
},
danyuanName() {
const {
danyuanList,
info: { UNIT_ID },
} = this;
if (Array.isArray(danyuanList) && danyuanList.length > 0 && UNIT_ID) {
let item = danyuanList.find((item) => item.value == UNIT_ID);
if (item) {
return item.label;
}
}
return "";
},
homeName() {
const {
homeList,
info: { HOME_ID },
} = this;
if (Array.isArray(homeList) && homeList.length > 0 && HOME_ID) {
let item = homeList.find((item) => item.value == HOME_ID);
if (item) {
return item.label;
}
}
return "";
},
},
computed: {},
watch: {
userId() {
resiEventId() {
this.getApiData();
},
},
@ -309,121 +368,41 @@ export default {
},
async getApiData() {
await this.getField();
this.getComment();
await this.getInfo();
this.getXiaoquList();
this.getLouList();
this.getDanyuanList();
this.getHomeList();
},
getOptionLabel(options, value, type = "") {
if (Array.isArray(options)) {
let valueArr = value.split(",");
if (type == "cascader") {
if (valueArr.length > 0) {
let level1 = options.find((item) => item.value == valueArr[0]);
if (level1) {
if (valueArr.length > 1 && level1.children) {
let level2 = level1.children.find(
(item) => item.value == valueArr[1]
);
if (level2) {
return level1.label + "-" + level2.label;
}
}
return level1.label;
}
}
} else {
return valueArr
.map((val) => {
let item = options.find((item) => item.value == val);
if (item && item.label) {
return item.label;
}
return "--";
})
.join("、");
}
}
return "--";
this.getProjectProcess();
this.getProjectInfo();
this.getProjectCate();
this.getYanPan();
},
//
async getField() {
const url = "/oper/customize/icform/getcustomerform";
async getInfo() {
const url = "/gov/project/resievent/eventdetail-icdata";
const { data, code, msg } = await requestPost(url, {
dynamic: true,
formCode: "resi_base_info",
resiEventId: this.resiEventId,
});
if (code === 0) {
this.groupList = data.groupList;
this.fieldList = (function (arr) {
let col = [];
let ele = [];
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
if (item.itemType == "divider" || i == arr.length - 1) {
col.push([...ele]);
ele = [];
} else {
ele.push(item);
}
}
return col;
})(data.itemList);
this.fieldList.forEach((subList, index) => {
subList.forEach(async (item, subIndex) => {
if (item.optionSourceType == "remote" && item.optionSourceValue) {
this.fieldList[index][subIndex].options = await this.getOptions(
item.optionSourceValue
);
}
});
});
this.info = data;
} else {
this.$message.error(msg);
}
},
//
async getInfo() {
const url = "/epmetuser/icresiuser/detail";
async getComment() {
const url = "/gov/project/resieventreply/list";
const { data, code, msg } = await requestPost(url, {
icResiUserId: this.userId,
formCode: "resi_base_info",
resiEventId: this.resiEventId,
});
this.comment.loading = false;
if (code === 0) {
this.info = data.ic_resi_user[0];
this.allInfo = data;
this.fieldList.forEach((subList, index) => {
subList.forEach((item, subIndex) => {
if (
item.itemType == "radio" &&
item.childGroup &&
this.allInfo[item.tableName] &&
this.allInfo[item.tableName][0][item.columnName] == "1"
) {
this.groupList = [...this.groupList, item.childGroup];
}
});
});
console.log("1111111111111111111111111", this.groupList);
this.groupList.forEach((subList, index) => {
subList.itemList.forEach(async (item, subIndex) => {
if (item.optionSourceType == "remote" && item.optionSourceValue) {
this.groupList[index].itemList[subIndex].options =
await this.getOptions(item.optionSourceValue);
}
});
this.comment.list = data.map((item) => {
return [item.replyName, item.replyTime, item.replyContent];
});
} else {
this.$message.error(msg);
@ -431,73 +410,114 @@ export default {
},
//
async getOptions(url) {
if (!url) return [];
async getProjectProcess() {
const {
info: { projectInfo },
} = this;
if (!projectInfo || !projectInfo.projectId) return;
const url = "/gov/project/trace/processlist-v2";
const { data, code, msg } = await requestPost(url, {});
const { data, code, msg } = await requestPost(url, {
projectId: projectInfo.projectId,
});
if (code === 0) {
return data;
this.projectProcess = data.map((item) => {
item.processTime = dateFormat(
new Date(item.processTime * 1000),
"yyyy-MM-dd hh:mm"
);
return item;
});
} else {
return [];
this.$message.error(msg);
}
},
async getXiaoquList() {
const url = "/gov/org/icneighborhood/neighborhoodoption";
//
async getProjectInfo() {
const {
info: { projectInfo },
} = this;
if (!projectInfo || !projectInfo.projectId) return;
const url = "/gov/project/trace/projectdetail";
const { data, code, msg } = await requestPost(url, {
agencyId: this.info.AGENCY_ID,
gridId: this.info.GRID_ID,
projectId: projectInfo.projectId,
});
if (code === 0) {
this.xiaoquList = data;
this.projectInfo = data;
} else {
this.$message.error(msg);
}
},
async getLouList() {
const url = "/gov/org/icbuilding/buildingoption";
async getProjectCate() {
const {
info: { projectInfo },
} = this;
if (!projectInfo || !projectInfo.projectId) return;
const url = "/gov/project/projectcategory/categorytaglist";
const { data, code, msg } = await requestPost(url, {
neighborHoodId: this.info.VILLAGE_ID,
projectId: projectInfo.projectId,
});
if (code === 0) {
this.louList = data;
this.projectCate = data.categoryList;
this.projectTag = data.tagList;
} else {
this.$message.error(msg);
}
},
async getDanyuanList() {
const url = "/gov/org/icbuildingunit/unitoption";
//
async getYanPan() {
const url = "/gov/project/resievent/research-analysis";
const { data, code, msg } = await requestPost(url, {
buildingId: this.info.BUILD_ID,
resiEventId: this.resiEventId,
epmetUserIdList: this.epmetUserIdList,
icResiUserId: this.icResiUserId,
projectId: this.info.projectId,
});
if (code === 0) {
this.danyuanList = data;
data.categoryList = data.projectData.map((item) => {
return {
categoryCode: item.firstCategoryCode,
categoryName: item.firstCategoryName,
showItem: true,
projectList: item.projectList.map((subItem) => {
return {
title: subItem.projectTitle,
status: subItem.projectStatus,
statusName:
subItem.projectStatus == "pending" ? "待处理" : "结案",
projectId: subItem.projectId,
};
}),
};
});
this.yanPan = { ...this.yanPan, ...data };
this.yanPan.loading = true;
} else {
this.$message.error(msg);
}
},
async getHomeList() {
const url = "/gov/org/ichouse/houseoption";
const { data, code, msg } = await requestPost(url, {
unitId: this.info.UNIT_ID,
toUserInfo(item) {
this.$router.push({
path: `/main-shuju/visual-basicinfo-people/${item.icResiUserId}`,
});
if (code === 0) {
this.homeList = data;
} else {
this.$message.error(msg);
}
},
},
};
</script>
<style lang="scss" src="@/assets/scss/modules/visual/people.scss" scoped></style>
<style
lang="scss"
src="@/assets/scss/modules/visual/incident-info.scss"
scoped
></style>

804
src/views/modules/visual/basicinfo/cpts/topic-info.vue

@ -4,62 +4,31 @@
<cpt-card>
<div class="title">
<img src="@/assets/img/shuju/title-tip.png" />
<span>更多信息</span>
<span>话题详情</span>
</div>
<div class="btn-close" @click="handleClose">
<img src="@/assets/img/shuju/people/close.png" />
</div>
<div
:key="'fieldSubList' + index"
v-for="(fieldSubList, index) in fieldList"
>
<div class="list">
<div class="item" v-if="index == 0">
<span class="item-field">所属网格</span>
<span>{{ gridName }}</span>
</div>
<div class="item" v-if="index == 0">
<span class="item-field">所属小区</span>
<span>{{ xiaoquName }}</span>
</div>
<div class="item" v-if="index == 0">
<span class="item-field">所属楼宇</span>
<span>{{ louName }}-{{ danyuanName }}</span>
</div>
<div class="item" v-if="index == 0">
<span class="item-field">所属家庭</span>
<span>{{ homeName }}</span>
</div>
<div class="item" :key="field.itemId" v-for="field in fieldSubList">
<span class="item-field">{{ field.label }}</span>
<span
v-if="
field.itemType == 'select' ||
field.itemType == 'radio' ||
field.itemType == 'checkbox' ||
field.itemType == 'cascader'
"
>{{
info[field.columnName] == null
? "--"
: getOptionLabel(
field.options,
info[field.columnName],
field.itemType
)
}}</span
>
<span v-else>{{
info[field.columnName] == null ? "--" : info[field.columnName]
}}</span>
</div>
<div class="m-info">
<div class="info-title">话题内容</div>
<div class="info-content">{{ info.topicContent }}</div>
<div class="info-pics">
<img :src="src" :key="src" v-for="src in info.topicImgs" />
</div>
<div class="info-prop">
<span>发布时间</span>
<span>{{ info.releaseTime }}</span>
</div>
<div class="info-prop">
<span>话题地址</span>
<span>{{ info.releaseAddress }}</span>
</div>
<div class="info-prop">
<span>所属网格</span>
<span>{{ info.gridName }}</span>
</div>
<div class="line"></div>
</div>
<div class="tabs">
@ -89,81 +58,197 @@
</div>
</div>
<div
:key="'group' + index"
v-show="groupIndex % groupList.length == index"
v-for="(group, index) in groupList"
>
<div v-if="group.tableName == 'ic_resi_demand' && Array.isArray(allInfo.ic_resi_demand) && allInfo.ic_resi_demand.length>0">
<div
class="list"
:key="'ic_resi_demand' + infoIndex"
v-for="(infoItem, infoIndex) in allInfo.ic_resi_demand"
>
<div
class="item"
:key="field.itemId"
v-for="field in group.itemList"
>
<span class="item-field">{{ field.label }}</span>
<span
v-if="
field.itemType == 'select' ||
field.itemType == 'radio' ||
field.itemType == 'checkbox' ||
field.itemType == 'cascader'
"
>{{
infoItem[field.columnName] == null
? "--"
: getOptionLabel(
field.options,
infoItem[field.columnName],
field.itemType
)
}}</span
>
<span v-else>{{
infoItem[field.columnName] == null
? "--"
: infoItem[field.columnName]
}}</span>
<div class="m-case">
<div class="m-yanpan" v-if="groupIndex == 0">
<div v-if="issueInfo.projectId">
<analyse
v-if="yanPan.loading"
singleTitle="楼院小组"
:userList="yanPan.houseUserList"
:userName="yanPan.icUserName"
:singleList="yanPan.categoryList"
@user="toUserInfo"
/>
<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 class="m-tb" v-if="groupIndex == 1">
<cpt-tb
:col-list="comment.colList"
:loading="comment.loading"
:header="comment.header"
:list="comment.list"
@operate="checkTopicCommentImg"
></cpt-tb>
</div>
<div v-if="groupIndex == 2">
<div class="m-row" v-if="info.issueId">
<div 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 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 :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 class="list" v-else>
<div
class="item"
:key="field.itemId"
v-for="field in group.itemList"
>
<span class="item-field">{{ field.label }}</span>
<span
v-if="
field.itemType == 'select' ||
field.itemType == 'radio' ||
field.itemType == 'checkbox' ||
field.itemType == 'cascader'
"
>{{
!allInfo[group.tableName] ||
allInfo[group.tableName][0][field.columnName] == null
? "--"
: getOptionLabel(
field.options,
allInfo[group.tableName][0][field.columnName],
field.itemType
)
}}</span
>
<span v-else>{{
!allInfo[group.tableName] ||
allInfo[group.tableName][0][field.columnName] == null
? "--"
: allInfo[group.tableName][0][field.columnName]
}}</span>
<div v-if="groupIndex == 3">
<div class="m-row" v-if="issueInfo.projectId">
<div class="m-info">
<div class="info-prop">
<span>项目标题</span>
<span>{{ projectInfo.projectTitle }}</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>
<div>
<div :key="item.name" v-for="item in projectCate">
{{ item.name }}
</div>
</div>
</div>
<div class="info-prop" v-if="projectTag.length > 0">
<span>标签</span>
<div>
<div :key="item.name" v-for="item in projectTag">
{{ item.name }}
</div>
</div>
</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-else class="m-hint">
<img
src="@/assets/img/modules/visual/noData.png"
class="no-data-img"
/>
</div>
</div>
</div>
@ -174,16 +259,25 @@
<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 dateFormat from "dai-js/tools/dateFormat";
export default {
name: "demandInfo",
props: {
userId: {
topicId: {
type: String,
default: "",
},
gridName: {
epmetUserIdList: {
type: Array,
default: [],
},
icResiUserId: {
type: String,
default: "",
},
@ -191,94 +285,143 @@ export default {
components: {
cptCard,
cptTb,
analyse,
screenLoading,
lineChart,
},
data() {
return {
fieldList: [],
groupList: [],
groupList: [
{ label: "研判分析" },
{ label: "话题评论" },
{ label: "查看议题" },
{ label: "查看项目" },
],
groupIndex: 0,
startGroupIndex: 0,
info: {},
allInfo: {},
xiaoquList: [],
louList: [],
danyuanList: [],
homeList: [],
info: {
badgeList: [],
closeDetail: {
closeUserName: "",
closeDateTime: "-1",
closeReason: "",
closeUserHeadPhoto: "",
},
dimension: "",
hiddenDetail: null,
issueId: "",
longitude: "",
releaseAddress: "",
releaseTime: "",
releaseUserHeadPhoto: "",
releaseUserName: "",
shiftIssueFlag: true,
topicContent: "",
topicId: "",
topicImgs: [],
topicStatus: "discussing",
},
comment: {
loading: true,
colList: [
{
align: "center",
width: "20%",
},
{
align: "center",
width: "20%",
},
{
align: "left",
width: "50%",
},
{
align: "left",
width: "10%",
},
],
header: ["评论者", "评论时间", "评论内容", "评论图片"],
list: [],
},
issueInfo: {
attitude: "",
belongsGridName: "",
issueIdea: "",
issueInitiator: "",
issueStatus: "",
issueSuggestion: "",
issueTitle: "",
joinVote: true,
projectId: "",
projectStatus: false,
publishIdeaFlag: false,
},
issueTrend: {},
issueChartData: [],
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,
},
projectCate: [],
projectTag: [],
yanPan: {
loading: false,
icResiUserId: "",
houseId: "",
icUserName: "",
epmetUserIdList: [],
houseUserList: [
// {
// icResiUserId: '',
// icUserName: '',
// }
],
categoryList: [],
projectData: [
// {
// firstCategoryCode: '',
// firstCategoryName: '',
// projectList: [],
// }
],
},
};
},
computed: {
xiaoquName() {
const {
xiaoquList,
info: { VILLAGE_ID },
} = this;
if (Array.isArray(xiaoquList) && xiaoquList.length > 0 && VILLAGE_ID) {
let item = xiaoquList.find((item) => item.value == VILLAGE_ID);
if (item) {
return item.label;
}
}
return "";
},
louName() {
const {
louList,
info: { BUILD_ID },
} = this;
if (Array.isArray(louList) && louList.length > 0 && BUILD_ID) {
let item = louList.find((item) => item.value == BUILD_ID);
if (item) {
return item.label;
}
}
return "";
},
danyuanName() {
const {
danyuanList,
info: { UNIT_ID },
} = this;
if (Array.isArray(danyuanList) && danyuanList.length > 0 && UNIT_ID) {
let item = danyuanList.find((item) => item.value == UNIT_ID);
if (item) {
return item.label;
}
}
return "";
},
danyuanName() {
const {
danyuanList,
info: { UNIT_ID },
} = this;
if (Array.isArray(danyuanList) && danyuanList.length > 0 && UNIT_ID) {
let item = danyuanList.find((item) => item.value == UNIT_ID);
if (item) {
return item.label;
}
}
return "";
},
homeName() {
const {
homeList,
info: { HOME_ID },
} = this;
if (Array.isArray(homeList) && homeList.length > 0 && HOME_ID) {
let item = homeList.find((item) => item.value == HOME_ID);
if (item) {
return item.label;
}
}
return "";
},
},
computed: {},
watch: {
userId() {
topicId() {
this.getApiData();
},
},
@ -309,195 +452,228 @@ export default {
},
async getApiData() {
await this.getField();
this.getComment();
await this.getInfo();
this.getXiaoquList();
this.getLouList();
this.getDanyuanList();
this.getHomeList();
await this.getIssueInfo();
this.getIssueTrend();
this.getProjectProcess();
this.getProjectInfo();
this.getProjectCate();
this.getYanPan();
},
getOptionLabel(options, value, type = "") {
if (Array.isArray(options)) {
let valueArr = value.split(",");
if (type == "cascader") {
if (valueArr.length > 0) {
let level1 = options.find((item) => item.value == valueArr[0]);
if (level1) {
if (valueArr.length > 1 && level1.children) {
let level2 = level1.children.find(
(item) => item.value == valueArr[1]
);
if (level2) {
return level1.label + "-" + level2.label;
}
}
return level1.label;
}
}
} else {
return valueArr
.map((val) => {
let item = options.find((item) => item.value == val);
if (item && item.label) {
return item.label;
}
return "--";
})
.join("、");
}
//
async getInfo() {
const url = "/resi/group/topic/gettopicdetail";
const { data, code, msg } = await requestPost(url, {
topicId: this.topicId,
});
if (code === 0) {
this.info = data;
} else {
this.$message.error(msg);
}
return "--";
},
//
async getField() {
const url = "/oper/customize/icform/getcustomerform";
async getComment() {
const url = "/resi/group/comment/getcommentlistoftopic";
const { data, code, msg } = await requestPost(url, {
dynamic: true,
formCode: "resi_base_info",
topicId: this.topicId,
pageNo: 1,
pageSize: 100,
});
this.comment.loading = false;
if (code === 0) {
this.groupList = data.groupList;
this.fieldList = (function (arr) {
let col = [];
let ele = [];
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
if (item.itemType == "divider" || i == arr.length - 1) {
col.push([...ele]);
ele = [];
} else {
ele.push(item);
}
}
return col;
})(data.itemList);
this.fieldList.forEach((subList, index) => {
subList.forEach(async (item, subIndex) => {
if (item.optionSourceType == "remote" && item.optionSourceValue) {
this.fieldList[index][subIndex].options = await this.getOptions(
item.optionSourceValue
);
}
});
this.comment.list = data.map((item) => {
return [
item.commentUserName,
item.commentTime,
item.commentContent,
item.imageList.length > 0
? { type: "operate", list: ["查看"] }
: "",
];
});
this.comment.srcList = data;
} else {
this.$message.error(msg);
}
},
checkTopicCommentImg(index) {
const {
comment: { srcList },
} = this;
if (srcList[index] && srcList[index].imageList) {
window.open(srcList[index].imageList[0].url);
}
},
//
async getInfo() {
const url = "/epmetuser/icresiuser/detail";
async getIssueInfo() {
const {
info: { issueId },
} = this;
if (!issueId) return;
const url = "/resi/hall/issue/detail";
const { data, code, msg } = await requestPost(url, {
icResiUserId: this.userId,
formCode: "resi_base_info",
issueId,
});
if (code === 0) {
this.info = data.ic_resi_user[0];
this.allInfo = data;
this.fieldList.forEach((subList, index) => {
subList.forEach((item, subIndex) => {
if (
item.itemType == "radio" &&
item.childGroup &&
this.allInfo[item.tableName] &&
this.allInfo[item.tableName][0][item.columnName] == "1"
) {
this.groupList = [...this.groupList, item.childGroup];
}
});
});
console.log("1111111111111111111111111", this.groupList);
this.groupList.forEach((subList, index) => {
subList.itemList.forEach(async (item, subIndex) => {
if (item.optionSourceType == "remote" && item.optionSourceValue) {
this.groupList[index].itemList[subIndex].options =
await this.getOptions(item.optionSourceValue);
}
});
});
this.issueInfo = data;
} else {
this.$message.error(msg);
}
},
//
async getOptions(url) {
if (!url) return [];
async getIssueTrend() {
const {
info: { issueId },
} = this;
if (!issueId) return;
const url = "/resi/hall/issue/votingtrend";
const { data, code, msg } = await requestPost(url, {});
const { data, code, msg } = await requestPost(url, {
issueId,
});
if (code === 0) {
return data;
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 {
return [];
this.$message.error(msg);
}
},
async getXiaoquList() {
const url = "/gov/org/icneighborhood/neighborhoodoption";
//
async getProjectProcess() {
const { issueInfo } = this;
if (!issueInfo || !issueInfo.projectId) return;
const url = "/gov/project/trace/processlist-v2";
const { data, code, msg } = await requestPost(url, {
agencyId: this.info.AGENCY_ID,
gridId: this.info.GRID_ID,
projectId: issueInfo.projectId,
});
if (code === 0) {
this.xiaoquList = data;
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 getLouList() {
const url = "/gov/org/icbuilding/buildingoption";
//
async getProjectInfo() {
const { issueInfo } = this;
if (!issueInfo || !issueInfo.projectId) return;
const url = "/gov/project/trace/projectdetail";
const { data, code, msg } = await requestPost(url, {
neighborHoodId: this.info.VILLAGE_ID,
projectId: issueInfo.projectId,
});
if (code === 0) {
this.louList = data;
this.projectInfo = data;
} else {
this.$message.error(msg);
}
},
async getDanyuanList() {
const url = "/gov/org/icbuildingunit/unitoption";
async getProjectCate() {
const { issueInfo } = this;
if (!issueInfo || !issueInfo.projectId) return;
const url = "/gov/project/projectcategory/categorytaglist";
const { data, code, msg } = await requestPost(url, {
buildingId: this.info.BUILD_ID,
projectId: issueInfo.projectId,
});
if (code === 0) {
this.danyuanList = data;
this.projectCate = data.categoryList;
this.projectTag = data.tagList;
} else {
this.$message.error(msg);
}
},
async getHomeList() {
const url = "/gov/org/ichouse/houseoption";
//
async getYanPan() {
const url = "/gov/project/project/topic-research-analysis";
if (!this.issueInfo.projectId) return;
const { data, code, msg } = await requestPost(url, {
unitId: this.info.UNIT_ID,
epmetUserIdList: this.epmetUserIdList,
icResiUserId: this.icResiUserId,
projectId: this.issueInfo.projectId,
});
if (code === 0) {
this.homeList = data;
data.categoryList = data.projectData.map((item) => {
return {
categoryCode: item.firstCategoryCode,
categoryName: item.firstCategoryName,
showItem: true,
projectList: item.projectList.map((subItem) => {
return {
title: subItem.projectTitle,
status: subItem.projectStatus,
statusName:
subItem.projectStatus == "pending" ? "待处理" : "结案",
projectId: subItem.projectId,
};
}),
};
});
this.yanPan = { ...this.yanPan, ...data };
this.yanPan.loading = true;
} else {
this.$message.error(msg);
}
},
toUserInfo(item) {
this.$router.push({
path: `/main-shuju/visual-basicinfo-people/${item.icResiUserId}`,
});
},
},
};
</script>
<style lang="scss" src="@/assets/scss/modules/visual/people.scss" scoped></style>
<style
lang="scss"
src="@/assets/scss/modules/visual/incident-info.scss"
scoped
></style>

43
src/views/modules/visual/basicinfo/people.vue

@ -375,8 +375,8 @@
v-for="(item, index) in topic.list"
@click="handleClickTopic(index)"
>
<div class="item-title">{{ item.eventContent }}</div>
<div class="item-date">{{ item.reportTime }}</div>
<div class="item-title">{{ item.topicContent }}</div>
<div class="item-date">{{ item.releaseTime }}</div>
</div>
</div>
@ -448,18 +448,18 @@
/>
<incident-info
v-show="incident.showedInfo"
v-if="userId"
:userId="userId"
:gridName="info.gridName"
v-if="incident.list.length > 0 && incident.showedInfo"
:resiEventId="incident.list[incident.currentIndex].resiEventId"
:epmetUserIdList="info.epmetUserIdList"
:icResiUserId="userId"
@close="incident.showedInfo = false"
/>
<topic-info
v-show="topic.showedInfo"
v-if="userId"
:userId="userId"
:gridName="info.gridName"
v-if="topic.list.length > 0 && topic.showedInfo"
:topicId="topic.list[topic.currentIndex].topicId"
:epmetUserIdList="info.epmetUserIdList"
:icResiUserId="userId"
@close="topic.showedInfo = false"
/>
</div>
@ -485,7 +485,7 @@ export default {
userId: "",
info: {
epmetUserId: "",
epmetUserIdList: [],
financialSituation: { monthlyIncome: "", retirementAmount: "" },
gridName: "",
houseInfo: [],
@ -594,7 +594,7 @@ export default {
cptTb,
demandInfo,
incidentInfo,
topicInfo
topicInfo,
},
watch: {
@ -676,8 +676,8 @@ export default {
async getDemandData() {
const url = "/heart/userdemand/mydemand";
let params = {
epmetUserId: this.info.epmetUserId,
userId: this.userId,
epmetUserIdList: this.info.epmetUserIdList,
icResiUserId: this.userId,
pageNo: this.demand.pageNo,
pageSize: this.demand.pageSize,
};
@ -715,10 +715,9 @@ export default {
//
async getIncidentData() {
const url =
"http://yapi.elinkservice.cn/mock/245/gov/project/resievent/pageuserreported";
const url = "/gov/project/resievent/pageuserreported";
let params = {
epmetUserId: this.info.epmetUserId,
epmetUserIdList: this.info.epmetUserIdList,
userId: this.userId,
pageNo: this.incident.pageNo,
pageSize: this.incident.pageSize,
@ -747,10 +746,9 @@ export default {
//
async getTopicData() {
const url =
"http://yapi.elinkservice.cn/mock/245/gov/project/resievent/pageuserreported";
const url = "/data/aggregator/resigroup/pageusertopic";
let params = {
epmetUserId: this.info.epmetUserId,
epmetUserIdList: this.info.epmetUserIdList,
userId: this.userId,
pageNo: this.topic.pageNo,
pageSize: this.topic.pageSize,
@ -779,10 +777,9 @@ export default {
//
async getPointData() {
const url =
"http://yapi.elinkservice.cn/mock/245/point/resi/point/pageuserpoint";
const url = "/point/resi/point/pageuserpoint";
let params = {
epmetUserId: this.info.epmetUserId,
epmetUserIdList: this.info.epmetUserIdList,
userId: this.userId,
pageNo: this.point.pageNo,
pageSize: this.point.pageSize,

111
src/views/modules/visual/communityParty/community.vue

@ -38,21 +38,22 @@
</div>
<div class="box-wr box-wr-400">
<div class="box-left">
<div class="box-left-item">
<div class="box-label">组织单位</div>
<div class="box-num">1233</div>
<div v-for="(item, index) in cateInfo" :key="index" class="box-left-item">
<div class="box-label">{{ item.label }}</div>
<div class="box-num">{{ item.value }}</div>
</div>
<div class="box-left-item">
<!-- <div class="box-left-item">
<div class="box-label">组织活动</div>
<div class="box-num">1233</div>
</div>
</div> -->
</div>
<div class="box-right">
<div class="warning-box-bottom">
<screen-table :headerList="headerList"
:tableData="tableData"
:visibleLoading="visibleLoading"
:operate="true"></screen-table>
:operate="true"
@look="handleLook"></screen-table>
<div class="pagination">
<el-pagination :current-page="pageNo"
:page-size="pageSize"
@ -67,7 +68,7 @@
</div>
</div>
<div class="second-title">
<div class="second-title-label">党建单位分类统计</div>
<div class="second-title-label">党建单位分</div>
</div>
<div class="box-wr">
@ -75,7 +76,7 @@
<div v-for="item in partyItem"
:key="item.value"
class="box-left-item">
<div class="box-label">{{ item.name }}</div>
<div class="box-label">{{ item.label }}</div>
<div class="box-num"
:style="'color:' + item.color">{{ item.value }}</div>
</div>
@ -95,7 +96,7 @@
<div class="map-tips-icon">
<img :src="item.icon" />
</div>
<div class="map-tips-label">{{ item.name }}</div>
<div class="map-tips-label">{{ item.label }}</div>
</div>
</div>
</div>
@ -126,7 +127,7 @@ export default {
data () {
return {
showedMoreInfo: true,
showedMoreInfo: false,
tableLoading: false,
warningList: [],
headerList: [
@ -141,6 +142,7 @@ export default {
tableData: [
// [1,'','','2',''],
],
detailId: '',
agencyId: '',
value2: '',
timeRange: '',
@ -180,7 +182,7 @@ export default {
icon: require('../../../../assets/img/shuju/measure/qita.png')
}
],
cateInfo: [],
//
isfirstInit: true,//
agencyInfo: {},//level
@ -231,6 +233,8 @@ export default {
await nextTick(100);
this.loadUnit()
this.getList();
this.getCateCount()
this.getCateType()
await this.getWorkUserInfo()
await this.getMapUnitList()
},
@ -240,7 +244,7 @@ export default {
async getList () {
this.visibleLoading = true
const url = "/heart/icpartyactivity/search"
const url = "/heart/icpartyactivity/activitylist"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyactivity/list"
let params = {
agencyId: this.agencyId,
@ -261,6 +265,81 @@ export default {
}
this.visibleLoading = false
},
async getCateCount () {
const url = "/heart/icpartyactivity/statistics"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyactivity/list"
let params = {
agencyId: this.agencyId
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.cateInfo = data
} else {
this.$message.error(msg)
}
},
async getCateType () {
const url = "/heart/icpartyunit/typestatistics"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyactivity/list"
let params = {
agencyId: this.agencyId
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
// this.cateInfo = data
const colorItem = {
0: {
color: 'rgba(250, 32, 10, 1)',
icon: require('../../../../assets/img/shuju/measure/ly@2x.png')
},
1: {
color: 'rgba(251, 177, 4, 1)',
icon: require('../../../../assets/img/shuju/measure/lxdj@2x.png')
},
2: {
color: 'rgba(80, 194, 237, 1)',
icon: require('../../../../assets/img/shuju/measure/xq@2x.png')
},
3: {
color: 'rgba(65, 181, 104, 1)',
icon: require('../../../../assets/img/shuju/measure/jgzs@2x.png')
},
4: {
color: 'rgba(192, 21, 195, 1)',
icon: require('../../../../assets/img/shuju/measure/qita.png')
}
}
this.partyItem = data.map((item, index) => {
return {
...item,
...colorItem[index]
}
})
} else {
this.$message.error(msg)
}
},
async getDetail () {
const url = "/heart/icpartyactivity/detail"
let params = {
id: this.agencyId
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.detailInfo = data
} else {
this.$message.error(msg)
}
},
async loadUnit () {
const url = "/heart/icresidemanddict/subcodelist"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyunit/option"
@ -328,8 +407,8 @@ export default {
//
async getMapUnitList () {
// const url = "/heart/icpartyunit/distribution"
const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyunit/distribution"
const url = "/heart/icpartyunit/distribution"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyunit/distribution"
let params = {
agencyId: this.agencyId
@ -393,7 +472,9 @@ export default {
clickProject (feature) {
console.log('标注信息', feature.values_.properties)
},
handleLook(val) {
this.detailId = val.id
},
handleSelectChange () {
this.getList();

208
src/views/modules/visual/communityParty/dialogInfo.vue

@ -92,7 +92,11 @@
</div>
</div>
<analyse />
<div style="padding: 30px 0;">
<analyse :single-list="demandList" :single-title="'需求上报'" :more-title="'事件上报'" :user-list="userLists"
:user-name="userName" :has-event="false" :more-list="eventList" />
</div>
</cpt-card>
</div>
@ -135,6 +139,208 @@ export default {
louList: [],
danyuanList: [],
homeList: [],
demandList: [
{
categoryName: '辨明服务',
categoryCode: '1',
showItem: false,
projectList: [
{
title: '不知道写了什么哈哈哈',
status: 'closed',
projectId: '1'
},
{
title: '罗里吧嗦写了什么哈哈哈',
status: 'closed',
projectId: '2'
},
{
title: '胡说八道写了什么哈哈哈',
status: 'closed',
projectId: '1=3'
},
{
title: '费眼飞鱼不知道写了什么哈哈哈',
status: 'closed',
projectId: '1=4'
},
{
title: '狗屁不通不知道写了什么哈哈哈',
status: 'closed',
projectId: '5'
},
{
title: '啦啦啦不知道写了什么哈哈哈',
status: 'closed',
projectId: '6'
}
]
},
{
categoryName: '辨明服务',
categoryCode: '1',
showItem: false,
projectList: [
{
title: '不知道写了什么哈哈哈',
status: 'closed',
projectId: '1'
},
{
title: '罗里吧嗦写了什么哈哈哈',
status: 'closed',
projectId: '2'
},
{
title: '胡说八道写了什么哈哈哈',
status: 'closed',
projectId: '1=3'
},
{
title: '费眼飞鱼不知道写了什么哈哈哈',
status: 'closed',
projectId: '1=4'
},
{
title: '狗屁不通不知道写了什么哈哈哈',
status: 'closed',
projectId: '5'
},
{
title: '啦啦啦不知道写了什么哈哈哈',
status: 'closed',
projectId: '6'
}
]
},
{
categoryName: '辨明服务',
categoryCode: '1',
showItem: false,
projectList: [
{
title: '不知道写了什么哈哈哈',
status: 'closed',
projectId: '1'
},
{
title: '罗里吧嗦写了什么哈哈哈',
status: 'closed',
projectId: '2'
},
{
title: '胡说八道写了什么哈哈哈',
status: 'closed',
projectId: '1=3'
},
{
title: '费眼飞鱼不知道写了什么哈哈哈',
status: 'closed',
projectId: '1=4'
},
{
title: '狗屁不通不知道写了什么哈哈哈',
status: 'closed',
projectId: '5'
},
{
title: '啦啦啦不知道写了什么哈哈哈',
status: 'closed',
projectId: '6'
}
]
}
],
userLists: [
{
homeId: '1',
icUserId: '1',
icUserName: '沾上干'
},
{
homeId: '2',
icUserId: '2',
icUserName: '李四'
},
{
homeId: '3',
icUserId: '3',
icUserName: '王五哈哈'
}
],
userName: '王亚男哈',
eventList: [
{
categoryName: '辨明服务',
categoryCode: '1',
projectList: [
{
title: '不知道写了什么哈哈哈',
status: 'closed',
projectId: '1'
},
{
title: '罗里吧嗦写了什么哈哈哈',
status: 'closed',
projectId: '2'
},
{
title: '胡说八道写了什么哈哈哈',
status: 'closed',
projectId: '1=3'
},
{
title: '费眼飞鱼不知道写了什么哈哈哈',
status: 'closed',
projectId: '1=4'
},
{
title: '狗屁不通不知道写了什么哈哈哈',
status: 'closed',
projectId: '5'
},
{
title: '啦啦啦不知道写了什么哈哈哈',
status: 'closed',
projectId: '6'
}
]
},
{
categoryName: '水煮鱼辨明服务辨明服务',
categoryCode: '4',
projectList: [
{
title: '熟煮雨不知道写了什么哈哈哈',
status: 'pending',
projectId: '4'
}
]
},
{
categoryName: '开心麻花',
categoryCode: '2',
projectList: [
{
title: '不知道开心麻花写了什么哈哈哈',
status: 'closed',
projectId: '1'
}
]
},
{
categoryName: '酸菜鱼',
categoryCode: '3',
projectList: [
{
title: '不知道酸菜鱼写了什么哈哈哈',
status: 'pending',
projectId: '3'
}
]
}
],
};
},

352
src/views/modules/visual/communityParty/party.vue

@ -4,7 +4,7 @@
<div class="card-title">
<img class="title-icon" src="../../../../assets/img/shuju/title-tip.png" />
<div class="title-label">
<el-dropdown trigger="click">
<!-- <el-dropdown trigger="click">
<span class="el-dropdown-link">
全部网格<i class="el-icon-caret-bottom el-icon--right"></i>
</span>
@ -15,18 +15,16 @@
<el-dropdown-item>双皮奶</el-dropdown-item>
<el-dropdown-item>蚵仔煎</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</div>
<!-- <div class="title-time">
<div class="title-time-label">选择时间</div>
<div class="">
<el-date-picker
v-model="value2"
type="month"
placeholder="选择月">
</el-date-picker>
</div>
</div> -->
</el-dropdown> -->
<el-cascader
v-model="selectAgency"
:options="propTree"
:props="{ checkStrictly: true }"
:show-all-levels="false"
:getCheckedNodes="getCheckedNodes"
clearable @change="handleCascader">
</el-cascader>
</div>
</div>
<div class="card-echart">
<div class="card-left">
@ -47,7 +45,7 @@
</div>
<div class="tips-items-num">
<div class="tips-item-count">{{item.value}}</div>
<div class="tips-item-has">25%</div>
<div class="tips-item-has">{{ item.radio }}</div>
</div>
</div>
@ -58,19 +56,19 @@
<div class="warning-box-bottom">
<screen-table
:headerList="headerList"
:tableData="tableData"
:tableData="ageList"
:visibleLoading="visibleLoading"
:operate="false"
></screen-table>
<div class="pagination">
<el-pagination
:current-page="pageNo"
:page-size="pageSize"
:current-page="agePageNo"
:page-size="agePageSize"
background
layout="prev, pager, next"
@size-change="pageSizeChangeHandleNew"
@current-change="pageCurrentChangeHandleNew"
:total="total"
@size-change="pageSizeChangeHandleAge"
@current-change="pageCurrentChangeHandleAge"
:total="ageTotal"
>
</el-pagination>
</div>
@ -98,8 +96,8 @@
</div>
<div class="warning-box-bottom">
<screen-table
:headerList="headerList"
:tableData="tableData"
:headerList="headerEduList"
:tableData="eduList"
:visibleLoading="visibleLoading"
:operate="false"
></screen-table>
@ -142,23 +140,31 @@ export default {
},
data() {
return {
warningList: [],
headerList: [
{ title: "序号", coulmn: 'index' },
{ title: "姓名", coulmn: 'gridName' },
{ title: "年龄", coulmn: 'buildingName' },
{ title: "手机号码", coulmn: 'neighborhoodName' }
{ title: "姓名", coulmn: 'name' },
{ title: "年龄", coulmn: 'age' },
{ title: "手机号码", coulmn: 'mobile' }
],
headerEduList: [
{ title: "序号", coulmn: 'index' },
{ title: "姓名", coulmn: 'name' },
{ title: "学历", coulmn: 'education' },
{ title: "手机号码", coulmn: 'mobile' }
],
tableData: [
// [1,'','','2',''],
],
selectAgency: null,
propTree: [],
value2: '',
visibleLoading: true,
pageNo: 1,
pageSize: 10,
agePageNo: 1,
agePageSize: 10,
total: 0,
activeIndex: 0,
activeLevel: "1",
ageTotal: 0,
eduItem: [
{
name: '小学',
@ -221,6 +227,8 @@ export default {
color: 'rgba(255, 186, 0, 1)'
}
],
ageList: [],
eduList: [],
pieAgeChartS: null,
pieEduChartSs: null,
pieAgeOptions: null,
@ -228,12 +236,15 @@ export default {
};
},
async mounted() {
await nextTick(100);
this.initAgeCharts()
this.initEduCharts()
await this.getAgencyList()
this.getAgeCount(this.$store.state.user.agencyId, 'agency')
this.getEduCount(this.$store.state.user.agencyId, 'agency')
// this.initAgeCharts()
// this.initEduCharts()
this.getAgeList(this.$store.state.user.agencyId, 'agency')
this.getEduList(this.$store.state.user.agencyId, 'agency')
// this.initChartType()
this.getBuildingwarnlist();
},
methods: {
pieInitOk (dom) {
@ -252,105 +263,7 @@ export default {
// const eId = document.getElementById('echartOrg')
// let _charts = echarts.init(eId)
let option = {
// tooltip: {
// show: false,
// trigger: 'item'
// },
// legend: {
// show: false,
// orient: 'vertical',
// top: '40%',
// left: 'right',
// textStyle: {
// color: '#fff'
// }
// },
// title: {
// text: '12000', //80%
// subtext: '',
// left: "center",
// top: "center",
// textStyle: {
// color: "#fff",
// fontSize: 28,
// align: "center"
// },
// subtextStyle: {
// fontSize: 16,
// color: '#fff'
// }
// },
// series: [
// {
// // name: 'Access From',
// type: 'pie',
// // center: ['10%', '50%'],
// radius: ['40%', '60%'],
// avoidLabelOverlap: true,
// // top: top + '%',
// // height: '80%',
// left: 'center',
// width: 400,
// label: {
// show: true,
// position: 'outer',
// alignTo: 'edge',
// formatter: '{a|{c}}\n{r|}\n{name|{b}}',
// minMargin: 5,
// edgeDistance: 20,
// lineHeight: 15,
// color: '#fff',
// fontSize: 12,
// // padding: [5],
// distanceToLabelLine: 10,
// rich: {
// name: {
// padding: [0, 6, 0, 6]
// },
// a: {
// fontSize: 15,
// color: '#fff',
// padding: [0, 6, 0, 6]
// },
// r: {
// backgroundColor: 'auto',
// borderRadius: 6,
// width: 6,
// height: 6,
// // padding: [3, 3, 0, -12]
// }
// }
// },
// emphasis: {
// label: {
// show: true,
// fontSize: '14',
// fontWeight: 'bold'
// }
// },
// labelLine: {
// show: false,
// length: 20,
// length2: 0,
// maxSurfaceAngle: 80,
// lineStyle: {
// cap: 'round'
// }
// },
// labelLayout: function (params) {
// const isLeft = params.labelRect.x < this.pieChartS.getWidth() / 2;
// const points = params.labelLinePoints;
// // Update the end point.
// points[2][0] = isLeft
// ? params.labelRect.x
// : params.labelRect.x + params.labelRect.width;
// return {
// labelLinePoints: points
// };
// },
// data: this.ageItem
// }
// ]
}
this.pieAgeOptions = pieOption(this.pieAgeChartS)
this.clickAgePie(0)
@ -606,59 +519,163 @@ export default {
this.$refs.eduChart.setOption(this.pieEduOptions)
},
onClickList(index, level) {
this.activeIndex = index;
this.activeLevel = level;
this.pageNo = 1;
this.getUserwarnlist();
async getAgeCount(orgId, orgType) {
const url = "/epmetuser/icresiuser/partymemberagestatistics";
let params = {
orgId,
orgType
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.ageItem = data.map(item => {
return {
...item,
name: item.label
}
})
this.initAgeCharts()
} else {
}
},
//
async getUserwarnlist() {
const { activeIndex, activeLevel, warningList } = this;
const reqItem = warningList[activeIndex];
let tableData = [];
const url = "/epmetuser/statsresiwarn/userwarnlist";
async getEduCount(orgId, orgType) {
const url = "/epmetuser/icresiuser/partymembereducationstatistics";
let params = {
configId: reqItem.configId,
buildingIdList: reqItem["buildingIdList" + activeLevel],
pageNo: this.pageNo,
pageSize: this.pageSize,
orgId,
orgType
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
tableData = data.list.map((item, index) => {
this.eduItem = data.map(item => {
return {
...item,
index: index + 1,
residentNames: item.residentNames || "暂无"
name: item.label
}
});
this.tableData = tableData;
this.total = data.total;
})
this.initEduCharts()
} else {
}
},
//
async getBuildingwarnlist() {
const url = "/epmetuser/statsresiwarn/buildingwarnlist";
async getAgeList(orgId, orgType, _code) {
this.visibleLoading = true
const url = "/epmetuser/icresiuser/partymemberagelist";
let params = {
agencyId: this.$store.state.user.agencyId,
orgId,
orgType,
code: _code || '',
pageNo: this.agePageNo,
pageSize: this.agePageSize
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.warningList = data;
this.visibleLoading = false;
this.getUserwarnlist();
this.ageList = data.list.map((item, index) => {
return {
...item,
index: index + 1
}
})
this.ageTotal = data.total
} else {
}
this.visibleLoading = false
},
async getEduList(orgId, orgType, _code) {
const url = "/epmetuser/icresiuser/partymembereducationlist";
let params = {
orgId,
orgType,
code: _code || '',
pageNo: this.pageNo,
pageSize: this.pageSize
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.eduList = data.list.map((item, index) => {
return {
...item,
index: index + 1
}
})
this.total = data.total
} else {
}
},
async getAgencyList(node, resolve) {
// const url = "/gov/org/customeragency/staffinagencylist";
const url = '/gov/org/customeragency/agencygridtree'
// let params = {
// agencyId: this.$store.state.user.agencyId,
// };
const { data, code, msg } = await requestPost(url);
if (code === 0) {
console.log('data-org----o', data)
this.selectAgency = [`${data.agencyId}-${data.level}`]
let arr = []
arr.push(data)
this.propTree = arr && this.getTreeData(arr)
} else {
}
},
getTreeData(data){
if (!Array.isArray(data)) return []
let arr = data.map(item => {
let _item = {}
if (item.subAgencyList) {
if (item.subAgencyList.length === 0) {
_item = {
label: item.agencyName,
value: item.agencyId + '-' + item.level,
level: item.level,
children: undefined
}
} else _item = {
label: item.agencyName,
value: item.agencyId + '-' + item.level,
level: item.level,
children: this.getTreeData(item.subAgencyList)}
} else {
_item = {
label: item.agencyName,
value: item.agencyId + '-' + item.level,
level: item.level,
}
}
return _item
})
return arr
},
handleCascader(val) {
console.log('val-vvv', val)
const _arr = val[val.length - 1].split('-')
const orgType = _arr[1] !== 'grid' ? 'agency': 'grid'
this.getAgeList(_arr[0], orgType)
this.getEduList(_arr[0], orgType)
},
getCheckedNodes(val) {
console.log('val-nnn', val)
},
lazyLoad(node, resolve) {
setTimeout(() => {
this.getAgeList(node, resolve)
}, 500)
},
pageSizeChangeHandleAge(val) {
this.agePageNo = 1
this.agePageSize = val
this.getAgeList()
},
pageCurrentChangeHandleAge (val) {
this.agePageSize = val
this.getAgeList()
},
pageSizeChangeHandleNew(val) {
this.pageNo = 1;
this.pageSize = val;
this.getEduList()
},
pageCurrentChangeHandleNew(val) {
this.pageNo = val;
this.getUserwarnlist();
this.getEduList()
},
},
};
@ -723,6 +740,21 @@ export default {
}
}
.title-label {
::v-deep .el-input {
width: 180px;
.el-input__inner {
font-size: 20px;
font-weight: 800;
color: #fff;
background: transparent;
border: 0;
}
.el-icon-arrow-down::before {
content: "\e790";
}
}
}
}
.card-echart {
display: flex;

340
src/views/modules/visual/cpts/analyse.vue

@ -36,7 +36,7 @@
<div class="analys-col">
<div class="analys-cate" @click="handleTabs('group')">
<div class="label">楼院小组</div>
<div class="label">{{ singleTitle }}</div>
<div class="tips">(反应渠道)</div>
<div class="icon">
<img src="../../../../assets/img/shuju/measure/gantanhao.png" />
@ -54,7 +54,7 @@
<div class="analys-col">
<div class="analys-cate" @click="handleTabs('event')">
<div class="label">事件上报</div>
<div class="label">{{ moreTitle }}</div>
<div class="tips">(反应渠道)</div>
<div class="icon">
<img src="../../../../assets/img/shuju/measure/gantanhao.png" />
@ -71,7 +71,7 @@
</div>
<div class="analys-col analys-col-wr list-wr" id="scroll-wr">
<div class="analys-col analys-col-wr analys-col-more list-wr" id="scroll-wr">
<div class="cate-list cate-list-child">
<div v-for="(item, index) in tempList" :key="index" class="cate-row">
@ -79,25 +79,29 @@
<div class="analys-cate">
<div class="label">{{item.categoryName}}</div>
<div class="tips">(同类案件)</div>
<div class="icon">
<div class="icon" @click="handleShow(item)">
<img src="../../../../assets/img/shuju/measure/gantanhao.png" />
</div>
</div>
</div>
<img class="analys-arrow" src="../../../../assets/img/shuju/measure/you@2x.png" />
<div class="cate-col cate-col-arrow">
<img v-show="item.showItem" class="analys-arrow" src="../../../../assets/img/shuju/measure/you@2x.png" />
</div>
<div class="cate-col">
<div class="list list-wr">
<div v-for="(n, i) in item.projectList" :key="index" class="item" @click="handleProject(n)">
<div class="item-status" :class="'item-status-'+n.status">{{filterStatus(n.status)}}</div>
<div class="item-content">{{n.title}}</div>
<div class="cate-col cate-col-w100">
<div class="cate-list-w0" :class="item.showItem && 'cate-list-w100'">
<div class="list list-wr">
<div v-for="(n, i) in item.projectList" :key="i" class="item" @click="handleProject(n)">
<div class="item-status" :class="'item-status-'+n.status">{{filterStatus(n.status)}}</div>
<div class="item-content">{{n.title}}</div>
</div>
<!-- <div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div> -->
</div>
<!-- <div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div> -->
</div>
</div>
@ -115,91 +119,58 @@
<div class="analys-col">
<div class="analys-cate">
<div class="label">楼院小组</div>
<div class="label">{{ singleTitle }}</div>
<div class="tips">(反应渠道)</div>
<div class="icon">
<!-- <div class="icon">
<img src="../../../../assets/img/shuju/measure/gantanhao.png" />
</div>
</div> -->
</div>
</div>
<div class="analys-col">
<img class="analys-up" src="../../../../assets/img/shuju/measure/up-right.png" />
<img class="analys-arrow" src="../../../../assets/img/shuju/measure/you@2x.png" />
<img class="analys-up analys-down" src="../../../../assets/img/shuju/measure/down-right.png" />
<img v-if="tempList.length > 1" class="analys-up" src="../../../../assets/img/shuju/measure/up-right.png" />
<img v-if="tempList.length != 2" class="analys-arrow" src="../../../../assets/img/shuju/measure/you@2x.png" />
<img v-if="tempList.length > 1"
class="analys-up analys-down" src="../../../../assets/img/shuju/measure/down-right.png" />
</div>
<div class="analys-col analys-col-wr list-wr">
<div class="cate-list pad10">
<div class="analys-col list-wr" :class="tempList.length > 2 && 'analys-col-wr' || 'analys-single'">
<div class="cate-list">
<div v-for="(item, index) in tempList" :key="index" class="cate-row">
<div class="cate-col">
<div class="analys-cate">
<div class="label">{{item.categoryName}}</div>
<div class="tips">(同类案件)</div>
<div class="icon">
<div class="icon" @click="handleShow(item)">
<img src="../../../../assets/img/shuju/measure/gantanhao.png" />
</div>
</div>
</div>
<img class="analys-arrow" src="../../../../assets/img/shuju/measure/you@2x.png" />
<div class="cate-col">
<div class="list list-wr">
<div v-for="(n, i) in item.projectList" :key="index" class="item" @click="handleProject(n)">
<div class="item-status" :class="'item-status-'+n.status">{{filterStatus(n.status)}}</div>
<div class="item-content">{{n.title}}</div>
</div>
<!-- <div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div> -->
</div>
<div class="cate-col cate-col-arrow">
<img v-show="item.showItem" class="analys-arrow" src="../../../../assets/img/shuju/measure/you@2x.png" />
</div>
</div>
<!-- <div class="cate-row">
<div class="cate-col">
<div class="analys-cate">
<div class="label">楼院小组</div>
<div class="tips">(同类案件)</div>
<div class="icon">
<img src="../../../../assets/img/shuju/measure/gantanhao.png" />
</div>
</div>
</div>
<img class="analys-arrow" src="../../../../assets/img/shuju/measure/you@2x.png" />
<div class="cate-col">
<div class="list list-wr">
<div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div>
<div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div>
<div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div>
<div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div>
<div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
<div class="cate-col cate-col-w100">
<div class="cate-list-w0" :class="item.showItem && 'cate-list-w100'">
<div class="list list-wr">
<div v-for="(n, i) in item.projectList" :key="i" class="item" @click="handleProject(n)">
<div class="item-status" :class="'item-status-'+n.status">
{{ n.statusName || filterStatus(n.status)}}
</div>
<div class="item-content">{{n.title}}</div>
</div>
<!-- <div class="item">
<div class="item-status">已结案</div>
<div class="item-content">合肥路与安宁路交合肥路与安宁路交</div>
</div> -->
</div>
</div>
</div>
</div> -->
</div>
</div>
</div>
@ -210,157 +181,47 @@
</template>
<script>
// singleList: [
// {
// categoryName: '',
// categoryCode: '1',
// showItem: true,
// projectList: [
// {
// title: '',
// status: 'closed',
// statusName: '',
// projectId: '1'
// }
// ]
// }
// ]
export default {
name: 'Analyse',
props: {
hasEvent: {
type: Boolean,
type: Boolean, // true
default: false
}
},
moreTitle: String, // hasEvent true
moreList: Array, // hasEvent true
singleTitle: { //
type: String,
default: '楼院小组'
},
userList: Array, //
userName: String, //
singleList: Array, //
},
data () {
return {
sourceTab: 'group',
userList: [
{
homeId: '1',
icUserId: '1',
icUserName: '沾上干'
},
{
homeId: '2',
icUserId: '2',
icUserName: '李四'
},
{
homeId: '3',
icUserId: '3',
icUserName: '王五哈哈'
}
],
userName: '王亚男哈',
groupList: [
{
categoryName: '哈哈哈',
categoryCode: '1',
projectList: [
{
title: '我也不知道该谢谢什么啊啊啊',
status: 'pending',
projectId: '10'
}
]
},
{
categoryName: '啊啊啊啊',
categoryCode: '2',
projectList: [
{
title: '我也不知道该谢谢什么啊啊啊',
status: 'pending',
projectId: '12'
}
]
},
{
categoryName: '啦啦啦',
categoryCode: '3',
projectList: [
{
title: '我也不知道该谢谢什么啊啊啊',
status: 'closed',
projectId: '13'
}
]
},
{
categoryName: '为民服务',
categoryCode: '4',
projectList: [
{
title: '我也不知道该谢谢什么啊啊啊',
status: 'pending',
projectId: '14'
}
]
}
],
eventList: [
{
categoryName: '辨明服务',
categoryCode: '1',
projectList: [
{
title: '不知道写了什么哈哈哈',
status: 'closed',
projectId: '1'
},
{
title: '罗里吧嗦写了什么哈哈哈',
status: 'closed',
projectId: '2'
},
{
title: '胡说八道写了什么哈哈哈',
status: 'closed',
projectId: '1=3'
},
{
title: '费眼飞鱼不知道写了什么哈哈哈',
status: 'closed',
projectId: '1=4'
},
{
title: '狗屁不通不知道写了什么哈哈哈',
status: 'closed',
projectId: '5'
},
{
title: '啦啦啦不知道写了什么哈哈哈',
status: 'closed',
projectId: '6'
}
]
},
{
categoryName: '水煮鱼辨明服务辨明服务',
categoryCode: '4',
projectList: [
{
title: '熟煮雨不知道写了什么哈哈哈',
status: 'pending',
projectId: '4'
}
]
},
{
categoryName: '开心麻花',
categoryCode: '2',
projectList: [
{
title: '不知道开心麻花写了什么哈哈哈',
status: 'closed',
projectId: '1'
}
]
},
{
categoryName: '酸菜鱼',
categoryCode: '3',
projectList: [
{
title: '不知道酸菜鱼写了什么哈哈哈',
status: 'pending',
projectId: '3'
}
]
}
],
tempList: []
}
},
created() {
this.tempList = [...this.groupList]
this.tempList = [...this.singleList]
},
methods: {
filterStatus(status) {
@ -371,8 +232,8 @@ export default {
return statusObj[status]
},
handleTabs(type) {
if (type === 'group') this.tempList = [ ...this.groupList ]
else if (type === 'event') this.tempList = [ ...this.eventList ]
if (type === 'group') this.tempList = [ ...this.singleList ]
else if (type === 'event') this.tempList = [ ...this.moreList ]
this.sourceTab = type
const _dom = document.getElementById('scroll-wr')
_dom.scrollTop = 0
@ -382,6 +243,9 @@ export default {
},
handleUser(item) {
this.$emit('user', item)
},
handleShow(item) {
item.showItem = !item.showItem
}
}
}
@ -393,7 +257,7 @@ export default {
display: flex;
align-items: center;
width: 100%;
height: 560px;
max-height: 560px;
box-sizing: border-box;
overflow: auto;
@ -506,6 +370,37 @@ export default {
align-items: center;
margin-bottom: 20px;
// margin-top: 0;
.cate-col-arrow {
width: 32px;
height: 18px;
// box-sizing: border-box;
margin: 0 6px;
.analys-arrow {
display: block;
width: 32px;
height: 100%;
box-sizing: border-box;
margin: 0 auto;
}
}
.cate-col-w100 {
width: 230px;
.cate-list-w0 {
width: 0;
transition: width .2s;
overflow: hidden;
// border: 0;
// padding: 0;
}
.cate-list-w100 {
width: 230px;
// padding: 4px 14px 10px;
// // background: rgba(255, 255, 255, 0);
// border: 1px solid #1257C9;
// overflow: auto;
transition: width .2s;
}
}
}
}
.cate-list-more {
@ -538,6 +433,7 @@ export default {
width: 100%;
box-sizing: border-box;
padding: 8px 0;
color: #fff;
border-bottom: 1px dashed rgba(131, 152, 217, 1);
.item-status {
min-width: 50px;
@ -571,6 +467,14 @@ export default {
padding-right: 30px;
overflow: auto;
}
.analys-col-more {
height: 560px;
}
.analys-single {
.list {
height: 235px;
}
}
.analys-col-posi {
// .analys-up, .analys-down {
// position: absolute;
@ -578,7 +482,7 @@ export default {
.analys-up {
// top: -200px;
// left: -30px;
// margin-bottom: 160px;
// margin-bottom: 160px;
}
.analys-down {
// margin-top: 160px;

214
src/views/modules/visual/cpts/line-chart.vue

@ -0,0 +1,214 @@
<template>
<div class="m-chart">
<canvas id="myChart" width="400" height="260"></canvas>
</div>
</template>
<script>
import nextTick from "dai-js/tools/nextTick";
// iosbug
const fontFamily = "PingFang SC";
const fontSize = 14;
let chart;
let srcData = [];
let textShapeList = [];
const addTextShape = () => {
if (textShapeList.length > 0) {
textShapeList.forEach((item) => {
item.remove(true);
});
textShapeList = [];
}
// 线
const canvas = chart.get("canvas");
const group = canvas.addGroup();
const shapes = {};
function addFn(list) {
const listLength = list.length;
list.forEach(function (obj, index) {
//
if (listLength > 7 && index > 0 && index < listLength - 1) {
if (index % Math.ceil(listLength / 5) != 0) {
return;
}
}
const offsetX = 6;
const offsetY = 1;
const point = chart.getPosition(obj);
const text = group.addShape("text", {
attrs: {
x: obj.type === "支持" ? point.x + 2 * offsetX : point.x - offsetX,
y: point.y + offsetY,
text: obj.value,
textAlign: "center",
textBaseline: "bottom",
fill: "#333",
fontWeight: 500,
fontFamily,
fontSize,
},
});
textShapeList.push(text); // shape, 便
});
}
srcData.sort((a, b) => {
return new Date(a.date).getTime() - new Date(b.date).getTime();
});
let supData = srcData.filter((item) => item.type == "支持");
let oppData = srcData.filter((item) => item.type == "反对");
addFn(supData);
addFn(oppData);
};
const iniChart = function (config, srcData) {
chart = new window.F2.Chart({
id: "myChart",
...config,
});
const supColor = "#FFDA0E";
const oppColor = "#00E5ED";
chart.source(srcData, {
date: {
range: [0, 1],
type: "timeCat",
mask: "MM-DD",
},
value: {
// type: "linear",
},
});
//
chart.axis("date", {
line: {
lineWidth: 1,
stroke: "#E7EEEE",
},
label: {
fontWeight: 500,
fontSize,
fill: "#B5B7BF",
textBaseline: "middle",
},
labelOffset: 25,
country: {
range: [0.1, 0.9], // range 使
},
grid: null,
});
chart.axis("value", {
line: {
lineWidth: 1,
stroke: "#E7EEEE",
},
labelOffset: 20,
label: {
fontWeight: 500,
fontSize,
fill: "#B5B7BF",
},
});
//
chart.legend({
position: "bottom",
align: "center",
offsetY: -30,
custom: true,
nameStyle: {
fill: "#999",
fontWeight: 500,
fontSize,
},
itemWidth: 150,
wordSpace: 25,
items: [
{
name: "支持",
marker(x, y, r, ctx) {
ctx.lineWidth = 10;
ctx.strokeStyle = supColor;
ctx.moveTo(x - r - 15, y);
ctx.lineTo(x + r + 15, y);
ctx.stroke();
ctx.fill();
},
},
{
name: "反对",
marker(x, y, r, ctx) {
ctx.lineWidth = 10;
ctx.strokeStyle = oppColor;
ctx.moveTo(x - r - 15, y);
ctx.lineTo(x + r + 15, y);
ctx.stroke();
ctx.fill();
},
},
],
});
// 线
chart
.line()
.position("date*value")
.color("type", (type) => {
if (type === "支持") {
return supColor;
}
return oppColor;
})
.style("type", {
lineWidth: 1,
})
.animate();
chart.render();
addTextShape();
// chart return
return chart;
};
export default {
name: "chart",
props: {
list: {
type: Array,
default: () => {
return [];
},
},
config: {
type: Object,
default: () => {
return {};
},
},
},
data() {
return {
iniLoading: false,
};
},
watch: {
list(data) {
chart.changeData(data);
srcData = data;
addTextShape();
},
},
async created() {
await nextTick(200);
iniChart(this.config, this.list);
await nextTick(200);
this.iniLoading = true;
},
};
</script>
<style lang="scss" scoped></style>

15
src/views/modules/visual/cpts/tb.vue

@ -21,9 +21,12 @@
<span v-if="typeof item === 'string' || typeof item === 'number'">{{
item
}}</span>
<span v-if="typeof item === 'object' && item.type == 'index'">{{
index + 1
}}</span>
<div v-if="typeof item === 'object' && item.type == 'index'">
<img v-if="highlightTop3 && index==0" src="@/assets/img/shuju/top/1.png" alt="">
<img v-else-if="highlightTop3 && index==1" src="@/assets/img/shuju/top/2.png" alt="">
<img v-else-if="highlightTop3 && index==2" src="@/assets/img/shuju/top/3.png" alt="">
<span v-else>{{index + 1}}</span>
</div>
<a
v-else-if="typeof item === 'object' && item.type == 'operate'"
v-for="btn in item.list"
@ -43,7 +46,7 @@
<div class="table-status" v-if="list.length == 0 && !loading">
<div class="no-data">
<img
src="../../../../assets/img/modules/visual/noData.png"
src="@/assets/img/modules/visual/noData.png"
class="no-data-img"
/>
</div>
@ -109,6 +112,10 @@ export default {
type: Boolean,
default: true,
},
highlightTop3: {
type: Boolean,
default: false,
},
},
data() {
return {};

283
src/views/modules/visual/heart/index.vue

@ -0,0 +1,283 @@
<template>
<div class="g-cpt">
<div class="m-tb">
<cpt-card>
<div class="title">
<img src="@/assets/img/shuju/title-tip.png" />
<span>公益达人</span>
</div>
<div class="tb">
<cpt-tb
:highlight-top3="true"
:col-list="tb3.colList"
:loading="tb3.loading"
:header="tb3.header"
:list="tb3.list"
></cpt-tb>
</div>
</cpt-card>
</div>
<div class="m-tb">
<cpt-card>
<div class="title">
<img src="@/assets/img/shuju/title-tip.png" />
<span>党员先锋</span>
</div>
<div class="tb">
<cpt-tb
:highlight-top3="true"
:col-list="tb2.colList"
:loading="tb2.loading"
:header="tb2.header"
:list="tb2.list"
></cpt-tb>
</div>
</cpt-card>
</div>
<div class="m-tb">
<cpt-card>
<div class="title">
<img src="@/assets/img/shuju/title-tip.png" />
<span>动力网格</span>
</div>
<div class="tb">
<cpt-tb
:highlight-top3="true"
:col-list="tb1.colList"
:loading="tb1.loading"
:header="tb1.header"
:list="tb1.list"
></cpt-tb>
</div>
</cpt-card>
</div>
</div>
</template>
<script>
import { Loading } from "element-ui"; //Loading
import { requestPost } from "@/js/dai/request";
import cptCard from "@/views/modules/visual/cpts/card";
import cptTb from "@/views/modules/visual/cpts/tb";
export default {
name: "heart",
data() {
return {
agencyId: "",
areaCode: "",
// /
tb1: {
loading: true,
colList: [
{
align: "center",
width: "10%",
},
{
align: "center",
width: "60%",
},
{
align: "center",
width: "30",
},
],
header: ["序号", "网格名称", "活力值"],
list: [],
srcList: [],
currentIndex: 0,
},
// /
tb2: {
loading: true,
colList: [
{
align: "center",
width: "10%",
},
{
align: "center",
width: "30%",
},
{
align: "center",
width: "40%",
},
{
align: "center",
width: "20",
},
],
header: ["序号", "党员姓名", "所属网格", "积分总数"],
list: [],
srcList: [],
currentIndex: 0,
},
// /
tb3: {
loading: true,
colList: [
{
align: "center",
width: "10%",
},
{
align: "center",
width: "30%",
},
{
align: "center",
width: "40%",
},
{
align: "center",
width: "20",
},
],
header: ["序号", "居民姓名", "所属网格", "积分总数"],
list: [],
srcList: [],
currentIndex: 0,
},
};
},
props: {},
computed: {},
components: {
cptCard,
cptTb,
},
watch: {},
async mounted() {
this.userId = this.uid;
this.getApiData();
},
methods: {
handleSearch() {},
async getApiData() {
await this.getAgencyInfo();
this.getTb1();
this.getTb2();
this.getTb3();
},
toUserInfo(uid) {
this.$router.push({ path: `/main-shuju/visual-basicinfo-people/${uid}` });
},
//
async getAgencyInfo() {
const { data, code, msg } = await requestPost(
"/data/report/screen/agency/agencydetail-multic",
{
agencyId: this.$store.state.user.agencyId,
}
);
if (msg === "success" && code === 0) {
this.agencyId = data.agencyId;
this.areaCode = data.areaCode;
}
},
//
async getTb1() {
const { agencyId, areaCode } = this;
const url = "/data/report/screen/index/advancedbranchrank";
let params = {
agencyId,
areaCode,
orgType: "agency",
topNum: 50,
};
const { data, code, msg } = await requestPost(url, params);
this.tb1.loading = false;
if (code === 0) {
this.tb1.list = data.map((item) => {
return [{ type: "index" }, item.name, item.scroe];
});
this.tb1.srcList = data;
} else {
this.$message.error(msg);
}
},
//
async getTb2() {
const { agencyId, areaCode } = this;
const url = "/data/report/screen/user/partypointrank";
let params = {
orgId: agencyId,
areaCode,
orgType: "agency",
topNum: 50,
};
const { data, code, msg } = await requestPost(url, params);
this.tb2.loading = false;
if (code === 0) {
this.tb2.list = data.map((item) => {
return [
{ type: "index" },
item.userName,
item.gridName,
item.pointTotal,
];
});
this.tb2.srcList = data;
} else {
this.$message.error(msg);
}
},
//
async getTb3() {
const { agencyId, areaCode } = this;
const url = "/data/report/screen/user/userpointrank/withoutpartymember";
let params = {
orgId: agencyId,
areaCode,
orgType: "agency",
topNum: 50,
};
const { data, code, msg } = await requestPost(url, params);
this.tb3.loading = false;
if (code === 0) {
this.tb3.list = data.map((item) => {
return [
{ type: "index" },
item.userName,
item.gridName,
item.pointTotal,
];
});
this.tb3.srcList = data;
} else {
this.$message.error(msg);
}
},
},
};
</script>
<style lang="scss" src="@/assets/scss/modules/visual/heart.scss" scoped></style>
Loading…
Cancel
Save