Browse Source

合并远程 master:保留续签/续标确认提示与 09-17 变更记录。

Co-authored-by: Cursor <cursoragent@cursor.com>
wdq 2 ngày trước cách đây
mục cha
commit
d00adfdcdb
4 tập tin đã thay đổi với 125 bổ sung71 xóa
  1. 5 2
      README.md
  2. 1 1
      src/components/renewal/Renew.vue
  3. 115 64
      src/views/ledger/Projects.vue
  4. 4 4
      src/views/map/OneMap.vue

+ 5 - 2
README.md

@@ -404,7 +404,10 @@ Internal use only.
 7、 增加项目详情页的地图展示,支持点击面展示相关信息,如有员工可查看员工相关数据
 
 - **2026-09-16**
-
 1、使用AI整理代码,增加代码可读性
+2、从项目台账中进入续签或续标时,增加确认提示
 
-2、从项目台账中进入续签或续标时,增加确认提示
+- **2026-09-17**
+1、项目台账列表页面,显示增加过期数据,过期数据放在最后面显示
+2、续签标列表查询功能,根据项目名称查询接口修改
+3、空间一张图加载loading状态颜色调整, 与本项目其他loading状态颜色一致

+ 1 - 1
src/components/renewal/Renew.vue

@@ -135,7 +135,7 @@ const getProjects = async () => {
         ...(params.search ? JSON.parse(params.search) : []),
         {
           field: "title",
-          searchType: 1,
+          searchType: 2,
           content: { value: '%'+ searchText.value + '%' },
         },
     ]);

+ 115 - 64
src/views/ledger/Projects.vue

@@ -10,11 +10,11 @@
             v-model="searchText" 
             placeholder="搜索项目名称" 
             clearable
-            @keyup.enter="getProjects"
-            @clear="getProjects"
+            @keyup.enter="queryProjects"
+            @clear="queryProjects"
             class="search-input"
           />
-          <el-button type="primary" class="btn enter-btn" @click="getProjects">查询</el-button>
+          <el-button type="primary" class="btn enter-btn" @click="queryProjects">查询</el-button>
         </div>
         <div class="empty-state" v-if="total === 0">
             <span class="empty-icon">🔍</span>
@@ -33,7 +33,8 @@
               </tr>
             </thead>
             <tbody>
-              <tr v-for="item in projects" :key="(item as any)[columnId+'_c_xmmc']">
+               <!-- MultipleFormsOfJointInvestigation 接口获取的数据展示 -->
+              <!-- <tr v-for="item in projects" :key="(item as any)[columnId+'_c_xmmc']">
                 <td><span class="link-text" @click="handleViewClick(item)">{{ (item as any)[columnId+'_c_xmmc'] }}</span></td>
                 <td>{{ (item as any)[columnId+'_c_hzyt']}}</td>
                 <td>{{ (item as any)[columnId+'_c_glqynbkj'] }}</td>
@@ -42,6 +43,17 @@
                 <td>
                   <span class="link-text" @click="handleViewClick(item)">{{ (item as any)[columnId+'_name'] || '详情' }}</span>
                 </td>
+              </tr> -->
+              <!-- selectContentList 接口获取的数据展示 -->
+              <tr v-for="item in projects" :key="(item as any)['id']">
+                <td><span class="link-text" @click="handleViewClick(item)">{{ (item as any)['c_xmmc'] }}</span></td>
+                <td>{{ (item as any)['c_hzyt']}}</td>
+                <td>{{ (item as any)['c_glqynbkj'] }}</td>
+                <td>{{ (item as any)['c_zgxmhtksrq'] == undefined ? '' : moment((item as any)['c_zgxmhtksrq']).format('YYYY-MM-DD') }} - {{ (item as any)['c_zgxmhtdqrq'] == undefined ? '' : moment((item as any)['c_zgxmhtdqrq']).format('YYYY-MM-DD') }}</td>
+                <td><span :class="['badge', (item as any)['daysClass']]">{{ (item as any)['days'] }}</span></td>
+                <td>
+                  <span class="link-text" @click="handleViewClick(item)">{{ (item as any)['name'] || '详情' }}</span>
+                </td>
               </tr>
             </tbody>
           </table>
