delivery_dealer_validation_example.md 6.89 KB

出库单经销商验证示例

场景说明

本示例展示了出库单经销商验证功能的工作方式,包括成功场景和失败场景。

成功场景

场景1:经销商信息一致

输入数据:

  • 订单编号:ORDER001
  • 订单中的经销商编码:DEALER001
  • 出库单中的经销商编码:DEALER001

验证结果: ✅ 通过验证,继续执行出库单创建/修改流程

代码示例:

// 订单信息
OrderMain order = new OrderMain();
order.setOrderNo("ORDER001");
order.setDealerCode("DEALER001");

// 出库单请求
DeliveryAddReq addReq = new DeliveryAddReq();
addReq.setOrderNo("ORDER001");
addReq.setDealerCode("DEALER001");

// 验证通过,继续执行
deliveryMainService.addDelivery(addReq);

失败场景

场景2:经销商信息不一致

输入数据:

  • 订单编号:ORDER001
  • 订单中的经销商编码:DEALER001
  • 出库单中的经销商编码:DEALER002

验证结果: ❌ 验证失败,抛出 DealerMismatchException

异常信息:

出库单中的经销商编码[DEALER002]与关联订单[ORDER001]中的经销商编码[DEALER001]不一致

代码示例:

// 订单信息
OrderMain order = new OrderMain();
order.setOrderNo("ORDER001");
order.setDealerCode("DEALER001");

// 出库单请求(经销商编码不匹配)
DeliveryAddReq addReq = new DeliveryAddReq();
addReq.setOrderNo("ORDER001");
addReq.setDealerCode("DEALER002"); // 不匹配的经销商编码

// 验证失败,抛出异常
try {
    deliveryMainService.addDelivery(addReq);
} catch (DealerMismatchException e) {
    System.out.println("验证失败:" + e.getMessage());
    // 输出:验证失败:出库单中的经销商编码[DEALER002]与关联订单[ORDER001]中的经销商编码[DEALER001]不一致
}

场景3:关联订单不存在

输入数据:

  • 订单编号:ORDER999(不存在的订单)
  • 出库单中的经销商编码:DEALER001

验证结果: ❌ 验证失败,抛出 IllegalArgumentException

异常信息:

关联的订单不存在

代码示例:

// 出库单请求(关联不存在的订单)
DeliveryAddReq addReq = new DeliveryAddReq();
addReq.setOrderNo("ORDER999"); // 不存在的订单
addReq.setDealerCode("DEALER001");

// 验证失败,抛出异常
try {
    deliveryMainService.addDelivery(addReq);
} catch (IllegalArgumentException e) {
    System.out.println("验证失败:" + e.getMessage());
    // 输出:验证失败:关联的订单不存在
}

API调用示例

新增出库单

请求:

POST /api/delivery/add
Content-Type: application/json

{
    "deliveryNo": "DELIVERY001",
    "orderNo": "ORDER001",
    "dealerCode": "DEALER002",  // 与订单中的经销商不一致
    "dealerName": "测试经销商",
    "deliveryDate": "2024-01-15 10:00:00",
    "deliveryItems": [
        {
            "productCode": "PRODUCT001",
            "deliveryQty": 10,
            "deliveryAmount": 1000.00
        }
    ]
}

响应(失败):

HTTP/1.1 400 Bad Request
Content-Type: application/json

{
    "code": 400,
    "message": "出库单中的经销商编码[DEALER002]与关联订单[ORDER001]中的经销商编码[DEALER001]不一致",
    "timestamp": "2024-01-15T10:00:00"
}

修改出库单

请求:

PUT /api/delivery/update
Content-Type: application/json

{
    "deliveryId": 1,
    "deliveryNo": "DELIVERY001",
    "orderNo": "ORDER001",
    "dealerCode": "DEALER001",  // 与订单中的经销商一致
    "dealerName": "测试经销商",
    "deliveryDate": "2024-01-15 10:00:00",
    "deliveryItems": [
        {
            "productCode": "PRODUCT001",
            "deliveryQty": 10,
            "deliveryAmount": 1000.00
        }
    ]
}

响应(成功):

HTTP/1.1 200 OK
Content-Type: application/json

{
    "code": 200,
    "message": "出库单修改成功",
    "data": true
}

前端处理示例

JavaScript错误处理

// 新增出库单
async function addDelivery(deliveryData) {
    try {
        const response = await fetch('/api/delivery/add', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json'
            },
            body: JSON.stringify(deliveryData)
        });

        if (!response.ok) {
            const errorData = await response.json();
            throw new Error(errorData.message);
        }

        const result = await response.json();
        console.log('出库单创建成功', result);

    } catch (error) {
        if (error.message.includes('经销商编码') && error.message.includes('不一致')) {
            // 处理经销商不匹配错误
            alert('错误:出库单中的经销商与关联订单中的经销商不一致,请检查经销商信息');
        } else if (error.message.includes('关联的订单不存在')) {
            // 处理订单不存在错误
            alert('错误:关联的订单不存在,请检查订单编号');
        } else {
            // 处理其他错误
            alert('出库单创建失败:' + error.message);
        }
    }
}

最佳实践

1. 数据录入时验证

在用户录入出库单信息时,可以实时验证经销商信息:

// 当订单编号改变时,自动填充经销商信息
async function onOrderNoChange(orderNo) {
    if (orderNo) {
        try {
            const order = await getOrderByNo(orderNo);
            if (order) {
                // 自动填充经销商信息
                document.getElementById('dealerCode').value = order.dealerCode;
                document.getElementById('dealerName').value = order.dealerName;
            }
        } catch (error) {
            console.error('获取订单信息失败', error);
        }
    }
}

2. 表单验证

在提交前进行客户端验证:

function validateDeliveryForm() {
    const orderNo = document.getElementById('orderNo').value;
    const dealerCode = document.getElementById('dealerCode').value;

    if (orderNo && dealerCode) {
        // 可以调用API验证经销商一致性
        return validateDealerConsistency(orderNo, dealerCode);
    }

    return true;
}

3. 错误提示优化

提供更友好的错误提示:

function handleDealerValidationError(error) {
    const errorMessage = error.message;

    if (errorMessage.includes('经销商编码') && errorMessage.includes('不一致')) {
        return {
            type: 'warning',
            title: '经销商信息不匹配',
            message: '出库单中的经销商与关联订单中的经销商不一致,请确认经销商信息是否正确',
            action: '请检查并修正经销商编码'
        };
    }

    return {
        type: 'error',
        title: '验证失败',
        message: errorMessage
    };
}