Merge remote-tracking branch 'origin/S04轨迹预警' into S04轨迹预警

This commit is contained in:
xiaolipro 2024-07-26 12:59:11 +08:00
commit e4b8fb4fcf
19 changed files with 611 additions and 22 deletions

View File

@ -52,8 +52,14 @@ public class EditTrackPullContentInput
/// <summary>
/// 轨迹时区GMT
/// </summary>
[Obsolete]
public double? TrackTimeZone { get; set; }
/// <summary>
/// 兜底轨迹时区发生地
/// </summary>
public int? TrackTimePlaceValue { get; set; }
/// <summary>
/// 是否完结
/// </summary>

View File

@ -37,13 +37,13 @@ public class TrackPullContentConfigDto
/// </summary>
public int? TrackPlaceValue { get; set; }
/// <summary>
/// 轨迹时区GMT值
/// </summary>
public float? TrackTimeZoneValue { get; set; }
/// <summary>
/// 订单是否完成(由轨迹刷新配置决定)
/// </summary>
public bool IsCompleted { get; set; }
/// <summary>
/// 轨迹时区发生地参数值
/// </summary>
public int? TrackZonePlaceValue { get; set; }
}

View File

@ -0,0 +1,11 @@
namespace SJZY.Track.Application.Contract.Events;
public class PullChangeBottomLineUpdateOrderEvent
{
public List<int> OrderIds { get; set; } = null!;
/// <summary>
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
/// </summary>
public int DeficiencyTagValue { get; set; }
}

View File

@ -0,0 +1,23 @@
using DotNetCore.CAP;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Consts;
using Volo.Abp.DependencyInjection;
namespace SJZY.Track.Application.CAP.EventHandlers;
public class PullChangeBottomLineUpdateOrderEventHandler :ITransientDependency, ICapSubscribe
{
private readonly IOrderRepository _orderRepository;
public PullChangeBottomLineUpdateOrderEventHandler(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
}
[CapSubscribe(GlobalConst.PullChangeBottomLineUpdateOrderSubscribe)]
public async Task ConsumerAsync(PullChangeBottomLineUpdateOrderEvent @event)
{
await _orderRepository.UpdateBatchIdsAsync(@event.OrderIds, @event.DeficiencyTagValue);
}
}

View File