@@ -67,6 +79,7 @@
 import { ref, onMounted } from 'vue'
 import api from '@/api/common'
 import moment from 'moment'
+import { ElLoading } from 'element-plus'
 import { COLUMN } from '@/constants/dmsColumns'
 import { calcRemainingDaysOnly } from '@/utils/renewalMath'
 import { useRouter } from 'vue-router'
@@ -102,19 +115,24 @@ const searchText = ref('')
 const pageSize = ref(10)
 const page = ref(1)
 const total = ref(0)
-
+const staticData = ref<ProjectItem[]>([])
 const projects = ref<ProjectItem[]>([])
 
 const handleViewClick = (project: any) => {
-  sessionStorage.setItem('projectName', (project as any)[columnId+'_c_xmmc'])
-  sessionStorage.setItem('name', (project as any)[columnId+'_c_xmmc'] || '')
-  sessionStorage.setItem('dmsId', (project as any)[columnId+'_id'] || '')
-  router.push(`/project-detail/${(project as any)[columnId+'_id']}`)
+  // sessionStorage.setItem('projectName', (project as any)[columnId+'_c_xmmc'])
+  // sessionStorage.setItem('name', (project as any)[columnId+'_c_xmmc'] || '')
+  // sessionStorage.setItem('dmsId', (project as any)[columnId+'_id'] || '')
+  // router.push(`/project-detail/${(project as any)[columnId+'_id']}`)
+  sessionStorage.setItem('projectName', (project as any)['c_xmmc'])
+  sessionStorage.setItem('name', (project as any)['c_xmmc'] || '')
+  sessionStorage.setItem('dmsId', (project as any)['id'] || '')
+  router.push(`/project-detail/${(project as any)['id']}`)
 }
 
 const handleCurrentChange = (val: number) => {
   page.value = val
-  getProjects()
+  // getProjects()
+  getCurrentPageData()
 }
 
 
@@ -124,74 +142,107 @@ onMounted(() => {
 })
 
 const initData = () => {
-  getProjects();
+  // getProjects();
+  getAllProjects();
 }
