Browse Source

add checkorder list

dev
赵明涛 5 days ago
parent
commit
ed60593829
  1. 63
      app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java
  2. 18
      app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java
  3. 17
      app/src/main/java/com/ouxuan/oxface/orderOX/model/OrderVerificationData.java
  4. 14
      app/src/main/res/layout/activity_order_selection.xml
  5. 7
      app/src/main/res/layout/item_order_selection.xml
  6. 148
      订单核销选择页面问题修复说明.md

63
app/src/main/java/com/ouxuan/oxface/orderOX/OrderSelectionActivity.java

@ -45,7 +45,7 @@ public class OrderSelectionActivity extends AppCompatActivity {
private int verificationType; private int verificationType;
private String faceBase64; private String faceBase64;
private Handler countdownHandler; private Handler countdownHandler;
private int countdown = 6;
private int countdown = 60;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -96,14 +96,54 @@ public class OrderSelectionActivity extends AppCompatActivity {
verificationType = intent.getIntExtra(EXTRA_VERIFICATION_TYPE, 2); verificationType = intent.getIntExtra(EXTRA_VERIFICATION_TYPE, 2);
faceBase64 = intent.getStringExtra(EXTRA_FACE_BASE64); faceBase64 = intent.getStringExtra(EXTRA_FACE_BASE64);
LogManager.logInfo(TAG, "接收到的订单数据JSON: " + orderDataJson);
if (orderDataJson != null) { if (orderDataJson != null) {
try { try {
// 解析JSON数据
// 解析JSON数据 - 支持多种格式
Gson gson = new Gson(); Gson gson = new Gson();
OrderVerificationData orderData = gson.fromJson(orderDataJson, OrderVerificationData.class);
List<OrderVerificationData.OrderItem> 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<List<OrderVerificationData.OrderItem>>(){}.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<List<OrderVerificationData.OrderItem>>(){}.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); adapter = new OrderSelectionAdapter(orderList);
@ -127,14 +167,23 @@ public class OrderSelectionActivity extends AppCompatActivity {
}); });
LogManager.logInfo(TAG, "成功加载" + orderList.size() + "个订单"); 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 { } else {
LogManager.logWarning(TAG, "订单数据为空");
LogManager.logWarning(TAG, "订单数据为空或解析失败");
showToast("未找到可核销的订单"); showToast("未找到可核销的订单");
} }
} catch (Exception e) { } catch (Exception e) {
LogManager.logError(TAG, "解析订单数据失败", e); LogManager.logError(TAG, "解析订单数据失败", e);
showToast("订单数据解析失败");
showToast("订单数据解析失败: " + e.getMessage());
} }
} else { } else {
LogManager.logError(TAG, "未接收到订单数据"); LogManager.logError(TAG, "未接收到订单数据");

18
app/src/main/java/com/ouxuan/oxface/orderOX/adapter/OrderSelectionAdapter.java

@ -64,14 +64,19 @@ public class OrderSelectionAdapter extends RecyclerView.Adapter<OrderSelectionAd
OrderVerificationData.OrderItem order = orderList.get(position); OrderVerificationData.OrderItem order = orderList.get(position);
// 设置订单信息 // 设置订单信息
holder.tvOrderTitle.setText("订单信息 (共" + order.getNumber() + "场次)");
holder.tvOrderNumber.setText("订单编号:" + order.getOrder_no());
int sessionCount = order.getNumber() > 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.tvBookingInfo.setText("预订信息:" + bookingInfo);
holder.tvProjectName.setText("预订项目:" + order.getProject());
holder.tvProjectName.setText("预订项目:" + projectName);
holder.tvUsageDate.setText("使用日期:" + order.getFormattedUsageDate()); holder.tvUsageDate.setText("使用日期:" + order.getFormattedUsageDate());
// 设置选中状态 // 设置选中状态
@ -97,6 +102,9 @@ public class OrderSelectionAdapter extends RecyclerView.Adapter<OrderSelectionAd
onOrderClickListener.onVerifyClick(order, position); onOrderClickListener.onVerifyClick(order, position);
} }
}); });
// 添加调试日志
android.util.Log.d("OrderSelectionAdapter", "绑定订单 " + position + ": " + orderNo + ", 项目: " + projectName);
} }
@Override @Override

