From be125538c6e9c17a923c9dbe1e4cca9962b0ed39 Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期一, 08 九月 2025 10:17:53 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into ywx
---
src/views/collaborativeApproval/officeSupplies/index.vue | 512 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 512 insertions(+), 0 deletions(-)
diff --git a/src/views/collaborativeApproval/officeSupplies/index.vue b/src/views/collaborativeApproval/officeSupplies/index.vue
new file mode 100644
index 0000000..a2d1c6d
--- /dev/null
+++ b/src/views/collaborativeApproval/officeSupplies/index.vue
@@ -0,0 +1,512 @@
+<template>
+ <div class="app-container">
+ <el-card class="box-card">
+ <template #header>
+ <div class="card-header">
+ <span>鍔炲叕鐗╄祫鐢宠绠$悊</span>
+ <el-button type="primary" @click="openShow()">
+ <el-icon><Plus /></el-icon>
+ 鏂板缓鐢宠
+ </el-button>
+ </div>
+ </template>
+
+ <!-- 鎼滅储鍖哄煙 -->
+ <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch">
+ <el-form-item label="鐢宠缂栧彿" prop="code">
+ <el-input
+ v-model="queryParams.code"
+ placeholder="璇疯緭鍏ョ敵璇风紪鍙�"
+ clearable
+ style="width: 200px"
+ @keyup.enter="handleQuery"
+ />
+ </el-form-item>
+ <el-form-item label="鐢宠浜�" prop="applicant">
+ <el-input
+ v-model="queryParams.applicant"
+ placeholder="璇疯緭鍏ョ敵璇蜂汉"
+ clearable
+ style="width: 200px"
+ @keyup.enter="handleQuery"
+ />
+ </el-form-item>
+ <el-form-item label="鐢宠鐘舵��" prop="status">
+ <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px">
+ <el-option label="寰呭鎵�" value="1" />
+ <el-option label="宸查�氳繃" value="3" />
+ <el-option label="宸叉嫆缁�" value="2" />
+ <el-option label="宸插彂鏀�" value="4" />
+ </el-select>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="handleQuery">
+ <el-icon><Search /></el-icon>
+ 鎼滅储
+ </el-button>
+ <el-button @click="resetQuery">
+ <el-icon><Refresh /></el-icon>
+ 閲嶇疆
+ </el-button>
+ </el-form-item>
+ <el-form-item>
+ <el-button type="primary" @click="handleExport">
+ <el-icon><Download /></el-icon>
+ 瀵煎嚭
+ </el-button>
+ </el-form-item>
+ </el-form>
+
+ <!-- 琛ㄦ牸鍖哄煙 -->
+ <el-table
+ v-loading="loading"
+ :data="officeList"
+ @selection-change="handleSelectionChange"
+ style="width: 100%"
+ >
+ <el-table-column type="selection" width="55" align="center" />
+ <el-table-column label="鐢宠缂栧彿" align="center" prop="code" width="180" />
+ <el-table-column label="鐢宠浜�" align="center" prop="applicant" width="120" />
+ <el-table-column label="閮ㄩ棬" align="center" prop="dept" width="120" />
+ <el-table-column label="鐗╄祫绫诲瀷" align="center" prop="materialType" width="120">
+ <template #default="scope">
+ <el-tag v-if="scope.row.materialType === 1" type="info">鍏朵粬</el-tag>
+ <el-tag v-if="scope.row.materialType === 2" type="success">娓呮磥鐢ㄥ搧</el-tag>
+ <el-tag v-if="scope.row.materialType === 3" type="warning">鐢靛瓙璁惧</el-tag>
+ <el-tag v-if="scope.row.materialType === 4" type="danger">鍔炲叕鐢ㄥ搧</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鐢宠鏁伴噺" align="center" prop="applyNum" width="100" />
+ <el-table-column label="鐢宠鍘熷洜" align="center" prop="reason" min-width="200" show-overflow-tooltip />
+ <el-table-column label="鐢宠鐘舵��" align="center" prop="status" width="100">
+ <template #default="scope">
+ <el-tag :type="getStatusType(scope.row.status)">
+ {{ getStatusText(scope.row.status) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鐢宠鏃堕棿" align="center" prop="applyTime" width="180" />
+ <el-table-column label="瀹℃壒浜�" align="center" prop="approval" width="120" />
+ <el-table-column label="瀹℃壒鏃堕棿" align="center" prop="approvalTime" width="180" />
+ <el-table-column label="鍙戞斁鏃堕棿" align="center" prop="issueTime" width="180" />
+ <el-table-column label="鎿嶄綔" align="center" fixed="right" class-name="small-padding fixed-width" width="200">
+ <template #default="scope">
+ <el-button
+ v-if="scope.row.status === 1"
+ type="primary"
+ link
+ @click="handleApprove(scope.row)"
+ >
+ 瀹℃壒
+ </el-button>
+ <el-button
+ v-if="scope.row.status === 3"
+ type="success"
+ link
+ @click="handleIssue(scope.row)"
+ >
+ 鍙戞斁
+ </el-button>
+ <el-button
+ type="info"
+ link
+ @click="handleDetail(scope.row)"
+ >
+ 璇︽儏
+ </el-button>
+ <el-button
+ v-if="scope.row.status === 2"
+ type="danger"
+ link
+ @click="handleDelete(scope.row)"
+ >
+ 鍒犻櫎
+ </el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 鍒嗛〉 -->
+ <pagination
+ v-show="total > 0"
+ :total="total"
+ v-model:page="queryParams.current"
+ v-model:limit="queryParams.size"
+ @pagination="getList"
+ />
+ </el-card>
+
+ <!-- 鐢宠瀵硅瘽妗� -->
+ <el-dialog
+ v-model="showApplyDialog"
+ title="鍔炲叕鐗╄祫鐢宠"
+ width="600px"
+ append-to-body
+ >
+ <el-form ref="applyFormRef" :model="applyForm" :rules="applyRules" label-width="100px">
+ <el-form-item label="鐢宠浜�" prop="applicant">
+ <el-input v-model="applyForm.applicant" placeholder="璇疯緭鍏ョ敵璇蜂汉鍚嶇О" />
+ </el-form-item>
+ <el-form-item label="閮ㄩ棬" prop="dept">
+ <el-input v-model="applyForm.dept" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" />
+ </el-form-item>
+ <el-form-item label="鐗╄祫绫诲瀷" prop="materialType">
+ <el-select v-model="applyForm.materialType" placeholder="璇烽�夋嫨鐗╄祫绫诲瀷" style="width: 100%">
+ <el-option label="鍔炲叕鐢ㄥ搧" value="4" />
+ <el-option label="鐢靛瓙璁惧" value="3" />
+ <el-option label="娓呮磥鐢ㄥ搧" value="2" />
+ <el-option label="鍏朵粬" value="1" />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鍏蜂綋鐗╁搧" prop="itemName">
+ <el-input v-model="applyForm.itemName" placeholder="璇疯緭鍏ュ叿浣撶墿鍝佸悕绉�" />
+ </el-form-item>
+ <el-form-item label="鐢宠鏁伴噺" prop="applyNum">
+ <el-input-number v-model="applyForm.applyNum" :min="1" :max="999" style="width: 100%" />
+ </el-form-item>
+ <el-form-item label="鐢宠鍘熷洜" prop="reason">
+ <el-input
+ v-model="applyForm.reason"
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ョ敵璇峰師鍥�"
+ />
+ </el-form-item>
+ <el-form-item label="绱ф�ョ▼搴�" prop="urgency">
+ <el-radio-group v-model="applyForm.urgency">
+ <el-radio label="1">鏅��</el-radio>
+ <el-radio label="2">绱ф��</el-radio>
+ <el-radio label="3">闈炲父绱ф��</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button @click="showApplyDialog = false">鍙� 娑�</el-button>
+ <el-button type="primary" @click="submitApply">纭� 瀹�</el-button>
+ </div>
+ </template>
+ </el-dialog>
+
+ <!-- 瀹℃壒瀵硅瘽妗� -->
+ <el-dialog
+ v-model="showApproveDialog"
+ title="瀹℃壒鐢宠"
+ width="500px"
+ append-to-body
+ >
+ <el-form ref="approveFormRef" :model="approveForm" :rules="approveRules" label-width="100px">
+ <el-form-item label="瀹℃壒缁撴灉" prop="approveResult">
+ <el-radio-group v-model="approveForm.approveResult">
+ <el-radio label="3">閫氳繃</el-radio>
+ <el-radio label="2">鎷掔粷</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ <el-form-item label="瀹℃壒鎰忚" prop="approvalOpinions">
+ <el-input
+ v-model="approveForm.approvalOpinions"
+ type="textarea"
+ :rows="3"
+ placeholder="璇疯緭鍏ュ鎵规剰瑙�"
+ />
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <div class="dialog-footer">
+ <el-button @click="showApproveDialog = false">鍙� 娑�</el-button>
+ <el-button type="primary" @click="submitApprove">纭� 瀹�</el-button>
+ </div>
+ </template>
+ </el-dialog>
+
+ <!-- 璇︽儏瀵硅瘽妗� -->
+ <el-dialog
+ v-model="showDetailDialog"
+ title="鐢宠璇︽儏"
+ width="700px"
+ append-to-body
+ >
+ <el-descriptions :column="2" border>
+ <el-descriptions-item label="鐢宠缂栧彿">{{ currentDetail.code }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠浜�">{{ currentDetail.applicant }}</el-descriptions-item>
+ <el-descriptions-item label="閮ㄩ棬">{{ currentDetail.dept }}</el-descriptions-item>
+ <el-descriptions-item label="鐗╄祫绫诲瀷">{{ currentDetail.materialType }}</el-descriptions-item>
+ <el-descriptions-item label="鍏蜂綋鐗╁搧">{{ currentDetail.itemName }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠鏁伴噺">{{ currentDetail.applyNum }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠鍘熷洜" :span="2">{{ currentDetail.reason }}</el-descriptions-item>
+ <el-descriptions-item label="鐢宠鐘舵��">
+ <el-tag :type="getStatusType(currentDetail.status)">
+ {{ getStatusText(currentDetail.status) }}
+ </el-tag>
+ </el-descriptions-item>
+ <el-descriptions-item label="鐢宠鏃堕棿">{{ currentDetail.applyTime }}</el-descriptions-item>
+ <el-descriptions-item label="瀹℃壒浜�">{{ currentDetail.approval || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="瀹℃壒鏃堕棿">{{ currentDetail.approvalTime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="瀹℃壒鎰忚" :span="2">{{ currentDetail.approvalOpinions || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戞斁鏃堕棿">{{ currentDetail.issueTime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鍙戞斁浜�">{{ currentDetail.issueUser || '-' }}</el-descriptions-item>
+ </el-descriptions>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import {listPage,add,update,deleteOff} from "@/api/collaborativeApproval/officeSupplies.js"
+import {ref, reactive, onMounted, getCurrentInstance} from 'vue'
+import Cookies from 'js-cookie'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { Plus, Search, Refresh, Download, Check } from '@element-plus/icons-vue'
+
+// 鍝嶅簲寮忔暟鎹�
+const loading = ref(false)
+const showSearch = ref(true)
+const showApplyDialog = ref(false)
+const showApproveDialog = ref(false)
+const showDetailDialog = ref(false)
+const multipleSelection = ref([])
+const officeList = ref([])
+const total = ref(0)
+const suppliesList = ref([])
+const currentDetail = ref({})
+
+// 鏌ヨ鍙傛暟
+const queryParams = reactive({
+ current: 1,
+ size: 10,
+ code: '',
+ applicant: '',
+ status: ''
+})
+
+// 鐢宠琛ㄥ崟
+const applyForm = reactive({
+ applicant: '',
+ dept: '',
+ materialType: '',
+ itemName: '',
+ applyNum: 1,
+ reason: '',
+ urgency: '1'
+})
+
+// 瀹℃壒琛ㄥ崟
+const approveForm = reactive({
+ approveResult: '3',
+ approvalOpinions: ''
+})
+
+// 琛ㄥ崟鏍¢獙瑙勫垯
+const applyRules = {
+ applicant: [{ required: true, message: '璇烽�夋嫨鐗╄祫绫诲瀷', trigger: 'blur' }],
+ dept: [{ required: true, message: '璇烽�夋嫨鐗╄祫绫诲瀷', trigger: 'blur' }],
+ materialType: [{ required: true, message: '璇烽�夋嫨鐗╄祫绫诲瀷', trigger: 'change' }],
+ itemName: [{ required: true, message: '璇疯緭鍏ュ叿浣撶墿鍝佸悕绉�', trigger: 'blur' }],
+ applyNum: [{ required: true, message: '璇疯緭鍏ョ敵璇锋暟閲�', trigger: 'blur' }],
+ reason: [{ required: true, message: '璇疯緭鍏ョ敵璇峰師鍥�', trigger: 'blur' }]
+}
+
+const approveRules = {
+ approveResult: [{ required: true, message: '璇烽�夋嫨瀹℃壒缁撴灉', trigger: 'change' }],
+ approvalOpinions: [{ required: true, message: '璇疯緭鍏ュ鎵规剰瑙�', trigger: 'blur' }]
+}
+
+const openShow = () => {
+ showApplyDialog.value = true
+ resetApplyForm()
+}
+
+// 鑾峰彇鍒楄〃鏁版嵁
+const getList = () => {
+ loading.value = true
+ listPage(queryParams).then(res => {
+ total.value = res.data.total
+ loading.value = false
+ officeList.value = res.data.records
+ })
+}
+
+// 鏌ヨ
+const handleQuery = () => {
+ queryParams.current = 1
+ getList()
+}
+
+// 閲嶇疆鏌ヨ
+const resetQuery = () => {
+ queryParams.code = ''
+ queryParams.applicant = ''
+ queryParams.status = ''
+ handleQuery()
+}
+
+// 澶氶��
+const handleSelectionChange = (selection) => {
+ multipleSelection.value = selection
+}
+
+// 鑾峰彇鐘舵�佺被鍨�
+const getStatusType = (status) => {
+ const statusMap = {
+ 1: 'warning',
+ 3: 'success',
+ 2: 'danger',
+ 4: 'info'
+ }
+ return statusMap[status] || 'info'
+}
+
+// 鑾峰彇鐘舵�佹枃鏈�
+const getStatusText = (status) => {
+ const statusMap = {
+ 1: '寰呭鎵�',
+ 3: '宸查�氳繃',
+ 2: '宸叉嫆缁�',
+ 4: '宸插彂鏀�'
+ }
+ return statusMap[status] || status
+}
+
+// 鎻愪氦鐢宠
+const submitApply = () => {
+ add(applyForm).then(() => {
+ ElMessage.success('鐢宠鎴愬姛')
+ getList()
+ showApplyDialog.value = false
+ resetApplyForm()
+ })
+
+
+
+}
+
+//閲嶇疆琛ㄥ崟
+const resetApplyForm = () => {
+ // 閲嶇疆琛ㄥ崟
+ Object.assign(applyForm, {
+ applicant: '',
+ dept: '',
+ materialType: '',
+ itemName: '',
+ applyNum: 1,
+ reason: '',
+ urgency: '1'
+ })
+}
+
+// 瀹℃壒
+const handleApprove = (row) => {
+ currentDetail.value = row
+ showApproveDialog.value = true
+}
+
+const formatDate = (date) => {
+ const year = date.getFullYear()
+ const month = String(date.getMonth() + 1).padStart(2, '0')
+ const day = String(date.getDate()).padStart(2, '0')
+ const hours = String(date.getHours()).padStart(2, '0')
+ const minutes = String(date.getMinutes()).padStart(2, '0')
+ const sends = String(date.getSeconds()).padStart(2, '0')
+ return `${year}-${month}-${day} ${hours}:${minutes}:${sends}`
+}
+
+// 鎻愪氦瀹℃壒
+const submitApprove = () => {
+ currentDetail.value.status = approveForm.approveResult
+ // 浠巆ookie涓幏鍙栧綋鍓嶇櫥褰曠敤鎴峰悕绉�
+ currentDetail.value.approval = Cookies.get('username')
+ currentDetail.value.approvalTime = formatDate(new Date())
+ currentDetail.value.approvalOpinions = approveForm.approvalOpinions
+ update(currentDetail.value).then((res) => {
+ if(res.code === 200){
+ showApproveDialog.value = false
+ ElMessage.success('瀹℃壒瀹屾垚')
+ getList()
+
+ // 閲嶇疆琛ㄥ崟
+ Object.assign(approveForm, {
+ approveResult: '3',
+ approvalOpinions: ''
+ })
+ }
+ })
+
+}
+
+// 鍙戞斁
+const handleIssue = (row) => {
+ row.status = 4
+ row.issueTime = formatDate(new Date())
+ row.issueUser = Cookies.get('username')
+ update(row).then((res) =>{
+ if(res.code === 200){
+ ElMessage.success('鍙戞斁瀹屾垚')
+ getList()
+ }
+ })
+}
+
+// 鏌ョ湅璇︽儏
+const handleDetail = (row) => {
+ currentDetail.value = row
+ showDetailDialog.value = true
+}
+
+// 鍒犻櫎
+const handleDelete = (row) => {
+ ElMessageBox.confirm('纭鍒犻櫎璇ョ敵璇峰悧锛�', '鎻愮ず', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }).then(() => {
+ let ids = [row.id]
+ deleteOff(ids).then((res) =>{
+ ElMessage.success('鍒犻櫎鎴愬姛')
+ getList()
+ })
+ })
+}
+const { proxy } = getCurrentInstance();
+// 瀵煎嚭
+const handleExport = () => {
+ ElMessageBox.confirm("鎵�鏈夌殑鍐呭灏嗚瀵煎嚭锛屾槸鍚︾‘璁ゅ鍑猴紵", "瀵煎嚭", {
+ confirmButtonText: "纭",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
+ })
+ .then(() => {
+ proxy.download("/officeSupplies/export", {}, "鍔炲叕鐗╄祫.xlsx");
+ })
+ .catch(() => {
+ proxy.$modal.msg("宸插彇娑�");
+ });
+}
+
+// 椤甸潰鍔犺浇鏃惰幏鍙栨暟鎹�
+onMounted(() => {
+ getList()
+})
+</script>
+
+<style scoped>
+.app-container {
+ padding: 20px;
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.mb8 {
+ margin-bottom: 8px;
+}
+
+.dialog-footer {
+ text-align: right;
+}
+
+:deep(.el-descriptions__label) {
+ width: 120px;
+}
+</style>
--
Gitblit v1.9.3