using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using ZhonTai.Admin.Core.Dto;
using ZhonTai.Admin.Services;
using NPP.SmartSchedue.Api.Contracts.Services.Time;
using NPP.SmartSchedue.Api.Contracts.Services.Time.Input;
using NPP.SmartSchedue.Api.Contracts.Services.Time.Output;
using NPP.SmartSchedue.Api.Repositories.Time;
using NPP.SmartSchedue.Api.Contracts.Domain.Time;
using ZhonTai.DynamicApi;
using ZhonTai.DynamicApi.Attributes;
namespace NPP.SmartSchedue.Api.Services.Time;
///
/// 生产班次服务
///
[DynamicApi(Area = "app")]
public class ShiftService : BaseService, IShiftService, IDynamicApi
{
private readonly ShiftRepository _shiftRepository;
private readonly ShiftRuleRepository _shiftRuleRepository;
private readonly ShiftRuleMappingRepository _shiftRuleMappingRepository;
public ShiftService(ShiftRepository shiftRepository, ShiftRuleRepository shiftRuleRepository, ShiftRuleMappingRepository shiftRuleMappingRepository)
{
_shiftRepository = shiftRepository;
_shiftRuleRepository = shiftRuleRepository;
_shiftRuleMappingRepository = shiftRuleMappingRepository;
}
///
/// 查询
///
///
///
public async Task GetAsync(long id)
{
var output = await _shiftRepository.Select
.WhereDynamic(id)
.ToOneAsync();
return output;
}
///
/// 查询分页
///
///
///
[HttpPost]
public async Task> GetPageAsync(PageInput input)
{
var list = await _shiftRepository.Select
.WhereIf(!string.IsNullOrEmpty(input.Filter?.Name), a => a.Name.Contains(input.Filter.Name))
.WhereIf(input.Filter?.IsEnabled.HasValue == true, a => a.IsEnabled == input.Filter.IsEnabled.Value)
.Count(out var total)
.OrderBy(a => a.ShiftNumber)
.Page(input.CurrentPage, input.PageSize)
.ToListAsync();
var data = new PageOutput()
{
List = list,
Total = total
};
return data;
}
///
/// 添加
///
///
///
public async Task AddAsync(ShiftAddInput input)
{
var entity = Mapper.Map(input);
var result = await _shiftRepository.InsertAsync(entity);
// 查询所有启用的Shift Rule
var shiftRules = await _shiftRuleRepository.Select
.Where(r => r.IsEnabled)
.ToListAsync();
// 自动添加当前班次的Shift Rule Mapping
if (shiftRules.Any())
{
var mappings = shiftRules.Select(rule => new ShiftRuleMappingEntity
{
ShiftId = result.Id,
RuleId = rule.Id,
IsEnabled = true,
ExecutionPriority = rule.DefaultPriority,
OverrideParameters = rule.RuleParameters,
MappingDescription = $"自动创建:{rule.RuleName}"
}).ToList();
await _shiftRuleMappingRepository.InsertAsync(mappings);
}
return result.Id;
}
///
/// 修改
///
///
///
public async Task UpdateAsync(ShiftUpdateInput input)
{
var entity = await _shiftRepository.GetAsync(input.Id);
Mapper.Map(input, entity);
await _shiftRepository.UpdateAsync(entity);
}
///
/// 删除
///
///
///
public async Task DeleteAsync(long id)
{
await _shiftRepository.DeleteAsync(id);
}
///
/// 软删除
///
///
///
public async Task SoftDeleteAsync(long id)
{
await _shiftRepository.SoftDeleteAsync(id);
}
///
/// 批量软删除
///
///
///
public async Task BatchSoftDeleteAsync(long[] ids)
{
await _shiftRepository.SoftDeleteAsync(ids);
}
///
/// 启用班次
///
/// 班次ID
///
public async Task EnableAsync(long id)
{
var entity = await _shiftRepository.GetAsync(id);
if (entity != null)
{
entity.IsEnabled = true;
await _shiftRepository.UpdateAsync(entity);
}
}
///
/// 禁用班次
///
/// 班次ID
///
public async Task DisableAsync(long id)
{
var entity = await _shiftRepository.GetAsync(id);
if (entity != null)
{
entity.IsEnabled = false;
await _shiftRepository.UpdateAsync(entity);
}
}
///
/// 切换班次状态
///
/// 班次ID
/// 是否启用
///
public async Task ToggleStatusAsync(long id, bool isEnabled)
{
var entity = await _shiftRepository.GetAsync(id);
if (entity != null)
{
entity.IsEnabled = isEnabled;
await _shiftRepository.UpdateAsync(entity);
}
}
///
/// 获取班次相关的规则列表
/// 深度业务思考:通过班次规则映射表获取该班次适用的所有规则
/// 必须同时满足:映射表IsEnabled=true 且 规则本身IsEnabled=true
///
/// 班次ID
/// 班次规则列表
public async Task> GetShiftRulesAsync(long shiftId)
{
try
{
// 先获取该班次关联且启用的规则映射
var enabledMappings = await _shiftRuleMappingRepository.Select
.Where(srm => srm.ShiftId == shiftId && srm.IsEnabled)
.OrderBy(srm => srm.ExecutionPriority)
.ToListAsync();
if (!enabledMappings.Any())
{
return new List();
}
// 获取映射中的规则ID列表
var ruleIds = enabledMappings.Select(m => m.RuleId).ToList();
// 查询对应的规则详情,同时检查规则本身也必须启用
var shiftRules = await _shiftRuleRepository.Select
.Where(sr => ruleIds.Contains(sr.Id) && sr.IsEnabled) // 规则本身也必须启用
.ToListAsync();
// 按映射表的优先级重新排序返回结果
var orderedRules = new List();
foreach (var mapping in enabledMappings)
{
var rule = shiftRules.FirstOrDefault(sr => sr.Id == mapping.RuleId);
if (rule != null)
{
orderedRules.Add(rule);
}
}
return orderedRules;
}
catch (Exception ex)
{
// 记录异常但不抛出,返回空列表以保证系统稳定性
return new List();
}
}
}