Преглед изворни кода

refactor(订单表单): 重构表单验证和数据处理逻辑

yz пре 1 месец
родитељ
комит
bdf1952878

+ 78 - 16
src/components/order-form/order-form-mixin.js

@@ -1,12 +1,19 @@
 import { add, update, getDetail } from '@/api/order/order'
 import { getList as getOrderItemList } from '@/api/order/order-item'
+import { createSalesOrder } from '@/api/order/sales-order'
 import {
   ORDER_TYPES,
   ORDER_STATUS,
   ORDER_TYPE_OPTIONS,
   ORDER_STATUS_OPTIONS
 } from '@/constants/order'
-import { MaterialDetailDataSource } from './constants'
+
+// 导入本地常量定义
+import {
+  MaterialDetailDataSource
+} from './constants'
+
+// 导入数字格式化工具
 import {
   formatAmount,
   formatFloatNumber,
@@ -27,10 +34,11 @@ import {
  * @typedef {import('./constants').ApiResponse} ApiResponse
  * @typedef {import('./constants').PaginatedResponse} PaginatedResponse
  * @typedef {import('./constants').ValidationRule} ValidationRule
- * @typedef {import('./constants').OrderFormRules} OrderFormRules
- * @typedef {import('./constants').OrderFormData} OrderFormMixinData
- * @typedef {import('./constants').OrderTypeOption} OrderTypeOption
- * @typedef {import('./constants').OrderStatusOption} OrderStatusOption
+ * @typedef {import('./constants').OrderFormMixinData} OrderFormMixinData
+ * @typedef {import('@/api/types/order').SalesOrderCreateForm} SalesOrderCreateForm
+ * @typedef {import('@/api/types/order').SalesOrderItemCreateForm} SalesOrderItemCreateForm
+ * @typedef {import('@/constants/order').ORDER_TYPES} OrderTypeValue
+ * @typedef {import('@/constants/order').ORDER_STATUS} OrderStatusValue
  */
 
 /**
@@ -65,14 +73,14 @@ export default {
        * @description 订单类型下拉选择器的选项数据
        * @type {OrderTypeOption[]}
        */
-      orderTypeOptions: Object.freeze([...ORDER_TYPE_OPTIONS]),
+      orderTypeOptions: ORDER_TYPE_OPTIONS,
 
       /**
        * 订单状态选项列表
        * @description 订单状态下拉选择器的选项数据
        * @type {OrderStatusOption[]}
        */
-      orderStatusOptions: Object.freeze([...ORDER_STATUS_OPTIONS])
+      orderStatusOptions: ORDER_STATUS_OPTIONS
     }
   },
 
@@ -206,8 +214,18 @@ export default {
             trigger: 'blur'
           },
           {
-            pattern: /^1[3-9]\d{9}$/,
-            message: '请输入正确的手机号码',
+            validator: (rule, value, callback) => {
+              if (!value) {
+                callback()
+                return
+              }
+              const phoneRegex = /^1[3-9]\d{9}$/
+              if (!phoneRegex.test(value)) {
+                callback(new Error('请输入正确的手机号码'))
+              } else {
+                callback()
+              }
+            },
             trigger: 'blur'
           }
         ],
