2.1.4 Abp vNext 地磅无人值守 车辆物料实现接口

  • Post author:
  • Post category:其他



地磅无人值守项目 系列文章目录





前言


提示:这里以车辆类型为例,其他业务代码已上传 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 版权协议,转载请附上原文出处链接和本声明。