indexEdit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <template>
  2. <div class="complaint">
  3. <div v-if="rowData">
  4. <div class="complaint-title">
  5. <div class="complaint-title-left"></div>
  6. <span class="complaint-title-right">投诉建议信息</span>
  7. </div>
  8. <p class="complaint-content">
  9. <span>
  10. <span class="complaint-content-left">所属社区:</span>
  11. <span class="complaint-content-right">{{ rowData.communityName }}</span>
  12. </span>
  13. <span class="width">
  14. <span class="complaint-content-left">地址:</span>
  15. <span class="complaint-content-right">{{ rowData.buildingName }}{{ rowData.unitName }}{{ rowData.roomNumber }}</span>
  16. </span>
  17. </p>
  18. <p class="complaint-content">
  19. <span>
  20. <span class="complaint-content-left">投诉人:</span>
  21. <span class="complaint-content-right">{{ rowData.userName }}</span>
  22. </span>
  23. <span class="width">
  24. <span class="complaint-content-left">手机号:</span>
  25. <span class="complaint-content-right">{{ rowData.phone }}</span>
  26. </span>
  27. </p>
  28. <p class="complaint-content">
  29. <span>
  30. <span class="complaint-content-left">投诉类型:</span>
  31. <span class="complaint-content-right">{{ rowData.typeDict }}</span>
  32. </span>
  33. <span class="width">
  34. <span class="complaint-content-left">投诉时间:</span>
  35. <span class="complaint-content-right">{{ rowData.createDate }}</span>
  36. </span>
  37. </p>
  38. <div class="star-cont" v-if="rowData.type == 6">
  39. <div class="star-list" v-for="item in toArr(rowData.serviceQuality)" :key="item">
  40. <div>{{ item.name }}:</div>
  41. <i
  42. class="el-icon-star-on"
  43. :style="item.value >= ins ? 'color: #ffca3b;' : 'color:#8e897c33'"
  44. v-for="ins in 5"
  45. :key="ins"
  46. ></i>
  47. <span>{{ item.desc }}</span>
  48. </div>
  49. </div>
  50. <div class="complaint-content">
  51. <span>
  52. <span class="complaint-content-left">投诉内容:</span>
  53. <span class="complaint-content-right" style="margin: 0">{{ rowData.content }}</span>
  54. </span>
  55. </div>
  56. <div class="complaint-images complaint-content">
  57. <span class="complaint-content-left">图片/视频:</span>
  58. <span v-if="mediaList.length > 0">
  59. <span v-for="(item, index) in mediaList" :key="index">
  60. <span v-if="typeVideo(item)">
  61. <video class="images videos" :src="item" @click="lookVideos(item)"></video>
  62. </span>
  63. <span v-else>
  64. <el-image class="images" :src="item" :preview-src-list="[item]"></el-image>
  65. </span>
  66. </span>
  67. </span>
  68. <span v-else> 暂无图片 </span>
  69. </div>
  70. </div>
  71. <div class="complaint-title">
  72. <div class="complaint-title-left"></div>
  73. <span class="complaint-title-right">处理记录</span>
  74. </div>
  75. <div class="record">
  76. <div class="recored-detali" v-if="rowData">
  77. <div v-for="(item, index) of recordData" :key="index">
  78. <div class="recored-detali-row last-row">
  79. <div>
  80. <img class="circle" src="@assets/img/point_yiwancheng@2x.png" alt="" />
  81. <span>{{ item.replyTime }}</span>
  82. </div>
  83. </div>
  84. <div class="recored-detali-rows">
  85. <div class="record-left" v-show="recordData.length > 1 && index != recordData.length - 1"></div>
  86. <span class="font-size-small"
  87. >{{ item.replyUserName }}:&nbsp;&nbsp;&nbsp;{{ item.replyContent ? item.replyContent : '--' }}</span
  88. >
  89. </div>
  90. </div>
  91. <div :class="{ 'last-row-right': true, statusColor: rowData.handleStatus == '1' }">
  92. {{ rowData.handleStatus | filterComplaintStatus }}
  93. </div>
  94. </div>
  95. </div>
  96. <template v-if="rowData.handleStatus == 1 || rowData.handleStatus == 3">
  97. <el-form :model="replayForm" :rules="rules" ref="replayForm" label-width="80px" class="demo-ruleForm">
  98. <el-form-item label="处理状态" prop="handleStatus" class="replay">
  99. <el-select
  100. v-model="replayForm.handleStatus"
  101. clearable
  102. :disabled="rowData.handleStatus == 2 || rowData.handleStatus == 4 || rowData.handleStatus == 5"
  103. >
  104. <el-option
  105. v-for="(item, index) in complaintStatus"
  106. :key="index"
  107. :label="item.label"
  108. :value="item.status"
  109. ></el-option>
  110. </el-select>
  111. </el-form-item>
  112. <el-form-item label="物业回复" prop="replay" class="replay" v-if="rowData.handleStatus == 1 || rowData.handleStatus == 3">
  113. <el-input
  114. v-model="replayForm.replay"
  115. type="textarea"
  116. placeholder="请输入回复内容"
  117. maxlength="100"
  118. rows="3"
  119. show-word-limit
  120. ></el-input>
  121. </el-form-item>
  122. </el-form>
  123. </template>
  124. <!--用户 评价 -->
  125. <div v-if="rowData.handleStatus == 5" class="grate">
  126. <div class="complaint-title">
  127. <div class="complaint-title-left"></div>
  128. <span class="complaint-title-right grate-rate-title">用户评价</span>
  129. </div>
  130. <div class="grate-rate">
  131. <i
  132. class="el-icon-star-on"
  133. style="color: #ffca3b; font-size: 26px; margin-right: 10px"
  134. v-for="(item, index) in rowData.evaluation"
  135. :key="index"
  136. ></i>
  137. <div class="grate-text">
  138. {{ rowData.evaluationContent }}
  139. </div>
  140. </div>
  141. </div>
  142. </div>
  143. </template>
  144. <script>
  145. export default {
  146. props: ['params'],
  147. data() {
  148. let _this = this;
  149. return {
  150. // 处理记录
  151. recordData: [],
  152. // 视频获得焦点
  153. videoControls: false,
  154. mediaList: [],
  155. // 物业回复
  156. replayForm: {
  157. replay: '',
  158. handleStatus: ''
  159. },
  160. complaintStatus: [
  161. {
  162. status: 3,
  163. label: '处理中'
  164. },
  165. {
  166. status: 4,
  167. label: '已处理'
  168. }
  169. ],
  170. rules: {
  171. handleStatus: [{ required: true, message: '请选择处理状态', trigger: 'change' }],
  172. replay: [{ required: true, message: '请输入内容', trigger: 'blur' }]
  173. },
  174. // 行数据
  175. rowData: ''
  176. };
  177. },
  178. created() {
  179. this.clickEdit(this.params.row);
  180. },
  181. mounted() {},
  182. methods: {
  183. toArr(str) {
  184. if (!!str) {
  185. return JSON.parse(str);
  186. }
  187. return [];
  188. },
  189. typeVideo(str) {
  190. let type = str.slice(str.lastIndexOf('.') + 1, str.length);
  191. let videoType = ['mp4'];
  192. return videoType.includes(type);
  193. },
  194. lookVideos(src) {
  195. new Promise((resolve) => {
  196. this.$store.dispatch('addPopup', {
  197. url: '/lookVideo.vue',
  198. width: '600px',
  199. height: '500px',
  200. props: {
  201. src: src,
  202. callback: resolve
  203. },
  204. showConfirmButton: true,
  205. showCancelButton: true,
  206. hideStar: true,
  207. title: '查看视频'
  208. });
  209. }).then(() => {
  210. this.mixins_search();
  211. });
  212. },
  213. /** 点击播放视频*/
  214. clickVideo() {
  215. this.videoControls = !this.videoControls;
  216. if (this.videoControls) {
  217. try {
  218. if (document.pictureInPictureElement) {
  219. document.exitPictureInPicture();
  220. } else {
  221. video.requestPictureInPicture();
  222. }
  223. } catch (err) {
  224. // Video failed to enter/leave Picture-in-Picture mode.
  225. console.log('浏览器不支持播放');
  226. }
  227. }
  228. },
  229. submit() {
  230. this.$refs['replayForm'].validate((valid) => {
  231. if (valid) {
  232. let query = {
  233. buildingId: this.rowData.buildingId,
  234. communityId: this.rowData.communityId,
  235. content: '',
  236. handleStatus: this.replayForm.handleStatus,
  237. houseId: this.rowData.houseId,
  238. id: this.rowData.id
  239. };
  240. this.$http.post('/sc-community/feedback/update', query).then((res) => {});
  241. let querys = {
  242. fid: this.rowData.id,
  243. replyContent: this.replayForm.replay
  244. };
  245. this.$http.post('/sc-community/feedback/speed/add', querys).then(({ status, msg }) => {
  246. if (status == 0) {
  247. this.$message.success(msg);
  248. this.params.callback();
  249. this.$emit('close');
  250. } else {
  251. this.$message.error(msg);
  252. }
  253. });
  254. }
  255. });
  256. },
  257. reset() {
  258. this.$refs['replayForm'].resetFields();
  259. },
  260. /** 查看处理详情*/
  261. clickEdit(row) {
  262. this.mediaList = [];
  263. // 获取处理内容
  264. this.$http.post(`/sc-community/feedback/find/${row.id}`).then((res) => {
  265. if (res.status === 0) {
  266. this.rowData = res.data;
  267. if (res.data.imageUrl.length > 0) {
  268. this.mediaList = res.data.imageUrl.split(',');
  269. }
  270. } else {
  271. this.$message.error(msg);
  272. }
  273. });
  274. let query = {
  275. fid: row.id
  276. };
  277. // 获取处理记录
  278. this.$http.get('/sc-community/feedback/speed/list', query).then((res) => {
  279. this.recordData = res.data;
  280. });
  281. }
  282. }
  283. };
  284. </script>
  285. <style lang="scss" scoped>
  286. @import '../style.scss';
  287. /deep/ .el-dialog {
  288. margin-top: 5vh !important;
  289. }
  290. .complaint-content-left {
  291. width: 70px;
  292. text-align: right;
  293. display: inline-block;
  294. }
  295. .width {
  296. width: 210px;
  297. }
  298. .star-cont {
  299. font-size: 12px;
  300. line-height: 26px;
  301. .star-list {
  302. display: flex;
  303. margin: 0 35px;
  304. & > div {
  305. margin-right: 20px;
  306. }
  307. }
  308. }
  309. .el-icon-star-on {
  310. font-size: 26px;
  311. margin-right: 10px;
  312. }
  313. </style>