using Furion; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.EventBus; using Furion.FriendlyException; using Furion.LinqBuilder; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Myshipping.Application.ConfigOption; using Myshipping.Application.Entity; using Myshipping.Application.Event; using Myshipping.Application.Service.BookingOrder.Dto; using Myshipping.Application.Service.BookingSlot.Dto; using Myshipping.Application.Service.Fee.Dto; using Myshipping.Core; using Myshipping.Core.Service; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using Yitter.IdGenerator; namespace Myshipping.Application { /// /// 费用代码 /// [ApiDescriptionSettings("Application", Name = "FeeCode", Order = 1)] public class FeeCodeService : IDynamicApiController, ITransient { private readonly SqlSugarRepository _repCode; private readonly ILogger _logger; private readonly ISysCacheService _cache; private readonly IEventPublisher _publisher; public FeeCodeService(SqlSugarRepository repCode, ILogger logger, ISysCacheService cache, IEventPublisher publisher) { _repCode = repCode; _logger = logger; _cache = cache; _publisher = publisher; } /// /// 费用代码查询 /// /// /// [HttpPost("/FeeCode/Page")] public async Task Page(FeeCodePageInput input) { var entities = await _repCode.AsQueryable() .WhereIF(!string.IsNullOrEmpty(input.Code), u => u.Code.Contains(input.Code)) .WhereIF(!string.IsNullOrEmpty(input.Name), u => u.Name.Contains(input.Name)) .ToPagedListAsync(input.PageNo, input.PageSize); var result = entities.Adapt>(); return result.XnPagedResult(); } /// /// 保存 /// /// /// [HttpPost("/FeeCode/Save")] public async Task Save(FeeCodeSaveDto input) { if (input == null) { throw Oops.Bah("请传入正常数据!"); } FeeCode entity = null; if (input.Id == 0) { entity = input.Adapt(); entity.Id = YitIdHelper.NextId(); await _repCode.InsertAsync(entity); } else { entity = await _repCode.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == input.Id); entity = input.Adapt(entity); await _repCode.UpdateAsync(entity); } await CacheFeeCode(); return entity.Adapt(); } /// /// 获取详情 /// /// /// [HttpGet("/FeeCode/Detail")] public async Task Detail(long id) { var entity = await _repCode.AsQueryable().Filter(null, true).FirstAsync(x => x.Id == id); return entity.Adapt(); } /// /// 删除 /// /// /// [HttpPost("/FeeCode/Delete")] public async Task Delete(List ids) { var list = await _repCode.AsQueryable().Filter(null, true).Where(x => ids.Contains(x.Id)).ToListAsync(); list.ForEach(x => x.IsDeleted = true); await _repCode.AsUpdateable(list).ExecuteCommandAsync(); await CacheFeeCode(); } /// /// 获取费用代码列表 /// /// [HttpGet("/FeeCode/List")] public async Task> List() { var result = await _cache.GetAsync>(CommonConst.CACHE_KEY_FEE_CODE + ":" + UserManager.TENANT_ID); if (result?.Any() != true) { result = await CacheFeeCode(); } return result; } /// /// 缓存费用代码列表 /// [NonAction] public async Task> CacheFeeCode() { if (UserManager.IsSuperAdmin) { // 如果登陆人是SuperAdmin,则分别缓存所有租户的费用代码 var allFeeCode = await _repCode.AsQueryable().Filter(null, true).Where(x => !x.IsDeleted).ToListAsync(); var groupFeeCodeCache = allFeeCode.GroupBy(x => x.TenantId); foreach (var item in groupFeeCodeCache) { var item2 = item.Adapt>(); await _cache.SetTimeoutAsync(CommonConst.CACHE_KEY_FEE_CODE + ":" + item.Key, item2, new TimeSpan(6, 0, 0)); } var result = groupFeeCodeCache.FirstOrDefault(x => x.Key == UserManager.TENANT_ID)?.Adapt>(); return result; } else { // 否则只缓存当前租户的费用代码 var tenantFeeCode = await _repCode.AsQueryable().Filter(null, true).Where(x => !x.IsDeleted && x.TenantId == UserManager.TENANT_ID).ToListAsync(); await _cache.SetTimeoutAsync(CommonConst.CACHE_KEY_FEE_CODE + ":" + UserManager.TENANT_ID, tenantFeeCode, new TimeSpan(6, 0, 0)); var result = tenantFeeCode.Adapt>(); return result; } } } }