17
app/src/main/java/com/ouxuan/oxface/orderOX/model/OrderVerificationData.java

@ -180,23 +180,23 @@ public class OrderVerificationData {
public String getFormattedTimeInfo() { public String getFormattedTimeInfo() {
if (start_time != null && end_time != null) { if (start_time != null && end_time != null) {
// 提取时间部分 (HH:mm) // 提取时间部分 (HH:mm)
String startTimeOnly = start_time.substring(11, 16);
String endTimeOnly = end_time.substring(11, 16);
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 startTimeOnly + "-" + endTimeOnly;
} }
return "";
return "时间未设置";
} }
/** /**
* 获取格式化的使用日期 * 获取格式化的使用日期
*/ */
public String getFormattedUsageDate() { public String getFormattedUsageDate() {
if (start_time != null) {
if (start_time != null && start_time.length() >= 10) {
String date = start_time.substring(0, 10); String date = start_time.substring(0, 10);
// 简单判断是否是今天这里可以根据实际需求优化 // 简单判断是否是今天这里可以根据实际需求优化
return date + " (今天)"; return date + " (今天)";
} }
return "";
return "日期未设置";
} }
/** /**
@ -208,6 +208,13 @@ public class OrderVerificationData {
} }
return ""; return "";
} }
/**
* 获取项目名称如果为空则返回默认名称
*/
public String getProjectName() {
return project != null && !project.isEmpty() ? project : "未知项目";
}
} }
// Getters and Setters for main class // Getters and Setters for main class

14
app/src/main/res/layout/activity_order_selection.xml

@ -10,11 +10,12 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" 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:background="@drawable/dialog_background"
android:orientation="vertical" android:orientation="vertical"
android:padding="0dp">
android:padding="0dp"
android:minHeight="500dp">
<!-- 顶部标题栏 --> <!-- 顶部标题栏 -->
<RelativeLayout <RelativeLayout
@ -104,9 +105,10 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="20dp" android:layout_marginTop="20dp"
android:layout_marginBottom="20dp" android:layout_marginBottom="20dp"
android:maxHeight="400dp"
android:paddingLeft="20dp"
android:paddingRight="20dp" />
android:maxHeight="500dp"
android:minHeight="200dp"
android:paddingLeft="15dp"
android:paddingRight="15dp" />
<!-- 底部操作按钮 --> <!-- 底部操作按钮 -->
<LinearLayout <LinearLayout

7
app/src/main/res/layout/item_order_selection.xml

@ -11,11 +11,11 @@
<!-- 左侧场次标识 --> <!-- 左侧场次标识 -->
<RelativeLayout <RelativeLayout
android:layout_width="120dp"
android:layout_width="100dp"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@drawable/gradient_button" android:background="@drawable/gradient_button"
android:gravity="center" android:gravity="center"
android:minHeight="120dp">
android:minHeight="140dp">
<TextView <TextView
android:id="@+id/tv_session_label" android:id="@+id/tv_session_label"
@ -44,7 +44,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical" android:orientation="vertical"
android:padding="15dp">
android:padding="20dp"
android:minHeight="140dp">
<!-- 订单信息标题 --> <!-- 订单信息标题 -->
<LinearLayout <LinearLayout

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

@ -0,0 +1,148 @@
# 订单核销选择页面问题修复说明
## 问题分析
### 🔍 **问题描述**
1. **弹框太小**: 原有的弹窗尺寸较小,显示内容有限
2. **没有显示订单数据**: 数据解析失败,JSON结构不匹配
### 📊 **日志分析**
从日志可以看出:
```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. 直接解析为订单数组
```java
// 支持多种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`
- **增强空值处理**: 防止字段为空时出现异常
- **默认值设置**: 为空字段提供合理的默认值
```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
<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`
- **空值安全处理**: 检查所有可能为空的字段
- **调试日志增强**: 添加详细的绑定日志
- **数据显示优化**: 确保即使部分字段为空也能正常显示
```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. **维护性**: 增加的空值检查使代码更安全,减少崩溃风险
通过这些修复,订单核销选择页面应该能够正常显示订单数据,并提供更好的用户体验。
Loading…
Cancel
Save