|
|
@ -1,39 +1,36 @@ |
|
|
|
using Volo.Abp.Domain.Entities.Auditing; |
|
|
|
using Volo.Abp.Identity; |
|
|
|
|
|
|
|
namespace WinIn.FasterZ.Wms.AppBase; |
|
|
|
|
|
|
|
using System; |
|
|
|
using System; |
|
|
|
using System.Collections; |
|
|
|
using System.Collections.Generic; |
|
|
|
using System.IO; |
|
|
|
using System.Linq; |
|
|
|
using System.Linq.Dynamic.Core; |
|
|
|
using System.Linq.Expressions; |
|
|
|
using System.Reflection; |
|
|
|
using System.Threading; |
|
|
|
using System.Threading.Tasks; |
|
|
|
|
|
|
|
using AutoMapper; |
|
|
|
using Microsoft.AspNetCore.Authorization; |
|
|
|
using Microsoft.AspNetCore.Mvc; |
|
|
|
using Microsoft.EntityFrameworkCore; |
|
|
|
using Microsoft.Extensions.Caching.Distributed; |
|
|
|
using Microsoft.Extensions.Localization; |
|
|
|
|
|
|
|
using NPOI.SS.UserModel; |
|
|
|
using NPOI.XSSF.UserModel; |
|
|
|
|
|
|
|
using Omu.ValueInjecter; |
|
|
|
using Volo.Abp.Application.Dtos; |
|
|
|
using Volo.Abp.Application.Services; |
|
|
|
using Volo.Abp.Caching; |
|
|
|
using Volo.Abp.Domain.Entities; |
|
|
|
using Volo.Abp.Domain.Entities.Auditing; |
|
|
|
using Volo.Abp.Domain.Repositories; |
|
|
|
|
|
|
|
using WinIn.FasterZ.Store.AppBase; |
|
|
|
using WinIn.FasterZ.Store.AppBase.Filters; |
|
|
|
using WinIn.FasterZ.Store.AppBase.TableColumnTypeDto; |
|
|
|
using WinIn.FasterZ.Store.Enums; |
|
|
|
using WinIn.FasterZ.Wms.AppBase.Extensions; |
|
|
|
using WinIn.FasterZ.Wms.AppBaseBusiness.ExportCustomUserSetting; |
|
|
|
using WinIn.FasterZ.Wms.Localization; |
|
|
|
using Mapper = AutoMapper.Mapper; |
|
|
|
|
|
|
|
namespace WinIn.FasterZ.Wms.AppBase; |
|
|
|
|
|
|
|
public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, TCreateInput, TUpdateInput> : |
|
|
|
CrudAppService<TEntity, TEntityDto, TKey, |
|
|
@ -42,19 +39,33 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
where TEntity : class, IEntity<TKey> |
|
|
|
where TEntityDto : IEntityDto<TKey> |
|
|
|
{ |
|
|
|
#region 定义
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// redis缓存时间 分钟
|
|
|
|
/// </summary>
|
|
|
|
private const int CacheMinute = 30; |
|
|
|
|
|
|
|
private readonly IRepository<TEntity, TKey> _repository; |
|
|
|
|
|
|
|
protected IStringLocalizer<WmsResource> Localizer => |
|
|
|
private IStringLocalizer<WmsResource> Localizer => |
|
|
|
LazyServiceProvider.LazyGetRequiredService<IStringLocalizer<WmsResource>>(); |
|
|
|
|
|
|
|
protected ExportCustomUserSettingAppService ExportCustomUserSettingAppService => |
|
|
|
private ExportCustomUserSettingAppService ExportCustomUserSettingAppService => |
|
|
|
LazyServiceProvider.LazyGetRequiredService<ExportCustomUserSettingAppService>(); |
|
|
|
|
|
|
|
private IDistributedCache<TEntity> Cache => |
|
|
|
LazyServiceProvider.LazyGetRequiredService<IDistributedCache<TEntity>>(); |
|
|
|
|
|
|
|
private IMapper _mapper; |
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 构造方法
|
|
|
|
/// 构造方法
|
|
|
|
/// </summary>
|
|
|
|
/// <param name="repository"></param>
|
|
|
|
public ZbxBase(IRepository<TEntity, TKey> repository) : base(repository) |
|
|
|
protected ZbxBase(IRepository<TEntity, TKey> repository) : base(repository) |
|
|
|
{ |
|
|
|
_repository = repository; |
|
|
|
} |
|
|
@ -172,6 +183,7 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
|
|
|
|
TryToSetTenantId(entity); |
|
|
|
await Repository.InsertAsync(entity, true); |
|
|
|
|
|
|
|
return await MapToGetOutputDtoAsync(entity); |
|
|
|
} |
|
|
|
|
|
|
@ -193,17 +205,36 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
/// <param name="input"></param>
|
|
|
|
/// <returns></returns>
|
|
|
|
[HttpPut("api/[controller]/base/update-by-id")]
|
|
|
|
public override async Task<TEntityDto> UpdateAsync(TKey id, TUpdateInput input) |
|
|
|
public new async Task<TEntityDto> UpdateAsync(TKey id, TEntityDto input) |
|
|
|
{ |
|
|
|
//return base.UpdateAsync(id, input);
|
|
|
|
|
|
|
|
await CheckUpdatePolicyAsync().ConfigureAwait(false); |
|
|
|
var entity = await GetEntityByIdAsync(id).ConfigureAwait(false); |
|
|
|
entity.FromObject(input!); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Type t1 = null; |
|
|
|
Type t2 = null; |
|
|
|
|
|
|
|
#region 给所有字表的 Id和MasterId赋值 否则默认的会是000000-000-....的id 插入时会报错
|
|
|
|
|
|
|
|
var propertyInfos = entity.GetType().GetProperties(); |
|
|
|
var dtolist = input.GetType().GetProperties(); |
|
|
|
foreach (var propertyInfo in dtolist) |
|
|
|
{ |
|
|
|
if (propertyInfo.Name == "Details" |
|
|
|
&& propertyInfo.PropertyType.IsGenericType |
|
|
|
&& propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) |
|
|
|
{ |
|
|
|
var listProperty = typeof(TEntityDto).GetProperty("Details"); |
|
|
|
if (listProperty != null) |
|
|
|
{ |
|
|
|
t1 = listProperty.PropertyType.GetGenericArguments()[0]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
foreach (var propertyInfo in propertyInfos) |
|
|
|
{ |
|
|
|
//判断是否是List集合
|
|
|
@ -212,33 +243,33 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
&& propertyInfo.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) |
|
|
|
{ |
|
|
|
var listProperty = typeof(TEntity).GetProperty("Details"); |
|
|
|
|
|
|
|
// 获取 List 的元素类型
|
|
|
|
if (listProperty != null) |
|
|
|
{ |
|
|
|
var listItemType = listProperty.PropertyType.GetGenericArguments()[0]; |
|
|
|
t2= listProperty.PropertyType.GetGenericArguments()[0]; |
|
|
|
|
|
|
|
// 获取元素类型的 ID 属性
|
|
|
|
var detailIdProperty = listItemType.GetProperty("Id"); |
|
|
|
//var detailIdProperty = listItemType.GetProperty("Id");
|
|
|
|
var masterIdProperty = listItemType.GetProperty("MasterId"); |
|
|
|
|
|
|
|
if (detailIdProperty != null) |
|
|
|
{ |
|
|
|
// 获取 List 属性的值
|
|
|
|
var list = (IList)listProperty.GetValue(entity); |
|
|
|
|
|
|
|
// 遍历 List 集合中的每个元素,给 ID 属性赋值
|
|
|
|
if (list != null) |
|
|
|
{ |
|
|
|
foreach (var item in list) |
|
|
|
{ |
|
|
|
if ((Guid)detailIdProperty.GetValue(item)! == Guid.Empty) |
|
|
|
{ |
|
|
|
detailIdProperty.SetValue(item, Guid.NewGuid()); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
//if (detailIdProperty != null)
|
|
|
|
//{
|
|
|
|
// // 获取 List 属性的值
|
|
|
|
// var list = (IList)listProperty.GetValue(entity);
|
|
|
|
|
|
|
|
// // 遍历 List 集合中的每个元素,给 ID 属性赋值
|
|
|
|
// if (list != null)
|
|
|
|
// {
|
|
|
|
// foreach (var item in list)
|
|
|
|
// {
|
|
|
|
// if ((Guid)detailIdProperty.GetValue(item)! == Guid.Empty)
|
|
|
|
// {
|
|
|
|
// detailIdProperty.SetValue(item, Guid.NewGuid());
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
|
|
|
|
if (masterIdProperty != null) |
|
|
|
{ |
|
|
@ -258,10 +289,20 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
var config = new MapperConfiguration(cfg => |
|
|
|
{ |
|
|
|
// 动态创建映射关系
|
|
|
|
cfg.CreateMap(typeof(TEntityDto), typeof(TEntity)); |
|
|
|
cfg.CreateMap(t1,t2); |
|
|
|
}); |
|
|
|
_mapper = new Mapper(config); |
|
|
|
var tt = _mapper.Map(input, entity); |
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
await Repository.UpdateAsync(entity, true); |
|
|
|
|
|
|
|
await Cache.SetAsync(entity.Id.ToString(), entity, GetCacheTime()); |
|
|
|
return await MapToGetOutputDtoAsync(entity); |
|
|
|
} |
|
|
|
|
|
|
@ -456,7 +497,7 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
for (var i = 0; i < mainProperties.Length + splitDetailsColumnNumber + detailProperties.Length; i++) |
|
|
|
{ |
|
|
|
var colWidth = Math.Max(sheet.GetColumnWidth(i) + 150, 265 * 15); |
|
|
|
if (colWidth > 255 * 256)//excel列有最大宽度限制
|
|
|
|
if (colWidth > 255 * 256) //excel列有最大宽度限制
|
|
|
|
{ |
|
|
|
colWidth = 6000; |
|
|
|
} |
|
|
@ -470,7 +511,7 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
for (var i = 0; i < mainProperties.Length; i++) |
|
|
|
{ |
|
|
|
var colWidth = Math.Max(sheet.GetColumnWidth(i) + 150, 265 * 15); |
|
|
|
if (colWidth > 255 * 256)//excel列有最大宽度限制
|
|
|
|
if (colWidth > 255 * 256) //excel列有最大宽度限制
|
|
|
|
{ |
|
|
|
colWidth = 6000; |
|
|
|
} |
|
|
@ -516,6 +557,20 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
return tableColumnTypeDtos; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 【基础】-【获取 增 改 查基础的Dto数据类型】
|
|
|
|
/// </summary>
|
|
|
|
/// <returns></returns>
|
|
|
|
[HttpPost("api/[controller]/base/get-cache-by-id/{id}")]
|
|
|
|
public virtual async Task<TEntityDto> GetCacheByIdAsync(TKey id) |
|
|
|
{ |
|
|
|
var entity = await Cache.GetOrAddAsync( |
|
|
|
$"{typeof(TEntityDto).Name}:{id}".ToString(), |
|
|
|
async () => await GetEntityByIdAsync(id), GetCacheTime); |
|
|
|
var dto = ObjectMapper.Map<TEntity, TEntityDto>(entity!); |
|
|
|
return dto; |
|
|
|
} |
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region 私有处理
|
|
|
@ -565,7 +620,7 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
var createTimePropertyInfo = typeof(TEntity).GetProperty(nameof(AuditedEntity.CreationTime)); |
|
|
|
if (createTimePropertyInfo != null) |
|
|
|
{ |
|
|
|
entities = entities.OrderBy(nameof(AuditedEntity.CreationTime) +" DESC"); |
|
|
|
entities = entities.OrderBy(nameof(AuditedEntity.CreationTime) + " DESC"); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
@ -653,6 +708,22 @@ public class ZbxBase<TEntity, TEntityDto, TKey, TPagedAndSortedResultRequestDto, |
|
|
|
return count; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// 获取缓存redis时间
|
|
|
|
/// </summary>
|
|
|
|
/// <returns></returns>
|
|
|
|
private static DistributedCacheEntryOptions GetCacheTime() |
|
|
|
{ |
|
|
|
Random random = new Random(); |
|
|
|
//解决雪崩 添加随机缓存时间
|
|
|
|
var time = CacheMinute + random.Next(10, 30); |
|
|
|
return new DistributedCacheEntryOptions() |
|
|
|
{ |
|
|
|
AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(time) |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#region Excel导出的样式设置
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|