Browse Source

Merge branch 'dev-用户反馈' into dev

dev-用户反馈
jiangyy 3 years ago
parent
commit
d3a6ab48ce
  1. 96
      package.json
  2. 1457
      src/views/modules/base/communityYantai/community.vue
  3. 176
      src/views/modules/base/communityYantai/cpts/agency-info.vue
  4. 176
      src/views/modules/base/communityYantai/cpts/grid-info.vue
  5. 535
      src/views/modules/base/communityYantai/cpts/map.vue
  6. 3
      src/views/modules/base/epidemic/antiInfo.vue
  7. 24
      src/views/modules/base/organization/organization.vue
  8. 193
      src/views/modules/base/userinfo/userInfoDetail.vue
  9. 407
      src/views/modules/base/userinfo/userInfoList.vue
  10. 4
      src/views/modules/communityParty/orgActivity/activivityList/addActivity.vue
  11. 826
      src/views/modules/communityService/fuwujilu/addForm.vue
  12. 484
      src/views/modules/communityService/fuwujilu/detailForm.vue
  13. 9
      src/views/modules/cpts/base/index.vue
  14. 170
      src/views/modules/renFangTongJi/index.vue
  15. 3
      src/views/modules/shequ/index.vue
  16. 665
      src/views/modules/shequzhili/event/cpts/process-form-demand.vue
  17. 83
      src/views/modules/shequzhili/htgl/cpts/htglInfo.vue
  18. 331
      src/views/modules/shequzhili/htgl/htgl.vue
  19. 440
      src/views/modules/workSys/feedbackDetail.vue
  20. 449
      src/views/modules/workSys/feedbackList.vue

96
package.json

@ -19,60 +19,60 @@
"@antv/l7": "2.9.14",
"@antv/l7-draw": "3.0.5",
"@antv/l7-maps": "2.9.14",
"@riophae/vue-treeselect": "^0.4.0",
"@tinymce/tinymce-vue": "^3.2.8",
"async-validator": "^4.2.5",
"axios": "^0.19.0",
"babel-eslint": "^8.0.1",
"babel-plugin-component": "^1.1.1",
"echarts": "^5.2.2",
"echarts-gl": "^2.0.9",
"@riophae/vue-treeselect": "0.4.0",
"@tinymce/tinymce-vue": "3.2.8",
"async-validator": "4.2.5",
"axios": "0.19.0",
"babel-eslint": "8.0.1",
"babel-plugin-component": "1.1.1",
"echarts": "5.2.2",
"echarts-gl": "2.0.9",
"element-theme": "2.0.1",
"element-ui": "2.13.2",
"file-saver": "^2.0.5",
"gulp-autoprefixer": "^6.1.0",
"gulp-clean-css": "^4.2.0",
"gulp-load-plugins": "^2.0.0",
"gulp-rename": "^1.4.0",
"gulp-sass": "^4.0.2",
"js-cookie": "^2.2.0",
"jsencrypt": "^3.0.3",
"lodash": "^4.17.15",
"mint-ui": "^2.2.13",
"node-sass": "^4.12.0",
"ol": "^6.9.0",
"portfinder": "^1.0.21",
"proj4": "^2.8.0",
"qs": "^6.7.0",
"quill": "^1.3.6",
"screenfull": "^4.2.1",
"sortablejs": "^1.12.0",
"svg-sprite-loader": "^4.1.6",
"throttle-debounce": "^3.0.1",
"v-distpicker": "^1.2.2",
"vue": "^2.6.11",
"vue-baidu-map": "^0.21.22",
"vue-i18n": "^8.12.0",
"vue-quill-editor": "^3.0.6",
"vue-router": "^3.0.7",
"vuex": "^3.1.1",
"xlsx": "^0.17.1"
"file-saver": "2.0.5",
"gulp-autoprefixer": "6.1.0",
"gulp-clean-css": "4.2.0",
"gulp-load-plugins": "2.0.0",
"gulp-rename": "1.4.0",
"gulp-sass": "4.0.2",
"js-cookie": "2.2.0",
"jsencrypt": "3.0.3",
"lodash": "4.17.15",
"mint-ui": "2.2.13",
"node-sass": "4.12.0",
"ol": "6.9.0",
"portfinder": "1.0.21",
"proj4": "2.8.0",
"qs": "6.7.0",
"quill": "1.3.6",
"screenfull": "4.2.1",
"sortablejs": "1.12.0",
"svg-sprite-loader": "4.1.6",
"throttle-debounce": "3.0.1",
"v-distpicker": "1.2.2",
"vue": "2.6.11",
"vue-baidu-map": "0.21.22",
"vue-i18n": "8.12.0",
"vue-quill-editor": "3.0.6",
"vue-router": "3.0.7",
"vuex": "3.1.1",
"xlsx": "0.17.1"
},
"devDependencies": {
"@antv/f2": "^3.8.10-beta.1",
"@antv/f2": "3.8.10-beta.1",
"@tinymce/tinymce-vue": "3.2.8",
"@vue/cli-plugin-babel": "^3.10.0",
"@vue/cli-plugin-eslint": "^3.10.0",
"@vue/cli-service": "^3.10.0",
"@vue/eslint-config-standard": "^4.0.0",
"dai-js": "^0.0.12",
"element-theme-chalk": "^2.13.0",
"natives": "^1.1.6",
"ol": "^6.9.0",
"sass-loader": "^7.3.1",
"script-loader": "^0.7.2",
"@vue/cli-plugin-babel": "3.10.0",
"@vue/cli-plugin-eslint": "3.10.0",
"@vue/cli-service": "3.10.0",
"@vue/eslint-config-standard": "4.0.0",
"dai-js": "0.0.12",
"element-theme-chalk": "2.13.0",
"natives": "1.1.6",
"ol": "6.9.0",
"sass-loader": "7.3.1",
"script-loader": "0.7.2",
"tinymce": "5.8.2",
"vue-template-compiler": "^2.6.11"
"vue-template-compiler": "2.6.11"
},
"eslintConfig": {
"root": true,

1457
src/views/modules/base/communityYantai/community.vue

File diff suppressed because it is too large

176
src/views/modules/base/communityYantai/cpts/agency-info.vue

@ -0,0 +1,176 @@
<template>
<div class="m-info">
<div class="btn-close" @click="off">
<svg class="icon-svg aui-navbar__icon-menu" aria-hidden="true">
<use xlink:href="#icon-close"></use>
</svg>
</div>
<div class="info">
<div class="title">{{ info.agencyName || '--' }}</div>
<div class="item">
<div class="field">组织区划</div>
<div class="value">{{ info.areaName || '--' }}</div>
</div>
<div class="item">
<div class="field">组织编码</div>
<div class="value">{{ info.areaCode || '--' }}</div>
</div>
<div class="item">
<div class="field">负责人</div>
<div class="value">{{ info.contacts || '--' }}</div>
</div>
<div class="item">
<div class="field">联系电话</div>
<div class="value">{{ info.mobile || '--' }}</div>
</div>
<div class="item">
<div class="field">组织简介</div>
<div class="value">{{ info.remark || '--' }}</div>
</div>
<div class="item" v-if="mapData">
<div class="field">管辖范围</div>
<div class="value-map">
<grid-map ref="map" :srcGridData="mapData" :pitch="0" />
</div>
</div>
</div>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import gridMap from "./map";
export default {
components: { gridMap },
props: {
agencyId: {
//
type: String,
default: "",
},
},
data() {
return {
info: {
agencyId: "", // ID
level: "",
agencyName: "",
areaCode: "",
areaName: "",
contacts: "",
mobile: "",
remark: "",
},
mapData: null,
displayed: false,
};
},
computed: {},
mounted() {
if (this.agencyId) {
this.getInfo();
this.getMapData();
}
},
watch: {
agencyId() {
this.mapData = null;
this.getInfo();
this.getMapData();
},
},
methods: {
off() {
this.$emit("close");
},
async getInfo() {
const url = "/gov/org/agency/agencydetail";
let params = {
agencyId: this.agencyId,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.info = data;
} else {
this.$message.error(msg);
}
},
async getMapData() {
const url = "/gov/org/agency/maporg";
let params = {
level: "agency",
orgId: this.agencyId,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
if (data.coordinates) {
this.mapData = data;
}
} else {
this.$message.error(msg);
}
},
},
};
</script>
<style lang="scss" scoped>
.m-info {
position: relative;
width: 300px;
background-color: #ffffff;
box-shadow: 0px 6px 16px 0px rgba(0, 0, 0, 0.08),
0px 3px 6px -4px rgba(0, 0, 0, 0.12);
padding: 15px;
.btn-close {
position: absolute;
top: 0;
right: 0;
font-size: 15px;
color: #aaaaaa;
padding: 15px;
cursor: pointer;
&:hover {
color: #666666;
}
}
.info {
.title {
font-size: 18px;
font-weight: bold;
line-height: 30px;
}
.item {
display: flex;
flex-wrap: wrap;
line-height: 24px;
.field {
width: 30%;
}
.value {
width: 70%;
}
.value-map {
width: 100%;
height: 200px;
}
}
}
}
</style>

176
src/views/modules/base/communityYantai/cpts/grid-info.vue

@ -0,0 +1,176 @@
<template>
<div class="m-info">
<div class="btn-close" @click="off">
<svg class="icon-svg aui-navbar__icon-menu" aria-hidden="true">
<use xlink:href="#icon-close"></use>
</svg>
</div>
<div class="info">
<div class="title">{{ info.gridName || '--' }}</div>
<div class="item">
<div class="field">组织区划</div>
<div class="value">{{ info.areaName || '--' }}</div>
</div>
<div class="item">
<div class="field">组织编码</div>
<div class="value">{{ info.areaCode || '--' }}</div>
</div>
<div class="item">
<div class="field">负责人</div>
<div class="value">{{ info.contacts || '--' }}</div>
</div>
<div class="item">
<div class="field">联系电话</div>
<div class="value">{{ info.mobile || '--' }}</div>
</div>
<div class="item">
<div class="field">网格简介</div>
<div class="value">{{ info.remark || '--' }}</div>
</div>
<div class="item" v-if="mapData">
<div class="field">管辖范围</div>
<div class="value-map">
<grid-map ref="map" :srcGridData="mapData" :pitch="0" />
</div>
</div>
</div>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import gridMap from "./map";
export default {
components: { gridMap },
props: {
gridId: {
//
type: String,
default: "",
},
},
data() {
return {
info: {
gridId: "", // ID
level: "",
gridName: "",
areaCode: "",
areaName: "",
contacts: "",
mobile: "",
remark: "",
},
mapData: null,
displayed: false,
};
},
computed: {},
mounted() {
if (this.gridId) {
this.getInfo();
this.getMapData();
}
},
watch: {
gridId() {
this.mapData = null;
this.getInfo();
this.getMapData();
},
},
methods: {
off() {
this.$emit("close");
},
async getInfo() {
const url = "/gov/org/grid/griddetail";
let params = {
gridId: this.gridId,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.info = data;
} else {
this.$message.error(msg);
}
},
async getMapData() {
const url = "/gov/org/agency/maporg";
let params = {
level: "grid",
orgId: this.gridId,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
if (data.coordinates) {
this.mapData = data;
}
} else {
this.$message.error(msg);
}
},
},
};
</script>
<style lang="scss" scoped>
.m-info {
position: relative;
width: 300px;
background-color: #ffffff;
box-shadow: 0px 6px 16px 0px rgba(0, 0, 0, 0.08),
0px 3px 6px -4px rgba(0, 0, 0, 0.12);
padding: 15px;
.btn-close {
position: absolute;
top: 0;
right: 0;
font-size: 15px;
color: #aaaaaa;
padding: 15px;
cursor: pointer;
&:hover {
color: #666666;
}
}
.info {
.title {
font-size: 18px;
font-weight: bold;
line-height: 30px;
}
.item {
display: flex;
flex-wrap: wrap;
line-height: 24px;
.field {
width: 30%;
}
.value {
width: 70%;
}
.value-map {
width: 100%;
height: 200px;
}
}
}
}
</style>

535
src/views/modules/base/communityYantai/cpts/map.vue

@ -0,0 +1,535 @@
<template>
<div class="m-map" :class="{ 'z-td': mapType == 'td' }">
<div id="map"></div>
</div>
</template>
<script>
import nextTick from "dai-js/tools/nextTick";
import {
Scene,
PolygonLayer,
LineLayer,
RasterLayer,
PointLayer,
} from "@antv/l7";
import { GaodeMap, Map } from "@antv/l7-maps";
import { spliceIntoChunks } from "@/utils/index";
import { mapType, searchNearby } from "@/utils/dai-map";
import tdtWp from "@/utils/tdt-wp";
import tdtWpZw from "@/utils/tdt-wp-zw";
let myMap;
let scene;
let polygonLayer;
let lineLayer;
let textLayer;
let posLayer;
let circleLayer;
export default {
name: "l7",
inject: ["refresh"],
data() {
return {
mapType,
mapStyleType: "light",
// srcGridData: {},
darkStyle: {
style: "amap://styles/blue",
polygonColor: [
"rgba(255, 100, 60, 0.5)",
"rgba(43, 231, 253, 0.35)",
"rgba(255, 255, 50, 0.35)",
],
lineColor: [
"rgba(255, 180, 150, 0.9)",
"rgba(43, 231, 253, 0.7)",
"rgba(255, 255, 50, 0.7)",
],
circleColor: [
"rgba(255, 180, 150, 0.99)",
"rgba(43, 231, 253, 0.99)",
"rgba(255, 255, 50, 0.99)",
],
textColor: [
"rgba(255, 100, 60, 0.99)",
"rgba(43, 231, 253, 0.99)",
"rgba(255, 255, 50, 0.99)",
],
textStrokeColor: "#fff",
},
lightStyle: {
style: "amap://styles/whitesmoke",
polygonColor: [
"rgba(255, 100, 60, 0.3)",
"rgba(43, 231, 253, 0.3)",
"rgba(255, 255, 50, 0.3)",
],
lineColor: [
"rgba(220, 150, 120, 0.9)",
"rgba(33, 201, 223, 0.8)",
"rgba(200, 200, 50, 0.9)",
],
circleColor: [
"rgba(255, 180, 150, 0.99)",
"rgba(13, 181, 203, 0.8)",
"rgba(255, 255, 50, 0.99)",
],
textColor: [
"rgba(200, 50, 10, 0.99)",
"rgba(0, 130, 153, 0.99)",
"rgba(120, 120, 0, 0.99)",
],
textStrokeColor: "#666",
},
};
},
props: {
pitch: {
type: Number,
default: 60,
},
srcGridData: {
type: Object,
default: null,
},
},
components: {},
async mounted() {
//
window._AMapSecurityConfig = {
securityJsCode: "92ea2c965c6cf1ba7ee3a8fe01449ef2",
};
this.iniMap();
},
computed: {
polygonData() {
const { srcGridData } = this;
if (srcGridData.coordinates == "") {
return { type: "FeatureCollection", features: [] };
}
const polygon = [
...[srcGridData]
.filter((item) => item.coordinates.length > 0)
.map((item) => ({
type: "Feature",
properties: {
// id: item.id,
// name: item.name,
// level: item.level,
center: [item.longitude, item.latitude],
...item,
},
geometry: {
type: "Polygon",
coordinates: [
spliceIntoChunks(
item.coordinates
.split(",")
.map((item) => parseFloat(item)),
2
).filter((item) => item.length == 2),
],
},
})),
];
return { type: "FeatureCollection", features: polygon };
},
polygonDotData() {
const { srcGridData } = this;
if (srcGridData.coordinates == "") {
return { type: "FeatureCollection", features: [] };
}
const polygon = [
...[srcGridData]
.filter((item) => item.coordinates.length > 0)
.map((item) => ({
type: "Feature",
properties: {
// id: item.id,
// name: item.name,
// level: item.level,
center: [item.longitude, item.latitude],
...item,
},
geometry: {
type: "Polygon",
coordinates: [
item.latitude
? [[item.longitude, item.latitude]]
: spliceIntoChunks(
item.coordinates
.split(",")
.map((item) =>
parseFloat(item)
),
2
).filter((item) => item.length == 2),
],
},
})),
];
return { type: "FeatureCollection", features: polygon };
},
},
watch: {
srcGridData(val, oldValue) {
if (oldValue == null) {
this.iniMap();
} else {
this.updateGrid();
}
this.zoomInABit();
},
dotList(val, oldValue) {
this.updateDot();
},
dotList2(val, oldValue) {
this.updateDot();
},
},
methods: {
iniMap() {
const { darkStyle, lightStyle, srcGridData } = this;
if (!srcGridData) return false;
let styleConfig = darkStyle;
if (this.mapStyleType == "light") {
styleConfig = lightStyle;
}
const iniCenter = [
srcGridData.longitude ||
this.$store.state.user.longitude ||
116.39743841556731,
srcGridData.latitude ||
this.$store.state.user.latitude ||
39.9088810666821,
];
if (mapType != "qq") {
myMap = new Map({
center: iniCenter,
zoom: 18,
});
} else {
myMap = new GaodeMap({
pitch: this.pitch,
style: styleConfig.style,
center: iniCenter,
token: "fc14b42e0ca18387866d68ebd4f150c1",
zoom: 18,
isHotspot: false,
resizeEnable: true,
doubleClickZoom: false,
});
}
scene = new Scene({
id: "map",
logoVisible: false,
map: myMap,
});
scene.on("loaded", async () => {
if (mapType == "td") {
this.iniMapBase(scene);
} else if (mapType == "tdzw") {
this.iniMapBase2(scene);
}
this.iniMapGrid(scene);
await nextTick(0);
this.zoomInABit();
});
},
//
iniMapBase(scene) {
console.log("-----------------iniMapBase");
//
const baseLayer = new RasterLayer({
zIndex: 1,
});
baseLayer
.source(
"http://t7.tianditu.com/DataServer?T=vec_w&tk=8a08c117ab9ee45d508686b01cc8d397&x={x}&y={y}&l={z}",
{
parser: {
type: "rasterTile",
tileSize: 256,
// minZoom: 6,
// maxZoom: 15,
zoomOffset: 0,
},
}
)
.style({
opacity: 0.7,
});
//
const annotionLayer = new RasterLayer({
zIndex: 2,
});
annotionLayer
.source(
"http://t7.tianditu.com/DataServer?T=cva_w&tk=8a08c117ab9ee45d508686b01cc8d397&x={x}&y={y}&l={z}",
{
parser: {
type: "rasterTile",
tileSize: 256,
// minZoom: 6,
// maxZoom: 15,
zoomOffset: 0,
},
}
)
.style({
opacity: 0.5,
});
scene.addLayer(baseLayer);
scene.addLayer(annotionLayer);
},
//
iniMapBase2(scene) {
console.log("-----------------iniMapBase");
//
const baseLayer = new RasterLayer({
zIndex: 1,
});
baseLayer
.source(tdtWpZw.vec, {
parser: {
type: "rasterTile",
tileSize: 256,
zoomOffset: 0,
},
})
.style({
opacity: 0.7,
});
scene.addLayer(baseLayer);
},
iniMapGrid(scene) {
const { darkStyle, lightStyle, polygonData, polygonDotData } = this;
let styleConfig = darkStyle;
if (this.mapStyleType == "light") {
styleConfig = lightStyle;
}
console.log("地图初始化数据", polygonData);
polygonLayer = new PolygonLayer({
autoFit: true,
})
// .size(0)
.source(polygonData)
.color("name", styleConfig.polygonColor)
// .shape("extrude")
.shape("fill")
.style({
opacityLinear: {
enable: true, // true - false
dir: "out", // in - out
},
opacity: 1,
// heightfixed: true,
// pickLight: true,
raisingHeight: 0,
// sourceColor: "#333",
// targetColor: "rgba(255,255,255, 0.5)",
});
scene.addLayer(polygonLayer);
lineLayer = new LineLayer({
zIndex: 2,
name: "line2",
})
.source(polygonData)
.shape("line")
.size(1)
.color("name", styleConfig.lineColor)
.style({
opacity: 1,
})
.animate({
interval: 1, //
duration: 2, //
trailLength: 2, // 线
});
scene.addLayer(lineLayer);
circleLayer = new PolygonLayer({
zIndex: 3,
})
.source(polygonDotData)
.color("name", styleConfig.circleColor)
.shape("circle")
.active(true)
.animate(true)
.size(50)
.style({
offsets: [0, -10], // [, ]
opacity: 1,
});
scene.addLayer(circleLayer);
scene.addImage(
"pos-red",
require("@/assets/img/shuju/grid/pos-red.png")
);
scene.addImage(
"pos-green",
require("@/assets/img/shuju/grid/pos-green.png")
);
scene.addImage(
"pos-yellow",
require("@/assets/img/shuju/grid/pos-yellow.png")
);
posLayer = new PolygonLayer({
zIndex: 4,
})
.source(polygonDotData)
.shape("name", ["pos-red", "pos-green", "pos-yellow"])
.size(12)
.style({
offsets: [0, 8], // [, ]
// rotation: 60,
// layerType: "fillImage",
});
scene.addLayer(posLayer);
textLayer = new PolygonLayer({
zIndex: 20,
})
.source(polygonDotData)
.color("name", styleConfig.textColor)
.shape("name", "text")
.size(16)
.style({
textAnchor: "center", // center|left|right|top|bottom|top-left
textOffset: [0, 40], // [, ]
spacing: 2, //
padding: [2, 2], // padding []
stroke: styleConfig.textStrokeColor, //
strokeWidth: 0.1, //
strokeOpacity: 0.8,
textAllowOverlap: true,
})
.active(true);
scene.addLayer(textLayer);
polygonLayer.on("mousemove", (e) => {
polygonLayer.style({
raisingHeight: 0,
});
});
polygonLayer.on("click", (e) => {
console.log(e.feature.properties);
this.$emit("clickAgency", e.feature.properties);
});
polygonLayer.on("unmousemove", (e) => {
polygonLayer.style({
raisingHeight: 0,
});
});
},
//
zoomInABit() {
let current = scene.getZoom();
scene.setZoomAndCenter(current + 0.5);
},
shiftMapStyle(type) {
this.mapStyleType = type;
localStorage.setItem("mapStyle", type);
this.refresh();
},
updateMap() {
this.updateGrid();
},
updateGrid() {
const { polygonData, polygonDotData } = this;
if (polygonLayer) {
polygonLayer.setData(polygonData);
lineLayer.setData(polygonData);
textLayer.setData(polygonDotData);
posLayer.setData(polygonDotData);
circleLayer.setData(polygonDotData);
}
},
},
};
</script>
<style lang="scss" scoped>
.m-map {
position: relative;
height: 100%;
border-radius: 10px;
overflow: hidden;
&.z-td {
#app {
/deep/ .l7-scene {
canvas {
background-color: rgba(43, 51, 73, 0.82);
background-image: radial-gradient(
rgba(0, 0, 0, 0),
rgba(0, 0, 0, 0.3),
#000
);
}
.gray {
-webkit-filter: grayscale(100%);
filter: grayscale(100%);
opacity: 0.7;
}
}
}
}
#map {
width: 100%;
height: 100%;
}
.btn {
position: absolute;
bottom: 0;
left: 0;
width: 100px;
line-height: 36px;
height: 36px;
text-align: center;
color: #ffffff;
font-size: 14px;
background-color: rgba(#000, 0.2);
cursor: pointer;
}
}
</style>

