You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

1073 lines
35 KiB

<template>
<div class="mod-config">
<!-- 查询表单 - rqrq -->
<el-form :inline="true" label-position="top">
<el-form-item label="条码号">
<el-input style="width: 120px;" v-model="queryHeaderData.unitId" placeholder="请输入条码号" @keyup.enter.native="getDataList()"></el-input>
</el-form-item>
<el-form-item label="物料编号">
<el-input style="width: 120px;" v-model="queryHeaderData.partNo" placeholder="请输入物料编号" @keyup.enter.native="getDataList()"></el-input>
</el-form-item>
<el-form-item label="批次号">
<el-input style="width: 120px;" v-model="queryHeaderData.batchNo" placeholder="请输入批次号" @keyup.enter.native="getDataList()"></el-input>
</el-form-item>
<el-form-item label="库位">
<el-input style="width: 120px;" v-model="queryHeaderData.locationId" placeholder="请输入库位" @keyup.enter.native="getDataList()"></el-input>
</el-form-item>
<el-form-item label="仓库">
<el-input style="width: 120px;" v-model="queryHeaderData.warehouseId" placeholder="请输入仓库" @keyup.enter.native="getDataList()"></el-input>
</el-form-item>
<el-form-item style="margin-top: 20px;">
<el-button @click="getDataList()" type="primary">查询</el-button>
<el-button @click="resetQuery()" type="default">重置</el-button>
</el-form-item>
</el-form>
<!-- 功能按钮区 - rqrq -->
<el-form :inline="true" label-position="top" style="margin-top: 3px">
<el-button @click="openChangeWdrDialog()" type="primary" :disabled="dataListSelections.length === 0">Change W/D/R</el-button>
<el-button @click="openChangeExpDateDialog()" type="primary" :disabled="dataListSelections.length === 0">Change Expiration Date</el-button>
<el-button @click="openChangeAvailDialog()" type="primary" :disabled="dataListSelections.length === 0">Change Availability Control ID</el-button>
</el-form>
<!-- 主表格 - rqrq -->
<el-table
:height="height"
:data="dataList"
border
v-loading="dataListLoading"
@selection-change="selectionChangeHandle"
style="width: 100%; margin-bottom: 15px;margin-top:3px">
<!-- 选择列 - rqrq -->
<el-table-column
type="selection"
header-align="center"
align="center"
width="50"
:selectable="checkSelectable">
</el-table-column>
<!-- 动态列配置 - rqrq -->
<el-table-column
v-for="(item,index) in columnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed==''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="item.columnProp === 'inStockFlag'">
<span v-if="scope.row.inStockFlag === 'Y'">在库</span>
<span v-else-if="scope.row.inStockFlag === 'N'">已出库</span>
<span v-else-if="scope.row.inStockFlag === 'X'">未入库</span>
<span v-else>{{ scope.row.inStockFlag }}</span>
</span>
<span v-else-if="item.columnProp === 'reserveFlag'">
{{ scope.row.reserveFlag === 'Y' ? '是' : '否' }}
</span>
<span v-else-if="item.columnProp === 'freezeFlag'">
{{ scope.row.freezeFlag === 'Y' ? '是' : '否' }}
</span>
<span v-else-if="item.columnProp === 'mergedFlag'">
{{ scope.row.mergedFlag === 'Y' ? '是' : '否' }}
</span>
<span v-else-if="item.columnProp === 'manufactureDate' || item.columnProp === 'expiredDate' || item.columnProp === 'receiveDate' || item.columnProp === 'createdDate' || item.columnProp === 'modifiedDate' || item.columnProp === 'lastPrintDate'">
{{ formatDate(scope.row[item.columnProp]) }}
</span>
<span v-else>{{ scope.row[item.columnProp] }}</span>
</template>
</el-table-column>
<!-- 操作列 - rqrq -->
<el-table-column label="操作" min-width="120" fixed="right" header-align="center" align="center">
<template slot-scope="scope">
<a @click="viewDetail(scope.row)" type="primary">查看详细</a>
</template>
</el-table-column>
</el-table>
<!-- 分页 - rqrq -->
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[30, 100, 500]"
:page-size="pageSize"
:total="totalPage"
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
<!-- 查看详细信息弹窗 - rqrq -->
<el-dialog
title="查看详细信息"
:visible.sync="dialogVisible"
:close-on-click-modal="false"
v-drag
width="900px">
<el-form :model="formData" ref="dataForm" label-position="top" style="margin-top: 1px; margin-left: 0px;">
<!-- 基本信息(只读)- rqrq -->
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="条码号">
<el-input v-model="formData.unitId" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="物料编号">
<el-input v-model="formData.partNo" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="批次号">
<el-input v-model="formData.batchNo" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="数量">
<el-input v-model="formData.qty" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 订单参考信息 - rqrq -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="订单参考1">
<el-input v-model="formData.orderRef1" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="订单参考2">
<el-input v-model="formData.orderRef2" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="订单参考3">
<el-input v-model="formData.orderRef3" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 供应商/客户信息 - rqrq -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="供应商ID">
<el-input v-model="formData.supplierId" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="客户ID">
<el-input v-model="formData.customerId" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 日期信息 - rqrq -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="生产日期">
<el-input v-model="formData.manufactureDate" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="失效日期">
<el-input v-model="formData.expiredDate" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 来源信息 - rqrq -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="来源类型">
<el-input v-model="formData.sourceType" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="来源参考">
<el-input v-model="formData.sourceRef" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 重量/体积信息 - rqrq -->
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="毛重">
<el-input v-model="formData.grossWeight" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="净重">
<el-input v-model="formData.netWeight" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="重量单位">
<el-input v-model="formData.weightUnit" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="EngChgLevel">
<el-input v-model="formData.engChgLevel" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="体积">
<el-input v-model="formData.volume" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="体积单位">
<el-input v-model="formData.volumeUnit" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 预留信息 - rqrq -->
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="预留订单参考1">
<el-input v-model="formData.reserveOrderRef1" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="预留订单参考2">
<el-input v-model="formData.reserveOrderRef2" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="预留订单参考3">
<el-input v-model="formData.reserveOrderRef3" readonly></el-input>
</el-form-item>
</el-col>
</el-row>
<!-- 备注 - rqrq -->
<el-row>
<el-col :span="24">
<el-form-item label="备注">
<el-input v-model="formData.remark" type="textarea" :rows="3" resize='none' readonly></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer" style="margin-top: 52px">
<el-button type="primary" @click="dialogVisible = false">关闭</el-button>
</div>
</el-dialog>
<!-- Change W/D/R 弹窗 - rqrq -->
<el-dialog
title="Change W/D/R"
:visible.sync="wdrDialogVisible"
:close-on-click-modal="false"
v-drag
width="400px">
<el-form label-position="top" style="margin-top: 1px; margin-left: 0px;">
<el-form-item label="To W/D/R">
<el-input v-model="wdrFormData.toWdr" placeholder="请输入W/D/R"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveWdrChange" :disabled="wdrSaveLoading">
{{ wdrSaveLoading ? 'Save中...' : 'Save' }}
</el-button>
<el-button @click="closeWdrDialog" :disabled="wdrSaveLoading">Close</el-button>
</div>
</el-dialog>
<!-- Change Expiration Date 弹窗 - rqrq -->
<el-dialog
title="Change Expiration Date"
:visible.sync="expDateDialogVisible"
:close-on-click-modal="false"
v-drag
width="400px">
<el-form label-position="top" style="margin-top: 1px; margin-left: 0px;">
<el-form-item label="New Expiration Date">
<el-date-picker
v-model="expDateFormData.newExpDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择失效日期"
style="width: 100%">
</el-date-picker>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveExpDateChange" :disabled="expDateSaveLoading">
{{ expDateSaveLoading ? 'Save中...' : 'Save' }}
</el-button>
<el-button @click="closeExpDateDialog" :disabled="expDateSaveLoading">Close</el-button>
</div>
</el-dialog>
<!-- Change Availability Control ID 弹窗 - rqrq -->
<el-dialog
title="Change Availability Control ID"
:visible.sync="availDialogVisible"
:close-on-click-modal="false"
v-drag
width="400px">
<el-form label-position="top" style="margin-top: 1px; margin-left: 0px;">
<el-form-item label="New Availability Control ID">
<el-input v-model="availFormData.newAvailId" placeholder="请输入Availability Control ID" @blur="handleAvailIdBlur">
<el-button slot="append" @click="showAvailList">List</el-button>
</el-input>
</el-form-item>
<el-form-item label="New Availability Control Desc">
<el-input v-model="availFormData.newAvailDesc" disabled placeholder="描述(自动填充)"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="saveAvailChange" :disabled="availSaveLoading">
{{ availSaveLoading ? 'Save中...' : 'Save' }}
</el-button>
<el-button @click="closeAvailDialog" :disabled="availSaveLoading">Close</el-button>
</div>
</el-dialog>
<!-- Availability Control ID 选择弹窗 - rqrq -->
<el-dialog
title="选择 Availability Control ID"
:visible.sync="availListDialogVisible"
:close-on-click-modal="false"
v-drag
width="600px"
append-to-body>
<!-- 搜索区域 - rqrq -->
<el-form :inline="true" label-position="top" style="margin-bottom: 10px;">
<el-form-item label="ID">
<el-input style="width: 150px;" v-model="availListQueryData.searchAvailabilityControlId" placeholder="请输入" @keyup.enter.native="getAvailList()" clearable></el-input>
</el-form-item>
<el-form-item label="描述">
<el-input style="width: 150px;" v-model="availListQueryData.searchAvailabilityControlDesc" placeholder="请输入" @keyup.enter.native="getAvailList()" clearable></el-input>
</el-form-item>
<el-form-item style="margin-top: 20px;">
<el-button @click="getAvailList()" type="primary">查询</el-button>
</el-form-item>
</el-form>
<!-- 列表 - rqrq -->
<el-table
:data="availListData"
border
highlight-current-row
v-loading="availListLoading"
@row-dblclick="handleAvailListDblClick"
height="300"
style="width: 100%;">
<el-table-column
prop="availabilityControlId"
header-align="center"
align="center"
label="Availability Control ID"
min-width="180">
</el-table-column>
<el-table-column
prop="availabilityControlDesc"
header-align="center"
align="left"
label="描述"
min-width="250"
show-overflow-tooltip>
</el-table-column>
</el-table>
<div slot="footer" class="dialog-footer">
<el-button @click="availListDialogVisible = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { searchHandlingUnitList, batchChangeAvailabilityControlId, batchChangeExpiryDate, batchChangeWdr } from '@/api/warehouse/changeHUSpecialItem'
import { activeList, getDescById } from '@/api/warehouse/availabilityControlId'
export default {
data() {
return {
// 页面状态 - rqrq
height: 500,
dataListLoading: false,
// 弹窗状态 - rqrq
dialogVisible: false,
// 三个功能弹窗状态 - rqrq
wdrDialogVisible: false,
expDateDialogVisible: false,
availDialogVisible: false,
wdrSaveLoading: false,
expDateSaveLoading: false,
availSaveLoading: false,
// Availability Control ID列表弹窗状态 - rqrq
availListDialogVisible: false,
availListLoading: false,
availListData: [],
availListQueryData: {
searchAvailabilityControlId: '',
searchAvailabilityControlDesc: ''
},
// 数据列表 - rqrq
dataList: [],
dataListSelections: [],
// 查询条件 - rqrq
queryHeaderData: {
site: this.$store.state.user.site,
unitId: '',
partNo: '',
batchNo: '',
locationId: '',
warehouseId: '',
inStockFlag: 'Y'
},
// 表单数据 - rqrq
formData: {},
// 三个功能表单数据 - rqrq
wdrFormData: {
toWdr: ''
},
expDateFormData: {
newExpDate: ''
},
availFormData: {
newAvailId: '',
newAvailDesc: ''
},
// 分页信息 - rqrq
pageIndex: 1,
pageSize: 30,
totalPage: 0,
// 表格列配置 - rqrq
columnList: [
{
columnProp: "unitId",
headerAlign: "center",
align: "center",
columnLabel: "条码号",
columnWidth: 150,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "partNo",
headerAlign: "center",
align: "center",
columnLabel: "物料编号",
columnWidth: 100,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "batchNo",
headerAlign: "center",
align: "center",
columnLabel: "批次号",
columnWidth: 140,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "qty",
headerAlign: "center",
align: "right",
columnLabel: "数量",
columnWidth: 70,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "locationId",
headerAlign: "center",
align: "center",
columnLabel: "库位",
columnWidth: 90,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "warehouseId",
headerAlign: "center",
align: "center",
columnLabel: "仓库",
columnWidth: 60,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "wdr",
headerAlign: "center",
align: "center",
columnLabel: "WDR",
columnWidth: 100,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "availabilityControlId",
headerAlign: "center",
align: "center",
columnLabel: "Availability Control Id",
columnWidth: 150,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "expiredDate",
headerAlign: "center",
align: "center",
columnLabel: "失效日期",
columnWidth: 100,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "engChgLevel",
headerAlign: "center",
align: "center",
columnLabel: "EngChgLevel",
columnWidth: 90,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "manufactureDate",
headerAlign: "center",
align: "center",
columnLabel: "生产日期",
columnWidth: 100,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
{
columnProp: "partDesc",
headerAlign: "center",
align: "center",
columnLabel: "物料描述",
columnWidth: 200,
columnSortable: false,
showOverflowTooltip: true,
fixed: ""
},
]
}
},
watch: {
wdrFormData: {
deep: true,
handler: function (newV, oldV) {
this.wdrFormData.toWdr = this.wdrFormData.toWdr.toUpperCase()
}
}
},
mounted() {
this.$nextTick(() => {
this.height = window.innerHeight - 220;
})
// 计算表格高度 - rqrq
// 加载初始数据 - rqrq
this.getDataList()
},
methods: {
// 查询列表数据 - rqrq
getDataList() {
this.dataListLoading = true
const params = {
...this.queryHeaderData,
page: this.pageIndex,
limit: this.pageSize
}
searchHandlingUnitList(params).then(({data}) => {
this.dataListLoading = false
if (data && data.code == 0) {
this.dataList = data.page.list || []
this.pageIndex = data.page.currPage
this.totalPage = data.page.totalCount
} else {
this.dataList = []
this.totalPage = 0
this.$message.error(data.msg || '查询失败')
}
}).catch(() => {
this.dataListLoading = false
this.$message.error('查询失败')
})
},
// 重置查询条件 - rqrq
resetQuery() {
this.queryHeaderData = {
site: this.$store.state.user.site,
unitId: '',
partNo: '',
batchNo: '',
locationId: '',
warehouseId: '',
inStockFlag: ''
}
this.pageIndex = 1
this.getDataList()
},
// 每页数变化 - rqrq
sizeChangeHandle(val) {
this.pageSize = val
this.pageIndex = 1
this.getDataList()
},
// 当前页变化 - rqrq
currentChangeHandle(val) {
this.pageIndex = val
this.getDataList()
},
// 选择变化 - rqrq
selectionChangeHandle(val) {
this.dataListSelections = val
},
// 查看详细信息 - rqrq
viewDetail(row) {
this.formData = JSON.parse(JSON.stringify(row))
this.dialogVisible = true
},
// 格式化日期 - rqrq
formatDate(dateStr) {
if (!dateStr) return ''
const date = new Date(dateStr)
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 seconds = String(date.getSeconds()).padStart(2, '0')
if (hours === '00' && minutes === '00' && seconds === '00') {
return `${year}-${month}-${day}`
}
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
},
// 校验行是否可选择(必须有物料编号)- rqrq
checkSelectable(row) {
if (!row.partNo || row.partNo === '') {
return false
}
return true
},
// ==================== Change W/D/R相关方法 - rqrq ====================
// 打开Change W/D/R弹窗 - rqrq
openChangeWdrDialog() {
if (this.dataListSelections.length === 0) {
this.$message.warning('请先选择要修改的记录')
return
}
// 重置表单 - rqrq
this.wdrFormData = {
toWdr: ''
}
this.wdrDialogVisible = true
},
// 关闭W/D/R弹窗 - rqrq
closeWdrDialog() {
this.wdrDialogVisible = false
this.wdrFormData = {
toWdr: ''
}
},
// 保存W/D/R修改 - rqrq
saveWdrChange() {
// 参数校验 - rqrq
if (!this.wdrFormData.toWdr) {
this.$message.warning('请输入W/D/R')
return
}
// 构建提示信息,显示选中的标签数量 - rqrq
const selectedCount = this.dataListSelections.length
// 按库存关键字去重统计 - rqrq
const inventoryKeySet = new Set()
this.dataListSelections.forEach(item => {
const key = `${item.site}|${item.partNo}|${item.locationId}|${item.batchNo}|${item.wdr}|${item.engChgLevel}`
inventoryKeySet.add(key)
})
const inventoryCount = inventoryKeySet.size
this.$confirm(`确认将选中的 ${selectedCount} 个标签(${inventoryCount}行库存)的W/D/R修改为 "${this.wdrFormData.toWdr}" 吗?`, '确认修改', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.doSaveWdrChange()
}).catch(() => {
// 取消操作
})
},
// 执行W/D/R修改 - rqrq
doSaveWdrChange() {
this.wdrSaveLoading = true
const requestData = {
selectedItems: this.dataListSelections,
newWdr: this.wdrFormData.toWdr
}
batchChangeWdr(requestData).then(({ data }) => {
if (data && data.code == 0) {
const result = data.row
this.showChangeResult(result, 'W/D/R修改', () => {
this.closeWdrDialog()
this.getDataList()
})
} else {
this.$alert(data.msg || 'W/D/R修改失败', '错误')
}
}).catch(error => {
this.$message.error('W/D/R修改失败:' + (error.message || '网络错误'))
}).finally(() => {
this.wdrSaveLoading = false
})
},
// ==================== Change Expiration Date相关方法 - rqrq ====================
// 打开Change Expiration Date弹窗 - rqrq
openChangeExpDateDialog() {
if (this.dataListSelections.length === 0) {
this.$message.warning('请先选择要修改的记录')
return
}
// 重置表单 - rqrq
this.expDateFormData = {
newExpDate: ''
}
this.expDateDialogVisible = true
},
// 关闭Expiration Date弹窗 - rqrq
closeExpDateDialog() {
this.expDateDialogVisible = false
this.expDateFormData = {
newExpDate: ''
}
},
// 保存Expiration Date修改 - rqrq
saveExpDateChange() {
// 参数校验 - rqrq
if (!this.expDateFormData.newExpDate) {
this.$message.warning('请选择失效日期')
return
}
// 构建提示信息,显示选中的标签数量和去重后的库存行数 - rqrq
const selectedCount = this.dataListSelections.length
// 按库存关键字去重统计 - rqrq
const inventoryKeySet = new Set()
this.dataListSelections.forEach(item => {
const key = `${item.site}|${item.partNo}|${item.locationId}|${item.batchNo}|${item.wdr}|${item.engChgLevel}`
inventoryKeySet.add(key)
})
const inventoryCount = inventoryKeySet.size
// 确认提示 - rqrq
const confirmMsg = `您选择了 ${selectedCount} 个标签,涉及 ${inventoryCount} 行ERP库存。\n\n` +
`注意:同一行ERP库存下的所有标签将一起被修改为新的失效日期:${this.expDateFormData.newExpDate}\n\n` +
`确定要执行此操作吗?`
this.$confirm(confirmMsg, '确认修改', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.doSaveExpDateChange()
}).catch(() => {})
},
// 执行Expiration Date修改 - rqrq
doSaveExpDateChange() {
this.expDateSaveLoading = true
const requestData = {
selectedItems: this.dataListSelections,
newExpiryDate: this.expDateFormData.newExpDate
}
batchChangeExpiryDate(requestData).then(({ data }) => {
if (data && data.code == 0) {
const result = data.row
this.showChangeResult(result, '失效日期修改', () => {
this.closeExpDateDialog()
this.getDataList()
})
} else {
this.$alert(data.msg || '修改失败', '提示', { type: 'error' })
}
}).catch((error) => {
this.$message.error('修改失败:' + (error.message || '网络错误'))
}).finally(() => {
this.expDateSaveLoading = false
})
},
// ==================== Change Availability Control ID相关方法 - rqrq ====================
// 打开Change Availability Control ID弹窗 - rqrq
openChangeAvailDialog() {
if (this.dataListSelections.length === 0) {
this.$message.warning('请先选择要修改的记录')
return
}
// 重置表单 - rqrq
this.availFormData = {
newAvailId: '',
newAvailDesc: ''
}
this.availDialogVisible = true
},
// 关闭Availability Control ID弹窗 - rqrq
closeAvailDialog() {
this.availDialogVisible = false
this.availFormData = {
newAvailId: '',
newAvailDesc: ''
}
},
// 显示Availability Control ID列表 - rqrq
showAvailList() {
this.availListQueryData = {
searchAvailabilityControlId: '',
searchAvailabilityControlDesc: ''
}
this.availListDialogVisible = true
this.getAvailList()
},
// 查询Availability Control ID列表 - rqrq
getAvailList() {
this.availListLoading = true
activeList().then(({ data }) => {
this.availListLoading = false
if (data && data.code == 0) {
let list = data.rows || []
// 前端过滤 - rqrq
if (this.availListQueryData.searchAvailabilityControlId) {
list = list.filter(item =>
item.availabilityControlId &&
item.availabilityControlId.toUpperCase().includes(this.availListQueryData.searchAvailabilityControlId.toUpperCase())
)
}
if (this.availListQueryData.searchAvailabilityControlDesc) {
list = list.filter(item =>
item.availabilityControlDesc &&
item.availabilityControlDesc.toUpperCase().includes(this.availListQueryData.searchAvailabilityControlDesc.toUpperCase())
)
}
this.availListData = list
} else {
this.availListData = []
this.$message.error(data.msg || '查询失败')
}
}).catch(() => {
this.availListLoading = false
this.$message.error('查询失败')
})
},
// 双击选择Availability Control ID - rqrq
handleAvailListDblClick(row) {
this.availFormData.newAvailId = row.availabilityControlId
this.availFormData.newAvailDesc = row.availabilityControlDesc || ''
this.availListDialogVisible = false
},
// Availability Control ID失去焦点事件 - rqrq
handleAvailIdBlur() {
if (!this.availFormData.newAvailId) {
this.availFormData.newAvailDesc = ''
return
}
getDescById(this.availFormData.newAvailId).then(({ data }) => {
if (data && data.code == 0) {
// row可能是null或描述字符串 - rqrq
this.availFormData.newAvailDesc = data.row || ''
} else {
this.availFormData.newAvailDesc = ''
}
}).catch(() => {
this.availFormData.newAvailDesc = ''
})
},
// 保存Availability Control ID修改 - rqrq
saveAvailChange() {
// 参数校验 - rqrq
if (!this.availFormData.newAvailId) {
this.$message.warning('请输入Availability Control ID')
return
}
// 构建提示信息,显示选中的标签数量和去重后的库存行数 - rqrq
const selectedCount = this.dataListSelections.length
// 按库存关键字去重统计 - rqrq
const inventoryKeySet = new Set()
this.dataListSelections.forEach(item => {
const key = `${item.site}|${item.partNo}|${item.locationId}|${item.batchNo}|${item.wdr}|${item.engChgLevel}`
inventoryKeySet.add(key)
})
const inventoryCount = inventoryKeySet.size
// 确认提示 - rqrq
const confirmMsg = `您选择了 ${selectedCount} 个标签,涉及 ${inventoryCount} 行ERP库存。\n\n` +
`注意:同一行ERP库存下的所有标签将一起被修改为新的 Availability Control ID:${this.availFormData.newAvailId}\n\n` +
`确定要执行此操作吗?`
this.$confirm(confirmMsg, '确认修改', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.doSaveAvailChange()
}).catch(() => {})
},
// 执行Availability Control ID修改 - rqrq
doSaveAvailChange() {
this.availSaveLoading = true
const requestData = {
selectedItems: this.dataListSelections,
newAvailabilityControlId: this.availFormData.newAvailId
}
batchChangeAvailabilityControlId(requestData).then(({ data }) => {
if (data && data.code == 0) {
const result = data.row
this.showChangeResult(result, 'Availability Control ID修改', () => {
this.closeAvailDialog()
this.getDataList()
})
} else {
this.$alert(data.msg || '修改失败', '提示', { type: 'error' })
}
}).catch((error) => {
this.$message.error('修改失败:' + (error.message || '网络错误'))
}).finally(() => {
this.availSaveLoading = false
})
},
// ==================== 通用结果显示方法 - rqrq ====================
/**
* 显示修改结果弹窗 - rqrq
* @param result 后端返回的结果对象
* @param title 操作标题
* @param callback 弹窗关闭后的回调
*/
showChangeResult(result, title, callback) {
const successCount = result.successCount || 0
const failCount = result.failCount || 0
const failedUnitIds = result.failedUnitIds || []
const failedReasons = result.failedReasons || []
// 构建弹窗内容 - rqrq
let htmlContent = `<div style="line-height: 1.8;">`
htmlContent += `<p><b>成功数量</b>${successCount}</p>`
htmlContent += `<p><b>失败数量</b>${failCount}</p>`
if (failCount > 0 && failedUnitIds.length > 0) {
// 失败序列号(用逗号分隔)- rqrq
htmlContent += `<p><b>失败序列号</b>${failedUnitIds.join(', ')}</p>`
// 失败报错(只显示第一个)- rqrq
const firstError = failedReasons.length > 0 ? failedReasons[0] : '未知错误'
htmlContent += `<p><b>失败报错</b>${firstError}</p>`
}
htmlContent += `</div>`
// 根据是否有失败决定弹窗类型 - rqrq
const dialogType = failCount > 0 ? 'warning' : 'success'
const dialogTitle = failCount > 0 ? `${title}结果部分失败` : `${title}结果`
this.$alert(htmlContent, dialogTitle, {
dangerouslyUseHTMLString: true,
confirmButtonText: '确定',
type: dialogType,
callback: () => {
if (callback) callback()
}
})
}
}
}
</script>
<style scoped>
/* 按钮禁用样式 - rqrq */
.el-button:disabled {
opacity: 0.6;
cursor: not-allowed;
}
</style>