This commit is contained in:
18631081161 2026-01-27 19:29:46 +08:00
commit 2c17784316
5 changed files with 98 additions and 67 deletions

View File

@ -11,28 +11,28 @@
// 测试环境配置 - .NET 10 后端 // 测试环境配置 - .NET 10 后端
const testing = { const testing = {
baseUrl: 'https://app.zpc-xy.com/honey/api', baseUrl: 'https://app.zpc-xy.com/honey/api',
// baseUrl: 'http://192.168.1.24:5238', // baseUrl: 'http://192.168.1.24:5238',
imageUrl: 'https://youdas-1308826010.cos.ap-shanghai.myqcloud.com', imageUrl: 'https://youdas-1308826010.cos.ap-shanghai.myqcloud.com',
loginPage: '', loginPage: '',
wxAppId: '' wxAppId: ''
}; };
// 根据环境变量选择对应配置 // 根据环境变量选择对应配置
let currentEnv = testing;//production;//testing;//production_wz; let currentEnv = testing; //production;//testing;//production_wz;
// 衍生配置 // 衍生配置
const config = { const config = {
...currentEnv, ...currentEnv,
// API请求完整路径 // API请求完整路径
apiBaseUrl: currentEnv.baseUrl + '/api/', apiBaseUrl: currentEnv.baseUrl + '/api/',
// 微信登录重定向URL // 微信登录重定向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`, 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', imageBaseUrl: currentEnv.imageUrl + '/static/web',
// 图标资源路径 // 图标资源路径
iconBaseUrl: currentEnv.imageUrl + '/static/web/static/' iconBaseUrl: currentEnv.imageUrl + '/static/web/static/'
}; };
export default config; export default config;

View File

@ -365,35 +365,35 @@ public class OrderController : ControllerBase
/// </summary> /// </summary>
[HttpPost("order_detail")] [HttpPost("order_detail")]
[Authorize] [Authorize]
public async Task<ApiResponse<OrderDetailDto>> GetOrderDetail([FromBody] OrderDetailRequest? request) public async Task<ApiResponse<OrderInfoDto>> GetOrderDetail([FromBody] OrderDetailRequest? request)
{ {
var userId = GetCurrentUserId(); var userId = GetCurrentUserId();
if (userId == null) if (userId == null)
{ {
return ApiResponse<OrderDetailDto>.Unauthorized(); return ApiResponse<OrderInfoDto>.Unauthorized();
} }
try try
{ {
if (request == null || string.IsNullOrWhiteSpace(request.OrderNum)) if (request == null || string.IsNullOrWhiteSpace(request.OrderNum))
{ {
return ApiResponse<OrderDetailDto>.Fail("订单号不能为空"); return ApiResponse<OrderInfoDto>.Fail("订单号不能为空");
} }
var result = await _orderService.GetOrderDetailAsync(userId.Value, request.OrderNum); var result = await _orderService.GetOrderDetailAsync(userId.Value, request.OrderNum);
return ApiResponse<OrderDetailDto>.Success(result); return ApiResponse<OrderInfoDto>.Success(result);
} }
catch (InvalidOperationException ex) catch (InvalidOperationException ex)
{ {
_logger.LogWarning("Get order detail failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}", _logger.LogWarning("Get order detail failed: UserId={UserId}, OrderNum={OrderNum}, Error={Error}",
userId, request?.OrderNum, ex.Message); userId, request?.OrderNum, ex.Message);
return ApiResponse<OrderDetailDto>.Fail(ex.Message); return ApiResponse<OrderInfoDto>.Fail(ex.Message);
} }
catch (Exception ex) catch (Exception ex)
{ {
_logger.LogError(ex, "Failed to get order detail: UserId={UserId}, OrderNum={OrderNum}", _logger.LogError(ex, "Failed to get order detail: UserId={UserId}, OrderNum={OrderNum}",
userId, request?.OrderNum); userId, request?.OrderNum);
return ApiResponse<OrderDetailDto>.Fail("获取订单详情失败"); return ApiResponse<OrderInfoDto>.Fail("获取订单详情失败");
} }
} }

View File

@ -71,8 +71,8 @@ public interface IOrderService
/// </summary> /// </summary>
/// <param name="userId">用户ID</param> /// <param name="userId">用户ID</param>
/// <param name="orderNum">订单号</param> /// <param name="orderNum">订单号</param>
/// <returns>订单详情</returns> /// <returns>订单详情扁平结构包含goods_list</returns>
Task<OrderDetailDto> GetOrderDetailAsync(int userId, string orderNum); Task<OrderInfoDto> GetOrderDetailAsync(int userId, string orderNum);
#endregion #endregion

View File

