using Microsoft.AspNetCore.Mvc; using NPOI.SS.Formula.Functions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ZhonTai.Admin.Core.Consts; using ZhonTai.Admin.Core.Dto; using ZhonTai.Admin.Domain.Project; using ZhonTai.Admin.Services.Project.Dto; using ZhonTai.Common.Extensions; using ZhonTai.DynamicApi; using ZhonTai.DynamicApi.Attributes; namespace ZhonTai.Admin.Services.Project { /// /// 项目价格设置服务 /// [Order(10)] [DynamicApi(Area = AdminConsts.AreaName)] public partial class ProjectPriceService : BaseService, IProjectService, IDynamicApi { private readonly IProjectRepository _projectRepository; private readonly IProjectPriceRepository _projectPriceRepository; private readonly IProjectConfigRepository _projectConfigRepository; public ProjectPriceService(IProjectRepository projectRepository, IProjectPriceRepository projectPriceRepository, IProjectConfigRepository projectConfigRepository) { _projectRepository = projectRepository; _projectPriceRepository = projectPriceRepository; _projectConfigRepository = projectConfigRepository; } #region 公司默认抽成比例 /// /// 查询公司抽成比例 /// /// [HttpGet] public async Task GetCompanyDrawAsync() { await ProjectPriceInitAsync(); var list = await _projectConfigRepository.Select.Where(m => m.ProjectId == 0 && m.ProjectPriceId == 0 && m.Status == 1) .ToListAsync(a => new { a.Id, a.DrawRatio, a.EffectDate }); CompanyDrawOutput output = new CompanyDrawOutput(); if (list.Count > 1) { DateTime dtnow = DateTime.Today; var current = list.FirstOrDefault(m => m.EffectDate <= dtnow); var next = list.FirstOrDefault(m => m.EffectDate > dtnow); output.CurrentRatio = current.DrawRatio; output.NextRatio = next.DrawRatio; output.NextEffectDate = next.EffectDate; } else { output.CurrentRatio = list[0].DrawRatio; output.NextRatio = 0; } return output; } /// /// 修改公司抽成比例 /// /// [HttpPost] public async Task EditCompanyDrawAsync(CompanyDrawInput input) { CheckDrawRatio(input.DrawRatio); CheckDrawRatioEffect(input.EffectDate); //删除旧的未生效记录 var listDeleteId = await _projectConfigRepository.Select.Where(m => m.ProjectId == 0 && m.ProjectPriceId == 0 && m.Status == 1 && m.EffectDate > DateTime.Today) .ToListAsync(m => m.Id); if (listDeleteId.Count > 0) { await _projectConfigRepository.SoftDeleteAsync(m => listDeleteId.Contains(m.Id)); } //添加新的比例 await _projectConfigRepository.InsertAsync(new ProjectConfigEntity() { ProjectId = 0, ProjectPriceId = 0, DrawRatio = input.DrawRatio, EffectDate = input.EffectDate, Status = 1 }); } #endregion #region 项目抽成比例 /// /// 查询项目分页 /// /// /// [HttpPost] public async Task> GetProjectPageAsync(PageInput input) { var list = await _projectRepository.Select .Count(out var total) .OrderByDescending(true, a => a.Id) .Page(input.CurrentPage, input.PageSize) .ToListAsync(a => new GetProjectPricePageOutput() { Id = a.Id, Name = a.Name, Logo = a.Logo, Prices = _projectPriceRepository.Select.Where(m => m.ProjectId == a.Id).ToList() }); var data = new PageOutput() { List = Mapper.Map>(list), Total = total }; return data; } /// /// 项目价格设价 /// /// /// [HttpPost] public async Task SetProjectPriceAsync(ProjectPriceSetInput input) { //验证项目价格信息是否存在 var price = await _projectPriceRepository.GetAsync(input.Id); if (!(price?.Id > 0)) { throw ResultOutput.Exception("信息不存在,请刷新后重试!"); } if (input.DrawPriceWay == 1) { //抽成比例 if (input.DrawRatio < 0 || input.DrawRatio > 100) { throw ResultOutput.Exception("抽成比例有效范围在0-100"); } var amount = UtilConvertExtension.ToDecimalCutWithN(price.Price * input.DrawRatio * 0.01m, 0, 1); await _projectPriceRepository.UpdateDiy.SetSource(new ProjectPriceEntity() { DrawPriceWay = input.DrawPriceWay, DrawRatio = input.DrawRatio, DrawPrice = amount, Id = price.Id }).UpdateColumns(a => new { a.DrawPriceWay, a.DrawRatio, a.DrawPrice, a.ModifiedTime }).ExecuteAffrowsAsync(); } else if (input.DrawPriceWay == 2) { //抽成金额 if (input.DrawPrice > price.Price || input.DrawPrice < 0) { throw ResultOutput.Exception("设置有效的抽成金额"); } await _projectPriceRepository.UpdateDiy.SetSource(new ProjectPriceEntity() { DrawPriceWay = input.DrawPriceWay, DrawRatio = 0, DrawPrice = input.DrawPrice, Id = price.Id }).UpdateColumns(a => new { a.DrawPriceWay, a.DrawRatio, a.DrawPrice, a.ModifiedTime }).ExecuteAffrowsAsync(); ; } else { throw ResultOutput.Exception("无效的设价方式!"); } return 1; } #endregion #region 校验 /// /// 校验抽成比例 /// /// private void CheckDrawRatio(decimal drawRatio) { //抽成比例 if (drawRatio < 0 || drawRatio > 100) { throw ResultOutput.Exception("抽成比例有效范围在0-100"); } } /// /// 校验抽成比例生效时间 /// /// private void CheckDrawRatioEffect(DateTime effectDate) { //生效时间 if (effectDate <= DateTime.Today) { throw ResultOutput.Exception("生效日期,最短为次日生效"); } } /// /// 初始化公司抽成信息 /// /// private async Task ProjectPriceInitAsync() { var count = await _projectConfigRepository.Select.Where(m => m.ProjectId == 0 && m.ProjectPriceId == 0).CountAsync(); if (count <= 0) { await _projectConfigRepository.InsertAsync(new ProjectConfigEntity() { ProjectId = 0, ProjectPriceId = 0, DrawRatio = 5, EffectDate = DateTime.Today, Status = 1 }); } } #endregion } }