This commit is contained in:
李鹏军 2024-07-24 11:14:58 +08:00
parent 895e12762d
commit c772c68e47
13 changed files with 361 additions and 369 deletions

View File

@ -5,54 +5,56 @@ namespace SJZY.Track.Application.Helpers;
public class ForewarningFactorHelper public class ForewarningFactorHelper
{ {
public static RuleCollectEntity[] GetFactorItem([NotNull]RuleFactorEntity ruleFactors) public static RuleItemEntity[] GetFactorItem([NotNull] RuleFactorEntity ruleFactors)
{ {
var total = Factorial(ruleFactors); var total = Factorial(ruleFactors);
var ruleCollect = AllocateFactor(total,ruleFactors.RuleId); var ruleCollect = AllocateFactor(total, ruleFactors.RuleId);
Assignment(ruleCollect,total,ruleFactors.CargoTypes,(item,value)=>item.CargoType=value); Assignment(ruleCollect, total, ruleFactors.CargoTypes, (item, value) => item.CargoType = value);
Assignment(ruleCollect,total,ruleFactors.Months,(item,value)=>item.Month=value); Assignment(ruleCollect, total, ruleFactors.Months, (item, value) => item.Month = value);
Assignment(ruleCollect,total,ruleFactors.Areas,(item,value)=>item.Area=value); Assignment(ruleCollect, total, ruleFactors.Areas, (item, value) => item.Area = value);
Assignment(ruleCollect,total,ruleFactors.IsTransit,(item,value)=>item.IsTransit=value); Assignment(ruleCollect, total, ruleFactors.IsTransit, (item, value) => item.IsTransit = value);
Assignment(ruleCollect,total,ruleFactors.DeparturePorts,(item,value)=>item.DeparturePort=value); Assignment(ruleCollect, total, ruleFactors.DeparturePorts, (item, value) => item.DeparturePort = value);
Assignment(ruleCollect,total,ruleFactors.ProductCodes,(item,value)=>item.ProductCode=value); Assignment(ruleCollect, total, ruleFactors.ProductCodes, (item, value) => item.ProductCode = value);
return ruleCollect.ToArray(); return ruleCollect.ToArray();
} }
private static void Assignment<T>(Span<RuleCollectEntity> ruleCollect,int total,IReadOnlyList<T> values,Action<RuleCollectEntity,T> action) private static void Assignment<T>(Span<RuleItemEntity> ruleCollect, int total, IReadOnlyList<T> values,
Action<RuleItemEntity, T> action)
{ {
if (values.Count == 0) if (values.Count == 0)
{ {
return; return;
} }
var segment = total / values.Count; var segment = total / values.Count;
for(int index=0;index<values.Count;index++) for (int index = 0; index < values.Count; index++)
{ {
var start = index * segment; var start = index * segment;
var assignmentSlice = ruleCollect.Slice(start, segment); var assignmentSlice = ruleCollect.Slice(start, segment);
foreach (var item in assignmentSlice) foreach (var item in assignmentSlice)
{ {
action(item,values[index]); action(item, values[index]);
} }
} }
} }
private static Span<RuleCollectEntity> AllocateFactor(int total,int ruleId) private static Span<RuleItemEntity> AllocateFactor(int total, int ruleId)
{ {
Span<RuleItemEntity> factors = new RuleItemEntity[total];
Span<RuleCollectEntity> factors = new RuleCollectEntity[total];
for (int index = 0; index < total; index++) for (int index = 0; index < total; index++)
{ {
factors[index] = new RuleCollectEntity() factors[index] = new RuleItemEntity()
{ {
RuleId = ruleId RuleId = ruleId
}; };
} }
return factors; return factors;
} }
internal static int Factorial(RuleFactorEntity ruleFactors) internal static int Factorial(RuleFactorEntity ruleFactors)
{ {
return ruleFactors.CargoTypes.Count*ruleFactors.Months.Count*ruleFactors.Areas.Count*ruleFactors.IsTransit.Count*ruleFactors.DeparturePorts.Count*ruleFactors.ProductCodes.Count; return ruleFactors.CargoTypes.Count * ruleFactors.Months.Count * ruleFactors.Areas.Count *
ruleFactors.IsTransit.Count * ruleFactors.DeparturePorts.Count * ruleFactors.ProductCodes.Count;
} }
} }

View File

