Merge remote-tracking branch 'origin/0.8.X' into 0.8.X

This commit is contained in:
2026-05-21 15:26:54 +08:00
6 changed files with 408 additions and 177 deletions

View File

@@ -126,6 +126,21 @@ export function confirmTransferOrderItem(item) {
})
}
/**
* 批量确认调拨
*/
export function batchConfirmTransferOrderItem(list) {
if (!list || list.length === 0) {
return Promise.reject('参数错误')
}
return request({
url: '/wms/transferOrderItem/batchConfirm',
method: 'post',
data: list
})
}
/**
* 取消调拨
*/

View File

@@ -2,26 +2,14 @@
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="调拨单号" prop="transferNo">
<el-input
v-model="queryParams.transferNo"
placeholder="请输入调拨单号"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.transferNo" placeholder="请输入调拨单号" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="调拨单名称" prop="transferName">
<el-input
v-model="queryParams.transferName"
placeholder="请输入调拨单名称,用于帮助记忆与沟通"
clearable
@keyup.enter.native="handleQuery"
/>
<el-input v-model="queryParams.transferName" placeholder="请输入调拨单名称,用于帮助记忆与沟通" clearable
@keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item label="调拨时间" prop="transferTime">
<el-date-picker clearable
v-model="queryParams.transferTime"
type="date"
value-format="yyyy-MM-dd"
<el-date-picker clearable v-model="queryParams.transferTime" type="date" value-format="yyyy-MM-dd"
placeholder="请选择实际调拨时间">
</el-date-picker>
</el-form-item>
@@ -45,42 +33,18 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button>
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single"
@click="handleUpdate">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button>
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple"
@click="handleDelete">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
@@ -96,7 +60,7 @@
</template>
</el-table-column>
<el-table-column label="调拨类型" align="center" prop="transferType" width="120"></el-table-column>
<el-table-column label="审批状态" align="center" prop="approveStatus" width="120">
<el-table-column label="审批状态" align="center" prop="approveStatus" width="120">
<template slot-scope="scope">
<el-tag :type="getapproveStatusType(scope.row.approveStatus)">
{{ getapproveStatusText(scope.row.approveStatus) }}
@@ -104,7 +68,7 @@
</template>
</el-table-column>
<el-table-column label="审批人" align="center" prop="approver" />
<el-table-column label="审批时间" align="center" prop="approveTime" width="180">
<template slot-scope="scope">
<span>{{ scope.row.approveTime ? parseTime(scope.row.approveTime, '{y}-{m}-{d} {h}:{i}') : '-' }}</span>
@@ -113,77 +77,27 @@
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleView(scope.row)"
>查看</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
:disabled="!canEdit(scope.row)"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
:disabled="!canDelete(scope.row)"
>删除</el-button>
<el-button
size="mini"
plain
type="text"
@click="handleSubmitapprove(scope.row)"
v-if="(scope.row.approveStatus || '0') == '0'"
icon="el-icon-check"
>提交</el-button>
<el-button
size="mini"
plain
type="text"
@click="handleWithdrawapprove(scope.row)"
v-if="scope.row.approveStatus == '1'"
icon="el-icon-refresh"
>撤回</el-button>
<el-button
size="mini"
type="text"
plain
@click="handleReSubmit(scope.row)"
v-if="scope.row.approveStatus == '3'"
icon="el-icon-refresh"
>二次调整</el-button>
<el-button
size="mini"
type="text"
v-hasPermi="['coil:move:approval']"
@click="handleResolve(scope.row)"
icon="el-icon-check"
v-if="scope.row.approveStatus == '1'"
>通过</el-button>
<el-button
size="mini"
type="text"
v-hasPermi="['coil:move:approval']"
@click="handleReject(scope.row)"
v-if="scope.row.approveStatus == '1'"
icon="el-icon-close"
>驳回</el-button>
<el-button size="mini" type="text" icon="el-icon-view" @click="handleView(scope.row)">查看</el-button>
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
:disabled="!canEdit(scope.row)">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
:disabled="!canDelete(scope.row)">删除</el-button>
<el-button size="mini" plain type="text" @click="handleSubmitapprove(scope.row)"
v-if="(scope.row.approveStatus || '0') == '0'" icon="el-icon-check">提交</el-button>
<el-button size="mini" plain type="text" @click="handleWithdrawapprove(scope.row)"
v-if="scope.row.approveStatus == '1'" icon="el-icon-refresh">撤回</el-button>
<el-button size="mini" type="text" plain @click="handleReSubmit(scope.row)"
v-if="scope.row.approveStatus == '3'" icon="el-icon-refresh">二次调整</el-button>
<el-button size="mini" type="text" v-hasPermi="['coil:move:approval']" @click="handleResolve(scope.row)"
icon="el-icon-check" v-if="scope.row.approveStatus == '1'">通过</el-button>
<el-button size="mini" type="text" v-hasPermi="['coil:move:approval']" @click="handleReject(scope.row)"
v-if="scope.row.approveStatus == '1'" icon="el-icon-close">驳回</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="getList" />
<!-- 添加或修改调拨单主对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -195,10 +109,7 @@
<el-input v-model="form.transferName" placeholder="请输入调拨单名称,用于帮助记忆与沟通" />
</el-form-item>
<el-form-item label="调拨时间" prop="transferTime">
<el-date-picker clearable
v-model="form.transferTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
<el-date-picker clearable v-model="form.transferTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择调拨时间">
</el-date-picker>
</el-form-item>
@@ -219,11 +130,14 @@
<el-dialog title="调拨单明细" v-loading="detailLoading" :visible.sync="detailOpen" fullscreen>
<div style="margin-bottom: 10px; display: flex; align-items: center;">
<el-button icon="el-icon-download" type="warning" plain @click="handleExportDetail">导出</el-button>
<el-button style="margin-right: 10px;" icon="el-icon-refresh" type="success" plain @click="handleRefreshDetailList">刷新</el-button>
<coil-selector v-loading="buttonLoading" ref="coilSelector" :filters="{ dataType: 1, status: 0 }" multiple @confirm="handleCoilChange" v-if="canAddCoils"></coil-selector>
<el-button style="margin-right: 10px;" icon="el-icon-refresh" type="success" plain
@click="handleRefreshDetailList">刷新</el-button>
<coil-selector v-loading="buttonLoading" ref="coilSelector" :filters="{ dataType: 1, status: 0 }" multiple
@confirm="handleCoilChange" v-if="canAddCoils"></coil-selector>
<el-checkbox v-model="batchEdit" style="margin-right: 10px;">批量操作</el-checkbox>
</div>
<transfer-item-table ref="transferItemTable" :data="transferOrderItems" :batchEdit="batchEdit" @refreshData="getDetailList" :orderStatus="currentOrderStatus" :canEdit="canAddCoils" />
<transfer-item-table ref="transferItemTable" :data="transferOrderItems" :batchEdit="batchEdit"
@refreshData="getDetailList" :orderStatus="currentOrderStatus" :canEdit="canAddCoils" />
</el-dialog>
</div>
</template>
@@ -317,20 +231,34 @@ export default {
});
},
handleResolve(row) {
approveTransferOrder(row.orderId, '2').then(response => {
updateTransferOrder({
...row,
approveStatus: '2',
}).then(_ => {
this.$modal.msgSuccess('审批成功');
this.getList();
}).finally(() => {
this.loading = false;
});
})
// approveTransferOrder(row.orderId, '2').then(response => {
// this.$modal.msgSuccess('审批成功');
// this.getList();
// }).finally(() => {
// this.loading = false;
// });
},
handleReject(row) {
approveTransferOrder(row.orderId, '3').then(response => {
this.$modal.msgSuccess('审批成功');
updateTransferOrder({
...row,
approveStatus: '3',
}).then(_ => {
this.$modal.msgSuccess('已驳回调拨单');
this.getList();
}).finally(() => {
this.loading = false;
});
})
// approveTransferOrder(row.orderId, '3').then(response => {
// this.$modal.msgSuccess('已驳回调拨单');
// this.getList();
// }).finally(() => {
// this.loading = false;
// });
},
/** 获取审批状态文本 */
getapproveStatusText(status) {
@@ -468,7 +396,7 @@ export default {
'coil_supplierCoilNo': '厂家卷号',
// 'coil_warehouseName': '逻辑库区',
'coil_netWeight': '净重',
// 'coil_itemName': '物品名称',
// 'coil_materialType': '物料类型',
'coil_qualityStatus': '质量状态',
@@ -484,7 +412,7 @@ export default {
// 准备导出数据
const exportData = this.transferOrderItems.map(item => {
const flatItem = {};
// 处理Before和After字段
exportFields.forEach(field => {
if (field.startsWith('coil_')) {
@@ -494,7 +422,7 @@ export default {
flatItem[field] = item[field] !== null && item[field] !== undefined ? item[field] : '';
}
});
return flatItem;
});
@@ -525,7 +453,7 @@ export default {
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
},
},
/** 钢卷选择器改变 */
handleCoilChange(coils) {
console.log(coils);
@@ -550,25 +478,25 @@ export default {
this.reset();
},
// 表单重置
reset() {
this.form = {
orderId: undefined,
transferNo: undefined,
transferName: undefined,
transferStatus: undefined,
transferTime: undefined,
remark: undefined,
delFlag: undefined,
createBy: undefined,
updateBy: undefined,
createTime: undefined,
updateTime: undefined,
approveStatus: '0',
approver: undefined,
approveTime: undefined
};
this.resetForm("form");
},
reset() {
this.form = {
orderId: undefined,
transferNo: undefined,
transferName: undefined,
transferStatus: undefined,
transferTime: undefined,
remark: undefined,
delFlag: undefined,
createBy: undefined,
updateBy: undefined,
createTime: undefined,
updateTime: undefined,
approveStatus: '0',
approver: undefined,
approveTime: undefined
};
this.resetForm("form");
},
getDetailList() {
this.handleView({ orderId: this.currentOrderId, approveStatus: this.currentOrderStatus });
},
@@ -601,7 +529,7 @@ export default {
// 多选框选中数据
handleSelectionChange(selection) {
this.ids = selection.map(item => item.orderId)
this.single = selection.length!==1
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
@@ -610,18 +538,18 @@ export default {
// 生成当前时间
const currentDate = new Date();
// 生成调拨单号TR + 年月日时分秒
const transferNo = 'TR' + currentDate.getFullYear() +
String(currentDate.getMonth() + 1).padStart(2, '0') +
String(currentDate.getDate()).padStart(2, '0') +
String(currentDate.getHours()).padStart(2, '0') +
String(currentDate.getMinutes()).padStart(2, '0') +
const transferNo = 'TR' + currentDate.getFullYear() +
String(currentDate.getMonth() + 1).padStart(2, '0') +
String(currentDate.getDate()).padStart(2, '0') +
String(currentDate.getHours()).padStart(2, '0') +
String(currentDate.getMinutes()).padStart(2, '0') +
String(currentDate.getSeconds()).padStart(2, '0');
// 生成调拨时间YYYY-MM-DD HH:mm:ss
const transferTime = currentDate.getFullYear() + '-' +
String(currentDate.getMonth() + 1).padStart(2, '0') + '-' +
String(currentDate.getDate()).padStart(2, '0') + ' ' +
String(currentDate.getHours()).padStart(2, '0') + ':' +
String(currentDate.getMinutes()).padStart(2, '0') + ':' +
const transferTime = currentDate.getFullYear() + '-' +
String(currentDate.getMonth() + 1).padStart(2, '0') + '-' +
String(currentDate.getDate()).padStart(2, '0') + ' ' +
String(currentDate.getHours()).padStart(2, '0') + ':' +
String(currentDate.getMinutes()).padStart(2, '0') + ':' +
String(currentDate.getSeconds()).padStart(2, '0');
// 填充表单
this.form.transferNo = transferNo;

View File

@@ -1,5 +1,6 @@
<template>
<el-table :data="tableData" style="width: 100%" border v-loading="confirmLoading">
<el-table :data="tableData" style="width: 100%" border v-loading="confirmLoading" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" v-if="canConfirm"></el-table-column>
<el-table-column prop="coilId" label="钢卷号">
<template slot-scope="scope">
<CoilNo :coil-no="scope.row.coil.enterCoilNo" :coil="scope.row.coil" />
@@ -15,7 +16,7 @@
{{ scope.row.materialTypeBefore == '1' ? '原料' : '产品' }}
</template>
</el-table-column>
<el-table-column prop="itemIdBefore" label="调拨前物料" width="260">
<el-table-column prop="itemIdBefore" label="调拨前物料" width="180">
<template slot-scope="scope">
<ProductInfo v-if="scope.row.materialTypeBefore == '2'" :product="scope.row.oBefore" />
<RawMaterialInfo v-else-if="scope.row.materialTypeBefore == '1'" :material="scope.row.oBefore" />
@@ -35,7 +36,7 @@
</div>
</template>
</el-table-column>
<el-table-column prop="itemIdAfter" v-loading="materialLoading" label="调拨后物料" width="260">
<el-table-column prop="itemIdAfter" v-loading="materialLoading" label="调拨后物料" width="180">
<template slot-scope="scope">
<div v-loading="materialLoading" v-if="!scope.row.isConfirmed && canEdit">
<RawMaterialSelect v-model="scope.row.itemIdAfter" v-if="scope.row.materialTypeAfter == '1'" />
@@ -60,7 +61,7 @@
</template>
</el-table-column>
<el-table-column prop="isTransferred" label="生效状态" width="200">
<el-table-column prop="isTransferred" label="生效状态" width="80">
<template slot-scope="scope">
<el-tag :type="scope.row.isTransferred == '1' ? 'success' : 'info'">
{{ scope.row.isTransferred == '1' ? '已生效' : '未生效' }}
@@ -84,13 +85,22 @@
</div>
</template>
</el-table-column>
<el-table-column type="action" label="操作" width="180" v-if="canConfirm" fixed="right">
<template slot-scope="scope">
<el-button icon="el-icon-check" size="mini" v-if="!scope.row.isTransferred" @click="handleConfirm(scope.row)"
:loading="buttonLoading">执行</el-button>
<el-button icon="el-icon-close" size="mini" v-if="!scope.row.isTransferred" @click="handleDelete(scope.row)"
:loading="buttonLoading">删除</el-button>
</template>
</el-table-column>
</el-table>
</template>
<script>
import {
matchOrCreateMaterial, confirmTransferOrderItem, cancelTransferOrderItem,
updateTransferOrderItem, matchOrCreateByCoils, batchUpdateTransferOrderItem
matchOrCreateMaterial, confirmTransferOrderItem, cancelTransferOrderItem, delTransferOrderItem,
updateTransferOrderItem, matchOrCreateByCoils, batchUpdateTransferOrderItem, batchConfirmTransferOrderItem
} from '@/api/wms/transferOrderItem'
import ProductSelect from "@/components/KLPService/ProductSelect";
import RawMaterialSelect from "@/components/KLPService/RawMaterialSelect";
@@ -116,7 +126,11 @@ export default {
batchEdit: {
type: Boolean,
default: false
}
},
canConfirm: {
type: Boolean,
default: false
},
},
components: {
// WarehouseSelect,
@@ -133,7 +147,7 @@ export default {
warehouseList: [],
buttonLoading: false,
confirmLoading: false,
// loading: false,
selectedItems: [],
}
},
mounted() {
@@ -189,7 +203,7 @@ export default {
}
},
immediate: true
}
},
},
methods: {
// 获取库区列表
@@ -234,6 +248,32 @@ export default {
this.buttonLoading = false
})
},
handleSelectionChange(val) {
this.selectedItems = val;
this.$emit('selectionChange', val);
},
// handleConfirmAll 批量确认调拨
handleBatchConfirm() {
const unconfirmedItems = this.selectedItems.filter(item => !item.isConfirmed && item.isTransferred != 1);
if (unconfirmedItems.length === 0) {
this.$message({ message: '没有可执行的调拨项', type: 'info' });
return;
}
this.buttonLoading = true;
batchConfirmTransferOrderItem(unconfirmedItems).then(res => {
if (res.code === 200) {
this.$message({
message: '确认调拨成功',
type: 'success'
})
// 刷新数据
this.$emit('refreshData')
}
}).finally(() => {
this.buttonLoading = false
})
},
handleConfirmAll() {
const unconfirmedItems = this.tableData.filter(item => !item.isConfirmed && !item.isTransferred);
if (unconfirmedItems.length === 0) {
@@ -263,6 +303,28 @@ export default {
this.confirmLoading = false;
});
},
// 删除未执行的调拨记录
handleDelete(row) {
this.$confirm('确认要删除该调拨操作吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.buttonLoading = true
delTransferOrderItem(row.orderItemId).then(res => {
if (res.code === 200) {
this.$message({
message: '删除调拨操作成功',
type: 'success'
})
// 刷新数据
this.$emit('refreshData')
}
}).finally(() => {
this.buttonLoading = false
})
})
},
// 取消调拨
handleCancel(item) {
this.$confirm('确认取消调拨吗?', '提示', {

View File

@@ -0,0 +1,201 @@
<template>
<div class="record-container">
<!-- 常规筛选区, 通过调拨前库区和调拨后库区查询 -->
<el-form :model="queryParams" inline>
<!-- <el-form-item label="入场卷号">
<el-input v-model="queryParams.enterCoilNo" placeholder="请输入入场卷号"></el-input>
</el-form-item>
<el-form-item label="当前卷号">
<el-input v-model="queryParams.currentCoilNo" placeholder="请输入当前卷号"></el-input>
</el-form-item> -->
<el-form-item label="调拨前库区">
<WarehouseSelect v-model="queryParams.warehouseIdBefore" placeholder="请选择调拨前库区">
</WarehouseSelect>
</el-form-item>
<el-form-item label="调拨后库区">
<WarehouseSelect v-model="queryParams.warehouseIdAfter" placeholder="请选择调拨后库区">
</WarehouseSelect>
</el-form-item>
<el-form-item label="调拨单号">
<el-select v-model="queryParams.transferNo" filterable remote clearable
remote-method="remoteSearchTransferOrder" :remote-loading="transferOrderLoading"
placeholder="请输入调拨单号搜索" @change="handleRegularSearch" style="width:220px">
<el-option v-for="item in transferOrderOptions" :key="item.orderId"
:label="item.transferNo" :value="item.transferNo" />
</el-select>
</el-form-item>
<el-form-item label="生效状态">
<el-select v-model="queryParams.isTransferred" @change="handleRegularSearch" clearable>
<el-option value="1" label="已生效"></el-option>
<el-option value="0" label="未生效"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" plain @click="handleRegularSearch">查询</el-button>
<el-button type="success" icon="el-icon-check" plain @click="handleConfirmBatch">批量执行</el-button>
</el-form-item>
</el-form>
<!-- 调拨表格, 显示调拨记录, 常规筛选作用下生效 -->
<TransferItemTable
:data="transferList" :canEdit="false" :canConfirm="true" v-loading="loading" ref="transferItemTable"
@refreshData="handleRegularSearch"></TransferItemTable>
<pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
@pagination="handleRegularSearch" />
<!-- 弹窗: 展示通过特殊筛选区查询到的钢卷和相关的调拨记录,分组展示 -->
<el-dialog title="钢卷调拨记录追溯" :visible.sync="dialogVisible" width="80%" v-loading="loading">
<div v-for="coil in tracedCoils" :key="coil.id" class="coil-group">
<h3>
<!-- 更全面的展示钢卷的信息, 例如dataType: 0表示历史卷,1表示当前卷. createTime, createBy, quantityStatus, actualLength, netWeight, coilNo, enterCoilNo, status: 0未发货,1已发货. -->
<current-coil-no :currentCoilNo="coil.currentCoilNo"></current-coil-no>
({{ coil.enterCoilNo }})
<span style="margin-left: 20px; font-size: 14px; font-weight: normal;">
{{ coil.dataType === 1 ? '当前卷' : '历史卷' }} |
{{ coil.status === 1 ? '已发货' : '未发货' }}
</span>
</h3>
<el-descriptions :column="4" border style="margin-bottom: 20px;">
<el-descriptions-item label="创建时间">{{ coil.createTime || '-' }}</el-descriptions-item>
<el-descriptions-item label="创建人">{{ coil.createBy || '-' }}</el-descriptions-item>
<el-descriptions-item label="质量状态">{{ coil.qualityStatus || '-' }}</el-descriptions-item>
<el-descriptions-item label="净重">{{ coil.netWeight || '-' }}</el-descriptions-item>
<el-descriptions-item label="物料名称">{{ coil.itemName || '-' }}</el-descriptions-item>
<el-descriptions-item label="规格">{{ coil.specification || '-' }}</el-descriptions-item>
<el-descriptions-item label="材质">{{ coil.material || '-' }}</el-descriptions-item>
<el-descriptions-item label="厂家">{{ coil.manufacturer || '-' }}</el-descriptions-item>
</el-descriptions>
<TransferItemTable :data="coil.transferRecords" :canEdit="false"></TransferItemTable>
</div>
</el-dialog>
</div>
</template>
<script>
import TransferItemTable from "@/views/wms/move/components/tranferItemTable.vue";
import WarehouseSelect from "@/components/KLPService/WarehouseSelect";
import { listTransferOrderItem } from "@/api/wms/transferOrderItem";
import { listTransferOrder } from "@/api/wms/transferOrder";
import { listMaterialCoil } from "@/api/wms/coil";
export default {
components: {
TransferItemTable,
WarehouseSelect,
},
data() {
return {
traceParams: {
currentCoilNo: '',
enterCoilNo: '',
},
queryParams: {
warehouseIdBefore: '',
warehouseIdAfter: '',
transferNo: '',
isTransferred: '0',
pageSize: 20,
pageNum: 1,
},
transferList: [],
tracedCoils: [],
warehouseList: [],
transferOrderOptions: [],
transferOrderLoading: false,
loading: false,
total: 0,
dialogVisible: false,
};
},
methods: {
async remoteSearchTransferOrder(query) {
this.transferOrderLoading = true
try {
const params = { pageSize: 50, pageNum: 1 }
if (query) params.transferNo = query
const res = await listTransferOrder(params)
this.transferOrderOptions = res.rows || []
} catch (_) {
this.transferOrderOptions = []
} finally {
this.transferOrderLoading = false
}
},
async handleTraceSearch() {
if (!this.traceParams.currentCoilNo && !this.traceParams.enterCoilNo) {
this.$message.warning('请输入当前卷号或入库卷号');
return;
}
this.loading = true;
this.dialogVisible = true;
try {
// 查询符合条件的钢卷
const coilRes = await listMaterialCoil(this.traceParams);
if (coilRes.rows && coilRes.rows.length > 0) {
// 遍历钢卷,查询每个钢卷的调拨记录
const tracedCoilsData = await Promise.all(
coilRes.rows.map(async (coil) => {
const transferRes = await listTransferOrderItem({ coilId: coil.coilId });
return {
...coil,
transferRecords: transferRes.rows || [],
};
})
);
this.tracedCoils = tracedCoilsData.filter(coil => coil.transferRecords.length > 0);
} else {
this.$message.info('未找到符合条件的钢卷');
}
} catch (error) {
this.$message.error('查询失败,请重试');
console.error(error);
} finally {
this.loading = false;
}
},
async handleRegularSearch() {
this.loading = true;
try {
const res = await listTransferOrderItem(this.queryParams);
this.transferList = res.rows || [];
this.total = res.total || 0;
} catch (error) {
this.$message.error('查询失败,请重试');
console.error(error);
} finally {
this.loading = false;
}
},
handleConfirmBatch() {
this.$refs.transferItemTable.handleBatchConfirm();
},
},
mounted() {
this.remoteSearchTransferOrder('')
this.handleRegularSearch();
},
};
</script>
<style scoped>
.record-container {
padding: 20px;
}
.special-filter-card,
.regular-filter-card {
margin-bottom: 20px;
}
.coil-group {
margin-bottom: 30px;
}
.coil-group h3 {
margin-bottom: 15px;
color: #333;
font-size: 16px;
font-weight: bold;
}
</style>

View File

@@ -23,8 +23,16 @@
<WarehouseSelect v-model="queryParams.warehouseIdAfter" placeholder="请选择调拨后库区">
</WarehouseSelect>
</el-form-item>
<el-form-item label="调拨单号">
<el-select v-model="queryParams.transferNo" filterable remote clearable
remote-method="remoteSearchTransferOrder" :remote-loading="transferOrderLoading"
placeholder="请输入调拨单号搜索" @change="handleRegularSearch" style="width:220px">
<el-option v-for="item in transferOrderOptions" :key="item.orderId"
:label="item.transferNo" :value="item.transferNo" />
</el-select>
</el-form-item>
<el-form-item label="生效状态">
<el-select v-model="queryParams.isTransferred" @change="handleRegularSearch">
<el-select v-model="queryParams.isTransferred" @change="handleRegularSearch" clearable>
<el-option value="1" label="已生效"></el-option>
<el-option value="0" label="未生效"></el-option>
</el-select>
@@ -71,6 +79,7 @@
import TransferItemTable from "@/views/wms/move/components/tranferItemTable.vue";
import WarehouseSelect from "@/components/KLPService/WarehouseSelect";
import { listTransferOrderItem } from "@/api/wms/transferOrderItem";
import { listTransferOrder } from "@/api/wms/transferOrder";
import { listMaterialCoil } from "@/api/wms/coil";
export default {
@@ -87,6 +96,7 @@ export default {
queryParams: {
warehouseIdBefore: '',
warehouseIdAfter: '',
transferNo: '',
isTransferred: '',
pageSize: 20,
pageNum: 1,
@@ -94,12 +104,27 @@ export default {
transferList: [],
tracedCoils: [],
warehouseList: [],
transferOrderOptions: [],
transferOrderLoading: false,
loading: false,
total: 0,
dialogVisible: false,
};
},
methods: {
async remoteSearchTransferOrder(query) {
this.transferOrderLoading = true
try {
const params = { pageSize: 50, pageNum: 1 }
if (query) params.transferNo = query
const res = await listTransferOrder(params)
this.transferOrderOptions = res.rows || []
} catch (_) {
this.transferOrderOptions = []
} finally {
this.transferOrderLoading = false
}
},
async handleTraceSearch() {
if (!this.traceParams.currentCoilNo && !this.traceParams.enterCoilNo) {
this.$message.warning('请输入当前卷号或入库卷号');
@@ -148,7 +173,7 @@ export default {
},
},
mounted() {
this.remoteSearchTransferOrder('')
this.handleRegularSearch();
},
};

View File

@@ -77,7 +77,7 @@ public class WmsTransferOrderServiceImpl implements IWmsTransferOrderService {
private LambdaQueryWrapper<WmsTransferOrder> buildQueryWrapper(WmsTransferOrderBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WmsTransferOrder> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getTransferNo()), WmsTransferOrder::getTransferNo, bo.getTransferNo());
lqw.like(StringUtils.isNotBlank(bo.getTransferNo()), WmsTransferOrder::getTransferNo, bo.getTransferNo());
lqw.like(StringUtils.isNotBlank(bo.getTransferName()), WmsTransferOrder::getTransferName, bo.getTransferName());
lqw.eq(bo.getTransferStatus() != null, WmsTransferOrder::getTransferStatus, bo.getTransferStatus());
lqw.eq(bo.getTransferTime() != null, WmsTransferOrder::getTransferTime, bo.getTransferTime());