suhp 1 月之前
父节点
当前提交
ce35f2cc41
共有 1 个文件被更改,包括 573 次插入233 次删除
  1. 573 233
      src/views/home/index.vue

+ 573 - 233
src/views/home/index.vue

@@ -29,7 +29,7 @@
           </div>
           <div
             ref="chartRef"
-            style="width: 100%; height: 400px; margin-top: 20px"
+            style="width: 100%; height: 320px; margin-top: 20px"
           ></div>
           <!-- 轮播显示器 -->
           <ul
@@ -42,7 +42,7 @@
               :key="idx"
               @click="goToPage(idx)"
             >
-              <i :class="{ active: idx === currentPage }"></i>
+              <i :class="{ active: idx === chartCurrentPage }"></i>
             </li>
           </ul>
         </el-card>
@@ -59,31 +59,15 @@
             </el-button>
           </div>
           <ul class="news-list card-content">
-            <li v-for="(item, idx) in newsList" :key="idx" class="news-item">
-              <div class="news-content">
-                <div class="news-title">
-                  <i class="icon-dot"></i>
-                  {{ item.content }}
-                </div>
-                <div class="news-meta">
-                  <div class="left-icon">
-                    <img
-                      style="width: 14px; height: 14px; vertical-align: middle"
-                      src="@/assets/index_images/index-icon3@2x.png"
-                      alt="管理员"
-                    />
-                    <span>管理员</span>
-                  </div>
-                  <div class="left-icon">
-                    <img
-                      style="width: 14px; height: 14px; vertical-align: middle"
-                      src="@/assets/index_images/index-icon4@2x.png"
-                      alt="时间"
-                    />
-                    <span>{{ item.date }}</span>
-                  </div>
-                </div>
-              </div>
+            <li
+              v-for="(item, idx) in newsList"
+              :key="idx"
+              class="news-item-new"
+            >
+              <span class="news-dot"></span>
+              <span class="news-title-text">{{ item.noticeTitle }}</span>
+              <span class="news-author">{{ item.remark || '管理员' }}</span>
+              <span class="news-time">{{ item.createTime }}</span>
             </li>
           </ul>
         </el-card>
@@ -99,100 +83,181 @@
               <img src="@/assets/index_images/index-icon5@2x.png" alt="" />
               <h3>本人待办事项</h3>
             </div>
-            <el-select
-              v-model="auditType"
-              placeholder="请选择监审类型"
-              style="width: 220px"
-            >
-              <el-option
-                label="山西省公立幼儿园教育成本监审"
-                value="山西省公立幼儿园教育成本监审"
-              ></el-option>
-            </el-select>
+            <div class="search-actions">
+              <el-input
+                v-model="todoSearchQuery"
+                placeholder="监审项目名称"
+                style="width: 300px; margin-right: 10px"
+                clearable
+              />
+              <el-button type="primary" @click="handleTodoSearch">
+                查询
+              </el-button>
+            </div>
           </div>
           <el-table
+            v-loading="loading"
             :data="todoList"
             style="width: 100%"
             :stripe="false"
             class="no-zebra"
+            border
+            default-expand-all
+            row-key="id"
+            :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
           >
-            <el-table-column align="center" label="预警" width="60">
+            <el-table-column
+              type="index"
+              label="序号"
+              width="80"
+              header-align="center"
+              align="center"
+            >
               <template slot-scope="scope">
-                <img
-                  v-if="scope.row.warning"
-                  src="@/assets/index_images/index-icon7@2x.png"
-                  alt=""
-                  style="width: 15px"
-                />
+                <!-- 只显示父节点的序号 -->
+                <span v-if="scope.row.children">
+                  {{ getParentNodeIndex(scope.row) }}
+                </span>
+                <span v-else></span>
               </template>
             </el-table-column>
             <el-table-column
-              align="center"
-              prop="task"
-              label="成本监审任务"
-              show-overflow-tooltip
-            ></el-table-column>
-            <el-table-column
-              align="center"
-              prop="unit"
-              label="被监审单位"
+              prop="projectName"
+              label="成本监审项目名称"
               show-overflow-tooltip
