msg.vue 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. <template>
  2. <view class="msg-container">
  3. <uni-nav-bar
  4. fixed="true"
  5. statusBar="true"
  6. left-icon="back"
  7. title="我的消息"
  8. @clickLeft="back"
  9. >
  10. <view slot="right" class="icon-wrapper">
  11. <image
  12. class="icon-clear"
  13. src="@/static/clear.svg"
  14. @click="readAll"
  15. ></image>
  16. <image
  17. class="icon-select"
  18. src="@/static/select.svg"
  19. @click="toggleChecked"
  20. ></image>
  21. </view>
  22. </uni-nav-bar>
  23. <view class="tool-box">
  24. <view class="tool-box-wrapper">
  25. <u-transition :show="checkShow" mode="fade-down">
  26. <view class="inner">
  27. <text @tap="checkShow = false">取消</text>
  28. <text @tap="markDelete">删除</text>
  29. </view>
  30. </u-transition>
  31. </view>
  32. <checkbox-group @change="handleCheckChange">
  33. <view v-for="(item, index) in list" class="list-item" :key="index">
  34. <CardTime :time="item.sendingTime" />
  35. <view class="msg-card" @tap="viewDetail(item)">
  36. <label>
  37. <view class="title">
  38. {{ item.title }}
  39. <text v-if="item.messageStatus == 1" class="text-danger"
  40. >未读</text
  41. >
  42. <text v-else>已读</text>
  43. </view>
  44. <view class="content">
  45. <checkbox :value="item.id + ''" v-if="checkShow"></checkbox>
  46. {{ item.messageContent }}
  47. </view>
  48. </label>
  49. <view class="footer"> 查看详情 </view>
  50. </view>
  51. </view>
  52. </checkbox-group>
  53. </view>
  54. </view>
  55. </template>
  56. <script>
  57. import { get, postJ } from '../../../utils/api'
  58. import CardTime from '../components/CardTime.vue'
  59. let [page, isEnd] = [1, false]
  60. export default {
  61. components: {
  62. CardTime
  63. },
  64. data () {
  65. return {
  66. checkList: [],
  67. list: [],
  68. checkShow: false,
  69. messageType: {
  70. 0: '系统消息',
  71. 1: '提醒消息',
  72. 2: '告警消息'
  73. },
  74. messageStatus: {
  75. 0: '已读',
  76. 1: '未读'
  77. }
  78. }
  79. },
  80. onReachBottom () {
  81. if (isEnd) return
  82. page++
  83. this.getList()
  84. },
  85. onShow () {
  86. page = 1
  87. this.getList()
  88. },
  89. methods: {
  90. /* PATROL(1, "巡点检"),
  91. MAINTAIN(2, "保养"),
  92. REPAIR(3, "维修"),
  93. INVENTORY(4, "盘点"),
  94. OUT_WARE(5, "出库"),
  95. IN_WARE(6, "入库"),
  96. TRANSFER(7, "库存调拨"),
  97. REPORT_LOSS_OVERFLOW(8,"报损报溢"); */
  98. viewDetail (item) {
  99. if (item.planType?.code === 3) {
  100. this.markRead([item.id])
  101. uni.navigateTo({
  102. url: `/pages/repair/detail/detail?id=${item.workOrderId}`
  103. })
  104. } else {
  105. uni.showToast({
  106. title: '功能待开发',
  107. icon: 'none'
  108. })
  109. }
  110. switch (item.messageType) {
  111. case 0: //系统消息
  112. break
  113. case 1: //提醒消息
  114. break
  115. case 2: //告警消息
  116. break
  117. default:
  118. break
  119. }
  120. },
  121. markRead (ids = [], type = 1) {
  122. return postJ(this.apiUrl + '/myMessage/markRead?type=' + type, ids)
  123. },
  124. async markDelete () {
  125. if (!this.checkList?.length) return
  126. const _this = this
  127. uni.showModal({
  128. title: '提示',
  129. content: '确定删除选中消息?',
  130. success: async res => {
  131. if (res.confirm) {
  132. const res = await postJ(
  133. _this.apiUrl + '/myMessage/delete',
  134. _this.checkList
  135. )
  136. if (res?.success) {
  137. page = 1
  138. _this.getList()
  139. }
  140. }
  141. }
  142. })
  143. },
  144. toggleChecked () {
  145. this.checkShow = !this.checkShow
  146. this.checkList = []
  147. },
  148. handleCheckChange ({ detail }) {
  149. this.checkList = detail.value
  150. },
  151. async readAll () {
  152. await this.markRead(
  153. this.list.filter(i => i.messageStatus == 1).map(i => i.id),
  154. 0
  155. )
  156. page = 1
  157. this.getList()
  158. },
  159. getList () {
  160. const params = {
  161. page,
  162. size: 8
  163. }
  164. get(this.apiUrl + '/myMessage/getMyMessageList', params).then(res => {
  165. if (res?.success) {
  166. if (params.page === 1) {
  167. this.list = []
  168. }
  169. this.list.push(...res.data.list.records)
  170. isEnd = this.list.length >= res.data.list.total
  171. }
  172. })
  173. }
  174. }
  175. }
  176. </script>
  177. <style lang="scss" scoped>
  178. .msg-container {
  179. padding: 0 20rpx;
  180. // background-color: $page-bg;
  181. min-height: 100vh;
  182. .list-item {
  183. margin-top: 18rpx;
  184. &:nth-of-type(2n) {
  185. .msg-card {
  186. background-color: #fef7ee;
  187. }
  188. }
  189. }
  190. .tool-box {
  191. position: relative;
  192. padding-top: 40rpx;
  193. .tool-box-wrapper {
  194. position: absolute;
  195. left: 0;
  196. top: 0;
  197. right: 0;
  198. padding-top: 10rpx;
  199. .inner {
  200. width: 100%;
  201. display: flex;
  202. justify-content: space-between;
  203. }
  204. }
  205. }
  206. .msg-card {
  207. background-color: #fceaec;
  208. font-size: 28rpx;
  209. border-radius: 8rpx;
  210. .title {
  211. display: flex;
  212. justify-content: space-between;
  213. padding: 12rpx 14rpx;
  214. }
  215. .content {
  216. padding: 10rpx 14rpx;
  217. min-height: 4em;
  218. }
  219. .footer {
  220. font-size: 28rpx;
  221. padding: 12rpx 14rpx;
  222. color: #7f7f7f;
  223. }
  224. }
  225. }
  226. .icon-wrapper {
  227. .icon-clear {
  228. width: 48rpx;
  229. margin-right: 15rpx;
  230. }
  231. .icon-select {
  232. width: 42rpx;
  233. }
  234. }
  235. </style>