using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ZhonTai.Admin.Core.Consts; using ZhonTai.Admin.Services.User; using ZhonTai.DynamicApi.Attributes; using ZhonTai.DynamicApi; using Microsoft.AspNetCore.Mvc; using ZhonTai.Admin.Core.Dto; using ZhonTai.Admin.Domain.Role; using ZhonTai.Admin.Domain.User; using ZhonTai.Admin.Services.User.Dto; using ZhonTai.Admin.Domain.UserRole; using ZhonTai.Admin.Domain.Project; using ZhonTai.Admin.Services.Project.Dto; using ZhonTai.Admin.Core.Attributes; using ZhonTai.Admin.Domain.Tenant; using ZhonTai.Admin.Domain.TenantPkg; using ZhonTai.Admin.Domain.Pkg; using ZhonTai.Admin.Repositories; using ZhonTai.Admin.Services.Tenant.Dto; using System.Linq.Expressions; using ZhonTai.Admin.Domain.Org; using ZhonTai.Admin.Services.Pkg; using ZhonTai.Admin.Domain.ProjectLink; namespace ZhonTai.Admin.Services.Project { /// /// 项目服务 /// [Order(10)] [DynamicApi(Area = AdminConsts.AreaName)] public partial class ProjectService : BaseService, IProjectService, IDynamicApi { private readonly IProjectRepository _projectRepository; private readonly IProjectPriceRepository _projectPriceRepository; private readonly IProjectRecordRepository _projectRecordRepository; private readonly IProjectLinkRepository _projectLinkRepository; public ProjectService(IProjectRepository projectRepository, IProjectPriceRepository projectPriceRepository, IProjectRecordRepository projectRecordRepository,IProjectLinkRepository projectLinkRepository) { _projectRepository = projectRepository; _projectPriceRepository = projectPriceRepository; _projectRecordRepository = projectRecordRepository; _projectLinkRepository = projectLinkRepository; } /// /// 查询 /// /// /// public async Task GetAsync(long id) { var project = await _projectRepository.Select .WhereDynamic(id) .FirstAsync(a => new ProjectGetOutput { Name = a.Name, Logo = a.Logo, Tips = a.Tips, SettleDay = a.SettleDay, MaxPrice = a.MaxPrice, Works = a.Works, VideoUrl = a.VideoUrl, Detail = a.Detail, Id = a.Id, prices = _projectPriceRepository.Select.Where(m => m.ProjectId == a.Id).ToList() }); return project; } /// /// 查询分页 /// /// /// [HttpPost] public async Task> GetPageAsync(PageInput input) { string keywords = input?.Filter.Keywrods; int? status = input?.Filter?.Status; var list = await _projectRepository.Select .WhereIf(keywords.NotNull(), (m) => m.Name.Contains(keywords)) .WhereIf(status != null && status > 0, (m) => m.Status == status) .Count(out var total) .OrderByDescending(true, a => a.Id) .Page(input.CurrentPage, input.PageSize) .ToListAsync(); var data = new PageOutput() { List = Mapper.Map>(list), Total = total }; return data; } /// /// 添加 /// /// /// [HttpPost] [AdminTransaction] public async Task AddAsync(ProjectAddInput input) { //添加项目 ProjectEntity entity = Mapper.Map(input); entity.Status = 1; ProjectEntity project = await _projectRepository.InsertAsync(entity); long projectId = project.Id; //添加项目价格 var prices = input.prices.Select(m => new ProjectPriceEntity { ProjectId = projectId, Name = m.Name, Price = m.Price }).ToList(); await _projectPriceRepository.InsertAsync(prices); return 1; } /// /// 修改 /// /// /// public async Task UpdateAsync(ProjectUpdateInput input) { throw ResultOutput.Exception("暂未开发"); var project = await _projectRepository.GetAsync(input.Id); if (!(project?.Id > 0)) { throw ResultOutput.Exception("项目不存在"); } //更新项目 await _projectRepository.UpdateDiy.SetSource( new ProjectEntity() { Id = project.Id, Name = input.Name, Logo = input.Logo, Tips = input.Tips, SettleDay = input.SettleDay, MaxPrice = input.MaxPrice, Works = input.Works, VideoUrl = input.VideoUrl, Detail = input.Detail, }) .UpdateColumns(a => new { a.Name, a.Logo, a.Tips, a.SettleDay, a.MaxPrice, a.VideoUrl, a.Detail, a.ModifiedTime }).ExecuteAffrowsAsync(); //删除项目价格 var PriceIds = _projectPriceRepository.Select.Where(m => m.ProjectId == project.Id).ToList(m => m.Id); var inputPrice = input.prices.Where(m => m.Id > 0).ToList(); var inputPriceIds = inputPrice.Select(m => m.Id).ToList(); var deletePriceIds = PriceIds.Except(inputPriceIds).ToList(); if (deletePriceIds.Count() > 0) { await _projectPriceRepository.SoftDeleteAsync(a => deletePriceIds.Contains(a.Id)); } //新增项目价格 var addPriceIds = input.prices.Where(m => m.Id <= 0).ToList(); if (addPriceIds.Count() > 0) { var list = addPriceIds.Select(m => new ProjectPriceEntity { ProjectId = project.Id, Name = m.Name, Price = m.Price }).ToList(); await _projectPriceRepository.InsertAsync(list); } //更新项目价格 foreach (var item in inputPrice) { await _projectPriceRepository.UpdateDiy.SetSource( new ProjectPriceEntity() { Id = item.Id, Name = item.Name, Price = item.Price }) .UpdateColumns(a => new { a.Name, a.Price, a.ModifiedTime }).ExecuteAffrowsAsync(); } } /// /// 更新状态 /// /// ///状态 2上架 3下架 4暂停 /// public async Task UpdateStatusAsync(long Id, int status) { var project = await _projectRepository.GetAsync(Id); if (!(project?.Id > 0)) { throw ResultOutput.Exception("项目不存在"); } if (!new int[] { 2, 3, 4, 5 }.Contains(status)) { throw ResultOutput.Exception("请做出有效操作"); } //上架项目需要验证推广码是否大于0 if (status == 2) { var count= await _projectLinkRepository.Where(m=>m.ProjectId==Id&&m.IsUse==0).CountAsync(); if (count <= 0) { throw ResultOutput.Exception("请去上传推广码"); } } string statusText = GetStatusText(project.Status); string statusText2 = GetStatusText(status); string remark = $"{project.Name}从{statusText}变更为{statusText2}"; //更新项目 await _projectRepository.UpdateDiy.SetSource( new ProjectEntity() { Id = project.Id, Status = status, }) .UpdateColumns(a => new { a.Status }).ExecuteAffrowsAsync(); //项目记录 await _projectRecordRepository.InsertAsync(new ProjectRecordEntity() { ProjectId = Id, Remark = remark, Type = status, }); } #region 私有方法 /// /// 获取项目状态 /// /// /// private static string GetStatusText(int status) => status switch { 1 => "待上架", 2 => "上架", 3 => "下架", 4 => "暂停", 5 => "名额已满", _ => "未知状态" }; #endregion } }