-            ></el-table-column>
+              header-align="center"
+              align="left"
+            />
             <el-table-column
-              prop="auditForm"
-              label="监审形式"
-              width="100"
-              align="center"
+              prop="auditObject"
+              label="监审对象"
+              header-align="center"
+              align="left"
               show-overflow-tooltip
-            ></el-table-column>
+            />
             <el-table-column
               prop="auditPeriod"
               label="监审期间"
-              width="150"
+              header-align="center"
               align="center"
-              show-overflow-tooltip
-            ></el-table-column>
+              width="120"
+            />
             <el-table-column
+              prop="source"
+              label="立项来源"
+              header-align="center"
               align="center"
-              prop="status"
-              label="办理状态"
               width="100"
-              show-overflow-tooltip
-            ></el-table-column>
-            <el-table-column align="center" label="操作" width="100">
+            />
+            <el-table-column
+              prop="form"
+              label="监审形式"
+              header-align="center"
+              align="center"
+              width="100"
+            />
+            <el-table-column
+              prop="currentNodeName"
+              label="状态"
+              align="center"
+              width="150"
+            >
               <template slot-scope="scope">
-                <el-button
-                  v-if="scope.row.op === '任务详情'"
-                  type="text"
-                  size="small"
-                  @click="handleOp('详情', scope.row)"
-                >
-                  任务详情
-                </el-button>
-                <el-button
-                  v-if="scope.row.op === '任务办理'"
-                  type="text"
-                  size="small"
-                  @click="handleOp('办理', scope.row)"
-                >
-                  任务办理
-                </el-button>
-                <el-button
-                  v-if="scope.row.op === '查看'"
-                  type="text"
-                  size="small"
-                  @click="handleOp('查看', scope.row)"
-                >
-                  查看
-                </el-button>
-                <el-button
-                  v-if="scope.row.op === '审核'"
-                  type="text"
-                  size="small"
-                  @click="handleOp('审核', scope.row)"
-                >
-                  审核
-                </el-button>
+                <span v-if="!scope.row.isSubTask">
+                  <span>
+                    {{ scope.row.currentNodeName }}-{{ scope.row.statusName }}
+                  </span>
+                </span>
+                <span v-else>{{ scope.row.statusName }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" width="260">
+              <template slot-scope="scope">
+                <span v-if="!scope.row.isSubTask" class="action-buttons">
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handleViewTaskDetail(scope.row)"
+                  >
+                    任务详情
+                  </el-button>
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handleOpenMainDetails(scope.row)"
+                  >
+                    任务办理
+                  </el-button>
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handleCheckRecord(scope.row)"
+                  >
+                    备忘录
+                  </el-button>
+                </span>
+                <span v-if="scope.row.isSubTask" class="action-buttons">
+                  <el-button
+                    v-if="
+                      scope.row.currentNode === 'clcs' &&
+                      (scope.row.status === '200' || scope.row.status === '600')
+                    "
+                    type="text"
+                    size="small"
+                    @click="handleOpenDetails(scope.row)"
+                  >
+                    资料初审
+                  </el-button>
+                  <el-button
+                    v-if="
+                      (scope.row.currentNode === 'sdsh' ||
+                        scope.row.currentNode === 'yjfk') &&
+                      scope.row.status === '200'
+                    "
+                    type="text"
+                    size="small"
+                    @click="handleOpenDetails(scope.row)"
+                  >
+                    成本审核
+                  </el-button>
+                  <el-button
+                    v-if="
+                      scope.row.currentNode === 'yjgz' &&
+                      scope.row.status === '200'
+                    "
+                    type="text"
+                    size="small"
+                    @click="handleOpenDetails(scope.row)"
+                  >
+                    意见告知
+                  </el-button>
+                  <el-button
+                    v-if="
+                      scope.row.currentNode === 'yjfk' &&
+                      scope.row.status === '260'
+                    "
+                    type="text"
+                    size="small"
+                    @click="handleOpenDetails(scope.row)"
+                  >
+                    审核
+                  </el-button>
+                  <el-button
+                    v-if="scope.row.status === '300'"
+                    type="text"
+                    size="small"
+                    @click="handleHf(scope.row)"
+                  >
+                    恢复
+                  </el-button>
+                  <el-button
+                    type="text"
+                    size="small"
+                    @click="handleMessage(scope.row, 'chengben')"
+                  >
+                    查看
+                  </el-button>
+                </span>
               </template>
             </el-table-column>
           </el-table>
@@ -389,6 +454,39 @@
         </el-card>
       </el-col>
     </el-row>
+
+    <!-- 详情弹窗组件 -->
+    <details-dialog
+      :id="selectedProject && selectedProject.id"
+      ref="detailsRef"
+      :selected-project="selectedProject"
+      :visible.sync="detailsVisible"
+      :current-node="selectedProject && selectedProject.currentNode"
+      :current-status="selectedProject && selectedProject.status"
+      :task-info="selectedProject"
+      @close="handleDetailsClose"
+      @refresh="handleRefresh"
+    />
+    <!-- 主详情弹窗组件 -->
+    <mainDetailsDialog
+      :id="selectedProject && selectedProject.id"
+      ref="mainDetailsRef"
+      :visible.sync="mainDetailsVisible"
+      :current-node="selectedProject && selectedProject.currentNode"
+      :current-status="selectedProject && selectedProject.status"
+      @close="handleMainDetailsClose"
+      @refresh="handleMainRefresh"
+    />
+    <taskInfo ref="taskInfo" />
+    <!-- 成本监审信息弹窗 -->
+    <cbjs-info
+      :id="cbjsInfoData && cbjsInfoData.id"
+      :selected-project="cbjsInfoData"
+      :visible.sync="cbjsInfoVisible"
+      :current-node="cbjsInfoData && cbjsInfoData.currentNode"
+      :current-status="cbjsInfoData && cbjsInfoData.status"
+    />
+    <taskDetail ref="taskDetail" />
   </div>
 </template>
 
@@ -397,8 +495,23 @@
   import { regionMixin } from '@/mixins/useDict'
   import * as echarts from 'echarts'
   import { memoManageMixin } from '@/views/costAudit/projectInfo/auditProjectManage/memoManage/memoManageMixin'
+  import { doProcessBtn } from '@/api/dataPreliminaryReview'
+  import { getReviewTaskList } from '@/api/audit/auditIndex'
+  import { getChartList, getMsgList } from '@/api/home'
+  import detailsDialog from '@/views/costAudit/auditInfo/auditManage/details.vue'
+  import mainDetailsDialog from '@/views/costAudit/auditInfo/auditManage/mainDetails.vue'
+  import taskInfo from '@/components/task/taskInfo.vue'
+  import cbjsInfo from '@/components/task/cbjsInfo.vue'
+  import taskDetail from '@/components/task/taskDetail.vue'
   export default {
     name: 'Dashboard',
+    components: {
+      detailsDialog,
+      taskInfo,
+      cbjsInfo,
+      mainDetailsDialog,
+      taskDetail,
+    },
     mixins: [regionMixin, memoManageMixin],
     data() {
       return {
@@ -406,85 +519,48 @@
         year: '2025',
         auditType: '山西省公立幼儿园教育成本监审',
         searchKeyword: '',
+        todoSearchQuery: '',
         // 轮播相关变量
         chart: null,
         chartTimer: null,
-        currentPage: 0,
-        pageSize: 9,
+        chartCurrentPage: 0,
+        chartPageSize: 9,
         totalPages: 0,
         allCategories: [],
         allCompletedData: [],
         allInProgressData: [],
-        newsList: [
-          {
-            content: '依据定价管理规范,全面开展《山西省定价目录》修订工作',
-            date: '2025-05-06 14:00',
-          },
-          {
-            content:
-              '为适应市场发展新形势,正式启动定价管理范畴内《山西省定价目录》的调整优化工作',
-            date: '2025-05-06 14:00',
-          },
-          {
-            content:
-              '按照定价管理的既定流程和标准,积极推进《山西省定价目录》的更新完善事宜',
-            date: '2025-05-06 14:00',
-          },
-          {
-            content:
-              '基于当前价格管理工作的实际需求,着力实施定价管理中《山西省定价目录》的修改完善行动',
-            date: '2025-05-06 14:00',
-          },
-          {
-            content:
-              '为进一步提升定价管理的科学性与精准性,全面开启《山西省定价目录》的深度修订进程',
-            date: '2025-05-06 14:00',
-          },
-        ],
-        todoList: [
-          {
-            warning: true,
-            task: '山西省公立幼儿园教育成本监审',
-            unit: 'XX幼儿园、YY幼儿园、ZZ幼儿园',
-            auditForm: '实地监审',
-            auditPeriod: '2023-2024年',
-            status: '进行中',
-            op: '任务办理',
-          },
-          {
-            warning: false,
-            task: '山西省公立医院医疗服务成本监审',
-            unit: '山西省人民医院',
-            auditForm: '实地监审',
-            auditPeriod: '2023-2024年',
-            status: '待审核',
-            op: '审核',
-          },
-          {
-            warning: false,
-            task: '太原市生活垃圾处理成本监审',
-            unit: '太原市环卫局',
-            auditForm: '书面监审',
-            auditPeriod: '2023-2024年',
-            status: '已完成',
-            op: '查看',
-          },
-          {
-            warning: false,
-            task: '山西省公立小学教育成本监审',
-            unit: '太原市实验小学等10所学校',
-            auditForm: '实地监审',
-            auditPeriod: '2023-2024年',
-            status: '待分配',
-            op: '任务详情',
-          },
-        ],
+        newsList: [],
+        todoList: [],
         memoList: [],
         currentDate: new Date(),
         selectedDate: '',
         showTooltip: false,
+        // 成本审核列表相关
+        currentPage: 1,
+        pageSize: 100,
+        total: 0,
+        loading: false,
+        detailsVisible: false,
+        selectedProject: null,
+        cbjsInfoVisible: false,
+        cbjsInfoData: null,
+        mainDetailsVisible: false,
       }
     },
+    watch: {
+      // 监听年份变化
+      year(newVal) {
+        if (newVal) {
+          this.loadChartData()
+        }
+      },
+      // 监听地区变化
+      areaCode(newVal) {
+        if (newVal) {
+          this.loadChartData()
+        }
+      },
+    },
     mounted() {
       this.$el.querySelector('div.el-calendar__header').remove()
       let user = this.$permission.getUserInfo()
@@ -497,8 +573,131 @@
       }
       this.initChart()
       this.initCalendarData(5)
+      this.getTodoList()
+      this.loadNewsList()
     },
     methods: {
+      getTodoList() {
+        this.loadAuditProjectList()
+      },
+      // 加载最新消息
+      async loadNewsList() {
+        try {
+          const response = await getMsgList()
+          if (response.state && response.value) {
+            this.newsList = response.value || []
+          }
+        } catch (error) {
+          console.error('加载最新消息失败:', error)
+        }
+      },
+      // 待办事项搜索
+      handleTodoSearch() {
+        this.currentPage = 1
+        this.loadAuditProjectList()
+      },
+      // 加载审核项目列表
+      async loadAuditProjectList() {
+        try {
+          this.loading = true
+          const params = {
+            currentPage: this.currentPage,
+            pageSize: this.pageSize,
+            projectName: this.todoSearchQuery,
+          }
+          const response = await getReviewTaskList(params)
+
+          if (response.state && response.value) {
+            const records = response.value.records || []
+            // 转换数据格式,将childTasks转换为children以适应表格组件
+            this.todoList = records.map((record) => {
+              return {
+                id: record.id,
+                projectName: record.projectName,
+                auditObject: record.auditedUnitName,
+                auditPeriod: record.auditPeriod,
+                source: this.getSourceTypeText(record.sourceType),
+                form: this.getAuditTypeText(record.auditType),
+                status: this.getStatusText(record.status),
+                statusName: record.statusName,
+                isSubTask: record.pid !== '0',
+                currentNodeName: record.currentNodeName,
+                currentNode: record.currentNode,
+                projectId: record.projectId,
+                auditedUnitId: record.auditedUnitId,
+                children: record.childTasks
+                  ? record.childTasks.map((child) => ({
+                      id: child.id,
+                      projectName: child.projectName,
+                      auditObject: child.auditedUnitName,
+                      auditPeriod: record.auditPeriod,
+                      source: '',
+                      form: '',
+                      currentNode: child.currentNode,
+                      status: child.status,
+                      statusName: child.statusName,
+                      isSubTask: true,
+                      projectId: child.projectId,
+                      auditedUnitId: child.auditedUnitId,
+                      taskId: child.id,
+                      catalogId: child.catalogId,
+                    }))
+                  : [],
+              }
+            })
+            this.total = response.value.total || 0
+          } else {
+            this.todoList = []
+            this.total = 0
+          }
+        } catch (error) {
+          console.error('加载审核项目列表失败:', error)
+        } finally {
+          this.loading = false
+        }
+      },
+      // 获取父节点的连续序号
+      getParentNodeIndex(row) {
+        // 过滤出所有父节点
+        const parentNodes = this.todoList.filter(
+          (item) => item.children && item.children.length > 0
+        )
+        // 找到当前行在父节点数组中的索引
+        const index = parentNodes.findIndex((item) => item.id === row.id)
+        // 返回序号(索引+1)
+        return index + 1
+      },
+      // 获取来源类型文本
+      getSourceTypeText(type) {
+        const typeMap = {
+          1: '年度计划内',
+          2: '年度计划外',
+        }
+        return typeMap[type] || type
+      },
+      // 获取审核类型文本
+      getAuditTypeText(type) {
+        const typeMap = {
+          1: '定期监审',
+          2: '定调价监审',
+        }
+        return typeMap[type] || type
+      },
+      // 获取状态文本
+      getStatusText(status) {
+        const statusMap = {
+          ccls: '资料初审',
+          200: '审核通过',
+          clcs: '审核中',
+        }
+        return statusMap[status] || status
+      },
+      // 查记录
+      handleCheckRecord(project) {
+        this.$router.push({
+          name: 'memoManage',
+        })
+      },
       // 判断是否为周末
       isWeekend(date) {
         const day = date.getDay() // 0-6,0表示周日,6表示周六
@@ -508,18 +707,8 @@
         // 保存图表实例到组件实例中
         this.chart = echarts.init(this.$refs.chartRef)
 
-        // 初始化数据
-        this.initChartData()
-
-        // 初始加载第一页数据
-        this.updateChartData()
-
-        // 设置定时器,每5秒切换一页数据
-        this.chartTimer = setInterval(() => {
-          this.currentPage =
-            this.totalPages > 1 ? (this.currentPage + 1) % this.totalPages : 0
-          this.updateChartData()
-        }, 5000)
+        // 加载图表数据
+        this.loadChartData()
 
         // 监听窗口大小变化
         window.addEventListener('resize', () => {
@@ -533,45 +722,66 @@
           }
         })
       },
+      // 加载图表数据
+      async loadChartData() {
+        try {
+          const params = {
+            year: this.year,
+            region: this.areaCode,
+          }
+          const response = await getChartList(params)
+
+          if (response.state && response.value) {
+            const data = response.value || []
+            // 解析接口返回的数据
+            this.allCategories = data.map((item) => ({ name: item.name }))
+            this.allCompletedData = data.map((item) => item.finish)
+            this.allInProgressData = data.map((item) => item.nFinish)
+
+            // 每页显示9个数据
+            this.chartPageSize = 9
+            this.chartCurrentPage = 0
+            this.totalPages = Math.ceil(
+              this.allCategories.length / this.chartPageSize
+            )
+
+            // 初始加载第一页数据
+            this.updateChartData()
+
+            // 设置定时器,每5秒切换一页数据
+            if (this.chartTimer) {
+              clearInterval(this.chartTimer)
+            }
+            this.chartTimer = setInterval(() => {
+              this.chartCurrentPage =
+                this.totalPages > 1
+                  ? (this.chartCurrentPage + 1) % this.totalPages
+                  : 0
+              this.updateChartData()
+            }, 5000)
+          } else {
+            // 如果接口没有数据,使用初始化默认数据
+            this.initChartData()
+            this.updateChartData()
+          }
+        } catch (error) {
+          console.error('加载图表数据失败:', error)
+          // 出错时使用默认数据
+          this.initChartData()
+          this.updateChartData()
+        }
+      },
 
       // 初始化图表数据
       initChartData() {
         // 扩展数据,确保有足够的数据用于轮播
-        this.allCategories = [
-          { name: '输配电' },
-          { name: '燃气' },
-          { name: '交通运输' },
-          { name: '供热' },
-          { name: '托育服务' },
-          { name: '养老服务' },
-          { name: '文化旅游' },
-          { name: '教育服务' },
-          { name: '医疗服务' },
-          { name: '供水服务' },
-          { name: '公共交通' },
-          { name: '殡葬服务' },
-          { name: '有线电视' },
-          { name: '停车收费' },
-          { name: '景区门票' },
-          { name: '垃圾处理' },
-          { name: '公共租赁' },
-          { name: '污水处理' },
-        ]
-
-        // 已办和在办的完整数据
-        this.allCompletedData = [
-          45, 38, 42, 39, 43, 48, 46, 44, 47, 52, 49, 51, 43, 40, 55, 37, 41,
-          50,
-        ]
-        this.allInProgressData = [
-          18, 25, 16, 22, 20, 17, 19, 21, 24, 18, 23, 20, 25, 19, 17, 22, 24,
-          16,
-        ]
-
+        this.allCategories = []
         // 每页显示9个数据
-        this.pageSize = 9
-        this.currentPage = 0
-        this.totalPages = Math.ceil(this.allCategories.length / this.pageSize)
+        this.chartPageSize = 9
+        this.chartCurrentPage = 0
+        this.totalPages = Math.ceil(
+          this.allCategories.length / this.chartPageSize
+        )
       },
 
       // 跳转到指定页面
@@ -582,7 +792,7 @@
             clearInterval(this.chartTimer)
           }
           // 更新当前页
