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
5.1 KiB
订单核销选择页面问题修复说明
问题分析
🔍 问题描述
- 弹框太小: 原有的弹窗尺寸较小,显示内容有限
- 没有显示订单数据: 数据解析失败,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解析逻辑: 支持多种数据格式
- 三层解析策略:
- 尝试解析完整的
OrderVerificationData
结构 - 尝试解析包含
result
字段的对象 - 直接解析为订单数组
- 尝试解析完整的
// 支持多种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);
修复效果
✅ 预期改进
- 数据显示正常: 支持当前的JSON数据格式,能够正确解析和显示订单信息
- 弹窗尺寸合适: 增大的弹窗能够容纳更多内容,提供更好的用户体验
- 鲁棒性增强: 即使数据不完整也能正常显示,不会崩溃
- 调试信息完善: 详细的日志帮助排查问题
📊 支持的数据格式
现在支持以下三种JSON格式:
- 完整格式 (原设计):
{
"code": 0,
"data": {
"result": [...]
}
}
- 简化格式 (当前接口返回):
{
"result": [...]
}
- 数组格式:
[...]
🔍 调试建议
- 查看LogCat中的
OrderSelectionActivity
和OrderSelectionAdapter
标签 - 确认数据解析成功的日志: "成功解析直接的result结构"
- 检查订单绑定日志: "绑定订单 X: 订单号, 项目: 项目名"
注意事项
- 兼容性: 修改保持向后兼容,支持原有的完整JSON格式
- 性能: 三层解析策略可能略微影响性能,但提供了更好的容错性
- 维护性: 增加的空值检查使代码更安全,减少崩溃风险
通过这些修复,订单核销选择页面应该能够正常显示订单数据,并提供更好的用户体验。