Files
QYZH.InteractiveMagazine/QYZH.InteractiveMagazine.Service/ProductService.cs
glz 32989e1fa0 refactor: 重构用户与商品模块,统一业务模型与服务
1.  新增用户状态枚举UserStatusEnum,统一用户状态定义
2.  重构用户体系:合并WxUser与User实体为Users实体,统一用户管理
3.  新增微信小程序认证相关服务与控制器,实现一键登录功能
4.  新增商品管理完整服务与控制器,修复商品表字段映射问题
5.  删除冗余的WxUser相关服务与控制器代码
6.  新增Newtonsoft.Json依赖用于微信接口响应解析
7.  清理无用的文件夹引用配置
2026-06-03 16:09:56 +08:00

257 lines
8.6 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.Extensions.Logging;
using QYZH.InteractiveMagazine.IService;
using QYZH.InteractiveMagazine.Models.Common;
using QYZH.InteractiveMagazine.Models.Dto;
using QYZH.InteractiveMagazine.Models.Entity;
using QYZH.InteractiveMagazine.Repository;
using SqlSugar;
namespace QYZH.InteractiveMagazine.Service;
/// <summary>
/// 商品服务实现
/// </summary>
public class ProductService(BaseRepository<Product> productRepository, ILogger<ProductService> logger) : BaseRepository<Product>, IProductService
{
/// <summary>
/// 创建商品
/// </summary>
public async Task<ProductOutput> CreateAsync(ProductInput input)
{
logger.LogInformation("正在创建商品,商品名称: {Name}", input.Name);
if (string.IsNullOrWhiteSpace(input.Name))
{
throw new BusinessException("商品名称不能为空", 400);
}
if (string.IsNullOrWhiteSpace(input.Type))
{
throw new BusinessException("商品类型不能为空", 400);
}
if (input.Price < 0)
{
throw new BusinessException("商品价格不能为负数", 400);
}
var product = new Product
{
Name = input.Name.Trim(),
Description = input.Description,
ImageUrl = input.ImageUrl,
Price = input.Price,
Type = input.Type,
SaleStatus = input.SaleStatus,
MetaData = input.MetaData,
IsActive = input.IsActive,
Stock = input.Stock,
CreatedBy = "System",
UpdatedBy = "System",
CreatedAt = DateTime.Now,
UpdatedAt = DateTime.Now,
IsDeleted = false
};
var result = await productRepository.InsertAsync(product);
if (!result)
{
logger.LogError("商品创建失败,商品名称: {Name}", input.Name);
throw new BusinessException("创建商品失败", 500);
}
logger.LogInformation("商品创建成功,商品名称: {Name}, ID: {Id}", input.Name, product.Id);
return new ProductOutput
{
Id = product.Id,
Name = product.Name,
Description = product.Description,
ImageUrl = product.ImageUrl,
Price = product.Price,
Type = product.Type,
SaleStatus = product.SaleStatus,
MetaData = product.MetaData,
IsActive = product.IsActive,
Stock = product.Stock,
CreatedBy = product.CreatedBy,
CreatedAt = product.CreatedAt,
UpdatedBy = product.UpdatedBy,
UpdatedAt = product.UpdatedAt
};
}
/// <summary>
/// 更新商品
/// </summary>
public async Task<ProductOutput> UpdateAsync(long id, ProductInput input)
{
logger.LogInformation("正在更新商品ID: {Id}", id);
var product = await productRepository.GetByIdAsync(id);
if (product == null)
{
logger.LogWarning("未找到要更新的商品ID: {Id}", id);
throw new BusinessException("商品不存在", 404);
}
if (string.IsNullOrWhiteSpace(input.Name))
{
throw new BusinessException("商品名称不能为空", 400);
}
if (string.IsNullOrWhiteSpace(input.Type))
{
throw new BusinessException("商品类型不能为空", 400);
}
if (input.Price < 0)
{
throw new BusinessException("商品价格不能为负数", 400);
}
product.Name = input.Name.Trim();
product.Description = input.Description;
product.ImageUrl = input.ImageUrl;
product.Price = input.Price;
product.Type = input.Type;
product.SaleStatus = input.SaleStatus;
product.MetaData = input.MetaData;
product.IsActive = input.IsActive;
product.Stock = input.Stock;
product.UpdatedBy = "System";
product.UpdatedAt = DateTime.Now;
var result = await productRepository.UpdateAsync(product);
if (!result)
{
logger.LogError("商品更新失败ID: {Id}", id);
throw new BusinessException("更新商品失败", 500);
}
logger.LogInformation("商品更新成功ID: {Id}", id);
return new ProductOutput
{
Id = product.Id,
Name = product.Name,
Description = product.Description,
ImageUrl = product.ImageUrl,
Price = product.Price,
Type = product.Type,
SaleStatus = product.SaleStatus,
MetaData = product.MetaData,
IsActive = product.IsActive,
Stock = product.Stock,
CreatedBy = product.CreatedBy,
CreatedAt = product.CreatedAt,
UpdatedBy = product.UpdatedBy,
UpdatedAt = product.UpdatedAt
};
}
/// <summary>
/// 删除商品(软删除)
/// </summary>
public async Task DeleteAsync(long id)
{
logger.LogInformation("正在删除商品ID: {Id}", id);
var product = await productRepository.GetByIdAsync(id);
if (product == null)
{
logger.LogWarning("未找到要删除的商品ID: {Id}", id);
throw new BusinessException("商品不存在", 404);
}
var result = await productRepository.DeleteByIdAsync(id);
if (!result)
{
logger.LogError("商品删除失败ID: {Id}", id);
throw new BusinessException("删除商品失败", 500);
}
logger.LogInformation("商品删除成功ID: {Id}", id);
}
/// <summary>
/// 根据ID获取商品
/// </summary>
public async Task<ProductOutput> GetByIdAsync(long id)
{
logger.LogInformation("正在获取商品信息ID: {Id}", id);
var product = await productRepository.GetByIdAsync(id);
if (product == null)
{
logger.LogWarning("未找到商品ID: {Id}", id);
throw new BusinessException("商品不存在", 404);
}
return new ProductOutput
{
Id = product.Id,
Name = product.Name,
Description = product.Description,
ImageUrl = product.ImageUrl,
Price = product.Price,
Type = product.Type,
SaleStatus = product.SaleStatus,
MetaData = product.MetaData,
IsActive = product.IsActive,
Stock = product.Stock,
CreatedBy = product.CreatedBy,
CreatedAt = product.CreatedAt,
UpdatedBy = product.UpdatedBy,
UpdatedAt = product.UpdatedAt
};
}
/// <summary>
/// 分页查询商品列表
/// </summary>
public async Task<PageListModel<ProductOutput>> GetListAsync(ProductQueryInput input)
{
logger.LogInformation("正在查询商品列表,页码: {PageIndex}, 每页条数: {PageSize}", input.PageIndex, input.PageSize);
if (input.PageIndex <= 0)
{
throw new BusinessException("页码必须大于0", 400);
}
if (input.PageSize <= 0 || input.PageSize > 100)
{
throw new BusinessException("每页条数必须在1-100之间", 400);
}
RefAsync<int> totalNumber = 0;
var pageResult = await productRepository.Queryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.Name), p => p.Name.Contains(input.Name))
.WhereIF(!string.IsNullOrWhiteSpace(input.Type), p => p.Type == input.Type)
.WhereIF(!string.IsNullOrWhiteSpace(input.SaleStatus), p => p.SaleStatus == input.SaleStatus)
.WhereIF(input.IsActive.HasValue, p => p.IsActive == input.IsActive.Value)
.OrderByDescending(p => p.CreatedAt)
.Select(p => new ProductOutput
{
Id = p.Id,
Name = p.Name,
Description = p.Description,
ImageUrl = p.ImageUrl,
Price = p.Price,
Type = p.Type,
SaleStatus = p.SaleStatus,
MetaData = p.MetaData,
IsActive = p.IsActive,
Stock = p.Stock,
CreatedBy = p.CreatedBy,
CreatedAt = p.CreatedAt,
UpdatedBy = p.UpdatedBy,
UpdatedAt = p.UpdatedAt
}, true)
.ToPageListAsync(input.PageIndex, input.PageSize, totalNumber);
return new PageListModel<ProductOutput>(pageResult, input.PageIndex, input.PageSize, totalNumber);
}
}