|
|
@@ -15,14 +15,14 @@
|
|
|
>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="出货编号" prop="lotserial">
|
|
|
- <el-input v-model="formData.lotserial" placeholder="请输入出货编号" />
|
|
|
+ <el-form-item label="出货编号" prop="lotSerial">
|
|
|
+ <el-input v-model="formData.lotSerial" placeholder="请输入出货编号" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="出货日期" prop="shippingdate">
|
|
|
+ <el-form-item label="出货日期" prop="shippingDate">
|
|
|
<el-date-picker
|
|
|
- v-model="formData.shippingdate"
|
|
|
+ v-model="formData.shippingDate"
|
|
|
type="date"
|
|
|
placeholder="请选择出货日期"
|
|
|
value-format="YYYY-MM-DD"
|
|
|
@@ -31,8 +31,8 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="出货地点" prop="shippingsite">
|
|
|
- <el-input v-model="formData.shippingsite" placeholder="请输入出货地点" />
|
|
|
+ <el-form-item label="出货地点" prop="shippingSite">
|
|
|
+ <el-input v-model="formData.shippingSite" placeholder="请输入出货地点" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
@@ -49,8 +49,8 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
<el-col :span="8">
|
|
|
- <el-form-item label="收货地址" prop="shippingaddress">
|
|
|
- <el-input v-model="formData.shippingaddress" placeholder="请输入收货地址" />
|
|
|
+ <el-form-item label="收货地址" prop="shippingAddress">
|
|
|
+ <el-input v-model="formData.shippingAddress" placeholder="请输入收货地址" />
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
@@ -83,56 +83,56 @@
|
|
|
</div>
|
|
|
|
|
|
<el-table :data="formData.items" border stripe max-height="400">
|
|
|
- <el-table-column prop="OrdNbr" label="客户订单号" width="150">
|
|
|
+ <el-table-column prop="ordNbr" label="客户订单号" width="150">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-if="mode !== 'view'" v-model="row.OrdNbr" />
|
|
|
- <span v-else>{{ row.OrdNbr }}</span>
|
|
|
+ <el-input v-if="mode !== 'view'" v-model="row.ordNbr" />
|
|
|
+ <span v-else>{{ row.ordNbr }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="bill_no" label="订单号" width="150">
|
|
|
+ <el-table-column prop="billNo" label="订单号" width="150">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-if="mode !== 'view'" v-model="row.bill_no" />
|
|
|
- <span v-else>{{ row.bill_no }}</span>
|
|
|
+ <el-input v-if="mode !== 'view'" v-model="row.billNo" />
|
|
|
+ <span v-else>{{ row.billNo }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="CustomNo" label="客户编码" width="120">
|
|
|
+ <el-table-column prop="customNo" label="客户编码" width="120">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-if="mode !== 'view'" v-model="row.CustomNo" />
|
|
|
- <span v-else>{{ row.CustomNo }}</span>
|
|
|
+ <el-input v-if="mode !== 'view'" v-model="row.customNo" />
|
|
|
+ <span v-else>{{ row.customNo }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="CustomName" label="客户名称" width="180">
|
|
|
+ <el-table-column prop="customName" label="客户名称" width="180">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-if="mode !== 'view'" v-model="row.CustomName" />
|
|
|
- <span v-else>{{ row.CustomName }}</span>
|
|
|
+ <el-input v-if="mode !== 'view'" v-model="row.customName" />
|
|
|
+ <span v-else>{{ row.customName }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="OrdDate" label="下单日期" width="150">
|
|
|
+ <el-table-column prop="ordDate" label="下单日期" width="150">
|
|
|
<template #default="{ row }">
|
|
|
<el-date-picker
|
|
|
v-if="mode !== 'view'"
|
|
|
- v-model="row.OrdDate"
|
|
|
+ v-model="row.ordDate"
|
|
|
type="date"
|
|
|
value-format="YYYY-MM-DD"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <span v-else>{{ row.OrdDate }}</span>
|
|
|
+ <span v-else>{{ row.ordDate }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="Country" label="国家" width="120">
|
|
|
+ <el-table-column prop="country" label="国家" width="120">
|
|
|
<template #default="{ row }">
|
|
|
- <el-select v-if="mode !== 'view'" v-model="row.Country" style="width: 100%">
|
|
|
+ <el-select v-if="mode !== 'view'" v-model="row.country" style="width: 100%">
|
|
|
<el-option label="中国" value="中国" />
|
|
|
<el-option label="英国" value="英国" />
|
|
|
</el-select>
|
|
|
- <span v-else>{{ row.Country }}</span>
|
|
|
+ <span v-else>{{ row.country }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="ItemNum" label="物料编号" width="150">
|
|
|
+ <el-table-column prop="itemNum" label="物料编号" width="150">
|
|
|
<template #default="{ row, $index }">
|
|
|
<el-input
|
|
|
v-if="mode !== 'view'"
|
|
|
- v-model="row.ItemNum"
|
|
|
+ v-model="row.itemNum"
|
|
|
placeholder="请选择"
|
|
|
readonly
|
|
|
@click="handleSelectMaterial($index)"
|
|
|
@@ -141,68 +141,68 @@
|
|
|
<el-button :icon="Search" @click="handleSelectMaterial($index)" />
|
|
|
</template>
|
|
|
</el-input>
|
|
|
- <span v-else>{{ row.ItemNum }}</span>
|
|
|
+ <span v-else>{{ row.itemNum }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="ItemName" label="物料名称" width="180">
|
|
|
+ <el-table-column prop="itemName" label="物料名称" width="180">
|
|
|
<template #default="{ row }">
|
|
|
- <span>{{ row.ItemName }}</span>
|
|
|
+ <span>{{ row.itemName }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="Specification" label="规格型号" width="150">
|
|
|
+ <el-table-column prop="specification" label="规格型号" width="150">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-if="mode !== 'view'" v-model="row.Specification" />
|
|
|
- <span v-else>{{ row.Specification }}</span>
|
|
|
+ <el-input v-if="mode !== 'view'" v-model="row.specification" />
|
|
|
+ <span v-else>{{ row.specification }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="Qty" label="订单数量" width="120">
|
|
|
+ <el-table-column prop="qty" label="订单数量" width="120">
|
|
|
<template #default="{ row }">
|
|
|
<el-input-number
|
|
|
v-if="mode !== 'view'"
|
|
|
- v-model="row.Qty"
|
|
|
+ v-model="row.qty"
|
|
|
:min="0"
|
|
|
:controls="false"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <span v-else>{{ row.Qty }}</span>
|
|
|
+ <span v-else>{{ row.qty }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="Weight" label="重量(KG)" width="120">
|
|
|
+ <el-table-column prop="weight" label="重量(KG)" width="120">
|
|
|
<template #default="{ row }">
|
|
|
<el-input-number
|
|
|
v-if="mode !== 'view'"
|
|
|
- v-model="row.Weight"
|
|
|
+ v-model="row.weight"
|
|
|
:min="0"
|
|
|
:precision="2"
|
|
|
:controls="false"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <span v-else>{{ row.Weight }}</span>
|
|
|
+ <span v-else>{{ row.weight }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="Volume" label="体积(M3)" width="120">
|
|
|
+ <el-table-column prop="volume" label="体积(M3)" width="120">
|
|
|
<template #default="{ row }">
|
|
|
<el-input-number
|
|
|
v-if="mode !== 'view'"
|
|
|
- v-model="row.Volume"
|
|
|
+ v-model="row.volume"
|
|
|
:min="0"
|
|
|
:precision="3"
|
|
|
:controls="false"
|
|
|
style="width: 100%"
|
|
|
/>
|
|
|
- <span v-else>{{ row.Volume }}</span>
|
|
|
+ <span v-else>{{ row.volume }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="Packaging" label="包装要求" width="150">
|
|
|
+ <el-table-column prop="packaging" label="包装要求" width="150">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-if="mode !== 'view'" v-model="row.Packaging" />
|
|
|
- <span v-else>{{ row.Packaging }}</span>
|
|
|
+ <el-input v-if="mode !== 'view'" v-model="row.packaging" />
|
|
|
+ <span v-else>{{ row.packaging }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column prop="Remark" label="备注" min-width="150">
|
|
|
+ <el-table-column prop="remark" label="备注" min-width="150">
|
|
|
<template #default="{ row }">
|
|
|
- <el-input v-if="mode !== 'view'" v-model="row.Remark" type="textarea" :rows="1" />
|
|
|
- <span v-else>{{ row.Remark }}</span>
|
|
|
+ <el-input v-if="mode !== 'view'" v-model="row.remark" type="textarea" :rows="1" />
|
|
|
+ <span v-else>{{ row.remark }}</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column v-if="mode !== 'view'" label="操作" width="100" fixed="right">
|
|
|
@@ -251,22 +251,25 @@ const formRef = ref(null)
|
|
|
const materialSelectorRef = ref(null)
|
|
|
|
|
|
const formData = reactive({
|
|
|
- lotserial: '',
|
|
|
- shippingdate: '',
|
|
|
- shippingsite: '',
|
|
|
+ lotSerial: '',
|
|
|
+ shippingDate: '',
|
|
|
+ shippingSite: '',
|
|
|
consignee: '',
|
|
|
telephone: '',
|
|
|
- shippingaddress: '',
|
|
|
+ shippingAddress: '',
|
|
|
remark: '',
|
|
|
items: []
|
|
|
})
|
|
|
|
|
|
const formRules = {
|
|
|
- lotserial: [{ required: true, message: '请输入出货编号', trigger: 'blur' }],
|
|
|
- shippingdate: [{ required: true, message: '请选择出货日期', trigger: 'change' }],
|
|
|
- shippingsite: [{ required: true, message: '请输入出货地点', trigger: 'blur' }],
|
|
|
+ lotSerial: [{ required: true, message: '请输入出货编号', trigger: 'blur' }],
|
|
|
+ shippingDate: [{ required: true, message: '请选择出货日期', trigger: 'change' }],
|
|
|
+ shippingSite: [{ required: true, message: '请输入出货地点', trigger: 'blur' }],
|
|
|
consignee: [{ required: true, message: '请输入收货人', trigger: 'blur' }],
|
|
|
- telephone: [{ required: true, message: '请输入联系方式', trigger: 'blur' }]
|
|
|
+ telephone: [
|
|
|
+ { required: true, message: '请输入联系方式', trigger: 'blur' },
|
|
|
+ { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
|
|
|
+ ]
|
|
|
}
|
|
|
|
|
|
const dialogTitle = computed(() => {
|
|
|
@@ -281,28 +284,63 @@ const dialogTitle = computed(() => {
|
|
|
const emit = defineEmits(['success'])
|
|
|
|
|
|
// 打开对话框
|
|
|
-const open = async (type, id) => {
|
|
|
+const open = async (type, dataOrId) => {
|
|
|
mode.value = type
|
|
|
- currentId.value = id
|
|
|
dialogVisible.value = true
|
|
|
|
|
|
- if (type === 'add') {
|
|
|
+ if (type === 'add' || type === 'create') {
|
|
|
resetForm()
|
|
|
- // 如果从订单交付页面传入了ids,则自动加载订单数据
|
|
|
- const ids = route.query.ids
|
|
|
- if (ids) {
|
|
|
- // TODO: 根据ids加载订单数据到items
|
|
|
+ // 设置默认出货日期为当前日期
|
|
|
+ formData.shippingDate = new Date().toISOString().substring(0, 10)
|
|
|
+ // 如果传入了订单数据数组,则自动填充到items
|
|
|
+ if (Array.isArray(dataOrId) && dataOrId.length > 0) {
|
|
|
+ loadOrderData(dataOrId)
|
|
|
}
|
|
|
- } else if (id) {
|
|
|
- await loadData(id)
|
|
|
+ } else if (dataOrId) {
|
|
|
+ currentId.value = dataOrId
|
|
|
+ await loadData(dataOrId)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 加载订单数据
|
|
|
+const loadOrderData = (orders) => {
|
|
|
+ try {
|
|
|
+ // 将订单数据转换为出货明细格式
|
|
|
+ formData.items = orders.map(order => ({
|
|
|
+ orderId: order.id, // 保存订单ID用于后续提交
|
|
|
+ seorderId: String(order.seorderId || ''), // 销售订单ID
|
|
|
+ sentryId: String(order.id || ''), // 订单行ID
|
|
|
+ ordNbr: order.customOrderBillNo || '', // 客户订单号
|
|
|
+ billNo: order.billNo || '', // 订单号
|
|
|
+ customNo: order.customNo || '', // 客户编码
|
|
|
+ customName: '', // 客户名称(需要从其他地方获取)
|
|
|
+ ordDate: order.createTime ? (typeof order.createTime === 'string' ? order.createTime.substring(0, 10) : new Date(order.createTime).toISOString().substring(0, 10)) : '', // 下单日期
|
|
|
+ country: '中国', // 默认中国
|
|
|
+ itemNum: order.itemNumber || '', // 物料编号
|
|
|
+ itemName: order.itemName || '', // 物料名称
|
|
|
+ specification: order.specification || '', // 规格型号
|
|
|
+ qty: order.qty || 0, // 订单数量
|
|
|
+ weight: 0, // 重量(需要用户填写)
|
|
|
+ volume: 0, // 体积(需要用户填写)
|
|
|
+ packaging: '', // 包装要求
|
|
|
+ remark: '' // 备注
|
|
|
+ }))
|
|
|
+
|
|
|
+ ElMessage.success('已加载 ' + orders.length + ' 个订单信息')
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.error('加载订单数据失败:' + (error.message || '未知错误'))
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 加载数据
|
|
|
const loadData = async (id) => {
|
|
|
try {
|
|
|
- const { data } = await getShippingPlanDetail(id)
|
|
|
- Object.assign(formData, data)
|
|
|
+ const response = await getShippingPlanDetail(id)
|
|
|
+ if (response && response.data) {
|
|
|
+ Object.assign(formData, response.data)
|
|
|
+ } else {
|
|
|
+ ElMessage.error('加载数据失败:返回数据为空')
|
|
|
+ }
|
|
|
} catch (error) {
|
|
|
ElMessage.error('加载数据失败:' + (error.message || '未知错误'))
|
|
|
}
|
|
|
@@ -312,12 +350,12 @@ const loadData = async (id) => {
|
|
|
const resetForm = () => {
|
|
|
formRef.value?.resetFields()
|
|
|
Object.assign(formData, {
|
|
|
- lotserial: '',
|
|
|
- shippingdate: '',
|
|
|
- shippingsite: '',
|
|
|
+ lotSerial: '',
|
|
|
+ shippingDate: '',
|
|
|
+ shippingSite: '',
|
|
|
consignee: '',
|
|
|
telephone: '',
|
|
|
- shippingaddress: '',
|
|
|
+ shippingAddress: '',
|
|
|
remark: '',
|
|
|
items: []
|
|
|
})
|
|
|
@@ -333,29 +371,29 @@ const handleSelectMaterial = (index) => {
|
|
|
const handleMaterialSelected = (material) => {
|
|
|
if (currentRowIndex.value !== null) {
|
|
|
const row = formData.items[currentRowIndex.value]
|
|
|
- row.ItemNum = material.ItemNum
|
|
|
- row.ItemName = material.Descr
|
|
|
- row.Specification = material.Descr1
|
|
|
+ row.itemNum = material.ItemNum
|
|
|
+ row.itemName = material.Descr
|
|
|
+ row.specification = material.Descr1
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// 添加行
|
|
|
const handleAddRow = () => {
|
|
|
formData.items.push({
|
|
|
- OrdNbr: '',
|
|
|
- bill_no: '',
|
|
|
- CustomNo: '',
|
|
|
- CustomName: '',
|
|
|
- OrdDate: '',
|
|
|
- Country: '中国',
|
|
|
- ItemNum: '',
|
|
|
- ItemName: '',
|
|
|
- Specification: '',
|
|
|
- Qty: 0,
|
|
|
- Weight: 0,
|
|
|
- Volume: 0,
|
|
|
- Packaging: '',
|
|
|
- Remark: ''
|
|
|
+ ordNbr: '',
|
|
|
+ billNo: '',
|
|
|
+ customNo: '',
|
|
|
+ customName: '',
|
|
|
+ ordDate: '',
|
|
|
+ country: '中国',
|
|
|
+ itemNum: '',
|
|
|
+ itemName: '',
|
|
|
+ specification: '',
|
|
|
+ qty: 0,
|
|
|
+ weight: 0,
|
|
|
+ volume: 0,
|
|
|
+ packaging: '',
|
|
|
+ remark: ''
|
|
|
})
|
|
|
}
|
|
|
|
|
|
@@ -376,11 +414,13 @@ const handleSubmit = async () => {
|
|
|
|
|
|
submitLoading.value = true
|
|
|
|
|
|
- if (mode.value === 'add') {
|
|
|
+ if (mode.value === 'add' || mode.value === 'create') {
|
|
|
await createShippingPlan(formData)
|
|
|
ElMessage.success('添加成功')
|
|
|
} else {
|
|
|
- await updateShippingPlan(currentId.value, formData)
|
|
|
+ // 编辑模式需要包含ID
|
|
|
+ const updateData = { ...formData, id: currentId.value }
|
|
|
+ await updateShippingPlan(updateData)
|
|
|
ElMessage.success('保存成功')
|
|
|
}
|
|
|
|