|
@@ -281,10 +281,10 @@ export default {
|
|
|
callback()
|
|
|
return
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 手机号码正则表达式:1开头,第二位为3-9,总共11位数字
|
|
|
const phoneRegex = /^1[3-9]\d{9}$/
|
|
|
-
|
|
|
+
|
|
|
if (!phoneRegex.test(value.trim())) {
|
|
|
callback(new Error('请输入正确的手机号码格式(1开头的11位数字)'))
|
|
|
} else {
|
|
@@ -399,12 +399,12 @@ export default {
|
|
|
try {
|
|
|
// 重置表单数据为初始状态
|
|
|
this.formData = this.createInitialFormData()
|
|
|
-
|
|
|
+
|
|
|
// 重置物料明细列表(如果存在)
|
|
|
if (Array.isArray(this.materialDetails)) {
|
|
|
this.materialDetails = []
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 重置保存状态
|
|
|
this.saveLoading = false
|
|
|
|
|
@@ -507,7 +507,7 @@ export default {
|
|
|
}
|
|
|
|
|
|
const materialDetails = response.data.data.records
|
|
|
-
|
|
|
+
|
|
|
// 确保返回的是数组类型
|
|
|
if (!Array.isArray(materialDetails)) {
|
|
|
console.warn('物料明细数据格式异常,返回空数组')
|
|
@@ -620,6 +620,7 @@ export default {
|
|
|
/**
|
|
|
* 处理表单保存操作
|
|
|
* @description 验证表单数据并提交到服务器,支持新增和编辑模式
|
|
|
+ * 编辑模式下先保存订单数据,再批量保存物料明细数据
|
|
|
* @returns {Promise<void>}
|
|
|
* @throws {Error} 当表单验证失败或API调用失败时抛出异常
|
|
|
* @public
|
|
@@ -645,6 +646,11 @@ export default {
|
|
|
// 调用相应的API
|
|
|
const response = await this.submitOrderData(submitData)
|
|
|
|
|
|
+ // 编辑模式下,保存订单数据后再批量保存物料明细
|
|
|
+ if (this.isEdit) {
|
|
|
+ await this.saveMaterialDetails()
|
|
|
+ }
|
|
|
+
|
|
|
// 显示成功提示
|
|
|
const successMessage = this.isEdit ? '订单更新成功' : '订单创建成功'
|
|
|
this.$message.success(successMessage)
|
|
@@ -817,6 +823,85 @@ export default {
|
|
|
},
|
|
|
|
|
|
/**
|
|
|
+ * 批量保存物料明细数据
|
|
|
+ * @description 编辑模式下,只保存通过导入获取的物料数据,使用新增接口
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ * @throws {Error} 当物料明细保存失败时抛出异常
|
|
|
+ * @private
|
|
|
+ */
|
|
|
+ async saveMaterialDetails() {
|
|
|
+ if (!this.materialDetails || this.materialDetails.length === 0) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 过滤出通过导入获取的物料数据
|
|
|
+ const importedMaterials = this.materialDetails.filter(material =>
|
|
|
+ material.dataSource === MaterialDetailDataSource.IMPORTED
|
|
|
+ )
|
|
|
+
|
|
|
+ if (importedMaterials.length === 0) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const { add: addOrderItem } = await import('@/api/order/order-item')
|
|
|
+ const savePromises = []
|
|
|
+ const failedItems = []
|
|
|
+
|
|
|
+ // 准备所有导入物料明细的保存请求
|
|
|
+ for (let i = 0; i < importedMaterials.length; i++) {
|
|
|
+ const material = importedMaterials[i]
|
|
|
+ const materialData = this.prepareMaterialItemData(material)
|
|
|
+
|
|
|
+ const savePromise = addOrderItem(materialData)
|
|
|
+ .catch(error => {
|
|
|
+ failedItems.push({ index: i + 1, itemCode: material.itemCode, error })
|
|
|
+ return null
|
|
|
+ })
|
|
|
+
|
|
|
+ savePromises.push(savePromise)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 等待所有保存操作完成
|
|
|
+ await Promise.all(savePromises)
|
|
|
+
|
|
|
+ // 检查是否有失败的项目
|
|
|
+ if (failedItems.length > 0) {
|
|
|
+ const errorMessage = `导入物料明细保存失败:${failedItems.map(item => `第${item.index}条(${item.itemCode})`).join('、')}`
|
|
|
+ throw new Error(errorMessage)
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 准备物料明细数据
|
|
|
+ * @description 将物料明细数据转换为API接口所需的格式,用于新增物料明细
|
|
|
+ * @param {MaterialDetailRecord} material - 物料明细数据
|
|
|
+ * @returns {SalesOrderItemCreateForm} 格式化后的物料明细数据
|
|
|
+ * @private
|
|
|
+ */
|
|
|
+ prepareMaterialItemData(material) {
|
|
|
+ return {
|
|
|
+ orderId: this.formData.id,
|
|
|
+ orderCode: this.formData.orderCode || '',
|
|
|
+ itemId: Number(material.itemId) || 0,
|
|
|
+ itemCode: material.itemCode || '',
|
|
|
+ itemName: material.itemName || '',
|
|
|
+ specs: material.specs || material.specification || '',
|
|
|
+ mainItemCategoryId: Number(material.mainItemCategoryId) || Number(material.mainCategoryId) || 0,
|
|
|
+ mainItemCategoryName: material.mainItemCategoryName || material.mainCategoryName || '',
|
|
|
+ warehouseId: Number(material.warehouseId) || 0,
|
|
|
+ warehouseName: material.warehouseName || '',
|
|
|
+ availableQuantity: Number(material.availableQuantity) || 0,
|
|
|
+ orderQuantity: Number(material.orderQuantity) || 0,
|
|
|
+ confirmQuantity: Number(material.confirmQuantity) || Number(material.orderQuantity) || 0,
|
|
|
+ unitPrice: Number(material.unitPrice) || 0,
|
|
|
+ taxRate: Number(material.taxRate) || 0,
|
|
|
+ taxAmount: Number(material.taxAmount) || 0,
|
|
|
+ totalAmount: Number(material.totalAmount) || 0,
|
|
|
+ itemStatus: Number(material.itemStatus) || Number(material.status) || 0
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
* 处理物料删除事件
|
|
|
* @description 从物料明细列表中删除指定的物料记录,仅允许删除可删除的物料
|
|
|
* @param {MaterialDeleteEventData} deleteData - 删除数据对象
|