2025-06-06 16:00:39 +08:00
|
|
|
|
using AutoMapper;
|
|
|
|
|
using EFCore.BulkExtensions;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
|
|
|
|
|
using OpenCvSharp;
|
|
|
|
|
using Quartz.Util;
|
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
|
using System.Threading;
|
|
|
|
|
using VOL.Business.IRepositories;
|
|
|
|
|
using VOL.Business.IServices.School;
|
|
|
|
|
using VOL.Core.CacheManager;
|
|
|
|
|
using VOL.Core.Configuration;
|
|
|
|
|
using VOL.Core.Extensions.AutofacManager;
|
|
|
|
|
using VOL.Core.ManageUser;
|
|
|
|
|
using VOL.Entity.DomainModels;
|
|
|
|
|
using VOL.Entity.DomainModels.Business.People;
|
|
|
|
|
using VOL.Entity.Enum;
|
|
|
|
|
using VOL.Model;
|
|
|
|
|
using VOL.Model.Norm.Response;
|
|
|
|
|
using VOL.Model.School.Request;
|
|
|
|
|
using VOL.Model.School.Response;
|
|
|
|
|
using VOL.System.IRepositories;
|
|
|
|
|
using VOL.System.Repositories;
|
|
|
|
|
using static Dapper.SqlMapper;
|
|
|
|
|
using static System.Formats.Asn1.AsnWriter;
|
|
|
|
|
|
|
|
|
|
namespace VOL.Business.Services.School
|
|
|
|
|
{
|
|
|
|
|
public class S_SchoolService : IS_SchoolService, IDependency
|
|
|
|
|
{
|
|
|
|
|
#region 初始化
|
|
|
|
|
private readonly IMapper _mapper;
|
|
|
|
|
private readonly ICacheService _cacheService;
|
|
|
|
|
private readonly IS_SchoolRepository _schoolRepository;
|
|
|
|
|
private readonly IS_SchoolNatureAssocGradeRepository _natureAssocGradeRepository;
|
|
|
|
|
private readonly ISys_UserRepository _userRepository;
|
|
|
|
|
private readonly IS_GradeRepository _gradeRepository;
|
|
|
|
|
|
|
|
|
|
[ActivatorUtilitiesConstructor]
|
|
|
|
|
public S_SchoolService(IMapper mapper,
|
|
|
|
|
ICacheService cacheService,
|
|
|
|
|
IS_SchoolRepository schoolRepository,
|
|
|
|
|
IS_SchoolNatureAssocGradeRepository natureAssocGradeRepository,
|
|
|
|
|
ISys_UserRepository userRepository,
|
|
|
|
|
IS_GradeRepository gradeRepository)
|
|
|
|
|
{
|
|
|
|
|
_mapper = mapper;
|
|
|
|
|
_cacheService = cacheService;
|
|
|
|
|
_schoolRepository = schoolRepository;
|
|
|
|
|
_natureAssocGradeRepository = natureAssocGradeRepository;
|
|
|
|
|
_userRepository = userRepository;
|
|
|
|
|
_gradeRepository = gradeRepository;
|
|
|
|
|
}
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
public async Task<PageDataDto<SchoolPageListModel>> GetSchoolPageList(SchoolPageListParam paramDto)
|
|
|
|
|
{
|
|
|
|
|
var res = new PageDataDto<SchoolPageListModel>();
|
|
|
|
|
|
|
|
|
|
var query = from s in _schoolRepository.DbContext.Set<S_School>()
|
|
|
|
|
join u in _userRepository.DbContext.Set<Sys_User>()
|
|
|
|
|
on s.SchoolCode equals u.SchoolCode
|
|
|
|
|
where u.Role_Id == 2 || u.Role_Id == 4
|
|
|
|
|
select new SchoolPageListModel()
|
|
|
|
|
{
|
|
|
|
|
Id = s.Id,
|
|
|
|
|
SchoolCode = s.SchoolCode,
|
|
|
|
|
SchoolName = s.SchoolName,
|
|
|
|
|
Area = s.Area,
|
|
|
|
|
City = s.City,
|
|
|
|
|
Province = s.Province,
|
|
|
|
|
SchoolNatureId = s.SchoolNatureId,
|
|
|
|
|
CreateDate = s.CreateDate,
|
|
|
|
|
Status = u.Enable,
|
|
|
|
|
UserName = u.UserName,
|
|
|
|
|
UserTrueName = u.UserTrueName,
|
|
|
|
|
PhoneNo = u.PhoneNo,
|
|
|
|
|
SchoolType = s.SchoolType
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(paramDto.SchoolName))
|
|
|
|
|
{
|
|
|
|
|
query = query.Where(x => x.SchoolName.Contains(paramDto.SchoolName));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(paramDto.SchoolCode))
|
|
|
|
|
{
|
|
|
|
|
query = query.Where(x => x.SchoolCode.Equals(paramDto.SchoolCode));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(paramDto.UserTrueName))
|
|
|
|
|
{
|
|
|
|
|
query = query.Where(x => x.UserTrueName.Equals(paramDto.UserTrueName));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(paramDto.PhoneNo))
|
|
|
|
|
{
|
|
|
|
|
query = query.Where(x => x.PhoneNo.Equals(paramDto.PhoneNo));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (paramDto.Status > 0)
|
|
|
|
|
{
|
|
|
|
|
query = query.Where(x => x.Status == (int)paramDto.Status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (paramDto.SchoolType > 0)
|
|
|
|
|
{
|
|
|
|
|
query = query.Where(x => x.SchoolType == paramDto.SchoolType);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res.Total = await query.CountAsync();
|
|
|
|
|
|
|
|
|
|
var list = await query.OrderByDescending(x => x.Id)
|
|
|
|
|
.Skip((paramDto.PageIndex - 1) * paramDto.PageSize)
|
|
|
|
|
.Take(paramDto.PageSize)
|
|
|
|
|
.ToListAsync();
|
|
|
|
|
res.Datas = list;
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<bool> DeviceCodeIsExists(string code)
|
|
|
|
|
{
|
|
|
|
|
var deviceExists = _schoolRepository.Exists<Ai_DeviceAssocSchool>(x => x.Code == code);
|
|
|
|
|
|
|
|
|
|
return deviceExists;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task Add(AddSchoolParam paramDto)
|
|
|
|
|
{
|
|
|
|
|
var school_Entity = _mapper.Map<S_School>(paramDto);
|
|
|
|
|
|
|
|
|
|
var maxId = await _schoolRepository.FindAsIQueryable(x => true).Select(x => x.SchoolCode).MaxAsync();
|
|
|
|
|
string nextSchoolCode = IncrementId(maxId);
|
|
|
|
|
school_Entity.SchoolCode = nextSchoolCode;
|
|
|
|
|
school_Entity.CreateDate = DateTime.Now;
|
|
|
|
|
school_Entity.Creator = UserContext.Current.UserId;
|
|
|
|
|
|
|
|
|
|
var gradeEntityList = new List<S_SchoolAssocGrade>();
|
|
|
|
|
|
|
|
|
|
if (paramDto.SchoolType == SchoolType.School)
|
|
|
|
|
{
|
|
|
|
|
var natureList = await _natureAssocGradeRepository.FindAsync(x => x.NatureId == paramDto.SchoolNatureId);
|
|
|
|
|
if (natureList == null || natureList.Count == 0)
|
|
|
|
|
throw new Exception($"未找到学校性质:{paramDto.SchoolNatureId}");
|
|
|
|
|
|
|
|
|
|
var user = await _userRepository.FindAsyncFirst(x => x.UserName == paramDto.UserName && x.Role_Id == 2);
|
|
|
|
|
if (user != null)
|
|
|
|
|
throw new Exception($"用户名为{paramDto.UserName}的学校已存在");
|
|
|
|
|
|
|
|
|
|
foreach (var nature in natureList)
|
|
|
|
|
{
|
|
|
|
|
gradeEntityList.Add(new S_SchoolAssocGrade()
|
|
|
|
|
{
|
|
|
|
|
SchoolCode = nextSchoolCode,
|
|
|
|
|
GradeId = nature.GradeId
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
var grade = await _gradeRepository.FindAsIQueryable(x => x.GradeName == "运动馆").FirstOrDefaultAsync();
|
|
|
|
|
gradeEntityList.Add(new S_SchoolAssocGrade()
|
|
|
|
|
{
|
|
|
|
|
SchoolCode = nextSchoolCode,
|
|
|
|
|
GradeId = grade?.Id ?? 0
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var userEntity = new Sys_User()
|
|
|
|
|
{
|
2025-06-06 16:38:49 +08:00
|
|
|
|
Role_Id = paramDto.SchoolType == SchoolType.School ? 2 : 4,
|
|
|
|
|
RoleName = paramDto.SchoolType == SchoolType.School ? "学校" : "运动馆",
|
2025-06-06 16:00:39 +08:00
|
|
|
|
SchoolCode = nextSchoolCode,
|
|
|
|
|
Enable = 1,
|
|
|
|
|
SchoolName = paramDto.SchoolName,
|
|
|
|
|
UserName = paramDto.UserName,
|
|
|
|
|
PhoneNo = paramDto.PhoneNo,
|
|
|
|
|
UserPwd = AppSetting.OriginalPwd,
|
|
|
|
|
UserTrueName = paramDto.UserTrueName,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var deviceAsocSchools = new List<Ai_DeviceAssocSchool>();
|
|
|
|
|
|
|
|
|
|
foreach (var code in paramDto.DeviceCode)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(code))
|
|
|
|
|
{
|
|
|
|
|
var deviceCodeIsExists = await this.DeviceCodeIsExists(code);
|
|
|
|
|
if (deviceCodeIsExists)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"设备编号{code}已存在");
|
|
|
|
|
}
|
|
|
|
|
deviceAsocSchools.Add(new Ai_DeviceAssocSchool()
|
|
|
|
|
{
|
|
|
|
|
Code = code,
|
|
|
|
|
SchoolCode = nextSchoolCode
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var transaction = _schoolRepository.DbContext.Database.BeginTransaction())
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
await _schoolRepository.AddAsync(school_Entity);
|
|
|
|
|
await _gradeRepository.DbContext.Set<S_SchoolAssocGrade>().AddRangeAsync(gradeEntityList);
|
|
|
|
|
await _gradeRepository.DbContext.Set<Ai_DeviceAssocSchool>().AddRangeAsync(deviceAsocSchools);
|
|
|
|
|
await _userRepository.AddAsync(userEntity);
|
|
|
|
|
await _schoolRepository.SaveChangesAsync();
|
|
|
|
|
// 提交事务
|
|
|
|
|
await transaction.CommitAsync();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
// 发生错误,回滚事务
|
|
|
|
|
await transaction.RollbackAsync();
|
|
|
|
|
throw new Exception(ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<SchoolPageListModel> Details(string schoolCode)
|
|
|
|
|
{
|
|
|
|
|
var schoolModel = await (from s in _schoolRepository.DbContext.Set<S_School>()
|
|
|
|
|
join u in _userRepository.DbContext.Set<Sys_User>()
|
|
|
|
|
on s.SchoolCode equals u.SchoolCode
|
|
|
|
|
where u.Role_Id == 2 || u.Role_Id == 4 && s.SchoolCode == schoolCode
|
|
|
|
|
where s.SchoolCode == schoolCode
|
|
|
|
|
select new SchoolPageListModel()
|
|
|
|
|
{
|
|
|
|
|
Id = s.Id,
|
|
|
|
|
SchoolCode = s.SchoolCode,
|
|
|
|
|
SchoolName = s.SchoolName,
|
|
|
|
|
Area = s.Area,
|
|
|
|
|
City = s.City,
|
|
|
|
|
Province = s.Province,
|
|
|
|
|
SchoolNatureId = s.SchoolNatureId,
|
|
|
|
|
CreateDate = s.CreateDate,
|
|
|
|
|
Status = u.Enable,
|
|
|
|
|
UserName = u.UserName,
|
|
|
|
|
UserTrueName = u.UserTrueName,
|
|
|
|
|
PhoneNo = u.PhoneNo,
|
|
|
|
|
SchoolType = s.SchoolType
|
|
|
|
|
}).FirstOrDefaultAsync();
|
|
|
|
|
|
|
|
|
|
if (schoolModel != null)
|
|
|
|
|
{
|
|
|
|
|
var codes = await _gradeRepository.DbContext.Set<Ai_DeviceAssocSchool>().Where(x => x.SchoolCode == schoolCode)
|
|
|
|
|
.Select(x => x.Code)
|
|
|
|
|
.ToListAsync();
|
|
|
|
|
|
|
|
|
|
schoolModel.DeviceCode = codes;
|
|
|
|
|
}
|
|
|
|
|
return schoolModel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task Modify(AddSchoolParam paramDto)
|
|
|
|
|
{
|
|
|
|
|
var schoolModel = await _schoolRepository.FindAsyncFirst(x => x.SchoolCode.Equals(paramDto.SchoolCode));
|
|
|
|
|
schoolModel.SchoolNatureId = schoolModel.SchoolNatureId;
|
|
|
|
|
schoolModel.SchoolName = schoolModel.SchoolName;
|
|
|
|
|
schoolModel.SchoolCode = schoolModel.SchoolCode;
|
|
|
|
|
schoolModel.Area = schoolModel.Area;
|
|
|
|
|
schoolModel.City = schoolModel.City;
|
|
|
|
|
schoolModel.Province = schoolModel.Province;
|
|
|
|
|
schoolModel.ModifyDate = DateTime.Now;
|
|
|
|
|
schoolModel.Modifier = UserContext.Current.UserId;
|
|
|
|
|
|
|
|
|
|
var user = await _userRepository.FindAsyncFirst(x => x.UserName == paramDto.UserName && x.Role_Id == 2);
|
|
|
|
|
if (user == null)
|
|
|
|
|
throw new Exception($"未找到用户名为{paramDto.UserName}的学校");
|
|
|
|
|
|
|
|
|
|
user.PhoneNo = paramDto.PhoneNo;
|
|
|
|
|
user.UserName = paramDto.UserName;
|
|
|
|
|
user.UserTrueName = paramDto.UserTrueName;
|
|
|
|
|
|
|
|
|
|
var deviceAsocSchools = new List<Ai_DeviceAssocSchool>();
|
|
|
|
|
|
|
|
|
|
foreach (var code in paramDto.DeviceCode)
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(code))
|
|
|
|
|
{
|
|
|
|
|
var deviceCodeIsExists = await this.DeviceCodeIsExists(code);
|
|
|
|
|
if (deviceCodeIsExists)
|
|
|
|
|
{
|
|
|
|
|
throw new Exception($"设备编号{code}已存在");
|
|
|
|
|
}
|
|
|
|
|
deviceAsocSchools.Add(new Ai_DeviceAssocSchool()
|
|
|
|
|
{
|
|
|
|
|
Code = code,
|
|
|
|
|
SchoolCode = schoolModel.SchoolCode
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
using (var transaction = _schoolRepository.DbContext.Database.BeginTransaction())
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
var deviceAssocSchools = await _gradeRepository.DbContext.Set<Ai_DeviceAssocSchool>().Where(x => x.SchoolCode == schoolModel.SchoolCode).ToListAsync();
|
|
|
|
|
_gradeRepository.DbContext.Set<Ai_DeviceAssocSchool>().RemoveRange(deviceAssocSchools);
|
|
|
|
|
|
|
|
|
|
_schoolRepository.Update(schoolModel);
|
|
|
|
|
_userRepository.Update(user);
|
|
|
|
|
await _gradeRepository.DbContext.Set<Ai_DeviceAssocSchool>().AddRangeAsync(deviceAsocSchools);
|
|
|
|
|
await _schoolRepository.SaveChangesAsync();
|
|
|
|
|
// 提交事务
|
|
|
|
|
await transaction.CommitAsync();
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
// 发生错误,回滚事务
|
|
|
|
|
await transaction.RollbackAsync();
|
|
|
|
|
throw new Exception(ex.Message);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task ModifyStatus(SchoolStatusParam paramDto)
|
|
|
|
|
{
|
|
|
|
|
var user = await _userRepository.FindAsyncFirst(x => x.SchoolCode == paramDto.SchoolCode);
|
|
|
|
|
if (user == null)
|
|
|
|
|
throw new Exception("未找到更新数据");
|
|
|
|
|
|
|
|
|
|
user.Enable = (int)paramDto.Status;
|
|
|
|
|
_userRepository.Update(user);
|
|
|
|
|
await _userRepository.SaveChangesAsync();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task UpdatePwd(SchoolParam paramDto)
|
|
|
|
|
{
|
|
|
|
|
var user = await _userRepository.FindAsyncFirst(x => x.SchoolCode == paramDto.SchoolCode);
|
|
|
|
|
if (user == null)
|
|
|
|
|
throw new Exception("未找到更新数据");
|
|
|
|
|
|
|
|
|
|
user.UserPwd = AppSetting.OriginalPwd;
|
|
|
|
|
|
|
|
|
|
_userRepository.Update(user);
|
|
|
|
|
await _userRepository.SaveChangesAsync();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public async Task<bool> UserNameIsExists(string userName)
|
|
|
|
|
{
|
|
|
|
|
var userExists = await _userRepository.ExistsAsync(x => x.UserName == userName);
|
|
|
|
|
return userExists;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string IncrementId(string maxId)
|
|
|
|
|
{
|
|
|
|
|
// 获取当前日期的前缀(年年年年+月月+日日)
|
|
|
|
|
string datePrefix = DateTime.Now.ToString("yyyyMMdd");
|
|
|
|
|
|
|
|
|
|
// 提取后4位编号部分
|
|
|
|
|
string numberPart = maxId.Substring(maxId.Length - 4);
|
|
|
|
|
|
|
|
|
|
// 将编号部分转为整数并加1
|
|
|
|
|
if (!int.TryParse(numberPart, out int number))
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("编号部分格式不正确,应为数字");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查编号是否超出范围
|
|
|
|
|
if (number >= 9999)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("编号已达到最大值");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 返回新的编号,保持当前日期前缀和递增后的编号
|
|
|
|
|
return $"{datePrefix}{(number + 1):D4}";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public async Task<List<SchoolNatureListModel>> GetSchoolNatureList()
|
|
|
|
|
{
|
|
|
|
|
var res = await _schoolRepository.DbContext.Set<S_SchoolNature>().Select(s => new SchoolNatureListModel()
|
|
|
|
|
{
|
|
|
|
|
Id = s.Id,
|
|
|
|
|
Name = s.NatureName
|
|
|
|
|
|
|
|
|
|
}).ToListAsync();
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|