oxFaceAndroid
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

5.1 KiB

订单核销选择页面问题修复说明

问题分析

🔍 问题描述

  1. 弹框太小: 原有的弹窗尺寸较小,显示内容有限
  2. 没有显示订单数据: 数据解析失败,JSON结构不匹配

📊 日志分析

从日志可以看出:

{"result":[{"info":{"card_no":"250313397","rest_number":100.0,"status":0.0,"user_face_id":""},"order_no":"MC20250313171548535218","order_type":"3","v_code":["2503215744"]},{"info":{"card_no":"2509085314","rest_number":7.0,"status":0.0,"user_face_id":""},"order_no":"MC20250908145253448493","order_type":"3","v_code":["2509087910"]}]}

传递的数据只包含result数组,而不是完整的OrderVerificationData结构。

修复方案

🛠️ 1. 数据解析优化

修改文件: OrderSelectionActivity.java

  • 增强JSON解析逻辑: 支持多种数据格式
  • 三层解析策略:
    1. 尝试解析完整的OrderVerificationData结构
    2. 尝试解析包含result字段的对象
    3. 直接解析为订单数组
// 支持多种JSON格式的解析逻辑
try {
    OrderVerificationData orderData = gson.fromJson(orderDataJson, OrderVerificationData.class);
    if (orderData != null && orderData.getData() != null && orderData.getData().getResult() != null) {
        parsedOrderList = orderData.getData().getResult();
    }
} catch (Exception e) {
    // 如果完整结构解析失败,尝试直接result结构解析
    JsonObject jsonObject = gson.fromJson(orderDataJson, JsonObject.class);
    if (jsonObject.has("result")) {
        JsonArray resultArray = jsonObject.getAsJsonArray("result");
        Type listType = new TypeToken<List<OrderVerificationData.OrderItem>>(){}.getType();
        parsedOrderList = gson.fromJson(resultArray, listType);
    }
}

修改文件: OrderVerificationData.java

  • 增强空值处理: 防止字段为空时出现异常
  • 默认值设置: 为空字段提供合理的默认值
public String getFormattedTimeInfo() {
    if (start_time != null && end_time != null) {
        String startTimeOnly = start_time.length() > 16 ? start_time.substring(11, 16) : start_time;
        String endTimeOnly = end_time.length() > 16 ? end_time.substring(11, 16) : end_time;
        return startTimeOnly + "-" + endTimeOnly;
    }
    return "时间未设置";
}

public String getProjectName() {
    return project != null && !project.isEmpty() ? project : "未知项目";
}

📐 2. 界面尺寸优化

修改文件: activity_order_selection.xml

  • 增大弹窗宽度: 左右边距从40dp减少到20dp
  • 增加最小高度: 设置minHeight="500dp"
  • 优化列表高度: 最大高度增加到500dp,最小高度200dp
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:layout_marginLeft="20dp"
    android:layout_marginRight="20dp"
    android:minHeight="500dp">

修改文件: item_order_selection.xml

  • 增加列表项高度: 最小高度设置为140dp
  • 优化内边距: 增加到20dp提供更好的视觉空间
  • 调整左侧标识宽度: 从120dp减少到100dp,为内容留出更多空间

🎯 3. 适配器优化

修改文件: OrderSelectionAdapter.java

  • 空值安全处理: 检查所有可能为空的字段
  • 调试日志增强: 添加详细的绑定日志
  • 数据显示优化: 确保即使部分字段为空也能正常显示
// 安全的数据绑定
int sessionCount = order.getNumber() > 0 ? order.getNumber() : 1;
String orderNo = order.getOrder_no() != null ? order.getOrder_no() : "未知订单号";
String projectName = order.getProjectName();

// 调试日志
Log.d("OrderSelectionAdapter", "绑定订单 " + position + ": " + orderNo + ", 项目: " + projectName);

修复效果

预期改进

  1. 数据显示正常: 支持当前的JSON数据格式,能够正确解析和显示订单信息
  2. 弹窗尺寸合适: 增大的弹窗能够容纳更多内容,提供更好的用户体验
  3. 鲁棒性增强: 即使数据不完整也能正常显示,不会崩溃
  4. 调试信息完善: 详细的日志帮助排查问题

📊 支持的数据格式

现在支持以下三种JSON格式:

  1. 完整格式 (原设计):
{
  "code": 0,
  "data": {
    "result": [...]
  }
}
  1. 简化格式 (当前接口返回):
{
  "result": [...]
}
  1. 数组格式:
[...]

🔍 调试建议

  • 查看LogCat中的OrderSelectionActivityOrderSelectionAdapter标签
  • 确认数据解析成功的日志: "成功解析直接的result结构"
  • 检查订单绑定日志: "绑定订单 X: 订单号, 项目: 项目名"

注意事项

  1. 兼容性: 修改保持向后兼容,支持原有的完整JSON格式
  2. 性能: 三层解析策略可能略微影响性能,但提供了更好的容错性
  3. 维护性: 增加的空值检查使代码更安全,减少崩溃风险

通过这些修复,订单核销选择页面应该能够正常显示订单数据,并提供更好的用户体验。