okrBack.vue 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <div style="height: 100%;" :class="{ bg_fff: skeletonLoad }">
  3. <van-nav-bar title="待办提醒" left-text="" left-arrow @click-left="routerBak" />
  4. <VanSkeleton :skeLoad="skeletonLoad">
  5. <template>
  6. <header class="performanceList">
  7. <van-tabs v-model="active" @change="minFormTabs" swipeable>
  8. <van-tab v-for="(item, index) in minFormactive" :key="index">
  9. <template #title>
  10. <div style="position: relative;">
  11. {{item.name}}
  12. <em v-if="item.age > 0" class="cunt" :class="{ cunts: item.age > 99 }">
  13. <i v-if="item.age < 100">{{ item.age }}</i>
  14. <i v-else>99+</i>
  15. </em>
  16. </div>
  17. </template>
  18. </van-tab>
  19. </van-tabs>
  20. </header>
  21. <scroller ref="work_bench_scroller" class="all" :on-refresh="refresh" :on-infinite="infinite" noDataText="我也是有底线的" :list="backlogList">
  22. <div>
  23. <van-empty description="暂无信息" v-if="backlogList.length == 0" />
  24. <div v-else v-for="(item, index) in backlogList" :key="index">
  25. <div class="backlog_list_tit">{{ item.time }}</div>
  26. <div v-for="(arr, keys) in item.list" :key="keys" @click="openDetail(arr)" :style="'z-index:' + (item.list.length - keys)" class="performanceList backlog_list">
  27. <div class="flex-box" style="align-items: center;">
  28. <span class="flex-1" v-html="arr.content"></span>
  29. <van-icon name="arrow" color="#b1b1b1" />
  30. </div>
  31. </div>
  32. </div>
  33. </div>
  34. </scroller>
  35. </template>
  36. </VanSkeleton>
  37. </div>
  38. </template>
  39. <script>
  40. import Vue from 'vue'
  41. import moment from 'moment'
  42. import VanSkeleton from '@/performance/components/public/VanSkeleton'
  43. import { Tab, Tabs } from 'vant'
  44. Vue.use(Tab).use(Tabs)
  45. export default {
  46. data () {
  47. return {
  48. skeletonLoad: false, // 过度骨架屏
  49. // minFormactive: [{ name: '未读', age: 0 }, { name: '已读' }],
  50. minFormactive: [{ name: '未读', age: 0 }],
  51. active: 0,
  52. backlogList: [],
  53. unread: [], // 未处理
  54. read: [], // 已处理
  55. ccData: {
  56. fb: 0,
  57. has_follow: 0, // 状态
  58. page: 1, // 当期页
  59. page_size: 10 // 一页多少数据
  60. },
  61. theBackupListcc: []
  62. }
  63. },
  64. components: { VanSkeleton },
  65. methods: {
  66. openDetail(item) {
  67. if (item.target_type == 1 || item.target_type == 2) {
  68. if(item.target_type == 1){
  69. this.$router.push({ name: 'targetDetail', query: { id: item.target_id} })
  70. }else{
  71. this.$router.push({ name: 'krDetail', query: { id: item.target_id} })
  72. }
  73. } else if(item.target_type == 3){
  74. this.$router.push({ name: 'taskDetail', query: { id: item.target_id} })
  75. } else if(item.target_type == 4){
  76. this.$router.push({ name:'projectDetail',query:{id:item.target_id}})
  77. }
  78. },
  79. cc (callback) {
  80. // 抄送
  81. let hasMore = false
  82. let params = this.ccData
  83. this.$axiosUser('get', '/api/pro/okr/notice', params).then(res => {
  84. if (res.data.code == 1) {
  85. let list = res.data.data.list
  86. if (this.ccData.page === 1) {
  87. this.theBackupListcc = list
  88. } else {
  89. this.theBackupListcc = this.theBackupListcc.concat(list)
  90. }
  91. hasMore = list.length !== 10
  92. callback && callback(hasMore)
  93. let data = this.theBackupListcc
  94. if (this.active == 0) {
  95. this.minFormactive[0].age = res.data.data.total
  96. }
  97. this.format(data)
  98. this.skeletonLoad = false
  99. }
  100. })
  101. },
  102. minFormTabs (key) {
  103. this.ccData.page = 1
  104. this.ccData.has_follow = key
  105. this.cc()
  106. },
  107. format (data) {
  108. data.forEach(item => {
  109. // 转换展示的时间格式
  110. let time=Number(item.update_time+'000');
  111. if (moment(time).format('YYYY') == moment().format('YYYY')) {
  112. item.tineKind = moment(time).format('MM月DD日')
  113. } else {
  114. item.tineKind = moment(time).format('YYYY年MM月DD日')
  115. }
  116. })
  117. // 转换成可用格式
  118. let bbt = []
  119. data.forEach(item => {
  120. if (bbt[item.tineKind]) {
  121. bbt[item.tineKind].list.push(item)
  122. } else {
  123. bbt[item.tineKind] = true
  124. bbt[item.tineKind] = {
  125. time: item.tineKind,
  126. list: []
  127. }
  128. bbt[item.tineKind].list.push(item)
  129. }
  130. })
  131. let listdata = []
  132. for (let i in bbt) {
  133. listdata.push(bbt[i])
  134. }
  135. this.$nextTick(() => {
  136. this.backlogList = listdata
  137. })
  138. },
  139. // 上拉刷新
  140. refresh (done) {
  141. this.ccData.page = 1
  142. this.cc(done)
  143. },
  144. // 下拉加载
  145. infinite (done) {
  146. this.ccData.page++
  147. this.cc(done)
  148. },
  149. vantabTit (data) {
  150. let num = data.age ? '(' + data.age + ')' : ''
  151. return data.name + num
  152. },
  153. // 返回上一页
  154. routerBak () {
  155. this.$route_back()
  156. }
  157. },
  158. }
  159. </script>
  160. <style scoped lang="less">
  161. .all {
  162. height: calc(100% - 1.82rem) !important;
  163. position: relative !important;
  164. background-color: #f5f7fa;
  165. }
  166. header {
  167. background-color: #fff;
  168. padding-left: 0.2rem;
  169. font-size: 0.3rem;
  170. z-index: 1;
  171. }
  172. .backlog_list_tit {
  173. background-color: #f5f7fa;
  174. padding: 0.2rem 0 0.2rem 0.2rem;
  175. font-size: 0.28rem;
  176. }
  177. .backlog_list {
  178. padding: 0.24rem 0.32rem;
  179. span {
  180. font-size: 0.29rem;
  181. padding-right: 0.2rem;
  182. }
  183. }
  184. .cunt {
  185. background-color: #f15532;
  186. text-align: center;
  187. line-height: 0.4rem;
  188. width: 0.4rem;
  189. height: 0.4rem;
  190. border-radius: 50%;
  191. position: absolute;
  192. top: 0.26rem;
  193. left: 2.1rem;
  194. color: #fff;
  195. font-size: 0.24rem;
  196. font-style: normal;
  197. i {
  198. font-style: normal;
  199. }
  200. }
  201. .cunts {
  202. width: auto !important;
  203. padding: 0 .04rem 0 .08rem !important;
  204. border-radius: .8rem !important;
  205. }
  206. </style>