@ -1640,6 +1640,7 @@ public class OrderService : IOrderService
GoodsTitle = o.GoodsTitle ?? string.Empty, GoodsTitle = o.GoodsTitle ?? string.Empty,
GoodsImgUrl = o.GoodsImgurl ?? string.Empty, GoodsImgUrl = o.GoodsImgurl ?? string.Empty,
OrderTotal = o.OrderTotal.ToString("0.00"), OrderTotal = o.OrderTotal.ToString("0.00"),
OrderZheTotal = o.OrderZheTotal.ToString("0.00"),
Price = o.Price.ToString("0.00"), Price = o.Price.ToString("0.00"),
PrizeNum = o.PrizeNum, PrizeNum = o.PrizeNum,
Status = o.Status, Status = o.Status,
@ -1667,7 +1668,7 @@ public class OrderService : IOrderService
} }
/// <inheritdoc /> /// <inheritdoc />
public async Task<OrderDetailDto> GetOrderDetailAsync(int userId, string orderNum) public async Task<OrderInfoDto> GetOrderDetailAsync(int userId, string orderNum)
{ {
// 1. 验证订单号 // 1. 验证订单号
if (string.IsNullOrEmpty(orderNum)) if (string.IsNullOrEmpty(orderNum))
@ -1685,16 +1686,26 @@ public class OrderService : IOrderService
throw new InvalidOperationException("订单不存在"); throw new InvalidOperationException("订单不存在");
} }
// 3. 验证订单归属(可选,根据业务需求决定是否验证) // 3. 查询订单商品列表(奖品列表)
// 注意PHP代码中没有验证订单归属这里保持一致 var goodsList = await _dbContext.OrderItems
// 如果需要验证,取消下面的注释 .Where(oi => oi.OrderId == order.Id)
// if (order.UserId != userId) .Select(oi => new OrderGoodsItemDto
// { {
// throw new InvalidOperationException("无权访问该订单"); 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 // 4. 格式化奖品图片URL
var orderInfo = new OrderInfoDto foreach (var item in goodsList)
{
item.GoodsListImgUrl = FormatImageUrl(item.GoodsListImgUrl);
}
// 5. 构建扁平结构的订单详情与PHP旧版一致
return new OrderInfoDto
{ {
Id = order.Id, Id = order.Id,
OrderNum = order.OrderNum, OrderNum = order.OrderNum,
@ -1703,6 +1714,7 @@ public class OrderService : IOrderService
GoodsImgUrl = FormatImageUrl(order.GoodsImgurl), GoodsImgUrl = FormatImageUrl(order.GoodsImgurl),
GoodsPrice = order.GoodsPrice.ToString("0.00"), GoodsPrice = order.GoodsPrice.ToString("0.00"),
OrderTotal = order.OrderTotal.ToString("0.00"), OrderTotal = order.OrderTotal.ToString("0.00"),
OrderZheTotal = order.OrderZheTotal.ToString("0.00"),
Price = order.Price.ToString("0.00"), Price = order.Price.ToString("0.00"),
UseMoney = order.UseMoney.ToString("0.00"), UseMoney = order.UseMoney.ToString("0.00"),
UseIntegral = order.UseIntegral.ToString("0.00"), UseIntegral = order.UseIntegral.ToString("0.00"),
@ -1711,38 +1723,9 @@ public class OrderService : IOrderService
PrizeNum = order.PrizeNum, PrizeNum = order.PrizeNum,
Status = order.Status, Status = order.Status,
AddTime = order.Addtime, AddTime = order.Addtime,
PayTime = order.PayTime > 0 ? order.PayTime : null, PayTime = order.PayTime > 0 ? DateTimeOffset.FromUnixTimeSeconds(order.PayTime).LocalDateTime.ToString("yyyy-MM-dd HH:mm:ss") : null,
OrderType = order.OrderType OrderType = order.OrderType,
}; GoodsList = goodsList
// 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代码中也没有返回
}; };
} }

View File

@ -525,6 +525,12 @@ public class OrderListDto
[JsonPropertyName("order_total")] [JsonPropertyName("order_total")]
public string OrderTotal { get; set; } = "0.00"; public string OrderTotal { get; set; } = "0.00";
/// <summary>
/// 折后订单金额
/// </summary>
[JsonPropertyName("order_zhe_total")]
public string OrderZheTotal { get; set; } = "0.00";
/// <summary> /// <summary>
/// 实际支付金额 /// 实际支付金额
/// </summary> /// </summary>
@ -633,6 +639,12 @@ public class OrderInfoDto
[JsonPropertyName("order_total")] [JsonPropertyName("order_total")]
public string OrderTotal { get; set; } = "0.00"; public string OrderTotal { get; set; } = "0.00";
/// <summary>
/// 折后订单金额
/// </summary>
[JsonPropertyName("order_zhe_total")]
public string OrderZheTotal { get; set; } = "0.00";
/// <summary> /// <summary>
/// 实际支付金额 /// 实际支付金额
/// </summary> /// </summary>
@ -685,13 +697,49 @@ public class OrderInfoDto
/// 支付时间戳 /// 支付时间戳
/// </summary> /// </summary>
[JsonPropertyName("pay_time")] [JsonPropertyName("pay_time")]
public long? PayTime { get; set; } public string? PayTime { get; set; }
/// <summary> /// <summary>
/// 订单类型 /// 订单类型
/// </summary> /// </summary>
[JsonPropertyName("order_type")] [JsonPropertyName("order_type")]
public int OrderType { get; set; } public int OrderType { get; set; }
/// <summary>
/// 奖品列表
/// </summary>
[JsonPropertyName("goods_list")]
public List<OrderGoodsItemDto>? GoodsList { get; set; }
}
/// <summary>
/// 订单商品项DTO用于订单详情
/// </summary>
public class OrderGoodsItemDto
{
/// <summary>
/// 奖品标题
/// </summary>
[JsonPropertyName("goodslist_title")]
public string GoodsListTitle { get; set; } = string.Empty;
/// <summary>
/// 奖品图片
/// </summary>
[JsonPropertyName("goodslist_imgurl")]
public string GoodsListImgUrl { get; set; } = string.Empty;
/// <summary>
/// 奖品价格
/// </summary>
[JsonPropertyName("goodslist_price")]
public decimal GoodsListPrice { get; set; }
/// <summary>
/// 添加时间
/// </summary>
[JsonPropertyName("addtime")]
public string AddTime { get; set; } = string.Empty;
} }
/// <summary> /// <summary>