-const getProjects = async () => {
-  // const params: any = {
-  //   columnId: COLUMN.SOURCE,
-  //   orderBy: JSON.stringify([{ field: "c_zgxmhtdqrq", orderByType: 1 }]),
-  //   states: '0,1,2,3',
-  //   pageSize: pageSize.value,
-  //   page: (page.value-1)
-  // }
-  // if (searchText.value) {
-  //   params.search = JSON.stringify([
-  //       ...(params.search ? JSON.parse(params.search) : []),
-  //       {
-  //         field: "title",
-  //         searchType: 2,
-  //         content: { value: searchText.value },
-  //       },
-  //   ]);
-  // }
-  // const res = await getDmsDataList(params)
-
+// 获取所有项目
+const getAllProjects = async () => {
+    const loading = ElLoading.service({
+      lock: true,
+      text: '加载数据中,请稍候...',
+      background: 'rgba(0, 0, 0, 0.7)',
+    })
   const params: any = {
     columnId: columnId,
-    orderBy: columnId+','+'c_zgxmhtdqrq,asc',
+    orderBy: JSON.stringify([{ field: "c_zgxmhtdqrq", orderByType: 1 }]),
     states: '0,1,2,3',
-    pageSize: pageSize.value,
-    page: (page.value)
+    pageSize: 99999,
+    page: 0
   }
-  if (searchText.value) {
-    params.conditionsList = JSON.stringify([
-      ...(params.conditionsList ? JSON.parse(params.conditionsList) : []),
-      {
-        columnId: columnId,
-        columnName: "c_xmmc",
-        condition: "like",
-        value: `%${searchText.value}%`
-      }
-    ]);
-  }
-  // 查询距离到期时间小于60天的项目 当前为隐藏
-  params.conditionsList = JSON.stringify([
-      ...(params.conditionsList ? JSON.parse(params.conditionsList) : []),
-      {
-        columnId: columnId,
-        columnName: "c_zgxmhtdqrq",
-        condition: "between",
-        value: [moment().add(0, 'days').format('YYYY-MM-DD HH:mm:ss'), '2099-01-01 00:00:00']
-      }
-  ]);
-  
-  const res = await api.getMultipleFormsOfJointInvestigation(params)
-
+  const res = await getDmsDataList(params)
+  loading.close()
   if ((res as any).code === 200) {
-    projects.value = (res as any).content.data.map((item: any) => ({
+    console.log(res)
+    const allData = (res as any).content.data.map((item: any) => ({
       ...item,
-      ...calculateRemainingDays((item as any)[columnId+'_c_zgxmhtdqrq'])
+      ...calculateRemainingDays((item as any)['c_zgxmhtdqrq'])
     }))
+    const lastData = allData.filter((item: any) => item.days.includes('已过期'))
+    const todayData = allData.filter((item: any) => !item.days.includes('已过期'))
+    staticData.value = todayData.concat(lastData.reverse())
     total.value = (res as any).content.count
+    getCurrentPageData()
   }else{
     projects.value = []
     total.value = 0
   }
-} 
+}
+// 计算属性:截取当前页数据
+const getCurrentPageData = () => {
+  const start = (page.value-1) * pageSize.value
+  const end = start + pageSize.value
+  if(searchText.value){
+     const itemData = staticData.value.filter((item: any) => item.c_xmmc.includes(searchText.value))
+     projects.value = itemData.slice(start, end)
+     total.value = itemData.length
+  }else{
+    projects.value = staticData.value.slice(start, end)
+    total.value = staticData.value.length
+  }
+}
+// 按项目名称查询项目
+const queryProjects = () => {
+  page.value = 1
+  getCurrentPageData()
+}
 
-// const getDmsDataList = async (params: any) => {
-//   return await api.getDmsDataList(params)
-// }
+// const getProjects = async () => {
+//   const params: any = {
+//     columnId: columnId,
+//     orderBy: columnId+','+'c_zgxmhtdqrq,asc',
+//     states: '0,1,2,3',
+//     pageSize: pageSize.value,
+//     page: (page.value)
+//   }
+//   if (searchText.value) {
+//     params.conditionsList = JSON.stringify([
+//       ...(params.conditionsList ? JSON.parse(params.conditionsList) : []),
+//       {
+//         columnId: columnId,
+//         columnName: "c_xmmc",
+//         condition: "like",
+//         value: `%${searchText.value}%`
+//       }
+//     ]);
+//   }
+//   // 查询距离到期时间小于60天的项目 当前为隐藏
+//   params.conditionsList = JSON.stringify([
+//       ...(params.conditionsList ? JSON.parse(params.conditionsList) : []),
+//       {
+//         columnId: columnId,
+//         columnName: "c_zgxmhtdqrq",
+//         condition: "between",
+//         value: [moment().add(0, 'days').format('YYYY-MM-DD HH:mm:ss'), '2099-01-01 00:00:00']
+//       }
+//   ]);
+  
+//   const res = await api.getMultipleFormsOfJointInvestigation(params)
+
+//   if ((res as any).code === 200) {
+//     projects.value = (res as any).content.data.map((item: any) => ({
+//       ...item,
+//       ...calculateRemainingDays((item as any)[columnId+'_c_zgxmhtdqrq'])
+//     }))
+//     total.value = (res as any).content.count
+//   }else{
+//     projects.value = []
+//     total.value = 0
+//   }
+// } 
+
+const getDmsDataList = async (params: any) => {
+  return await api.getDmsDataList(params)
+}
 
 </script>
 

+ 4 - 4
src/views/map/OneMap.vue

@@ -199,8 +199,8 @@ onUnmounted(() => {
 .iframe-loading-spinner {
   width: 40px;
   height: 40px;
-  border: 3px solid rgba(255, 255, 255, 0.2);
-  border-top-color: #409eff;
+  border: 3px solid rgba(255, 255, 255, 0);
+  border-top-color: var(--el-color-primary);
   border-radius: 50%;
   animation: spin 0.8s linear infinite;
 }
@@ -212,12 +212,12 @@ onUnmounted(() => {
 }
 
 .iframe-loading-text {
-  color: #c0ccda;
+  color: var(--el-color-primary);
   font-size: 14px;
 }
 
 .iframe-loading-retry {
-  color: #909399;
+  color: var(--el-color-primary);
   font-size: 13px;
   display: flex;
   align-items: center;