@ -12,6 +12,7 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Consts;
using SJZY.Track.Domain.Enums;
using SJZY.Track.Domain.Queries;
using Volo.Abp.DependencyInjection;
namespace SJZY.Track.Application.CAP.EventHandlers;
@ -22,15 +23,17 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
private readonly ICapPublisher _capPublisher;
private readonly ITrackPullCacheService _trackPullCacheService;
private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly ITimezoneQueries _timezoneQueries;
public TrackRefreshEventHandler(IOrderRepository orderRepository,
ICapPublisher capPublisher, ITrackPullCacheService trackPullCacheService,
ITrackDetailsRepository trackDetailsRepository)
ITrackDetailsRepository trackDetailsRepository, ITimezoneQueries timezoneQueries)
{
_orderRepository = orderRepository;
_capPublisher = capPublisher;
_trackPullCacheService = trackPullCacheService;
_trackDetailsRepository = trackDetailsRepository;
_timezoneQueries = timezoneQueries;
}
[CapSubscribe(GlobalConst.TrackRefreshSubscribe, Group = GlobalConst.TrackRefreshSubscribe)]
@ -172,21 +175,12 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
var trackPlace = paramConfig.TrackPlaceName == null
? null
: trackToken[paramConfig.TrackPlaceName]?.Value<string>();
if (trackPlace.IsNullOrWhiteSpace())
var hasPlaceBottomLine = false; //执行了兜底但是没有兜底住,需要记录
if (trackPlace.IsNullOrWhiteSpace() && matchedContentConfig?.TrackPlaceValue != null && matchedContentConfig.TrackPlaceValue.HasValue)
{
Expression<Func<OrderEntity, string?>> resultExpression =
(TrackLocationValue?)matchedContentConfig?.TrackPlaceValue switch
{
TrackLocationValue.ArrivalPort => x => x.ArrivalPort,
TrackLocationValue.ArriveCity => x => x.ArrivalCity,
TrackLocationValue.ArrivalCountry => x => x.ArrivalCountry,
TrackLocationValue.LeavePort => x => x.LeavePort,
TrackLocationValue.LeaveCity => x => x.LeaveCity,
TrackLocationValue.LeaveCountry => x => x.LeaveCountry,
_ => x => x.LeaveCountry
};
trackPlace = await _orderRepository.GetFirstAsync(x =>
x.Id == context.OrderId, resultExpression);
//兜底没配置的就不需要兜底,拉取的发生地没就没
trackPlace = await GetPlaceByOrder(matchedContentConfig!.TrackPlaceValue.Value,context.OrderId);
hasPlaceBottomLine = string.IsNullOrWhiteSpace(trackPlace);
}
// 轨迹发生时间
@ -198,6 +192,17 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
? null
: trackToken[paramConfig.TrackTimeZoneName]?.Value<float>();
//兜底时区
var hasTimezoneBottomLine = false; //执行了兜底但是没有兜底住,需要记录
if (!trackTimeZone.HasValue && matchedContentConfig?.TrackZonePlaceValue != null && matchedContentConfig.TrackZonePlaceValue.HasValue)
{
//兜底没配置的就不需要兜底,拉取的发生地没就没
var timezone= await GetTimezone(matchedContentConfig,context.OrderId);
trackTimeZone = timezone;
hasTimezoneBottomLine = !timezone.HasValue;
}
if (matchedContentConfig is null)
{
var notMappedEvent = new TrackInsertForNotMappedEvent
@ -209,7 +214,7 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
OriginTrackData = JsonConvert.SerializeObject(trackToken),
TrackPlace = trackPlace ?? GlobalConst.EmptyString,
TrackTime = trackTime ?? DateTime.Now,
TrackTimeZone = trackTimeZone ?? matchedContentConfig?.TrackTimeZoneValue ?? 8
TrackTimeZone = trackTimeZone ?? 8
};
if (paramConfig.TrackContentName != null)
{
@ -246,11 +251,74 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
TrackCode = matchedContentConfig.TrackContentCode,
TrackPlace = trackPlace ?? GlobalConst.EmptyString,
TrackTime = trackTime ?? DateTime.Now,
TrackTimeZone = trackTimeZone ?? matchedContentConfig.TrackTimeZoneValue ?? 8
TrackTimeZone = trackTimeZone ?? 8
};
trackUpsertEvent.IsAdd =
!await _trackDetailsRepository.AnyByCodeAsync(context.OrderId, matchedContentConfig.TrackContentCode);
await _capPublisher.PublishAsync(GlobalConst.TrackUpsertForRefreshSubscribe, trackUpsertEvent);
// 触发了兜底,但是没有兜底住,对订单进行标记
if (hasPlaceBottomLine || hasTimezoneBottomLine)
{
//1表示时区,2表示发生地,3表示两种
var placeTagValue = hasPlaceBottomLine ? 2 : 0;
var timezoneTagValue = hasTimezoneBottomLine ? 1 : 0;
PullChangeBottomLineUpdateOrderEvent deficiencyTagEvent = new PullChangeBottomLineUpdateOrderEvent
{
OrderIds = new List<int>(){context.OrderId},
DeficiencyTagValue = placeTagValue+timezoneTagValue
};
await _capPublisher.PublishAsync(GlobalConst.PullChangeBottomLineUpdateOrderSubscribe, deficiencyTagEvent);
}
}
/// <summary>
/// 根据订单id获取兜底位置
/// </summary>
/// <param name="trackValue"></param>
/// <param name="orderId"></param>
/// <returns></returns>
private Task<string?> GetPlaceByOrder(int trackValue,int orderId)
{
Expression<Func<OrderEntity, string?>> resultExpression =
(TrackLocationValue)trackValue switch
{
TrackLocationValue.ArrivalPort => x => x.ArrivalPort,
TrackLocationValue.ArriveCity => x => x.ArrivalCity,
TrackLocationValue.ArrivalCountry => x => x.ArrivalCountry,
TrackLocationValue.LeavePort => x => x.LeavePort,
TrackLocationValue.LeaveCity => x => x.LeaveCity,
TrackLocationValue.LeaveCountry => x => x.LeaveCountry,
_ => x => x.LeaveCountry
};
return _orderRepository.GetFirstAsync(x => x.Id == orderId, resultExpression);
}
/// <summary>
/// 获取时区
/// </summary>
/// <param name="matchedContentConfig"></param>
/// <param name="orderId"></param>
/// <returns></returns>
private async Task<float?> GetTimezone(TrackPullContentConfigDto matchedContentConfig,int orderId )
{
var placeOrCode = await GetPlaceByOrder(matchedContentConfig!.TrackZonePlaceValue.Value,orderId);
string timezone = null;
if (!string.IsNullOrEmpty(placeOrCode))
{
if (matchedContentConfig!.TrackZonePlaceValue.Value == (int)TrackLocationValue.ArrivalPort
|| matchedContentConfig!.TrackZonePlaceValue.Value == (int)TrackLocationValue.LeavePort)
{
timezone = await _timezoneQueries.GetPortTimezone(placeOrCode);
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
}
timezone = await _timezoneQueries.GetCityTimezone(placeOrCode);
return DateTimeHelper.ConvertTimeZoneToFloat(timezone);
}
return null;
}
}