@ -1,24 +1,22 @@
using FreeRedis; using FreeRedis;
using NetTaste;
using SJZY.Expand.ABP.Core; using SJZY.Expand.ABP.Core;
using SJZY.Track.Application.Contract.Services; using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Aggregates.ForewarningAggregate;
using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Consts;
using SJZY.Track.Domain.Dtos.Forewarning; using SJZY.Track.Domain.Dtos.Forewarning;
using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Enums;
using SqlSugar;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
namespace SJZY.Track.Application.Services.ForewarningServices; namespace SJZY.Track.Application.Services.ForewarningServices;
/// <summary> /// <summary>
/// 单例服务,用于处理预警通知 /// 用于处理预警通知
/// </summary> /// </summary>
public class ForewarningNotifyService:IForewarningNotifyService,ITransientDependency public class ForewarningNotifyService : IForewarningNotifyService, ITransientDependency
{ {
private IRuleFactorCacheService _ruleFactorCache; private IRuleFactorCacheService _ruleFactorCache;
IReadOnlyDictionary<string,List<ForewarningRule>> _ruleGroupDict; IReadOnlyDictionary<string, List<ForewarningRule>> _ruleGroupDict;
IReadOnlyDictionary<string,List<RuleFactor>> _factorDict; IReadOnlyDictionary<string, List<RuleFactor>> _factorDict;
private IReadOnlyDictionary<int, ForewarningRule> _rules; private IReadOnlyDictionary<int, ForewarningRule> _rules;
readonly INotifyService _notifyService; readonly INotifyService _notifyService;
@ -27,7 +25,7 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
_ruleFactorCache = ruleFactorCache; _ruleFactorCache = ruleFactorCache;
_notifyService = notifyService; _notifyService = notifyService;
} }
/// <summary> /// <summary>
/// 创建预警通知 /// 创建预警通知
/// </summary> /// </summary>
@ -38,10 +36,10 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
var rules = GetRule(order); var rules = GetRule(order);
if (rules == null || rules.Count == 0) if (rules == null || rules.Count == 0)
return 0; return 0;
return await ExecuteRule(rules,order.Id); return await ExecuteRule(rules, order.Id);
} }
/// <summary> /// <summary>
/// 清除预警通知 /// 清除预警通知
/// </summary> /// </summary>
@ -56,10 +54,10 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
var willDeleteMembers = new List<string>(); var willDeleteMembers = new List<string>();
foreach (var rule in rules) foreach (var rule in rules)
{ {
var allRuleNotities= DeleteNotifyValue(rule, order.Id); var allRuleNotities = DeleteNotifyValue(rule, order.Id);
willDeleteMembers.AddRange(allRuleNotities); willDeleteMembers.AddRange(allRuleNotities);
} }
await RedisHelper.Client.ZRemAsync(GlobalConst.ForewarningNotifyKeyPrefix, willDeleteMembers.ToArray()); await RedisHelper.Client.ZRemAsync(GlobalConst.ForewarningNotifyKeyPrefix, willDeleteMembers.ToArray());
return willDeleteMembers.Count; return willDeleteMembers.Count;
} }
@ -67,32 +65,33 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
public void SendNotification(int intervalMinute) public void SendNotification(int intervalMinute)
{ {
var currentTimestamp = GetTimestamp(DateTime.Now); var currentTimestamp = GetTimestamp(DateTime.Now);
var notifyMembers = RedisHelper.Client.ZRangeByScore(GlobalConst.ForewarningNotifyKeyPrefix, 0, currentTimestamp); var notifyMembers =
RedisHelper.Client.ZRangeByScore(GlobalConst.ForewarningNotifyKeyPrefix, 0, currentTimestamp);
if (notifyMembers == null || notifyMembers.Length == 0) if (notifyMembers == null || notifyMembers.Length == 0)
return; return;
var notifyValues = notifyMembers.Select(val => new RuleNotifyValue(val)); var notifyValues = notifyMembers.Select(val => new RuleNotifyValue(val));
foreach (var notifyValue in notifyValues) foreach (var notifyValue in notifyValues)
{ {
if(!_rules.TryGetValue(notifyValue.RuleId, out var rule)) if (!_rules.TryGetValue(notifyValue.RuleId, out var rule))
continue; continue;
//todo 发送通知 //todo 发送通知
_notifyService.SendNotification(""); _notifyService.SendNotification("");
} }
} }
public void ClearCache() public void ClearCache()
{ {
_ruleGroupDict = null; _ruleGroupDict = null;
_factorDict = null; _factorDict = null;
_rules = null; _rules = null;
} }
private List<string> DeleteNotifyValue(ForewarningRule rule,int orderId) private List<string> DeleteNotifyValue(ForewarningRule rule, int orderId)
{ {
var members = new List<string>(); var members = new List<string>();
for(var index=0;index<rule.Count;index++) for (var index = 0; index < rule.Count; index++)
{ {
var notifyValue = NotifyValue(rule, orderId, index); var notifyValue = NotifyValue(rule, orderId, index);
members.Add(notifyValue); members.Add(notifyValue);
@ -100,7 +99,7 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
return members; return members;
} }
/// <summary> /// <summary>
/// 获取规则 /// 获取规则
/// </summary> /// </summary>
@ -112,45 +111,45 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
{ {
return null; return null;
} }
var keys = GetForewarningKeys(factors, order); var keys = GetForewarningKeys(factors, order);
var result = new List< ForewarningRule>(); var result = new List<ForewarningRule>();
foreach (var item in keys) foreach (var item in keys)
{ {
if (!_ruleGroupDict.TryGetValue(item, out var rules)) if (!_ruleGroupDict.TryGetValue(item, out var rules))
continue; continue;
var allRules = rules.Where(val=>val.TrackStart <= order.Track && val.TrackEnd >= order.Track); var allRules = rules.Where(val => val.TrackStart <= order.Track && val.TrackEnd >= order.Track);
result.AddRange(allRules); result.AddRange(allRules);
} }
return result; return result;
} }
private async ValueTask<int> ExecuteRule(List<ForewarningRule> rules,int orderId) private async ValueTask<int> ExecuteRule(List<ForewarningRule> rules, int orderId)
{ {
var members = new List<ZMember>(); var members = new List<ZMember>();
foreach (var rule in rules) foreach (var rule in rules)
{ {
var notifys = ExecuteRule(rule,orderId); var notifys = ExecuteRule(rule, orderId);
members.AddRange(notifys); members.AddRange(notifys);
} }
await RedisHelper.Client.ZAddAsync(GlobalConst.ForewarningNotifyKeyPrefix, members.ToArray()); await RedisHelper.Client.ZAddAsync(GlobalConst.ForewarningNotifyKeyPrefix, members.ToArray());
return members.Count; return members.Count;
} }
private List<ZMember> ExecuteRule(ForewarningRule rule,int orderId) private List<ZMember> ExecuteRule(ForewarningRule rule, int orderId)
{ {
var members = new List<ZMember>(); var members = new List<ZMember>();
var intervalMinute = 60 * ((rule.Timeliness - rule.Remind) / rule.Count);// 间隔多少分钟 var intervalMinute = 60 * ((rule.Timeliness - rule.Remind) / rule.Count); // 间隔多少分钟
for(var index=0;index<rule.Count;index++) for (var index = 0; index < rule.Count; index++)
{ {
var notifyTime = (rule.Remind*60) + intervalMinute * index; var notifyTime = (rule.Remind * 60) + intervalMinute * index;
var notifyTimestamp = GetTimestamp(DateTime.Now.AddMinutes(notifyTime)); var notifyTimestamp = GetTimestamp(DateTime.Now.AddMinutes(notifyTime));
var notifyValue = new ZMember(NotifyValue(rule, orderId, index),notifyTimestamp); var notifyValue = new ZMember(NotifyValue(rule, orderId, index), notifyTimestamp);
members.Add(notifyValue); members.Add(notifyValue);
} }
@ -162,12 +161,12 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
return new DateTimeOffset(dateTime).ToUnixTimeSeconds(); return new DateTimeOffset(dateTime).ToUnixTimeSeconds();
} }
private string NotifyValue(ForewarningRule rule, int orderId,int sort) private string NotifyValue(ForewarningRule rule, int orderId, int sort)
{ {
var result =new RuleNotifyValue(rule.Id, orderId, sort, rule.TrackEnd); var result = new RuleNotifyValue(rule.Id, orderId, sort, rule.TrackEnd);
return result.ToString(); return result.ToString();
} }
private List<string> GetForewarningKeys(List<RuleFactor> factors, IForewarningFactorValue rule) private List<string> GetForewarningKeys(List<RuleFactor> factors, IForewarningFactorValue rule)
{ {
var keys = new List<string>(); var keys = new List<string>();
@ -179,34 +178,35 @@ public class ForewarningNotifyService:IForewarningNotifyService,ITransientDepend
return keys; return keys;
} }
private async Task Init() private async Task Init()
{ {
// todo:缓存设计有问题 重构 120s 10w 30w 3000k/s
var allFactorCollect = await _ruleFactorCache.GetAllFactorCollect(); var allFactorCollect = await _ruleFactorCache.GetAllFactorCollect();
var factors = await _ruleFactorCache.GetAllRuleFactor(); var factors = await _ruleFactorCache.GetAllRuleFactor();
var factorsMap = factors.GroupBy(val=>val.RuleId) var factorsMap = factors.GroupBy(val => val.RuleId)
.ToDictionary(val=>val.Key,val=>val.First()); .ToDictionary(val => val.Key, val => val.First());
_rules = allFactorCollect.ToDictionary(val => val.Id); _rules = allFactorCollect.ToDictionary(val => val.Id);
_factorDict = factors.GroupBy(val => GetFactorKey(val.CustomerId,val.SystemId)) _factorDict = factors.GroupBy(val => GetFactorKey(val.CustomerId, val.SystemId))
.ToDictionary(val=>val.Key,val=>val.ToList()); .ToDictionary(val => val.Key, val => val.ToList());
_ruleGroupDict = allFactorCollect.GroupBy(x => GetRuleKey(x, factorsMap[x.RuleId])) _ruleGroupDict = allFactorCollect.GroupBy(x => GetRuleKey(x, factorsMap[x.RuleId]))
.ToDictionary(val => val.Key, val => val.ToList()); .ToDictionary(val => val.Key, val => val.ToList());
} }
private string GetFactorKey(int customerId,int systemId) private string GetFactorKey(int customerId, int systemId)
{ {
return $"{customerId}:{systemId}"; return $"{customerId}:{systemId}";
} }
private string GetRuleKey(IForewarningFactorValue rule,RuleFactor factors) private string GetRuleKey(IForewarningFactorValue rule, RuleFactor factors)
{ {
var key = ""; var key = "";
foreach (var factorItem in factors.FactorItems) foreach (var factorItem in factors.FactorItems)
{ {
key+=GetFactorValue(factorItem,rule); key += GetFactorValue(factorItem, rule);
} }
return key; return key;

View File

@ -1,29 +1,26 @@
using System.Diagnostics.CodeAnalysis;
using AutoMapper;
using SJZY.Track.Application.Helpers; using SJZY.Track.Application.Helpers;
using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Aggregates.ForewarningAggregate;
using SJZY.Track.Domain.Dtos.Forewarning; using SJZY.Track.Domain.Dtos.Forewarning;
using SqlSugar;
namespace SJZY.Track.Application.Services.ForewarningServices; namespace SJZY.Track.Application.Services.ForewarningServices;
[ApiExplorerSettings(GroupName = "预警服务")] [ApiExplorerSettings(GroupName = "预警服务")]
[Route("/ForewarningService")] [Route("/ForewarningService")]
public class ForewarningService: ApplicationService public class ForewarningService : ApplicationService
{ {
readonly IRuleRepository _ruleRepository; readonly IRuleRepository _ruleRepository;
IRuleFactorRepository _ruleFactorRepository; IRuleFactorRepository _ruleFactorRepository;
private IRuleCollectRepository _ruleCollectRepository; private IRuleItemRepository _ruleItemRepository;
public ForewarningService(IRuleRepository ruleRepository public ForewarningService(IRuleRepository ruleRepository
,IRuleFactorRepository ruleFactorRepository , IRuleFactorRepository ruleFactorRepository
, IRuleCollectRepository ruleCollectRepository) , IRuleItemRepository ruleItemRepository)
{ {
_ruleRepository = ruleRepository; _ruleRepository = ruleRepository;
_ruleFactorRepository = ruleFactorRepository; _ruleFactorRepository = ruleFactorRepository;
_ruleCollectRepository = ruleCollectRepository; _ruleItemRepository = ruleItemRepository;
} }
/// <summary> /// <summary>
/// 创建预警模板,存在则更新 /// 创建预警模板,存在则更新
/// </summary> /// </summary>
@ -32,46 +29,48 @@ public class ForewarningService: ApplicationService
[HttpPost("ModifyForewarning")] [HttpPost("ModifyForewarning")]
public async ValueTask<UnifyResultDto> ModifyForewarning(CreateRuleFactorRequest input) public async ValueTask<UnifyResultDto> ModifyForewarning(CreateRuleFactorRequest input)
{ {
var factors = ObjectMapper.Map<CreateRuleFactorRequest,RuleFactorEntity>(input); var factors = ObjectMapper.Map<CreateRuleFactorRequest, RuleFactorEntity>(input);
var ruleCollects = ForewarningFactorHelper.GetFactorItem(factors); var ruleItems = ForewarningFactorHelper.GetFactorItem(factors);
//todo 原子性没有保证,后续可能需要调整 //todo 原子性没有保证,后续可能需要调整
if (input.RuleId > 0) if (input.RuleId > 0)
{ {
await _ruleFactorRepository.DeleteByIdAsync(input.RuleId.ToString()); await _ruleFactorRepository.DeleteByIdAsync(input.RuleId.ToString());
} }
if (input.RuleId > 0) if (input.RuleId > 0)
{ {
var ruleTemplate = await _ruleRepository.GetFirstAsync(val=>val.Id == input.RuleId); var ruleTemplate = await _ruleRepository.GetFirstAsync(val => val.Id == input.RuleId);
if (ruleTemplate == null) if (ruleTemplate == null)
return new UnifyResultDto(false,"规则不存在"); return new UnifyResultDto(false, "规则不存在");
ruleTemplate.Name = input.Name; ruleTemplate.Name = input.Name;
ruleTemplate.CustomId = input.CustomId; ruleTemplate.CustomId = input.CustomId;
await _ruleFactorRepository.IndexDocumentAsync(factors); await _ruleFactorRepository.IndexDocumentAsync(factors);
await _ruleRepository.UpdateForewarning(ruleTemplate, ruleCollects); await _ruleRepository.UpdateForewarning(ruleTemplate, ruleItems);
return new UnifyResultDto(true,"保存成功"); return new UnifyResultDto(true, "保存成功");
} }
var newRuleTemplate = ObjectMapper.Map<CreateRuleFactorRequest, RuleEntity>(input); var newRuleTemplate = ObjectMapper.Map<CreateRuleFactorRequest, RuleEntity>(input);
var ruleTemplateId = await _ruleRepository.CreateForewarning(newRuleTemplate, ruleCollects); var ruleId = await _ruleRepository.CreateForewarning(newRuleTemplate, ruleItems);
factors.Id = ruleTemplateId.ToString(); factors.Id = ruleId.ToString();
return new UnifyResultDto(true,"保存成功"); await _ruleFactorRepository.IndexDocumentAsync(factors);
return new UnifyResultDto(true, "保存成功");
} }
/// <summary> /// <summary>
/// 修改时效 /// 修改时效
/// </summary> /// </summary>
[HttpPost("ModifyTimeliness")] [HttpPost("ModifyTimeliness")]
public async ValueTask<UnifyResultDto> ModifyTimeliness(ModifyTimelinessRequest input) public async ValueTask<UnifyResultDto> ModifyTimeliness(ModifyTimelinessRequest input)
{ {
var ruleIds = input.Items.Select(val=>val.Id).ToList(); var ruleIds = input.Items.Select(val => val.Id).ToList();
var ruleCollect = await _ruleCollectRepository.GetListAsync(val => ruleIds.Contains(val.Id) && val.RuleId == input.RuleId); var ruleCollect =
if (ruleCollect == null|| ruleCollect.Count == 0) await _ruleItemRepository.GetListAsync(val => ruleIds.Contains(val.Id) && val.RuleId == input.RuleId);
throw new BusinessException(message:"规则不存在"); if (ruleCollect == null || ruleCollect.Count == 0)
throw new BusinessException(message: "规则不存在");
var ruleMaps = ruleCollect.ToDictionary(val => val.Id); var ruleMaps = ruleCollect.ToDictionary(val => val.Id);
var notModifyList = new List<int>(); var notModifyList = new List<int>();
foreach (var item in input.Items) foreach (var item in input.Items)
@ -81,48 +80,45 @@ public class ForewarningService: ApplicationService
notModifyList.Add(item.Id); notModifyList.Add(item.Id);
continue; continue;
} }
rule.Remind= item.Remind; rule.Remind = item.Remind;
rule.Timeliness = item.Timeliness; rule.Timeliness = item.Timeliness;
rule.Count = item.Count; rule.Count = item.Count;
} }
await _ruleCollectRepository.UpdateRangeAsync(ruleCollect,val=>val.RuleId==input.RuleId); await _ruleItemRepository.UpdateRangeAsync(ruleCollect, val => val.RuleId == input.RuleId);
if (notModifyList.Count > 0) if (notModifyList.Count > 0)
return new UnifyResultDto(true, $"更新成功,规则{string.Join(",", notModifyList)}不存在"); return new UnifyResultDto(true, $"更新成功,规则{string.Join(",", notModifyList)}不存在");
return new UnifyResultDto(true, "更新成功"); return new UnifyResultDto(true, "更新成功");
} }
/// <summary>
/// 查询预警模板列表
/// </summary>
/// <returns></returns>
[HttpPost("QueryForewarning")]
public async Task<UnifyResultDto> QueryForewarning(QueryForewarningRequest input)
{
var result = await _ruleRepository.QueryForewarning(input);
return new UnifyResultDto(true, result);
}
/// <summary> /// <summary>
/// 查询预警规则列表 /// 查询预警规则列表
/// </summary> /// </summary>
[HttpPost("QueryForewarningRules")] /// <returns></returns>
public async Task<UnifyResultDto> QueryForewarningRules(QueryForewarningRuleRequest input) [HttpPost("QueryForewarning")]
public async Task<UnifyResultDto> QueryForewarning(QueryForewarningRequest input)
{ {
var result = await _ruleCollectRepository.QueryForewarningRule(input); var result = await _ruleRepository.QueryForewarningRuleAsync(input);
return new UnifyResultDto(true, result); return new UnifyResultDto(true, result);
} }
/// <summary>
/// 查询预警规则明细列表
/// </summary>
[HttpPost("QueryForewarningRules")]
public async Task<UnifyPageResultDto<RuleCollectDto>> QueryForewarningRuleItems(QueryForewarningRuleRequest input)
{
return await _ruleItemRepository.QueryForewarningRuleItemsAsync(input);
}
/// <summary> /// <summary>
/// 发送预警通知 /// 发送预警通知
/// </summary> /// </summary>
[HttpPost("SendForewarningNotification")] [HttpPost("SendForewarningNotification")]
public void SendForewarningNotification() public void SendForewarningNotification()
{ {
} }
} }

