using AdminService.GameConfigs;
using Common;
using CommonDomain;
using CommonDomain.BaseModel;
using CommonInfrastructure;
using Microsoft.AspNetCore.Mvc;
namespace AdminApi.Lottery
{
[ApiController, Route("adminapi/[controller]")]
public class LotteryController : BaseController
{
private readonly IActivityConfigService _activityConfigService;
private readonly IGameConfigService _gameConfigService;
public LotteryController(IActivityConfigService activityConfigService, IGameConfigService gameConfigService)
{
_activityConfigService = activityConfigService;
_gameConfigService = gameConfigService;
}
///
/// 获取奖池抽奖活动列表(基于 ActivityConfig 中的 LotteryActivityConfig)
///
[HttpGet("list")]
public async Task>> List()
{
var config = await _activityConfigService.Get();
if (config == null)
return this.ToResult(new List());
var lotto = config.LotteryActivityConfig;
if (lotto == null || string.IsNullOrWhiteSpace(lotto.ActivityName))
return this.ToResult(new List());
LotteryPrizeProductHelper.Enrich(lotto, await _gameConfigService.Get());
var vm = new LotteryActivityVm
{
ActivityId = config.Id,
ActivityName = lotto.ActivityName,
IsOpen = lotto.IsOpen,
StartTime = lotto.StartTime,
EndTime = lotto.EndTime,
CostsByPool = lotto.CostsByPool,
UserMaxDraw = lotto.UserMaxDraw,
Pools = lotto.Pools
};
return this.ToResult(new List { vm });
}
///
/// 获取奖池抽奖活动详情
///
[HttpGet("detail")]
public async Task> Detail([FromQuery] string activityId)
{
var config = await _activityConfigService.Get();
if (config == null)
return this.ToFailResult("活动配置不存在");
LotteryPrizeProductHelper.Enrich(config.LotteryActivityConfig, await _gameConfigService.Get());
var vm = new LotteryActivityVm
{
ActivityId = config.Id,
ActivityName = config.LotteryActivityConfig.ActivityName,
IsOpen = config.LotteryActivityConfig.IsOpen,
StartTime = config.LotteryActivityConfig.StartTime,
EndTime = config.LotteryActivityConfig.EndTime,
CostsByPool = config.LotteryActivityConfig.CostsByPool,
UserMaxDraw = config.LotteryActivityConfig.UserMaxDraw,
Pools = config.LotteryActivityConfig.Pools
};
return this.ToResult(vm);
}
///
/// 保存奖池抽奖活动配置(新增或更新)
///
[HttpPost("save")]
public async Task> Save([FromBody] LotteryActivityVm param)
{
if (string.IsNullOrWhiteSpace(param.ActivityName))
return this.ToFailResult("活动名称不能为空");
var pools = param.Pools ?? new List();
if (pools.SelectMany(pool => pool.PrizeList ?? new List())
.Any(prize => !string.IsNullOrWhiteSpace(prize.OtherId)))
{
var gameConfig = await _gameConfigService.Get();
if (gameConfig == null)
return this.ToFailResult("道具配置不存在,无法补全奖项信息");
EnrichPrizeProducts(pools, gameConfig);
}
var activityConfig = await _activityConfigService.Get() ?? new ActivityConfig();
var previousLottery = activityConfig.LotteryActivityConfig;
var cycleChanged = previousLottery == null
|| previousLottery.StartTime != param.StartTime
|| previousLottery.EndTime != param.EndTime;
if (cycleChanged)
{
foreach (var prize in pools.SelectMany(pool => pool.PrizeList ?? new List()))
prize.DrawnCount = 0;
}
var normalizedCostsByPool = new Dictionary>();
var poolNames = new Dictionary { [1] = "炮台", [2] = "战神", [3] = "翅膀" };
for (var poolType = 1; poolType <= 3; poolType++)
{
List? poolCosts = null;
param.CostsByPool?.TryGetValue(poolType, out poolCosts);
var validPoolCosts = poolCosts?.Where(cost => cost > 0).ToList();
if (validPoolCosts == null || validPoolCosts.Count == 0)
return this.ToFailResult($"请配置{poolNames[poolType]}奖池消耗金币");
normalizedCostsByPool[poolType] = validPoolCosts;
}
activityConfig.LotteryActivityConfig = new LotteryActivityConfig
{
ActivityName = param.ActivityName,
IsOpen = param.IsOpen,
StartTime = param.StartTime,
EndTime = param.EndTime,
CostsByPool = normalizedCostsByPool,
UserMaxDraw = param.UserMaxDraw,
Pools = pools
};
var res = await _activityConfigService.Update(activityConfig);
if (res.isok)
return this.ToResult("保存成功");
else
return this.ToFailResult(res.msg);
}
private static void EnrichPrizeProducts(List pools, GameConfig gameConfig)
{
LotteryPrizeProductHelper.Enrich(new LotteryActivityConfig { Pools = pools }, gameConfig);
}
///
/// 切换奖池抽奖活动开启/关闭状态
///
[HttpPost("toggle")]
public async Task> Toggle([FromBody] LotteryToggleParam param)
{
var activityConfig = await _activityConfigService.Get();
if (activityConfig == null)
return this.ToFailResult("活动配置不存在");
activityConfig.LotteryActivityConfig.IsOpen = param.IsOpen;
var res = await _activityConfigService.Update(activityConfig);
if (res.isok)
return this.ToResult(param.IsOpen ? "活动已开启" : "活动已关闭");
else
return this.ToFailResult(res.msg);
}
///
/// 从独立模板初始化完整奖池配置。只在管理员明确点击时执行,其他活动配置不变。
///
[HttpPost("initialize")]
public async Task> Initialize()
{
var path = Path.Combine(AppContext.BaseDirectory, "Config", "lottery-init.json");
if (!global::System.IO.File.Exists(path))
return this.ToFailResult("奖池初始化模板不存在");
LotteryActivityConfig? template;
try
{
var json = await global::System.IO.File.ReadAllTextAsync(path);
template = global::System.Text.Json.JsonSerializer.Deserialize(json,
new global::System.Text.Json.JsonSerializerOptions { PropertyNameCaseInsensitive = true });
}
catch (global::System.Text.Json.JsonException)
{
return this.ToFailResult("奖池初始化模板格式错误");
}
var pools = template?.Pools;
var prizes = pools?.SelectMany(pool => pool.PrizeList ?? new List()).ToList();
if (template == null || string.IsNullOrWhiteSpace(template.ActivityName)
|| template.CostsByPool == null
|| new[] { 1, 2, 3 }.Any(type => !template.CostsByPool.TryGetValue(type, out var costs) || costs == null || costs.Count == 0)
|| pools == null || pools.Count == 0 || prizes == null || prizes.Count == 0
|| new[] { 1, 2, 3 }.Any(type => !pools.Any(pool => pool.PoolType == type && pool.PrizeList?.Count > 0))
|| prizes.Any(prize => string.IsNullOrWhiteSpace(prize.PrizeId))
|| prizes.Select(prize => prize.PrizeId).Distinct().Count() != prizes.Count)
return this.ToFailResult("奖池初始化模板不完整,未修改现有配置");
template.IsOpen = false;
foreach (var prize in prizes) prize.DrawnCount = 0;
var config = await _activityConfigService.Get() ?? new ActivityConfig();
config.LotteryActivityConfig = template;
var result = await _activityConfigService.Update(config);
return result.isok
? this.ToResult("奖池配置已初始化,活动保持关闭")
: this.ToFailResult(result.msg);
}
///
/// 删除奖池抽奖活动配置(重置为默认空配置)
///
[HttpDelete("delete")]
public async Task> Delete()
{
var activityConfig = await _activityConfigService.Get();
if (activityConfig == null)
return this.ToFailResult("活动配置不存在");
activityConfig.LotteryActivityConfig = new LotteryActivityConfig();
var res = await _activityConfigService.Update(activityConfig);
if (res.isok)
return this.ToResult("删除成功");
else
return this.ToFailResult(res.msg);
}
}
public class LotteryActivityVm
{
public string ActivityId { get; set; } = string.Empty;
public string ActivityName { get; set; } = string.Empty;
public bool IsOpen { get; set; } = false;
public long StartTime { get; set; } = 0;
public long EndTime { get; set; } = 0;
public Dictionary> CostsByPool { get; set; } = new Dictionary>();
public int UserMaxDraw { get; set; } = 100;
public List Pools { get; set; } = new List();
}
public class LotteryToggleParam
{
public string ActivityId { get; set; } = string.Empty;
public bool IsOpen { get; set; }
}
}