@@ -405,7 +423,7 @@ export default {
     /**
      * 映射订单数据到表单格式
      * @description 将API返回的订单数据安全地映射为表单数据格式,并格式化数字字段
-     * @param {OrderItem} orderData - 从API获取的原始订单数据
+     * @param {import('@/api/types/order').OrderRecord} orderData - 从API获取的原始订单数据
      * @returns {OrderFormModel} 格式化后的表单数据
      * @private
      */
@@ -504,16 +522,60 @@ export default {
 
     /**
      * 提交订单数据到服务器
-     * @description 根据编辑模式调用相应的API接口
-     * @param {OrderForm} submitData - 要提交的订单数据
-     * @returns {Promise<AxiosResponse<ApiResponse<boolean>>>} API响应结果
+     * @description 根据编辑模式调用相应的API接口,新建状态下使用createSalesOrder包含物料明细
+     * @param {OrderFormModel} submitData - 要提交的订单数据
+     * @returns {Promise<import('axios').AxiosResponse<ApiResponse<import('@/api/types/order').OrderRecord>>>} API响应结果
      * @private
      */
     async submitOrderData(submitData) {
       if (this.isEdit) {
         return await update(submitData)
       } else {
-        return await add(submitData)
+        // 新建状态下使用createSalesOrder接口,包含物料明细数据
+        const salesOrderData = this.prepareSalesOrderData(submitData)
+        return await createSalesOrder(salesOrderData)
+      }
+    },
+
+    /**
+     * 准备销售订单创建数据
+     * @description 将表单数据和物料明细数据组合为createSalesOrder接口所需的格式
+     * @param {OrderFormModel} formData - 表单数据
+     * @returns {SalesOrderCreateForm} 销售订单创建数据
+     * @private
+     */
+    prepareSalesOrderData(formData) {
+      // 转换物料明细数据为API所需格式
+      const pcBladeOrderItemList = this.materialDetails.map(material => ({
+        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
+      }))
+
+      // 组装销售订单数据
+      return {
+        ...formData,
+        orgId: Number(formData.orgId) || 0,
+        customerId: Number(formData.customerId) || 0,
+        orderType: Number(formData.orderType) || 0,
+        totalAmount: Number(formData.totalAmount) || 0,
+        totalQuantity: Number(formData.totalQuantity) || 0,
+        addressId: Number(formData.addressId) || 0,
+        status: Number(formData.status) || 0,
+        pcBladeOrderItemList
       }
     },
 
@@ -560,7 +622,7 @@ export default {
     /**
      * 准备提交数据
      * @description 复制表单数据并进行清理和格式化处理
-     * @returns {OrderForm} 准备好的提交数据
+     * @returns {OrderFormModel} 准备好的提交数据
      * @private
      */
     prepareSubmitData() {
@@ -574,7 +636,7 @@ export default {
      * 清理和格式化提交数据
      * @description 移除空值字段并确保数据类型正确,使用精确的数字验证和格式化
      * @param {OrderFormModel} data - 原始表单数据
-     * @returns {OrderForm} 清理后的数据对象
+     * @returns {OrderFormModel} 清理后的数据对象
      * @private
      */
     cleanAndFormatSubmitData(data) {

+ 15 - 1
src/mixins/order/orderFormMixin.js

@@ -138,7 +138,21 @@ export default {
         ],
         receiverPhone: [
           { required: true, message: '请输入收货人电话', trigger: 'blur' },
-          { pattern: /^1[3-9]\d{9}$/, message: '请输入正确的手机号码', trigger: 'blur' }
+          {
+            validator: (rule, value, callback) => {
+              if (!value) {
+                callback()
+                return
+              }
+              const phoneRegex = /^1[3-9]\d{9}$/
+              if (!phoneRegex.test(value)) {
+                callback(new Error('请输入正确的手机号码'))
+              } else {
+                callback()
+              }
+            },
+            trigger: 'blur'
+          }
         ],
         receiverAddress: [
           { required: true, message: '请输入收货地址详情', trigger: 'blur' }

+ 2 - 4
src/mixins/order/orderItemTableMixin.js

@@ -1,12 +1,11 @@
 /**
  * 订单明细表格混入
  * @fileoverview 提供订单明细表格组件的通用逻辑,包括数据加载、状态显示和数字格式化等功能
- * @author System
- * @since 1.0.0
  */
 
 import { getList } from '@/api/order/order-item'
 import { getOrderItemStatusLabel, getOrderItemStatusTagType } from '@/constants'
+import { formatFloatNumber } from '@/components/order-form/number-format-utils'
 
 /**
  * @typedef {import('@/api/order/order-item').OrderItemRecord} OrderItemRecord
@@ -137,8 +136,7 @@ export default {
      * @description 将数值格式化为指定小数位数的字符串,处理空值情况
      */
     numberFormat(value, precision = 2) {
-      if (value === null || value === undefined || value === '') return '0.00'
-      return parseFloat(value).toFixed(precision)
+      return formatFloatNumber(value)
     }
   }
 }