detail.vue 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. <template>
  2. <view class="index-detail-page">
  3. <view class="container">
  4. <view class="tab-cont">
  5. <view class="part" v-if="type==='task'">
  6. <view class="tab">
  7. <view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">待处理</view>
  8. <view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">已完成</view>
  9. <view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(-1,3)">已撤销</view>
  10. </view>
  11. <view class="part-cont">
  12. <view class="item" v-for="item in items" :key="item.taskId" @click="handle('task',item)">
  13. <view class="title">
  14. <view class="name">{{item.taskTitle}}</view>
  15. <view class="state">{{taskStatus(item.status)}}</view>
  16. </view>
  17. <view class="tags">
  18. <text class="tag">{{taskPriority(item.taskPriority)}}</text>
  19. <text class="tag">{{item.taskCatTitle}}</text>
  20. <text class="tag">{{taskType(item.taskTypeId)}}</text>
  21. </view>
  22. <view class="time">
  23. 预期结束时间:{{item.expectedEndTime}}
  24. </view>
  25. <view class="bottom">
  26. <view class="user">
  27. <image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
  28. 处理人:{{item.handleAccountName}}
  29. </view>
  30. <view class="hand-time">
  31. {{item.launchTime}}
  32. </view>
  33. </view>
  34. </view>
  35. </view>
  36. </view>
  37. <view class="part" v-if="type==='warn'">
  38. <view class="tab">
  39. <view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">待处理</view>
  40. <view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">已处理</view>
  41. <view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(-1,3)">已撤销</view>
  42. </view>
  43. <view class="part-cont">
  44. <view class="item" v-for="item in items" :key="item.warnId" @click="handle('warn',item)">
  45. <view class="title">
  46. <view class="name">{{item.warnTitle}}</view>
  47. <view class="state">{{warningStatus(item.status)}}</view>
  48. </view>
  49. <view class="tags">
  50. <text class="tag">{{alertLevel(item.warnLevel)}}</text>
  51. </view>
  52. <view class="time">
  53. 发生时间:{{item.warnTime}}
  54. </view>
  55. <view class="bottom" v-if="item.handleAccountName">
  56. <view class="user">
  57. <image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
  58. 处理人:{{item.handleAccountName}}
  59. </view>
  60. <view class="hand-time">
  61. {{item.handleTime}}
  62. </view>
  63. </view>
  64. </view>
  65. </view>
  66. </view>
  67. <view class="part" v-if="type==='alert'">
  68. <view class="tab">
  69. <view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">活动</view>
  70. <view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">已解除</view>
  71. <view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(-1,3)">已撤销</view>
  72. </view>
  73. <view class="part-cont">
  74. <view class="item" v-for="item in items" :key="item.alertId">
  75. <view class="title">
  76. <view class="name">{{item.alertTitle}}</view>
  77. <view class="state">{{alertStatus(item.status)}}</view>
  78. </view>
  79. <view class="tags">
  80. <text class="tag">{{alertLevel(item.alertLevel)}}</text>
  81. </view>
  82. <view class="time">
  83. 发生时间:{{item.alertTime}}
  84. </view>
  85. <view class="bottom" v-if="item.clearTime">
  86. <view class="hand-time">
  87. 解除时间:{{item.clearTime}}
  88. </view>
  89. </view>
  90. <view class="bottom" v-if="item.alertContent">
  91. <view class="alertContent">
  92. 内容:{{item.alertContent}}
  93. </view>
  94. </view>
  95. </view>
  96. </view>
  97. </view>
  98. <view class="part" v-if="type==='danger'">
  99. <view class="tab">
  100. <view class="tab-item" :class="activeTab===1?'active':''" @click="tabChange(0,1)">待处理</view>
  101. <view class="tab-item" :class="activeTab===2?'active':''" @click="tabChange(1,2)">我提交</view>
  102. <view class="tab-item" :class="activeTab===3?'active':''" @click="tabChange(2,3)">我处理</view>
  103. <view class="tab-item" :class="activeTab===4?'active':''" @click="tabChange(-1,4)">我撤销</view>
  104. </view>
  105. <view class="part-cont">
  106. <view class="item" v-for="item in items" :key="item.dangerId" @click="handle('danger',item)">
  107. <view class="title">
  108. <view class="name">{{item.dangerTitle}}</view>
  109. <view class="state">{{dangerStatus(item.status)}}</view>
  110. </view>
  111. <view class="tags">
  112. <text class="tag">{{dangerLevel(item.dangerLevel)}}</text>
  113. <text class="tag">{{item.dangerCatTitle}}</text>
  114. </view>
  115. <view class="time">
  116. 预期结束时间:{{item.dangerDeadLine}}
  117. </view>
  118. <view class="bottom">
  119. <view class="user">
  120. <image class="avatar" src="/static/index/user.png" mode="widthFix"></image>
  121. 处理人:{{item.curAccountName}}
  122. </view>
  123. <view class="hand-time">
  124. {{item.submitTime}}
  125. </view>
  126. </view>
  127. </view>
  128. </view>
  129. </view>
  130. </view>
  131. </view>
  132. <template v-if="total<1">
  133. <view class="isEmpty" >
  134. <p class="word">没有数据 ^_^ </p>
  135. </view>
  136. </template>
  137. </view>
  138. </template>
  139. <script>
  140. import { getAlertByPage } from '@/api/aqpt/alertApi.js';
  141. import { getDangerByPage } from '@/api/aqpt/dangerApi.js';
  142. import { getTaskByPage } from '@/api/aqpt/taskApi.js';
  143. import { getWarningByPage } from '@/api/aqpt/warning.js';
  144. import { handleCheckTask } from '@/api/aqpt/checkTaskApi'
  145. import{
  146. taskStatus,taskPriority,taskType,
  147. alertLevel,alertStatus,
  148. dangerStatus,dangerLevel,
  149. warningLevel,warningStatus
  150. } from '@/libs/enum.js';
  151. export default {
  152. data() {
  153. return {
  154. type:undefined,
  155. activeTab:1,
  156. user:{},
  157. conditions: {
  158. page: 1,
  159. limit: 10,
  160. status:0
  161. },
  162. total:0,
  163. items:[]
  164. }
  165. },
  166. onLoad({type,name}) {
  167. this.type=type
  168. let user=uni.getStorageSync('accountInfo');
  169. this.user=user
  170. uni.setNavigationBarTitle({
  171. title:`${name||'详情'}`
  172. })
  173. this.tabChange(0,1)
  174. },
  175. methods: {
  176. taskStatus,taskPriority,taskType,
  177. alertLevel,alertStatus,
  178. dangerStatus,dangerLevel,
  179. warningLevel,warningStatus,
  180. getData(){
  181. if(this.type==='task'){
  182. this.getTaskByPage()
  183. }
  184. if(this.type==='danger'){
  185. delete this.conditions.status
  186. this.getDangerByPage()
  187. }
  188. if(this.type==='alert'){
  189. this.getAlertByPage()
  190. }
  191. if(this.type==='warn'){
  192. this.getWarningByPage()
  193. }
  194. },
  195. getWarningByPage(){
  196. let items=JSON.parse(JSON.stringify(this.items))
  197. getWarningByPage(this.conditions).then((res)=>{
  198. this.items=items.concat(res.data)
  199. this.total=res.total
  200. })
  201. },
  202. getAlertByPage(){
  203. let items=JSON.parse(JSON.stringify(this.items))
  204. getAlertByPage(this.conditions).then((res)=>{
  205. this.items=items.concat(res.data)
  206. this.total=res.total
  207. })
  208. },
  209. getDangerByPage(){
  210. let items=JSON.parse(JSON.stringify(this.items))
  211. getDangerByPage(this.conditions).then((res)=>{
  212. this.items=items.concat(res.data)
  213. this.total=res.total
  214. })
  215. },
  216. getTaskByPage(){
  217. let items=JSON.parse(JSON.stringify(this.items))
  218. getTaskByPage(this.conditions).then((res)=>{
  219. this.items=items.concat(res.data)
  220. this.total=res.total
  221. })
  222. },
  223. tabChange(value,index){
  224. this.activeTab=index
  225. this.total=0,
  226. this.items=[]
  227. this.conditions= {page: 1,limit: 10}
  228. if(this.type==='task'||this.type==='alert'||this.type==='warn'){
  229. this.conditions.status=value
  230. }
  231. if(this.type==='danger'){
  232. if (index === 1) {
  233. this.conditions.curAccountId = this.user.userId
  234. } else if (index === 2) {
  235. this.conditions.submitAccountId = this.user.userId
  236. } else if (index === 3) {
  237. this.conditions.handleAccountId = this.user.userId
  238. } else if (index === 4) {
  239. this.conditions.submitAccountId = this.user.userId
  240. this.conditions.status = -1
  241. }
  242. }
  243. this.getData()
  244. },
  245. handle(type,item){
  246. let url=""
  247. if(type==='danger'){
  248. if(item.curAccountId!==this.user.userId) return;
  249. url=`/pages/index/handle/danger/index/index?type=${type}&id=${item.dangerId}`
  250. }
  251. if(type==='task'){this.handTask(item);return};
  252. if(type==='warn'){
  253. if(this.conditions.status!==0) return;
  254. if(item.handleAccountId!==this.user.userId) return;
  255. url=`/pages/index/handle/warning/warning?id=${item.warnId}`
  256. }
  257. uni.navigateTo({
  258. url
  259. })
  260. },
  261. handTask(item){
  262. if(item.handleAccountId!==this.user.userId) return;
  263. if(this.conditions.status!==0) return;
  264. handleCheckTask(item.taskId).then((res)=>{
  265. const { checklistId, checklistTypeId } = res.data //recordId-taskId
  266. // if (checklistTypeId === 1) {// HazardRecordView
  267. // } else if (checklistTypeId === 2) {// PointRecordView
  268. // } else if (checklistTypeId === 3) {// ScoreRecordView
  269. // }
  270. uni.navigateTo({
  271. url:`/pages/index/handle/task/task?rid=${item.taskId}&cid=${checklistId}`
  272. })
  273. })
  274. },
  275. onPullDownRefresh() {
  276. this.tabChange(this.conditions.status||0,this.activeTab)
  277. uni.stopPullDownRefresh()
  278. },
  279. onReachBottom() {
  280. if(this.total>=this.conditions.page*this.conditions.limit){
  281. this.conditions.page++
  282. this.getData()
  283. }
  284. }
  285. }
  286. }
  287. </script>
  288. <style lang="scss" scoped>
  289. .index-detail-page {
  290. min-height: 100vh;
  291. padding-bottom: 100rpx;
  292. background-color: rgba(245, 246, 248, 1);
  293. .container{
  294. .tab-cont{
  295. .part{
  296. .tab{
  297. display: flex;
  298. align-items: center;
  299. justify-content: center;
  300. overflow-x: auto;
  301. background-color: #fff;
  302. padding:32rpx;
  303. .tab-item{
  304. display: inline-block;
  305. padding: 0 36rpx;
  306. background-color: #fff;
  307. text-align: center;
  308. flex-shrink: 0;
  309. line-height: 1;
  310. font-size: 32rpx;
  311. color: #333;
  312. box-sizing: border-box;
  313. border-bottom: 4rpx solid transparent;
  314. &.active{
  315. // background-color: #1e80ff;
  316. // color: #fff;
  317. // border-color: #1e80ff;
  318. color: #1e80ff;
  319. font-weight: 800;
  320. }
  321. }
  322. }
  323. .part-cont{
  324. padding: 0 32rpx;
  325. .item{
  326. background-color: #fff;
  327. border-radius: 12rpx;
  328. margin-top: 16rpx;
  329. padding: 24rpx 20rpx;
  330. .title{
  331. display: flex;
  332. justify-content: space-between;
  333. align-items: center;
  334. .name{
  335. font-size: 36rpx;
  336. color: rgba(0, 0, 0, 0.8);
  337. }
  338. .state{
  339. font-size: 32rpx;
  340. color: rgba(250, 139, 55, 1);
  341. }
  342. }
  343. .tags{
  344. padding-top: 24rpx;
  345. .tag{
  346. background: rgba(245, 246, 248, 1);
  347. font-size: 20rpx;
  348. margin-left: 10rpx;
  349. padding: 10rpx 20rpx;
  350. &:nth-child(1){
  351. color: rgba(234, 130, 89, 1);
  352. background: rgba(251, 241, 237, 1);
  353. }
  354. }
  355. }
  356. .time{
  357. padding-top: 20rpx;
  358. font-size: 28rpx;
  359. color:rgba(241, 57, 57, 0.8);
  360. }
  361. .bottom{
  362. display: flex;
  363. justify-content: space-between;
  364. align-items: center;
  365. padding-top: 20rpx;
  366. .user{
  367. display: flex;
  368. align-items: center;
  369. font-size: 24rpx;
  370. color: rgba(0, 0, 0, 1);
  371. .avatar{
  372. width: 44rpx;
  373. margin-right: 10rpx;
  374. }
  375. }
  376. .hand-time{
  377. font-size: 24rpx;
  378. color: rgba(0, 0, 0, 1);
  379. }
  380. }
  381. .alertContent{
  382. font-size: 26rpx;
  383. color: #666;
  384. line-height: 1.5;
  385. text-overflow: ellipsis;
  386. overflow: hidden;
  387. word-break: break-all;
  388. display: -webkit-box;
  389. -webkit-box-orient: vertical;
  390. -webkit-line-clamp: 2;
  391. }
  392. }
  393. }
  394. }
  395. }
  396. }
  397. .isEmpty{
  398. width: 100%;
  399. height: 100vh;
  400. background-image: url(data:image/svg+xml;base64,PHN2ZyB2aWV3Qm94PSIwIDAgNzkgODYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0iYSIgeDE9IjM4Ljg1JSIgeTE9IjAlIiB4Mj0iNjEuMTUlIiB5Mj0iMTAwJSI+PHN0b3Agc3RvcC1jb2xvcj0iI0ZDRkNGRCIgb2Zmc2V0PSIwJSIvPjxzdG9wIHN0b3AtY29sb3I9IiNFRUVGRjMiIG9mZnNldD0iMTAwJSIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPSJiIiB4MT0iMCUiIHkxPSI5LjUlIiB5Mj0iOTAuNSUiPjxzdG9wIHN0b3AtY29sb3I9IiNGQ0ZDRkQiIG9mZnNldD0iMCUiLz48c3RvcCBzdG9wLWNvbG9yPSIjRTlFQkVGIiBvZmZzZXQ9IjEwMCUiLz48L2xpbmVhckdyYWRpZW50PjxwYXRoIGlkPSJjIiBkPSJNMCAwaDE3djM2SDB6Ii8+PC9kZWZzPjxnIGZpbGw9Im5vbmUiIGZpbGwtcnVsZT0iZXZlbm9kZCI+PHBhdGggZD0iTTM5LjUgODZDNjEuMzE1IDg2IDc5IDgzLjkxIDc5IDgxLjMzM1M1Ny4zMTUgNzggMzUuNSA3OCAwIDc4Ljc1NiAwIDgxLjMzM0MwIDgzLjkxMSAxNy42ODUgODYgMzkuNSA4NnoiIGZpbGw9IiNGN0Y4RkMiLz48cGF0aCBmaWxsPSIjRTVFN0U5IiBkPSJNMTMgNDVoNDBMNDIgNThIMnpNNjUuNTUxIDI5Ljk4bC0xNi4zMTMtNy42MDctMi44NDEtNS43MzggMTYuMzEzIDcuNjA3eiIvPjxwYXRoIGZpbGw9IiNFREVFRjIiIGQ9Ik02NS41NTEgMjkuOThsLTM0LjQ0LTE2LjA1OS0xNS4yMTQgMzIuNjI3IDM0LjQ0IDE2LjA2eiIvPjxwYXRoIGZpbGw9InVybCgjYSkiIHRyYW5zZm9ybT0icm90YXRlKDI1IDI3LjQ0NiAtNDMuNDE2KSIgZD0iTTM4IDdoMTd2MzZIMzh6Ii8+PHBhdGggZmlsbD0iI0Y4RjlGQiIgZD0iTTE1LjcwNSA2LjczN2wxNS40MDcgNy4xODQgMTUuNjQ2LS40MjctMTUuNDA3LTcuMTg1eiIvPjxwYXRoIGZpbGw9InVybCgjYikiIGQ9Ik0xMyA0NWg0MHYzNkgxM3oiLz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1MyA0NSkiPjxtYXNrIGlkPSJkIiBmaWxsPSIjZmZmIj48dXNlIHhsaW5rOmhyZWY9IiNjIi8+PC9tYXNrPjx1c2UgZmlsbD0iI0UwRTNFOSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMTcgMCkiIHhsaW5rOmhyZWY9IiNjIi8+PHBhdGggZmlsbD0iI0Q1RDdERSIgbWFzaz0idXJsKCNkKSIgdHJhbnNmb3JtPSJtYXRyaXgoLTEgMCAwIDEgMjQgMCkiIGQ9Ik03IDBoMTdsLTQgMTgtMjAtMnoiLz48L2c+PHBhdGggZmlsbD0iI0Y4RjlGQiIgZD0iTTcwIDQ1SDUzbDkgMTNoMTd6Ii8+PC9nPjwvc3ZnPg==);
  401. background-size: contain;
  402. background-repeat: no-repeat;
  403. position: relative;
  404. background-color: #fff;
  405. /* #ifndef MP-WEIXIN */
  406. height: calc( 100vh - 100px);
  407. /* #endif */
  408. .word{
  409. width: 100%;
  410. text-align: center;
  411. position: absolute;
  412. top: 80vh;
  413. left: 0;
  414. color: #999;
  415. font-size: 28rpx;
  416. letter-spacing: 2rpx;
  417. }
  418. }
  419. }
  420. </style>