diff --git a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java index 6cbde5a..2cb2a1e 100644 --- a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java @@ -45,7 +45,7 @@ public class OrderSelectionActivity extends AppCompatActivity { private int verificationType; private String faceBase64; private Handler countdownHandler; - private int countdown = 6; + private int countdown = 60; @Override protected void onCreate(Bundle savedInstanceState) { @@ -96,14 +96,54 @@ public class OrderSelectionActivity extends AppCompatActivity { verificationType = intent.getIntExtra(EXTRA_VERIFICATION_TYPE, 2); faceBase64 = intent.getStringExtra(EXTRA_FACE_BASE64); + LogManager.logInfo(TAG, "接收到的订单数据JSON: " + orderDataJson); + if (orderDataJson != null) { try { - // 解析JSON数据 + // 解析JSON数据 - 支持多种格式 Gson gson = new Gson(); - OrderVerificationData orderData = gson.fromJson(orderDataJson, OrderVerificationData.class); + List parsedOrderList = null; + + // 先尝试解析为完整的OrderVerificationData结构 + try { + OrderVerificationData orderData = gson.fromJson(orderDataJson, OrderVerificationData.class); + if (orderData != null && orderData.getData() != null && orderData.getData().getResult() != null) { + parsedOrderList = orderData.getData().getResult(); + LogManager.logInfo(TAG, "成功解析完整的OrderVerificationData结构"); + } + } catch (Exception e) { + LogManager.logInfo(TAG, "完整结构解析失败,尝试直接结构解析"); + } - if (orderData != null && orderData.getData() != null && orderData.getData().getResult() != null) { - orderList = orderData.getData().getResult(); + // 如果完整结构解析失败,尝试解析为直接的result数组或包含结果的对象 + if (parsedOrderList == null) { + try { + // 尝试解析为包含result字段的对象 + com.google.gson.JsonObject jsonObject = gson.fromJson(orderDataJson, com.google.gson.JsonObject.class); + if (jsonObject.has("result")) { + com.google.gson.JsonArray resultArray = jsonObject.getAsJsonArray("result"); + java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken>(){}.getType(); + parsedOrderList = gson.fromJson(resultArray, listType); + LogManager.logInfo(TAG, "成功解析直接的result结构"); + } + } catch (Exception e2) { + LogManager.logInfo(TAG, "直接result结构解析失败,尝试数组解析"); + } + } + + // 如果仍然失败,尝试直接解析为数组 + if (parsedOrderList == null) { + try { + java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken>(){}.getType(); + parsedOrderList = gson.fromJson(orderDataJson, listType); + LogManager.logInfo(TAG, "成功直接解析为数组结构"); + } catch (Exception e3) { + LogManager.logError(TAG, "所有解析方式都失败", e3); + } + } + + if (parsedOrderList != null && !parsedOrderList.isEmpty()) { + orderList = parsedOrderList; // 设置适配器 adapter = new OrderSelectionAdapter(orderList); @@ -127,14 +167,23 @@ public class OrderSelectionActivity extends AppCompatActivity { }); LogManager.logInfo(TAG, "成功加载" + orderList.size() + "个订单"); + + // 打印第一个订单的详细信息用于调试 + if (orderList.size() > 0) { + OrderVerificationData.OrderItem firstOrder = orderList.get(0); + LogManager.logInfo(TAG, "第一个订单信息: 订单号=" + firstOrder.getOrder_no() + + ", 项目=" + firstOrder.getProject() + + ", 类型=" + firstOrder.getOrder_type() + + ", 场次=" + firstOrder.getNumber()); + } } else { - LogManager.logWarning(TAG, "订单数据为空"); + LogManager.logWarning(TAG, "订单数据为空或解析失败"); showToast("未找到可核销的订单"); } } catch (Exception e) { LogManager.logError(TAG, "解析订单数据失败", e); - showToast("订单数据解析失败"); + showToast("订单数据解析失败: " + e.getMessage()); } } else { LogManager.logError(TAG, "未接收到订单数据"); diff --git a/app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java b/app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java index 1fa2977..5ec1f74 100644 --- a/app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java +++ b/app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java @@ -64,14 +64,19 @@ public class OrderSelectionAdapter extends RecyclerView.Adapter 0 ? order.getNumber() : 1; + holder.tvOrderTitle.setText("订单信息 (共" + sessionCount + "场次)"); - // 设置预订信息 - 这里需要根据实际数据结构调整 - String bookingInfo = order.getProject() + " " + order.getFormattedTimeInfo() + ";"; + String orderNo = order.getOrder_no() != null ? order.getOrder_no() : "未知订单号"; + holder.tvOrderNumber.setText("订单编号:" + orderNo); + + // 设置预订信息 + String projectName = order.getProjectName(); + String timeInfo = order.getFormattedTimeInfo(); + String bookingInfo = projectName + " " + timeInfo + ";"; holder.tvBookingInfo.setText("预订信息:" + bookingInfo); - holder.tvProjectName.setText("预订项目:" + order.getProject()); + holder.tvProjectName.setText("预订项目:" + projectName); holder.tvUsageDate.setText("使用日期:" + order.getFormattedUsageDate()); // 设置选中状态 @@ -97,6 +102,9 @@ public class OrderSelectionAdapter extends RecyclerView.Adapter 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 ""; + return "时间未设置"; } /** * 获取格式化的使用日期 */ public String getFormattedUsageDate() { - if (start_time != null) { + if (start_time != null && start_time.length() >= 10) { String date = start_time.substring(0, 10); // 简单判断是否是今天(这里可以根据实际需求优化) return date + " (今天)"; } - return ""; + return "日期未设置"; } /** @@ -208,6 +208,13 @@ public class OrderVerificationData { } return ""; } + + /** + * 获取项目名称,如果为空则返回默认名称 + */ + public String getProjectName() { + return project != null && !project.isEmpty() ? project : "未知项目"; + } } // Getters and Setters for main class diff --git a/app/src/main/res/layout/activity_order_selection.xml b/app/src/main/res/layout/activity_order_selection.xml index 7eec4df..e8fe7f4 100644 --- a/app/src/main/res/layout/activity_order_selection.xml +++ b/app/src/main/res/layout/activity_order_selection.xml @@ -10,11 +10,12 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" - android:layout_marginLeft="40dp" - android:layout_marginRight="40dp" + android:layout_marginLeft="20dp" + android:layout_marginRight="20dp" android:background="@drawable/dialog_background" android:orientation="vertical" - android:padding="0dp"> + android:padding="0dp" + android:minHeight="500dp"> + android:maxHeight="500dp" + android:minHeight="200dp" + android:paddingLeft="15dp" + android:paddingRight="15dp" /> + android:minHeight="140dp"> + android:padding="20dp" + android:minHeight="140dp"> >(){}.getType(); + parsedOrderList = gson.fromJson(resultArray, listType); + } +} +``` + +#### 修改文件: `OrderVerificationData.java` +- **增强空值处理**: 防止字段为空时出现异常 +- **默认值设置**: 为空字段提供合理的默认值 + +```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 + +```xml + +``` + +#### 修改文件: `item_order_selection.xml` +- **增加列表项高度**: 最小高度设置为140dp +- **优化内边距**: 增加到20dp提供更好的视觉空间 +- **调整左侧标识宽度**: 从120dp减少到100dp,为内容留出更多空间 + +### 🎯 **3. 适配器优化** + +#### 修改文件: `OrderSelectionAdapter.java` +- **空值安全处理**: 检查所有可能为空的字段 +- **调试日志增强**: 添加详细的绑定日志 +- **数据显示优化**: 确保即使部分字段为空也能正常显示 + +```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. **完整格式** (原设计): +```json +{ + "code": 0, + "data": { + "result": [...] + } +} +``` + +2. **简化格式** (当前接口返回): +```json +{ + "result": [...] +} +``` + +3. **数组格式**: +```json +[...] +``` + +### 🔍 **调试建议** +- 查看LogCat中的`OrderSelectionActivity`和`OrderSelectionAdapter`标签 +- 确认数据解析成功的日志: "成功解析直接的result结构" +- 检查订单绑定日志: "绑定订单 X: 订单号, 项目: 项目名" + +## 注意事项 + +1. **兼容性**: 修改保持向后兼容,支持原有的完整JSON格式 +2. **性能**: 三层解析策略可能略微影响性能,但提供了更好的容错性 +3. **维护性**: 增加的空值检查使代码更安全,减少崩溃风险 + +通过这些修复,订单核销选择页面应该能够正常显示订单数据,并提供更好的用户体验。 \ No newline at end of file