View File

@ -1,7 +1,5 @@
using AutoMapper;
using SJZY.Track.Domain.Aggregates.KPIAreaAggregate; using SJZY.Track.Domain.Aggregates.KPIAreaAggregate;
using SJZY.Track.Domain.Dtos.Forewarning; using SJZY.Track.Domain.Dtos.Forewarning;
using SqlSugar;
namespace SJZY.Track.Application.Services.ForewarningServices; namespace SJZY.Track.Application.Services.ForewarningServices;
@ -9,9 +7,9 @@ namespace SJZY.Track.Application.Services.ForewarningServices;
[Route("/ForewarningService")] [Route("/ForewarningService")]
public class KpiAreaService : ApplicationService public class KpiAreaService : ApplicationService
{ {
readonly IKpiAreaRepository _ruleAreaRepository; private readonly IKpiAreaRepository _ruleAreaRepository;
public KpiAreaService(IKpiAreaRepository ruleAreaRepository ) public KpiAreaService(IKpiAreaRepository ruleAreaRepository)
{ {
_ruleAreaRepository = ruleAreaRepository; _ruleAreaRepository = ruleAreaRepository;
} }
@ -26,7 +24,7 @@ public class KpiAreaService : ApplicationService
{ {
var ruleAreaEntity = ObjectMapper.Map<CreateRuleAreaRequest, RuleAreaEntity>(input); var ruleAreaEntity = ObjectMapper.Map<CreateRuleAreaRequest, RuleAreaEntity>(input);
var areaId = await _ruleAreaRepository.CreateAreaAsync(ruleAreaEntity); var areaId = await _ruleAreaRepository.CreateAreaAsync(ruleAreaEntity);
return new UnifyResultDto(true,areaId, "创建成功"); return new UnifyResultDto(true, areaId, "创建成功");
} }
/// <summary> /// <summary>
@ -39,7 +37,7 @@ public class KpiAreaService : ApplicationService
{ {
var ruleAreaEntity = ObjectMapper.Map<AddRuleAreaInfoRequest, RuleAreaInfoEntity>(input); var ruleAreaEntity = ObjectMapper.Map<AddRuleAreaInfoRequest, RuleAreaInfoEntity>(input);
var ruleInfoId = await _ruleAreaRepository.AddAreaInfoAsync(ruleAreaEntity); var ruleInfoId = await _ruleAreaRepository.AddAreaInfoAsync(ruleAreaEntity);
return new UnifyResultDto(true,ruleInfoId, "添加成功"); return new UnifyResultDto(true, ruleInfoId, "添加成功");
} }
/// <summary> /// <summary>
@ -53,7 +51,7 @@ public class KpiAreaService : ApplicationService
await _ruleAreaRepository.DeleteArea(id); await _ruleAreaRepository.DeleteArea(id);
return new UnifyResultDto(true, "删除成功"); return new UnifyResultDto(true, "删除成功");
} }
/// <summary> /// <summary>
/// 删除分区信息 /// 删除分区信息
/// </summary> /// </summary>
@ -65,7 +63,7 @@ public class KpiAreaService : ApplicationService
await _ruleAreaRepository.DeleteAreaInfo(id); await _ruleAreaRepository.DeleteAreaInfo(id);
return new UnifyResultDto(true, "删除成功"); return new UnifyResultDto(true, "删除成功");
} }
/// <summary> /// <summary>
/// 更新区域信息 /// 更新区域信息
/// </summary> /// </summary>
@ -74,18 +72,18 @@ public class KpiAreaService : ApplicationService
[HttpPost("KpiArea/ModifyKpiArea")] [HttpPost("KpiArea/ModifyKpiArea")]
public async Task<UnifyResultDto> ModifyKpiArea(UpdateRuleAreaRequest input) public async Task<UnifyResultDto> ModifyKpiArea(UpdateRuleAreaRequest input)
{ {
if(input.Id<=0) if (input.Id <= 0)
return new UnifyResultDto(false,"id不能为空"); return new UnifyResultDto(false, "id不能为空");
var ruleArea =await _ruleAreaRepository.GetFirstAsync(val=>val.Id==input.Id); var ruleArea = await _ruleAreaRepository.GetFirstAsync(val => val.Id == input.Id);
if(ruleArea==null) if (ruleArea == null)
return new UnifyResultDto(false,"未找到该区域"); return new UnifyResultDto(false, "未找到该区域");
ruleArea.Name = input.Name; ruleArea.Name = input.Name;
await _ruleAreaRepository.UpdateAsync(ruleArea); await _ruleAreaRepository.UpdateAsync(ruleArea);
return new UnifyResultDto(true,"更新成功"); return new UnifyResultDto(true, "更新成功");
} }
/// <summary> /// <summary>
/// 更新区域信息 /// 更新区域信息
/// </summary> /// </summary>
@ -94,19 +92,19 @@ public class KpiAreaService : ApplicationService
[HttpPost("KpiArea/ModifyKpiAreaInfo")] [HttpPost("KpiArea/ModifyKpiAreaInfo")]
public async Task<UnifyResultDto> ModifyKpiAreaInfo(UpdateRuleAreaInfoRequest input) public async Task<UnifyResultDto> ModifyKpiAreaInfo(UpdateRuleAreaInfoRequest input)
{ {
if(input.Id<=0) if (input.Id <= 0)
return new UnifyResultDto(false,"id不能为空"); return new UnifyResultDto(false, "id不能为空");
//todo 测试不存在id的情况 //todo 测试不存在id的情况
RuleAreaInfoEntity areaInfo = await _ruleAreaRepository.GetAreaInfoById(input.Id); var areaInfo = await _ruleAreaRepository.GetAreaInfoById(input.Id);
if(areaInfo==null) if (areaInfo == null)
return new UnifyResultDto(false,"未找到该区域信息"); return new UnifyResultDto(false, "未找到该区域信息");
var ruleAreaEntity = ObjectMapper.Map(input,areaInfo); var ruleAreaEntity = ObjectMapper.Map(input, areaInfo);
await _ruleAreaRepository.UpdateAreaInfoAsync(ruleAreaEntity); await _ruleAreaRepository.UpdateAreaInfoAsync(ruleAreaEntity);
return new UnifyResultDto(true,"更新成功"); return new UnifyResultDto(true, "更新成功");
} }
/// <summary> /// <summary>
/// 查询分区列表 /// 查询分区列表
/// </summary> /// </summary>
@ -117,7 +115,7 @@ public class KpiAreaService : ApplicationService
{ {
return await _ruleAreaRepository.GetAreas(input); return await _ruleAreaRepository.GetAreas(input);
} }
/// <summary> /// <summary>
/// 查询分区列表 /// 查询分区列表
/// </summary> /// </summary>