View File

@ -36,4 +36,25 @@ public static class DateTimeHelper
//时区是整数丢掉浮点数部分
return format.Replace("hh", ((int)timezone).ToString());
}
/// <summary>
/// 转换主数据中心类似GMT-09:00这种的时区为浮点数
/// </summary>
/// <param name="timeZone">分区</param>
/// <returns></returns>
/// <exception cref="ArgumentException"></exception>
public static float? ConvertTimeZoneToFloat(string timeZone)
{
if (string.IsNullOrEmpty(timeZone)|| !timeZone.StartsWith("GMT"))
{
return null;
}
var sign = timeZone[3] == '+' ? 1 : -1;
var parts = timeZone.Substring(4).Split(':');
var hours = int.Parse(parts[0]);
var minutes = int.Parse(parts[1]);
return sign * (hours + minutes / 60f);
}
}

View File

@ -31,6 +31,14 @@ public interface IOrderRepository : IBasicRepository<OrderEntity>
/// <returns></returns>
Task<int> PushWarnOrdersAsync();
/// <summary>
/// 更新缺失标记,时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
/// </summary>
/// <param name="ids">订单id</param>
/// <param name="newValue">值</param>
/// <returns></returns>
Task<int> UpdateBatchIdsAsync(List<int> ids, int newValue);
#region 订单关联
/// <summary>

View File

@ -149,6 +149,12 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot
/// </summary>
[SugarColumn(ColumnName = "ProductCode")]
public string? ProductCode { get; set; }
/// <summary>
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
/// </summary>
[SugarColumn(ColumnName = "DeficiencyTag")]
public int? DeficiencyTag { get; set; }
[SugarColumn(IsIgnore = true)] public List<OrderFlightEntity> OrderFlights { get; set; }
[SugarColumn(IsIgnore = true)] public List<OrderTemplateEntity> OrderTemplates { get; set; }

View File

@ -71,4 +71,10 @@ public class TrackPullContentConfigEntity : IFullAuditedBasicEntitys, IEntity
/// </summary>
[SugarColumn(ColumnName = "IsCompleted")]
public bool IsCompleted { get; set; }
/// <summary>
/// 轨迹时区发生地参数值
/// </summary>
[SugarColumn(ColumnName = "TrackZonePlaceValue")]
public int? TrackZonePlaceValue { get; set; }
}

View File

@ -56,4 +56,9 @@ public partial class GlobalConst
/// 关联订单后补轨迹
/// </summary>
public const string OrderLinkAfterFillTrack = "SJZY.Track.OrderLinkAfterFillTrack";
/// <summary>
/// 拉取轨迹触发兜底后更新订单
/// </summary>
public const string PullChangeBottomLineUpdateOrderSubscribe = "SJZY.Track.PullChangeBottomLineUpdateOrder";
}

View File

@ -36,4 +36,14 @@ public partial class GlobalConst
/// kpi区域redis key前缀
/// </summary>
public const string KpiAreaKeyPrefix = "KpiArea";
/// <summary>
/// 城市时区redis key前缀
/// </summary>
public const string CityTimezoneKeyPrefix = "CityTimezone";
/// <summary>
/// 港口时区redis key前缀
/// </summary>
public const string PortTimezoneKeyPrefix = "PortTimezone";
}

