diff --git a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java index 974815d..86ff2be 100644 --- a/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java +++ b/app/src/main/java/com/ouxuan/oxface/orderOX/OrderVerificationResultActivity.java @@ -10,6 +10,8 @@ import android.view.Window; import android.view.WindowManager; import android.widget.Button; import android.widget.ImageButton; +import android.widget.ImageView; +import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; @@ -17,6 +19,18 @@ import androidx.appcompat.app.AppCompatActivity; import com.ouxuan.oxface.R; import com.ouxuan.oxface.utils.LogManager; +import com.ouxuan.oxface.data.LoginDataManager; +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.resource.bitmap.CircleCrop; +import com.bumptech.glide.request.RequestOptions; +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; /** * 订单核销结果Activity @@ -26,14 +40,26 @@ public class OrderVerificationResultActivity extends AppCompatActivity { private static final String TAG = "OrderVerificationResultActivity"; + // UI组件 private ImageButton btnClose; private Button btnConfirm; - private TextView tvTitle, tvOrderNo, tvVerificationCode, tvOrderType, tvCardNo, tvStatus; + private TextView tvTitle, tvStoreName, tvWelcomeMessage; + private ImageView ivUserAvatar, ivStoreIcon; + private TextView tvUserName; + private ScrollView scrollViewDetails; + private TextView tvOrderDetails; + + // 数据字段 private String orderNo, verificationCode, orderType, cardNo, status; - private int verificationType; // 1-验证码验证, 4-扫码器验证 + private String userName, userAvatar; + private int verificationType; // 1-验证码验证, 2-人脸验证, 3-扫码验证, 4-扫码器验证 + private JsonObject orderResultData; // 完整的订单结果数据 // 强制关闭广播接收器 private BroadcastReceiver forceCloseReceiver; + + // 登录数据管理器 + private LoginDataManager loginDataManager; @Override protected void onCreate(Bundle savedInstanceState) { @@ -53,7 +79,9 @@ public class OrderVerificationResultActivity extends AppCompatActivity { window.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); initViews(); + initLoginDataManager(); getIntentData(); + updateStoreInfo(); updateUI(); setupListeners(); @@ -73,11 +101,24 @@ public class OrderVerificationResultActivity extends AppCompatActivity { // 初始化文本视图 tvTitle = findViewById(R.id.tv_result_title); - tvOrderNo = findViewById(R.id.tv_order_no); - tvVerificationCode = findViewById(R.id.tv_verification_code); - tvOrderType = findViewById(R.id.tv_order_type); - tvCardNo = findViewById(R.id.tv_card_no); - tvStatus = findViewById(R.id.tv_status); + tvStoreName = findViewById(R.id.tv_store_name); + tvWelcomeMessage = findViewById(R.id.tv_welcome_message); + tvUserName = findViewById(R.id.tv_user_name); + tvOrderDetails = findViewById(R.id.tv_order_details); + + // 初始化图片视图 + ivUserAvatar = findViewById(R.id.iv_user_avatar); + ivStoreIcon = findViewById(R.id.iv_store_icon); + + // 初始化滚动视图 + scrollViewDetails = findViewById(R.id.scroll_view_details); + } + + /** + * 初始化登录数据管理器 + */ + private void initLoginDataManager() { + loginDataManager = LoginDataManager.getInstance(this); } private void getIntentData() { @@ -90,6 +131,19 @@ public class OrderVerificationResultActivity extends AppCompatActivity { orderType = String.valueOf(orderTypeInt); cardNo = intent.getStringExtra("card_no"); status = intent.getStringExtra("status"); + userName = intent.getStringExtra("user_name"); + userAvatar = intent.getStringExtra("user_avatar"); + + // 获取完整的订单结果数据(JSON字符串) + String orderResultJson = intent.getStringExtra("order_result_data"); + if (orderResultJson != null && !orderResultJson.isEmpty()) { + try { + orderResultData = JsonParser.parseString(orderResultJson).getAsJsonObject(); + LogManager.logInfo(TAG, "成功解析订单结果数据"); + } catch (Exception e) { + LogManager.logError(TAG, "解析订单结果数据失败", e); + } + } } // 设置默认值 @@ -98,25 +152,428 @@ public class OrderVerificationResultActivity extends AppCompatActivity { if (orderType == null) orderType = ""; if (cardNo == null) cardNo = ""; if (status == null) status = "核销成功"; + if (userName == null) userName = ""; + if (userAvatar == null) userAvatar = ""; + } + + /** + * 更新店铺信息(店铺名称和Logo) + */ + private void updateStoreInfo() { + try { + if (loginDataManager != null) { + String storeName = loginDataManager.getStoreName(); + String logoUrl = loginDataManager.getStoreLogo(); + + // 更新店铺名称和欢迎信息 + if (storeName != null && !storeName.isEmpty()) { + if (tvStoreName != null) { + tvStoreName.setText(storeName); + } + if (tvWelcomeMessage != null) { + tvWelcomeMessage.setText("您好,欢迎光临" + storeName + "!\n您的订单已验证成功!"); + } + LogManager.logInfo(TAG, "成功更新店铺名称: " + storeName); + } else { + if (tvStoreName != null) { + tvStoreName.setText("Test门店"); + } + if (tvWelcomeMessage != null) { + tvWelcomeMessage.setText("您好,欢迎光临Test门店!\n您的订单已验证成功!"); + } + LogManager.logWarning(TAG, "未获取到店铺名称,使用默认名称"); + } + + // 更新店铺 Logo + if (logoUrl != null && !logoUrl.isEmpty() && ivStoreIcon != null) { + LogManager.logInfo(TAG, "加载店铺 Logo: " + logoUrl); + + Glide.with(this) + .load(logoUrl) + .apply(RequestOptions.bitmapTransform(new CircleCrop())) + .placeholder(R.drawable.ic_warriors_logo) + .error(R.drawable.ic_warriors_logo) + .into(ivStoreIcon); + } else { + if (ivStoreIcon != null) { + ivStoreIcon.setImageResource(R.drawable.ic_warriors_logo); + } + } + } + } catch (Exception e) { + LogManager.logError(TAG, "更新店铺信息失败", e); + } } private void updateUI() { // 根据验证类型设置标题 - if (verificationType == 1) { - tvTitle.setText("验证码核销结果"); - } else if (verificationType == 4) { - tvTitle.setText("扫码器核销结果"); - } else { - tvTitle.setText("订单核销结果"); + if (tvTitle != null) { + switch (verificationType) { + case 1: + tvTitle.setText("验证码核销结果"); + break; + case 2: + tvTitle.setText("人脸验证结果"); + break; + case 3: + tvTitle.setText("扫码验证结果"); + break; + case 4: + tvTitle.setText("扫码器核销结果"); + break; + case 5: + tvTitle.setText("课程签到结果"); + break; + default: + tvTitle.setText("订单核销结果"); + break; + } } - // 更新UI内容 - tvOrderNo.setText(orderNo); - tvVerificationCode.setText(verificationCode); - tvOrderType.setText(orderType); - tvCardNo.setText(cardNo); - tvStatus.setText(status); + // 更新用户信息 + updateUserInfo(); + + // 更新订单详情 + updateOrderDetails(); + + // 播放成功提示音(保留注释) + // playSuccessAudio(); + + // 执行开门操作(保留注释) + // executeOpenDoor(); + } + + /** + * 更新用户信息(头像和昵称) + */ + private void updateUserInfo() { + try { + // 更新用户昵称 + if (tvUserName != null) { + if (userName != null && !userName.isEmpty()) { + tvUserName.setText(userName); + } else { + tvUserName.setText("用户"); // 默认昵称 + } + } + + // 更新用户头像 + if (ivUserAvatar != null) { + if (userAvatar != null && !userAvatar.isEmpty()) { + Glide.with(this) + .load(userAvatar) + .apply(RequestOptions.bitmapTransform(new CircleCrop())) + .placeholder(R.drawable.ic_default_avatar) + .error(R.drawable.ic_default_avatar) + .into(ivUserAvatar); + } else { + ivUserAvatar.setImageResource(R.drawable.ic_default_avatar); + } + } + } catch (Exception e) { + LogManager.logError(TAG, "更新用户信息失败", e); + } + } + + /** + * 更新订单详情显示 + */ + private void updateOrderDetails() { + try { + if (tvOrderDetails == null) { + return; + } + + StringBuilder details = new StringBuilder(); + + if (orderResultData != null) { + // 根据订单类型显示不同内容 + int orderTypeInt = getOrderTypeFromData(); + String projectName = getStringFromData("project", "订单项目"); + + // 订单类型标签 + String typeLabel = getOrderTypeLabel(orderTypeInt); + details.append(typeLabel).append(" ").append(projectName).append("\n\n"); + + switch (orderTypeInt) { + case 0: // 场次核销 + appendFieldDetails(details); + break; + case 1: // 人次核销 + appendPersonTimesDetails(details); + break; + case 3: // 年月卡 + appendMembershipCardDetails(details); + break; + case 5: // 课程 + appendCourseDetails(details); + break; + default: + appendBasicDetails(details); + break; + } + } else { + // 基本信息显示 + appendBasicDetails(details); + } + + // 添加提示信息 + details.append("\n").append(getOrderTipMessage()); + + tvOrderDetails.setText(details.toString()); + + } catch (Exception e) { + LogManager.logError(TAG, "更新订单详情失败", e); + if (tvOrderDetails != null) { + tvOrderDetails.setText("订单信息加载失败"); + } + } + } + + /** + * 获取订单类型标签 + */ + private String getOrderTypeLabel(int orderType) { + switch (orderType) { + case 0: + return "场次"; + case 1: + return "人次"; + case 3: + return "年月卡"; + case 5: + return "课程"; + default: + return "订单"; + } + } + + /** + * 从数据中获取订单类型 + */ + private int getOrderTypeFromData() { + if (orderResultData != null && orderResultData.has("order_type")) { + return orderResultData.get("order_type").getAsInt(); + } + return Integer.parseInt(orderType != null && !orderType.isEmpty() ? orderType : "0"); + } + + /** + * 从数据中获取字符串值 + */ + private String getStringFromData(String key, String defaultValue) { + if (orderResultData != null && orderResultData.has(key)) { + JsonElement element = orderResultData.get(key); + if (!element.isJsonNull()) { + return element.getAsString(); + } + } + return defaultValue; + } + + /** + * 场次详情 + */ + private void appendFieldDetails(StringBuilder details) { + try { + if (orderResultData != null && orderResultData.has("info")) { + JsonElement infoElement = orderResultData.get("info"); + if (infoElement.isJsonArray()) { + for (JsonElement item : infoElement.getAsJsonArray()) { + if (item.isJsonObject()) { + JsonObject venue = item.getAsJsonObject(); + String venueName = venue.has("venue_name") ? venue.get("venue_name").getAsString() : "-"; + String startTime = venue.has("start") ? venue.get("start").getAsString() : "-"; + details.append(venueName).append(" ").append(startTime).append("\n"); + } + } + } + } + details.append("订单编号:").append(orderNo).append("\n"); + } catch (Exception e) { + LogManager.logError(TAG, "显示场次详情失败", e); + } + } + + /** + * 人次详情 + */ + private void appendPersonTimesDetails(StringBuilder details) { + details.append("验证码:").append(formatVerificationCode(verificationCode, 1)).append("\n"); + details.append("订单编号:").append(orderNo).append("\n"); + + if (orderResultData != null && orderResultData.has("pv_usage_duration")) { + int duration = orderResultData.get("pv_usage_duration").getAsInt(); + String expireTime = getExpireTime(duration); + details.append("有效时间:").append(expireTime).append("到期\n"); + } + + String info = getStringFromData("info", ""); + if (!info.isEmpty()) { + details.append("预订信息:").append(info).append("\n"); + } + } + + /** + * 年月卡详情 + */ + private void appendMembershipCardDetails(StringBuilder details) { + details.append("验证码:").append(formatVerificationCode(verificationCode, 3)).append("\n"); + details.append("名称:").append(getStringFromData("project", "")).append("\n"); + details.append("卡号:NO.").append(cardNo).append("\n"); + + if (orderResultData != null && orderResultData.has("info")) { + JsonObject info = orderResultData.getAsJsonObject("info"); + if (info.has("verify_desc")) { + details.append("核销方式:").append(info.get("verify_desc").getAsString()).append("\n"); + } + if (info.has("verify_time")) { + details.append("核销时间:").append(info.get("verify_time").getAsString()).append("\n"); + } + } + } + + /** + * 课程详情 + */ + private void appendCourseDetails(StringBuilder details) { + if (orderResultData != null && orderResultData.has("info")) { + JsonObject info = orderResultData.getAsJsonObject("info"); + if (info.has("time")) { + details.append("上课时间:").append(info.get("time").getAsString()).append("\n"); + } + if (info.has("coach")) { + details.append("上课教练:").append(info.get("coach").getAsString()).append("\n"); + } + if (info.has("addr")) { + details.append("上课地点:").append(info.get("addr").getAsString()).append("\n"); + } + } + + details.append("课程名称:").append(getStringFromData("project", "")).append("\n"); + details.append("订单编号:").append(orderNo).append("\n"); + + if (orderResultData != null && orderResultData.has("info")) { + JsonObject info = orderResultData.getAsJsonObject("info"); + if (info.has("verify_desc")) { + details.append("签到方式:").append(info.get("verify_desc").getAsString()).append("\n"); + } + if (info.has("verify_time")) { + details.append("签到时间:").append(info.get("verify_time").getAsString()).append("\n"); + } + } + } + + /** + * 基本详情 + */ + private void appendBasicDetails(StringBuilder details) { + details.append("订单编号:").append(orderNo).append("\n"); + if (!verificationCode.isEmpty()) { + details.append("验证码:").append(verificationCode).append("\n"); + } + if (!cardNo.isEmpty()) { + details.append("卡号:").append(cardNo).append("\n"); + } + details.append("状态:").append(status).append("\n"); + } + + /** + * 格式化验证码显示 + */ + private String formatVerificationCode(String code, int type) { + if (code == null || code.isEmpty()) { + return "-"; + } + + try { + if (type == 1) { // 人次类型,每4位分隔 + return code.replaceAll("(\\d)(?=(?:\\d{4})+$)", "$1 "); + } else if (type == 3) { // 年月卡类型,每5位分隔 + return code.replaceAll("(\\d)(?=(?:\\d{5})+$)", "$1 "); + } + } catch (Exception e) { + LogManager.logError(TAG, "格式化验证码失败", e); + } + + return code; + } + + /** + * 获取过期时间 + */ + private String getExpireTime(int hours) { + try { + long expireTimeMillis = System.currentTimeMillis() + (hours * 3600000L); + Date expireDate = new Date(expireTimeMillis); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.getDefault()); + return sdf.format(expireDate); + } catch (Exception e) { + LogManager.logError(TAG, "计算过期时间失败", e); + return "-"; + } + } + + /** + * 获取提示信息 + */ + private String getOrderTipMessage() { + int orderTypeInt = getOrderTypeFromData(); + if (orderTypeInt == 0) { + return "系统会根据场馆及订单情况自动为您开启及关闭灯光、空调,届时请留意!\n祝您有个愉快的体验!"; + } + return "祝您有个愉快的体验!"; + } + + /** + * 播放成功提示音(保留注释) + */ + /* + private void playSuccessAudio() { + try { + // 根据订单类型播放不同提示音 + int orderTypeInt = getOrderTypeFromData(); + if (orderTypeInt == 5) { + // 课程签到成功提示 + // plug_face.playAudio({'audio_type': '课程签到成功'}, ret -> {}); + } else { + // 订单核销成功提示 + // plug_face.playAudio({'audio_type': '订单核销成功'}, ret -> {}); + } + } catch (Exception e) { + LogManager.logError(TAG, "播放提示音失败", e); + } + } + */ + + /** + * 执行开门操作(保留注释) + */ + /* + private void executeOpenDoor() { + try { + // GPIO继电器开门 + // if (get_gate_ab_gpio()) { + // LogManager.logInfo(TAG, "执行继电器开门"); + // app.openDoorGpio(); + // } + + // UDP中控开门 + // if (get_gate_ab_udp()) { + // LogManager.logInfo(TAG, "执行UDP中控开门"); + // openDoorUdp(); + // } + + // AB门开门 + // if (get_gate_ab_enable()) { + // LogManager.logInfo(TAG, "执行AB门开门"); + // openGateAB(); + // } + } catch (Exception e) { + LogManager.logError(TAG, "执行开门操作失败", e); + } } + */ private void setupListeners() { // 确认按钮