WorkOverChoose.vue 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <view style="width: 100%;">
  3. <u-action-sheet :show="show" @close="onClose">
  4. <view class="cu-bar bg-white">
  5. <view class="action text-blue" @tap="onClose">取消</view>
  6. <view class="action text-green" @tap="selectUsers">确定</view>
  7. </view>
  8. <view style="max-height: 300px; overflow-y: auto;">
  9. <!-- 标题行 -->
  10. <view style="padding: 10px; font-weight: bold; display: flex; align-items: center;">
  11. <view style="flex: 1;text-align: left;">工单编号</view>
  12. <view style="flex: 1;text-align: left;">创建时间</view>
  13. <view style="flex: 1;text-align: left;">备注</view>
  14. </view>
  15. <view v-for="item in data" :key="item.id" style="padding: 10px;">
  16. <view @tap="onItemClick(item)" style="display: flex; align-items: center;">
  17. <view style="flex: 1;text-align: left; ">{{ item.no }}</view>
  18. <view style="flex: 1;text-align: left; ">{{ item.showCreateTime }}</view>
  19. <view style="flex: 1;text-align: left; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">{{ item.remarks }}</view>
  20. <view v-if="item.checked" style="color: #409eff;">已选择</view>
  21. <!--<view v-if="item.checked" style="color: #409eff;">✔</view>-->
  22. </view>
  23. </view>
  24. </view>
  25. <view v-if="!allDataLoaded && !loading" style="text-align: center; padding: 10px;">
  26. <button class="load-more-button" @tap="loadMore">加载更多</button>
  27. </view>
  28. <view v-if="loading" style="text-align: center; padding: 10px;">
  29. Loading...
  30. </view>
  31. </u-action-sheet>
  32. </view>
  33. </template>
  34. <script>
  35. import overService from '@/api/garbageClearance/overService'
  36. export default {
  37. data() {
  38. return {
  39. checkType: '1',
  40. show: false,
  41. labels:'',
  42. index:'',
  43. type:'',
  44. data: [],
  45. localMode: '', // 声明一个本地数据属性
  46. allDataLoaded: false, // 跟踪是否所有数据都已加载
  47. loading: false, // 跟踪加载状态
  48. pageSize: 10, // 每页获取的项目数
  49. currentPage: 1 // 当前页数
  50. };
  51. },
  52. props: {
  53. value: String,
  54. placeholder: {
  55. type: String,
  56. default: '请选择项目'
  57. },
  58. readonly: {
  59. type: Boolean,
  60. default: false
  61. },
  62. disabled: {
  63. type: Boolean,
  64. default: false
  65. },
  66. },
  67. mounted() {
  68. // this.loadData();
  69. },
  70. methods: {
  71. init(index) {
  72. this.pageSize = 10
  73. this.currentPage = 1
  74. this.show = true;
  75. this.index = index;
  76. this.localMode = 'multiple'
  77. this.loadData();
  78. },
  79. onItemClick(item) {
  80. if (this.localMode === 'single') {
  81. this.data.forEach(node => {
  82. node.checked = node === item;
  83. });
  84. } else {
  85. item.checked = !item.checked;
  86. }
  87. },
  88. selectUsers() {
  89. if (this.data.some(item => item.checked)) {
  90. let checkedItems = this.data.filter(item => item.checked).map(item => {
  91. return {
  92. id: item.id,
  93. no: item.no,
  94. };
  95. });
  96. this.$emit('input', checkedItems, this.index);
  97. this.onClose()
  98. } else {
  99. uni.showToast({
  100. title: '请至少选择一条数据',
  101. icon: 'none',
  102. duration: 2000
  103. });
  104. }
  105. },
  106. loadData() {
  107. this.loading = true; // 开始加载数据,显示loading状态
  108. overService.getNotDisposeList({ disposeStatus: 1, current: this.currentPage, pageSize: this.pageSize })
  109. .then(data => {
  110. this.loading = false; // 数据加载完成,隐藏loading状态
  111. // 检查新返回的数据是否已经存在,如果存在,则不添加到原始数据数组中
  112. let newData = data.records.filter(record => !this.data.some(item => item.id === record.id));
  113. if (this.currentPage === 1) {
  114. // 如果是加载第一页,则直接赋值给 data
  115. this.data = newData.map(item => ({ ...item, checked: false }));
  116. } else {
  117. // 如果不是第一页,则追加到原始数据数组后面
  118. this.data = [...this.data, ...newData.map(item => ({ ...item, checked: false }))];
  119. }
  120. if (data.records.length < this.pageSize) {
  121. this.allDataLoaded = true; // 如果返回的数据少于每页数量,则表示所有数据都已加载
  122. }
  123. if (this.value) {
  124. let keys = this.value.split(',');
  125. this.data.forEach(node => {
  126. if (keys.includes(node.id)) {
  127. node.checked = true;
  128. }
  129. });
  130. this.labels = this.data.filter(node => node.checked).map(node => node.label).join(',');
  131. }
  132. })
  133. .catch(e => {
  134. this.loading = false; // 数据加载失败,隐藏loading状态
  135. throw e;
  136. });
  137. },
  138. loadMore() {
  139. this.currentPage++; // 增加当前页数
  140. this.loadData(); // 加载更多数据
  141. },
  142. onClose() {
  143. // 在关闭操作中清除已选择标记
  144. this.data.forEach(item => {
  145. item.checked = false;
  146. });
  147. this.labels = ''; // 清空标签
  148. this.show = false;
  149. this.data = []; // 清空原始数据
  150. },
  151. checkTypeChange(value){
  152. this.pageSize = 10
  153. this.currentPage = 1
  154. this.data = []; // 清空原始数据
  155. this.loadData(); // 加载更多数据
  156. },
  157. isEmpty(value) {
  158. let result = false;
  159. if (value == null || value == undefined) {
  160. result = true;
  161. }
  162. if (typeof value == 'string' && (value.replace(/\s+/g, "") == "" || value == "")) {
  163. result = true;
  164. }
  165. if (typeof value == "object" && value instanceof Array && value.length === 0) {
  166. result = true;
  167. }
  168. return result;
  169. },
  170. isNotEmpty (value) {
  171. return !this.isEmpty(value)
  172. },
  173. }
  174. };
  175. </script>
  176. <style scoped>
  177. .load-more-button {
  178. background-color: #409eff;
  179. color: #fff;
  180. border: none;
  181. padding: 10px 20px;
  182. border-radius: 4px;
  183. cursor: pointer;
  184. }
  185. </style>