add-validation:增加运输时效规则场景的新增/修改校验
- 同一规则主体下,不允许出现因素完全相同的场景 fix:修复运输时效预警摘要中因素排序不正确 fix:修复新增修改轨迹没有更新订单主表的轨迹状态
This commit is contained in:
parent
9e48bbf9ac
commit
c63ead1bff
@ -77,6 +77,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
||||
await _orderRepository.UpdateRangeAsync(updateOrders, x => new
|
||||
{
|
||||
x.IsCompleted,
|
||||
x.LatestTrackStatus,
|
||||
x.LatestTrackContent,
|
||||
x.LatestTrackEnContent,
|
||||
x.LatestTrackPlace,
|
||||
@ -98,9 +99,9 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
|
||||
return await _orderRepository.GetListAsync(order => orderIds.Contains(order.Id), order => new OrderEntity
|
||||
{
|
||||
Id = order.Id,
|
||||
|
||||
// 轨迹
|
||||
IsCompleted = order.IsCompleted,
|
||||
LatestTrackStatus = order.LatestTrackStatus,
|
||||
LatestTrackContent = order.LatestTrackContent,
|
||||
LatestTrackEnContent = order.LatestTrackEnContent,
|
||||
LatestTrackPlace = order.LatestTrackPlace,
|
||||
|
||||
@ -10,42 +10,61 @@ public sealed class TransportWarningSceneBO
|
||||
/// <summary>
|
||||
/// 场景唯一id (传0视为新增)
|
||||
/// </summary>
|
||||
public int Id { get; set; }
|
||||
public int Id { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 预警规则主体id
|
||||
/// </summary>
|
||||
public int WarningId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否中转(单一)
|
||||
/// </summary>
|
||||
public bool? IsTransit { get; set; }
|
||||
public int WarningId { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 货物类型(多个,分割)
|
||||
/// </summary>
|
||||
public string? CargoType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 起运港口(多个,分割)
|
||||
/// </summary>
|
||||
public string? LeavePort { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品编码(多个,分割)
|
||||
/// </summary>
|
||||
public string? ProductCode { get; set; }
|
||||
public string? CargoType { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 月份(多个/分割)
|
||||
/// </summary>
|
||||
public string? Months { get; set; }
|
||||
public string? Months { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 区域Id(单一)
|
||||
/// </summary>
|
||||
public int? AreaId { get; set; }
|
||||
public int? AreaId { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否中转(单一)
|
||||
/// </summary>
|
||||
public bool? IsTransit { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 起运港口(多个,分割)
|
||||
/// </summary>
|
||||
public string? LeavePort { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 产品编码(多个,分割)
|
||||
/// </summary>
|
||||
public string? ProductCode { get; }
|
||||
|
||||
public TransportWarningSceneBO(int id, int warningId, string? cargoType, string? months, int? areaId, bool? isTransit, string? leavePort, string? productCode)
|
||||
{
|
||||
Id = id;
|
||||
WarningId = warningId;
|
||||
CargoType = cargoType;
|
||||
|
||||
// 如果有月份则排序之后在写入
|
||||
if (!string.IsNullOrWhiteSpace(months))
|
||||
{
|
||||
var sorted = months.Split('/').Select(int.Parse).OrderBy(x => x).ToList();
|
||||
Months = string.Join('/', sorted);
|
||||
}
|
||||
|
||||
AreaId = areaId;
|
||||
IsTransit = isTransit;
|
||||
LeavePort = leavePort;
|
||||
ProductCode = productCode;
|
||||
}
|
||||
|
||||
public bool CanHitScene(OrderEntity order, List<KpiAreaInfo>? ruleAreas)
|
||||
{
|
||||
@ -136,17 +155,16 @@ public sealed class TransportWarningSceneBO
|
||||
|
||||
public static TransportWarningSceneBO From(TransportWarningSceneEntity entity)
|
||||
{
|
||||
return new TransportWarningSceneBO
|
||||
{
|
||||
Id = entity.Id,
|
||||
WarningId = entity.WarningId,
|
||||
CargoType = entity.CargoType,
|
||||
Months = entity.Months,
|
||||
AreaId = entity.AreaId,
|
||||
IsTransit = entity.IsTransit,
|
||||
LeavePort = entity.LeavePort,
|
||||
ProductCode = entity.ProductCode
|
||||
};
|
||||
return new TransportWarningSceneBO(
|
||||
entity.Id,
|
||||
entity.WarningId,
|
||||
entity.CargoType,
|
||||
entity.Months,
|
||||
entity.AreaId,
|
||||
entity.IsTransit,
|
||||
entity.LeavePort,
|
||||
entity.ProductCode
|
||||
);
|
||||
}
|
||||
|
||||
public static List<TransportWarningSceneBO> From(List<TransportWarningSceneEntity> entities)
|
||||
@ -156,16 +174,36 @@ public sealed class TransportWarningSceneBO
|
||||
|
||||
public static TransportWarningSceneBO From(UpsertTransportWarningSceneInput input)
|
||||
{
|
||||
return new TransportWarningSceneBO
|
||||
{
|
||||
Id = input.Id,
|
||||
WarningId = input.WarningId,
|
||||
CargoType = input.CargoType,
|
||||
Months = input.Months,
|
||||
AreaId = input.AreaId,
|
||||
IsTransit = input.IsTransit,
|
||||
LeavePort = input.LeavePort,
|
||||
ProductCode = input.ProductCode
|
||||
};
|
||||
return new TransportWarningSceneBO(
|
||||
input.Id,
|
||||
input.WarningId,
|
||||
input.CargoType,
|
||||
input.Months,
|
||||
input.AreaId,
|
||||
input.IsTransit,
|
||||
input.LeavePort,
|
||||
input.ProductCode
|
||||
);
|
||||
}
|
||||
|
||||
private bool Equals(TransportWarningSceneBO other)
|
||||
{
|
||||
return WarningId == other.WarningId
|
||||
&& IsTransit == other.IsTransit
|
||||
&& CargoType == other.CargoType
|
||||
&& LeavePort == other.LeavePort
|
||||
&& ProductCode == other.ProductCode
|
||||
&& Months == other.Months
|
||||
&& AreaId == other.AreaId;
|
||||
}
|
||||
|
||||
public override bool Equals(object? obj)
|
||||
{
|
||||
return ReferenceEquals(this, obj) || obj is TransportWarningSceneBO other && Equals(other);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return HashCode.Combine(WarningId, IsTransit, CargoType, LeavePort, ProductCode, Months, AreaId);
|
||||
}
|
||||
}
|
||||
|
||||
@ -104,6 +104,14 @@ public class TransportWarningService : ApplicationService
|
||||
// 月份
|
||||
if (!string.IsNullOrWhiteSpace(entity.Months))
|
||||
list.Add($"{entity.Months.Replace("/", ",")}月份");
|
||||
// 区域名称
|
||||
if (entity.AreaId != null && areaNameDict != null)
|
||||
{
|
||||
var areaName = areaNameDict.GetValueOrDefault(entity.AreaId.Value);
|
||||
if (!string.IsNullOrWhiteSpace(areaName))
|
||||
list.Add($"{areaName}");
|
||||
}
|
||||
|
||||
// 中转
|
||||
if (entity.IsTransit != null)
|
||||
list.Add($"中转为{(entity.IsTransit.Value ? "是" : "否")}");
|
||||
@ -113,13 +121,6 @@ public class TransportWarningService : ApplicationService
|
||||
// 产品编码
|
||||
if (!string.IsNullOrWhiteSpace(entity.ProductCode))
|
||||
list.Add($"{entity.ProductCode}");
|
||||
// 区域名称
|
||||
if (entity.AreaId != null && areaNameDict != null)
|
||||
{
|
||||
var areaName = areaNameDict.GetValueOrDefault(entity.AreaId.Value);
|
||||
if (!string.IsNullOrWhiteSpace(areaName))
|
||||
list.Add($"{areaName}");
|
||||
}
|
||||
|
||||
return string.Join(separator, list);
|
||||
}
|
||||
@ -300,20 +301,21 @@ public class TransportWarningService : ApplicationService
|
||||
}
|
||||
|
||||
var postBo = TransportWarningSceneBO.From(input);
|
||||
// 查出旧场景
|
||||
var oldScene = await _warningRuleRepository.GetTransportSceneAsync(input.WarningId, input.Id);
|
||||
var oldBo = oldScene != null ? TransportWarningSceneBO.From(oldScene) : null;
|
||||
|
||||
// 如果有月份则排序之后在写入
|
||||
if (!string.IsNullOrWhiteSpace(postBo.Months))
|
||||
// 查出这个规则主体下的所有场景
|
||||
var oldScenes = await _warningRuleRepository.GetTransportSceneAsync(input.WarningId);
|
||||
var oldBos = oldScenes.Count > 0 ? TransportWarningSceneBO.From(oldScenes) : Empty<TransportWarningSceneBO>.List;
|
||||
|
||||
// 验证规则场景是否重复
|
||||
if (oldBos.Any(old => old.Equals(postBo) && old.Id != postBo.Id))
|
||||
{
|
||||
var sorted = postBo.Months.Split('/').Select(int.Parse).OrderBy(x => x).ToList();
|
||||
postBo.Months = string.Join('/', sorted);
|
||||
throw new BusinessException(message: "同一规则主体下,不允许出现因素完全相同的场景!");
|
||||
}
|
||||
|
||||
// 更新或者新增
|
||||
var id = await _warningRuleRepository.UpsertTransportSceneReturnIdAsync(postBo.ToEntity());
|
||||
|
||||
var oldBo = oldBos.FirstOrDefault(x => x.Id == postBo.Id);
|
||||
if (oldBo != null)
|
||||
await _transportWarningHandler.HandleSceneChangedAsync(rule, oldBo, postBo);
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user