232 lines
8.2 KiB
C#
232 lines
8.2 KiB
C#
using Admin.NET.Core.Service;
|
||
using Microsoft.AspNetCore.Http;
|
||
using Microsoft.CodeAnalysis.CSharp.Syntax;
|
||
using Minio.DataModel;
|
||
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
|
||
namespace Admin.NET.Application;
|
||
/// <summary>
|
||
/// Vip卡生成服务
|
||
/// </summary>
|
||
[ApiDescriptionSettings(ApplicationConst.ZYGroupName, Order = 100)]
|
||
public class BusVipCardInfoService : IDynamicApiController, ITransient
|
||
{
|
||
private readonly SqlSugarRepository<BusVipCardInfo> _rep;
|
||
private readonly SqlSugarRepository<SysDictData> _dictdata;
|
||
public BusVipCardInfoService(SqlSugarRepository<BusVipCardInfo> rep, SqlSugarRepository<SysDictData> _dictrep)
|
||
{
|
||
_rep = rep;
|
||
_dictdata = _dictrep;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 分页查询Vip卡生成
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[ApiDescriptionSettings(Name = "Page")]
|
||
public async Task<SqlSugarPagedList<BusVipCardInfoOutput>> Page(BusVipCardInfoInput input)
|
||
{
|
||
var query = _rep.AsQueryable()
|
||
.WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
|
||
u.Code.Contains(input.SearchKey.Trim())
|
||
|| u.Pwd.Contains(input.SearchKey.Trim())
|
||
)
|
||
.WhereIF(!string.IsNullOrWhiteSpace(input.Code), u => u.Code.Contains(input.Code.Trim()))
|
||
.WhereIF(!string.IsNullOrWhiteSpace(input.Pwd), u => u.Pwd.Contains(input.Pwd.Trim()))
|
||
.WhereIF(input.IsBind > 0, u => u.IsBind == input.IsBind)
|
||
.WhereIF(input.Day > 0, u => u.Day == input.Day)
|
||
.WhereIF(input.CardTypeId > 0, u => u.CardTypeId == input.CardTypeId)
|
||
//处理外键和TreeSelector相关字段的连接
|
||
.LeftJoin<SysDictData>((u, cardtypeid) => u.CardTypeId == cardtypeid.Id)
|
||
.OrderBy(u => u.CreateTime)
|
||
.Select((u, cardtypeid) => new BusVipCardInfoOutput
|
||
{
|
||
Id = u.Id,
|
||
Code = u.Code,
|
||
Pwd = u.Pwd,
|
||
IsBind = u.IsBind,
|
||
Day = u.Day,
|
||
EndTime = u.EndTime,
|
||
Money = u.Money,
|
||
CardTypeId = u.CardTypeId,
|
||
CardTypeIdName = cardtypeid.Name,
|
||
TenantId = u.TenantId,
|
||
CreateTime = u.CreateTime,
|
||
UpdateTime = u.UpdateTime,
|
||
CreateUserId = u.CreateUserId,
|
||
CreateUserName = u.CreateUserName,
|
||
UpdateUserId = u.UpdateUserId,
|
||
UpdateUserName = u.UpdateUserName,
|
||
IsDelete = u.IsDelete,
|
||
});
|
||
if (input.EndTimeRange != null && input.EndTimeRange.Count > 0)
|
||
{
|
||
DateTime? start = input.EndTimeRange[0];
|
||
query = query.WhereIF(start.HasValue, u => u.EndTime > start);
|
||
if (input.EndTimeRange.Count > 1 && input.EndTimeRange[1].HasValue)
|
||
{
|
||
var end = input.EndTimeRange[1].Value.AddDays(1);
|
||
query = query.Where(u => u.EndTime < end);
|
||
}
|
||
}
|
||
return await query.OrderBuilder(input).ToPagedListAsync(input.Page, input.PageSize);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 增加Vip卡生成
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[ApiDescriptionSettings(Name = "Add")]
|
||
public async Task<long> Add(AddBusVipCardInfoInput input)
|
||
{
|
||
var entity = input.Adapt<BusVipCardInfo>();
|
||
await _rep.InsertAsync(entity);
|
||
return entity.Id;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 删除Vip卡生成
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[ApiDescriptionSettings(Name = "Delete")]
|
||
public async Task Delete(DeleteBusVipCardInfoInput input)
|
||
{
|
||
var entity = await _rep.GetFirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D1002);
|
||
await _rep.FakeDeleteAsync(entity); //假删除
|
||
//await _rep.DeleteAsync(entity); //真删除
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新Vip卡生成
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[ApiDescriptionSettings(Name = "Update")]
|
||
public async Task Update(UpdateBusVipCardInfoInput input)
|
||
{
|
||
var entity = input.Adapt<BusVipCardInfo>();
|
||
await _rep.AsUpdateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取Vip卡生成
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[HttpGet]
|
||
[ApiDescriptionSettings(Name = "Detail")]
|
||
public async Task<BusVipCardInfo> Detail([FromQuery] QueryByIdBusVipCardInfoInput input)
|
||
{
|
||
return await _rep.GetFirstAsync(u => u.Id == input.Id);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取Vip卡生成列表
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[HttpGet]
|
||
[ApiDescriptionSettings(Name = "List")]
|
||
public async Task<List<BusVipCardInfoOutput>> List([FromQuery] BusVipCardInfoInput input)
|
||
{
|
||
return await _rep.AsQueryable().Select<BusVipCardInfoOutput>().ToListAsync();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取卡类型Id列表
|
||
/// </summary>
|
||
/// <param name="input"></param>
|
||
/// <returns></returns>
|
||
[ApiDescriptionSettings(Name = "SysDictDataCardTypeIdDropdown"), HttpGet]
|
||
public async Task<dynamic> SysDictDataCardTypeIdDropdown()
|
||
{
|
||
return await _rep.Context.Queryable<SysDictData>().Where(e => e.DictTypeId == 656829828702277)
|
||
.Select(u => new
|
||
{
|
||
Label = u.Name,
|
||
Value = u.Id
|
||
}
|
||
).ToListAsync();
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 批量生成卡号(只可以生成高三的一年卡)
|
||
/// </summary>
|
||
/// <returns></returns>
|
||
[HttpPost]
|
||
[ApiDescriptionSettings(Name = "GenerateVipCards")]
|
||
public async Task<dynamic> GenerateVipCards([FromBody] GenrateVipCardRequestDto genrate)
|
||
{
|
||
|
||
if (genrate.Count <= 0 || string.IsNullOrWhiteSpace(genrate.Prefix))
|
||
{
|
||
throw Oops.Oh("参数无效");
|
||
}
|
||
|
||
var cardtypeInfo = await _dictdata.AsQueryable().Where(e => e.Id == genrate.CardTypeId).FirstAsync();
|
||
if (cardtypeInfo == null)
|
||
throw Oops.Oh("卡类型无效");
|
||
|
||
var random = new Random();
|
||
var generatedCards = new List<BusVipCardInfo>();
|
||
|
||
// 1. 查询数据库中已有的卡号,放入 HashSet
|
||
var existingCodes = new HashSet<string>(await _rep.AsQueryable().Select(c => c.Code)
|
||
.ToListAsync());
|
||
// 计算卡号有效期,统一截止至当年8月31日
|
||
DateTime now = DateTime.UtcNow;
|
||
DateTime expiryDate = new DateTime(now.Year, 8, 31, 23, 59, 59);
|
||
if (now > expiryDate) // 如果当前时间已过8月31日,则设置为下一年的8月31日
|
||
{
|
||
expiryDate = expiryDate.AddYears(1);
|
||
}
|
||
|
||
|
||
while (generatedCards.Count < genrate.Count)
|
||
{
|
||
var newCodes = new HashSet<string>();
|
||
|
||
// 2. 一次性生成 count * 2 个随机卡号,避免频繁检查
|
||
while (newCodes.Count < genrate.Count * 2)
|
||
{
|
||
string cardNumber = genrate.Prefix + random.Next(100000, 999999); // 6 位随机数
|
||
if (!existingCodes.Contains(cardNumber)) // 只添加不重复的
|
||
{
|
||
newCodes.Add(cardNumber);
|
||
}
|
||
}
|
||
|
||
// 3. 过滤掉已经在数据库中的卡号
|
||
var uniqueNewCodes = newCodes.Except(existingCodes).Take(genrate.Count - generatedCards.Count).ToList();
|
||
|
||
// 4. 生成卡信息
|
||
generatedCards.AddRange(uniqueNewCodes.Select(cardNumber => new BusVipCardInfo
|
||
{
|
||
Code = cardNumber,
|
||
Pwd = random.Next(100000, 999999).ToString(),
|
||
IsBind = 0,
|
||
Day = (expiryDate - now).Days, // 剩余天数
|
||
EndTime = expiryDate,
|
||
Money = decimal.Parse(cardtypeInfo.Code),
|
||
CardTypeId = genrate.CardTypeId,
|
||
}));
|
||
}
|
||
// 6. 批量插入数据库
|
||
await _rep.InsertRangeAsync(generatedCards);
|
||
|
||
return generatedCards;
|
||
}
|
||
|
||
|
||
|
||
|
||
}
|
||
|