-          this.currentPage = index
+          this.chartCurrentPage = index
           this.updateChartData()
           // 重新设置定时器
           this.resumeCarousel()
@@ -601,7 +811,8 @@
       resumeCarousel() {
         if (!this.chartTimer && this.totalPages > 1) {
           this.chartTimer = setInterval(() => {
-            this.currentPage = (this.currentPage + 1) % this.totalPages
+            this.chartCurrentPage =
+              (this.chartCurrentPage + 1) % this.totalPages
             this.updateChartData()
           }, 5000)
         }
@@ -626,9 +837,9 @@
           currentInProgressData = inProgressData
         } else {
           // 否则使用当前页的数据
-          const startIndex = this.currentPage * this.pageSize
+          const startIndex = this.chartCurrentPage * this.chartPageSize
           const endIndex = Math.min(
-            startIndex + this.pageSize,
+            startIndex + this.chartPageSize,
             this.allCategories.length
           )
 
@@ -707,23 +918,111 @@
 
         this.chart.setOption(option, true)
       },
-    },
-    loadMoreNews() {
-      //  跳转通知公告页面
-      this.$router.push('/personal/notice')
-    },
-    handleOp(type, row) {
-      this.$message.info(`执行【${type}】操作:${row.task}`)
-    },
-    searchMemo() {
-      this.$message.info(`搜索备忘录,关键词:${this.searchKeyword}`)
-    },
-    hasEventOnDate(date) {
-      // 检查指定日期是否有备忘录事件
-      return this.memoList.some((item) => item.time === date.substring(5))
-    },
-    addMemo() {
-      this.$message.info('添加新备忘录')
+      loadMoreNews() {
+        //  跳转通知公告页面
+        this.$router.push('/personal/notice')
+      },
+      handleOp(type, row) {
+        if (type === '详情') {
+          this.$refs.taskDetail.open(row, 'chengben')
+        } else if (type === '办理') {
+          this.selectedProject = row
+          this.mainDetailsVisible = true
+        } else if (type === '查看') {
+          this.cbjsInfoData = row
+          this.cbjsInfoVisible = true
+        } else if (type === '审核') {
+          this.selectedProject = row
+          this.detailsVisible = true
+        }
+      },
+      // 打开详情弹窗
+      handleOpenDetails(project) {
+        this.selectedProject = project
+        this.detailsVisible = true
+      },
+      handleOpenMainDetails(project) {
+        this.selectedProject = project
+        this.mainDetailsVisible = true
+      },
+      // 详情弹窗关闭处理
+      handleDetailsClose() {
+        this.selectedProject = null
+        this.detailsVisible = false
+      },
+      // 主详情弹窗关闭处理
+      handleMainDetailsClose() {
+        this.selectedProject = null
+        this.mainDetailsVisible = false
+      },
+      // 刷新表格数据
+      handleRefresh() {
+        this.loadAuditProjectList()
+      },
+      // 主详情刷新处理
+      handleMainRefresh() {
+        this.loadAuditProjectList()
+      },
+      // 恢复任务
+      async handleHf(row) {
+        if (!row || !row.id) {
+          this.$message.error('缺少任务ID')
+          return
+        }
+
+        this.$confirm('确定要恢复此任务吗?', '恢复任务', {
+          confirmButtonText: '确定',
+          cancelButtonText: '取消',
+          type: 'warning',
+        })
+          .then(async () => {
+            try {
+              const params = {
+                taskId: row.id,
+                key: 2,
+                status: 200,
+                processNodeKey: row.currentNode,
+              }
+
+              const response = await doProcessBtn(params)
+
+              if (response && response.code === 200) {
+                this.$message.success('恢复任务成功')
+                this.loadAuditProjectList()
+              } else {
+                this.$message.error(response?.message || '恢复任务失败')
+              }
+            } catch (error) {
+              console.error('恢复任务失败:', error)
+            }
+          })
+          .catch(() => {
+            this.$message.info('已取消恢复任务')
+          })
+      },
+      // 查看
+      handleMessage(row, type) {
+        if (type === 'chengben') {
+          this.cbjsInfoData = row
+          this.cbjsInfoVisible = true
+        } else {
+          this.$refs.taskInfo.open(row, type)
+        }
+      },
+      // 查看任务详情
+      handleViewTaskDetail(row) {
+        this.$refs.taskDetail.open(row, 'chengben')
+      },
+      searchMemo() {
+        this.$message.info(`搜索备忘录,关键词:${this.searchKeyword}`)
+      },
+      hasEventOnDate(date) {
+        // 检查指定日期是否有备忘录事件
+        return this.memoList.some((item) => item.time === date.substring(5))
+      },
+      addMemo() {
+        this.$message.info('添加新备忘录')
+      },
     },
   }
 </script>
