|
|
@@ -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;
|