using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NPP.SmartSchedue.Api.Contracts;
using NPP.SmartSchedue.Api.Contracts.Domain.Time;
using NPP.SmartSchedue.Api.Core.Repositories;
using ZhonTai.Admin.Core.Db.Transaction;
namespace NPP.SmartSchedue.Api.Repositories.Time;
///
/// 班次规则关联仓储
///
public class ShiftRuleMappingRepository : AppRepositoryBase, IShiftRuleMappingRepository
{
public ShiftRuleMappingRepository(UnitOfWorkManagerCloud uowm) : base(uowm)
{
}
///
/// 根据班次ID获取有效的班次规则列表
/// 深度业务思考:
/// 1. 通过映射表Join关联获取规则
/// 2. 过滤启用状态和生效时间
/// 3. 按优先级排序
/// 高级工程师修复:正确使用FreeSql Join语法
///
public async Task> GetEffectiveShiftRulesAsync(long shiftId, DateTime? targetDate = null)
{
var currentDate = targetDate ?? DateTime.Now;
// 使用正确的FreeSql Join语法
var query = Orm.Select()
.LeftJoin((srm, sr) => srm.RuleId == sr.Id)
.Where((srm, sr) => srm.ShiftId == shiftId && srm.IsEnabled)
.Where((srm, sr) => srm.EffectiveStartTime == null || srm.EffectiveStartTime <= currentDate)
.Where((srm, sr) => srm.EffectiveEndTime == null || srm.EffectiveEndTime >= currentDate)
.Where((srm, sr) => sr.IsEnabled)
.Where((srm, sr) => sr.EffectiveStartTime == null || sr.EffectiveStartTime <= currentDate)
.Where((srm, sr) => sr.EffectiveEndTime == null || sr.EffectiveEndTime >= currentDate)
.OrderBy((srm, sr) => new { srm.ExecutionPriority, sr.DefaultPriority });
return await query.ToListAsync((srm, sr) => sr);
}
///
/// 批量获取多个班次的规则映射
/// 深度业务思考:
/// 1. 一次查询获取所有班次的规则映射,避免N+1查询
/// 2. 在内存中按班次ID分组,提高性能
/// 3. 保持规则的优先级排序
///
public async Task>> GetBatchShiftRulesAsync(List shiftIds, DateTime? targetDate = null)
{
if (!shiftIds.Any())
return new Dictionary>();
var currentDate = targetDate ?? DateTime.Now;
// 查询所有相关的映射和规则数据 - 修复FreeSql Join语法
var mappingsWithRules = await Orm.Select()
.LeftJoin((srm, sr) => srm.RuleId == sr.Id)
.Where((srm, sr) => shiftIds.Contains(srm.ShiftId) && srm.IsEnabled)
.Where((srm, sr) => srm.EffectiveStartTime == null || srm.EffectiveStartTime <= currentDate)
.Where((srm, sr) => srm.EffectiveEndTime == null || srm.EffectiveEndTime >= currentDate)
.Where((srm, sr) => sr.IsEnabled)
.Where((srm, sr) => sr.EffectiveStartTime == null || sr.EffectiveStartTime <= currentDate)
.Where((srm, sr) => sr.EffectiveEndTime == null || sr.EffectiveEndTime >= currentDate)
.OrderBy((srm, sr) => srm.ShiftId)
.OrderBy((srm, sr) => srm.ExecutionPriority)
.OrderBy((srm, sr) => sr.DefaultPriority)
.ToListAsync((srm, sr) => new { mapping = srm, rule = sr });
// 按班次ID分组并构建结果字典
var result = new Dictionary>();
foreach (var shiftId in shiftIds)
{
result[shiftId] = new List();
}
foreach (var item in mappingsWithRules.Where(x => x.rule != null))
{
if (result.ContainsKey(item.mapping.ShiftId))
{
result[item.mapping.ShiftId].Add(item.rule);
}
}
return result;
}
}