From c69aaa476ace91192aa55a5e96a9087f92cbb7ea Mon Sep 17 00:00:00 2001 From: zpc Date: Tue, 27 Jan 2026 18:24:03 +0800 Subject: [PATCH] 213 --- honey_box/common/env.js | 32 ++++----- .../Controllers/OrderController.cs | 12 ++-- .../HoneyBox.Core/Interfaces/IOrderService.cs | 4 +- .../HoneyBox.Core/Services/OrderService.cs | 67 +++++++------------ .../Models/Order/OrderModels.cs | 50 +++++++++++++- 5 files changed, 98 insertions(+), 67 deletions(-) diff --git a/honey_box/common/env.js b/honey_box/common/env.js index f192d080..b63d38e4 100644 --- a/honey_box/common/env.js +++ b/honey_box/common/env.js @@ -11,28 +11,28 @@ // 测试环境配置 - .NET 10 后端 const testing = { - baseUrl: 'https://app.zpc-xy.com/honey/api', - // baseUrl: 'http://192.168.1.24:5238', - imageUrl: 'https://youdas-1308826010.cos.ap-shanghai.myqcloud.com', - loginPage: '', - wxAppId: '' + baseUrl: 'https://app.zpc-xy.com/honey/api', + // baseUrl: 'http://192.168.1.24:5238', + imageUrl: 'https://youdas-1308826010.cos.ap-shanghai.myqcloud.com', + loginPage: '', + wxAppId: '' }; // 根据环境变量选择对应配置 -let currentEnv = testing;//production;//testing;//production_wz; +let currentEnv = testing; //production;//testing;//production_wz; // 衍生配置 const config = { - ...currentEnv, - // API请求完整路径 - apiBaseUrl: currentEnv.baseUrl + '/api/', - // 微信登录重定向URL - wxLoginUrl: `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${currentEnv.wxAppId}&redirect_uri=${escape(currentEnv.loginPage)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`, - // 图片资源路径 - imageBaseUrl: currentEnv.imageUrl + '/static/web', - // 图标资源路径 - iconBaseUrl: currentEnv.imageUrl + '/static/web/static/' + ...currentEnv, + // API请求完整路径 + apiBaseUrl: currentEnv.baseUrl + '/api/', + // 微信登录重定向URL + wxLoginUrl: `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${currentEnv.wxAppId}&redirect_uri=${escape(currentEnv.loginPage)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`, + // 图片资源路径 + imageBaseUrl: currentEnv.imageUrl + '/static/web', + // 图标资源路径 + iconBaseUrl: currentEnv.imageUrl + '/static/web/static/' }; -export default config; \ No newline at end of file +export default config; \ No newline at end of file diff --git a/server/HoneyBox/src/HoneyBox.Api/Controllers/OrderController.cs b/server/HoneyBox/src/HoneyBox.Api/Controllers/OrderController.cs index a9530271..bd4e437c 100644 --- a/server/HoneyBox/src/HoneyBox.Api/Controllers/OrderController.cs +++ b/server/HoneyBox/src/HoneyBox.Api/Controllers/OrderController.cs @@ -365,35 +365,35 @@ public class OrderController : ControllerBase /// [HttpPost("order_detail")] [Authorize] - public async Task> GetOrderDetail([FromBody] OrderDetailRequest? request) + public async Task> GetOrderDetail([FromBody] OrderDetailRequest? request) { var userId = GetCurrentUserId(); if (userId == null) { - return ApiResponse.Unauthorized(); + return ApiResponse.Unauthorized(); } try { if (request == null || string.IsNullOrWhiteSpace(request.OrderNum)) { - return ApiResponse.Fail("订单号不能为空"); + return ApiResponse.Fail("订单号不能为空"); } var result = await _orderService.GetOrderDetailAsync(userId.Value, request.OrderNum); - return ApiResponse.Success(result); + return ApiResponse.Success(result); } catch (InvalidOperationException ex) { _logger.LogWarning("Get order detail failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}", userId, request?.OrderNum, ex.Message); - return ApiResponse.Fail(ex.Message); + return ApiResponse.Fail(ex.Message); } catch (Exception ex) { _logger.LogError(ex, "Failed to get order detail: UserId={UserId}, OrderNum={OrderNum}", userId, request?.OrderNum); - return ApiResponse.Fail("获取订单详情失败"); + return ApiResponse.Fail("获取订单详情失败"); } } diff --git a/server/HoneyBox/src/HoneyBox.Core/Interfaces/IOrderService.cs b/server/HoneyBox/src/HoneyBox.Core/Interfaces/IOrderService.cs index 67b3484e..0bf00820 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Interfaces/IOrderService.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Interfaces/IOrderService.cs @@ -71,8 +71,8 @@ public interface IOrderService /// /// 用户ID /// 订单号 - /// 订单详情 - Task GetOrderDetailAsync(int userId, string orderNum); + /// 订单详情(扁平结构,包含goods_list) + Task GetOrderDetailAsync(int userId, string orderNum); #endregion diff --git a/server/HoneyBox/src/HoneyBox.Core/Services/OrderService.cs b/server/HoneyBox/src/HoneyBox.Core/Services/OrderService.cs index 1344fb04..43a119a5 100644 --- a/server/HoneyBox/src/HoneyBox.Core/Services/OrderService.cs +++ b/server/HoneyBox/src/HoneyBox.Core/Services/OrderService.cs @@ -1640,6 +1640,7 @@ public class OrderService : IOrderService GoodsTitle = o.GoodsTitle ?? string.Empty, GoodsImgUrl = o.GoodsImgurl ?? string.Empty, OrderTotal = o.OrderTotal.ToString("0.00"), + OrderZheTotal = o.OrderZheTotal.ToString("0.00"), Price = o.Price.ToString("0.00"), PrizeNum = o.PrizeNum, Status = o.Status, @@ -1667,7 +1668,7 @@ public class OrderService : IOrderService } /// - public async Task GetOrderDetailAsync(int userId, string orderNum) + public async Task GetOrderDetailAsync(int userId, string orderNum) { // 1. 验证订单号 if (string.IsNullOrEmpty(orderNum)) @@ -1685,16 +1686,26 @@ public class OrderService : IOrderService throw new InvalidOperationException("订单不存在"); } - // 3. 验证订单归属(可选,根据业务需求决定是否验证) - // 注意:PHP代码中没有验证订单归属,这里保持一致 - // 如果需要验证,取消下面的注释 - // if (order.UserId != userId) - // { - // throw new InvalidOperationException("无权访问该订单"); - // } + // 3. 查询订单商品列表(奖品列表) + var goodsList = await _dbContext.OrderItems + .Where(oi => oi.OrderId == order.Id) + .Select(oi => new OrderGoodsItemDto + { + GoodsListTitle = oi.GoodslistTitle ?? string.Empty, + GoodsListImgUrl = oi.GoodslistImgurl ?? string.Empty, + GoodsListPrice = oi.GoodslistPrice, + AddTime = DateTimeOffset.FromUnixTimeSeconds(oi.Addtime).LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss") + }) + .ToListAsync(); - // 4. 构建订单信息DTO - var orderInfo = new OrderInfoDto + // 4. 格式化奖品图片URL + foreach (var item in goodsList) + { + item.GoodsListImgUrl = FormatImageUrl(item.GoodsListImgUrl); + } + + // 5. 构建扁平结构的订单详情(与PHP旧版一致) + return new OrderInfoDto { Id = order.Id, OrderNum = order.OrderNum, @@ -1703,6 +1714,7 @@ public class OrderService : IOrderService GoodsImgUrl = FormatImageUrl(order.GoodsImgurl), GoodsPrice = order.GoodsPrice.ToString("0.00"), OrderTotal = order.OrderTotal.ToString("0.00"), + OrderZheTotal = order.OrderZheTotal.ToString("0.00"), Price = order.Price.ToString("0.00"), UseMoney = order.UseMoney.ToString("0.00"), UseIntegral = order.UseIntegral.ToString("0.00"), @@ -1711,38 +1723,9 @@ public class OrderService : IOrderService PrizeNum = order.PrizeNum, Status = order.Status, AddTime = order.Addtime, - PayTime = order.PayTime > 0 ? order.PayTime : null, - OrderType = order.OrderType - }; - - // 5. 查询订单商品列表(奖品列表) - var prizeList = await _dbContext.OrderItems - .Where(oi => oi.OrderId == order.Id) - .Select(oi => new PrizeItemDto - { - Id = oi.Id, - GoodsListTitle = oi.GoodslistTitle ?? string.Empty, - GoodsListImgUrl = oi.GoodslistImgurl ?? string.Empty, - GoodsListPrice = oi.GoodslistPrice.ToString("0.00"), - GoodsListMoney = oi.GoodslistMoney.ToString("0.00"), - Status = oi.Status, - LuckNo = oi.LuckNo, - ShangId = oi.ShangId - }) - .ToListAsync(); - - // 6. 格式化奖品图片URL - foreach (var prize in prizeList) - { - prize.GoodsListImgUrl = FormatImageUrl(prize.GoodsListImgUrl); - } - - // 7. 构建响应 - return new OrderDetailDto - { - OrderInfo = orderInfo, - PrizeList = prizeList, - PaymentRecords = null // 支付记录暂不实现,PHP代码中也没有返回 + PayTime = order.PayTime > 0 ? DateTimeOffset.FromUnixTimeSeconds(order.PayTime).LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss") : null, + OrderType = order.OrderType, + GoodsList = goodsList }; } diff --git a/server/HoneyBox/src/HoneyBox.Model/Models/Order/OrderModels.cs b/server/HoneyBox/src/HoneyBox.Model/Models/Order/OrderModels.cs index 0b6027a8..b4045220 100644 --- a/server/HoneyBox/src/HoneyBox.Model/Models/Order/OrderModels.cs +++ b/server/HoneyBox/src/HoneyBox.Model/Models/Order/OrderModels.cs @@ -525,6 +525,12 @@ public class OrderListDto [JsonPropertyName("order_total")] public string OrderTotal { get; set; } = "0.00"; + /// + /// 折后订单金额 + /// + [JsonPropertyName("order_zhe_total")] + public string OrderZheTotal { get; set; } = "0.00"; + /// /// 实际支付金额 /// @@ -633,6 +639,12 @@ public class OrderInfoDto [JsonPropertyName("order_total")] public string OrderTotal { get; set; } = "0.00"; + /// + /// 折后订单金额 + /// + [JsonPropertyName("order_zhe_total")] + public string OrderZheTotal { get; set; } = "0.00"; + /// /// 实际支付金额 /// @@ -685,13 +697,49 @@ public class OrderInfoDto /// 支付时间戳 /// [JsonPropertyName("pay_time")] - public long? PayTime { get; set; } + public string? PayTime { get; set; } /// /// 订单类型 /// [JsonPropertyName("order_type")] public int OrderType { get; set; } + + /// + /// 奖品列表 + /// + [JsonPropertyName("goods_list")] + public List? GoodsList { get; set; } +} + +/// +/// 订单商品项DTO(用于订单详情) +/// +public class OrderGoodsItemDto +{ + /// + /// 奖品标题 + /// + [JsonPropertyName("goodslist_title")] + public string GoodsListTitle { get; set; } = string.Empty; + + /// + /// 奖品图片 + /// + [JsonPropertyName("goodslist_imgurl")] + public string GoodsListImgUrl { get; set; } = string.Empty; + + /// + /// 奖品价格 + /// + [JsonPropertyName("goodslist_price")] + public decimal GoodsListPrice { get; set; } + + /// + /// 添加时间 + /// + [JsonPropertyName("addtime")] + public string AddTime { get; set; } = string.Empty; } ///