patrolDetails.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. <template>
  2. <div class="patrolDetails">
  3. <div
  4. class="search"
  5. v-if="!this.params"
  6. >
  7. <span>巡更详情</span>
  8. <div class="search-icon">
  9. <el-tooltip
  10. effect="light"
  11. placement="bottom"
  12. content="返回"
  13. >
  14. <i
  15. class="zoniot_font zoniot-icon-fanhui"
  16. @click="goback()"
  17. ></i>
  18. </el-tooltip>
  19. </div>
  20. </div>
  21. <div class="contentText">
  22. <div class="leftMap">
  23. <map-value
  24. :point="thisItem"
  25. :line="targetData"
  26. ref="mapVal"
  27. :isStart="true"
  28. :height="400"
  29. ></map-value>
  30. <div class="formLabel">
  31. <div class="formLabelList">
  32. <div class="label">所属社区</div>
  33. <div class="text">{{ thisObj.communityName }}</div>
  34. </div>
  35. <div class="formLabelList">
  36. <div class="label">巡更路线</div>
  37. <div class="text">{{ thisObj.routeName }}</div>
  38. </div>
  39. <div class="formLabelList">
  40. <div class="label">巡更人员</div>
  41. <div class="text">{{ thisObj.partolName }}</div>
  42. </div>
  43. <div class="formLabelList">
  44. <div class="label">巡更日期</div>
  45. <div class="text">{{ !!thisObj.patrolDate ? $moment(thisObj.patrolDate).format('YYYY-MM-DD') : '' }}</div>
  46. </div>
  47. <div class="formLabelList">
  48. <div class="label">巡更时间</div>
  49. <div class="text">{{ thisObj.patrolTime }}</div>
  50. </div>
  51. </div>
  52. </div>
  53. <div class="rightList">
  54. <template v-for="(item, index) in leftItem">
  55. <div
  56. class="steps"
  57. :key="index"
  58. >
  59. <div class="steps-left">
  60. <img
  61. v-if="!!leftItem[1].id"
  62. src="@assets/img/point_yiwancheng@2x.png"
  63. alt
  64. />
  65. <img
  66. v-else-if="!leftItem[1].id && index !== leftItem.length - 1"
  67. src="@assets/img/point_weiwancheng@2x.png"
  68. alt
  69. />
  70. <div
  71. class="steps-left-line"
  72. v-if="index !== leftItem.length - 1 && !!leftItem[leftItem.length - 2].id"
  73. ></div>
  74. <div
  75. class="steps-left-line"
  76. v-else-if="index !== leftItem.length - 2"
  77. ></div>
  78. </div>
  79. <div class="steps-right">
  80. <!-- 待开始 开始 -->
  81. <div
  82. class="steps-right-title"
  83. v-if="index == 0"
  84. >
  85. <span>{{ !!leftItem[1].id ? '开始任务 ' : '待执行' }}</span>
  86. </div>
  87. <!-- 点位状态 -->
  88. <div
  89. class="steps-right-title"
  90. v-else-if="index !== 0 && index !== leftItem.length - 1"
  91. >
  92. <span>{{ item.pointName }}</span>
  93. <span
  94. class="status"
  95. :class="!!item.id ? '' : 'grad'"
  96. >{{ !!item.id ? '已完成' : '未完成' }}</span>
  97. </div>
  98. <div
  99. class="steps-right-title"
  100. v-else
  101. >
  102. <span>{{ !!leftItem[leftItem.length - 2].id ? '结束任务 ' : '' }}</span>
  103. </div>
  104. <div
  105. class="steps-right-content"
  106. v-if="index == 0"
  107. >{{ leftItem[1].startTime }}</div>
  108. <template v-else-if="index !== 0 && index !== leftItem.length - 1">
  109. <div class="steps-right-content">{{ item.checkTime }}</div>
  110. <div class="steps-right-content">
  111. <span>巡更结果:</span>
  112. <span>{{ item.result || '-' }}</span>
  113. </div>
  114. <div class="steps-right-content">
  115. <span>图片/视频:</span>
  116. <template v-if="!!item.picturePath">
  117. <div
  118. class="imgVdio"
  119. v-for="items in item.picturePath.split(',')"
  120. :key="items"
  121. >
  122. <video
  123. v-if="typeVideo(items)"
  124. :src="items"
  125. @click="lookVideos(items)"
  126. ></video>
  127. <el-image
  128. class="imgs"
  129. v-else
  130. :src="items"
  131. :preview-src-list="[items]"
  132. >
  133. <div
  134. slot="error"
  135. class="image-slot"
  136. >--</div>
  137. </el-image>
  138. </div>
  139. </template>
  140. </div>
  141. </template>
  142. <div
  143. class="steps-right-content"
  144. v-else
  145. >
  146. {{ leftItem[1].endTime }}
  147. </div>
  148. </div>
  149. </div>
  150. </template>
  151. </div>
  152. </div>
  153. </div>
  154. </template>
  155. <script>
  156. import mapValue from './mapValue.vue';
  157. export default {
  158. props: ['thisObj', 'params'],
  159. components: { mapValue },
  160. data () {
  161. return {
  162. thisItem: [],
  163. leftItem: [],
  164. targetData: []
  165. };
  166. },
  167. filters: {
  168. statusType (val) {
  169. let name = '-';
  170. switch (val) {
  171. case 1:
  172. name = '待执行';
  173. break;
  174. case 2:
  175. name = '执行中';
  176. break;
  177. case 3:
  178. name = '已完成';
  179. break;
  180. case 4:
  181. name = '已完成(超时)';
  182. break;
  183. case 5:
  184. name = '已逾期';
  185. break;
  186. }
  187. return name;
  188. }
  189. },
  190. methods: {
  191. goback () {
  192. this.$emit('initPage');
  193. },
  194. getDetail (id) {
  195. this.$http.get('/sc-community/patrolRecord/findRecordDtail', { id: id }).then(({ data, status, msg }) => {
  196. this.thisItem = data;
  197. this.leftItem = [
  198. [
  199. {
  200. checkTime: null,
  201. id: null,
  202. picturePath: null,
  203. pointId: null,
  204. pointStatus: null,
  205. recordId: null,
  206. result: null
  207. }
  208. ],
  209. ...data,
  210. [
  211. {
  212. checkTime: null,
  213. id: null,
  214. picturePath: null,
  215. pointId: null,
  216. pointStatus: null,
  217. recordId: null,
  218. result: null
  219. }
  220. ]
  221. ];
  222. });
  223. },
  224. getTrack (id) {
  225. this.$http.get('/sc-community/patrolRecord/getUserPatrolTrack', { recordId: id }).then(({ data, status, msg }) => {
  226. if (!!data) {
  227. this.targetData = data;
  228. }
  229. });
  230. },
  231. typeVideo (str) {
  232. let type = str.slice(str.lastIndexOf('.') + 1, str.length);
  233. let videoType = ['mp4'];
  234. return videoType.includes(type);
  235. },
  236. lookVideos (src) {
  237. new Promise((resolve) => {
  238. this.$store.dispatch('addPopup', {
  239. url: '/lookVideo.vue',
  240. width: '600px',
  241. height: '500px',
  242. props: {
  243. src: src,
  244. callback: resolve
  245. },
  246. showConfirmButton: true,
  247. showCancelButton: true,
  248. hideStar: true,
  249. title: '查看视频'
  250. });
  251. }).then(() => {
  252. this.mixins_search();
  253. });
  254. }
  255. },
  256. created () {
  257. if (!!this.params) {
  258. this.thisObj = this.params.thisObj;
  259. this.getDetail(this.params.thisObj.id);
  260. this.getTrack(this.params.thisObj.id);
  261. } else {
  262. this.getDetail(this.thisObj.id);
  263. this.getTrack(this.thisObj.id);
  264. }
  265. }
  266. };
  267. </script>>
  268. <style lang="scss" scoped>
  269. @import '@assets/css/public-style.scss';
  270. .border20 {
  271. padding: 20px;
  272. box-sizing: border-box;
  273. }
  274. .patrolDetails {
  275. // @extend .height100;
  276. .search > span {
  277. font-size: 16px;
  278. line-height: 30px;
  279. }
  280. .contentText {
  281. height: calc(100% - 100px);
  282. display: flex;
  283. justify-content: space-between;
  284. .leftMap {
  285. width: calc(100% - 420px);
  286. background: white;
  287. @extend .border20;
  288. .formLabel {
  289. box-shadow: 0px 2px 4px 0px rgba(236, 236, 236, 0.5);
  290. border-radius: 4px;
  291. border: 1px solid #eeeeee;
  292. padding: 20px;
  293. margin-top: 20px;
  294. .formLabelList {
  295. display: flex;
  296. line-height: 30px;
  297. .label {
  298. width: 70px;
  299. }
  300. .text {
  301. color: #424656;
  302. }
  303. }
  304. }
  305. }
  306. .rightList {
  307. width: 400px;
  308. background: white;
  309. @extend .border20;
  310. .steps {
  311. display: flex;
  312. img {
  313. width: 20px;
  314. vertical-align: -webkit-baseline-middle;
  315. &.grad {
  316. -webkit-filter: grayscale(100%);
  317. -moz-filter: grayscale(100%);
  318. -ms-filter: grayscale(100%);
  319. -o-filter: grayscale(100%);
  320. filter: grayscale(100%);
  321. filter: gray;
  322. }
  323. }
  324. .steps-left {
  325. margin-right: 10px;
  326. .steps-left-line {
  327. width: 2px;
  328. height: calc(100% - 40px);
  329. min-height: 20px;
  330. margin: 10px auto;
  331. background-color: $mainBgColor;
  332. }
  333. }
  334. &:last-child {
  335. .steps-left-line {
  336. display: none;
  337. }
  338. }
  339. .steps-right {
  340. width: calc(100% - 15px);
  341. line-height: 30px;
  342. margin-bottom: 10px;
  343. .steps-right-title {
  344. font-weight: 600;
  345. display: flex;
  346. justify-content: space-between;
  347. .status {
  348. color: $mainBgColor;
  349. font-weight: 400;
  350. &.grad {
  351. color: gray;
  352. }
  353. }
  354. }
  355. .steps-right-content {
  356. font-size: 12px;
  357. color: #303133;
  358. display: flex;
  359. span:first-child {
  360. margin-right: 10px;
  361. }
  362. }
  363. }
  364. }
  365. }
  366. }
  367. }
  368. .imgVdio {
  369. display: inline-block;
  370. margin-right: 10px;
  371. .imgs,
  372. video {
  373. width: 64px;
  374. cursor: pointer;
  375. }
  376. }
  377. </style>