fengshang_yangzhou/dev_wms_client/src/layout/goods.vue
Yxq c7eebdab59 新增用户系统
部分bug修复
11月21日
2025-11-21 09:39:38 +08:00

436 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<el-config-provider :locale="zhCn">
<el-container class="content">
<div class="work-area">
<fieldset class="search-area">
<el-form ref="searchQueryFormRef" :model="searchQueryFormEntity" :label-position="labelPosition"
label-width="158px" style="max-width: 100%" status-icon>
<div style="display: flex;justify-content: space-between;">
<el-row>
<el-form-item label="料号">
<el-input v-model="searchQueryFormEntity.goodsId" @keyup.enter="search()"
clearable/>
</el-form-item>
<el-form-item label="工单详情">
<el-input v-model="searchQueryFormEntity.workOrder" @keyup.enter="search()"
clearable/>
</el-form-item>
<!-- <el-form-item label="工单号">-->
<!-- <el-input v-model="searchQueryFormEntity.goodsDesc" @keyup.enter="search()"-->
<!-- clearable/>-->
<!-- </el-form-item>-->
</el-row>
<div style="align-content: center;">
<el-row>
<el-button type="primary" class="btn-search" @click="search()">查询</el-button>
<el-button type="warning" class="btn-search" @click="clearQuery()">清除输入</el-button>
</el-row>
<!-- <el-row>-->
<!-- <el-button style="background-color: #00CED1;" class="btn-search"-->
<!-- @click="openUploadDialog()">导入数据-->
<!-- </el-button>-->
<!-- <el-button type="success" class="btn-search"-->
<!-- @click="exportExcel()">导出excel-->
<!-- </el-button>-->
<!-- </el-row>-->
</div>
</div>
</el-form>
</fieldset>
<div class="table-area">
<el-table :data="tableData" stripe border v-loading="tableLoading" class="table-class"
:max-height="maxHeight" highlight-current-row @row-click="getCurrentRow"
:header-cell-style="{ 'text-align': 'center' }" :cell-style="{ 'text-align': 'center' }"
@sort-change="handleSortChange">
<el-table-column width="65px" fixed="left">
<template v-slot="scope">
<el-radio :label="scope.row.goodsId" v-model="goodsId">&nbsp;</el-radio>
</template>
</el-table-column>
<el-table-column prop="workOrder" label="工单详情" fixed="left" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="goodsId" label="料号" fixed="left" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="needNum" label="需求数量" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="distributeNum" label="已分配数量" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="pickNum" label="已拣选数量" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="outType" label="优先级" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="destination" label="呼叫站台" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="specialStock" label="特殊库存" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="specialStockNo" label="特殊库存号" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="specialStockItemNo" label="特殊库存Item号" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="batchNo" label="批次号" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column prop="taskId" label="任务号" min-width="120px" sortable="custom"
show-overflow-tooltip/>
<el-table-column
prop="pickingDate"
label="执行时间"
fixed="right"
min-width="120px"
sortable="custom"
:formatter="(row, column, cellValue) => formatDateToDay(cellValue)"
show-overflow-tooltip/>
<el-table-column label="操作" fixed="right" min-width="180px">
<template v-slot="scope">
<div style="display: flex; gap: 5px; justify-content: center;">
<el-button size="default" type="success" @click.stop="handleEdit(scope.row)">编辑</el-button>
<el-button size="default" type="warning" @click.stop="handleDelete(scope.row)">加急</el-button>
</div>
</template>
</el-table-column>
</el-table>
<br/>
<el-pagination v-model:current-page="baseTableQuery.currentPage"
v-model:page-size="baseTableQuery.pageSize" :page-sizes="[10, 25, 50]" :small="false"
:disabled="false" :background="false" :default-page-size="10" @size-change="search"
@current-change="search" layout="total, sizes, prev, pager, next, jumper"
:total="baseTableQuery.total"/>
</div>
<el-dialog v-model="showEditDialog" title="编辑执行日期" width="30%" draggable>
<el-form ref="editFormRef" :model="editForm" label-width="100px">
<el-form-item label="执行时间">
<el-date-picker
v-model="editForm.pickingDate"
type="date"
placeholder="请选择执行时间"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
style="width: 100%">
</el-date-picker>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="showEditDialog = false">取消</el-button>
<el-button type="primary" @click="saveEdit(editForm)">确定</el-button>
</span>
</template>
</el-dialog>
</div>
</el-container>
</el-config-provider>
</template>
<script setup>
import store from '@/store'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import {editDate, getGoodsInfoByPage, upOutsType} from '@/api/goods.js'
import {ref, reactive, onMounted, nextTick, onBeforeUnmount} from 'vue'
import {ElMessage} from 'element-plus'
import {genTableRequest} from '@/utils/generator.js'
import {labelPosition} from '@/constant/form.js'
import UploadExcelBaseGoods from '@/excel/UploadExcelBaseGoods.vue'
import UploadExcelKanban from '@/excel/UploadExcelKanban.vue'
import {exportGoodsExcel} from "@/api/excel";
import {dateFormatter} from "@/utils/formatter";
/**
* 常量定义
*/
const STAND_ID = store.getters.getStandId
const USER_NAME = store.getters.getUserName
/**
* 变量定义
*/
let maxHeight = ref(window.innerHeight * 0.55)
let tableLoading = ref(false)
let tableData = ref([])
let baseTableQuery = reactive({
currentPage: 1,
pageSize: 10,
total: 0,
sortBy: new Map([['goodsId', true]]),// 按照料号顺序排序
standId: STAND_ID,
userName: USER_NAME
})
let searchQueryFormEntity = reactive({
goodsId: '',
goodsDesc: '',
workOrder: '',
})
let searchQueryFormRef = ref()
let rowEditFlag = ref(false)
let goodsId = ''
let rowEditFormRef = ref()
let rowFormEntity = reactive({})
let showUploadDialog = ref(false)
/**
* 系统方法
*/
onMounted(() => {
nextTick(() => {
window.addEventListener('resize', resizeHeight)
search()
})
})
onBeforeUnmount(() => {
nextTick(() => {
window.removeEventListener('resize', resizeHeight)
})
})
const resizeHeight = () => {
maxHeight.value = window.innerHeight * 0.55
}
// 保存编辑
const saveEdit = (editForm) => {
let request = {
taskId: editForm.taskId,
pickingDate: editForm.pickingDate
}
editDate( request).then((res) => {
if (res.data.code === 0) {
ElMessage({
message: '操作成功',
type: 'success',
});
search()
} else {
ElMessage({
message: res.data.message,
type: 'error',
});
}
})
showEditDialog.value = false
search() // 刷新表格数据
}
// 添加优先级
const handleDelete = (row) => {
//
let request = {
taskId: row.taskId,
}
upOutsType( request).then((res) => {
if (res.data.code === 0) {
ElMessage({
message: '操作成功',
type: 'success',
});
search()
} else {
ElMessage({
message: res.data.message,
type: 'error',
});
}
})
}
// 编辑弹窗相关
const showEditDialog = ref(false)
const editForm = reactive({
pickingDate: '',
taskId: ''
})
const editFormRef = ref()
// 打开编辑弹窗
const handleEdit = (row) => {
editForm.taskId = row.taskId
// 使用 formatDateToDay 处理日期,避免时区问题
editForm.pickingDate = row.pickingDate ? formatDateToDay(row.pickingDate) : ''
showEditDialog.value = true
}
const formatDateToDay = (dateString) => {
if (!dateString) return '';
// 直接解析日期字符串,避免时区转换
const date = new Date(dateString);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
};
/**
* 自定义方法
*/
// 查询
const search = () => {
tableLoading.value = true
let request = genTableRequest(baseTableQuery)
// 设定查询参数
request.queryType = 1
request.goodsId = searchQueryFormEntity.goodsId.trim()
request.vehicleId = searchQueryFormEntity.goodsDesc.trim()
request.workOrder = searchQueryFormEntity.workOrder.trim()
getGoodsInfoByPage(request).then((res) => {
const response = res.data
if (response.code === 0) {
const data = response.data
if (data != null) {
tableData.value = data.lists
baseTableQuery.total = data.total
} else {
tableData.value = []
baseTableQuery.total = 0
}
} else {
ElMessage.error(response.message)
}
}).catch(err => {
ElMessage.error('查询数据异常。')
}).finally(() => {
tableLoading.value = false
})
}
const clearQuery = () => {
searchQueryFormEntity.goodsId = ''
searchQueryFormEntity.goodsDesc = ''
searchQueryFormEntity.workOrder = ''
}
const handleSortChange = (data) => {
if (baseTableQuery.sortBy.has(data.prop)) {
baseTableQuery.sortBy.delete(data.prop)
}
baseTableQuery.sortBy.set(data.prop, data.order.toLowerCase() === 'ascending')
search()
}
const openUploadDialog = () => {
showUploadDialog.value = true
}
const getCurrentRow = (row) => {
goodsId = row.goodsId
}
const exportExcel = () => {
const params = {
goodsId: searchQueryFormEntity.goodsId,
goodsDesc: searchQueryFormEntity.goodsDesc,
userName: USER_NAME
}
exportGoodsExcel(params).then(res => {
const link = document.createElement('a');//创建a标签
try {
// let blob = new Blob([res.data],{type: 'application/vnd.ms-excel'}); //如果后台返回的不是blob对象类型先定义成blob对象格式该type导出为xls格式
let blob = res.data //如果后台返回的直接是blob对象类型直接获取数据
// let _fileName = res.headers['content-disposition'].split(';')[1].split('=')[1]; //拆解获取文件名,如果后端有给返回文件名的话
let _fileName = '物料基础信息' + dateFormatter(new Date) + '.xlsx'
link.style.display = 'none'//隐藏
// 兼容不同浏览器的URL对象
const url = window.URL || window.webkitURL || window.moxURL
link.href = url.createObjectURL(blob)
link.setAttribute('download', _fileName.substring(_fileName.lastIndexOf('_') + 1))
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
url.revokeObjectURL(link.href)//移除url对象
} catch (e) {
console.log(e)
ElMessage.error('下载文件失败')
}
}).catch(err => {
console.log(err)
ElMessage.error('导出失败')
})
}
</script>
<style scoped>
.content {
display: flex;
width: 100%;
}
.work-area {
width: 100%;
/* padding: 5px; */
}
.search-area {
margin: auto;
min-height: fit-content;
max-height: 40%;
margin-bottom: 10px;
min-width: inherit;
border: solid 1px;
border-radius: 10px;
box-shadow: 0px 15px 10px -15px #000;
overflow: auto;
padding: 10px;
}
.table-area {
margin: auto;
min-height: fit-content;
max-height: 60%;
margin-bottom: 10px;
min-width: inherit;
border: solid 1px;
border-radius: 10px;
box-shadow: 0px 15px 10px -15px #000;
overflow: auto;
padding: 10px;
}
.el-form-item {
margin: 5px 5px 5px 5px;
}
.el-form-item .el-input {
width: 196px;
}
.el-form-item .el-input-number {
width: 196px;
}
.table-class {
margin: 5px 5px 5px 5px;
width: inherit;
}
.el-pagination {
padding-left: 5px;
}
.my-autocomplete li {
width: 196px;
line-height: normal;
padding: 7px;
}
.my-autocomplete li .name {
text-overflow: ellipsis;
overflow: hidden;
}
.my-autocomplete li .addr {
font-size: 12px;
color: #b4b4b4;
}
.my-autocomplete li .highlighted .addr {
color: #ddd;
}
.my-autocomplete li .goods_id {
color: brown;
}
.my-autocomplete li .goods_name {
color: cornflowerblue;
}
.btn-search {
height: 30px;
width: 80px;
margin: auto 5px 5px auto;
color: black;
}
</style>