refactor(wms/delivery/waybill): 替换订单编号手动输入为下拉选择组件

重构运单页面的订单编号选择模块,将原有的自动补全输入框+弹窗选择的方式改为远程搜索下拉选择器,移除冗余的订单选择对话框、绑定解绑切换相关逻辑,优化代码结构并统一订单数据处理流程
This commit is contained in:
2026-06-24 13:30:17 +08:00
parent 74f7866986
commit 7eda414846
2 changed files with 54 additions and 177 deletions

View File

@@ -151,19 +151,6 @@ export const constantRoutes = [
}
],
},
// {
// path: '/wms/seal',
// component: Layout,
// hidden: true,
// children: [
// {
// path: 'sealDetail/:bizId',
// component: () => import('@/views/wms/seal/sealDetail'),
// name: 'WmsSealDetail',
// meta: { title: '用印详情' }
// }
// ]
// }
]
// 动态路由,基于用户权限动态去加载
@@ -182,18 +169,6 @@ export const dynamicRoutes = [
}
]
},
{
path: '/ems/assisted/statistics',
component: Layout,
children: [
{
path: '',
component: () => import('@/views/ems/assisted/statistics.vue'),
name: 'AuxiliaryStatistics',
meta: { title: '公辅消耗统计', icon: 'chart' }
}
]
},
{
path: '/system/role-auth',
component: Layout,

View File

@@ -175,55 +175,30 @@
placeholder="请选择发货时间">
</el-date-picker>
</el-form-item>
<!-- 如果没有绑定订单这里是使用手机号字段来存储手填的订单编号 -->
<el-form-item label="订单编号" prop="principalPhone" v-if="!form.orderId">
<div style="display: flex; gap: 10px; align-items: center;">
<el-autocomplete
v-model="form.principalPhone"
:fetch-suggestions="queryOrderSuggestions"
placeholder="请输入订单编号"
style="flex: 1;"
value-key="orderCode"
@select="onOrderAutoSelect"
clearable
:highlight-first-item="true"
popper-class="order-autocomplete-popper"
<el-form-item label="订单编号" prop="orderId">
<el-select
v-model="form.orderId"
placeholder="请选择订单编号"
filterable
remote
:remote-method="remoteSearchOrders"
:loading="orderLoading"
clearable
style="width: 100%;"
@change="onOrderSelectChange"
>
<el-option
v-for="item in orderList"
:key="item.orderId"
:label="`${item.orderCode} - ${item.companyName}`"
:value="item.orderId"
>
<template slot-scope="{ item }">
<div class="order-suggestion-item">
<span class="suggestion-code">{{ item.orderCode }}</span>
<span class="suggestion-company">{{ item.companyName }}</span>
<span class="suggestion-salesman">{{ item.salesman }}</span>
</div>
</template>
</el-autocomplete>
<el-button type="primary" size="small" @click="bindOrder">绑定订单</el-button>
</div>
<span class="suggestion-code">{{ item.orderCode }}</span>
<span class="suggestion-company">{{ item.companyName }}</span>
<span class="suggestion-salesman">{{ item.salesman }}</span>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="订单编号" prop="principalPhone" v-else title="当前发货单已绑定订单">
<div style="display: flex; gap: 10px; align-items: center;">
<el-input v-model="form.orderCode" placeholder="请输入订单编号" readonly disabled style="flex: 1;" />
<el-button type="warning" size="small" @click="unbindOrder">解绑</el-button>
<el-button type="primary" size="small" @click="changeOrder">切换订单</el-button>
</div>
</el-form-item>
<!-- 订单选择对话框 -->
<el-dialog title="选择订单" :visible.sync="orderDialogVisible" width="800px" append-to-body>
<el-input @change="loadOrderList" v-model="orderQuery" placeholder="输入关键词搜索" style="margin-bottom: 10px;"
@input="handleOrderSearch" />
<el-table v-loading="orderLoading" :data="orderList" max-height="500px" style="width: 100%"
@row-click="handleOrderSelect">
<el-table-column prop="orderCode" label="订单编号" />
<el-table-column prop="companyName" label="客户公司" />
<el-table-column prop="salesman" label="销售员" />
<el-table-column prop="contractCode" label="合同号" />
<el-table-column prop="deliveryDate" label="交货日期" />
</el-table>
<div slot="footer" class="dialog-footer">
<el-button @click="orderDialogVisible = false">取消</el-button>
</div>
</el-dialog>
<el-form-item label="收货单位" prop="consigneeUnit">
<el-input v-model="form.consigneeUnit" placeholder="请输入收货单位" />
</el-form-item>
@@ -357,13 +332,7 @@ export default {
// 订单列表
orderList: [],
orderLoading: false,
// 订单选择对话框
orderDialogVisible: false,
// 订单搜索关键词
orderQuery: '',
orderId: '',
// 订单自动补全
orderSuggestLoading: false,
};
},
created() {
@@ -391,7 +360,7 @@ export default {
/** 加载订单列表 */
loadOrderList() {
this.orderLoading = true;
listOrder({ pageNum: 1, pageSize: 100, keyword: this.orderQuery }).then(response => {
listOrder({ pageNum: 1, pageSize: 100 }).then(response => {
this.orderList = response.rows || [];
this.orderLoading = false;
}).catch(error => {
@@ -638,78 +607,41 @@ export default {
planId: this.selectedPlan.planId
}, `deliveryPlan_${new Date().getTime()}.xlsx`)
},
/** 绑定订单 */
bindOrder() {
this.orderDialogVisible = true;
},
/** 解绑订单 */
unbindOrder() {
this.form.orderId = undefined;
this.form.orderCode = undefined;
this.form.consigneeUnit = undefined;
this.form.principal = undefined;
},
/** 切换订单 */
changeOrder() {
this.orderDialogVisible = true;
},
/** 订单搜索 */
handleOrderSearch() {
// 搜索逻辑已在computed中处理
},
/** 选择订单 */
handleOrderSelect(row) {
this.form.orderId = row.orderId;
this.form.orderCode = row.orderCode;
this.form.consigneeUnit = row.companyName;
this.form.principal = row.salesman;
this.orderDialogVisible = false;
},
/** 订单编号自动补全 */
queryOrderSuggestions(queryString, callback) {
if (!queryString || queryString.trim() === '') {
callback([]);
/** 订单下拉选择变更 */
onOrderSelectChange(orderId) {
if (!orderId) {
this.form.orderCode = undefined;
this.form.consigneeUnit = undefined;
this.form.principal = undefined;
return;
}
this.orderSuggestLoading = true;
listOrder({ pageNum: 1, pageSize: 10, keyword: queryString }).then(response => {
const suggestions = (response.rows || []).map(item => ({
...item,
value: item.orderCode
}));
this.orderSuggestLoading = false;
callback(suggestions);
}).catch(() => {
this.orderSuggestLoading = false;
callback([]);
});
},
/** 自动补全选择订单 */
onOrderAutoSelect(item) {
const existing = this.deliveryWaybillList.find(
d => d.orderId === item.orderId || d.orderCode === item.orderCode
);
if (existing) {
this.$confirm(
`订单"${item.orderCode}"已绑定在发货单"${existing.waybillName}"中,确定继续绑定?`,
'提示',
{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }
).then(() => {
this.doBindOrder(item);
}).catch(() => {
this.form.principalPhone = item.orderCode;
});
} else {
this.doBindOrder(item);
const order = this.orderList.find(o => o.orderId === orderId);
if (order) {
this.form.orderCode = order.orderCode;
this.form.consigneeUnit = order.companyName;
this.form.principal = order.salesman;
}
},
/** 执行订单绑定并填写信息 */
doBindOrder(item) {
this.form.orderId = item.orderId;
this.form.orderCode = item.orderCode;
this.form.consigneeUnit = item.companyName;
this.form.principal = item.salesman;
this.form.principalPhone = item.orderCode;
/** 远程搜索订单 */
remoteSearchOrders(query) {
if (query) {
this.orderLoading = true;
listOrder({ pageNum: 1, pageSize: 20, keyword: query }).then(response => {
this.orderList = response.rows || [];
this.orderLoading = false;
}).catch(() => {
this.orderLoading = false;
});
} else {
// 无查询词时加载默认列表
this.orderLoading = true;
listOrder({ pageNum: 1, pageSize: 100 }).then(response => {
this.orderList = response.rows || [];
this.orderLoading = false;
}).catch(() => {
this.orderLoading = false;
});
}
},
/** 打印发货单 */
handlePrint(row, printType) {
@@ -947,33 +879,3 @@ export default {
font-size: 12px;
}
</style>
<style>
.order-autocomplete-popper {
min-width: 380px !important;
}
.order-autocomplete-popper .order-suggestion-item {
display: flex;
align-items: center;
gap: 12px;
padding: 4px 0;
}
.order-autocomplete-popper .suggestion-code {
font-weight: 500;
color: #303133;
min-width: 120px;
}
.order-autocomplete-popper .suggestion-company {
color: #909399;
font-size: 12px;
flex: 1;
}
.order-autocomplete-popper .suggestion-salesman {
color: #409eff;
font-size: 12px;
}
</style>