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