From 4456440a36c8796cbfb6dc8df67367ea73659451 Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期三, 24 十二月 2025 17:25:56 +0800
Subject: [PATCH] 上报
---
src/views/report/index.vue | 270 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 270 insertions(+), 0 deletions(-)
diff --git a/src/views/report/index.vue b/src/views/report/index.vue
new file mode 100644
index 0000000..586f051
--- /dev/null
+++ b/src/views/report/index.vue
@@ -0,0 +1,270 @@
+<template>
+ <div class="app-container">
+ <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
+ <el-form-item label="椤圭洰鍚嶇О" prop="projectName">
+ <el-input v-model="queryParams.projectName" placeholder="鏀寔妯$硦鏌ヨ" clearable @keyup.enter.native="handleQuery" />
+ </el-form-item>
+ <el-form-item label="鐘舵��" prop="status">
+ <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable @change="handleQuery">
+ <el-option label="寰呭鏍�" value="PendingReview" />
+ <el-option label="宸查�氳繃" value="Approved" />
+ <el-option label="宸查┏鍥�" value="Reject" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鏃堕棿鑼冨洿">
+ <el-date-picker
+ v-model="datetimerange"
+ type="datetimerange"
+ value-format="yyyy-MM-dd HH:mm:ss"
+ range-separator="-"
+ start-placeholder="寮�濮嬫棩鏈�"
+ end-placeholder="缁撴潫鏃ユ湡"
+ @change="handleDateChange"
+ />
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">鏌ヨ</el-button>
+ <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">閲嶇疆</el-button>
+ </el-form-item>
+ </el-form>
+
+ <el-row :gutter="10" class="mb8">
+ <el-col :span="1.5">
+ <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+ </el-col>
+ </el-row>
+
+ <el-table v-loading="loading" :data="list">
+ <el-table-column label="缂栧彿" align="center" prop="id" width="100" />
+ <el-table-column label="椤圭洰" align="center" prop="projectName" :show-overflow-tooltip="true" min-width="220" />
+ <el-table-column label="鐢ㄦ埛" align="center" prop="userName" :show-overflow-tooltip="true" min-width="260" />
+ <el-table-column label="鏃堕棿" align="center" prop="gmtCreate" width="180">
+ <template slot-scope="scope">
+ <span>{{ scope.row.gmtCreate }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鐘舵��" align="center" prop="status" width="120">
+ <template slot-scope="scope">
+ <el-tag :type="statusTagType(scope.row)">{{ statusText(scope.row) }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" align="center" width="220" class-name="small-padding fixed-width">
+ <template slot-scope="scope">
+ <el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row)">鏌ョ湅</el-button>
+ <el-button size="mini" type="text" icon="el-icon-circle-check" @click="handleApprove(scope.row)" :disabled="statusText(scope.row) !== '寰呭鏍�'">閫氳繃</el-button>
+ <el-button size="mini" type="text" icon="el-icon-close" @click="handleReject(scope.row)" :disabled="statusText(scope.row) !== '寰呭鏍�'">椹冲洖</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <pagination
+ v-show="total>0"
+ :total="total"
+ :page.sync="queryParams.currentPage"
+ :limit.sync="queryParams.pageSize"
+ @pagination="getList"
+ />
+
+ <el-dialog :title="title" :visible.sync="detailOpen" width="700px" append-to-body>
+ <el-form ref="detailForm" :model="detail" label-width="80px" v-loading="detailLoading">
+ <el-form-item label="椤圭洰:">
+ <el-input v-model="detail.projectName" readonly />
+ </el-form-item>
+ <el-form-item label="涓婃姤浜�:">
+ <el-input v-model="detail.userName" readonly />
+ </el-form-item>
+ <el-form-item label="鍐呭:">
+ <el-input v-model="detail.content" type="textarea" readonly />
+ </el-form-item>
+ <el-form-item label="澶囨敞:">
+ <el-input v-model="detail.remake" readonly />
+ </el-form-item>
+
+ <el-form-item label="鏃堕棿:">
+ <el-input v-model="detail.gmtCreate" readonly />
+ </el-form-item>
+
+ <el-form-item label="闄勪欢:">
+ <div class="file-upload-view-only">
+ <FileUpload v-model="detail.fileUrl" :isShowTip="false" />
+ </div>
+ </el-form-item>
+ </el-form>
+ <span slot="footer">
+ <el-button @click="detailOpen=false">鍏� 闂�</el-button>
+ </span>
+ </el-dialog>
+ </div>
+ </template>
+
+<script>
+import { reportPage,review } from "@/api/report/report";
+
+export default {
+ name: "ReportList",
+ data() {
+ return {
+ loading: false,
+ showSearch: true,
+ total: 0,
+ list: [],
+ datetimerange: [],
+ queryParams: {
+ currentPage: 1,
+ pageSize: 10,
+ projectName:"",
+ status:"",
+ startDate:null,
+ endDate:null
+ },
+ detailOpen: false,
+ title:"",
+ detailLoading: false,
+ detail: {
+ id: "",
+ projectName: "",
+ content: "",
+ gmtCreate: "",
+ fileUrl: [],
+ remake:"",
+ status:"",
+ },
+ baseUrl: process.env.VUE_APP_BASE_API
+ }
+ },
+ created() {
+ this.getList();
+ },
+ methods: {
+ getList() {
+ this.loading = true;
+ reportPage(this.queryParams).then(res => {
+ this.loading = false;
+ if (res.code === 200){
+ this.list = res.data;
+ this.total = res.total;
+ }
+ }).catch(() => {
+ this.loading = false;
+ })
+ },
+ handleQuery() {
+ this.queryParams.currentPage = 1;
+ this.getList();
+ },
+ resetQuery() {
+ this.queryParams = {
+ currentPage: 1,
+ pageSize: 10,
+ projectName: "",
+ status: "",
+ startDate: null,
+ endDate: null
+ };
+ this.datetimerange = [];
+ this.getList();
+ },
+ handleDateChange(val) {
+ if (val && val.length === 2) {
+ this.queryParams.startDate = val[0];
+ this.queryParams.endDate = val[1];
+ } else {
+ this.queryParams.startDate = null;
+ this.queryParams.endDate = null;
+ }
+ this.handleQuery();
+ },
+ statusText(row) {
+ const s = row.status;
+ if (s === 'Approved') return '宸查�氳繃';
+ if (s === 'Reject') return '宸查┏鍥�';
+ return '寰呭鏍�';
+ },
+ statusTagType(row) {
+ const t = this.statusText(row);
+ if (t === '宸查�氳繃') return 'success';
+ if (t === '宸查┏鍥�') return 'danger';
+ return 'warning';
+ },
+ handleView(row) {
+ const id = row.id;
+ // 鍏堢敤琛屾暟鎹睍绀猴紝鎻愬崌鍝嶅簲閫熷害
+ this.detailLoading = true;
+ this.detailOpen = true;
+ this.title = "鏌ョ湅";
+ this.detailLoading = false;
+ this.detail.id = row.id;
+ this.detail.content = row.content;
+ this.detail.gmtCreate = row.gmtCreate;
+ this.detail.projectName = row.projectName;
+ this.detail.fileUrl = row.fileUrlArray;
+ this.detail.userName = row.userName;
+ this.detail.remake = row.remake;
+
+
+ },
+ handleApprove(row) {
+ this.$prompt('璇疯緭鍏ュ娉�', '鎻愮ず', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ inputPattern: /.+/,
+ inputErrorMessage: '璇疯緭鍏ュ娉�'
+ }).then(({ value}) =>{
+ const params ={
+ id:row.id,
+ status:"Approved",
+ remake:value
+ }
+ review(params).then(res => {
+ this.$message.success('宸查�氳繃');
+ this.getList();
+ })
+ })
+
+
+ },
+ handleReject(row) {
+ this.$prompt('璇疯緭鍏ラ┏鍥炲師鍥�', '鎻愮ず', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ inputPattern: /.+/,
+ inputErrorMessage: '璇疯緭鍏ュ師鍥�'
+ }).then(({ value }) => {
+ const params ={
+ id:row.id,
+ status:"Reject",
+ remake:value
+ }
+ review(params).then(() => {
+ this.$message.success('宸查┏鍥�');
+ this.getList();
+ })
+ }).catch(() => {})
+ },
+ fileHref(f) {
+ if (typeof f === 'string') return this.baseUrl + f;
+ if (f && f.url) return this.baseUrl + f.url;
+ return '';
+ },
+ fileName(f) {
+ const n = typeof f === 'string' ? f : f.name || f.url || '';
+ const idx = n.lastIndexOf('/');
+ return idx > -1 ? n.slice(idx + 1) : n;
+ }
+ }
+}
+</script>
+
+<style scoped>
+/* 鏍峰紡绌块�忥細瑕嗙洊缁勪欢鍐呯殑涓婁紶鎸夐挳鍜屽垹闄ゆ寜閽� */
+.file-upload-view-only >>> .upload-file-uploader {
+ display: none; /* 闅愯棌涓婁紶鎸夐挳鍖哄煙锛堝寘鍚笂浼犳寜閽拰鎻愮ず鏂囧瓧锛� */
+}
+
+.file-upload-view-only >>> .ele-upload-list__item-content-action {
+ display: none; /* 闅愯棌鍒犻櫎鎸夐挳 */
+}
+.mb8 {
+ margin-bottom: 8px;
+}
+</style>
--
Gitblit v1.8.0