View File

@ -7,189 +7,188 @@ using Volo.Abp.DependencyInjection;
namespace SJZY.Track.Application.Services.ForewarningServices; namespace SJZY.Track.Application.Services.ForewarningServices;
public class RuleFactorCacheService:IRuleFactorCacheService,ITransientDependency public class RuleFactorCacheService : IRuleFactorCacheService, ITransientDependency
{ {
private const string GlobalFactorLockKey = "RuleFactorCacheService_GlobalLock"; private const string GlobalFactorLockKey = "RuleFactorCacheService_GlobalLock";
private const string GlobalRuleLockKey = "RuleFactorCacheService_GlobalLock"; private const string GlobalRuleLockKey = "RuleFactorCacheService_GlobalLock";
readonly IRuleFactorRepository _ruleFactorRepository; readonly IRuleFactorRepository _ruleFactorRepository;
readonly IRuleCollectRepository _ruleCollectRepository; readonly IRuleItemRepository _ruleItemRepository;
readonly IRuleRepository _ruleRepository; readonly IRuleRepository _ruleRepository;
public RuleFactorCacheService(IRuleFactorRepository ruleFactorRepository, public RuleFactorCacheService(IRuleFactorRepository ruleFactorRepository,
IRuleCollectRepository ruleCollectRepository, IRuleRepository ruleRepository) IRuleItemRepository ruleItemRepository, IRuleRepository ruleRepository)
{ {
_ruleFactorRepository = ruleFactorRepository; _ruleFactorRepository = ruleFactorRepository;
_ruleCollectRepository = ruleCollectRepository; _ruleItemRepository = ruleItemRepository;
_ruleRepository = ruleRepository; _ruleRepository = ruleRepository;
} }
private string GetKey() private string GetKey()
{ {
return $"{GlobalConst.RuleFactorKeyPrefix}:allFactor"; return $"{GlobalConst.RuleFactorKeyPrefix}:allFactor";
} }
private string GetRuleKey()
{
return $"{GlobalConst.RuleFactorKeyPrefix}:allRule";
}
/// <summary> private string GetRuleKey()
/// 获取所有规则数据 {
/// </summary> return $"{GlobalConst.RuleFactorKeyPrefix}:allRule";
/// <returns></returns> }
[NonAction]
public async Task<ForewarningRule[]> GetAllFactorCollect()
{
var key = GetRuleKey();
var result =await RedisHelper.Client.GetAsync<ForewarningRule[]>(key);
if (result == null)
{
using (var globalLock = RedisHelper.Client.Lock(GlobalRuleLockKey, 10))
{
result =await RedisHelper.Client.GetAsync<ForewarningRule[]>(key);
if (result != null) return result;
var ruleCollect = await _ruleCollectRepository.GetListAsync(val => true); /// <summary>
if (ruleCollect == null || ruleCollect.Count == 0) /// 获取所有规则数据
/// </summary>
/// <returns></returns>
[NonAction]
public async Task<ForewarningRule[]> GetAllFactorCollect()
{
var key = GetRuleKey();
var result = await RedisHelper.Client.GetAsync<ForewarningRule[]>(key);
if (result == null)
{
using (var globalLock = RedisHelper.Client.Lock(GlobalRuleLockKey, 10))
{ {
ForewarningRule[] rules = new ForewarningRule[0]; result = await RedisHelper.Client.GetAsync<ForewarningRule[]>(key);
await RedisHelper.Client.SetAsync(key,rules , TimeSpan.FromSeconds(20)); if (result != null) return result;
return result;
var ruleCollect = await _ruleItemRepository.GetListAsync(val => true);
if (ruleCollect == null || ruleCollect.Count == 0)
{
ForewarningRule[] rules = new ForewarningRule[0];
await RedisHelper.Client.SetAsync(key, rules, TimeSpan.FromSeconds(20));
return result;
}
var ruleList = ruleCollect.SelectMany(RuleEntityToRule);
await RedisHelper.Client.SetAsync(key, ruleList);
return result;
} }
}
var ruleList = ruleCollect.SelectMany(RuleEntityToRule); return result;
await RedisHelper.Client.SetAsync(key, ruleList); }
return result;
}
}
return result; /// <summary>
} /// 获取所有因素数据
/// </summary>
/// <summary> /// <returns>获取所有因素,返回值可能为空</returns>
/// 获取所有因素数据 [NonAction]
/// </summary> public async Task<List<RuleFactor>> GetAllRuleFactor()
/// <returns>获取所有因素,返回值可能为空</returns> {
[NonAction] var key = GetKey();
public async Task<List<RuleFactor>> GetAllRuleFactor() var result = await RedisHelper.Client.GetAsync<List<RuleFactor>>(key);
{ if (result == null)
var key = GetKey(); {
var result =await RedisHelper.Client.GetAsync<List<RuleFactor>>(key); using (var globalLock = RedisHelper.Client.Lock(GlobalFactorLockKey, 10))
if (result == null)
{
using (var globalLock = RedisHelper.Client.Lock(GlobalFactorLockKey, 10))
{
result =await RedisHelper.Client.GetAsync<List<RuleFactor>>(key);
if (result != null) return result;
result = await GenerateAllRuleFactor();
if (result == null || result.Count == 0)
{ {
await RedisHelper.Client.SetAsync(key,new List<RuleFactor>() , TimeSpan.FromSeconds(20)); result = await RedisHelper.Client.GetAsync<List<RuleFactor>>(key);
return result; if (result != null) return result;
result = await GenerateAllRuleFactor();
if (result == null || result.Count == 0)
{
await RedisHelper.Client.SetAsync(key, new List<RuleFactor>(), TimeSpan.FromSeconds(20));
return result;
}
await RedisHelper.Client.SetAsync(key, result);
return result;
} }
}
await RedisHelper.Client.SetAsync(key, result);
return result;
}
}
return result; return result;
} }
[NonAction]
public void ClearFactorCache()
{
RedisHelper.Client.DelAsync(GetKey());
}
[NonAction] [NonAction]
public void ClearRuleCache() public void ClearFactorCache()
{ {
RedisHelper.Client.DelAsync(GetRuleKey()); RedisHelper.Client.DelAsync(GetKey());
} }
private async Task<List<RuleFactor>> GenerateAllRuleFactor() [NonAction]
{ public void ClearRuleCache()
var factors =await _ruleFactorRepository.GetAllList(); {
var ruleTemplate =await _ruleRepository.GetListAsync(val => true); RedisHelper.Client.DelAsync(GetRuleKey());
var ruleMap = ruleTemplate.ToDictionary(val => val.Id); }
var result = new List<RuleFactor>();
foreach (var item in factors)
{
if(!ruleMap.TryGetValue(item.RuleId,out var rule))
continue;
var ruleFactors = EntityToRuleFactor(item, rule);
result.AddRange(ruleFactors);
}
return result; private async Task<List<RuleFactor>> GenerateAllRuleFactor()
} {
var factors = await _ruleFactorRepository.GetAllList();
private ForewarningRule[] RuleEntityToRule(RuleCollectEntity entity) var ruleTemplate = await _ruleRepository.GetListAsync(val => true);
{ var ruleMap = ruleTemplate.ToDictionary(val => val.Id);
var result = RuleCollectToRule(entity); var result = new List<RuleFactor>();
if (string.IsNullOrEmpty(entity.Month)) foreach (var item in factors)
{ {
return new ForewarningRule[] { result }; if (!ruleMap.TryGetValue(item.RuleId, out var rule))
} continue;
var ruleFactors = EntityToRuleFactor(item, rule);
result.AddRange(ruleFactors);
}
var months = entity.Month.Split('/'); return result;
var rules = new List<ForewarningRule>(months.Length); }
foreach (var month in months) private ForewarningRule[] RuleEntityToRule(RuleItemEntity entity)
{ {
if (int.TryParse(month, out int monthInt)) var result = RuleCollectToRule(entity);
{ if (string.IsNullOrEmpty(entity.Month))
var rule = result; {
rule.Month = monthInt; return new ForewarningRule[] { result };
rules.Add(rule); }
}
}
return rules.ToArray(); var months = entity.Month.Split('/');
} var rules = new List<ForewarningRule>(months.Length);
private ForewarningRule RuleCollectToRule(RuleCollectEntity entity) foreach (var month in months)
{ {
return new ForewarningRule if (int.TryParse(month, out int monthInt))
{ {
Id = entity.Id, var rule = result;
RuleId = entity.RuleId, rule.Month = monthInt;
Remind = entity.Remind, rules.Add(rule);
Timeliness = entity.Timeliness, }
Count = entity.Count, }
TrackStart = entity.TrackStart,
TrackEnd = entity.TrackEnd,
CargoType = entity.CargoType,
Month = null,
Area = entity.Area,
IsTransit = entity.IsTransit,
DeparturePort = entity.DeparturePort,
ProductCode = entity.ProductCode
};
}
private List<RuleFactor> EntityToRuleFactor(RuleFactorEntity entity,RuleEntity ruleTemplate) return rules.ToArray();
{ }
List<RuleFactor> result = new List<RuleFactor>();
foreach (var track in entity.Tracks)
{
var item = new RuleFactor()
{
CustomerId = ruleTemplate.CustomId,
RuleId = ruleTemplate.Id,
NotifyUser = track.NotifyUser,
NotifyTemplate = track.NotifyTemplate,
FactorItems = entity.FactorItems,
End = track.End,
Start = track.Start,
SystemId = ruleTemplate.SubSystemId
};
result.Add(item);
}
return result; private ForewarningRule RuleCollectToRule(RuleItemEntity entity)
} {
return new ForewarningRule
{
Id = entity.Id,
RuleId = entity.RuleId,
Remind = entity.Remind,
Timeliness = entity.Timeliness,
Count = entity.Count,
TrackStart = entity.TrackStart,
TrackEnd = entity.TrackEnd,
CargoType = entity.CargoType,
Month = null,
Area = entity.Area,
IsTransit = entity.IsTransit,
DeparturePort = entity.DeparturePort,
ProductCode = entity.ProductCode
};
}
private List<RuleFactor> EntityToRuleFactor(RuleFactorEntity entity, RuleEntity ruleTemplate)
{
List<RuleFactor> result = new List<RuleFactor>();
foreach (var track in entity.Tracks)
{
var item = new RuleFactor()
{
CustomerId = ruleTemplate.CustomId,
RuleId = ruleTemplate.Id,
NotifyUser = track.NotifyUser,
NotifyTemplate = track.NotifyTemplate,
FactorItems = entity.FactorItems,
End = track.End,
Start = track.Start,
SystemId = ruleTemplate.SubSystemId
};
result.Add(item);
}
return result;
}
} }

