浏览代码

feat(订单表单): 新增客户信息自动填充功能

yz 2 天之前
父节点
当前提交
526be23d04

+ 13 - 1
src/components/order-form/form-option.js

@@ -46,6 +46,7 @@ export const orderFormOption = {
           type: 'input',
           span: 8,
           placeholder: '请输入组织编码',
+          display: false, // 隐藏组织编码字段
           rules: [{
             required: true,
             message: '请输入组织编码',
@@ -71,6 +72,7 @@ export const orderFormOption = {
           span: 8,
           slot: true,
           placeholder: '请选择客户',
+          display: false, // 隐藏客户选择字段
           rules: [{
             required: true,
             message: '请选择客户',
@@ -83,6 +85,7 @@ export const orderFormOption = {
           type: 'input',
           span: 8,
           placeholder: '请输入客户编码',
+          display: false, // 隐藏客户编码字段
           rules: [{
             required: true,
             message: '请输入客户编码',
@@ -326,7 +329,7 @@ function adjustFieldsForEditMode(option) {
 
 /**
  * 调整新增模式下的字段配置
- * @description 在新增模式下隐藏订单编码字段
+ * @description 在新增模式下隐藏订单编码字段,并禁用客户和组织相关字段
  * @param {AvueFormOption} option - 表单配置对象
  * @private
  */
@@ -338,5 +341,14 @@ function adjustFieldsForCreateMode(option) {
     if (orderCodeField) {
       orderCodeField.display = false
     }
+
+    // 新增模式下,禁用客户和组织相关字段(这些字段由getCustomerInfo接口自动填充)
+    const fieldsToDisable = ['orgCode', 'orgName', 'customerId', 'customerCode', 'customerName']
+    fieldsToDisable.forEach(fieldProp => {
+      const field = basicGroup?.column?.find(column => column.prop === fieldProp)
+      if (field) {
+        field.disabled = true
+      }
+    })
   }
 }

+ 105 - 1
src/components/order-form/order-form-mixin.js

@@ -7,6 +7,8 @@
 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 { getCustomerInfo } from '@/api/common/index'
+import { getList as getAddressList } from '@/api/order/address'
 
 // 常量和枚举导入
 import {
@@ -522,6 +524,11 @@ export default {
         // 重置保存状态
         this.saveLoading = false
 
+        // 在新增模式下,调用getCustomerInfo接口获取客户信息
+        if (!this.isEdit) {
+          await this.loadCustomerInfo()
+        }
+
         // 等待DOM更新后清除表单验证
         await this.$nextTick()
 
@@ -537,6 +544,103 @@ export default {
     },
 
     /**
+     * 加载客户信息
+     * @description 在新增模式下调用getCustomerInfo接口获取客户信息并填充表单
+     * @returns {Promise<void>}
+     * @throws {Error} 当API调用失败时抛出异常
+     * @private
+     * @this {import('./types').OrderFormMixinComponent}
+     */
+    async loadCustomerInfo() {
+      try {
+        this.formLoading = true
+
+        const response = await getCustomerInfo()
+
+        if (response?.data?.success && response.data.data) {
+          const customerData = response.data.data
+
+          // 填充客户相关字段到表单(根据实际API返回的字段名称)
+          this.$set(this.formData, 'orgId', customerData.ORG_ID)
+          this.$set(this.formData, 'orgCode', customerData.ORG_CODE || '')
+          this.$set(this.formData, 'orgName', customerData.ORG_NAME || '')
+          this.$set(this.formData, 'customerId', customerData.Customer_ID)
+          this.$set(this.formData, 'customerCode', customerData.Customer_CODE || '')
+          this.$set(this.formData, 'customerName', customerData.Customer_NAME || '')
+
+          // 根据Customer_CODE加载地址信息
+          if (customerData.Customer_CODE) {
+            await this.loadCustomerAddresses(customerData.Customer_CODE)
+          }
+        } else {
+          const errorMsg = response?.data?.msg || '获取客户信息失败'
+          console.warn('获取客户信息失败:', errorMsg)
+          this.$message.warning('获取客户信息失败,请手动填写相关信息')
+        }
+      } catch (error) {
+        console.error('加载客户信息API调用失败:', error)
+        this.$message.error('网络错误,获取客户信息失败')
+        throw error
+      } finally {
+        this.formLoading = false
+      }
+    },
+
+    /**
+     * 加载客户地址信息
+     * @description 根据客户ID获取地址列表,如果只有一个地址则直接选中,如果多个则选中默认地址
+     * @param {string} customerCode - 客户ID
+     * @returns {Promise<void>}
+     * @throws {Error} 当API调用失败时抛出异常
+     * @private
+     * @this {import('./types').OrderFormMixinComponent}
+     */
+    async loadCustomerAddresses(customerCode) {
+      try {
+        // 使用getList方法,传递分页参数和查询条件
+        const response = await getAddressList(1, 100, { customerCode })
+
+        if (response?.data?.success && response.data.data?.records) {
+          const addresses = response.data.data.records
+
+          if (addresses.length === 1) {
+            // 只有一个地址,直接选中
+            this.selectAddress(addresses[0])
+          } else if (addresses.length > 1) {
+            // 多个地址,选中默认地址
+            const defaultAddress = addresses.find(addr => addr.isDefault === 1)
+            if (defaultAddress) {
+              this.selectAddress(defaultAddress)
+            }
+          }
+        } else {
+          console.warn('获取客户地址失败:', response?.data?.msg || '未知错误')
+        }
+      } catch (error) {
+        console.error('加载客户地址API调用失败:', error)
+        // 地址加载失败不影响主流程,只记录错误
+      }
+    },
+
+    /**
+     * 选择地址
+     * @description 将选中的地址信息填充到表单中
+     * @param {import('@/api/types/address').CustomerAddressRecord} address - 地址对象
+     * @returns {void}
+     * @private
+     * @this {import('./types').OrderFormMixinComponent}
+     */
+    selectAddress(address) {
+      if (address && this.formData) {
+        this.$set(this.formData, 'addressId', address.id.toString())
+        this.$set(this.formData, 'receiverName', address.receiverName || '')
+        this.$set(this.formData, 'receiverPhone', address.receiverPhone || '')
+        this.$set(this.formData, 'receiverRegion', address.regionName || '')
+        this.$set(this.formData, 'receiverAddress', address.detailAddress || '')
+      }
+    },
+
+    /**
      * 加载订单详情数据
      * @description 根据订单ID从服务器获取订单详情并填充到表单中,同时并行加载物料明细数据以提高性能
      * @param {string|number} orderId - 订单唯一标识符
@@ -1042,7 +1146,7 @@ export default {
      */
     prepareMaterialItemData(material) {
       return {
-        orderId: this.formData.id,
+        orderId: this.formData.id ? parseInt(this.formData.id) : 0,
         orderCode: this.formData.orderCode || '',
         itemId: Number(material.itemId) || 0,
         itemCode: material.itemCode || '',

+ 6 - 0
src/components/order-form/types.d.ts

@@ -213,6 +213,12 @@ export interface OrderFormMixinMethods {
   loadOrderDetail(orderId: string | number): Promise<void>;
   /** 加载物料明细 */
   loadMaterialDetails(orderId: string | number): Promise<MaterialDetailRecord[]>;
+  /** 加载客户信息 */
+  loadCustomerInfo(): Promise<void>;
+  /** 加载客户地址列表 */
+  loadCustomerAddresses(customerCode: string): Promise<void>;
+  /** 选择地址 */
+  selectAddress(addresses: import('@/api/types/address').CustomerAddressRecord): void;
   /** 映射订单数据到表单 */
   mapOrderDataToForm(orderData: any): OrderFormModel;
   /** 处理返回 */