feat(saledelivery): 完善销售出库单功能实现

This commit is contained in:
zxy 2026-05-18 11:12:48 +08:00
parent 1154f82d65
commit 454c7267aa

View File

@ -0,0 +1,269 @@
<template>
<Dialog :title="'销售出库单详情'" v-model="dialogVisible" width="1500px">
<el-form
:model="formData"
label-width="100px"
v-loading="formLoading"
>
<!-- 基础信息 -->
<el-card title="基础信息" class="mb-4">
<span>基础信息</span>
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="销售订单">
<el-input
v-model="formData.saleOrdNo"
readonly
class="cursor-not-allowed"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="单据日期">
<el-input v-model="formData.deliveryDate" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="单据状态">
<el-tag :type="formData.deliveryStatus === '1' ? 'info' : 'success'">
{{ formData.deliveryStatus === '1' ? '已创建' : '已确认' }}
</el-tag>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="交货方式">
<el-input
v-model="deliveryTypeText"
readonly
class="cursor-not-allowed"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="mt-4">
<el-col :span="8">
<el-form-item label="客户名称">
<el-input v-model="formData.custName" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="产品名称">
<el-input v-model="formData.materialName" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="规格型号">
<el-input v-model="formData.spec" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="mt-4">
<el-col :span="6">
<el-form-item label="出库单号">
<el-input v-model="formData.saleDeliveryNo" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="订单数量">
<el-input v-model="formData.ordQty" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="剩余数量">
<el-input v-model="formData.remaimQty" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发货数量">
<el-input v-model="formData.deliveriedQty" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
</el-row>
<el-row class="mt-4">
<el-col :span="24">
<el-form-item label="备注">
<el-input
v-model="formData.remark"
type="textarea"
readonly
:rows="3"
class="cursor-not-allowed"
/>
</el-form-item>
</el-col>
</el-row>
</el-card>
<!-- 收货信息 -->
<el-card title="收货信息" class="mb-4">
<span>收货信息</span>
<el-row :gutter="20">
<el-col :span="8">
<el-form-item label="联系人">
<el-input v-model="formData.contact" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系电话">
<el-input v-model="formData.conPhone" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="联系地址">
<el-input v-model="formData.conAddress" readonly class="cursor-not-allowed" />
</el-form-item>
</el-col>
</el-row>
</el-card>
<!-- 产品信息 -->
<el-card>
<template #header>
<span>产品信息</span>
</template>
<el-table :data="productList" show-summary border :summary-method="getSummary">
<el-table-column label="序号" type="index" width="60px" align="center" />
<el-table-column label="仓库" prop="warehouse" width="150px" align="center" />
<el-table-column label="库区" prop="warehouseArea" width="150px" align="center" />
<el-table-column label="批次号" prop="batchNo" width="150px" align="center" />
<el-table-column label="库存数量" prop="stockQty" width="150px" align="center" />
<el-table-column label="库存袋数" prop="stockBag" width="150px" align="center" />
<el-table-column label="单袋规格" prop="bagSpec" width="150px" align="center" />
<el-table-column label="发货袋数" prop="deliveriedBag" width="120px" align="center" />
<el-table-column label="发货数量" prop="deliveriedQty" width="120px" align="center" />
<el-table-column label="备注" prop="remark" width="120px" align="center" />
</el-table>
</el-card>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">关闭</el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import { ref, reactive, computed } from 'vue'
import * as SaleDeliveryApi from '@/api/biz/saledelivery'
const { t } = useI18n()
const message = useMessage()
const dialogVisible = ref(false)
const formLoading = ref(false)
const formData = reactive({
id: undefined,
saleDeliveryNo: undefined,
deliveryDate: undefined,
deliveryStatus: undefined,
deliveryType: undefined,
custId: undefined,
custName: undefined,
contact: undefined,
conPhone: undefined,
conAddress: undefined,
remark: undefined,
saleOrdId: undefined,
saleOrdNo: undefined,
deliveryEmpId: undefined,
deliveryEmpName: undefined,
materialId: undefined,
materialCode: undefined,
materialName: undefined,
spec: undefined,
unit: undefined,
ordQty: undefined,
remaimQty: undefined,
deliveriedQty: undefined,
})
const productList = ref<any[]>([])
const totalQty = computed(() => {
return productList.value.reduce((sum, item) => sum + (parseFloat(item.deliveriedQty) || 0), 0)
})
const deliveryTypeText = computed(() => {
return formData.deliveryType === '1' ? '发货' : (formData.deliveryType === '2' ? '自提' : '-')
})
const getSummary = (param: any) => {
const { columns, data } = param
const sums: any[] = []
//
if (!Array.isArray(data) || data.length === 0) {
columns.forEach((column: any, index: number) => {
sums[index] = index === 0 ? '合计' : ''
})
return sums
}
//
const totalDeliveriedBag = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedBag) || 0), 0)
//
const totalDeliveriedQty = data.reduce((sum: number, item: any) => sum + (parseInt(item.deliveriedQty) || 0), 0)
// 使
// 0-, 1-, 2-, 3-, 4-, 5-, 6-, 7-, 8-, 9-
columns.forEach((column: any, index: number) => {
if (index === 0) {
sums[index] = '合计'
} else if (index === 7) {
//
sums[index] = totalDeliveriedBag
} else if (index === 8) {
//
sums[index] = totalDeliveriedQty
} else {
sums[index] = ''
}
})
return sums
}
const open = async (id: number) => {
formLoading.value = true
dialogVisible.value = true
try {
const data = await SaleDeliveryApi.getSaleDelivery(id)
Object.assign(formData, data)
let itemsData = []
if (data.items && data.items.length > 0) {
itemsData = data.items
} else if (data.detailList && data.detailList.length > 0) {
itemsData = data.detailList
} else if (data.products && data.products.length > 0) {
itemsData = data.products
}
productList.value = itemsData.map((item: any) => ({
id: item.id,
storeHouseId: item.storeHouseId,
storeHouseCd: item.storeHouseCd || '',
storeAreaId: item.storeAreaId,
storeAreCd: item.storeAreCd || '',
warehouse: item.storeHouseName || '',
warehouseArea: item.storeAreaName || '',
batchNo: item.lotNo || '',
stockQty: item.stockQty || '',
stockBag: item.stockBag || '',
bagSpec: item.bagSpec || '',
deliveriedBag: item.deliveriedBagQty || item.deliveriedBag || '',
deliveriedQty: item.deliveriedQty || '',
remark: item.remark || '',
}))
} catch (error) {
message.error('获取详情失败')
} finally {
formLoading.value = false
}
}
defineExpose({
open,
})
</script>