View File

@ -0,0 +1,14 @@
namespace SJZY.Track.Domain.Dtos.Common;
public class CityTimezoneDto
{
/// <summary>
/// 城市英文名称
/// </summary>
public string? CityEnName { get; set; }
/// <summary>
/// 时区
/// </summary>
public string Timezone { get; set; }
}

View File

@ -0,0 +1,14 @@
namespace SJZY.Track.Domain.Dtos.Common;
public class PortTimezoneDto
{
/// <summary>
/// 城市英文名称
/// </summary>
public string? PortCode { get; set; }
/// <summary>
/// 时区
/// </summary>
public string Timezone { get; set; }
}

View File

@ -36,6 +36,11 @@ public class GetTrackPullContentListCacheVO
/// 轨迹发生地参数值(主数据枚举)
/// </summary>
public int? TrackPlaceValue { get; set; }
/// <summary>
/// 兜底时区轨迹发生地参数值(TrackLocationValue)
/// </summary>
public int? TrackTimePlaceValue { get; set; }
/// <summary>
/// 轨迹时区GMT
@ -46,4 +51,9 @@ public class GetTrackPullContentListCacheVO
/// 订单是否完成(由轨迹刷新配置决定)
/// </summary>
public bool IsCompleted { get; set; }
/// <summary>
/// 轨迹时区发生地参数值
/// </summary>
public int? TrackZonePlaceValue { get; set; }
}

View File

@ -0,0 +1,20 @@
using SJZY.Track.Domain.Dtos.Common;
namespace SJZY.Track.Domain.Queries;
public interface ITimezoneQueries
{
/// <summary>
/// 通过城市英文名称获取时区
/// </summary>
/// <param name="cityEnName"></param>
/// <returns></returns>
Task<string> GetCityTimezone(string cityEnName);
/// <summary>
/// 通过港口三字码获取时区
/// </summary>
/// <param name="airCode"></param>
/// <returns></returns>
Task<string> GetPortTimezone(string airCode);
}

View File

@ -0,0 +1,121 @@
using SqlSugar;
namespace SJZY.Track.Domain.VEntities;
/// <summary>
/// 空港
/// </summary>
[SugarTable("t_airport", "空港")]
public class VAirportEntity : IFullAuditedBasicEntitys
{
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 空运航线id
/// </summary>
[SugarColumn(ColumnName = "AirRouteId")]
public int AirRouteId { get; set; }
/// <summary>
/// 城市id
/// </summary>
[SugarColumn(ColumnName = "CityId")]
public int CityId { get; set; }
/// <summary>
/// 主港口,空港id
/// </summary>
[SugarColumn(ColumnName = "MId", IsNullable = true)]
public int? MId { get; set; }
/// <summary>
/// 中文名
/// </summary>
[SugarColumn(ColumnName = "CnName")]
public string CnName { get; set; }
/// <summary>
/// 英文名
/// </summary>
[SugarColumn(ColumnName = "EnName")]
public string EnName { get; set; }
/// <summary>
/// 代码
/// </summary>
[SugarColumn(ColumnName = "Code", IsNullable = true)]
public string Code { get; set; }
/// <summary>
/// 海关代码
/// </summary>
[SugarColumn(ColumnName = "CustomsCode", IsNullable = true)]
public string CustomsCode { get; set; }
/// <summary>
/// 海关名称
/// </summary>
[SugarColumn(ColumnName = "CustomsName", IsNullable = true)]
public string CustomsName { get; set; }
/// <summary>
/// 离境口岸代码
/// </summary>
[SugarColumn(ColumnName = "DeparturePortCode", IsNullable = true)]
public string DeparturePortCode { get; set; }
/// <summary>
/// 离境口岸名称
/// </summary>
[SugarColumn(ColumnName = "DeparturePortName", IsNullable = true)]
public string DeparturePortName { get; set; }
/// <summary>
/// 国内排序
/// </summary>
[SugarColumn(ColumnName = "DomcSort")]
public int DomcSort { get; set; }
/// <summary>
/// 国外排序
/// </summary>
[SugarColumn(ColumnName = "OverSort")]
public int OverSort { get; set; }
/// <summary>
/// 备注
/// </summary>
[SugarColumn(ColumnName = "Remark", IsNullable = true)]
public string Remark { get; set; }
/// <summary>
/// 创建人
/// </summary>
[SugarColumn(ColumnName = "CreateUserId", IsNullable = true)]
public int? CreateUserId { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "CreateTime", IsNullable = false, DefaultValue = "CURRENT_TIMESTAMP")]
public DateTime CreateTime { get; set; }
/// <summary>
/// 更新人
/// </summary>
[SugarColumn(ColumnName = "UpdateUserId", IsNullable = true)]
public int? UpdateUserId { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "UpdateTime", IsNullable = true)]
public DateTime? UpdateTime { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[SugarColumn(ColumnName = "IsDeleted")]
public bool IsDeleted { get; set; }
}

