detail.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. <template>
  2. <view class="my-fillin-container">
  3. <title-status />
  4. <h-navbar title="安全事件详情" />
  5. <view class="head-layout-wrap">
  6. <view class="head-layout">
  7. <view class="head-left">
  8. <view class="head-tag">{{ info.queryThing === 1 ? 'I' : 'II' }}级事件</view>
  9. <view class="head-title text-one">{{ info.thingTitle || '' }}</view>
  10. <view class="head-ss">违规所属:{{ info.violationType | violationTypeFormat }}</view>
  11. </view>
  12. <view class="head-right" v-if="info.status && info.status > 0">
  13. <u-image :src="`/static/images/${typeIcon[info.status - 1] || null}`" width="120rpx" height="120rpx" loadingIcon="" lazy-load />
  14. </view>
  15. </view>
  16. </view>
  17. <view class="info-btn">审核详情</view>
  18. <view class="content-tag-layout">
  19. <view :class="['tag-item', currentTag === 1 ? 'tag-item-active' : '']" @click="tagItemClick(1)">
  20. <view style="z-index: 2;position: relative;padding-bottom: 10rpx;">基本情况</view>
  21. <view class="tag-item-index-active" v-if="currentTag === 1"></view>
  22. </view>
  23. <view :class="['tag-item', currentTag === 2 ? 'tag-item-active' : '']" @click="tagItemClick(2)">
  24. <view style="z-index: 2;position: relative;padding-bottom: 10rpx;">行为人/单位信息</view>
  25. <view class="tag-item-index-active" v-if="currentTag === 2"></view>
  26. </view>
  27. <view :class="['tag-item', currentTag === 3 ? 'tag-item-active' : '']" @click="tagItemClick(3)">
  28. <view style="z-index: 2;position: relative;padding-bottom: 10rpx;">处理情况</view>
  29. <view class="tag-item-index-active" v-if="currentTag === 3"></view>
  30. </view>
  31. </view>
  32. <template v-if="currentTag === 1">
  33. <view class="content-card" v-if="currentTag11">
  34. <view class="card-item" v-for="(item, index) in currentTag11" :key="index">
  35. <view>{{ item.key }}</view>
  36. <view class="item-right-text">{{ item.value }}</view>
  37. </view>
  38. </view>
  39. <view class="content-card">
  40. <view class="card-item">
  41. <view><text style="font-weight: 600;">起因:</text>{{ info.thingCause || '' }}</view>
  42. </view>
  43. <view class="card-item">
  44. <view><text style="font-weight: 600;">后果:</text>{{ info.thingResult || '' }}</view>
  45. </view>
  46. <view v-if="info.photoList && info.photoList.length > 0" style="margin-top: 8rpx;display: flex;align-items: center;">
  47. <template v-for="(item, index) in info.photoList">
  48. <u-image :style="{marginLeft: index === 0 ? '0px': '24rpx'}" :src="item || null" width="140rpx" height="140rpx" loadingIcon="" lazy-load />
  49. </template>
  50. </view>
  51. </view>
  52. <view class="content-card">
  53. <view class="card-item">
  54. <view style="font-weight: 600;">简要情况:</view>
  55. </view>
  56. <view class="card-item">
  57. <view style="line-height: 44rpx;white-space: pre-wrap;width: 100%;" v-if="info.violationType === 1 || info.violationType === 3">{{ getFriefDetailsFormat() }}</view>
  58. <view style="line-height: 44rpx;white-space: pre-wrap;width: 100%;" v-if="info.violationType === 2">
  59. 在检查(托运人) {{ info.behaviorDescribeVo.shipper }} 公司,经办人 {{ info.behaviorDescribeVo.operator }} ,运单号 {{ info.behaviorDescribeVo.waybillNumber }} ;{{ info.behaviorDescribeVo.beginningPlace }} 至 {{ info.behaviorDescribeVo.destination }} 的货物中,发现有可疑物品,经开包确认为 {{ info.behaviorDescribeVo.suspiciousItems }} 存在 {{ info.behaviorDescribeVo.suspectedIllegalPoints }} 的违法嫌疑,现将报警单、航空货运单(复印件)及查获的上述相关物品等提供公安机关调查处理。
  60. </view>
  61. </view>
  62. <view class="card-item" style="margin-top: 20rpx;">
  63. <view style="font-weight: 600;">简要经过描述:</view>
  64. </view>
  65. <view class="card-item">
  66. <view style="line-height: 44rpx;white-space: pre-wrap;width: 100%;">{{ info.thingsDesc }}</view>
  67. </view>
  68. </view>
  69. </template>
  70. <template v-if="currentTag === 2">
  71. <template v-if="info.violationType === 1 || info.violationType === 3">
  72. <view class="content-person">
  73. <view class="person-left">
  74. <u-image :src="info.behaviorPhoto || null" width="132rpx" height="176rpx" loadingIcon="" lazy-load />
  75. </view>
  76. <view class="person-right">
  77. <view>{{ info.behaviorName || '' }}</view>
  78. <view>{{ info.behaviorSex || '' }}</view>
  79. <view>{{ info.behavionPhone || '' }}</view>
  80. <view>【{{ info.behaviorDocumentType }}】{{ info.behaviorDocumentNumber | idCardFormat }}</view>
  81. </view>
  82. </view>
  83. <view class="content-card" v-if="currentTag21">
  84. <view class="card-item" v-for="(item, index) in currentTag21" :key="index">
  85. <view>{{ item.key }}</view>
  86. <view class="item-right-text">{{ item.value }}</view>
  87. </view>
  88. </view>
  89. </template>
  90. <template v-if="info.violationType === 2">
  91. <view class="content-card" v-for="(items, indexs) in currentTag22" :key="indexs">
  92. <view class="card-item" v-for="(item, index) in items" :key="index">
  93. <view>{{ item.key }}</view>
  94. <view class="item-right-text">{{ item.value }}</view>
  95. </view>
  96. </view>
  97. </template>
  98. </template>
  99. <template v-if="currentTag === 3">
  100. <!-- 值班领导、民警处置 -->
  101. <template v-if="streamInfo.linkId && streamInfo.linkId >= 1 && streamInfo.status > 1">
  102. <view class="content-card">
  103. <view class="card-item">
  104. <view>报警单编号</view>
  105. <view class="item-right-text">{{ disposeInfo.leaderTestVo.policeNumber }}</view>
  106. </view>
  107. <view class="card-item">
  108. <view>报警时间</view>
  109. <view class="item-right-text">{{ disposeInfo.leaderTestVo.policeTime | moment(2) }}</view>
  110. </view>
  111. <!-- 民警处置/已完成 -->
  112. <template v-if="streamInfo.linkId && streamInfo.linkId >= 2 && streamInfo.status === 4">
  113. <view class="card-item">
  114. <view>移交公安时间</view>
  115. <view class="item-right-text">{{ disposeInfo.policeTestVo.policeHandleTime | moment(2) }}</view>
  116. </view>
  117. <view class="card-item">
  118. <view>到达现场处置民警</view>
  119. <view class="item-right-text" style="display: flex;justify-content: flex-end;">
  120. <u-image :src="disposeInfo.policeTestVo.policeSign || null" mode="scaleToFill" width="228rpx" height="120rpx" loadingIcon="" lazy-load />
  121. </view>
  122. </view>
  123. <view class="card-item">
  124. <view>是否受案</view>
  125. <view class="item-right-text">{{ disposeInfo.policeTestVo.policeCheck ? '受案' : '不受案' }}</view>
  126. </view>
  127. </template>
  128. </view>
  129. </template>
  130. <!-- 公安局处置/已受案、已完成 -->
  131. <template v-if="streamInfo.linkId && streamInfo.linkId === 3 && streamInfo.status >= 3">
  132. <view class="content-card">
  133. <view class="card-item">
  134. <view style="font-weight: 600;">接警人:</view>
  135. <view>{{ disposeInfo.policeDisposeTestVo.policeName }} {{ disposeInfo.policeDisposeTestVo.policePhone }}</view>
  136. </view>
  137. <view class="card-item">
  138. <view style="font-weight: 600;">处警单位:</view>
  139. <view >{{ disposeInfo.policeDisposeTestVo.handlePolice }}</view>
  140. </view>
  141. <view class="card-item">
  142. <view style="font-weight: 600;">出动警力数:</view>
  143. <view>出动警力{{ disposeInfo.policeDisposeTestVo.policeNumber }}人</view>
  144. </view>
  145. <view class="card-item">
  146. <view style="font-weight: 600;">处罚情况:</view>
  147. <view>{{ disposeInfo.policeDisposeTestVo.punish }}</view>
  148. </view>
  149. </view>
  150. </template>
  151. <!-- 公安局处置/已完成 -->
  152. <template v-if="streamInfo.linkId && streamInfo.linkId === 3 && streamInfo.status >= 4">
  153. <view class="content-card">
  154. <view class="card-item" style="display: block;">
  155. <view style="font-weight: 600;">案由:</view>
  156. <view style="padding-left: 10rpx;color: #606266;line-height: 45rpx;">{{ disposeInfo.policeSecurityTestVo.actionReason }}</view>
  157. </view>
  158. <view class="card-item" style="display: block;">
  159. <view style="font-weight: 600;">是否严处:</view>
  160. <view style="padding-left: 10rpx;color: #606266;line-height: 45rpx;">{{ disposeInfo.policeSecurityTestVo.severely ? '严处' : '不严处' }}</view>
  161. </view>
  162. <view class="card-item" style="display: block;">
  163. <view style="font-weight: 600;">理由:</view>
  164. <view style="padding-left: 10rpx;color: #606266;line-height: 45rpx;">{{ disposeInfo.policeSecurityTestVo.reason }}</view>
  165. </view>
  166. </view>
  167. </template>
  168. </template>
  169. </view>
  170. </template>
  171. <script>
  172. import { formatIdCard } from '@/utils/util.js'
  173. import { getInfoDispose, getInfoStreamList } from '@/network/module/my-fillin.api.js'
  174. import TitleStatus from '@/components/title-status/title-status'
  175. import HNavbar from '@/components/h-navbar/h-navbar.vue'
  176. export default {
  177. components: {
  178. TitleStatus,
  179. HNavbar
  180. },
  181. data() {
  182. return {
  183. typeIcon: ['progress1.png','progress2.png','progress3.png','progress4.png'],
  184. info: {},
  185. currentTag: 1, // 1、基本情况; 2、行为人/单位信息; 3、处理情况
  186. streamInfo: {},
  187. disposeInfo: {}
  188. }
  189. },
  190. filters: {
  191. violationTypeFormat(value) {
  192. if(!value) {
  193. return ''
  194. }
  195. if(value === 1) {
  196. return '旅客'
  197. } else if(value === 2) {
  198. return '货代'
  199. } else if(value === 3) {
  200. return '工作人员'
  201. }
  202. return ''
  203. },
  204. idCardFormat(value) {
  205. return formatIdCard(value)
  206. }
  207. },
  208. computed: {
  209. // 基本情况1
  210. currentTag11() {
  211. if(!this.info || Object.keys(this.info) <= 0) {
  212. return null
  213. }
  214. const safeThingsPlace = this.info.safeThingsPlace ? JSON.parse(this.info.safeThingsPlace) : null
  215. let safeThingsPlaceStr = null
  216. if(safeThingsPlace && safeThingsPlace.length > 0) {
  217. safeThingsPlaceStr = '验证:'
  218. for(let i = 0; i < safeThingsPlace.length; i++) {
  219. safeThingsPlaceStr += `(${ safeThingsPlace[i].checked ? "√" : " " })${ safeThingsPlace[i].value }${ safeThingsPlace[i].extra || '' } `
  220. }
  221. }
  222. let flight = ''
  223. if(this.info.flightNumber) {
  224. flight += this.info.flightNumber
  225. }
  226. if(this.info.seatNumber) {
  227. flight += (this.info.flightNumber ? '-' : '') + this.info.seatNumber
  228. }
  229. const obj = [
  230. {
  231. key: '事件类型',
  232. value: this.info.safeThingsTypeName || ''
  233. },
  234. {
  235. key: '查获时间',
  236. value: this.info.queryTime || ''
  237. },
  238. {
  239. key: '查获位置',
  240. value: safeThingsPlaceStr || ''
  241. },
  242. {
  243. key: '查获地点',
  244. value: this.info.safeThingsAddressName || ''
  245. },
  246. {
  247. key: '航班信息',
  248. value: flight
  249. },
  250. {
  251. key: '受害对象',
  252. value: this.info.victims || ''
  253. }
  254. ]
  255. return obj
  256. },
  257. // 行为人/单位信息
  258. currentTag21() {
  259. if(!this.info || Object.keys(this.info) <= 0) {
  260. return null
  261. }
  262. const obj = [
  263. {
  264. key: '国籍',
  265. value: this.info.behaviorNationality || ''
  266. },
  267. {
  268. key: '籍贯',
  269. value: this.info.behaviorPlace || ''
  270. },
  271. {
  272. key: '民族',
  273. value: this.info.behaviorNation || ''
  274. },
  275. {
  276. key: '出生日期',
  277. value: this.info.behavionBirth || ''
  278. },
  279. {
  280. key: '婚姻状况',
  281. value: this.info.behavionMarriage ? this.getBehavionMarriageFormat(this.info.behavionMarriage) : ''
  282. },
  283. {
  284. key: '学历',
  285. value: this.info.behavionEducation || ''
  286. },
  287. {
  288. key: '职业',
  289. value: this.info.behavionWork || ''
  290. },
  291. {
  292. key: '工作单位',
  293. value: this.info.behavionCompany || ''
  294. },
  295. {
  296. key: '座机号',
  297. value: this.info.behavionLandline || ''
  298. },
  299. {
  300. key: '住址',
  301. value: this.info.behavionAddress || ''
  302. }
  303. ]
  304. return obj
  305. },
  306. currentTag22() {
  307. if(!this.info || Object.keys(this.info) <= 0) {
  308. return null
  309. }
  310. const obj1 = [
  311. {
  312. key: '单位名称',
  313. value: this.info.goodsCompany || ''
  314. },
  315. {
  316. key: '工商备案号',
  317. value: this.info.goodsBusinessNumber || ''
  318. },
  319. {
  320. key: '注册地',
  321. value: this.info.goodsRegistrationPlace || ''
  322. },
  323. {
  324. key: '法人姓名',
  325. value: this.info.goodsLegalPerson || ''
  326. },
  327. {
  328. key: '法人证件号',
  329. value: this.info.goodsLegalCard || ''
  330. },
  331. {
  332. key: '货单号',
  333. value: this.info.goodsNumber || ''
  334. }
  335. ]
  336. const obj2 = [
  337. {
  338. key: '发货人姓名',
  339. value: this.info.goodsSendName || ''
  340. },
  341. {
  342. key: '发货人电话',
  343. value: this.info.goodsSendPhone || ''
  344. },
  345. {
  346. key: '发货人地址',
  347. value: this.info.goodsSendAddress || ''
  348. }
  349. ]
  350. const obj3 = [
  351. {
  352. key: '收货人姓名',
  353. value: this.info.goodsDeliveryName || ''
  354. },
  355. {
  356. key: '收货人电话',
  357. value: this.info.goodsDeliveryPhone || ''
  358. },
  359. {
  360. key: '收货人地址',
  361. value: this.info.goodsDeliveryAddress || ''
  362. }
  363. ]
  364. return [obj1,obj2,obj3]
  365. }
  366. },
  367. watch: {
  368. currentType(newVal, oldVal) {
  369. this.getPageList(true)
  370. }
  371. },
  372. onLoad(options) {
  373. if(options && options.obj) {
  374. this.info = JSON.parse(decodeURIComponent(options.obj))
  375. this.getStreamInfo(this.info.safeThingsId)
  376. }
  377. // this.getPageList()
  378. },
  379. methods: {
  380. tagItemClick(index) {
  381. if(index === this.currentTag) {
  382. return
  383. }
  384. this.currentTag = index
  385. },
  386. // 旅客、工作人员的 简要情况
  387. getFriefDetailsFormat() {
  388. let json = this.$config.datas.briefDetailsJson
  389. if(this.info.briefDetailsList && this.info.briefDetailsList.length > 0) {
  390. json = json.map(item => {
  391. if(this.info.briefDetailsList.includes(item.key)) {
  392. item.checked = true
  393. } else {
  394. item.checked = false
  395. }
  396. return item
  397. })
  398. }
  399. if(this.info.briefDetailsOther) {
  400. json.find(item => item.hasOwnProperty('extra')).checked = true
  401. }
  402. let str = '经安全检查,被移交人存在下列第( '
  403. const checkeds = json.filter(item => {
  404. return item.checked
  405. })
  406. if(checkeds && checkeds.length > 0) {
  407. str += checkeds.map(item => item.key).join(',')
  408. }
  409. str += ')种疑似违法行为:' + '\n'
  410. for(let i = 0; i < json.length; i++) {
  411. str += `${ json[i].value }${ json[i].extra || '' }(${ json[i].checked ? "√" : " " })\n`
  412. }
  413. return str
  414. },
  415. // 婚姻状况 1-未婚 2-已婚 3-离异 4-丧偶
  416. getBehavionMarriageFormat(value) {
  417. if(value === 1) {
  418. return '未婚'
  419. } else if(value === 2) {
  420. return '已婚'
  421. } else if(value === 3) {
  422. return '离异'
  423. } else if(value === 4) {
  424. return '丧偶'
  425. } else {
  426. return ''
  427. }
  428. },
  429. // 获取安全事件处理流程
  430. async getStreamInfo(id) {
  431. if(!id) {
  432. return
  433. }
  434. const result = await getInfoStreamList(id)
  435. this.streamInfo = {
  436. // 1-值班领导审核环节 2-民警处置审核环节 3-公安局归档审核环节, 0-已申请,等待值班领导确认
  437. linkId: 0,
  438. // 审核状态 1-待确认 2-待受案 3-已受案 4-已完成 0-已申请
  439. status: 0
  440. }
  441. if(result && result.data && result.data.length > 0) {
  442. const stream = result.data[result.data.length-1]
  443. this.streamInfo.linkId = stream.linkId
  444. this.streamInfo.status = stream.status
  445. if(stream.linkId > 0) {
  446. this.getInfoDispose(id)
  447. }
  448. }
  449. },
  450. // 获取安全事件-处理情况
  451. async getInfoDispose(id) {
  452. if(!id) {
  453. return
  454. }
  455. const result = await getInfoDispose(id)
  456. this.disposeInfo = result.data
  457. }
  458. }
  459. }
  460. </script>
  461. <style lang="scss" scoped>
  462. .my-fillin-container {
  463. display: flex;
  464. flex-direction: column;
  465. .head-layout-wrap {
  466. width: 100%;
  467. height: 162rpx;
  468. position: relative;
  469. .head-layout {
  470. width: calc(100% - 80rpx);
  471. display: flex;
  472. align-items: center;
  473. padding: 10rpx 40rpx 16rpx;
  474. background-color: #3D7CF7;
  475. position: fixed;
  476. z-index: 999;
  477. .head-left {
  478. flex: auto;
  479. display: flex;
  480. flex-direction: column;
  481. .head-tag {
  482. width: 144rpx;
  483. background-color: #fff;
  484. border-radius: 26rpx;
  485. height: 42rpx;
  486. display: flex;
  487. justify-content: center;
  488. align-items: center;
  489. color: #276EFE;
  490. font-size: 28rpx;
  491. font-weight: 500;
  492. }
  493. .head-title {
  494. font-weight: 500;
  495. font-size: 36rpx;
  496. color: #fff;
  497. margin-top: 4rpx;
  498. }
  499. .head-ss {
  500. font-weight: 400;
  501. font-size: 28rpx;
  502. color: #fff;
  503. margin-top: 4rpx;
  504. }
  505. }
  506. .head-right {
  507. width: 128rpx;
  508. flex: none;
  509. display: flex;
  510. align-items: center;
  511. margin-left: 28rpx;
  512. }
  513. }
  514. }
  515. .info-btn {
  516. background-color: #F1F7FF;
  517. border-radius: 84rpx;
  518. width: 660rpx;
  519. height: 84rpx;
  520. margin-top: 24rpx;
  521. align-self: center;
  522. display: flex;
  523. align-items: center;
  524. justify-content: center;
  525. font-weight: 500;
  526. font-size: 30rpx;
  527. color: #5F77B8;
  528. }
  529. .content-tag-layout {
  530. margin-top: 28rpx;
  531. width: 100%;
  532. display: flex;
  533. align-items: center;
  534. justify-content: space-evenly;
  535. .tag-item {
  536. font-size: 32rpx;
  537. color: #8094C8;
  538. font-weight: 500;
  539. position: relative;
  540. .tag-item-index-active {
  541. position: relative;
  542. width: 100%;
  543. height: 26rpx;
  544. background-color: #BBD2FD;
  545. border-radius: 26rpx;
  546. position: absolute;
  547. bottom: 0;
  548. left: 0;
  549. z-index: 1;
  550. }
  551. }
  552. .tag-item-active {
  553. font-size: 36rpx;
  554. font-weight: 700;
  555. color: #276EFE;
  556. }
  557. }
  558. .content-card {
  559. align-self: center;
  560. width: calc(660rpx - 48rpx);
  561. background-color: #F6FAFF;
  562. border-radius: 16rpx;
  563. display: flex;
  564. flex-direction: column;
  565. padding: 24rpx;
  566. margin-top: 16rpx;
  567. &:last-of-type {
  568. margin-bottom: 24rpx;
  569. }
  570. .card-item {
  571. margin-top: 8rpx;
  572. display: flex;
  573. align-items: flex-start;
  574. font-size: 30rpx;
  575. color: #333333;
  576. font-weight: 400;
  577. view:nth-of-type(1) {
  578. flex: none;
  579. }
  580. view:nth-of-type(2) {
  581. color: #333333;
  582. text-align: left;
  583. padding-left: 0rpx;
  584. }
  585. .item-right-text {
  586. flex: auto;
  587. color: #5F77B8 !important;
  588. font-weight: 500;
  589. padding-left: 70rpx !important;
  590. text-align: right !important;
  591. line-height: 40rpx;
  592. }
  593. }
  594. }
  595. .content-person {
  596. align-self: center;
  597. width: calc(660rpx - 48rpx);
  598. background-color: #F6FAFF;
  599. border-radius: 16rpx;
  600. display: flex;
  601. align-items: center;
  602. padding: 24rpx;
  603. margin-top: 16rpx;
  604. .person-left {
  605. width: 132rpx;
  606. height: 176rpx;
  607. flex: none;
  608. margin-right: 24rpx;
  609. }
  610. .person-right {
  611. flex: auto;
  612. display: flex;
  613. flex-direction: column;
  614. view {
  615. font-size: 30rpx;
  616. font-weight: 400;
  617. color: #333333;
  618. margin-top: 2rpx;
  619. &:first-of-type {
  620. margin-top: 0;
  621. }
  622. }
  623. }
  624. }
  625. }
  626. </style>