| | |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <span>åå
¬ç©èµç³è¯·ç®¡ç</span> |
| | | <el-button type="primary" @click="showApplyDialog = true"> |
| | | <el-button type="primary" @click="openShow()"> |
| | | <el-icon><Plus /></el-icon> |
| | | æ°å»ºç³è¯· |
| | | </el-button> |
| | |
| | | |
| | | <!-- æç´¢åºå --> |
| | | <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch"> |
| | | <el-form-item label="ç³è¯·ç¼å·" prop="applyNo"> |
| | | <el-form-item label="ç³è¯·ç¼å·" prop="code"> |
| | | <el-input |
| | | v-model="queryParams.applyNo" |
| | | v-model="queryParams.code" |
| | | placeholder="请è¾å
¥ç³è¯·ç¼å·" |
| | | clearable |
| | | style="width: 200px" |
| | |
| | | </el-form-item> |
| | | <el-form-item label="ç³è¯·ç¶æ" prop="status"> |
| | | <el-select v-model="queryParams.status" placeholder="è¯·éæ©ç¶æ" clearable style="width: 200px"> |
| | | <el-option label="å¾
审æ¹" value="pending" /> |
| | | <el-option label="å·²éè¿" value="approved" /> |
| | | <el-option label="å·²æç»" value="rejected" /> |
| | | <el-option label="已忾" value="issued" /> |
| | | <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-icon><Download /></el-icon> |
| | | å¯¼åº |
| | | </el-button> |
| | | <el-button type="success" @click="handleBatchApprove" :disabled="multipleSelection.length === 0"> |
| | | <el-icon><Check /></el-icon> |
| | | æ¹éå®¡æ¹ |
| | | </el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- è¡¨æ ¼åºå --> |
| | | <el-table |
| | | v-loading="loading" |
| | | :data="suppliesList" |
| | | :data="officeList" |
| | | @selection-change="handleSelectionChange" |
| | | style="width: 100%" |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="ç³è¯·ç¼å·" align="center" prop="applyNo" width="180" /> |
| | | <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="department" width="120" /> |
| | | <el-table-column label="ç©èµç±»å" align="center" prop="supplyType" width="120" /> |
| | | <el-table-column label="ç³è¯·æ°é" align="center" prop="quantity" width="100" /> |
| | | <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"> |
| | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ç³è¯·æ¶é´" align="center" prop="applyTime" width="180" /> |
| | | <el-table-column label="审æ¹äºº" align="center" prop="approver" width="120" /> |
| | | <el-table-column label="å®¡æ¹æ¶é´" align="center" prop="approveTime" 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 === 'pending'" |
| | | v-if="scope.row.status === 1" |
| | | type="primary" |
| | | link |
| | | @click="handleApprove(scope.row)" |
| | |
| | | å®¡æ¹ |
| | | </el-button> |
| | | <el-button |
| | | v-if="scope.row.status === 'approved'" |
| | | v-if="scope.row.status === 3" |
| | | type="success" |
| | | link |
| | | @click="handleIssue(scope.row)" |
| | |
| | | 详æ
|
| | | </el-button> |
| | | <el-button |
| | | v-if="scope.row.status === 'pending'" |
| | | v-if="scope.row.status === 2" |
| | | type="danger" |
| | | link |
| | | @click="handleDelete(scope.row)" |
| | |
| | | <pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | v-model:page="queryParams.pageNum" |
| | | v-model:limit="queryParams.pageSize" |
| | | v-model:page="queryParams.current" |
| | | v-model:limit="queryParams.size" |
| | | @pagination="getList" |
| | | /> |
| | | </el-card> |
| | |
| | | append-to-body |
| | | > |
| | | <el-form ref="applyFormRef" :model="applyForm" :rules="applyRules" label-width="100px"> |
| | | <el-form-item label="ç©èµç±»å" prop="supplyType"> |
| | | <el-select v-model="applyForm.supplyType" placeholder="è¯·éæ©ç©èµç±»å" style="width: 100%"> |
| | | <el-option label="åå
¬ç¨å" value="office" /> |
| | | <el-option label="çµå设å¤" value="electronic" /> |
| | | <el-option label="æ¸
æ´ç¨å" value="cleaning" /> |
| | | <el-option label="å
¶ä»" value="other" /> |
| | | <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="quantity"> |
| | | <el-input-number v-model="applyForm.quantity" :min="1" :max="999" style="width: 100%" /> |
| | | <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 |
| | |
| | | </el-form-item> |
| | | <el-form-item label="ç´§æ¥ç¨åº¦" prop="urgency"> |
| | | <el-radio-group v-model="applyForm.urgency"> |
| | | <el-radio label="normal">æ®é</el-radio> |
| | | <el-radio label="urgent">ç´§æ¥</el-radio> |
| | | <el-radio label="very_urgent">é常紧æ¥</el-radio> |
| | | <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> |
| | |
| | | <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="approved">éè¿</el-radio> |
| | | <el-radio label="rejected">æç»</el-radio> |
| | | <el-radio label="3">éè¿</el-radio> |
| | | <el-radio label="2">æç»</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | <el-form-item label="å®¡æ¹æè§" prop="approveComment"> |
| | | <el-form-item label="å®¡æ¹æè§" prop="approvalOpinions"> |
| | | <el-input |
| | | v-model="approveForm.approveComment" |
| | | v-model="approveForm.approvalOpinions" |
| | | type="textarea" |
| | | :rows="3" |
| | | placeholder="请è¾å
¥å®¡æ¹æè§" |
| | |
| | | append-to-body |
| | | > |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="ç³è¯·ç¼å·">{{ currentDetail.applyNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç³è¯·ç¼å·">{{ currentDetail.code }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç³è¯·äºº">{{ currentDetail.applicant }}</el-descriptions-item> |
| | | <el-descriptions-item label="é¨é¨">{{ currentDetail.department }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç©èµç±»å">{{ currentDetail.supplyType }}</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.quantity }}</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)"> |
| | |
| | | </el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="ç³è¯·æ¶é´">{{ currentDetail.applyTime }}</el-descriptions-item> |
| | | <el-descriptions-item label="审æ¹äºº">{{ currentDetail.approver || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®¡æ¹æ¶é´">{{ currentDetail.approveTime || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="å®¡æ¹æè§" :span="2">{{ currentDetail.approveComment || '-' }}</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.issuer || '-' }}</el-descriptions-item> |
| | | <el-descriptions-item label="åæ¾äºº">{{ currentDetail.issueUser || '-' }}</el-descriptions-item> |
| | | </el-descriptions> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted } from 'vue' |
| | | 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 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({ |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | applyNo: '', |
| | | current: 1, |
| | | size: 10, |
| | | code: '', |
| | | applicant: '', |
| | | status: '' |
| | | }) |
| | | |
| | | // ç³è¯·è¡¨å |
| | | const applyForm = reactive({ |
| | | supplyType: '', |
| | | applicant: '', |
| | | dept: '', |
| | | materialType: '', |
| | | itemName: '', |
| | | quantity: 1, |
| | | applyNum: 1, |
| | | reason: '', |
| | | urgency: 'normal' |
| | | urgency: '1' |
| | | }) |
| | | |
| | | // 审æ¹è¡¨å |
| | | const approveForm = reactive({ |
| | | approveResult: 'approved', |
| | | approveComment: '' |
| | | approveResult: '3', |
| | | approvalOpinions: '' |
| | | }) |
| | | |
| | | // è¡¨åæ ¡éªè§å |
| | | const applyRules = { |
| | | supplyType: [{ required: true, message: 'è¯·éæ©ç©èµç±»å', trigger: 'change' }], |
| | | applicant: [{ required: true, message: 'è¯·éæ©ç©èµç±»å', trigger: 'blur' }], |
| | | dept: [{ required: true, message: 'è¯·éæ©ç©èµç±»å', trigger: 'blur' }], |
| | | materialType: [{ required: true, message: 'è¯·éæ©ç©èµç±»å', trigger: 'change' }], |
| | | itemName: [{ required: true, message: '请è¾å
¥å
·ä½ç©ååç§°', trigger: 'blur' }], |
| | | quantity: [{ 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' }], |
| | | approveComment: [{ required: true, message: '请è¾å
¥å®¡æ¹æè§', trigger: 'blur' }] |
| | | approvalOpinions: [{ required: true, message: '请è¾å
¥å®¡æ¹æè§', trigger: 'blur' }] |
| | | } |
| | | |
| | | // åæ°æ® |
| | | const mockData = [ |
| | | { |
| | | id: 1, |
| | | applyNo: 'WS20241201001', |
| | | applicant: 'éå¿å¼º', |
| | | department: 'ææ¯é¨', |
| | | supplyType: 'åå
¬ç¨å', |
| | | itemName: 'A4æå°çº¸', |
| | | quantity: 10, |
| | | reason: 'æ¥å¸¸åå
¬æå°éè¦', |
| | | status: 'pending', |
| | | applyTime: '2025-12-01 09:30:00', |
| | | approver: '', |
| | | approveTime: '', |
| | | approveComment: '', |
| | | issueTime: '', |
| | | issuer: '' |
| | | }, |
| | | { |
| | | id: 2, |
| | | applyNo: 'WS20241201002', |
| | | applicant: 'åé
å©·', |
| | | department: '人äºé¨', |
| | | supplyType: 'çµå设å¤', |
| | | itemName: 'æ çº¿é¼ æ ', |
| | | quantity: 2, |
| | | reason: 'æ°åå·¥å
¥èé
å¤', |
| | | status: 'approved', |
| | | applyTime: '2025-12-01 10:15:00', |
| | | approver: 'ç建å½', |
| | | approveTime: '2025-12-01 14:20:00', |
| | | approveComment: 'åæç³è¯·ï¼è¯·åæ¶åæ¾', |
| | | issueTime: '', |
| | | issuer: '' |
| | | }, |
| | | { |
| | | id: 3, |
| | | applyNo: 'WS20241201003', |
| | | applicant: 'ç建å½', |
| | | department: 'è´¢å¡é¨', |
| | | supplyType: 'æ¸
æ´ç¨å', |
| | | itemName: 'æ´ææ¶²', |
| | | quantity: 5, |
| | | reason: 'åå
¬å®¤æ¸
æ´ç¨åè¡¥å
', |
| | | status: 'issued', |
| | | applyTime: '2025-12-01 11:00:00', |
| | | approver: 'åé
å©·', |
| | | approveTime: '2025-12-01 15:30:00', |
| | | approveComment: 'åæç³è¯·', |
| | | issueTime: '2025-12-01 16:00:00', |
| | | issuer: 'é±ä¼æ' |
| | | }, |
| | | { |
| | | id: 4, |
| | | applyNo: 'WS20241201004', |
| | | applicant: '赵丽å', |
| | | department: 'å¸åºé¨', |
| | | supplyType: 'å
¶ä»', |
| | | itemName: 'æä»¶å¤¹', |
| | | quantity: 20, |
| | | reason: '项ç®èµææ´çéè¦', |
| | | status: 'rejected', |
| | | applyTime: '2025-12-01 13:45:00', |
| | | approver: 'éå¿å¼º', |
| | | approveTime: '2025-12-01 17:00:00', |
| | | approveComment: 'æ°éè¿å¤ï¼å»ºè®®åå°å°10个', |
| | | issueTime: '', |
| | | issuer: '' |
| | | }, |
| | | { |
| | | id: 5, |
| | | applyNo: 'WS20241202001', |
| | | applicant: 'é±ä¼æ', |
| | | department: 'è¿è¥é¨', |
| | | supplyType: 'åå
¬ç¨å', |
| | | itemName: 'ç¾åç¬', |
| | | quantity: 50, |
| | | reason: 'é¨é¨æ¥å¸¸åå
¬ç¨åè¡¥å
', |
| | | status: 'pending', |
| | | applyTime: '2025-12-02 08:30:00', |
| | | approver: '', |
| | | approveTime: '', |
| | | approveComment: '', |
| | | issueTime: '', |
| | | issuer: '' |
| | | }, |
| | | { |
| | | id: 6, |
| | | applyNo: 'WS20241202002', |
| | | applicant: 'åæå', |
| | | department: 'ææ¯é¨', |
| | | supplyType: 'çµå设å¤', |
| | | itemName: 'é®ç', |
| | | quantity: 3, |
| | | reason: 'æ°å工设å¤é
å¤', |
| | | status: 'approved', |
| | | applyTime: '2025-12-02 14:20:00', |
| | | approver: 'éå¿å¼º', |
| | | approveTime: '2025-12-02 16:00:00', |
| | | approveComment: 'åæç³è¯·', |
| | | issueTime: '', |
| | | issuer: '' |
| | | }, |
| | | { |
| | | id: 7, |
| | | applyNo: 'WS20241203001', |
| | | applicant: 'å¨ç¾ç²', |
| | | department: '人äºé¨', |
| | | supplyType: 'æ¸
æ´ç¨å', |
| | | itemName: '纸巾', |
| | | quantity: 30, |
| | | reason: 'åå
¬åºåæ¸
æ´ç¨åè¡¥å
', |
| | | status: 'issued', |
| | | applyTime: '2025-12-03 09:15:00', |
| | | approver: '赵丽å', |
| | | approveTime: '2025-12-03 10:30:00', |
| | | approveComment: 'åæç³è¯·', |
| | | issueTime: '2025-12-03 11:00:00', |
| | | issuer: 'åæå' |
| | | }, |
| | | { |
| | | id: 8, |
| | | applyNo: 'WS20241203002', |
| | | applicant: 'å´å¿å¼º', |
| | | department: 'è´¢å¡é¨', |
| | | supplyType: 'å
¶ä»', |
| | | itemName: '计ç®å¨', |
| | | quantity: 2, |
| | | reason: 'è´¢å¡æ ¸ç®å·¥ä½éè¦', |
| | | status: 'rejected', |
| | | applyTime: '2025-12-03 15:45:00', |
| | | approver: 'ç建å½', |
| | | approveTime: '2025-12-03 17:20:00', |
| | | approveComment: 'å·²æè®¡ç®å¨ï¼æä¸éè¦', |
| | | issueTime: '', |
| | | issuer: '' |
| | | } |
| | | ] |
| | | const openShow = () => { |
| | | showApplyDialog.value = true |
| | | resetApplyForm() |
| | | } |
| | | |
| | | // è·ååè¡¨æ°æ® |
| | | const getList = () => { |
| | | loading.value = true |
| | | // 模æå¼æ¥è¯·æ± |
| | | setTimeout(() => { |
| | | let filteredData = [...mockData] |
| | | |
| | | // æ ¹æ®æ¥è¯¢æ¡ä»¶è¿æ»¤ |
| | | if (queryParams.applyNo) { |
| | | filteredData = filteredData.filter(item => |
| | | item.applyNo.toLowerCase().includes(queryParams.applyNo.toLowerCase()) |
| | | ) |
| | | } |
| | | if (queryParams.applicant) { |
| | | filteredData = filteredData.filter(item => |
| | | item.applicant.toLowerCase().includes(queryParams.applicant.toLowerCase()) |
| | | ) |
| | | } |
| | | if (queryParams.status) { |
| | | filteredData = filteredData.filter(item => |
| | | item.status === queryParams.status |
| | | ) |
| | | } |
| | | |
| | | // æç³è¯·æ¶é´ååºæå |
| | | filteredData.sort((a, b) => new Date(b.applyTime) - new Date(a.applyTime)) |
| | | |
| | | total.value = filteredData.length |
| | | suppliesList.value = filteredData.slice( |
| | | (queryParams.pageNum - 1) * queryParams.pageSize, |
| | | queryParams.pageNum * queryParams.pageSize |
| | | ) |
| | | listPage(queryParams).then(res => { |
| | | total.value = res.data.total |
| | | loading.value = false |
| | | }, 500) |
| | | officeList.value = res.data.records |
| | | }) |
| | | } |
| | | |
| | | // æ¥è¯¢ |
| | | const handleQuery = () => { |
| | | queryParams.pageNum = 1 |
| | | queryParams.current = 1 |
| | | getList() |
| | | } |
| | | |
| | | // éç½®æ¥è¯¢ |
| | | const resetQuery = () => { |
| | | queryParams.applyNo = '' |
| | | queryParams.code = '' |
| | | queryParams.applicant = '' |
| | | queryParams.status = '' |
| | | handleQuery() |
| | |
| | | // è·åç¶æç±»å |
| | | const getStatusType = (status) => { |
| | | const statusMap = { |
| | | pending: 'warning', |
| | | approved: 'success', |
| | | rejected: 'danger', |
| | | issued: 'info' |
| | | 1: 'warning', |
| | | 3: 'success', |
| | | 2: 'danger', |
| | | 4: 'info' |
| | | } |
| | | return statusMap[status] || 'info' |
| | | } |
| | |
| | | // è·åç¶æææ¬ |
| | | const getStatusText = (status) => { |
| | | const statusMap = { |
| | | pending: 'å¾
审æ¹', |
| | | approved: 'å·²éè¿', |
| | | rejected: 'å·²æç»', |
| | | issued: '已忾' |
| | | 1: 'å¾
审æ¹', |
| | | 3: 'å·²éè¿', |
| | | 2: 'å·²æç»', |
| | | 4: '已忾' |
| | | } |
| | | return statusMap[status] || status |
| | | } |
| | | |
| | | // æäº¤ç³è¯· |
| | | const submitApply = () => { |
| | | const newApply = { |
| | | id: mockData.length + 1, |
| | | applyNo: `WS${new Date().getTime()}`, |
| | | applicant: 'å½åç¨æ·', |
| | | department: 'ææ¯é¨', |
| | | supplyType: applyForm.supplyType, |
| | | itemName: applyForm.itemName, |
| | | quantity: applyForm.quantity, |
| | | reason: applyForm.reason, |
| | | status: 'pending', |
| | | applyTime: new Date().toLocaleString(), |
| | | approver: '', |
| | | approveTime: '', |
| | | approveComment: '', |
| | | issueTime: '', |
| | | issuer: '' |
| | | } |
| | | add(applyForm).then(() => { |
| | | ElMessage.success('ç³è¯·æå') |
| | | getList() |
| | | showApplyDialog.value = false |
| | | resetApplyForm() |
| | | }) |
| | | |
| | | |
| | | mockData.unshift(newApply) |
| | | showApplyDialog.value = false |
| | | ElMessage.success('ç³è¯·æäº¤æå') |
| | | getList() |
| | | |
| | | |
| | | } |
| | | |
| | | //é置表å |
| | | const resetApplyForm = () => { |
| | | // é置表å |
| | | Object.assign(applyForm, { |
| | | supplyType: '', |
| | | applicant: '', |
| | | dept: '', |
| | | materialType: '', |
| | | itemName: '', |
| | | quantity: 1, |
| | | applyNum: 1, |
| | | reason: '', |
| | | urgency: 'normal' |
| | | urgency: '1' |
| | | }) |
| | | } |
| | | |
| | |
| | | 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 = () => { |
| | | const index = mockData.findIndex(item => item.id === currentDetail.value.id) |
| | | if (index !== -1) { |
| | | mockData[index].status = approveForm.approveResult |
| | | mockData[index].approver = 'å½å审æ¹äºº' |
| | | mockData[index].approveTime = new Date().toLocaleString() |
| | | mockData[index].approveComment = approveForm.approveComment |
| | | } |
| | | |
| | | showApproveDialog.value = false |
| | | ElMessage.success('审æ¹å®æ') |
| | | getList() |
| | | |
| | | // é置表å |
| | | Object.assign(approveForm, { |
| | | approveResult: 'approved', |
| | | approveComment: '' |
| | | currentDetail.value.status = approveForm.approveResult |
| | | // ä»cookieä¸è·åå½åç»å½ç¨æ·åç§° |
| | | 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) => { |
| | | const index = mockData.findIndex(item => item.id === row.id) |
| | | if (index !== -1) { |
| | | mockData[index].status = 'issued' |
| | | mockData[index].issueTime = new Date().toLocaleString() |
| | | mockData[index].issuer = 'å½ååæ¾äºº' |
| | | } |
| | | |
| | | ElMessage.success('忾宿') |
| | | getList() |
| | | row.status = 4 |
| | | row.issueTime = formatDate(new Date()) |
| | | row.issueUser = Cookies.get('username') |
| | | update(row).then((res) =>{ |
| | | if(res.code === 200){ |
| | | ElMessage.success('忾宿') |
| | | getList() |
| | | } |
| | | }) |
| | | } |
| | | |
| | | // æ¥ç详æ
|
| | |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | const index = mockData.findIndex(item => item.id === row.id) |
| | | if (index !== -1) { |
| | | mockData.splice(index, 1) |
| | | } |
| | | ElMessage.success('å 餿å') |
| | | getList() |
| | | }) |
| | | } |
| | | |
| | | // æ¹éå®¡æ¹ |
| | | const handleBatchApprove = () => { |
| | | if (multipleSelection.value.length === 0) { |
| | | ElMessage.warning('è¯·éæ©è¦å®¡æ¹çè®°å½') |
| | | return |
| | | } |
| | | |
| | | ElMessageBox.confirm(`确认æ¹é审æ¹éä¸ç ${multipleSelection.value.length} æ¡è®°å½åï¼`, 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning' |
| | | }).then(() => { |
| | | multipleSelection.value.forEach(row => { |
| | | const index = mockData.findIndex(item => item.id === row.id) |
| | | if (index !== -1) { |
| | | mockData[index].status = 'approved' |
| | | mockData[index].approver = 'å½å审æ¹äºº' |
| | | mockData[index].approveTime = new Date().toLocaleString() |
| | | mockData[index].approveComment = 'æ¹é审æ¹éè¿' |
| | | } |
| | | let ids = [row.id] |
| | | deleteOff(ids).then((res) =>{ |
| | | ElMessage.success('å 餿å') |
| | | getList() |
| | | }) |
| | | ElMessage.success('æ¹é审æ¹å®æ') |
| | | getList() |
| | | }) |
| | | } |
| | | |
| | | const { proxy } = getCurrentInstance(); |
| | | // å¯¼åº |
| | | const handleExport = () => { |
| | | ElMessage.success('导åºåè½å¼åä¸...') |
| | | ElMessageBox.confirm("ææçå
容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | proxy.download("/officeSupplies/export", {}, "åå
¬ç©èµ.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已忶"); |
| | | }); |
| | | } |
| | | |
| | | // 页é¢å è½½æ¶è·åæ°æ® |