View File

@ -0,0 +1,140 @@
using SqlSugar;
using System;
namespace SJZY.Track.Domain.VEntities;
[SugarTable("t_city")]
public class VCityEntity : IFullAuditedBasicEntitys
{
/// <summary>
/// 主键
/// </summary>
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
/// <summary>
/// 国家id
/// </summary>
[SugarColumn(ColumnName = "CountryId")]
public int CountryId { get; set; }
/// <summary>
/// 省份id
/// </summary>
[SugarColumn(ColumnName = "ProvinceId", IsNullable = true)]
public int? ProvinceId { get; set; }
/// <summary>
/// 中文名
/// </summary>
[SugarColumn(ColumnName = "CnName")]
public string CnName { get; set; }
/// <summary>
/// 英文名
/// </summary>
[SugarColumn(ColumnName = "EnName")]
public string EnName { get; set; }
/// <summary>
/// 联合国code
/// </summary>
[SugarColumn(ColumnName = "UnCode", IsNullable = true)]
public string UnCode { get; set; }
/// <summary>
/// 所区分组(1华南,2华东,3华北,4 西南,5华中)
/// </summary>
[SugarColumn(ColumnName = "CityType", IsNullable = true)]
public int? CityType { get; set; }
/// <summary>
/// 时区
/// </summary>
[SugarColumn(ColumnName = "TimeZone", IsNullable = true)]
public string TimeZone { get; set; }
/// <summary>
/// 排序
/// </summary>
[SugarColumn(ColumnName = "Sort")]
public int Sort { get; set; }
/// <summary>
/// 备注
/// </summary>
[SugarColumn(ColumnName = "Remark", IsNullable = true)]
public string Remark { get; set; }
/// <summary>
/// 国家统计局统计用区划代码
/// </summary>
[SugarColumn(ColumnName = "StatisticalZoningCode", IsNullable = true)]
public string StatisticalZoningCode { get; set; }
/// <summary>
/// 创建人
/// </summary>
[SugarColumn(ColumnName = "CreateUserId", IsNullable = true)]
public int? CreateUserId { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[SugarColumn(ColumnName = "CreateTime", IsNullable = false, DefaultValue = "CURRENT_TIMESTAMP")]
public DateTime CreateTime { get; set; }
/// <summary>
/// 更新人
/// </summary>
[SugarColumn(ColumnName = "UpdateUserId", IsNullable = true)]
public int? UpdateUserId { get; set; }
/// <summary>
/// 更新时间
/// </summary>
[SugarColumn(ColumnName = "UpdateTime", IsNullable = true)]
public DateTime? UpdateTime { get; set; }
/// <summary>
/// 是否删
/// </summary>
[SugarColumn(ColumnName = "IsDeleted")]
public bool IsDeleted { get; set; }
/// <summary>
/// 维护时区
/// </summary>
[SugarColumn(ColumnName = "MaintainTimeZone", IsNullable = true)]
public decimal? MaintainTimeZone { get; set; }
/// <summary>
/// 经度
/// </summary>
[SugarColumn(ColumnName = "Longitude", IsNullable = true)]
public string Longitude { get; set; }
/// <summary>
/// 纬度
/// </summary>
[SugarColumn(ColumnName = "Latitude", IsNullable = true)]
public string Latitude { get; set; }
/// <summary>
/// 海拔
/// </summary>
[SugarColumn(ColumnName = "Elevation", IsNullable = true)]
public string Elevation { get; set; }
/// <summary>
/// 语言
/// </summary>
[SugarColumn(ColumnName = "Language", IsNullable = true)]
public string Language { get; set; }
/// <summary>
/// timezoneURL
/// </summary>
[SugarColumn(ColumnName = "TimezoneURL", IsNullable = true)]
public string TimezoneURL { get; set; }
}

View File

@ -0,0 +1,101 @@
using System.Reflection.Metadata;
using SJZY.Track.Domain.Consts;
using SJZY.Track.Domain.Dtos.Common;
using SJZY.Track.Domain.Queries;
using SJZY.Track.Domain.VEntities;
namespace SJZY.Track.Repository.Queries;
public class TimezoneQueries:ITimezoneQueries, ISugarRepository, ITransientDependency
{
public ISqlSugarClient Context { get; set; }
public TimezoneQueries()
{
Context = SqlsugarScopeBasic.GetContextSafely("default");
}
private string GetCityKey(string cityEnName)
{
return $"{GlobalConst.CityTimezoneKeyPrefix}:{cityEnName}";
}
private string GetPortKey(string airCode)
{
return $"{GlobalConst.PortTimezoneKeyPrefix}:{airCode}";
}
/// <summary>
/// 获取城市时区
/// </summary>
/// <param name="cityEnName">城市英文名称</param>
/// <returns>时区</returns>
public async Task<string> GetCityTimezone(string cityEnName)
{
var key =GetCityKey(cityEnName);
var timezone = RedisHelper.Client.Get<string>(key);
if (!string.IsNullOrEmpty(timezone))
{
return timezone;
}
var cityTimezone = await GetTimezoneByCityName(cityEnName);
if (cityTimezone == null!)
{
await RedisHelper.Client.SetAsync(key, string.Empty, TimeSpan.FromSeconds(20));
return string.Empty;
}
await RedisHelper.Client.SetAsync(key, cityTimezone.Timezone, TimeSpan.FromHours(6));
return cityTimezone.Timezone;
}
/// <summary>
/// 获取港口时区
/// </summary>
/// <param name="airCode">港口三字码</param>
/// <returns>时区</returns>
public async Task<string> GetPortTimezone(string airCode)
{
var key = GetPortKey(airCode);
var timezone = RedisHelper.Client.Get<string>(key);
if (!string.IsNullOrEmpty(timezone))
{
return timezone;
}
var portTimezone = await GetTimezoneByPortCode(airCode);
if (portTimezone == null!)
{
await RedisHelper.Client.SetAsync(key, string.Empty, TimeSpan.FromSeconds(20));
return string.Empty;
}
await RedisHelper.Client.SetAsync(key, portTimezone.Timezone, TimeSpan.FromHours(6));
return portTimezone.Timezone;
}
private Task<CityTimezoneDto> GetTimezoneByCityName(string cityEnName)
{
return Context.Queryable<VCityEntity>().Where(val => !val.IsDeleted && val.EnName == cityEnName)
.Select(val=>new CityTimezoneDto()
{
CityEnName =val.EnName,
Timezone = val.TimeZone
})
.FirstAsync();
}
private Task<PortTimezoneDto> GetTimezoneByPortCode(string airCode)
{
return Context.Queryable<VCityEntity>()
.InnerJoin<VAirportEntity>((city, airport) => city.Id == airport.CityId)
.Where((city,airport) => !airport.IsDeleted && !city.IsDeleted && airport.Code == airCode)
.Select((city,airport)=>new PortTimezoneDto()
{
PortCode = airport.Code,
Timezone = city.TimeZone
})
.FirstAsync();
}
}

View File

@ -19,6 +19,11 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
tran.Complete();
}
public Task<int> UpdateBatchIdsAsync(List<int> ids, int newValue)
{
return Context.Ado.ExecuteCommandAsync("UPDATE `t_order` SET `DeficiencyTag` = @newValue WHERE `Id` IN @ids", new { ids, newValue });
}
public async Task UpdateOrderAsync(OrderEntity order)
{
using var tran = TransactionHelper.GetReadCommitted();