From d29ad31fb1c91e9162d44362fc09b9e2eb96744f Mon Sep 17 00:00:00 2001 From: spring <2396852758@qq.com> Date: 星期五, 29 八月 2025 11:58:06 +0800 Subject: [PATCH] 关键煤种锁仓 --- src/views/coalLockManagement/index.vue | 725 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 725 insertions(+), 0 deletions(-) diff --git a/src/views/coalLockManagement/index.vue b/src/views/coalLockManagement/index.vue new file mode 100644 index 0000000..ee9fff6 --- /dev/null +++ b/src/views/coalLockManagement/index.vue @@ -0,0 +1,725 @@ +<template> + <div class="app-container"> + <el-card class="box-card"> + <!-- 鎼滅储鍖哄煙 --> + <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> + <el-form-item label="鐓ょ鍚嶇О" prop="coalName"> + <el-input + v-model="queryParams.coalName" + placeholder="璇疯緭鍏ョ叅绉嶅悕绉�" + clearable + size="small" + @keyup.enter="handleQuery" + /> + </el-form-item> + <el-form-item label="閿佷粨鐘舵��" prop="lockStatus"> + <el-select v-model="queryParams.lockStatus" placeholder="璇烽�夋嫨閿佷粨鐘舵��" clearable size="small"> + <el-option label="宸查攣瀹�" value="locked" /> + <el-option label="閮ㄥ垎閿佸畾" value="partial" /> + <el-option label="鏈攣瀹�" value="unlocked" /> + </el-select> + </el-form-item> + <el-form-item label="渚涘簲鍟�" prop="supplierName"> + <el-input + v-model="queryParams.supplierName" + placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" + clearable + size="small" + @keyup.enter="handleQuery" + /> + </el-form-item> + <el-form-item label="閿佷粨鏃ユ湡" prop="lockDateRange"> + <el-date-picker + v-model="queryParams.lockDateRange" + type="daterange" + range-separator="鑷�" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + size="small" + format="YYYY-MM-DD" + value-format="YYYY-MM-DD" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="Search" size="small" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" size="small" @click="resetQuery">閲嶇疆</el-button> + </el-form-item> + </el-form> + + <!-- 鎿嶄綔鎸夐挳鍖哄煙 --> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + plain + icon="Plus" + size="small" + @click="handleAdd" + v-hasPermi="['coalLock:add']" + >鏂板閿佷粨</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + plain + icon="Edit" + size="small" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['coalLock:edit']" + >淇敼閿佷粨</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + plain + icon="Delete" + size="small" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['coalLock:remove']" + >鍒犻櫎閿佷粨</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + plain + icon="Unlock" + size="small" + :disabled="single" + @click="handleUnlock" + v-hasPermi="['coalLock:unlock']" + >瑙i櫎閿佷粨</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="info" + plain + icon="View" + size="small" + :disabled="single" + @click="handleView" + v-hasPermi="['coalLock:query']" + >鏌ョ湅璇︽儏</el-button> + </el-col> + <!-- <el-col :span="1.5"> + <el-button + type="primary" + plain + icon="Download" + size="small" + @click="handleExport" + v-hasPermi="['coalLock:export']" + >瀵煎嚭</el-button> + </el-col> --> + <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + </el-row> + + <!-- 鏁版嵁琛ㄦ牸 --> + <el-table v-loading="loading" :data="lockList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column label="閿佷粨缂栧彿" align="center" prop="lockCode" width="180" /> + <el-table-column label="鐓ょ鍚嶇О" align="center" prop="coalName" min-width="120" /> + <el-table-column label="渚涘簲鍟�" align="center" prop="supplierName" min-width="120" /> + <el-table-column label="鎬诲簱瀛橀噺(鍚�)" align="center" prop="totalInventory" width="120" /> + <el-table-column label="閿佷粨鏁伴噺(鍚�)" align="center" prop="lockQuantity" width="120" /> + <el-table-column label="鍙敤鏁伴噺(鍚�)" align="center" prop="availableQuantity" width="120" /> + <el-table-column label="閿佷粨鐘舵��" align="center" prop="lockStatus" width="100"> + <template #default="scope"> + <el-tag :type="getLockStatusType(scope.row.lockStatus)"> + {{ getLockStatusText(scope.row.lockStatus) }} + </el-tag> + </template> + </el-table-column> + <el-table-column label="閿佷粨鍘熷洜" align="center" prop="lockReason" min-width="150" show-overflow-tooltip /> + <el-table-column label="閿佷粨浜�" align="center" prop="lockUser" width="100" /> + <el-table-column label="閿佷粨鏃堕棿" align="center" prop="lockTime" width="180" /> + <el-table-column label="棰勮瑙i攣鏃堕棿" align="center" prop="expectedUnlockTime" width="180" /> + <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width" width="200"> + <template #default="scope"> + <el-button + size="small" + type="text" + icon="Edit" + @click="handleUpdate(scope.row)" + v-hasPermi="['coalLock:edit']" + >淇敼</el-button> + <el-button + size="small" + type="text" + icon="Unlock" + @click="handleUnlock(scope.row)" + v-hasPermi="['coalLock:unlock']" + >瑙i攣</el-button> + <el-button + size="small" + type="text" + icon="Delete" + @click="handleDelete(scope.row)" + v-hasPermi="['coalLock:remove']" + >鍒犻櫎</el-button> + </template> + </el-table-column> + </el-table> + + <!-- 鍒嗛〉缁勪欢 --> + <pagination + v-show="total > 0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + </el-card> + + <!-- 娣诲姞鎴栦慨鏀归攣浠撳璇濇 --> + <el-dialog :title="title" v-model="open" width="800px" append-to-body> + <el-form ref="lockFormRef" :model="form" :rules="rules" label-width="120px"> + <el-row> + <el-col :span="12"> + <el-form-item label="鐓ょ鍚嶇О" prop="coalName"> + <el-select + v-model="form.coalId" + placeholder="璇烽�夋嫨鐓ょ" + filterable + clearable + @change="handleCoalChange" + style="width: 100%" + > + <el-option + v-for="coal in coalOptions" + :key="coal.value" + :label="coal.label" + :value="coal.value" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="渚涘簲鍟�" prop="supplierId"> + <el-select + v-model="form.supplierId" + placeholder="璇烽�夋嫨渚涘簲鍟�" + filterable + clearable + style="width: 100%" + > + <el-option + v-for="supplier in supplierOptions" + :key="supplier.value" + :label="supplier.label" + :value="supplier.value" + /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="鎬诲簱瀛橀噺(鍚�)" prop="totalInventory"> + <el-input v-model="form.totalInventory" placeholder="璇疯緭鍏ユ�诲簱瀛橀噺" disabled /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閿佷粨鏁伴噺(鍚�)" prop="lockQuantity"> + <el-input + v-model="form.lockQuantity" + placeholder="璇疯緭鍏ラ攣浠撴暟閲�" + type="number" + :max="form.totalInventory" + @input="handleLockQuantityChange" + /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="鍙敤鏁伴噺(鍚�)" prop="availableQuantity"> + <el-input v-model="form.availableQuantity" placeholder="鍙敤鏁伴噺" disabled /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="閿佷粨鐘舵��" prop="lockStatus"> + <el-select v-model="form.lockStatus" placeholder="璇烽�夋嫨閿佷粨鐘舵��" style="width: 100%"> + <el-option label="宸查攣瀹�" value="locked" /> + <el-option label="閮ㄥ垎閿佸畾" value="partial" /> + <el-option label="鏈攣瀹�" value="unlocked" /> + </el-select> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <el-form-item label="閿佷粨鏃堕棿" prop="lockTime"> + <el-date-picker + v-model="form.lockTime" + type="datetime" + placeholder="閫夋嫨閿佷粨鏃堕棿" + style="width: 100%" + format="YYYY-MM-DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="棰勮瑙i攣鏃堕棿" prop="expectedUnlockTime"> + <el-date-picker + v-model="form.expectedUnlockTime" + type="datetime" + placeholder="閫夋嫨棰勮瑙i攣鏃堕棿" + style="width: 100%" + format="YYYY-MM-DD HH:mm:ss" + value-format="YYYY-MM-DD HH:mm:ss" + /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="閿佷粨鍘熷洜" prop="lockReason"> + <el-input + v-model="form.lockReason" + type="textarea" + placeholder="璇疯緭鍏ラ攣浠撳師鍥�" + :rows="3" + maxlength="500" + show-word-limit + /> + </el-form-item> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <el-form-item label="澶囨敞" prop="remarks"> + <el-input + v-model="form.remarks" + type="textarea" + placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�" + :rows="2" + maxlength="200" + show-word-limit + /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭� 瀹�</el-button> + <el-button @click="cancel">鍙� 娑�</el-button> + </div> + </template> + </el-dialog> + + <!-- 鏌ョ湅璇︽儏瀵硅瘽妗� --> + <el-dialog title="閿佷粨璇︽儏" v-model="viewOpen" width="800px" append-to-body> + <el-descriptions :column="2" border> + <el-descriptions-item label="閿佷粨缂栧彿">{{ form.lockCode }}</el-descriptions-item> + <el-descriptions-item label="鐓ょ鍚嶇О">{{ form.coalName }}</el-descriptions-item> + <el-descriptions-item label="渚涘簲鍟�">{{ form.supplierName }}</el-descriptions-item> + <el-descriptions-item label="鎬诲簱瀛橀噺">{{ form.totalInventory }}鍚�</el-descriptions-item> + <el-descriptions-item label="閿佷粨鏁伴噺">{{ form.lockQuantity }}鍚�</el-descriptions-item> + <el-descriptions-item label="鍙敤鏁伴噺">{{ form.availableQuantity }}鍚�</el-descriptions-item> + <el-descriptions-item label="閿佷粨鐘舵��"> + <el-tag :type="getLockStatusType(form.lockStatus)"> + {{ getLockStatusText(form.lockStatus) }} + </el-tag> + </el-descriptions-item> + <el-descriptions-item label="閿佷粨浜�">{{ form.lockUser }}</el-descriptions-item> + <el-descriptions-item label="閿佷粨鏃堕棿">{{ form.lockTime }}</el-descriptions-item> + <el-descriptions-item label="棰勮瑙i攣鏃堕棿">{{ form.expectedUnlockTime }}</el-descriptions-item> + <el-descriptions-item label="閿佷粨鍘熷洜" :span="2">{{ form.lockReason }}</el-descriptions-item> + <el-descriptions-item label="澶囨敞" :span="2">{{ form.remarks }}</el-descriptions-item> + </el-descriptions> + <template #footer> + <div class="dialog-footer"> + <el-button @click="viewOpen = false">鍏� 闂�</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup> +import { ref, reactive, computed, onMounted } from 'vue' +import { ElMessage, ElMessageBox } from 'element-plus' +import { Search, Plus, Edit, Delete, Unlock, View, Download, Refresh } from '@element-plus/icons-vue' + +// 鍝嶅簲寮忔暟鎹� +const loading = ref(false) +const showSearch = ref(true) +const open = ref(false) +const viewOpen = ref(false) +const single = ref(true) +const multiple = ref(true) +const total = ref(0) +const lockList = ref([]) +const coalOptions = ref([]) +const supplierOptions = ref([]) + +// 鏌ヨ鍙傛暟 +const queryParams = reactive({ + pageNum: 1, + pageSize: 10, + coalName: '', + lockStatus: '', + supplierName: '', + lockDateRange: [] +}) + +// 琛ㄥ崟鏁版嵁 +const form = reactive({ + id: undefined, + lockCode: '', + coalId: '', + coalName: '', + supplierId: '', + supplierName: '', + totalInventory: 0, + lockQuantity: 0, + availableQuantity: 0, + lockStatus: 'locked', + lockReason: '', + lockUser: '', + lockTime: '', + expectedUnlockTime: '', + remarks: '' +}) + +// 琛ㄥ崟楠岃瘉瑙勫垯 +const rules = reactive({ + coalId: [ + { required: true, message: '璇烽�夋嫨鐓ょ', trigger: 'change' } + ], + supplierId: [ + { required: true, message: '璇烽�夋嫨渚涘簲鍟�', trigger: 'change' } + ], + lockQuantity: [ + { required: true, message: '璇疯緭鍏ラ攣浠撴暟閲�', trigger: 'blur' }, + { type: 'number', min: 0, message: '閿佷粨鏁伴噺涓嶈兘灏忎簬0', trigger: 'blur' } + ], + lockStatus: [ + { required: true, message: '璇烽�夋嫨閿佷粨鐘舵��', trigger: 'change' } + ], + lockReason: [ + { required: true, message: '璇疯緭鍏ラ攣浠撳師鍥�', trigger: 'blur' } + ], + lockTime: [ + { required: true, message: '璇烽�夋嫨閿佷粨鏃堕棿', trigger: 'change' } + ] +}) + +// 璁$畻灞炴�� +const title = computed(() => { + return form.id ? '淇敼閿佷粨' : '鏂板閿佷粨' +}) + +// 琛ㄥ崟寮曠敤 +const lockFormRef = ref() +const queryForm = ref() + +// 鍒濆鍖栨暟鎹� +onMounted(() => { + getList() + initOptions() +}) + +// 鍒濆鍖栭�夐」鏁版嵁 +const initOptions = () => { + // 妯℃嫙鐓ょ鏁版嵁 + coalOptions.value = [ + { value: '1', label: '鏃犵儫鐓�' }, + { value: '2', label: '鐑熺叅' }, + { value: '3', label: '瑜愮叅' }, + { value: '4', label: '鐒︾叅' }, + { value: '5', label: '姘旂叅' } + ] + + // 妯℃嫙渚涘簲鍟嗘暟鎹� + supplierOptions.value = [ + { value: '1', label: '灞辫タ鐓ょ偔闆嗗洟' }, + { value: '2', label: '鍐呰挋鍙ょ叅鐐叕鍙�' }, + { value: '3', label: '闄曡タ鐓ょ偔宸ヤ笟' }, + { value: '4', label: '娌冲崡鐓ょ偔闆嗗洟' }, + { value: '5', label: '娌冲寳鐓ょ偔鍏徃' } + ] + + // 妯℃嫙閿佷粨鍒楄〃鏁版嵁 + lockList.value = [ + { + id: '1', + lockCode: 'LK20241201001', + coalId: '1', + coalName: '鏃犵儫鐓�', + supplierId: '1', + supplierName: '灞辫タ鐓ょ偔闆嗗洟', + totalInventory: 1000, + lockQuantity: 300, + availableQuantity: 700, + lockStatus: 'partial', + lockReason: '鐢熶骇璁″垝棰勭暀', + lockUser: '寮犱笁', + lockTime: '2024-12-01 09:00:00', + expectedUnlockTime: '2024-12-31 18:00:00' + }, + { + id: '2', + lockCode: 'LK20241201002', + coalId: '2', + coalName: '鐑熺叅', + supplierId: '2', + supplierName: '鍐呰挋鍙ょ叅鐐叕鍙�', + totalInventory: 800, + lockQuantity: 800, + availableQuantity: 0, + lockStatus: 'locked', + lockReason: '璐ㄩ噺妫�娴嬩腑', + lockUser: '鏉庡洓', + lockTime: '2024-12-01 10:00:00', + expectedUnlockTime: '2024-12-15 18:00:00' + }, + { + id: '3', + lockCode: 'LK20241201003', + coalId: '4', + coalName: '鐒︾叅', + supplierId: '3', + supplierName: '闄曡タ鐓ょ偔宸ヤ笟', + totalInventory: 1200, + lockQuantity: 0, + availableQuantity: 1200, + lockStatus: 'unlocked', + lockReason: '', + lockUser: '', + lockTime: '', + expectedUnlockTime: '' + } + ] + total.value = lockList.value.length +} + +// 鑾峰彇閿佷粨鐘舵�佺被鍨� +const getLockStatusType = (status) => { + const statusMap = { + 'locked': 'danger', + 'partial': 'warning', + 'unlocked': 'success' + } + return statusMap[status] || 'info' +} + +// 鑾峰彇閿佷粨鐘舵�佹枃鏈� +const getLockStatusText = (status) => { + const statusMap = { + 'locked': '宸查攣瀹�', + 'partial': '閮ㄥ垎閿佸畾', + 'unlocked': '鏈攣瀹�' + } + return statusMap[status] || '鏈煡' +} + +// 鐓ょ閫夋嫨鍙樺寲澶勭悊 +const handleCoalChange = (coalId) => { + const selectedCoal = coalOptions.value.find(item => item.value === coalId) + if (selectedCoal) { + form.coalName = selectedCoal.label + // 妯℃嫙璁剧疆搴撳瓨鏁版嵁 + form.totalInventory = Math.floor(Math.random() * 1000) + 500 + form.availableQuantity = form.totalInventory - form.lockQuantity + } +} + +// 閿佷粨鏁伴噺鍙樺寲澶勭悊 +const handleLockQuantityChange = () => { + if (form.lockQuantity > form.totalInventory) { + form.lockQuantity = form.totalInventory + } + form.availableQuantity = form.totalInventory - form.lockQuantity + + // 鏇存柊閿佷粨鐘舵�� + if (form.lockQuantity === 0) { + form.lockStatus = 'unlocked' + } else if (form.lockQuantity === form.totalInventory) { + form.lockStatus = 'locked' + } else { + form.lockStatus = 'partial' + } +} + +// 鏌ヨ鍒楄〃 +const getList = () => { + loading.value = true + // 妯℃嫙API璋冪敤寤惰繜 + setTimeout(() => { + loading.value = false + }, 500) +} + +// 鎼滅储 +const handleQuery = () => { + queryParams.pageNum = 1 + getList() +} + +// 閲嶇疆鎼滅储 +const resetQuery = () => { + queryParams.coalName = '' + queryParams.lockStatus = '' + queryParams.supplierName = '' + queryParams.lockDateRange = [] + handleQuery() +} + +// 閫夋嫨鍙樺寲澶勭悊 +const handleSelectionChange = (selection) => { + single.value = selection.length !== 1 + multiple.value = !selection.length +} + +// 鏂板閿佷粨 +const handleAdd = () => { + reset() + open.value = true +} + +// 淇敼閿佷粨 +const handleUpdate = (row) => { + reset() + const id = row.id || row + const lockData = lockList.value.find(item => item.id === id) + if (lockData) { + Object.assign(form, lockData) + } + open.value = true +} + +// 鏌ョ湅璇︽儏 +const handleView = (row) => { + reset() + const id = row.id || row + const lockData = lockList.value.find(item => item.id === id) + if (lockData) { + Object.assign(form, lockData) + } + viewOpen.value = true +} + +// 鍒犻櫎閿佷粨 +const handleDelete = (row) => { + const ids = row.id || row + ElMessageBox.confirm('纭鍒犻櫎閫変腑鐨勯攣浠撹褰曞悧锛�', '璀﹀憡', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + ElMessage.success('鍒犻櫎鎴愬姛') + getList() + }) +} + +// 瑙i櫎閿佷粨 +const handleUnlock = (row) => { + const id = row.id || row + ElMessageBox.confirm('纭瑙i櫎璇ョ叅绉嶇殑閿佷粨鍚楋紵', '璀﹀憡', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + const lockData = lockList.value.find(item => item.id === id) + if (lockData) { + lockData.lockQuantity = 0 + lockData.availableQuantity = lockData.totalInventory + lockData.lockStatus = 'unlocked' + lockData.lockReason = '' + lockData.lockUser = '' + lockData.lockTime = '' + lockData.expectedUnlockTime = '' + } + ElMessage.success('瑙i攣鎴愬姛') + getList() + }) +} + +// 瀵煎嚭 +const handleExport = () => { + ElMessage.success('瀵煎嚭鍔熻兘寮�鍙戜腑...') +} + +// 鎻愪氦琛ㄥ崟 +const submitForm = () => { + lockFormRef.value.validate((valid) => { + if (valid) { + if (form.id) { + // 淇敼 + const index = lockList.value.findIndex(item => item.id === form.id) + if (index !== -1) { + Object.assign(lockList.value[index], form) + } + ElMessage.success('淇敼鎴愬姛') + } else { + // 鏂板 + const newLock = { + ...form, + id: Date.now().toString(), + lockCode: `LK${new Date().toISOString().slice(0, 10).replace(/-/g, '')}${String(lockList.value.length + 1).padStart(3, '0')}`, + lockUser: '褰撳墠鐢ㄦ埛' + } + lockList.value.unshift(newLock) + total.value = lockList.value.length + ElMessage.success('鏂板鎴愬姛') + } + open.value = false + getList() + } + }) +} + +// 鍙栨秷 +const cancel = () => { + open.value = false + reset() +} + +// 閲嶇疆琛ㄥ崟 +const reset = () => { + Object.assign(form, { + id: undefined, + lockCode: '', + coalId: '', + coalName: '', + supplierId: '', + supplierName: '', + totalInventory: 0, + lockQuantity: 0, + availableQuantity: 0, + lockStatus: 'locked', + lockReason: '', + lockUser: '', + lockTime: '', + expectedUnlockTime: '', + remarks: '' + }) +} +</script> + +<style scoped> +.app-container { + padding: 20px; +} + +.box-card { + margin-bottom: 20px; +} + +.mb8 { + margin-bottom: 8px; +} + +.dialog-footer { + text-align: right; +} + +.el-descriptions { + margin: 20px 0; +} +</style> -- Gitblit v1.9.3