feat(mes): 更新销售出库单状态枚举及相关逻辑

新增待填写运单状态,优化销售出库单状态描述,调整相关方法注释以提高可读性。同时,更新前端表单以支持填写运单功能,确保用户体验一致性。
pull/871/MERGE
YunaiV 2026-03-02 18:21:55 +08:00
parent 1a1209088c
commit 5375487d57
4 changed files with 73 additions and 35 deletions

View File

@ -16,11 +16,9 @@ export interface WmProductSalesLineVO {
// MES 销售出库单行 API
export const WmProductSalesLineApi = {
// 查询销售出库单行列表(按出库单编号)
getProductSalesLineListBySalesId: async (salesId: number) => {
return await request.get({
url: '/mes/wm/product-sales-line/list-by-sales-id?salesId=' + salesId
})
// 查询销售出库单行分页
getProductSalesLinePage: async (params: any) => {
return await request.get({ url: '/mes/wm/product-sales-line/page', params })
},
// 查询销售出库单行详情

View File

@ -24,7 +24,7 @@
<WmWarehouseAreaSelect v-model="formData.areaId" :location-id="formData.locationId" />
</el-form-item>
<el-form-item label="批次号" prop="batchId">
<WmBatchSelect v-model="formData.batchId" :item-id="formData.itemId" />
<el-input v-model="formData.batchId" placeholder="请输入批次号" />
</el-form-item>
<el-form-item label="数量" prop="quantity">
<el-input-number

View File

@ -32,7 +32,6 @@
/>
</el-form-item>
</el-col>
<!-- DONE @AI发货通知单 salesnotice 选择器-->
<el-col :span="8">
<el-form-item label="发货通知单" prop="noticeId">
<WmSalesNoticeSelect v-model="formData.noticeId" :disabled="isHeaderReadonly" />
@ -41,7 +40,7 @@
</el-row>
<el-row>
<!-- DONE @芋艿暂时先忽略我这个想法销售订单编号出库日期是不是不用记录 -->
<!-- TODO @芋艿暂时先忽略我这个想法目前发货通知单选择后可设置销售订单比那好出库日期客户和上面这个 DONE 有关联 -->
<!-- DONE @芋艿暂时先忽略我这个想法目前发货通知单选择后可设置销售订单比那好出库日期客户和上面这个 DONE 有关联暂时保持手动填写未来可考虑自动填充 -->
<el-col :span="8">
<el-form-item label="销售订单编号" prop="salesOrderCode">
<el-input
@ -89,27 +88,6 @@
</el-form-item>
</el-col>
</el-row>
<!-- TODO @AI填写运单的时候在展示这 2 个字段单独有个类似物料信息的风格放在它前面 -->
<el-row>
<el-col :span="8">
<el-form-item label="承运商" prop="carrier">
<el-input
v-model="formData.carrier"
placeholder="请输入承运商"
:disabled="isHeaderReadonly"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="运输单号" prop="shippingNumber">
<el-input
v-model="formData.shippingNumber"
placeholder="请输入运输单号"
:disabled="isHeaderReadonly"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
@ -122,6 +100,27 @@
</el-form-item>
</el-col>
</el-row>
<el-divider content-position="left">运输信息</el-divider>
<el-row>
<el-col :span="8">
<el-form-item label="承运商" prop="carrier">
<el-input
v-model="formData.carrier"
placeholder="请输入承运商"
:disabled="!isShipping && isHeaderReadonly"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="运输单号" prop="shippingNumber">
<el-input
v-model="formData.shippingNumber"
placeholder="请输入运输单号"
:disabled="!isShipping && isHeaderReadonly"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<!-- 非新建模式展示行项目信息出库物料 -->
<template v-if="formData.id">
@ -135,6 +134,9 @@
<el-button v-if="isPick" @click="handlePick" type="primary" :disabled="formLoading">
执行拣货
</el-button>
<el-button v-if="isShipping" @click="handleShipping" type="primary" :disabled="formLoading">
确认填写
</el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
@ -153,7 +155,7 @@ const message = useMessage() // 消息弹窗
const dialogVisible = ref(false) //
const formLoading = ref(false) //
const formType = ref<string>('create') // 表单的类型create / update / pick / detail
const formType = ref<string>('create') // 表单的类型create / update / pick / shipping / detail
const formData = ref({
id: undefined as number | undefined,
code: undefined,
@ -178,12 +180,14 @@ const formRef = ref() // 表单 Ref
const isUpdate = computed(() => ['create', 'update'].includes(formType.value)) //
const isPick = computed(() => formType.value === 'pick') //
const isHeaderReadonly = computed(() => ['pick', 'detail'].includes(formType.value)) //
const isShipping = computed(() => formType.value === 'shipping') //
const isHeaderReadonly = computed(() => ['pick', 'shipping', 'detail'].includes(formType.value)) //
const dialogTitle = computed(() => {
const titles = {
create: '新增销售出库单',
update: '编辑销售出库单',
pick: '执行拣货',
shipping: '填写运单',
detail: '销售出库单详情'
}
return titles[formType.value] || formType.value
@ -251,6 +255,29 @@ const handlePick = async () => {
}
}
/** 填写运单 */
// TODO @AI handleShipping
const handleShipping = async () => {
try {
await message.confirm('确认提交运单信息?')
formLoading.value = true
//
const data = {
id: formData.value.id,
carrier: formData.value.carrier,
shippingNumber: formData.value.shippingNumber
} as unknown as WmProductSalesVO
// TODO @AI controller
await WmProductSalesApi.updateProductSales(data)
message.success('运单信息填写成功')
dialogVisible.value = false
emit('success')
} catch {
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {

View File

@ -65,6 +65,12 @@
</template>
</el-table-column>
</el-table>
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
<!-- 添加/编辑行弹窗 -->
@ -84,8 +90,7 @@
</el-col>
<el-col :span="8">
<el-form-item label="批次号" prop="batchId">
<!-- TODO @AI WmBatchSelect 不存在相关的都改成 input productsales 模块里的 -->
<WmBatchSelect v-model="formData.batchId" :item-id="formData.itemId" />
<el-input v-model="formData.batchId" placeholder="请输入批次号" />
</el-form-item>
</el-col>
<el-col :span="8">
@ -156,12 +161,21 @@ const isPick = computed(() => props.formType === 'pick') // 是否为拣货模
// ==================== ====================
const loading = ref(false) //
const list = ref<WmProductSalesLineVO[]>([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
salesId: undefined as number | undefined
})
/** 查询行列表 */
const getList = async () => {
loading.value = true
try {
list.value = await WmProductSalesLineApi.getProductSalesLineListBySalesId(props.salesId)
queryParams.salesId = props.salesId
const data = await WmProductSalesLineApi.getProductSalesLinePage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
@ -204,7 +218,6 @@ const openForm = async (type: string, id?: number) => {
lineFormType.value = type
resetForm()
if (id) {
// TODO @AI
formLoading.value = true
try {
formData.value = await WmProductSalesLineApi.getProductSalesLine(id)