View File

@ -2,12 +2,12 @@ using SJZY.Track.Domain.Dtos.Forewarning;
namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate;
public interface IRuleCollectRepository:IBasicRepository<RuleCollectEntity> public interface IRuleItemRepository : IBasicRepository<RuleItemEntity>
{ {
/// <summary> /// <summary>
/// 查询分页 /// 查询分页
/// </summary> /// </summary>
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
Task<UnifyPageResultDto<RuleCollectDto>> QueryForewarningRule(QueryForewarningRuleRequest input); Task<UnifyPageResultDto<RuleCollectDto>> QueryForewarningRuleItemsAsync(QueryForewarningRuleRequest input);
} }

View File

@ -2,11 +2,11 @@ using SJZY.Track.Domain.Dtos.Forewarning;
namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate;
public interface IRuleRepository:IBasicRepository<RuleEntity> public interface IRuleRepository : IBasicRepository<RuleEntity>
{ {
Task<int> CreateForewarning(RuleEntity rule, RuleCollectEntity[] factorList); Task<int> CreateForewarning(RuleEntity rule, RuleItemEntity[] ruleItems);
Task UpdateForewarning(RuleEntity rule, RuleCollectEntity[] factorList);
Task<UnifyPageResultDto<RuleEntity>> QueryForewarning(QueryForewarningRequest input); Task UpdateForewarning(RuleEntity rule, RuleItemEntity[] factorList);
Task<UnifyPageResultDto<RuleEntity>> QueryForewarningRuleAsync(QueryForewarningRequest input);
} }

