using MiAssessment.Admin.Business.Data;
using MiAssessment.Admin.Business.Entities;
using MiAssessment.Admin.Business.Models;
using MiAssessment.Admin.Business.Models.BusinessPage;
using MiAssessment.Admin.Business.Models.Common;
using MiAssessment.Admin.Business.Services.Interfaces;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace MiAssessment.Admin.Business.Services;
///
/// 业务介绍页服务实现
///
public class BusinessPageService : IBusinessPageService
{
private readonly AdminBusinessDbContext _dbContext;
private readonly ILogger _logger;
///
/// 状态名称映射
///
private static readonly Dictionary StatusNames = new()
{
{ 0, "禁用" },
{ 1, "启用" }
};
///
/// 构造函数
///
/// 数据库上下文
/// 日志记录器
public BusinessPageService(
AdminBusinessDbContext dbContext,
ILogger logger)
{
_dbContext = dbContext;
_logger = logger;
}
///
public async Task> GetPageListAsync(BusinessPageQueryRequest request)
{
// 构建查询,过滤软删除记录,使用 AsNoTracking 提高只读查询性能
var query = _dbContext.BusinessPages
.AsNoTracking()
.Where(p => !p.IsDeleted);
// 应用过滤条件
query = ApplyPageQueryFilters(query, request);
// 获取总数
var total = await query.CountAsync();
// 分页查询,按 Sort 降序,然后按 CreateTime 降序排列 (Requirements 6.1)
var items = await query
.OrderByDescending(p => p.Sort)
.ThenByDescending(p => p.CreateTime)
.Skip(request.Skip)
.Take(request.PageSize)
.Select(p => new BusinessPageDto
{
Id = p.Id,
Title = p.Title,
ImageUrl = p.ImageUrl,
HasActionButton = p.HasActionButton,
ActionButtonText = p.ActionButtonText,
ActionButtonLink = p.ActionButtonLink,
Sort = p.Sort,
Status = p.Status,
StatusName = GetStatusName(p.Status),
CreateTime = p.CreateTime
})
.ToListAsync();
_logger.LogInformation("查询业务介绍页列表成功,总数: {Total}, 当前页数量: {Count}", total, items.Count);
return PagedResult.Create(items, total, request.Page, request.PageSize);
}
///
public async Task GetPageByIdAsync(long id)
{
// 查询业务介绍页,过滤软删除记录
var page = await _dbContext.BusinessPages
.AsNoTracking()
.Where(p => p.Id == id && !p.IsDeleted)
.Select(p => new BusinessPageDto
{
Id = p.Id,
Title = p.Title,
ImageUrl = p.ImageUrl,
HasActionButton = p.HasActionButton,
ActionButtonText = p.ActionButtonText,
ActionButtonLink = p.ActionButtonLink,
Sort = p.Sort,
Status = p.Status,
StatusName = GetStatusName(p.Status),
CreateTime = p.CreateTime
})
.FirstOrDefaultAsync();
if (page == null)
{
_logger.LogWarning("业务介绍页不存在,ID: {PageId}", id);
}
else
{
_logger.LogInformation("查询业务介绍页详情成功,ID: {PageId}", id);
}
return page;
}
///
public async Task CreatePageAsync(CreateBusinessPageRequest request)
{
// 验证 Title 和 ImageUrl 必填 (Requirements 5.1)
ValidatePageRequest(request.Title, request.ImageUrl, request.HasActionButton,
request.ActionButtonText, request.ActionButtonLink);
var now = DateTime.Now;
// 创建实体
var entity = new BusinessPage
{
Title = request.Title,
ImageUrl = request.ImageUrl,
HasActionButton = request.HasActionButton,
ActionButtonText = request.ActionButtonText,
ActionButtonLink = request.ActionButtonLink,
Sort = request.Sort,
Status = request.Status, // 默认值为 1(启用)(Requirements 5.4)
CreateTime = now, // 自动设置创建时间 (Requirements 5.3)
UpdateTime = now, // 自动设置更新时间 (Requirements 5.3)
IsDeleted = false // 默认未删除 (Requirements 5.4)
};
_dbContext.BusinessPages.Add(entity);
await _dbContext.SaveChangesAsync();
_logger.LogInformation("创建业务介绍页成功,ID: {PageId}, Title: {Title}", entity.Id, entity.Title);
return entity.Id; // 返回自动生成的唯一 Id (Requirements 5.5)
}
///
public async Task UpdatePageAsync(UpdateBusinessPageRequest request)
{
// 验证 Title 和 ImageUrl 必填 (Requirements 7.1)
ValidatePageRequest(request.Title, request.ImageUrl, request.HasActionButton,
request.ActionButtonText, request.ActionButtonLink);
// 查询业务介绍页
var entity = await _dbContext.BusinessPages
.Where(p => p.Id == request.Id && !p.IsDeleted)
.FirstOrDefaultAsync();
// 如果不存在或已软删除,抛出业务异常 (Requirements 7.4)
if (entity == null)
{
_logger.LogWarning("业务介绍页不存在,ID: {PageId}", request.Id);
throw new BusinessException(ErrorCodes.BusinessPageNotFound, "业务介绍页不存在");
}
// 更新字段
entity.Title = request.Title;
entity.ImageUrl = request.ImageUrl;
entity.HasActionButton = request.HasActionButton;
entity.ActionButtonText = request.ActionButtonText;
entity.ActionButtonLink = request.ActionButtonLink;
entity.Sort = request.Sort;
entity.Status = request.Status;
entity.UpdateTime = DateTime.Now; // 自动设置更新时间 (Requirements 7.3)
await _dbContext.SaveChangesAsync();
_logger.LogInformation("更新业务介绍页成功,ID: {PageId}, Title: {Title}", entity.Id, entity.Title);
return true;
}
///
public async Task DeletePageAsync(long id)
{
// 查询业务介绍页
var entity = await _dbContext.BusinessPages
.Where(p => p.Id == id && !p.IsDeleted)
.FirstOrDefaultAsync();
// 如果不存在或已软删除,抛出业务异常 (Requirements 8.3)
if (entity == null)
{
_logger.LogWarning("业务介绍页不存在,ID: {PageId}", id);
throw new BusinessException(ErrorCodes.BusinessPageNotFound, "业务介绍页不存在");
}
// 软删除:设置 IsDeleted 为 true,更新 UpdateTime (Requirements 8.1)
entity.IsDeleted = true;
entity.UpdateTime = DateTime.Now;
await _dbContext.SaveChangesAsync();
_logger.LogInformation("删除业务介绍页成功(软删除),ID: {PageId}", id);
return true;
}
///
public async Task UpdatePageStatusAsync(long id, int status)
{
// 查询业务介绍页
var entity = await _dbContext.BusinessPages
.Where(p => p.Id == id && !p.IsDeleted)
.FirstOrDefaultAsync();
// 如果不存在或已软删除,抛出业务异常 (Requirements 8.3)
if (entity == null)
{
_logger.LogWarning("业务介绍页不存在,ID: {PageId}", id);
throw new BusinessException(ErrorCodes.BusinessPageNotFound, "业务介绍页不存在");
}
// 更新状态字段 (Requirements 8.2)
entity.Status = status;
entity.UpdateTime = DateTime.Now;
await _dbContext.SaveChangesAsync();
_logger.LogInformation("更新业务介绍页状态成功,ID: {PageId}, Status: {Status}", id, status);
return true;
}
///
public async Task UpdatePageSortAsync(long id, int sort)
{
// 查询业务介绍页
var entity = await _dbContext.BusinessPages
.Where(p => p.Id == id && !p.IsDeleted)
.FirstOrDefaultAsync();
// 如果不存在或已软删除,抛出业务异常 (Requirements 8.3)
if (entity == null)
{
_logger.LogWarning("业务介绍页不存在,ID: {PageId}", id);
throw new BusinessException(ErrorCodes.BusinessPageNotFound, "业务介绍页不存在");
}
// 更新排序字段 (Requirements 8.4)
entity.Sort = sort;
entity.UpdateTime = DateTime.Now;
await _dbContext.SaveChangesAsync();
_logger.LogInformation("更新业务介绍页排序成功,ID: {PageId}, Sort: {Sort}", id, sort);
return true;
}
#region 私有方法
///
/// 应用业务介绍页查询过滤条件
///
/// 查询
/// 请求
/// 过滤后的查询
private static IQueryable ApplyPageQueryFilters(
IQueryable query,
BusinessPageQueryRequest request)
{
// 按标题模糊匹配筛选 (Requirements 6.2)
if (!string.IsNullOrWhiteSpace(request.Title))
{
query = query.Where(p => p.Title.Contains(request.Title));
}
// 按状态筛选 (Requirements 6.2)
if (request.Status.HasValue)
{
query = query.Where(p => p.Status == request.Status.Value);
}
return query;
}
///
/// 验证业务介绍页请求
///
/// 标题
/// 图片URL
/// 是否有操作按钮
/// 操作按钮文字
/// 操作按钮链接
private void ValidatePageRequest(string title, string imageUrl, bool hasActionButton,
string? actionButtonText, string? actionButtonLink)
{
// 验证 Title 必填 (Requirements 5.1, 7.1)
if (string.IsNullOrWhiteSpace(title))
{
_logger.LogWarning("业务介绍页验证失败:标题不能为空");
throw new BusinessException(ErrorCodes.ParamError, "标题不能为空");
}
// 验证 ImageUrl 必填 (Requirements 5.1, 7.1)
if (string.IsNullOrWhiteSpace(imageUrl))
{
_logger.LogWarning("业务介绍页验证失败:图片URL不能为空");
throw new BusinessException(ErrorCodes.ParamError, "图片URL不能为空");
}
// 当 HasActionButton 为 true 时,验证 ActionButtonText 和 ActionButtonLink 必填 (Requirements 5.2, 7.2)
if (hasActionButton)
{
if (string.IsNullOrWhiteSpace(actionButtonText))
{
_logger.LogWarning("业务介绍页验证失败:启用操作按钮时,按钮文字不能为空");
throw new BusinessException(ErrorCodes.ParamError, "启用操作按钮时,按钮文字不能为空");
}
if (string.IsNullOrWhiteSpace(actionButtonLink))
{
_logger.LogWarning("业务介绍页验证失败:启用操作按钮时,按钮链接不能为空");
throw new BusinessException(ErrorCodes.ParamError, "启用操作按钮时,按钮链接不能为空");
}
}
}
///
/// 获取状态名称
///
/// 状态值
/// 状态名称
private static string GetStatusName(int status)
{
return StatusNames.TryGetValue(status, out var name) ? name : "未知";
}
#endregion
}