feat(pricing): 实现批次统计功能

- 查询批次配置和券码数据
- 统计每个券码的使用情况,包括状态、使用次数、剩余次数等信息
- 计算是否还能使用和剩余使用次数
- 获取使用记录数和最后使用时间
- 返回批次统计结果列表
This commit is contained in:
2025-09-17 16:36:50 +08:00
parent 6d3fecc1c8
commit 1c0c0393aa

View File

@@ -140,8 +140,81 @@ public class VoucherUsageServiceImpl implements IVoucherUsageService {
@Override
public List<VoucherUsageStatsResp> getBatchUsageStats(Long batchId) {
// 这里可以实现批次统计,暂时返回空列表
return new ArrayList<>();
if (batchId == null) {
return new ArrayList<>();
}
// 查询批次配置
PriceVoucherBatchConfig batchConfig = batchConfigMapper.selectById(batchId);
if (batchConfig == null || batchConfig.getDeleted() == 1) {
log.warn("批次配置不存在或已删除: batchId={}", batchId);
return new ArrayList<>();
}
// 查询该批次下的所有券码
List<PriceVoucherCode> voucherCodes = voucherCodeMapper.selectByBatchId(batchId);
if (voucherCodes == null || voucherCodes.isEmpty()) {
log.info("批次下无券码数据: batchId={}", batchId);
return new ArrayList<>();
}
List<VoucherUsageStatsResp> statsList = new ArrayList<>();
for (PriceVoucherCode voucherCode : voucherCodes) {
if (voucherCode.getDeleted() == 1) {
continue;
}
VoucherUsageStatsResp stats = new VoucherUsageStatsResp();
stats.setVoucherCodeId(voucherCode.getId());
stats.setVoucherCode(voucherCode.getCode());
stats.setBatchId(batchConfig.getId());
stats.setBatchName(batchConfig.getBatchName());
stats.setScenicId(voucherCode.getScenicId());
stats.setStatus(voucherCode.getStatus());
// 设置状态名称
VoucherCodeStatus statusEnum = VoucherCodeStatus.getByCode(voucherCode.getStatus());
if (statusEnum != null) {
stats.setStatusName(statusEnum.getName());
}
// 设置使用次数相关信息
Integer currentUseCount = voucherCode.getCurrentUseCount() != null ?
voucherCode.getCurrentUseCount() : 0;
stats.setCurrentUseCount(currentUseCount);
stats.setMaxUseCount(batchConfig.getMaxUseCount());
stats.setMaxUsePerUser(batchConfig.getMaxUsePerUser());
stats.setUseIntervalHours(batchConfig.getUseIntervalHours());
// 计算是否还能使用
boolean canUseMore = true;
if (batchConfig.getMaxUseCount() != null) {
canUseMore = currentUseCount < batchConfig.getMaxUseCount();
}
stats.setCanUseMore(canUseMore);
// 计算剩余使用次数
if (batchConfig.getMaxUseCount() != null) {
int remaining = batchConfig.getMaxUseCount() - currentUseCount;
stats.setRemainingUseCount(Math.max(0, remaining));
}
// 获取使用记录数
List<PriceVoucherUsageRecord> usageRecords = usageRecordMapper.selectByVoucherCodeId(voucherCode.getId());
stats.setTotalUsageRecords(usageRecords != null ? usageRecords.size() : 0);
// 格式化最后使用时间
if (voucherCode.getLastUsedTime() != null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
stats.setLastUsedTime(sdf.format(voucherCode.getLastUsedTime()));
}
statsList.add(stats);
}
log.info("批次统计完成: batchId={}, 券码数量={}", batchId, statsList.size());
return statsList;
}
@Override