UavFeeRuleService.cs 15 KB
using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.FriendlyException;
using NCC.Extend.Interfaces.UavFeeRule;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NCC.Extend.Entitys;
using NCC.Extend.Entitys.Dto.UavFeeRule;
using Yitter.IdGenerator;
using NCC.Common.Helper;
using NCC.JsonSerialization;

namespace NCC.Extend.UavFeeRule
{
    /// <summary>
    /// 收费规则服务
    /// </summary>
    [ApiDescriptionSettings(Tag = "收费规则服务", Name = "UavFeeRule", Order = 200)]
    [Route("api/Extend/[controller]")]
    public class UavFeeRuleService : IUavFeeRuleService, IDynamicApiController, ITransient
    {
        private readonly ISqlSugarRepository<UavFeeRuleEntity> _uavFeeRuleRepository;
        private readonly SqlSugarScope _db;
        private readonly IUserManager _userManager;

        /// <summary>
        /// 初始化一个<see cref="UavFeeRuleService"/>类型的新实例
        /// </summary>
        public UavFeeRuleService(
            ISqlSugarRepository<UavFeeRuleEntity> uavFeeRuleRepository,
            IUserManager userManager)
        {
            _uavFeeRuleRepository = uavFeeRuleRepository;
            _db = _uavFeeRuleRepository.Context;
            _userManager = userManager;
        }

        #region 获取收费规则
        /// <summary>
        /// 获取收费规则
        /// </summary>
        /// <param name="id">参数</param>
        /// <returns></returns>
        [HttpGet("{id}")]
        public async Task<dynamic> GetInfo(string id)
        {
            var entity = await _db.Queryable<UavFeeRuleEntity>().FirstAsync(p => p.Id == id);
            var output = entity.Adapt<UavFeeRuleInfoOutput>();
            return output;
        }
        #endregion

