前言
提示:这里以车辆类型为例,其他业务代码已上传 gitee:
地磅无人值守系统,由车辆,车辆人员、物料、设备(地磅,摄像头、道闸、红外感应、打印机、音响等)模块组成,这些基础信息,配置信息由后台管理,某种程度上可以减轻系统售后维护的工作量。客户端主要任务是对接硬件设备,减少对业务依赖。
一、获取实体数据
ICarTypeRepository是仓储接口;
CarTypeManager是拓展仓储,作用是集中管理CarType仓储;
构造函数注入仓储:
private readonly ICarTypeRepository _repository;
private readonly CarTypeManager _manager;
public CarTypeAppService(
ICarTypeRepository repository,
CarTypeManager manager
) : base(repository)
{
_repository = repository;
_manager = manager;
}
局部示例代码:
/// <summary>
/// 获取实体
/// </summary>
/// <param name="id">编号</param>
/// <returns></returns>
public override async Task<CarTypeDto> GetAsync(Guid id)
{
var model = await _repository.GetAsync(id);
return ObjectMapper.Map<CarType, CarTypeDto>(model);
}
二、创建实体数据
局部示例代码:
/// <summary>
/// 创建数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public override async Task<CarTypeDto> CreateAsync(CreateCarTypeDto input)
{
// 获取当前租户
input.TenantId = CurrentTenant.Id;
// 数据映射
var inputModel = ObjectMapper.Map<CreateCarTypeDto, CarType>(input);
// 检查实体合法性
await _manager.CreateAsync(inputModel);
// 创建数据
var model = await _repository.InsertAsync(inputModel);
// 不用再进行save处理,abp会自动处理
return ObjectMapper.Map<CarType, CarTypeDto>(model);
}
三、获取翻页数据
局部示例代码:
/// <summary>
/// 获取列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public override async Task<PagedResultDto<CarTypeDto>> GetListAsync(
GetCarTypeListDto input)
{
await CheckGetListPolicyAsync();
if (input.Sorting.IsNullOrWhiteSpace())
{
input.Sorting = nameof(CarType.Orders) + " desc";
}
// 根据输入条件查询
var query = _repository
.WhereIf(
!input.Filter.IsNullOrWhiteSpace(),
(p => p.Name.Contains(input.Filter))
);
// 获取翻页数据
var queryTake = query
.OrderBy(input.Sorting)
.Skip(input.SkipCount)
.Take(input.MaxResultCount);
// 执行数据库查询
var queryResult = await AsyncExecuter.ToListAsync(queryTake);
// 内外联查询时使用到,此查询没有内外联,可以忽略
var infoDtos = queryResult.Select(x =>
{
var infoDto = ObjectMapper.Map<CarType, CarTypeDto>(x);
return infoDto;
}).ToList();
// 获取数据条数
var totalCount = await AsyncExecuter.CountAsync(query);
return new PagedResultDto<CarTypeDto>(
totalCount,
infoDtos);
}
四、更新实体数据
局部示例代码:
/// <summary>
/// 更新数据
/// </summary>
/// <param name="id"></param>
/// <param name="input"></param>
/// <returns></returns>
public override async Task<CarTypeDto> UpdateAsync(Guid id, UpdateCarTypeDto input)
{
var model = await _repository.GetAsync(id);
if (model.Name != input.Name)
{
await _manager.ChangeNameAsync(model, input.Name);
}
model.Code = input.Code;
model.Status = input.Status;
model.Remark = input.Remark;
model.Orders = input.Orders;
model = await _repository.UpdateAsync(model, autoSave: true);
return ObjectMapper.Map<CarType, CarTypeDto>(model);
}
五、删除实体数据
局部示例代码:
/// <summary>
/// 删除实体
/// </summary>
/// <param name="id">编号</param>
/// <returns></returns>
public override async Task DeleteAsync(Guid id)
{
// 这里只是软删除
await _repository.DeleteAsync(id);
}
六、CarTypeAppService全部代码
CarTypeManager在 FloorScale.Domain 项目。
using System;
using FloorScale.Permissions;
using FloorScale.Base.CarTypes.Dtos;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Collections.Generic;
namespace FloorScale.Base.CarTypes
{
public class CarTypeAppService :
CrudAppService<CarType, CarTypeDto, Guid, GetCarTypeListDto, CreateCarTypeDto, UpdateCarTypeDto>,
ICarTypeAppService
{
protected override string GetPolicyName { get; set; } = FloorScalePermissions.CarType.Default;
protected override string GetListPolicyName { get; set; } = FloorScalePermissions.CarType.Default;
protected override string CreatePolicyName { get; set; } = FloorScalePermissions.CarType.Create;
protected override string UpdatePolicyName { get; set; } = FloorScalePermissions.CarType.Update;
protected override string DeletePolicyName { get; set; } = FloorScalePermissions.CarType.Delete;
private readonly ICarTypeRepository _repository;
private readonly CarTypeManager _manager;
public CarTypeAppService(
ICarTypeRepository repository,
CarTypeManager manager
) : base(repository)
{
_repository = repository;
_manager = manager;
}
/// <summary>
/// 获取实体
/// </summary>
/// <param name="id">编号</param>
/// <returns></returns>
public override async Task<CarTypeDto> GetAsync(Guid id)
{
var model = await _repository.GetAsync(id);
return ObjectMapper.Map<CarType, CarTypeDto>(model);
}
/// <summary>
/// 获取列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public override async Task<PagedResultDto<CarTypeDto>> GetListAsync(
GetCarTypeListDto input)
{
await CheckGetListPolicyAsync();
if (input.Sorting.IsNullOrWhiteSpace())
{
input.Sorting = nameof(CarType.Orders) + " desc";
}
// 根据输入条件查询
var query = _repository
.WhereIf(
!input.Filter.IsNullOrWhiteSpace(),
(p => p.Name.Contains(input.Filter))
);
// 获取翻页数据
var queryTake = query
.OrderBy(input.Sorting)
.Skip(input.SkipCount)
.Take(input.MaxResultCount);
// 执行数据库查询
var queryResult = await AsyncExecuter.ToListAsync(queryTake);
// 内外联查询时使用到,此查询没有内外联,可以忽略
var infoDtos = queryResult.Select(x =>
{
var infoDto = ObjectMapper.Map<CarType, CarTypeDto>(x);
return infoDto;
}).ToList();
// 获取数据条数
var totalCount = await AsyncExecuter.CountAsync(query);
return new PagedResultDto<CarTypeDto>(
totalCount,
infoDtos);
}
/// <summary>
/// 获取树状列表
/// </summary>
/// <returns></returns>
public async Task<ListResultDto<TreeviewDto>> GetTreeviewAsync(string input)
{
var query = _repository
.Where(p => p.Status == true)
.WhereIf(
!input.IsNullOrWhiteSpace(),
model => model.Name.Contains(input) || model.Code.Contains(input)
)
.OrderByDescending(p => p.Orders);
var queryResult = await AsyncExecuter.ToListAsync(query);
return new ListResultDto<TreeviewDto>(
ObjectMapper.Map<List<CarType>, List<TreeviewDto>>(
queryResult
)
);
}
/// <summary>
/// 创建数据
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[Authorize(FloorScalePermissions.Car.Create)]
public override async Task<CarTypeDto> CreateAsync(CreateCarTypeDto input)
{
// 获取当前租户
input.TenantId = CurrentTenant.Id;
// 数据映射
var inputModel = ObjectMapper.Map<CreateCarTypeDto, CarType>(input);
// 检查实体合法性
await _manager.CreateAsync(inputModel);
// 创建数据
var model = await _repository.InsertAsync(inputModel);
// 不用再进行save处理,abp会自动处理
return ObjectMapper.Map<CarType, CarTypeDto>(model);
}
/// <summary>
/// 更新数据
/// </summary>
/// <param name="id"></param>
/// <param name="input"></param>
/// <returns></returns>
[Authorize(FloorScalePermissions.Car.Update)]
public override async Task<CarTypeDto> UpdateAsync(Guid id, UpdateCarTypeDto input)
{
var model = await _repository.GetAsync(id);
if (model.Name != input.Name)
{
await _manager.ChangeNameAsync(model, input.Name);
}
model.Code = input.Code;
model.Status = input.Status;
model.Remark = input.Remark;
model.Orders = input.Orders;
model = await _repository.UpdateAsync(model, autoSave: true);
return ObjectMapper.Map<CarType, CarTypeDto>(model);
}
/// <summary>
/// 删除实体
/// </summary>
/// <param name="id">编号</param>
/// <returns></returns>
[Authorize(FloorScalePermissions.Car.Delete)]
public override async Task DeleteAsync(Guid id)
{
// 这里只是软删除
await _repository.DeleteAsync(id);
}
/// <summary>
/// 获取最大排序
/// </summary>
/// <returns></returns>
public async Task<int> GetOrdersAsync()
{
await CheckCreatePolicyAsync();
return (_repository.Max(p => (int?)p.Orders) ?? 0) + 3;
}
}
}
总结
业务需求简单的情况下,还是直接操作 ICarTypeRepository 方便些。需要规范的话,就把业务封装起来。
本章代码写得粗糙,有技术问题,欢迎交流。
下一章介绍swagger,接口文档分组问题。
源码放在gitee上:
https://gitee.com/chaojunho/floor-scale-open
后续逐步更新
版权声明:本文为hermanho原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。