tuiwucarrer/Admin.NET/Admin.NET.Application/Service/BusVipCardInfo/BusVipCardInfoService.cs

232 lines
8.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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;
}
}