using AutoMapper;
using EFCore.BulkExtensions;
using Google.Protobuf;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using VOL.Business.IRepositories;
using VOL.Business.IRepositories.Stadium;
using VOL.Business.IServices;
using VOL.Business.Repositories;
using VOL.Core.CacheManager;
using VOL.Core.Extensions;
using VOL.Core.Extensions.AutofacManager;
using VOL.Core.Utilities;
using VOL.Entity.DomainModels;
using VOL.Entity.DomainModels.YD;
using VOL.Model;
using VOL.Model.Ai;
using VOL.Model.Stadium;
using VOL.System.Repositories;
using static Dapper.SqlMapper;
namespace VOL.Business.Services.Stadium
{
///
/// 场馆
///
public class StadiumService : IStadiumService, IDependency
{
#region 初始化
private readonly IMapper _mapper;
private readonly ICacheService _cacheService;
private readonly IStadiumRepository _stadiumRepository;
private readonly IStadiumResourceRepository _stadiumResourceRepository;
[ActivatorUtilitiesConstructor]
public StadiumService(IMapper mapper,
ICacheService cacheService,
IStadiumRepository stadiumRepository,
IStadiumResourceRepository stadiumResourceRepository)
{
_mapper = mapper;
_cacheService = cacheService;
_stadiumRepository = stadiumRepository;
_stadiumResourceRepository = stadiumResourceRepository;
}
#endregion
///
/// 场馆列表
///
///
///
public async Task> StadiumList(StadiumListVo dto)
{
var res = new PageDataDto();
var query = from s in _stadiumRepository.FindAsIQueryable(x => true)
select new StadiumListDto()
{
Id = s.Id,
StadiumCode = s.StadiumCode,
UnitType = s.UnitType,
Status = s.Status,
Address = s.Address,
StadiumName = s.StadiumName,
PhoneNo = s.PhoneNo,
CreateDate = s.CreateDate
};
if (!string.IsNullOrWhiteSpace(dto.StadiumName))
{
query = query.Where(x => x.StadiumName.Contains(dto.StadiumName));
}
res.Total = await query.CountAsync();
var list = await query
.Skip((dto.PageIndex - 1) * dto.PageSize)
.Take(dto.PageSize)
.OrderBy(x => x.Id)
.ToListAsync();
res.Datas = list;
return res;
}
///
/// 场馆详情
///
///
///
public async Task StadiumDetails(int stadiumId)
{
var res = await _stadiumRepository.FindAsIQueryable(x => x.Id == stadiumId).Select(x => new StadiumDetailsDto()
{
Id = x.Id,
Address = x.Address,
CoverImage = x.CoverImage,
Intro = x.Intro,
Latitude = x.Latitude,
Longitude = x.Longitude,
PhoneNo = x.PhoneNo,
StadiumCode = x.StadiumCode,
UnitType = x.UnitType,
Status = x.Status,
StadiumName = x.StadiumName,
CreateDate = x.CreateDate,
Province = x.Province,
City = x.City,
Area = x.Area,
StadiumResourceList = x.StadiumResourceList.Select(x => new StadiumResourceDto()
{
Id = x.Id,
Type = x.Type,
Url = x.Url
}).ToList()
}).FirstOrDefaultAsync();
return res;
}
///
/// 新增场馆
///
///
///
public async Task Add(StadiumDetailsDto dto)
{
var entity = _mapper.Map(dto);
//var maxId = await _stadiumRepository.FindAsIQueryable(x => true).Select(x => x.StadiumCode).MaxAsync();
//string nextSchoolCode = Tool.IncrementId(maxId);
entity.StadiumCode = Guid.NewGuid().ToString();
entity.Status = 1;
//var stadList = _mapper.Map>(dto.StadiumResourceList);
//entity.StadiumResourceList = null;
await _stadiumRepository.AddAsync(entity);
await _stadiumRepository.SaveChangesAsync();
//if (stadList != null)
//{
// foreach (var item in stadList)
// {
// item.StadiumId = entity.Id;
// // 添加资源项而不是更新主实体
// _stadiumRepository.Update(item);
// }
// await _stadiumRepository.SaveChangesAsync();
//}
}
///
/// 更新场馆
///
///
///
public async Task Update(StadiumDetailsDto dto)
{
var entity = await _stadiumRepository
.Include(x => x.StadiumResourceList)
.FirstOrDefaultAsync(x => x.Id == dto.Id);
if (entity == null)
throw new Exception("未找到需要更新的场馆信息");
// 更新场馆基本信息
entity.StadiumName = dto.StadiumName;
entity.Province = dto.Province;
entity.City = dto.City;
entity.Area = dto.Area;
entity.PhoneNo = dto.PhoneNo;
entity.CoverImage = dto.CoverImage;
entity.Intro = dto.Intro;
entity.Address = dto.Address;
entity.UnitType = dto.UnitType;
entity.Latitude = dto.Latitude;
entity.Longitude = dto.Longitude;
var existingResources = entity.StadiumResourceList.ToList();
var newResources = _mapper.Map>(dto.StadiumResourceList);
// 处理需要删除的资源
var toDelete = existingResources.Where(er =>
!newResources.Any(nr => nr.Id == er.Id)).ToList();
foreach (var resource in toDelete)
{
if (!string.IsNullOrEmpty(resource.Url))
{
ALiYunOss.DeleteFilesByPrefix(resource.Url);
}
_stadiumResourceRepository.Delete(resource);
}
// 批量处理新增和更新
var resourcesToAdd = new List();
foreach (var newResource in newResources)
{
var existing = existingResources.FirstOrDefault(er => er.Id == newResource.Id);
newResource.StadiumId = dto.Id;
if (existing != null)
{
_mapper.Map(newResource, existing);
_stadiumResourceRepository.Update(existing);
}
else
{
resourcesToAdd.Add(newResource);
}
}
// 批量添加新资源
if (resourcesToAdd.Any())
{
await _stadiumResourceRepository.AddRangeAsync(resourcesToAdd);
}
_stadiumRepository.Update(entity);
// 一次性保存所有变更
await _stadiumRepository.SaveChangesAsync();
}
///
/// 更新场馆状态
///
///
///
public async Task UpdateStatus(StadiumDetailsDto dto)
{
var entity = await _stadiumRepository.FindAsyncFirst(x => x.Id == dto.Id);
if (entity == null)
throw new Exception("未找到需要更新的场馆信息");
entity.Status = dto.Status;
_stadiumRepository.Update(entity);
await _stadiumRepository.SaveChangesAsync();
}
///
/// 删除场馆
///
///
///
public async Task Delete(int stadiumId)
{
var entity = await _stadiumRepository.FindAsyncFirst(x => x.Id == stadiumId);
if (entity == null)
throw new Exception("未找到需要删除的场馆信息");
_stadiumRepository.Delete(entity);
await _stadiumRepository.SaveChangesAsync();
}
///
/// 场馆预约列表
///
///
///
public async Task> StadiumVisitingList(StadiumVisitingVo dto)
{
var res = new PageDataDto();
var query = from s in _stadiumRepository.DbContext.Set().Where(x => x.StadiumId == dto.StadiumId)
select new StadiumVisitingDto()
{
Id = s.Id,
StadiumId = s.StadiumId,
PhoneNo = s.PhoneNo,
Remarks = s.Remarks,
Status = s.Status,
UpdateTime = s.UpdateTime,
UserName = s.UserName,
VisitingTime = s.VisitingTime
};
if (!string.IsNullOrWhiteSpace(dto.PhoneNo))
{
query = query.Where(x => x.PhoneNo.Contains(dto.PhoneNo));
}
res.Total = await query.CountAsync();
var list = await query
.Skip((dto.PageIndex - 1) * dto.PageSize)
.Take(dto.PageSize)
.OrderBy(x => x.Id)
.ToListAsync();
res.Datas = list;
return res;
}
///
/// 上传图片/视频
///
public Y_StadiumResource UploadImage(IFormFile file)
{
var timeStampString = DateTime.Now.ToUnixTimeStamp();
var prefix = $"Upload/Stadium/";
// 删除文件
//ALiYunOss.DeleteFilesByPrefix(prefix);
// 上传文件
var url = ALiYunOss.Upload(file, prefix, timeStampString);
var extension = Path.GetExtension(file.FileName).ToLower();
return new Y_StadiumResource()
{
Type = new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" }.Contains(extension) ? 1 :
new[] { ".mp4", ".avi", ".mov", ".mkv", ".wmv" }.Contains(extension) ? 2 :
0,
Url = url
};
//var entity = new Y_StadiumResource();
//entity.Url = url; var extension = Path.GetExtension(file.FileName).ToLower();
//entity.Type =
// new[] { ".jpg", ".jpeg", ".png", ".gif", ".bmp" }.Contains(extension) ? 1 :
// new[] { ".mp4", ".avi", ".mov", ".mkv", ".wmv" }.Contains(extension) ? 2 :
// 0;
//var stadiumId = await _stadiumRepository.FindAsIQueryable(c => c.Id == c.Id).Select(c => c.Id).FirstOrDefaultAsync();
//entity.StadiumId = stadiumId;
//_stadiumRepository.Add(entity);
//_stadiumRepository.SaveChanges();
//return entity;
}
}
}