3
src/views/modules/base/epidemic/antiInfo.vue

@ -293,6 +293,7 @@
:close-on-press-escape="false"
:title="formTitle"
width="1150px"
:z-index="2000"
top="5vh"
class="dialog-h"
@closed="handleCnalceForm">
@ -878,7 +879,7 @@ export default {
let params = {
id
}
// this.$message.error('111')
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {

24
src/views/modules/base/organization/organization.vue

@ -15,12 +15,10 @@
<el-link v-if="index === breadcrumbArr.length - 1"
type="primary"
@click.native="modifyOrgInfo"
style="
margin-left: 10px;
margin-top: 0px;
color: #3e8ef7;
cursor: pointer;
"
style=" margin-left: 10px;
margin-top: 0px;
color: #3e8ef7;
cursor: pointer;"
icon="el-icon-edit">修改</el-link>
</el-breadcrumb-item>
</el-breadcrumb>
@ -714,6 +712,17 @@
<el-input v-model="OrgDetailsForm.mobile"
placeholder="请输入联系电话"></el-input>
</el-form-item>
<el-form-item label="社区简介">
<el-input
type="textarea"
v-model="OrgDetailsForm.remark"
placeholder="请输入内容"
resize="none"
rows=3
show-word-limit
>
</el-input>
</el-form-item>
<el-form-item label="坐标">
<div id="con"></div>
</el-form-item>
@ -1036,6 +1045,7 @@ export default {
areaCode: "",
agencyId: "",
areaName: "",
remark:""
},
//
OrgUnitDetailsForm: {
@ -2413,6 +2423,7 @@ export default {
this.OrgDetailsForm.centerAddress = data.centerAddress;
this.OrgDetailsForm.areaCode = data.areaCode;
this.OrgDetailsForm.mobile = data.mobile;
this.OrgDetailsForm.remark = data.remark;
this.latitude = data.latitude;
this.longitude = data.longitude;
this.OrgDetailsForm.agencyId = data.agencyId;
@ -2479,6 +2490,7 @@ export default {
mobile: this.OrgDetailsForm.mobile,
code: this.OrgDetailsForm.code,
latitude: this.latitude,
remark:this.OrgDetailsForm.remark,
longitude: this.longitude,
};

193
src/views/modules/base/userinfo/userInfoDetail.vue

@ -0,0 +1,193 @@
<template>
<div class="epidemic-form">
<div class="dialog-h-content scroll-h">
<!-- <div v-if="view_real_data"
class="div_tuomin">
<el-button size="mini"
class="diy-button--search"
@click="handleTuomin">显示脱敏信息</el-button>
</div> -->
<div v-if="initLoading"
class="m-row">
<div class="m-info">
<div class="info-prop">
<span class="info-title-2">姓名</span>
<span>{{ formData.realName||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">昵称</span>
<span>{{ formData.nickname||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">证件号</span>
<span>{{ formData.idNum||'--' }}</span>
</div>
<div v-if="!isXiaozhaizi"
class="info-prop">
<span class="info-title-2">路牌号</span>
<span>{{ formData.street||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">小区名称</span>
<span>{{ formData.district||'--' }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">详细地址</span>
<span>{{ formData.buildingAddress||'--' }}</span>
</div>
<div class="info-prop"
v-if="formData.headImgUrl">
<span class="info-title-2">头像</span>
<div class="info-pics">
<img style="width:80px;height:80px"
:src="formData.headImgUrl"
@click="watchImg(formData.headImgUrl)">
</div>
</div>
</div>
</div>
</div>
<div class="div-btn">
<el-button size="small"
@click="handleCancle"> </el-button>
<!-- <el-button v-if="formType != 'detail'"
size="small"
type="primary"
:disabled="btnDisable"
@click="handleComfirm"> </el-button> -->
</div>
</div>
</template>
<script>
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
import { dateFormats } from '@/utils/index'
let loading //
export default {
data () {
return {
initLoading: false,
formData: {},
fileList: [],
}
},
components: {},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
},
methods: {
async handleTuomin () {
const url = "/data/aggregator/epmetuser/detailByType";
const { data, code, msg } = await requestPost(url, {
id: this.icNatId,
type: "natRecord",
});
if (code === 0) {
this.$set(this.formData, 'showMobile', data.mobile)
this.$set(this.formData, 'showIdCard', data.idCard)
} else {
this.$message.error(msg);
}
},
async initForm (row) {
this.startLoading()
this.formData.agencyId = this.agencyId
this.formData = JSON.parse(JSON.stringify(row));
this.initLoading = true
this.endLoading()
},
handleCancle () {
// this.resetData()
this.$emit('dialogCancle')
},
watchImg (src) {
window.open(src);
},
resetData () {
this.formData = {}
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
},
props: {
view_real_data: {//
type: Boolean,
default: false,
},
isXiaozhaizi: {
type: Boolean,
default: false
},
},
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/detail-main.scss";
.div_tuomin {
position: absolute;
top: 0;
right: 40px;
z-index: 1000;
}
</style>

407
src/views/modules/base/userinfo/userInfoList.vue

@ -0,0 +1,407 @@
<template>
<div class="div_main">
<div class="div_search">
<el-form :inline="true"
:model="formData"
ref="ref_searchform"
:label-width="'80px'">
<div>
<el-form-item label="所属组织"
prop="gridId">
<el-cascader class="customer_cascader"
size="small"
ref="myCascader"
v-model="agencyIdArray"
:options="orgOptions"
:props="orgOptionProps"
:show-all-levels="false"
@change="handleChangeAgency"></el-cascader>
</el-form-item>
<el-form-item label="注册时间"
prop="regStartTime">
<el-date-picker v-model="formData.regStartTime"
:picker-options="startPickerOptions"
class="item_width_2"
size="small"
type="date"
value-format="yyyyMMdd"
placeholder="开始时间">
</el-date-picker>
<span class="data-tag"></span>
<el-date-picker v-model="formData.regEndTime"
:picker-options="endPickerOptions"
class="item_width_2 data-tag"
size="small"
type="date"
value-format="yyyyMMdd"
placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-form-item label="姓名"
prop="name">
<el-input v-model="formData.name"
size="small"
class="item_width_2"
clearable
placeholder="请输入姓名">
</el-input>
</el-form-item>
<el-button style="margin-left:30px"
size="small"
class="diy-button--search"
@click="handleSearch">查询</el-button>
<el-button style="margin-left:10px"
size="small"
class="diy-button--reset"
@click="resetSearch">重置</el-button>
</div>
</el-form>
</div>
<div class="div_table">
<el-table :data="tableData"
border
v-loading="tableLoading"
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
class="table"
style="width: 100%"
:height="maxTableHeight">
<el-table-column label="序号"
fixed="left"
type="index"
align="center"
width="50" />
<el-table-column prop="realName"
min-width="100"
align="center"
label="姓名"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="nickname"
min-width="100"
align="center"
label="昵称"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="imageList"
align="center"
width="80"
label="头像">
<template slot-scope="scope">
<el-image v-if="scope.row.headImgUrl"
style="width: 40px; height: 40px"
:src="scope.row.headImgUrl">
</el-image>
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="showIdNum"
label="证件号"
min-width="170"
align="center"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="street"
align="center"
min-width="170"
label="路牌号"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="district"
align="center"
min-width="170"
label="小区名称"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="buildingAddress"
align="center"
min-width="170"
label="详细地址"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column fixed="right"
label="操作"
align="center"
width="100">
<template slot-scope="scope">
<el-button @click="handleWatch(scope.row)"
type="text"
size="small">查看</el-button>
</template>
</el-table-column>
</el-table>
<div>
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="pageNo"
:page-sizes="[20, 50, 100, 200]"
:page-size="parseInt(pageSize)"
layout="sizes, prev, pager, next, total"
:total="total">
</el-pagination>
</div>
</div>
<!-- 修改弹出框 -->
<el-dialog :visible.sync="detailShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'信息详情'"
width="650px"
top="5vh"
class="dialog-h"
@closed="detailFormCancle">
<user-info-detail ref="ref_form_detail"
@dialogCancle="detailFormCancle"></user-info-detail>
</el-dialog>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import { mapGetters } from "vuex";
import userInfoDetail from './userInfoDetail'
import axios from "axios";
export default {
components: { userInfoDetail },
data () {
let endDisabledDate = (time) => {//datareturn
let nowData = Date.now()
if (this.formData.regStartTime) {
let regStartTime = new Date(this.formData.regStartTime)
return time.getTime() > nowData || time.getTime() < regStartTime || time.getTime() === regStartTime
} else {
return time.getTime() > nowData
}
}
let startDisabledDate = (time) => {//datareturn
let nowData = Date.now()
return time.getTime() > nowData
}
return {
tableLoading: false,
user: {},
agencyIdArray: [],
orgOptions: [],
orgOptionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
children: 'subAgencyList',
checkStrictly: true
},
tableData: [],
formData: {
agencyId: '',//id
gridId: '',
regStartTime: '',//
regEndTime: '',//
name: ''
},
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
endPickerOptions: {
disabledDate: endDisabledDate
},
startPickerOptions: {
disabledDate: startDisabledDate
},
eventId: '',
eventDetailData: {},
detailShow: false,
};
},
computed: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 320 + this.iframeHeigh
: this.clientHeight - 320;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
watch: {
// "formData.regEndTime": function (val) {
// if (val && val != '') {
// let arrayTemp = val.split(' ')
// this.formData.regEndTime = arrayTemp[0] + ' 23:59:59'
// }
// },
},
mounted () {
console.log(this.$store.state)
this.user = this.$store.state.user
this.formData.agencyId = this.user.agencyId
this.getOrgTreeList();
this.getTableData();
},
methods: {
handleChangeAgency (val) {
let obj = this.$refs["myCascader"].getCheckedNodes()[0].data
if (obj) {
if (obj.level === 'grid') {
this.formData.gridId = this.agencyIdArray.length > 0 ? this.agencyIdArray[this.agencyIdArray.length - 1] : '';
this.formData.agencyId = ''
} else {
this.formData.agencyId = this.agencyIdArray.length > 0 ? this.agencyIdArray[this.agencyIdArray.length - 1] : '';
this.formData.gridId = ''
}
} else {
this.formData.agencyId = this.user.agencyId
this.formData.gridId = ''
}
},
handleSearch (val) {
console.log(this.formData);
this.pageNo = 1;
this.getTableData();
},
getOrgTreeList () {
const { user } = this.$store.state
this.$http
.post('/gov/org/customeragency/agencygridtree', {})
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
} else {
console.log('获取组织树成功', res.data)
this.orgOptions = []
this.orgOptions.push(res.data)
}
})
.catch(() => {
return this.$message.error('网络错误')
})
},
async handleWatch (row) {
this.detailShow = true
this.$nextTick(() => {
this.$refs.ref_form_detail.initForm(row)
})
},
replayOk () {
this.detailShow = false
this.getTableData()
},
detailFormCancle () {
this.detailShow = false
},
async getTableData () {
this.tableLoading = true
const url = "/epmetuser/userbaseinfo/page-reguser";
// const url = "http://yapi.elinkservice.cn/mock/245/gov/project/icEvent/list";
const { pageSize, pageNo, formData } = this;
const { data, code, msg } = await requestPost(url, {
pageSize,
pageNo,
...formData,
});
this.tableLoading = false
if (code === 0) {
this.total = data.total || 0;
this.tableData = data.list
} else {
this.$message.error(msg);
}
},
handleSizeChange (val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange (val) {
this.pageNo = val;
this.getTableData();
},
resetSearch () {
this.agencyIdArray = []
this.formData = {
agencyId: this.user.agencyId,//id id
gridId: '',
regStartTime: '',//
regEndTime: '',//
name: ''
}
this.pageNo = 1
this.getTableData();
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
@import "@/assets/scss/modules/management/list-main.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
.div_search {
.item_width_2 {
width: 200px;
}
}
.myNote {
display: -webkit-box;
text-overflow: ellipsis;
overflow: hidden;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
</style>

4
src/views/modules/communityParty/orgActivity/activivityList/addActivity.vue

@ -171,14 +171,14 @@
</div>
<!-- <div class="div_btn">
<div class="div_btn">
<el-button size="small"
@click="handleCancle"> </el-button>
<el-button size="small"
type="primary"
:disabled="btnDisable"
@click="handleComfirm"> </el-button>
</div> -->
</div>
</div>
</template>

826
src/views/modules/communityService/fuwujilu/addForm.vue

File diff suppressed because it is too large

484
src/views/modules/communityService/fuwujilu/detailForm.vue

@ -1,511 +1,377 @@
<template>
<div>
<div class="dialog-h-content scroll-h">
<div v-if="initLoading"
class="m-row">
<div v-if="initLoading" class="m-row">
<div class="m-info">
<div class="info-prop">
<span class="info-title-2">服务名称</span>
<span>{{ formData.serviceName||'--' }}</span>
<span>{{ formData.serviceName || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">服务组织</span>
<span>{{ serviceOrgName||'--' }}</span>
<span>{{ serviceOrgName || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">服务范围</span>
<span>{{ formData.gridIdListName ||'--' }}</span>
<span>{{ formData.gridIdListName || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">政策依据</span>
<span>{{ formData.policyTitle||'--' }}</span>
<el-button v-if="formData.policyId"
style="margin-left: 10px"
type="primary"
size="small"
@click="handlePersonList">预览</el-button>
<span>{{ formData.policyTitle || "--" }}</span>
<el-button
v-if="formData.policyId"
style="margin-left: 10px"
type="primary"
size="small"
@click="handlePersonList"
>预览</el-button
>
</div>
<div class="info-prop">
<span class="info-title-2">经办人</span>
<span>{{ formData.principalName||'--' }}</span>
<span>{{ formData.principalName || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">联系方式</span>
<span>{{ formData.principalContact||'--' }}</span>
<span>{{ formData.principalContact || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">服务时间</span>
<span>{{ formData.serviceTimeStart||'--' }}</span>
<span>{{ formData.serviceTimeEnd||'--' }}</span>
<span>{{ formData.serviceTimeStart || "--" }}</span
>
<span>{{ formData.serviceTimeEnd || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">备注</span>
<span>{{ formData.remark||'--' }}</span>
<span>{{ formData.remark || "--" }}</span>
</div>
<div v-show="formData.serviceStatus==='completed'">
<div v-show="formData.serviceStatus === 'completed'">
<h3 class="d-h3">反馈内容</h3>
<div class="info-prop">
<span class="info-title-2">服务目标</span>
<span>{{ feedbackFormData.serviceGoal||'--' }}</span>
<span>{{ feedbackFormData.serviceGoal || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">服务效果</span>
<span>{{ feedbackFormData.serviceEffect||'--' }}</span>
<span>{{ feedbackFormData.serviceEffect || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">服务人数</span>
<span>{{ feedbackFormData.servicePeopleNumber||0 }}</span>
<span>{{ feedbackFormData.servicePeopleNumber || 0 }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">服务状态</span>
<span>{{ feedbackFormData.serviceStatusShow||'--' }}</span>
<span>{{ feedbackFormData.serviceStatusShow || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">满意度</span>
<span>{{ feedbackFormData.satisfactionShow||'--' }}</span>
<span>{{ feedbackFormData.satisfactionShow || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">地理位置</span>
<span>{{ feedbackFormData.address||'--' }}</span>
<span>{{ feedbackFormData.address || "--" }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">地图位置</span>
<div class="div_map">
<div id="app_detail"></div>
</div>
</div>
<div class="info-prop">
<span class="info-title-2">附件</span>
<file-list v-if="fileList.length>0"
:fileList="fileList"></file-list>
<file-list
v-if="fileList.length > 0"
:fileList="fileList"
></file-list>
<span v-else>--</span>
</div>
</div>
</div>
</div>
</div>
<div class="div-btn">
<el-button size="small"
@click="handleCancle"> </el-button>
<el-button size="small" @click="handleCancle"> </el-button>
</div>
<el-dialog v-if="showPersonList"
:visible.sync="showPersonList"
:append-to-body="true"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'政策预览'"
width="1150px"
top="5vh"
class="dialog-h"
@closed="showPersonList = false">
<person-list ref="ref_detail_form"
:policyId="policyId"
:ruleList="ruleList"
@handleOk="handleOk"
@handleClose="handleClose">
<el-dialog
v-if="showPersonList"
:visible.sync="showPersonList"
:append-to-body="true"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'政策预览'"
width="1150px"
top="5vh"
class="dialog-h"
@closed="showPersonList = false"
>
<person-list
ref="ref_detail_form"
:policyId="policyId"
:ruleList="ruleList"
@handleOk="handleOk"
@handleClose="handleClose"
>
</person-list>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
import { mapGetters } from "vuex";
import { Loading } from "element-ui"; // Loading
import { requestPost } from "@/js/dai/request";
import personList from "../policy/personList";
import fileList from '@/views/components/fileList'
import fileList from "@/views/components/fileList";
import daiMap from "@/utils/dai-map";
var map;
let loading; //
var map
var search
var markers
var infoWindowList
var geocoder //
let loading //
export default {
data () {
data() {
return {
initLoading: false,
keyWords: '',
keyWords: "",
formData: {},
feedbackFormData: {
serviceProjectId: '',// id
serviceName: '',
serviceGoal: '',//
serviceEffect: '',//
servicePeopleNumber: null,//
serviceStatus: 'completed',// in_servicecompleted:
satisfaction: '',//:bad:good:perfect
longitude: '',//
latitude: '',//
address: '',
fileList: [],//
serviceProjectId: "", // id
serviceName: "",
serviceGoal: "", //
serviceEffect: "", //
servicePeopleNumber: null, //
serviceStatus: "completed", // in_servicecompleted:
satisfaction: "", //:bad:good:perfect
longitude: "", //
latitude: "", //
address: "",
fileList: [], //
},
policyId: "",
showPersonList: false,
ruleList: [],
policyList: [],
}
};
},
components: { personList, fileList },
async mounted () {
await this.getPolicyList()
async mounted() {
await this.getPolicyList();
// if (this.serviceRecordId) {//
await this.loadInfo()
this.initLoading = true
await this.loadInfo();
this.initLoading = true;
if (this.formData.serviceStatus === 'completed') {
if (
this.formData.serviceStatus === "completed" &&
this.feedbackFormData.latitude
) {
this.$nextTick(() => {
this.initMap()
})
this.initMap();
});
}
},
methods: {
diaDestroy () {
if (map) {
map.destroy()
}
},
diaDestroy() {},
//
async handlePersonList () {
async handlePersonList() {
if (!this.formData.policyId) {
this.$message.info('请先选择政策')
return false
this.$message.info("请先选择政策");
return false;
}
this.policyId = this.formData.policyId
await this.loadRuleList()
this.policyId = this.formData.policyId;
await this.loadRuleList();
this.showPersonList = true;
},
async loadRuleList () {
async loadRuleList() {
const url = "/heart/policy/rulelist/" + this.policyId;
const url = "/heart/policy/rulelist/" + this.policyId
let params = {};
let params = {}
const { data, code, msg } = await requestPost(url, params)
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.ruleList = data
this.ruleList = data;
} else {
this.$message.error(msg)
this.$message.error(msg);
}
},
handleClose () {
this.showPersonList = false
handleClose() {
this.showPersonList = false;
},
async getPolicyList() {
const url = "/heart/policy/policyListSelect";
async getPolicyList () {
const url = '/heart/policy/policyListSelect'
let params = {}
let params = {};
const { data, code, msg } = await requestPost(url, params)
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.policyList = data
this.policyList = data;
} else {
this.$message.error(msg)
this.$message.error(msg);
}
},
//
async loadInfo () {
const url = '/heart/icServiceRecordV2/detail'
async loadInfo() {
const url = "/heart/icServiceRecordV2/detail";
let params = {
serviceRecordId: this.serviceRecordId
}
serviceRecordId: this.serviceRecordId,
};
const { data, code, msg } = await requestPost(url, params)
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.formData = { ...data }
this.formData.serviceRecordId = this.serviceRecordId
this.feedbackFormData = { ...data.feedback }
this.formData.policyName = ''
this.formData.gridIdListName = ''
this.feedbackFormData.serviceStatusShow = ''
this.feedbackFormData.satisfactionShow = ''
let arr = []
this.formData.gridIdList.forEach(element => {
arr.push(element.objectName)
this.formData = { ...data };
this.formData.serviceRecordId = this.serviceRecordId;
this.feedbackFormData = { ...data.feedback };
this.formData.policyName = "";
this.formData.gridIdListName = "";
this.feedbackFormData.serviceStatusShow = "";
this.feedbackFormData.satisfactionShow = "";
let arr = [];
this.formData.gridIdList.forEach((element) => {
arr.push(element.objectName);
});
this.formData.gridIdListName = arr.join(',')
this.statusArray.forEach(element => {
this.formData.gridIdListName = arr.join(",");
this.statusArray.forEach((element) => {
if (this.formData.serviceStatus === element.value) {
this.feedbackFormData.serviceStatusShow = element.label
this.feedbackFormData.serviceStatusShow = element.label;
}
});
this.satisfyArray.forEach(element => {
this.satisfyArray.forEach((element) => {
if (this.feedbackFormData.satisfaction === element.value) {
this.feedbackFormData.satisfactionShow = element.label
this.feedbackFormData.satisfactionShow = element.label;
}
});
this.policyList.forEach(element => {
this.policyList.forEach((element) => {
if (this.formData.policyId === element.policyId) {
this.formData.policyName = element.title
this.formData.policyName = element.title;
}
});
this.fileList = []
if (data.feedback && data.feedback.fileList && data.feedback.fileList.length > 0) {
data.feedback.fileList.forEach(element => {
this.fileList = [];
if (
data.feedback &&
data.feedback.fileList &&
data.feedback.fileList.length > 0
) {
data.feedback.fileList.forEach((element) => {
let obj = {
name: element.name,
format: element.format,
url: element.url,
type: element.type
}
this.fileList.push(obj)
type: element.type,
};
this.fileList.push(obj);
});
}
} else {
this.$message.error(msg)
this.$message.error(msg);
}
},
handleCancle () {
this.resetData()
this.$emit('diaDetailClose')
handleCancle() {
this.resetData();
this.$emit("diaDetailClose");
},
// init
initMap () {
//
let { latitude, longitude } = this.$store.state.user;
console.log('lat' + latitude + ',lon' + longitude)
if (this.formData.latitude && this.formData.longitude) {
latitude = this.formData.latitude
longitude = this.formData.longitude
}
if (!latitude || latitude == "" || latitude == "0") {
latitude = 39.9088810666821;
longitude = 116.39743841556731;
}
var center = new window.TMap.LatLng(latitude, latitude)
// map TMap.Map()
map = new window.TMap.Map(document.getElementById('app_detail'), {
center: center, //
zoom: 17.2, //
pitch: 43.5, //
rotation: 45 //
})
search = new window.TMap.service.Search({ pageSize: 10 })
//
markers = new TMap.MultiMarker({
map: map,
geometries: []
})
infoWindowList = Array(10)
geocoder = new TMap.service.Geocoder(); //
//
map.on('panend', () => {
this.handleMoveCenter()
})
this.handleMoveCenter()
this.convert()
},
initMap() {
let { latitude, longitude } = this.feedbackFormData;
setMarker (lat, lng) {
markers.setGeometries([])
markers.add([
map = new daiMap(
document.getElementById("app_detail"),
{ latitude, longitude },
{
id: '4',
styleId: 'marker',
position: new TMap.LatLng(lat, lng),
properties: {
title: 'marker4'
}
zoom: 16.2, //
pitch: 43.5, //
rotation: 45, //
}
])
},
);
handleSearchMap () {
infoWindowList.forEach((infoWindow) => {
infoWindow.close()
})
infoWindowList.length = 0
markers.setGeometries([])
//
search
.searchRectangle({
keyword: this.keyWords,
bounds: map.getBounds()
})
.then((result) => {
let { data } = result
if (Array.isArray(data) && data.length > 0) {
const {
location: { lat, lng }
} = data[0]
map.setCenter(new TMap.LatLng(lat, lng))
this.setMarker(lat, lng)
this.formData.latitude = lat
this.formData.longitude = lng
this.convert()
} else {
this.$message.error('未检索到相关位置坐标')
}
})
},
handleMoveCenter () {
//
const center = map.getCenter()
const lat = center.getLat()
const lng = center.getLng()
this.formData.latitude = lat
this.formData.longitude = lng
this.setMarker(lat, lng)
this.convert(lat, lng)
map.setCenter(latitude, longitude);
map.setMarker(latitude, longitude);
},
convert (lat, lng) {
markers.setGeometries([]);
// var input = document.getElementById('location').value.split(',');
let location
if (lat && lng) {
location = new TMap.LatLng(lat, lng);
} else {
location = new TMap.LatLng(this.formData.latitude, this.formData.longitude);
}
// map.setCenter(location);
markers.updateGeometries([
{
id: 'main', //
position: location,
},
]);
geocoder
.getAddress({ location: location }) //
.then((result) => {
this.formData.address = result.result.address
//
});
},
handleOk () {
this.showPersonList = false
handleOk() {
this.showPersonList = false;
},
resetData () {
this.formData = {}
resetData() {
this.formData = {};
},
//
startLoading () {
startLoading() {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
text: "正在加载……", //
background: "rgba(0,0,0,.7)", //
});
},
//
endLoading () {
endLoading() {
// clearTimeout(timer);
if (loading) {
loading.close()
loading.close();
}
}
},
},
computed: {
dataRule () {
dataRule() {
return {
serviceTimeStart: [
{ required: true, message: '服务时间不能为空', trigger: 'blur' }
{ required: true, message: "服务时间不能为空", trigger: "blur" },
],
}
};
},
},
props: {
serviceRecordId: {
type: String,
required: true
required: true,
},
serviceOrgName: {
type: String,
required: true
required: true,
},
satisfyArray: {
type: Array,
default () {
return []
}
default() {
return [];
},
},
statusArray: {
type: Array,
default () {
return []
}
default() {
return [];
},
},
}
}
},
};
</script>
<style lang="scss" scoped >
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/detail-main.scss";
</style>
</style>

9
src/views/modules/cpts/base/index.vue

@ -123,6 +123,7 @@
<el-table ref="ref_table"
:data="tableData"
border
:empty-text="loadInfo"
:header-cell-style="{ background: '#2195FE', color: '#FFFFFF' }"
class="table"
style="width: 100%"
@ -386,6 +387,7 @@ export default {
data () {
return {
tableData: [],
loadInfo: '',
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
@ -741,6 +743,7 @@ export default {
},
async getTableData () {
this.loadInfo = '数据加载中'
const { tableUrl: url } = this;
if (!url) return;
@ -754,6 +757,12 @@ export default {
if (code === 0) {
this.total = data.total || 0;
this.tableData = data.list ? this.cookTableData(data.list) : [];
if (this.tableData.length === 0) {
this.loadInfo = '暂无数据'
} else {
this.loadInfo = ''
}
} else {
this.$message.error(msg);
}

170
src/views/modules/renFangTongJi/index.vue

@ -1,107 +1,86 @@
<template>
<el-card class="g-cnt">
<div class="m-cards">
<div
class="item"
:key="item.name"
@click="handleClickCard(item)"
v-for="item in list"
>
<div class="item"
:key="item.name"
@click="handleClickCard(item)"
v-for="item in list">
<div class="item-left">
<div class="num">{{ item.num }}</div>
<div class="name">{{ item.name }}</div>
</div>
<div class="item-right">
<!-- <div class="item-right">
<div class="hint">
<div class="hint-title">较上月</div>
<b v-if="item.variation >= 0">+ {{ item.variationAbs }}</b>
<b v-else>- {{ item.variationAbs }}</b>
</div>
</div>
</div> -->
</div>
</div>
<div class="m-tb">
<h3>下级平台使用进度汇总</h3>
<el-table
:data="tableData"
border
style="width: 100%"
class="tb"
:height="maxTableHeight"
align="center"
>
<el-table-column label="序号" type="index" align="center" width="50" />
<el-table-column
prop="orgName"
label="所属组织"
width="150"
align="center"
>
<el-table :data="tableData"
border
style="width: 100%"
class="tb"
:empty-text="loadInfo"
:height="maxTableHeight"
align="center">
<el-table-column label="序号"
type="index"
align="center"
width="50" />
<el-table-column prop="orgName"
label="所属组织"
width="150"
align="center">
</el-table-column>
<el-table-column
prop="usingCommunityNum"
label="开通平台社区数"
align="center"
>
<el-table-column prop="usingCommunityNum"
label="开通平台社区数"
align="center">
<template slot-scope="scope">
<a style="cursor: pointer" @click="showDetail(scope.row.orgId)">{{
<a style="cursor: pointer"
@click="showDetail(scope.row.orgId)">{{
scope.row.usingCommunityNum
}}</a>
</template>
</el-table-column>
<el-table-column
prop="userTotal"
label="人口总数"
align="center"
></el-table-column>
<el-table-column
prop="czUserTotal"
label="常住人口总数"
align="center"
></el-table-column>
<el-table-column
prop="ldUserTotal"
label="流动人口总数"
align="center"
></el-table-column>
<el-table-column
prop="houseTotal"
label="房屋总数"
align="center"
></el-table-column>
<el-table-column
prop="zzHouseTotal"
label="自住房屋总数"
align="center"
></el-table-column>
<el-table-column
prop="czHouseTotal"
label="出租房屋总数"
align="center"
></el-table-column>
<el-table-column
prop="xzHouseTotal"
label="闲置房屋总数"
align="center"
></el-table-column>
<el-table-column prop="userTotal"
label="人口总数"
align="center"></el-table-column>
<el-table-column prop="czUserTotal"
label="常住人口总数"
align="center"></el-table-column>
<el-table-column prop="ldUserTotal"
label="流动人口总数"
align="center"></el-table-column>
<el-table-column prop="houseTotal"
label="房屋总数"
align="center"></el-table-column>
<el-table-column prop="zzHouseTotal"
label="自住房屋总数"
align="center"></el-table-column>
<el-table-column prop="czHouseTotal"
label="出租房屋总数"
align="center"></el-table-column>
<el-table-column prop="xzHouseTotal"
label="闲置房屋总数"
align="center"></el-table-column>
</el-table>
</div>
<!-- 修改弹出框 -->
<el-dialog
v-if="displayedDetail"
:visible="true"
title="社区列表 "
width="1150px"
top="5vh"
@close="displayedDetail = false"
>
<shequtongji
ref="shequtongji"
:orgId="detailOrgId"
:orgIds="[orgId, detailOrgId]"
/>
<el-dialog v-if="displayedDetail"
:visible="true"
title="社区列表 "
width="1150px"
top="5vh"
@close="displayedDetail = false">
<shequtongji ref="shequtongji"
:orgId="detailOrgId"
:orgIds="[orgId, detailOrgId]" />
</el-dialog>
</el-card>
</template>
@ -115,10 +94,12 @@ import shequtongji from "./cpts/shequtongji";
export default {
name: "renFangTongJi",
components: { shequtongji },
data() {
data () {
return {
displayedDetail: false,
tableData: [],
tableLoading: false,
loadInfo: '',
orgId: "",
orgType: "",
@ -185,35 +166,35 @@ export default {
};
},
computed: {
maxTableHeight() {
maxTableHeight () {
return this.clientHeight - 420;
},
...mapGetters(["clientHeight"]),
},
watch: {
orgId() {
orgId () {
this.getTableData();
},
},
mounted() {
mounted () {
this.getCommunityData();
this.getResiData();
this.getHouseData();
this.getTableData();
},
methods: {
handleClickCard(item) {
handleClickCard (item) {
if (item.name == "开通平台社区数") {
this.showDetail();
}
},
async showDetail(orgId = "") {
async showDetail (orgId = "") {
this.displayedDetail = true;
this.detailOrgId = orgId;
},
async getCommunityData() {
async getCommunityData () {
const url = "/gov/org/agency/usingCommunityStats";
const { data, code, msg } = await requestPost(url, {
@ -230,7 +211,7 @@ export default {
}
},
async getResiData() {
async getResiData () {
const url = "/epmetuser/icresiuser/userchart";
const { data, code, msg } = await requestPost(url, {
@ -257,7 +238,7 @@ export default {
}
},
async getHouseData() {
async getHouseData () {
const url = "/gov/org/house/housechart";
const { data, code, msg } = await requestPost(url, {
@ -286,7 +267,9 @@ export default {
}
},
async getTableData() {
async getTableData () {
this.loadInfo = '数据加载中'
this.tableLoading = true
const url = "/gov/org/house/subuserhouselist";
const { data, code, msg } = await requestPost(url, {
@ -297,9 +280,17 @@ export default {
if (code === 0) {
this.tableData = data
? data.map((item) => {
return item;
})
return item;
})
: [];
if (this.tableData.length === 0) {
this.loadInfo = '暂无数据'
} else {
this.loadInfo = ''
}
}
},
},
@ -318,6 +309,7 @@ export default {
.item {
display: flex;
justify-content: center;
width: 24%;
margin-top: 15px;
// margin-right: 1%;

3
src/views/modules/shequ/index.vue

@ -823,7 +823,8 @@ export default {
});
}
});
return selectedFuncIdList.map((id) => obj[id]);
console.log('88888888888888888', selectedFuncIdList)
return selectedFuncIdList.filter((id) => obj[id]).map((id) => obj[id]);
},
maxTableHeight() {
// return this.clientHeight - 450;

665
src/views/modules/shequzhili/event/cpts/process-form-demand.vue

@ -1,10 +1,12 @@
<template>
<div class="">
<el-form ref="ref_form"
:inline="false"
:model="formData"
:rules="dataRule"
label-width="100px">
<el-form
ref="ref_form"
:inline="false"
:model="formData"
:rules="dataRule"
label-width="100px"
>
<!-- <el-form-item label="事件分类"
label-width="150px"
prop="categoryId">
@ -17,105 +19,124 @@
:show-all-levels="false"
@change="handleChangeCate"></el-cascader>
</el-form-item> -->
<el-form-item label="服务内容"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="content">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.content"
:autosize="{ minRows: 2, maxRows: 10 }"
type="textarea"
clearable
class="cell-width-area"
placeholder="请输入内容"></el-input>
<el-form-item
label="服务内容"
label-width="150px"
:class="{ 'form-item': source === 'visiual' }"
prop="content"
>
<div :class="{ 'visiual-form': source === 'visiual' }">
<el-input
v-model="formData.content"
:autosize="{ minRows: 2, maxRows: 10 }"
type="textarea"
clearable
class="cell-width-area"
placeholder="请输入内容"
></el-input>
</div>
</el-form-item>
<el-form-item label="服务类型"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="categoryCode">
<div :class="{'visiual-form':source==='visiual'}">
<el-cascader v-model="formData.categoryCode"
:options="demandOptions"
clearable
class="cell-width-1"
@change="handleCateSlect"></el-cascader>
<el-form-item
label="服务类型"
label-width="150px"
:class="{ 'form-item': source === 'visiual' }"
prop="categoryCode"
>
<div :class="{ 'visiual-form': source === 'visiual' }">
<el-cascader
v-model="formData.categoryCode"
:options="demandOptions"
clearable
class="cell-width-1"
@change="handleCateSlect"
></el-cascader>
</div>
</el-form-item>
<el-form-item label="服务时间"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="wantServiceTime">
<div :class="{'visiual-form':source==='visiual'}">
<el-date-picker v-model="formData.wantServiceTime"
type="datetime"
class="cell-width-1"
clearable
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期时间">
<el-form-item
label="服务时间"
label-width="150px"
:class="{ 'form-item': source === 'visiual' }"
prop="wantServiceTime"
>
<div :class="{ 'visiual-form': source === 'visiual' }">
<el-date-picker
v-model="formData.wantServiceTime"
type="datetime"
class="cell-width-1"
clearable
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="选择日期时间"
>
</el-date-picker>
</div>
</el-form-item>
<el-form-item label="需求人"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="demandUserName">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.demandUserName"
class="cell-width-1"></el-input>
<el-form-item
label="需求人"
label-width="150px"
:class="{ 'form-item': source === 'visiual' }"
prop="demandUserName"
>
<div :class="{ 'visiual-form': source === 'visiual' }">
<el-input
v-model="formData.demandUserName"
class="cell-width-1"
></el-input>
</div>
</el-form-item>
<el-form-item label="联系电话"
label-width="150px"
:class="{'form-item':source==='visiual'}"
prop="demandUserMobile">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.demandUserMobile"
class="cell-width-1"></el-input>
<el-form-item
label="联系电话"
label-width="150px"
:class="{ 'form-item': source === 'visiual' }"
prop="demandUserMobile"
>
<div :class="{ 'visiual-form': source === 'visiual' }">
<el-input
v-model="formData.demandUserMobile"
class="cell-width-1"
></el-input>
</div>
</el-form-item>
<el-form-item label="服务地点"
prop="serviceLocation"
:class="{'form-item':source==='visiual'}"
label-width="150px"
style="display: block">
<div :class="{'visiual-form':source==='visiual'}">
<el-input class="cell-width-1"
v-model="formData.serviceLocation">
<el-form-item
label="服务地点"
prop="serviceLocation"
:class="{ 'form-item': source === 'visiual' }"
label-width="150px"
style="display: block"
>
<div :class="{ 'visiual-form': source === 'visiual' }">
<el-input class="cell-width-1" v-model="formData.serviceLocation">
</el-input>
</div>
</el-form-item>
<el-form-item label="位置坐标"
:class="{'form-item':source==='visiual'}"
prop="longitude"
label-width="150px"
style="display: block">
<div style="width:500px">
<el-form-item
label="位置坐标"
:class="{ 'form-item': source === 'visiual' }"
prop="longitude"
label-width="150px"
style="display: block"
>
<div style="width: 500px">
<div class="div_map">
<div id="app_map">
</div>
<div id="app_map"></div>
<div class="div_searchmap">
<el-input class="cell-width-map"
maxlength="50"
size="mini"
placeholder="请输入关键字"
v-model="keyWords">
<el-input
class="cell-width-map"
maxlength="50"
size="mini"
placeholder="请输入关键字"
v-model="keyWords"
>
</el-input>
<el-button style="margin-left: 10px"
type="primary"
size="mini"
@click="handleSearchMap">查询</el-button>
<el-button
style="margin-left: 10px"
type="primary"
size="mini"
@click="handleSearchMap"
>查询</el-button
>
</div>
</div>
@ -136,103 +157,108 @@
</div>
</el-form-item>
<el-form-item label="门牌号"
:class="{'form-item':source==='visiual'}"
label-width="150px"
prop="locationDetail">
<div :class="{'visiual-form':source==='visiual'}">
<el-input v-model="formData.locationDetail"
class="cell-width-1"></el-input>
<el-form-item
label="门牌号"
:class="{ 'form-item': source === 'visiual' }"
label-width="150px"
prop="locationDetail"
>
<div :class="{ 'visiual-form': source === 'visiual' }">
<el-input
v-model="formData.locationDetail"
class="cell-width-1"
></el-input>
</div>
</el-form-item>
<el-form-item label="服务方"
:class="{'form-item':source==='visiual'}"
label-width="150px"
prop="serverId">
<el-form-item
label="服务方"
:class="{ 'form-item': source === 'visiual' }"
label-width="150px"
prop="serverId"
>
<template>
<div :class="[{'single-select':source==='visiual'},'sel-service']">
<el-select v-model="formData.serviceType"
class="cell-width-1"
placeholder="请选择"
clearable
@change="handleServiceChange('add', $event)">
<el-option v-for="item in serviceOptions"
:key="item.value"
:label="item.label"
:value="item.value">
<div
:class="[{ 'single-select': source === 'visiual' }, 'sel-service']"
>
<el-select
v-model="formData.serviceType"
class="cell-width-1"
placeholder="请选择"
clearable
@change="handleServiceChange('add', $event)"
>
<el-option
v-for="item in serviceOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
-
<el-select v-model="formData.serverId"
class="cell-width-1"
filterable
placeholder="请选择"
clearable>
<el-option v-for="item in serviceOptiondList"
:key="item.value"
:label="item.label"
:value="item.value">
<el-select
v-model="formData.serverId"
class="cell-width-1"
filterable
placeholder="请选择"
clearable
>
<el-option
v-for="item in serviceOptiondList"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</div>
</template>
</el-form-item>
</el-form>
</div>
</template>
<script>
import { Loading } from "element-ui"; // Loading
import { requestPost } from "@/js/dai/request";
import formVltHelper from "dai-js/tools/formVltHelper";
import { isCard } from "@/utils/validate";
import daiMap from "@/utils/dai-map";
let loading; //
var map
var search
var markers
var infoWindowList
var geocoder //
var map;
function iniFmData () {
function iniFmData() {
return {
operationType: '2',//[0: 1: 2:]
icEventId: '',//Id
gridId: '',//
categoryCode: '',//
parentCode: '',//
content: '',// 1000
reportType: 'self_help',// communitybuilding_caption;party;self_help
reportUserName: '',//
reportUserMobile: '',//
reportTime: '',//
demandUserId: '',// user.idic_resi_user.id
demandUserName: '',//
demandUserMobile: '',//
wantServiceTime: '',//
serviceType: '',
serverId: '',
locationDetail: '',
serviceLocation: '',//
latitude: '',//
longitude: '',//
operationType: "2", //[0: 1: 2:]
icEventId: "", //Id
gridId: "", //
categoryCode: "", //
parentCode: "", //
content: "", // 1000
reportType: "self_help", // communitybuilding_caption;party;self_help
reportUserName: "", //
reportUserMobile: "", //
reportTime: "", //
demandUserId: "", // user.idic_resi_user.id
demandUserName: "", //
demandUserMobile: "", //
wantServiceTime: "", //
serviceType: "",
serverId: "",
locationDetail: "",
serviceLocation: "", //
latitude: "", //
longitude: "", //
// categoryId: ''
};
}
export default {
data () {
data() {
return {
btnDisable: false,
customerId: localStorage.getItem("customerId"),
demandOptions: [],
serviceOptions: [
],
serviceOptions: [],
serviceOptiondList: [],
casOptions: [],
@ -241,25 +267,25 @@ export default {
selCateObj: {},
optionProps: {
multiple: false,
value: 'id',
label: 'name',
children: 'subCategory',
value: "id",
label: "name",
children: "subCategory",
},
formData: iniFmData(),
okflag: false,
//
keyWords: '',
keyWords: "",
eventDetailCopy: {}
eventDetailCopy: {},
};
},
components: {},
computed: {
dataRule () {
computed: {
dataRule() {
return {
// categoryId: [
// { required: true, message: "", trigger: "blur" },
@ -285,14 +311,11 @@ export default {
serverId: [
{ required: true, message: "服务方不能为空", trigger: "blur" },
],
};
},
},
props: {
props: {
demandUserId: {
type: String,
default: "",
@ -312,156 +335,142 @@ export default {
eventDetailData: {
type: Object,
default () {
return {}
}
default() {
return {};
},
},
source: {//manage visiual
source: {
//manage visiual
type: String,
default: 'manage'
}
default: "manage",
},
},
watch: {
demandUserName: function (val) {
this.formData.reportUserName = val
this.formData.demandUserName = val
this.formData.reportUserName = val;
this.formData.demandUserName = val;
},
demandUserMobile: function (val) {
this.formData.reportUserMobile = val
this.formData.demandUserMobile = val
this.formData.reportUserMobile = val;
this.formData.demandUserMobile = val;
},
demandUserId: function (val) {
this.formData.demandUserId = val
this.formData.demandUserId = val;
},
},
created () {
},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
this.getCategoryList();
this.getDemandOptions();
this.getServiceOption()
// this.formData = { ...this.formDataTemp }
this.initMap()
async mounted() {
const { user } = this.$store.state;
this.agencyId = user.agencyId;
if (this.eventId) {
this.eventDetailCopy = JSON.parse(JSON.stringify(this.eventDetailData));
this.formData.reportUserMobile = this.eventDetailCopy.mobile
this.formData.reportUserName = this.eventDetailCopy.name
this.formData.reportTime = this.eventDetailCopy.happenTime
this.formData.gridId = this.eventDetailCopy.gridId
this.formData.demandUserId = this.eventDetailCopy.reportUserId
this.formData.demandUserName = this.eventDetailCopy.name
this.formData.demandUserMobile = this.eventDetailCopy.mobile
if (this.eventDetailCopy.parentCategoryId && this.eventDetailCopy.categoryId) {
this.formData.reportUserMobile = this.eventDetailCopy.mobile;
this.formData.reportUserName = this.eventDetailCopy.name;
this.formData.reportTime = this.eventDetailCopy.happenTime;
this.formData.gridId = this.eventDetailCopy.gridId;
this.formData.demandUserId = this.eventDetailCopy.reportUserId;
this.formData.demandUserName = this.eventDetailCopy.name;
this.formData.demandUserMobile = this.eventDetailCopy.mobile;
if (
this.eventDetailCopy.parentCategoryId &&
this.eventDetailCopy.categoryId
) {
// this.selCategoryArray = []
// this.selCategoryArray.push(this.eventDetailCopy.parentCategoryId)
// this.selCategoryArray.push(this.eventDetailCopy.categoryId)
// this.formData.categoryId = this.eventDetailCopy.categoryId
// this.selCateObj = {
// name: this.eventDetailCopy.categoryName,
// id: this.eventDetailCopy.categoryId
// }
}
} else {
this.formData.demandUserName = this.demandUserName
this.formData.demandUserMobile = this.demandUserMobile
this.formData.demandUserId = this.demandUserId
this.formData.demandUserName = this.demandUserName;
this.formData.demandUserMobile = this.demandUserMobile;
this.formData.demandUserId = this.demandUserId;
}
this.getCategoryList();
this.getDemandOptions();
this.getServiceOption();
this.initMap();
},
methods: {
async getCategoryList() {
const url = "/gov/issue/issueprojectcategorydict/list";
async getCategoryList () {
const url = "/gov/issue/issueprojectcategorydict/list"
let params = {};
let params = {}
const { data, code, msg } = await requestPost(url, params)
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
let treeDataNew = this.filterTree(data)
let treeDataNew = this.filterTree(data);
//
++this.iscascaderShow
this.casOptions = []
this.casOptions = treeDataNew
++this.iscascaderShow;
this.casOptions = [];
this.casOptions = treeDataNew;
} else {
this.$message.error(msg)
this.$message.error(msg);
}
},
handleChangeCate () {
console.log(this.$refs["myCascader"].getCheckedNodes()[0].data)
this.selCateObj = this.$refs["myCascader"].getCheckedNodes()[0].data
this.formData.categoryId = this.selCateObj.id
handleChangeCate() {
console.log(this.$refs["myCascader"].getCheckedNodes()[0].data);
this.selCateObj = this.$refs["myCascader"].getCheckedNodes()[0].data;
this.formData.categoryId = this.selCateObj.id;
},
//
filterTree (arr) {
let childs = arr
filterTree(arr) {
let childs = arr;
for (let i = childs.length; i--; i > 0) {
if (childs[i].subCategory) {
if (childs[i].subCategory.length) {
this.filterTree(childs[i].subCategory)
this.filterTree(childs[i].subCategory);
} else {
delete childs[i].subCategory
delete childs[i].subCategory;
}
}
}
return arr
return arr;
},
async getDemandOptions () {
const url = "/heart/icresidemanddict/demandoption"
let params = {}
async getDemandOptions() {
const url = "/heart/icresidemanddict/demandoption";
let params = {};
const { data, code, msg } = await requestPost(url, params)
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.demandOptions = this.getFlagData(
this.getTreeData(data),
"usableFlag"
);
} else {
this.$message.error(msg)
this.$message.error(msg);
}
},
async getServiceOption () {
const url = "/sys/dict/data/dictlist"
let params = { dictType: "user_demand_service_type", }
async getServiceOption() {
const url = "/sys/dict/data/dictlist";
let params = { dictType: "user_demand_service_type" };
const { data, code, msg } = await requestPost(url, params)
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.serviceOptions = data;
} else {
this.$message.error(msg)
this.$message.error(msg);
}
},
getTreeData (data) {
getTreeData(data) {
if (!Array.isArray(data)) return [];
let arr = data.map((item) => {
let _item = {};
@ -476,7 +485,8 @@ export default {
});
return arr;
},
getFlagData (data, flag) {
getFlagData(data, flag) {
if (!Array.isArray(data)) return [];
let arr1 = data.filter((item) => item[flag]);
let arr2 = arr1.map((item) => {
@ -488,7 +498,7 @@ export default {
return arr2;
},
handleCateSlect (val) {
handleCateSlect(val) {
console.log("val", val);
if (val.length === 1) {
this.demandOptions.forEach((item) => {
@ -501,7 +511,7 @@ export default {
}
},
handleServiceChange (type, val) {
handleServiceChange(type, val) {
if (val === "social_org") {
if (type === "add") {
this.getServiceuserList(val, "add_demand");
@ -513,8 +523,7 @@ export default {
}
},
async getServiceuserList (serviceType, query) {
async getServiceuserList(serviceType, query) {
if (!serviceType) return false;
const { demandUserId } = this.formData;
const params = {
@ -523,154 +532,83 @@ export default {
queryPurpose: query,
};
const url = "/heart/userdemand/servicelist";
const url = "/heart/userdemand/servicelist"
const { data, code, msg } = await requestPost(url, params)
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.serviceOptiondList = data.filter(
(item) => item.value != demandUserId
);
} else {
this.$message.error(msg)
this.$message.error(msg);
}
},
async getDemandInfo () {
this.okflag = false
async getDemandInfo() {
this.okflag = false;
this.$refs["ref_form"].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj);
// this.formData.categoryId = this.selCateObj.id
} else {
this.okflag = true
this.okflag = true;
}
});
},
resetData() {},
resetData () {
},
// init
initMap () {
//
var center = new window.TMap.LatLng(36.0722275, 120.38945519)
// map TMap.Map()
map = new window.TMap.Map(document.getElementById('app_map'), {
center: center, //
zoom: 17.2, //
pitch: 43.5, //
rotation: 45 //
})
search = new window.TMap.service.Search({ pageSize: 10 })
//
markers = new TMap.MultiMarker({
map: map,
geometries: []
})
infoWindowList = Array(10)
geocoder = new TMap.service.Geocoder(); //
//
map.on('panend', () => {
this.handleMoveCenter()
})
this.handleMoveCenter()
this.convert()
},
initMap() {
let { latitude, longitude } = this.$store.state.user;
setMarker (lat, lng) {
markers.setGeometries([])
markers.add([
map = new daiMap(
document.getElementById("app_map"),
{ latitude, longitude },
{
id: '4',
styleId: 'marker',
position: new TMap.LatLng(lat, lng),
properties: {
title: 'marker4'
}
zoom: 16.2, //
pitch: 43.5, //
rotation: 45, //
}
])
},
);
handleSearchMap () {
infoWindowList.forEach((infoWindow) => {
infoWindow.close()
})
infoWindowList.length = 0
markers.setGeometries([])
//
search
.searchRectangle({
keyword: this.keyWords,
bounds: map.getBounds()
})
.then((result) => {
let { data } = result
if (Array.isArray(data) && data.length > 0) {
const {
location: { lat, lng }
} = data[0]
map.setCenter(new TMap.LatLng(lat, lng))
this.setMarker(lat, lng)
this.formData.latitude = lat
this.formData.longitude = lng
this.convert()
} else {
this.$message.error('未检索到相关位置坐标')
}
})
//
map.on("dragend", (e) => {
this.handleMoveCenter(e);
});
map.setCenter(latitude, longitude);
map.setMarker(latitude, longitude);
},
handleMoveCenter () {
async handleMoveCenter() {
//
const center = map.getCenter()
const lat = center.getLat()
const lng = center.getLng()
this.formData.latitude = lat
this.formData.longitude = lng
this.setMarker(lat, lng)
this.convert(lat, lng)
const { lat, lng } = map.getCenter();
this.formData.latitude = lat;
this.formData.longitude = lng;
map.setMarker(lat, lng);
let { msg, data } = await map.getAddress(lat, lng);
if (msg == "success") {
this.formData.address = data.address;
}
},
convert (lat, lng) {
markers.setGeometries([]);
// var input = document.getElementById('location').value.split(',');
let location
if (lat && lng) {
location = new TMap.LatLng(lat, lng);
async handleSearchMap() {
const { msg, data } = await map.searchNearby(this.keyWords);
if (msg == "success") {
const { lat, lng } = data;
map.setCenter(lat, lng);
map.setMarker(lat, lng);
this.formData.latitude = lat;
this.formData.longitude = lng;
} else {
location = new TMap.LatLng(this.formData.latitude, this.formData.longitude);
this.$message.error("未检索到相关位置坐标");
}
// map.setCenter(location);
markers.updateGeometries([
{
id: 'main', //
position: location,
},
]);
geocoder
.getAddress({ location: location }) //
.then((result) => {
this.formData.serviceLocation = result.result.address
//
});
},
//
startLoading () {
startLoading() {
loading = Loading.service({
lock: true, //
text: "正在加载……", //
@ -678,7 +616,7 @@ export default {
});
},
//
endLoading () {
endLoading() {
// clearTimeout(timer);
if (loading) {
loading.close();
@ -688,14 +626,11 @@ export default {
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
@import "@/assets/scss/modules/visual/a_customize.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
</style>
<style>
.el-dialog__body {
padding: 0 10px 20px !important;

83
src/views/modules/shequzhili/htgl/cpts/htglInfo.vue

@ -0,0 +1,83 @@
<template>
<div>
<div class="">
<el-row type="flex" >
<el-col :span="24">
<span class="htgl_info_label">所属网格:</span> {{htglDetailData.gridName||'--'}}
</el-col>
</el-row>
<el-row type="flex" >
<el-col :span="24" style="display: flex;">
<span class="htgl_info_label">话题内容:</span> <section style="flex:1">{{htglDetailData.topicContent||'--'}}</section>
</el-col>
</el-row>
<el-row type="flex" >
<el-col :span="24" style="display: flex;">
<span class="img_label">图片:</span>
<section v-for="(item,index) in htglDetailData.topicImages" :key="index" >
<img :src="item" alt="" width="150px" height="75px" style="margin-left:16px;" />
</section>
</el-col>
</el-row>
<el-row type="flex" >
<el-col :span="24">
<span class="htgl_info_label">话题发表人:</span> {{htglDetailData.releaseUserName||'--'}}
</el-col>
</el-row>
<el-row type="flex" >
<el-col :span="24">
<span class="htgl_info_label">发布时间:</span> {{htglDetailData.releaseTime||'--'}}
</el-col>
</el-row>
<el-row type="flex" >
<el-col :span="24">
<span class="htgl_info_label">当前支持:</span>{{htglDetailData.supportCount||'--'}},反对: {{htglDetailData.oppositionCount||'--'}}
</el-col>
</el-row>
</div>
</div>
</template>
<script>
export default {
data() {
return {};
},
props:{
htglDetailData:{
type:Object,
default:{}
},
topicId:{
type:String,
default:''
}
},
created() {},
methods: {},
components: {},
computed: {},
watch: {},
};
</script>
<style lang="scss" scoped>
.img_label{
display: inline-block;
height: 75px;
vertical-align: top;
width: 90px;
text-align: right;
margin-right: 6px;
}
.htgl_info_label{
display: inline-block;
width: 90px;
text-align: right;
margin-right: 6px;
}
</style>

331
src/views/modules/shequzhili/htgl/htgl.vue

@ -0,0 +1,331 @@
<template>
<div class="div_main">
<div class="div_search">
<el-form
:inline="true"
:model="formData"
ref="ref_searchform"
:label-width="'100px'"
>
<div>
<el-form-item label="所属组织" prop="orgId" >
<el-cascader
class="item_width_2"
ref="myCascader"
size="small"
v-model="agencyIdArray"
:options="orgOptions"
:props="orgOptionProps"
:show-all-levels="false"
></el-cascader>
</el-form-item>
<el-form-item label="话题内容" prop="topicContent">
<el-input
class="item_width_2"
size="small"
v-model="formData.topicContent"
clearable
placeholder="请输入"
>
</el-input>
</el-form-item>
<el-form-item label="话题发表人" prop="userName">
<el-input
class="item_width_2"
size="small"
v-model="formData.userName"
clearable
placeholder="请输入"
>
</el-input>
</el-form-item>
<el-form-item label="发布时间" prop="startTime">
<el-date-picker v-model="formData.startDate"
class="item_width_2"
size="small"
type="date"
value-format="yyyy-MM-dd"
value="yyyy-MM-dd"
placeholder="开始时间">
</el-date-picker>
<span class="data-tag"></span>
<el-date-picker v-model="formData.endDate"
class="item_width_2 data-tag"
size="small"
type="date"
value-format="yyyy-MM-dd"
value="yyyy-MM-dd"
placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-button
style="margin-left: 30px"
size="small"
class="diy-button--search"
@click="handleSearch"
>查询</el-button
>
<el-button
style="margin-left: 10px"
size="small"
class="diy-button--reset"
@click="resetSearch"
>重置</el-button
>
</div>
</el-form>
</div>
<div class="div_table">
<el-table
border
:header-cell-style="{ background: '#2195FE', color: '#FFFFFF' }"
class="table"
:data="tableData"
style="width: 100%"
:height="maxTableHeight"
>
<el-table-column
label="序号"
fixed="left"
type="index"
align="center"
width="50"
/>
<el-table-column
prop="gridName"
align="center"
label="所属网格"
:show-overflow-tooltip="true"
>
</el-table-column>
<el-table-column
prop="topicContent"
label="话题内容"
min-width="150"
align="center"
:show-overflow-tooltip="true"
>
</el-table-column>
<el-table-column
prop="releaseUserName"
align="center"
min-width="150"
label="话题发表人"
:show-overflow-tooltip="true"
>
</el-table-column>
<el-table-column
prop="releaseTime"
align="center"
width="180"
:show-overflow-tooltip="true"
label="发布时间"
>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="100">
<template slot-scope="scope">
<!-- <el-button v-if="scope.row.issueStatus==='voting'&& agencyId===scope.row.orgId"
@click="handleDispose(scope.row)"
type="text" size="small"
class="div-table-button--edit">处理</el-button> -->
<el-button @click="handleWatch(scope.row)" type="text" size="small"
>查看</el-button
>
</template>
</el-table-column>
</el-table>
<div>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="pageNo"
:page-sizes="[20, 50, 100, 200]"
:page-size="parseInt(pageSize)"
layout="sizes, prev, pager, next, total"
:total="total"
>
</el-pagination>
</div>
</div>
<el-dialog
title="话题详情"
:visible.sync="dialogVisible"
width="60%"
>
<htgl-info
:htglDetailData="htglDetailData"
:topicId="topicId"
>
</htgl-info>
</el-dialog>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import { requestPost } from "@/js/dai/request";
import htglInfo from "./cpts/htglInfo.vue"
import axios from "axios";
export default {
data() {
return {
orgOptions: [],
orgOptionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
children: 'subAgencyList',
checkStrictly: true
},
formData: {
topicContent: '',
userName: '',
startDate: '',
endDate: '',
},
topicId:'',
tableData:[],
dialogVisible:false,
agencyIdArray: [],
htglDetailData:{},
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
};
},
created() {
this.getTableData()
},
mounted() {
this.getOrgTreeList();
},
methods: {
async getOrgTreeList() {
const url = "/gov/org/customeragency/agencygridtree";
let params = {
agencyId: this.agencyId,
purpose: "query",
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.orgOptions = [];
this.orgOptions.push(data);
} else {
this.$message.error(msg);
}
},
handleSizeChange (val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange (val) {
this.pageNo = val;
this.getTableData();
},
handleSearch (val) {
this.pageNo = 1;
this.getTableData();
},
resetSearch () {
this.agencyIdArray = []
this.formData = {
topicContent: '',
userName: '',
startDate: '',
endDate: '',
}
this.pageNo = 1
},
async getTableData () {
const url = "/resi/group/ytTopic/topicList";
var gridId = ''
const { pageSize, pageNo, formData } = this;
if(this.agencyIdArray.length ==1){
gridId = this.agencyIdArray.join()
}else if(this.agencyIdArray.length ==2){
gridId = this.agencyIdArray.splice(1).join()
}else if(this.agencyIdArray.length ==3){
gridId = this.agencyIdArray.splice(2).join()
}else if(this.agencyIdArray.length ==4){
gridId = this.agencyIdArray.splice(3).join()
}else{
this.agencyIdArray = []
}
const { data, code, msg } = await requestPost(url, {
pageSize,
pageNo,
gridId,
source:'1',
...formData,
});
if (code === 0) {
this.total = data.total || 0;
this.tableData = data.list
? data.list.map((item) => {
return item;
})
: [];
} else {
this.$message.error(msg);
}
},
async handleWatch (row) {
this.topicId = row.topicId
this.dialogVisible = true
const url = "/resi/group/ytTopic/topicDetail";
const { data, code, msg } = await requestPost(url, {
topicId: this.topicId,
});
if (code === 0) {
this.htglDetailData = { ...data };
} else {
this.$message.error(msg);
}
},
},
components: {
htglInfo
},
computed: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 360 + this.iframeHeigh
: this.clientHeight - 360;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
watch: {},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
@import "@/assets/scss/modules/management/list-main.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
::v-deep .el-row{
margin-bottom: 16px;
}
</style>

440
src/views/modules/workSys/feedbackDetail.vue

@ -0,0 +1,440 @@
<template>
<div>
<div class="dialog-h-content scroll-h">
<el-tag type="info"
class="eltag"
size="medium"
style="width: 100%; margin-top: 10px">建议详情</el-tag>
<div class="m-row">
<div class="m-row-2">
<div class="info-prop">
<span class="info-title-2">客户名</span>
<span>{{ adviceData.customerName }}</span>
</div>
<div class="info-prop">
<span class="info-title-2">组织名</span>
<span>{{ adviceData.agencyName}}</span>
</div>
</div>
<div class="m-row-2">
<div class="info-prop">
<span class="info-title-2">网格名</span>
<span>{{ adviceData.gridName}}</span>
</div>
<div class="info-prop">
<span class="info-title-2">注册手机</span>
<span>{{ adviceData.regPhone}}</span>
</div>
</div>
<div class="m-row-2">
<div class="info-prop">
<span class="info-title-2">问题分类</span>
<span>{{ adviceData.adviceType}}</span>
</div>
<div class="info-prop">
<span class="info-title-2">提出时间</span>
<span>{{ adviceData.adviceTime}}</span>
</div>
</div>
<div class="m-row-2">
<div class="info-prop">
<span class="info-title-2">提出者</span>
<span>{{ adviceData.userName}}</span>
</div>
<div class="info-prop">
<span class="info-title-2">联系方式</span>
<span>{{ adviceData.phone}}</span>
</div>
</div>
<div class="m-info">
<div class="info-prop">
<span class="info-title-2">建议内容</span>
<span>{{ adviceData.adviceContent}}</span>
</div>
<div v-if="adviceData.imgList.length>0"
class="info-prop">
<span class="info-title-2">建议图片</span>
<div style="display:flex"
v-for="(item,index) in adviceData.imgList"
:key="index">
<img class="img_icon"
:src="item">
</div>
</div>
</div>
</div>
<el-tag type="info"
class="eltag"
size="medium"
style="width: 100%; margin-top: 10px">回复详情</el-tag>
<div v-if="!showConfirm"
class="m-row">
<div class="m-row-2">
<div class="info-prop">
<span class="info-title-3">回复者</span>
<span>{{ adviceData.replyUserName }}</span>
</div>
<div class="info-prop">
<span class="info-title-3">回复时间</span>
<span>{{ adviceData.replyTime}}</span>
</div>
</div>
<div class="m-info">
<div class="info-prop">
<span class="info-title-3">回复内容</span>
<span>{{ adviceData.replyContent}}</span>
</div>
<div class="info-prop">
<span class="info-title-3">政府回复文本</span>
<span>{{ adviceData.govContent}}</span>
</div>
<div v-if="adviceData.govImgList.length>0"
class="info-prop">
<span class="info-title-3">政府回复取证</span>
<div style="display:flex"
v-for="(item,index) in adviceData.govImgList"
:key="index">
<img class="img_icon"
:src="item">
</div>
</div>
</div>
</div>
<div v-if="showConfirm"
class="m-row">
<div class="m-info">
<div class="info-prop">
<span class="info-title-3">回复内容</span>
<div>
<el-input type="textarea"
:rows="4"
resize="none"
maxlength="500"
show-word-limit
style="width: 600px"
placeholder="请输入回复内容"
v-model="adviceData.replyContent"></el-input>
<div class="input_tip">建议只可回复一次请谨慎回复</div>
</div>
</div>
<div class="info-prop">
<span class="info-title-3">政府回复文本</span>
<el-input type="textarea"
:rows="4"
resize="none"
maxlength="500"
style="width: 600px"
show-word-limit
placeholder="请输入政府回复文本"
v-model="adviceData.govContent"></el-input>
</div>
<div class="info-prop">
<span class="info-title-3">政府回复取证</span>
<div>
<el-upload :headers="$getElUploadHeaders()"
ref="uploadPic"
:action="uploadUlr"
:data="{ customerId: adviceData.customerId }"
list-type="picture-card"
:on-exceed="exceedPic"
:on-remove="removePic"
:file-list="replayImgList"
:on-success="handleSuccess"
:limit="3">
<span class="font-14">选择图片</span>
<div slot="tip"
class="upload_tip">
最多上传3张图片图片支持jpgjpegbmpgit或png格式
</div>
</el-upload>
</div>
</div>
</div>
</div>
</div>
<div class="div-btn">
<el-button size="small"
@click="handleCancle"> </el-button>
<el-button v-if="showConfirm"
size="small"
type="primary"
:disabled="btnDisable"
@click="handleComfirm"> </el-button>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
import daiMap from "@/utils/dai-map";
let loading //
export default {
data () {
return {
initLoading: false,
btnDisable: false,
adviceId: '',
srcList: [],
adviceData: {
customerId: '', //id
customerName: '', //
agencyName: '', //
gridName: '', //
userName: '', //
regPhone: '', //
adviceType: '', //
phone: '', //
adviceTime: '', //
adviceContent: '', //
imgList: [], //
replyContent: '', //
replyTime: '', //
replyUserName: '', //
govContent: '', //
govImgList: [] //
},
showConfirm: true,
replayImgList: [],
uploadUlr: window.SITE_CONFIG['apiURL'] + '/oss/file/uploadqrcodeV2',
// upload_url: '', // URL
upload_name: '' //
}
},
mounted () {
},
methods: {
diaDestroy () {
},
async initForm (adviceId) {
this.adviceId = adviceId
await this.loadFormData()
this.initLoading = true
},
//form
async loadFormData () {
this.startLoading()
//const url = "https://nei.netease.com/api/apimock-v2/e3b1d0eb88e905f6c7ee559b2d6bb7ad/epmetuser/useradvice/advicedetail"
const url = '/epmetuser/useradvice/advicedetail'
const params = {
adviceId: this.adviceId
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
// this.endLoading()
if (data) {
this.adviceData = data
if (
this.adviceData.replyContent === '' ||
this.adviceData.replyContent === null
) {
this.showConfirm = true
} else {
this.showConfirm = false
}
}
} else {
this.$message.error(msg)
}
this.endLoading()
},
async handleComfirm () {
if (
this.adviceData.replyContent === '' ||
this.adviceData.replyContent === null
) {
this.$message.warning('请填写回复内容')
return
}
this.startLoading()
// let url = 'https://nei.netease.com/api/apimock-v2/e3b1d0eb88e905f6c7ee559b2d6bb7ad/epmetuser/useradvice/replyadvice'
let url = '/epmetuser/useradvice/replyadvice'
//
let params = {
adviceId: this.adviceData.adviceId,
replyContent: this.adviceData.replyContent,
govContent: this.adviceData.govContent,
govImgList: this.adviceData.govImgList
}
const { data, code, msg } = await requestPost(url, params)
this.endLoading()
if (code === 0) {
if (data) {
this.$message.success('回复成功')
this.$emit('replayOk')
}
} else {
this.$message.error(msg)
}
// window.app.ajax.post(
// url,
// _data,
// (data, rspMsg) => {
// this.endLoading()
// this.$message.success('')
// this.diaCancel()
// this.$emit('refresh')
// },
// (rspMsg, data) => {
// this.endLoading()
// this.$message.error(rspMsg)
// }
// )
},
removePic (file, fileList) {
this.adviceData.govImgList.splice(
this.adviceData.govImgList.findIndex((item) => item === file.url),
1
)
this.replayImgList.splice(
this.replayImgList.findIndex((item) => item.uid === file.uid),
1
)
},
exceedPic () {
this.$message.warning('最多上传3张预览图片')
},
handleSuccess (response, file, fileList) {
this.replayImgList.push(file)
this.adviceData.govImgList.push(response.data.url)
},
handleCancle () {
this.$emit('diaDetailClose')
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
},
props: {
}
}
</script>
<style lang="scss" scoped >
@import "@/assets/scss/modules/management/detail-main.scss";
</style>
<style lang="scss" scoped >
.m-info {
padding-left: 0px;
}
.upload_tip {
color: #7a7a7a;
margin: 10px 0 0 0;
}
.div-tooltip {
margin-left: 10px;
color: red;
}
.input_tip {
color: #e60000;
margin: 10px 0 0 0;
}
.img_icon {
margin-right: 10px;
width: 70px;
height: 70px;
}
</style>
<style lang="scss">
.el-dialog__body {
padding: 0 10px 20px !important;
}
.hide {
.el-upload--picture-card {
display: none !important;
}
}
</style>

449
src/views/modules/workSys/feedbackList.vue

@ -0,0 +1,449 @@
<template>
<div class="div_main">
<div class="div_search">
<el-form :inline="true"
:model="formData"
ref="ref_searchform"
:label-width="'80px'">
<div>
<el-form-item label="所属组织"
prop="gridId">
<el-cascader class="customer_cascader"
size="small"
ref="myCascader"
v-model="agencyIdArray"
:options="orgOptions"
:props="orgOptionProps"
:show-all-levels="false"
@change="handleChangeAgency"></el-cascader>
</el-form-item>
<el-form-item label="问题分类"
prop="adviceType">
<el-select v-model="formData.adviceType"
placeholder="请选择"
size="small"
clearable
class="item_width_2">
<el-option v-for="item in adviceTypeArray"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="回复状态"
prop="isReply">
<el-select class="item_width_2"
v-model="formData.isReply"
placeholder="全部"
size="small"
clearable>
<el-option v-for="item in statusArray"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="发生时间"
prop="startTime">
<el-date-picker v-model="formData.startTime"
:picker-options="startPickerOptions"
class="item_width_2"
size="small"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="开始时间">
</el-date-picker>
<span class="data-tag"></span>
<el-date-picker v-model="formData.endTime"
:picker-options="endPickerOptions"
class="item_width_2 data-tag"
size="small"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-button style="margin-left:30px"
size="small"
class="diy-button--search"
@click="handleSearch">查询</el-button>
<el-button style="margin-left:10px"
size="small"
class="diy-button--reset"
@click="resetSearch">重置</el-button>
</div>
</el-form>
</div>
<div class="div_table">
<el-table :data="tableData"
border
v-loading="tableLoading"
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
class="table"
style="width: 100%"
:height="maxTableHeight">
<el-table-column label="序号"
fixed="left"
type="index"
align="center"
width="50" />
<el-table-column prop="gridName"
min-width="100"
align="center"
label="所属网格"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="adviceType"
label="建议分类"
min-width="140"
align="center"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<p style="text-align:center"
v-for="(item,index) in scope.row.adviceTypeArray"
:key="index">{{item}}</p>
</template>
</el-table-column>
<el-table-column prop="phone"
label="联系电话"
width="120"
align="center"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="adviceTime"
align="center"
width="170"
label="建议时间"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column prop="adviceContent"
align="center"
min-width="200"
:show-overflow-tooltip="true"
label="建议内容">
<template slot-scope="scope">
<div class="myNote">{{scope.row.adviceContent}}</div>
</template>
</el-table-column>
<el-table-column fixed="right"
label="操作"
align="center"
width="100">
<template slot-scope="scope">
<el-button @click="handleWatch(scope.row)"
type="text"
size="small">查看</el-button>
</template>
</el-table-column>
</el-table>
<div>
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="pageNo"
:page-sizes="[20, 50, 100, 200]"
:page-size="parseInt(pageSize)"
layout="sizes, prev, pager, next, total"
:total="total">
</el-pagination>
</div>
</div>
<!-- 修改弹出框 -->
<el-dialog :visible.sync="detailShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'建议详情'"
width="1150px"
top="5vh"
class="dialog-h"
@closed="detailFormCancle">
<feedback-detail ref="ref_form_detail"
@replayOk="replayOk"
@diaDetailClose="detailFormCancle"></feedback-detail>
</el-dialog>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import { mapGetters } from "vuex";
import feedbackDetail from './feedbackDetail'
import axios from "axios";
export default {
components: { feedbackDetail },
data () {
let endDisabledDate = (time) => {//datareturn
let nowData = Date.now()
if (this.formData.startTime) {
let startTime = new Date(this.formData.startTime)
return time.getTime() > nowData || time.getTime() < startTime || time.getTime() === startTime
} else {
return time.getTime() > nowData
}
}
let startDisabledDate = (time) => {//datareturn
let nowData = Date.now()
return time.getTime() > nowData
}
return {
tableLoading: false,
user: {},
agencyIdArray: [],
orgOptions: [],
orgOptionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
children: 'subAgencyList',
checkStrictly: true
},
tableData: [],
statusArray: [
{
value: '0',
label: '未回复'
},
{
value: '1',
label: '已回复'
}
],
adviceTypeArray: [
{
value: 'gov',
label: '政府业务建议'
},
{
value: 'software',
label: '软件功能及体验问题'
}
],
formData: {
customerId: '',//id
agencyId: '',//id
gridId: '',
isReply: '',//,01,
adviceType: '',// gov,software ,
startTime: '',//
endTime: '',//
},
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
endPickerOptions: {
disabledDate: endDisabledDate
},
startPickerOptions: {
disabledDate: startDisabledDate
},
eventId: '',
eventDetailData: {},
detailShow: false,
};
},
computed: {
maxTableHeight () {
return this.$store.state.inIframe
? this.clientHeight - 320 + this.iframeHeigh
: this.clientHeight - 320;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
watch: {
// "formData.endTime": function (val) {
// if (val && val != '') {
// let arrayTemp = val.split(' ')
// this.formData.endTime = arrayTemp[0] + ' 23:59:59'
// }
// },
},
mounted () {
console.log(this.$store.state)
this.user = this.$store.state.user
this.formData.customerId = this.user.customerId
this.formData.agencyId = this.user.agencyId
this.getOrgTreeList();
this.getTableData();
},
methods: {
handleChangeAgency (val) {
let obj = this.$refs["myCascader"].getCheckedNodes()[0].data
if (obj) {
if (obj.level === 'grid') {
this.formData.gridId = this.agencyIdArray.length > 0 ? this.agencyIdArray[this.agencyIdArray.length - 1] : '';
this.formData.agencyId = ''
} else {
this.formData.agencyId = this.agencyIdArray.length > 0 ? this.agencyIdArray[this.agencyIdArray.length - 1] : '';
this.formData.gridId = ''
}
} else {
this.formData.agencyId = this.user.agencyId
this.formData.gridId = ''
}
},
handleSearch (val) {
console.log(this.formData);
this.pageNo = 1;
this.getTableData();
},
getOrgTreeList () {
const { user } = this.$store.state
this.$http
.post('/gov/org/customeragency/agencygridtree', {})
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
} else {
console.log('获取组织树成功', res.data)
this.orgOptions = []
this.orgOptions.push(res.data)
}
})
.catch(() => {
return this.$message.error('网络错误')
})
},
async handleWatch (row) {
this.detailShow = true
this.$nextTick(() => {
this.$refs.ref_form_detail.initForm(row.id)
})
},
replayOk () {
this.detailShow = false
this.getTableData()
},
detailFormCancle () {
this.detailShow = false
},
async getTableData () {
this.tableLoading = true
const url = "/epmetuser/useradvice/advicelist";
// const url = "http://yapi.elinkservice.cn/mock/245/gov/project/icEvent/list";
const { pageSize, pageNo, formData } = this;
const { data, code, msg } = await requestPost(url, {
pageSize,
pageNo,
...formData,
});
this.tableLoading = false
if (code === 0) {
this.total = data.total || 0;
this.tableData = data.list
this.tableData.forEach(element => {
element.adviceTypeArray = element.adviceType.split("\\n")
})
} else {
this.$message.error(msg);
}
},
handleSizeChange (val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange (val) {
this.pageNo = val;
this.getTableData();
},
resetSearch () {
this.agencyIdArray = []
this.formData = {
customerId: this.user.customerId,
agencyId: this.user.agencyId,//id id
gridId: '',
isReply: '',//,01,
adviceType: '',// gov,software ,
startTime: '',//
endTime: '',//
}
this.pageNo = 1
this.getTableData();
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
@import "@/assets/scss/modules/management/list-main.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
.div_search {
.item_width_2 {
width: 200px;
}
}
.myNote {
display: -webkit-box;
text-overflow: ellipsis;
overflow: hidden;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
</style>
Loading…
Cancel
Save