processList.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <template>
  2. <view class="content" :style="`height: ${contentHeight}`">
  3. <z-paging :fixed="false" @query="queryData" :value="list" :default-page-size="pSize" :default-page-no="pageNo"
  4. ref="paging">
  5. <view @click="handleToDetail(process)" v-for="(process, index) in list" :key="index">
  6. <uni-card :isFull="true" padding="10px 0">
  7. <uni-row>
  8. <uni-col :xs="3" :sm="2">
  9. <view class="icon_container">
  10. <text style="
  11. font-size: 2.5rem;" class="ygoa-icon" :class="iconDict[process.modelName]"></text>
  12. </view>
  13. </uni-col>
  14. <uni-col :xs="21" :sm="22">
  15. <uni-card padding="0" :isFull="true" :border="false" :is-shadow="false">
  16. <template v-slot:title>
  17. <uni-row>
  18. <uni-col :xs="19" :sm="22" v-if="current !== 0">
  19. <view class="process_title">
  20. <text>{{ process.insName }}</text>
  21. </view>
  22. </uni-col>
  23. <uni-col v-else>
  24. <view class="process_title">
  25. <text>{{ process.insName }}</text>
  26. </view>
  27. </uni-col>
  28. <uni-col :xs="5" :sm="2" v-if="current !== 0">
  29. <view class="process_status">
  30. <uni-tag v-if="current === 1" text="审批中" type="success"></uni-tag>
  31. <uni-tag v-else-if="current === 2" text="审批中" type="success"></uni-tag>
  32. <uni-tag v-else-if="current === 3" text="已办结" type="primary"></uni-tag>
  33. </view>
  34. </uni-col>
  35. </uni-row>
  36. </template>
  37. <view class="process_contant">
  38. <uni-row>
  39. <uni-col :xs="8" :sm="7">流程类型:</uni-col>
  40. <uni-col :xs="15" :sm="16" style="color: blue;">{{ process.typeName || '无'
  41. }}</uni-col>
  42. </uni-row>
  43. <uni-row>
  44. <uni-col :xs="8" :sm="7">创建时间:</uni-col>
  45. <uni-col :xs="15" :sm="16">{{ process.createdate }}</uni-col>
  46. </uni-row>
  47. </view>
  48. </uni-card>
  49. </uni-col>
  50. </uni-row>
  51. </uni-card>
  52. </view>
  53. </z-paging>
  54. </view>
  55. </template>
  56. <script setup lang="ts">
  57. import { ref } from 'vue';
  58. const iconDict = ref({
  59. '外协结算申请': 'icon-outsourcing',
  60. '用车申请': 'icon-apply-car',
  61. '出差申请': 'icon-apply-business',
  62. '外出申请': 'icon-apply-out',
  63. '费用报销申请': 'icon-apply-expense',
  64. '加班申请': 'icon-apply-overtime',
  65. '请假申请': 'icon-apply-leave',
  66. '采购申请': 'icon-apply-purchase',
  67. '合同会签': 'icon-apply-sign-contract'
  68. })
  69. const props = defineProps({
  70. contentHeight: { type: String, default: '85vh' },
  71. current: { type: Number, default: 0 }, // 消息类型
  72. list: { type: Array, required: true }, // 消息数据
  73. pSize: { type: Number, default: 10 }, // 分页大小
  74. pageNo: { type: Number, default: 1 }, // 默认页
  75. })
  76. const emits = defineEmits([
  77. 'clickSegment', // 点击分段器
  78. 'clickItem', // 点击内容项
  79. 'scrollToBottom' // 到达底部
  80. ])
  81. const paging = ref(null)
  82. // 加载完成 更新数据
  83. function complete(list, total, pageNo) {
  84. // 第一页直接加载数据
  85. if (pageNo === 1) {
  86. paging.value.complete(list)
  87. return
  88. }
  89. // 防止重复获取最后一次信息
  90. if (props.pSize * pageNo < total) {
  91. paging.value.complete(list)
  92. } else {
  93. paging.value.complete([])
  94. }
  95. }
  96. // 点击分段器
  97. function onClickItem() {
  98. // 重新加载数据 pageNo恢复为默认值
  99. // console.log('onClickItem');
  100. paging.value.reload()
  101. // reloadData()
  102. }
  103. // 刷新
  104. function queryData(pageNo, pSize, queryType) {
  105. switch (queryType) {
  106. case 0: // 下拉刷新
  107. case 1: // 初始加载
  108. reloadData()
  109. break
  110. case 3: // 上拉加载
  111. scrollQuery(pageNo, pSize)
  112. break
  113. default: // 默认刷新
  114. reloadData()
  115. break
  116. }
  117. }
  118. // 刷新数据
  119. function reloadData() {
  120. const params = {
  121. pSize: props.pSize,
  122. pageNo: props.pageNo,
  123. }
  124. emits('clickSegment', params, complete)
  125. }
  126. // 上拉加载
  127. function scrollQuery(pageNo, pSize) {
  128. const params = {
  129. pSize,
  130. pageNo,
  131. }
  132. emits('scrollToBottom', params, complete)
  133. }
  134. function handleToDetail(process) { // 跳转流程详情页
  135. emits('clickItem', process)
  136. }
  137. defineExpose({
  138. onClickItem,
  139. });
  140. </script>
  141. <style lang="scss">
  142. @import url("@/static/font/ygoa/iconfont.css");
  143. .content {
  144. .icon_container {
  145. margin: 45% 0;
  146. }
  147. .process_title {
  148. // TODO 长度限制15字
  149. line-height: 1.5rem;
  150. white-space: nowrap;
  151. overflow: hidden;
  152. text-overflow: ellipsis;
  153. font-weight: 500;
  154. font-size: 1.1rem;
  155. margin: 5px 0;
  156. color: #333;
  157. }
  158. .process_status {
  159. margin: 5px 0;
  160. height: 1.5rem;
  161. display: flex;
  162. align-items: center;
  163. justify-content: center;
  164. text-align: center;
  165. white-space: nowrap;
  166. overflow: hidden;
  167. }
  168. .process_contant {
  169. color: #777;
  170. }
  171. }
  172. </style>