@@ -783,7 +1082,7 @@
     width: 100%;
   }
   .card-content {
-    width: 100%;
+    width: 90%;
     padding: 20px;
   }
   .news-item {
@@ -796,6 +1095,47 @@
   .news-item:last-child {
     border-bottom: none;
   }
+  /* 新的消息列表样式 */
+  .news-item-new {
+    width: 100%;
+    padding: 10px 0;
+    display: flex;
+    align-items: center;
+    border-bottom: 1px solid #f0f0f0;
+    font-size: 14px;
+    line-height: 1.5;
+  }
+  .news-item-new:last-child {
+    border-bottom: none;
+  }
+  .news-dot {
+    width: 6px;
+    height: 6px;
+    background-color: #409eff;
+    border-radius: 50%;
+    margin-right: 12px;
+    flex-shrink: 0;
+  }
+  .news-title-text {
+    flex: 1;
+    color: #333333;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    margin-right: 20px;
+  }
+  .news-author {
+    color: #999999;
+    margin-right: 20px;
+    flex-shrink: 0;
+    min-width: 60px;
+  }
+  .news-time {
+    color: #cccccc;
+    flex-shrink: 0;
+    min-width: 140px;
+    text-align: right;
+  }
   .news-content {
     width: 100%;
     line-height: 1.6;