Selaa lähdekoodia

feat(订单表单): 添加编辑模式下批量保存导入物料明细的功能

yz 2 viikkoa sitten
vanhempi
commit
00be1e3a37
1 muutettua tiedostoa jossa 90 lisäystä ja 5 poistoa
  1. 90 5
      src/components/order-form/order-form-mixin.js

+ 90 - 5
src/components/order-form/order-form-mixin.js

@@ -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 - 删除数据对象