        #region 获取收费规则列表
        /// <summary>
        /// 获取收费规则列表
        /// </summary>
        /// <param name="input">请求参数</param>
        /// <returns></returns>
        [HttpGet("")]
        public async Task<dynamic> GetList([FromQuery] UavFeeRuleListQueryInput input)
        {
            var sidx = input.sidx == null ? "id" : input.sidx;
            var data = await _db.Queryable<UavFeeRuleEntity>()
                .WhereIF(!string.IsNullOrEmpty(input.ruleName), p => p.RuleName.Contains(input.ruleName))
                .WhereIF(!string.IsNullOrEmpty(input.siteId), p => p.SiteId.Equals(input.siteId))
                .WhereIF(!string.IsNullOrEmpty(input.packageType), p => p.PackageType.Equals(input.packageType))
                .Where(p => p.IsDelete != 99)
                .Select(it => new UavFeeRuleListOutput
                {
                    id = it.Id,
                    ruleName = it.RuleName,
                    siteId = it.SiteId,
                    packageType = it.PackageType,
                    isBasic = it.IsBasic,
                    duration = it.Duration,
                    unitPrice = it.UnitPrice,
                    dailyCap = it.DailyCap,
                    totalCap = it.TotalCap,
                    overtimePrice = it.OvertimePrice,
                    freeDuration = it.FreeDuration,
                    isEnabled = it.IsEnabled,
                }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
            return PageResult<UavFeeRuleListOutput>.SqlSugarPageResult(data);
        }

        #endregion

        #region 获取当前登录代理商收费规则列表
        /// <summary>
        /// 获取当前登录代理商收费规则列表
        /// </summary>
        /// <param name="input">请求参数</param>
        /// <returns></returns>
        [HttpGet("GetListByUser")]
        public async Task<dynamic> GetListByUser([FromQuery] UavFeeRuleListQueryInput input)
        {
            var sidx = input.sidx == null ? "id" : input.sidx;
            var data = await _db.Queryable<UavFeeRuleEntity>()
                .WhereIF(!string.IsNullOrEmpty(input.ruleName), p => p.RuleName.Contains(input.ruleName))
                .WhereIF(!string.IsNullOrEmpty(input.siteId), p => p.SiteId.Equals(input.siteId))
                .WhereIF(!string.IsNullOrEmpty(input.packageType), p => p.PackageType.Equals(input.packageType))
                .Where(p => p.AgentId == _userManager.UserId)
                .Where(p => p.IsDelete != 99)
                .Select(it => new UavFeeRuleListOutput
                {
                    id = it.Id,
                    ruleName = it.RuleName,
                    siteId = it.SiteId,
                    packageType = it.PackageType,
                    isBasic = it.IsBasic,
                    duration = it.Duration,
                    unitPrice = it.UnitPrice,
                    dailyCap = it.DailyCap,
                    totalCap = it.TotalCap,
                    overtimePrice = it.OvertimePrice,
                    freeDuration = it.FreeDuration,
                    isEnabled = it.IsEnabled,
                    multiCells = it.MultiCells,
                }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
            return PageResult<UavFeeRuleListOutput>.SqlSugarPageResult(data);
        }

        #endregion

        #region 获取当前登录代理商收费规则列表
        /// <summary>
        /// 获取当前登录代理商收费规则列表
        /// </summary>
        /// <param name="input">请求参数</param>
        /// <returns></returns>
        [HttpGet("GetListBySite")]
        public async Task<dynamic> GetListBySite([FromQuery] UavFeeRuleListQueryInput input)
        {
            //通过设备id去找到场地
            var siteId = await _db.Queryable<UavDeviceEntity>().Where(p => p.Id == input.deviceId || p.DeviceCode == input.deviceId).Select(it => it.SiteId).FirstAsync();
            //通过场地去找到对应的套餐ID
            var relationIds = await _db.Queryable<UavRelationEntity>().Where(p => p.SiteId == siteId).Select(it => it.FeeRuleId).FirstAsync();
            var sidx = input.sidx == null ? "id" : input.sidx;
            var data = await _db.Queryable<UavFeeRuleEntity>().Where(p => relationIds.Contains(p.Id))
                .Select(it => new UavFeeRuleListOutput
                {
                    id = it.Id,
                    ruleName = it.RuleName,
                    siteId = it.SiteId,
                    packageType = it.PackageType,
                    isBasic = it.IsBasic,
                    duration = it.Duration,
                    unitPrice = it.UnitPrice,
                    dailyCap = it.DailyCap,
                    totalCap = it.TotalCap,
                    overtimePrice = it.OvertimePrice,
                    freeDuration = it.FreeDuration,
                    isEnabled = it.IsEnabled,
                    multiCells = it.MultiCells,
                }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
            return PageResult<UavFeeRuleListOutput>.SqlSugarPageResult(data);
        }

        #endregion

        #region 获取当前登录代理商收费规则列表
        /// <summary>
        /// 根据设备标号获取收费规则
        /// </summary>
        /// <param name="input">请求参数</param>
        /// <returns></returns>
        [HttpGet("GetListBySite_v2")]
        public async Task<dynamic> GetListBySite_v2([FromQuery] UavFeeRuleListQueryInput input)
        {
            //通过设备id去找到场地
            var siteId = await _db.Queryable<UavDeviceEntity>().Where(p => p.Id == input.deviceId || p.DeviceCode == input.deviceId).Select(it => it.SiteId).FirstAsync();
            if (siteId.IsNullOrEmpty())
            {
                return NCCException.Oh("设备正在维护[SiteId为空],请使用其他设备!");
            }
            //通过场地去找到对应的套餐ID
            var relationIds = await _db.Queryable<UavRelationEntity>().Where(p => p.SiteId == siteId).Select(it => it.FeeRuleId).ToListAsync();
            if (relationIds.IsNullOrEmpty())
            {
                return NCCException.Oh("设备正在维护[套餐ID为空],请使用其他设备!");
            }
            var sidx = input.sidx == null ? "id" : input.sidx;
            var data = await _db.Queryable<UavFeeRuleEntity>().Where(p => relationIds.Contains(p.Id))
                .Select(it => new UavFeeRuleListOutput
                {
                    id = it.Id,
                    ruleName = it.RuleName,
                    siteId = it.SiteId,
                    packageType = it.PackageType,
                    isBasic = it.IsBasic,
                    duration = it.Duration,
                    unitPrice = it.UnitPrice,
                    dailyCap = it.DailyCap,
                    totalCap = it.TotalCap,
                    overtimePrice = it.OvertimePrice,
                    freeDuration = it.FreeDuration,
                    isEnabled = it.IsEnabled,
                    multiCells = it.MultiCells,
                }).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
            return PageResult<UavFeeRuleListOutput>.SqlSugarPageResult(data);
        }

        #endregion

        #region 新建收费规则
        /// <summary>
        /// 新建收费规则
        /// </summary>
        /// <param name="input">参数</param>
        /// <returns></returns>
        [HttpPost("")]
        public async Task Create([FromBody] UavFeeRuleCrInput input)
        {
            var userInfo = await _userManager.GetUserInfo();
            var entity = input.Adapt<UavFeeRuleEntity>();
            entity.Id = YitIdHelper.NextId().ToString();
            entity.Creator = _userManager.UserId;
            var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
            if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
        }

        #endregion

        #region 代理商新建收费规则
        /// <summary>
        /// 代理商新建收费规则
        /// </summary>
        /// <param name="input">参数</param>
        /// <returns></returns>
        [HttpPost("AddListByUser")]
        public async Task AddListByUser([FromBody] UavFeeRuleCrInput input)
        {
            var entity = input.Adapt<UavFeeRuleEntity>();
            entity.Id = YitIdHelper.NextId().ToString();
            entity.Creator = _userManager.UserId;
            entity.AgentId = _userManager.UserId;
            var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
            if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
        }

        #endregion

        #region 代理商新建收费规则
        /// <summary>
        /// 代理商新建收费规则
        /// </summary>
        /// <param name="input">参数</param>
        /// <returns></returns>
        [HttpPost("CreateByAgent")]
        public async Task CreateByAgent([FromBody] UavFeeRuleCrInput input)
        {
            var userInfo = await _userManager.GetUserInfo();
            var entity = input.Adapt<UavFeeRuleEntity>();
            entity.Id = YitIdHelper.NextId().ToString();
            entity.Creator = _userManager.UserId;
            var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
            if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
        }

        #endregion

        #region 更新收费规则
        /// <summary>
        /// 更新收费规则
        /// </summary>
        /// <param name="id">主键</param>
        /// <param name="input">参数</param>
        /// <returns></returns>
        [HttpPut("{id}")]
        public async Task Update(string id, [FromBody] UavFeeRuleUpInput input)
        {
            var entity = input.Adapt<UavFeeRuleEntity>();
            var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
            if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
        }
        #endregion

        #region 删除收费规则
        /// <summary>
        /// 删除收费规则
        /// </summary>
        /// <returns></returns>
        [HttpDelete("{id}")]
        public async Task Delete(string id)
        {
            var entity = await _db.Queryable<UavFeeRuleEntity>().FirstAsync(p => p.Id == id);
            _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
            var isOk = await _db.Deleteable<UavFeeRuleEntity>().Where(d => d.Id == id).ExecuteCommandAsync();
            if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
        }
        #endregion

        #region 根据设备来获获取收费规则
        /// <summary>
        /// 根据设备来获获取收费规则
        /// </summary>
        /// <param name="deviceId"></param>
        /// <returns></returns>
        [HttpGet("GetFeeRuleByDevice/{deviceId}")]
        public async Task<dynamic> GetFeeRuleByDevice(string deviceId)
        {
            var siteId = await _db.Queryable<UavDeviceEntity>().Where(p => p.Id == deviceId).Select(it => it.SiteId).FirstAsync();
            var feeRuleId = await _db.Queryable<UavRelationEntity>().Where(p => p.SiteId == siteId).Select(it => it.FeeRuleId).ToListAsync();
            var feeRule = await _db.Queryable<UavFeeRuleEntity>().Where(p => feeRuleId.Contains(p.Id)).ToListAsync();
            return feeRule;
        }
        #endregion

        #region 标记删除收费规则
        /// <summary>
        /// 标记删除收费规则
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("MarkDelete/{id}")]
        public async Task MarkDelete(string id)
        {
            try
            {
                //开启事务
                _db.BeginTran();
                var entity = await _db.Queryable<UavFeeRuleEntity>().FirstAsync(p => p.Id == id);
                _ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
                entity.IsDelete = 99;
                var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
                if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
                // 删除绑定管理(批量删除所有与该收费规则关联的绑定关系)
                var hasRelations = await _db.Queryable<UavRelationEntity>().AnyAsync(p => p.FeeRuleId == id);
                if (hasRelations)
                {
                    var deleteResult = await _db.Deleteable<UavRelationEntity>().Where(p => p.FeeRuleId == id).ExecuteCommandAsync();
                    if (deleteResult <= 0)
                    {
                        throw NCCException.Oh(ErrorCode.COM1002);
                    }
                }
                //提交事务
                _db.CommitTran();
            }
            catch (Exception)
            {
                //回滚事务
                _db.RollbackTran();
                throw;
            }
        }
        #endregion
    }
}