Forráskód Böngészése

refactor(order-form): 优化订单表单提交逻辑,拆分更新和新增物料操作

yz 3 hete
szülő
commit
eb87ec194a

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

@@ -4,9 +4,9 @@
  */
 
 // API接口导入
-import { add, update, getDetail } from '@/api/order/order'
+import { add, update as updateOrderHeader, getDetail } from '@/api/order/order'
 import { getList as getOrderItemList } from '@/api/order/order-item'
-import { createSalesOrder, updateOrder } from '@/api/order/sales-order'
+import { createSalesOrder, updateOrder, addOrderItem } from '@/api/order/sales-order'
 import { getCustomerInfo } from '@/api/common/index'
 import { getList as getAddressList } from '@/api/order/address'
 import { submitOrderToU9 } from '@/api/order/sales-order'
@@ -996,9 +996,52 @@ export default {
      */
     async submitOrderData(submitData) {
       if (this.isEdit) {
-        // 编辑状态下使用updateOrder接口,包含物料明细数据
-        const salesOrderData = this.prepareSalesOrderUpdateData(submitData)
-        return await updateOrder(salesOrderData)
+        // 编辑状态下:先仅更新订单基础信息(不包含物料明细),再单独添加“导入”的物料
+        // 第一步:更新订单头
+        const headerData = this.prepareSubmitData()
+        const headerResponse = await updateOrderHeader(headerData)
+        const headerSuccess = headerResponse && headerResponse.data && headerResponse.data.success
+        if (!headerSuccess) {
+          throw new Error((headerResponse && headerResponse.data && headerResponse.data.msg) || '订单基础信息更新失败')
+        }
+
+        // 第二步:仅添加通过导入方式新增的物料(不含从订单获取的物料)
+        const importedMaterials = (this.materialDetails || []).filter(m => m.dataSource === MaterialDetailDataSource.IMPORTED)
+
+        if (importedMaterials.length > 0) {
+          const orderId = (this.formData && this.formData.id) || this.orderId
+          const orderCode = (this.formData && this.formData.orderCode) || ''
+
+          const payloads = importedMaterials.map(material => ({
+            orderId: orderId, // 保持字符串以避免大整数精度问题
+            orderCode,
+            itemId: Number(material.itemId) || 0,
+            itemCode: material.itemCode || '',
+            itemName: material.itemName || '',
+            specs: material.specs || '',
+            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: material.itemStatus || ORDER_ITEM_STATUS.UNCONFIRMED
+          }))
+
+          const results = await Promise.all(payloads.map(p => addOrderItem(p)))
+          const allOk = results.every(r => r && r.data && r.data.success)
+          if (!allOk) {
+            throw new Error('部分物料添加失败')
+          }
+        }
+
+        // 两步均成功,返回头部更新的响应
+        return headerResponse
       } else {
         // 新建状态下使用createSalesOrder接口,包含物料明细数据
         const salesOrderData = this.prepareSalesOrderData(submitData)

+ 62 - 3
src/components/order-form/types.d.ts

@@ -413,9 +413,7 @@ export interface OrderFormProps {
 /**
  * 组件数据接口
  */
-export interface OrderFormData {
-  /** 表单数据 */
-  formData: OrderFormModel;
+export interface OrderFormData extends OrderFormModel {
   /** 保存加载状态 */
   saveLoading: boolean;
   /** 订单类型选项 */
@@ -787,3 +785,64 @@ export interface MaterialDetailQueryParams {
   /** 每页大小(兼容旧字段) */
   size?: number;
 }
+
+/**
+ * 订单表单混入完整接口
+ * @description 订单表单混入组件的完整类型定义
+ */
+export interface OrderFormMixin extends OrderFormMixinData, OrderFormMixinComputed, OrderFormMixinMethods, OrderFormComponentProps {
+  /** Vue实例引用 */
+  $refs: {
+    [key: string]: any;
+  };
+  /** 事件发射器 */
+  $emit: (event: string, ...args: any[]) => void;
+  /** 消息提示 */
+  $message: {
+    success(message: string): void;
+    error(message: string): void;
+    warning(message: string): void;
+    info(message: string): void;
+  };
+  /** 下一个tick */
+  $nextTick(): Promise<void>;
+  /** Vue设置响应式属性 */
+  $set: (target: any, key: string | number, value: any) => any;
+}
+
+/**
+ * 订单表单混入组件类型
+ * @description 结合Vue实例和OrderFormMixin的完整类型
+ */
+export interface OrderFormMixinComponent extends OrderFormMixin, Vue {
+  // 继承Vue实例的所有属性和方法
+}
+
+/**
+ * 订单表单组件完整接口
+ * @description 订单表单组件的完整类型定义
+ */
+export interface OrderFormComponent extends OrderFormComponentData, OrderFormComponentComputed, OrderFormComponentMethods, OrderFormComponentProps {
+  /** Vue实例引用 */
+  $refs: {
+    orderForm?: any;
+    [key: string]: any;
+  };
+  /** 事件发射器 */
+  $emit: (event: string, ...args: any[]) => void;
+  /** 消息提示 */
+  $message: {
+    success(message: string): void;
+    error(message: string): void;
+    warning(message: string): void;
+    info(message: string): void;
+  };
+  /** 下一个tick */
+  $nextTick(): Promise<void>;
+  /** Vue设置响应式属性 */
+  $set: (target: any, key: string | number, value: any) => any;
+  /** 混入的方法和属性 */
+  $options: {
+    mixins: OrderFormMixin[];
+  };
+}