From 68404100b734b63d1220bb3637d665676eeb32a3 Mon Sep 17 00:00:00 2001
From: songshankun <songshankun@foxmail.com>
Date: 星期一, 06 十一月 2023 16:01:53 +0800
Subject: [PATCH] feat: 工艺参数列表添加滚动加载

---
 src/stores/craftModel.ts                       |   41 +++++++++++++++++---
 src/views/dashboard/components/ProcessInfo.vue |    8 ++--
 src/views/dashboard/index.vue                  |   40 ++++++++++++++++----
 src/views/dashboard/components/CraftInfo.vue   |    2 
 src/components.d.ts                            |    3 +
 src/api/index.ts                               |    9 ++++
 6 files changed, 83 insertions(+), 20 deletions(-)

diff --git a/src/api/index.ts b/src/api/index.ts
index 03bc1c8..e474d51 100644
--- a/src/api/index.ts
+++ b/src/api/index.ts
@@ -11,6 +11,13 @@
   msg: string
 }
 
+export interface ListResponse<T = any> {
+  code: number
+  data: T
+  msg: string
+  total: number
+}
+
 export interface TaskListParams {
   /** 1鏈畬鎴�2浠婂ぉ鏈畬鎴�3宸插畬鎴� */
   type: 1 | 2 | 3
@@ -134,7 +141,7 @@
  * @param params
  */
 export function apiGetCraftModelList(params: CraftModelListParams) {
-  return request<BaseResponse<CraftModel[]>>({
+  return request<ListResponse<CraftModel[]>>({
     url: '/v1/processModel/list',
     method: 'get',
     params
diff --git a/src/components.d.ts b/src/components.d.ts
index 5374a8f..5683fb2 100644
--- a/src/components.d.ts
+++ b/src/components.d.ts
@@ -27,4 +27,7 @@
     RouterLink: typeof import('vue-router')['RouterLink']
     RouterView: typeof import('vue-router')['RouterView']
   }
+  export interface ComponentCustomProperties {
+    vInfiniteScroll: typeof import('element-plus/es')['ElInfiniteScroll']
+  }
 }
diff --git a/src/stores/craftModel.ts b/src/stores/craftModel.ts
index 9b8afbd..b550e86 100644
--- a/src/stores/craftModel.ts
+++ b/src/stores/craftModel.ts
@@ -1,22 +1,25 @@
-import { ref, watch } from 'vue'
+import { computed, ref, watch } from 'vue'
 import { defineStore } from 'pinia'
 import type { CraftModel } from '@/api/craftModel'
 import { apiGetCraftModelList } from '@/api'
 import { useTasksStore } from '@/stores/tasks'
 
 const watcher = ref()
-
+const page = ref(1)
+const total = ref(0)
 export const useCraftModelStore = defineStore('craftModel', () => {
-  const craftModelList = ref<CraftModel[]>()
+  const craftModelList = ref<CraftModel[]>([])
   const taskStore = useTasksStore()
   function getCraftModelList() {
     if (taskStore.activeTask?.Procedure.ID) {
+      craftModelList.value = []
       apiGetCraftModelList({
         procedureId: taskStore.activeTask?.Procedure.ID,
-        page: 1,
-        pageSize: 999
+        page: page.value,
+        pageSize: 6
       }).then((res) => {
         craftModelList.value = res.data ?? []
+        total.value = res.total
       })
     }
   }
@@ -25,10 +28,36 @@
     watch(
       () => taskStore.activeTask,
       () => {
+        page.value = 1
         getCraftModelList()
       }
     )
   }
 
-  return { craftModelList, getCraftModelList }
+  const loading = ref(false)
+
+  function loadMore() {
+    if (taskStore.activeTask?.Procedure.ID && !loading.value && hasMore.value) {
+      page.value++
+      loading.value = true
+      apiGetCraftModelList({
+        procedureId: taskStore.activeTask?.Procedure.ID,
+        page: page.value,
+        pageSize: 6
+      })
+        .then((res) => {
+          craftModelList.value = [...craftModelList.value, ...(res.data ?? [])]
+          total.value = res.total
+        })
+        .finally(() => {
+          loading.value = false
+        })
+    }
+  }
+
+  const hasMore = computed(() => {
+    return total.value > craftModelList.value.length
+  })
+
+  return { craftModelList, getCraftModelList, hasMore, loading, loadMore }
 })
diff --git a/src/views/dashboard/components/CraftInfo.vue b/src/views/dashboard/components/CraftInfo.vue
index 3ebac61..6fd8472 100644
--- a/src/views/dashboard/components/CraftInfo.vue
+++ b/src/views/dashboard/components/CraftInfo.vue
@@ -13,7 +13,7 @@
     </div>
     <div class="tip-current">褰撳墠浣跨敤</div>
     <div class="btn">
-      <el-button type="primary" class="color_organge"> 鏇存柊宸ヨ壓</el-button>
+      <el-button type="primary"> 鏇存柊宸ヨ壓</el-button>
     </div>
   </div>
 </template>
diff --git a/src/views/dashboard/components/ProcessInfo.vue b/src/views/dashboard/components/ProcessInfo.vue
index 65ab682..95ba326 100644
--- a/src/views/dashboard/components/ProcessInfo.vue
+++ b/src/views/dashboard/components/ProcessInfo.vue
@@ -13,7 +13,7 @@
     </div>
     <div v-if="craftModel.isUpdate" class="tip-current">褰撳墠浣跨敤</div>
     <div class="btn">
-      <el-button type="primary" class="color_organge" @click="onUpdateClick"> 鏇存柊宸ヨ壓 </el-button>
+      <el-button type="primary" @click="onUpdateClick"> 鏇存柊宸ヨ壓 </el-button>
     </div>
   </div>
 </template>
@@ -31,10 +31,10 @@
 }>()
 
 function onDetailClick() {
-  emit('detail', craftModel)
+  emit('detail', craftModel.value)
 }
 function onUpdateClick() {
-  emit('update', craftModel)
+  emit('update', craftModel.value)
 }
 </script>
 
@@ -51,7 +51,7 @@
   padding: 23px 10px 10px;
   background: $status-done;
   border-radius: 8px;
-  float: left;
+  //float: left;
   overflow: hidden;
   font-size: 15px;
   position: relative;
diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue
index af278ea..5f99ae8 100644
--- a/src/views/dashboard/index.vue
+++ b/src/views/dashboard/index.vue
@@ -15,14 +15,30 @@
           <ProcessingInfo style="margin-top: 6px" :task="activeTask"></ProcessingInfo>
         </el-tab-pane>
         <el-tab-pane label="宸ヨ壓淇℃伅" name="宸ヨ壓淇℃伅">
-          <el-scrollbar always>
-            <ProcessInfo
-              v-for="item in craftModelStore.craftModelList"
-              :key="item.ID"
-              :craft-model="item"
-              @detail="openCraftModelDetailModal"
-            ></ProcessInfo>
-          </el-scrollbar>
+          <div style="height: 300px">
+            <el-scrollbar always style="height: 100%">
+              <div
+                v-infinite-scroll="craftModelStore.loadMore"
+                infinite-scroll-delay="500"
+                infinite-scroll-distance="40"
+                style="display: flex; align-items: center; flex-wrap: wrap"
+              >
+                <ProcessInfo
+                  v-for="item in craftModelStore.craftModelList"
+                  :key="item.ID"
+                  :craft-model="item"
+                  @detail="openCraftModelDetailModal"
+                ></ProcessInfo>
+              </div>
+              <div class="craft-loaded-tip">
+                <el-icon v-if="craftModelStore.loading" class="is-loading" size="30">
+                  <Loading />
+                </el-icon>
+
+                <div v-if="!craftModelStore.hasMore">鍔犺浇瀹屾垚</div>
+              </div>
+            </el-scrollbar>
+          </div>
         </el-tab-pane>
         <el-tab-pane label="鐗╂枡娓呭崟" name="鐗╂枡娓呭崟">
           <InputMaterialsList
@@ -94,6 +110,7 @@
 import { useCraftModelStore } from '@/stores/craftModel'
 import CraftDetailModal from '@/views/dashboard/components/CraftDetailModal.vue'
 import MaterialDetails from '@/views/dashboard/components/MaterialDetails.vue'
+import { Loading } from '@element-plus/icons-vue'
 
 defineOptions({
   name: 'DashboardView'
@@ -219,4 +236,11 @@
   width: 100%;
   font-size: 20px;
 }
+.craft-loaded-tip {
+  height: 40px;
+  text-align: center;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
 </style>

--
Gitblit v1.8.0