View File

@ -5,14 +5,14 @@ using SJZY.Track.Domain.Consts;
namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate;
[ElasticsearchType(RelationName = GlobalConst.RuleFactorIndex)] [ElasticsearchType(RelationName = GlobalConst.RuleFactorIndex)]
public class RuleFactorEntity:IdBaseIndex public class RuleFactorEntity : IdBaseIndex
{ {
/// <summary> /// <summary>
/// RuleId 表的id /// RuleId 表的id
/// </summary> /// </summary>
[Keyword(Index = true)] [Keyword(Index = true)]
public int RuleId { get; set; } public int RuleId { get; set; }
/// <summary> /// <summary>
/// 获取或设置规则跟踪状态实体的列表。 /// 获取或设置规则跟踪状态实体的列表。
/// </summary> /// </summary>
@ -52,4 +52,4 @@ public class RuleFactorEntity:IdBaseIndex
/// 获取或设置产品编号的列表。 /// 获取或设置产品编号的列表。
/// </summary> /// </summary>
public List<string> ProductCodes { get; set; } public List<string> ProductCodes { get; set; }
} }

View File

@ -1,16 +1,15 @@
namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate; namespace SJZY.Track.Domain.Aggregates.ForewarningAggregate;
[SugarTable("t_rule_collect")] [SugarTable("t_rule_item")]
public class RuleCollectEntity : IAggregateRoot,ICloneable public class RuleItemEntity : IAggregateRoot, ICloneable
{ {
/// <summary> /// <summary>
/// 自增主键 /// 自增主键
/// </summary> /// </summary>
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)] [SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; } public int Id { get; set; }
[SugarColumn(ColumnName = "RuleId")] [SugarColumn(ColumnName = "RuleId")] public int RuleId { get; set; }
public int RuleId { get; set; }
/// <summary> /// <summary>
/// 提醒的时间(小时) /// 提醒的时间(小时)
@ -29,7 +28,7 @@ public class RuleCollectEntity : IAggregateRoot,ICloneable
/// </summary> /// </summary>
[SugarColumn(ColumnName = "Count")] [SugarColumn(ColumnName = "Count")]
public int Count { get; set; } public int Count { get; set; }
/// <summary> /// <summary>
/// 起始轨迹 /// 起始轨迹
/// </summary> /// </summary>
@ -59,19 +58,19 @@ public class RuleCollectEntity : IAggregateRoot,ICloneable
/// </summary> /// </summary>
[SugarColumn(ColumnName = "Area")] [SugarColumn(ColumnName = "Area")]
public int? Area { get; set; } public int? Area { get; set; }
/// <summary> /// <summary>
/// 是否中转 /// 是否中转
/// </summary> /// </summary>
[SugarColumn(ColumnName = "IsTransit")] [SugarColumn(ColumnName = "IsTransit")]
public bool? IsTransit { get; set; } public bool? IsTransit { get; set; }
/// <summary> /// <summary>
/// 起运港口 /// 起运港口
/// </summary> /// </summary>
[SugarColumn(ColumnName = "DeparturePort")] [SugarColumn(ColumnName = "DeparturePort")]
public string DeparturePort { get; set; } public string DeparturePort { get; set; }
/// <summary> /// <summary>
/// 产品编码 /// 产品编码
/// </summary> /// </summary>

