using AutoMapper;
using JSMachine.WMS.App.Dto;
using JSMachine.WMS.App.IService;
using JSMachine.WMS.Domain.Entity;
using JSMachine.WMS.Domain.IRepository;
using JSMachine.WMS.Domain.Repository;
using JSMachine.WMS.Infrastructure;
using JSMachine.WMS.Infrastructure.LambdaHelp;
using SqlSugar;
using System.Data;
using System.Linq.Expressions;
namespace JSMachine.WMS.App.ServiceImpl
{
///
/// 应用层通用服务基类,负责 DTO 与领域实体之间的映射,
/// 并将增删改查请求委托给对应的领域仓储。
///
/// 应用层数据传输对象类型。
/// 领域聚合根类型。
public class BaseService : IBaseService
where TAggregateRoot : AggregateRoot, IAggregateRoot
where TDTO : IRootDto
{
private IBaseRepository IBaseRepository;
private static IMapper _mapper = GlobalServericeProvidor.GetService();
public BaseService(IBaseRepository baseRepository)
{
IBaseRepository = baseRepository;
}
///
/// 添加单个 DTO;当 DTO 未提供标识时生成新标识,并维护创建时间和修改时间。
///
/// 待保存的数据传输对象。
/// 可选的数据库作用域;为空时使用仓储默认作用域。
/// 数据库插入是否成功。
public async virtual Task Add(TDTO dto, SqlSugarScope sqlSugarScope=null)
{
if (dto.Id == Guid.Empty)
dto.Id = Guid.NewGuid();
dto.CreationTime = DateTime.Now;
dto.LastModifiedTime = DateTime.Now;
return await IBaseRepository.Add(_mapper.Map(dto),sqlSugarScope);
}
public async virtual Task Add(TDTO dto, params string[] ignoreColumns)
{
if (dto.Id == Guid.Empty)
dto.Id = Guid.NewGuid();
dto.CreationTime = DateTime.Now;
dto.LastModifiedTime = DateTime.Now;
return await IBaseRepository.Add(_mapper.Map(dto), ignoreColumns);
}
public async virtual Task Add(List entities)
{
if (entities == null || entities.Count == 0)
return false;
entities.ForEach(p =>
{
if (p.Id == Guid.Empty)
p.Id = Guid.NewGuid();
p.CreationTime = DateTime.Now;
p.LastModifiedTime = DateTime.Now;
});
return await IBaseRepository.Add(_mapper.Map>(entities));
}
public async Task Add(string tableName, Dictionary dic)
{
if (dic.ContainsKey("Id"))
dic.Add("Id", Guid.NewGuid().ToString("N"));
return await IBaseRepository.Add(tableName, dic);
}
///
/// 添加之前判断指定字段是否存在,不存在则添加
///
///
///
///
public async Task AddIfNotExist(TDTO entity, Expression> expression)
{
return await IBaseRepository.AddIfNotExist(_mapper.Map(entity),
_mapper.Map>>(expression));
}
public async Task Count()
{
return await IBaseRepository.Count();
}
public async Task Count(Expression> expression)
{
return await IBaseRepository.Count(_mapper.Map>>(expression));
}
public async Task DeleByExpression(Expression> expression)
{
return await IBaseRepository.DeleByExpression(expression);
}
public async Task DeleteBatch(Guid[] ids)
{
return await IBaseRepository.DeleteBatch(ids);
}
public async Task DeleteByEntity(TDTO aggregateRoot)
{
return await IBaseRepository.DeleteByEntity(_mapper.Map(aggregateRoot));
}
public async Task DeleteByEntity(List aggregateRoot)
{
return await IBaseRepository.DeleteByEntity(_mapper.Map>(aggregateRoot));
}
public async Task DeleteById(Guid id, SqlSugarScope sqlSugarScope=null)
{
return await IBaseRepository.DeleteById(id,sqlSugarScope);
}
public async Task EditBatch(List dtos)
{
dtos.ForEach(p => p.LastModifiedTime = DateTime.Now);
return await IBaseRepository.EditBatch(_mapper.Map>(dtos));
}
///
/// 快速批量更新
///
///
///
public async Task EditBatchFast(List dtos)
{
dtos.ForEach(p => p.LastModifiedTime = DateTime.Now);
return await IBaseRepository.EditBatchFast(_mapper.Map>(dtos));
}
public async Task EditByDic(string tableName, Dictionary dic)
{
return await IBaseRepository.EditByDic(tableName, dic);
}
public async Task EditByDic(string tableName, List> dic)
{
return await IBaseRepository.EditByDic(tableName, dic);
}
public async virtual Task EditSingal(TDTO aggregateRoot)
{
aggregateRoot.LastModifiedTime = DateTime.Now;
//更新的时候不能够更改数据的添加时间
return await IBaseRepository.EditSingal(_mapper.Map(aggregateRoot), new string[] { "CreationTime" });
}
public async Task EditSingal(TDTO dto, Expression> ignoredColumns)
{
dto.LastModifiedTime = DateTime.Now;
return await IBaseRepository.EditSingal(_mapper.Map(dto), _mapper.Map>>(ignoredColumns));
}
public async Task EditSingal(TDTO dto, string[] ignoredColumns)
{
dto.LastModifiedTime = DateTime.Now;
return await IBaseRepository.EditSingal(_mapper.Map(dto), ignoredColumns);
}
public async Task EditSingalWithSpecificCols(TDTO dto, string[] columns)
{
dto.LastModifiedTime = DateTime.Now;
return await IBaseRepository.EditSingalWithSpecificCols(_mapper.Map(dto), columns);
}
public async Task Exist(Expression> expression)
{
return await IBaseRepository.Exist(_mapper.Map>>(expression));
}
public async Task> GetAll()
{
List data = await IBaseRepository.GetAll();
return _mapper.Map>(data);
}
public async Task> GetAll(string orderByFiled, OrderByType orderByType)
{
List data = await IBaseRepository.GetAll(LambdaHelper.GetOrderExpression