feat(tickets): 实现套票购买量和赠送量的分离管理

- 购买量(buyQty)立即设置为可用状态
- 赠送量(giftQty)设置为冻结状态并按计划释放
- 修改总数量计算逻辑,将购买量和赠送量直接相加
- 更新套票记录中的可用数量和冻结数量字段
- 调整释放计划构建方法,仅基于赠送量进行释放规划
- 更新套票日志记录,区分可用量和冻结量的变化追踪
This commit is contained in:
2026-02-04 10:24:46 +08:00
parent 937e707890
commit 58c755b715

View File

@@ -206,10 +206,8 @@ public class GltTicketIssueService {
int giftMultiplier = template.getGiftMultiplier() != null ? template.getGiftMultiplier() : 0; int giftMultiplier = template.getGiftMultiplier() != null ? template.getGiftMultiplier() : 0;
int giftQty = buyQty * Math.max(giftMultiplier, 0); int giftQty = buyQty * Math.max(giftMultiplier, 0);
int totalQty = giftQty; // 购买量buyQty应立即可用赠送量giftQty进入冻结并按计划释放。
if (Boolean.TRUE.equals(template.getIncludeBuyQty())) { int totalQty = buyQty + giftQty;
totalQty += buyQty;
}
if (totalQty <= 0) { if (totalQty <= 0) {
log.info("套票发放跳过计算结果为0 - tenantId={}, orderNo={}, buyQty={}, giftMultiplier={}, includeBuyQty={}", log.info("套票发放跳过计算结果为0 - tenantId={}, orderNo={}, buyQty={}, giftMultiplier={}, includeBuyQty={}",
@@ -226,10 +224,11 @@ public class GltTicketIssueService {
userTicket.setOrderNo(order.getOrderNo()); userTicket.setOrderNo(order.getOrderNo());
userTicket.setOrderGoodsId(og.getId()); userTicket.setOrderGoodsId(og.getId());
userTicket.setTotalQty(totalQty); userTicket.setTotalQty(totalQty);
userTicket.setAvailableQty(0); userTicket.setAvailableQty(buyQty);
userTicket.setFrozenQty(totalQty); userTicket.setFrozenQty(giftQty);
userTicket.setUsedQty(0); userTicket.setUsedQty(0);
userTicket.setReleasedQty(0); // 初始可用量来自“购买量”,视为已释放
userTicket.setReleasedQty(buyQty);
userTicket.setUserId(order.getUserId()); userTicket.setUserId(order.getUserId());
userTicket.setSortNumber(0); userTicket.setSortNumber(0);
userTicket.setComments("订单发放套票"); userTicket.setComments("订单发放套票");
@@ -246,7 +245,7 @@ public class GltTicketIssueService {
if (baseTime == null) { if (baseTime == null) {
baseTime = now; baseTime = now;
} }
List<GltUserTicketRelease> releases = buildReleasePlan(template, userTicket, baseTime, totalQty, now); List<GltUserTicketRelease> releases = buildReleasePlan(template, userTicket, baseTime, giftQty, now);
if (!releases.isEmpty()) { if (!releases.isEmpty()) {
gltUserTicketReleaseService.saveBatch(releases); gltUserTicketReleaseService.saveBatch(releases);
} }
@@ -255,11 +254,11 @@ public class GltTicketIssueService {
GltUserTicketLog issueLog = new GltUserTicketLog(); GltUserTicketLog issueLog = new GltUserTicketLog();
issueLog.setUserTicketId(userTicket.getId()); issueLog.setUserTicketId(userTicket.getId());
issueLog.setChangeType(CHANGE_TYPE_ISSUE); issueLog.setChangeType(CHANGE_TYPE_ISSUE);
issueLog.setChangeAvailable(0); issueLog.setChangeAvailable(buyQty);
issueLog.setChangeFrozen(totalQty); issueLog.setChangeFrozen(giftQty);
issueLog.setChangeUsed(0); issueLog.setChangeUsed(0);
issueLog.setAvailableAfter(0); issueLog.setAvailableAfter(buyQty);
issueLog.setFrozenAfter(totalQty); issueLog.setFrozenAfter(giftQty);
issueLog.setUsedAfter(0); issueLog.setUsedAfter(0);
issueLog.setOrderId(order.getOrderId()); issueLog.setOrderId(order.getOrderId());
issueLog.setOrderNo(order.getOrderNo()); issueLog.setOrderNo(order.getOrderNo());