View File

@ -2,7 +2,7 @@ using SJZY.Track.Domain.Dtos.Forewarning;
namespace SJZY.Track.Domain.Aggregates.KPIAreaAggregate; namespace SJZY.Track.Domain.Aggregates.KPIAreaAggregate;
public interface IKpiAreaRepository:IBasicRepository<RuleAreaEntity> public interface IKpiAreaRepository : IBasicRepository<RuleAreaEntity>
{ {
/// <summary> /// <summary>
/// 创建分区 /// 创建分区
@ -45,7 +45,7 @@ public interface IKpiAreaRepository:IBasicRepository<RuleAreaEntity>
/// <param name="query"></param> /// <param name="query"></param>
/// <returns></returns> /// <returns></returns>
Task<UnifyPageResultDto<AreaDto>> GetAreas(QueryAreaRequest query); Task<UnifyPageResultDto<AreaDto>> GetAreas(QueryAreaRequest query);
/// <summary> /// <summary>
/// 获取分区信息 /// 获取分区信息
/// </summary> /// </summary>
@ -58,7 +58,7 @@ public interface IKpiAreaRepository:IBasicRepository<RuleAreaEntity>
/// </summary> /// </summary>
/// <param name="id"></param> /// <param name="id"></param>
/// <returns></returns> /// <returns></returns>
Task<RuleAreaInfoEntity> GetAreaInfoById(int id); Task<RuleAreaInfoEntity?> GetAreaInfoById(int id);
/// <summary> /// <summary>
/// 获取所有区域信息 /// 获取所有区域信息

View File

@ -1,17 +1,16 @@
using SJZY.Track.Domain; using SJZY.Track.Domain;
using SJZY.Track.Domain.Aggregates.ForewarningAggregate;
using SJZY.Track.Domain.Aggregates.KPIAreaAggregate; using SJZY.Track.Domain.Aggregates.KPIAreaAggregate;
using SJZY.Track.Domain.Dtos.Forewarning; using SJZY.Track.Domain.Dtos.Forewarning;
namespace SJZY.Track.Repository.Repositories; namespace SJZY.Track.Repository.Repositories;
public class KpiAreaRepository:BasicRepository<RuleAreaEntity> ,IKpiAreaRepository,ITransientDependency public class KpiAreaRepository : BasicRepository<RuleAreaEntity>, IKpiAreaRepository, ITransientDependency
{ {
public async ValueTask<int> CreateAreaAsync(RuleAreaEntity entity) public async ValueTask<int> CreateAreaAsync(RuleAreaEntity entity)
{ {
return await InsertReturnIdentityAsync(entity); return await InsertReturnIdentityAsync(entity);
} }
public async ValueTask<int> AddAreaInfoAsync(RuleAreaInfoEntity entity) public async ValueTask<int> AddAreaInfoAsync(RuleAreaInfoEntity entity)
{ {
return await Context.Insertable(entity).ExecuteReturnIdentityAsync(); return await Context.Insertable(entity).ExecuteReturnIdentityAsync();
@ -24,12 +23,12 @@ public class KpiAreaRepository:BasicRepository<RuleAreaEntity> ,IKpiAreaReposito
await Context.Deleteable<RuleAreaInfoEntity>().Where(x => x.AreaId == areaId).ExecuteCommandAsync(); await Context.Deleteable<RuleAreaInfoEntity>().Where(x => x.AreaId == areaId).ExecuteCommandAsync();
transaction.Complete(); transaction.Complete();
} }
public Task<int> DeleteAreaInfo(int areaInfoId) public Task<int> DeleteAreaInfo(int areaInfoId)
{ {
return Context.Deleteable<RuleAreaInfoEntity>().Where(val=>val.Id==areaInfoId).ExecuteCommandAsync(); return Context.Deleteable<RuleAreaInfoEntity>().Where(val => val.Id == areaInfoId).ExecuteCommandAsync();
} }
public Task<int> UpdateAreaInfoAsync(RuleAreaInfoEntity entity) public Task<int> UpdateAreaInfoAsync(RuleAreaInfoEntity entity)
{ {
return Context.Updateable<RuleAreaInfoEntity>(entity).ExecuteCommandAsync(); return Context.Updateable<RuleAreaInfoEntity>(entity).ExecuteCommandAsync();
@ -47,14 +46,14 @@ public class KpiAreaRepository:BasicRepository<RuleAreaEntity> ,IKpiAreaReposito
{ {
queryable = queryable.Where(x => x.Name.Contains(query.Name)); queryable = queryable.Where(x => x.Name.Contains(query.Name));
} }
if (query.SystemId.HasValue) if (query.SystemId.HasValue)
{ {
queryable = queryable.Where(x => x.SubSystemId == query.SystemId.Value); queryable = queryable.Where(x => x.SubSystemId == query.SystemId.Value);
} }
return await queryable.OrderBy(x => x.Id, OrderByType.Desc) return await queryable.OrderBy(x => x.Id, OrderByType.Desc)
.Select<AreaDto>(val=>new AreaDto() .Select<AreaDto>(val => new AreaDto()
{ {
Id = val.Id, Id = val.Id,
Name = val.Name, Name = val.Name,
@ -74,7 +73,7 @@ public class KpiAreaRepository:BasicRepository<RuleAreaEntity> ,IKpiAreaReposito
var queryable = Context.Queryable<RuleAreaInfoEntity>(); var queryable = Context.Queryable<RuleAreaInfoEntity>();
queryable = queryable.Where(x => x.AreaId == query.AreaId); queryable = queryable.Where(x => x.AreaId == query.AreaId);
return await queryable.OrderBy(x => x.Id, OrderByType.Desc) return await queryable.OrderBy(x => x.Id, OrderByType.Desc)
.Select<RuleAreaInfoDto>(val=>new RuleAreaInfoDto() .Select<RuleAreaInfoDto>(val => new RuleAreaInfoDto()
{ {
Id = val.Id, Id = val.Id,
AreaId = val.AreaId, AreaId = val.AreaId,
@ -87,9 +86,9 @@ public class KpiAreaRepository:BasicRepository<RuleAreaEntity> ,IKpiAreaReposito
.ToPagedListAsync(query.PageIndex, query.PageSize); .ToPagedListAsync(query.PageIndex, query.PageSize);
} }
public Task<RuleAreaInfoEntity> GetAreaInfoById(int id) public Task<RuleAreaInfoEntity?> GetAreaInfoById(int id)
{ {
return Context.Queryable<RuleAreaInfoEntity>().FirstAsync(val => val.Id == id); return Context.Queryable<RuleAreaInfoEntity>().FirstAsync(val => val.Id == id)!;
} }
/// <summary> /// <summary>

View File

@ -3,28 +3,28 @@ using SJZY.Track.Domain.Dtos.Forewarning;
namespace SJZY.Track.Repository.Repositories; namespace SJZY.Track.Repository.Repositories;
public class RuleCollectRepository: BasicRepository<RuleCollectEntity>, IRuleCollectRepository,ITransientDependency public class RuleItemRepository : BasicRepository<RuleItemEntity>, IRuleItemRepository, ITransientDependency
{ {
/// <summary> /// <summary>
/// 查询预警规则分页信息 /// 查询预警规则分页信息
/// </summary> /// </summary>
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
public Task<UnifyPageResultDto<RuleCollectDto>> QueryForewarningRule(QueryForewarningRuleRequest input) public Task<UnifyPageResultDto<RuleCollectDto>> QueryForewarningRuleItemsAsync(QueryForewarningRuleRequest input)
{ {
var query = Context.Queryable<RuleCollectEntity>() var query = Context.Queryable<RuleItemEntity>()
.Where(val => val.RuleId == input.RuleId); .Where(val => val.RuleId == input.RuleId);
if (!string.IsNullOrEmpty(input.SortField)) if (!string.IsNullOrEmpty(input.SortField))
{ {
query = query.OrderByPropertyName(input.SortField, input.IsAsc ? OrderByType.Asc : OrderByType.Desc); query = query.OrderByPropertyName(input.SortField, input.IsAsc ? OrderByType.Asc : OrderByType.Desc);
} }
return query.Select(val=>MapToDto(val)) return query.Select(val => MapToDto(val))
.ToPagedListAsync(input.PageIndex, input.PageSize); .ToPagedListAsync(input.PageIndex, input.PageSize);
} }
private RuleCollectDto MapToDto(RuleCollectEntity entity) private RuleCollectDto MapToDto(RuleItemEntity entity)
{ {
return new RuleCollectDto() return new RuleCollectDto()
{ {

View File

@ -4,27 +4,28 @@ using SJZY.Track.Domain.Dtos.Forewarning;
namespace SJZY.Track.Repository.Repositories; namespace SJZY.Track.Repository.Repositories;
public class RuleRepository:BasicRepository<RuleEntity> ,IRuleRepository,ITransientDependency public class RuleRepository : BasicRepository<RuleEntity>, IRuleRepository, ITransientDependency
{ {
public async Task<int> CreateForewarning(RuleEntity rule, RuleCollectEntity[] factorList) public async Task<int> CreateForewarning(RuleEntity rule, RuleItemEntity[] ruleItems)
{ {
using var tran = TransactionHelper.GetReadCommitted(); using var tran = TransactionHelper.GetReadCommitted();
var ruleId = await InsertReturnIdentityAsync(rule); var ruleId = await InsertReturnIdentityAsync(rule);
foreach (var item in factorList) foreach (var item in ruleItems)
{ {
item.RuleId = ruleId; item.RuleId = ruleId;
} }
await Context.Insertable(factorList).ExecuteCommandAsync();
await Context.Insertable(ruleItems).ExecuteCommandAsync();
tran.Complete(); tran.Complete();
return ruleId; return ruleId;
} }
public async Task UpdateForewarning(RuleEntity rule,RuleCollectEntity[] factorList) public async Task UpdateForewarning(RuleEntity rule, RuleItemEntity[] factorList)
{ {
using var tran = TransactionHelper.GetReadCommitted(); using var tran = TransactionHelper.GetReadCommitted();
await UpdateAsync(rule); await UpdateAsync(rule);
await Context.Deleteable<RuleCollectEntity>().Where(x=>x.RuleId==rule.Id).ExecuteCommandAsync(); await Context.Deleteable<RuleItemEntity>().Where(x => x.RuleId == rule.Id).ExecuteCommandAsync();
await Context.Insertable(factorList).ExecuteCommandAsync(); await Context.Insertable(factorList).ExecuteCommandAsync();
tran.Complete(); tran.Complete();
} }
@ -34,12 +35,13 @@ public class RuleRepository:BasicRepository<RuleEntity> ,IRuleRepository,ITransi
/// </summary> /// </summary>
/// <param name="input"></param> /// <param name="input"></param>
/// <returns></returns> /// <returns></returns>
public Task<UnifyPageResultDto<RuleEntity>> QueryForewarning(QueryForewarningRequest input) public Task<UnifyPageResultDto<RuleEntity>> QueryForewarningRuleAsync(QueryForewarningRequest input)
{ {
var query = Context.Queryable<RuleEntity>() var query = Context.Queryable<RuleEntity>()
.WhereIF(input.SystemId.HasValue,val=>val.SubSystemId == input.SystemId) .WhereIF(input.SystemId.HasValue, val => val.SubSystemId == input.SystemId)
.WhereIF(string.IsNullOrEmpty(input.KeyWord), val=> val.CustomName.Contains(input.KeyWord)||val.Name.Contains(input.KeyWord)); .WhereIF(!string.IsNullOrEmpty(input.KeyWord),
val => val.CustomName.Contains(input.KeyWord!) || val.Name.Contains(input.KeyWord!));
if (!string.IsNullOrEmpty(input.SortField)) if (!string.IsNullOrEmpty(input.SortField))
{ {
query = query.OrderByPropertyName(input.SortField, input.IsAsc ? OrderByType.Asc : OrderByType.Desc); query = query.OrderByPropertyName(input.SortField, input.IsAsc ? OrderByType.Asc : OrderByType.Desc);
@ -47,7 +49,4 @@ public class RuleRepository:BasicRepository<RuleEntity> ,IRuleRepository,ITransi
return query.ToPagedListAsync(input.PageIndex, input.PageSize); return query.ToPagedListAsync(input.PageIndex, input.PageSize);
} }
} }