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 后端
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;

View File

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

View File

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

View File

@ -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
}
/// <inheritdoc />
public async Task<OrderDetailDto> GetOrderDetailAsync(int userId, string orderNum)
public async Task<OrderInfoDto> 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
};
}

View File

@ -525,6 +525,12 @@ public class OrderListDto
[JsonPropertyName("order_total")]
public string OrderTotal { get; set; } = "0.00";
/// <summary>
/// 折后订单金额
/// </summary>
[JsonPropertyName("order_zhe_total")]
public string OrderZheTotal { get; set; } = "0.00";
/// <summary>
/// 实际支付金额
/// </summary>
@ -633,6 +639,12 @@ public class OrderInfoDto
[JsonPropertyName("order_total")]
public string OrderTotal { get; set; } = "0.00";
/// <summary>
/// 折后订单金额
/// </summary>
[JsonPropertyName("order_zhe_total")]
public string OrderZheTotal { get; set; } = "0.00";
/// <summary>
/// 实际支付金额
/// </summary>
@ -685,13 +697,49 @@ public class OrderInfoDto
/// 支付时间戳
/// </summary>
[JsonPropertyName("pay_time")]
public long? PayTime { get; set; }
public string? PayTime { get; set; }
/// <summary>
/// 订单类型
/// </summary>
[JsonPropertyName("order_type")]
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>