feat(ticket): 添加套票模板起始送水自动核销功能

- 在套票发放时根据模板配置的startSendQty自动核销对应数量
- 新增CHANGE_TYPE_START_SEND_WRITE_OFF变更类型用于标识起始送水自动核销
- 实现自动核销逻辑:计算可用数量并更新用户套票的可用和已用数量
- 记录自动核销日志并关联原始商城订单便于追溯核销来源
- 更新套票发放任务注释说明自动核销功能应用场景
This commit is contained in:
2026-02-09 17:35:21 +08:00
parent f7a96724c6
commit aa4a6d9725
2 changed files with 40 additions and 0 deletions

View File

@@ -38,6 +38,8 @@ import java.util.Set;
public class GltTicketIssueService {
public static final int CHANGE_TYPE_ISSUE = 10;
/** 变更类型:起始送水自动核销(按模板 startSendQty 在发放时自动消耗) */
public static final int CHANGE_TYPE_START_SEND_WRITE_OFF = 12;
private enum IssueOutcome {
ISSUED,
@@ -298,6 +300,43 @@ public class GltTicketIssueService {
issueLog.setUpdateTime(now);
gltUserTicketLogService.save(issueLog);
// 按模板配置:自动“使用掉第一次水票”(起始送水数量)
Integer startSendQtyObj = template.getStartSendQty();
int startSendQty = startSendQtyObj != null ? startSendQtyObj : 0;
if (startSendQty > 0) {
int availableBefore = userTicket.getAvailableQty() != null ? userTicket.getAvailableQty() : 0;
int usedBefore = userTicket.getUsedQty() != null ? userTicket.getUsedQty() : 0;
int toUse = Math.min(startSendQty, availableBefore);
if (toUse > 0) {
userTicket.setAvailableQty(availableBefore - toUse);
userTicket.setUsedQty(usedBefore + toUse);
userTicket.setUpdateTime(now);
gltUserTicketService.updateById(userTicket);
GltUserTicketLog writeOffLog = new GltUserTicketLog();
writeOffLog.setUserTicketId(userTicket.getId());
writeOffLog.setChangeType(CHANGE_TYPE_START_SEND_WRITE_OFF);
writeOffLog.setChangeAvailable(-toUse);
writeOffLog.setChangeFrozen(0);
writeOffLog.setChangeUsed(toUse);
writeOffLog.setAvailableAfter(userTicket.getAvailableQty());
writeOffLog.setFrozenAfter(userTicket.getFrozenQty() != null ? userTicket.getFrozenQty() : 0);
writeOffLog.setUsedAfter(userTicket.getUsedQty());
// 关联原始商城订单,便于追溯该次自动核销来源
writeOffLog.setOrderId(order.getOrderId());
writeOffLog.setOrderNo(order.getOrderNo());
writeOffLog.setUserId(order.getUserId());
writeOffLog.setSortNumber(0);
writeOffLog.setComments("起始送水自动核销");
writeOffLog.setStatus(0);
writeOffLog.setDeleted(0);
writeOffLog.setTenantId(tenantId);
writeOffLog.setCreateTime(now);
writeOffLog.setUpdateTime(now);
gltUserTicketLogService.save(writeOffLog);
}
}
log.info("套票发放成功 - tenantId={}, orderNo={}, orderGoodsId={}, templateId={}, userTicketId={}, totalQty={}",
tenantId, order.getOrderNo(), og.getId(), template.getId(), userTicket.getId(), totalQty);

View File

@@ -18,6 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
* GLT 套票发放任务:
* - 每分钟扫描一次今日订单tenantId=10584, formId in 套票模板 goodsId, payStatus=1, orderStatus=0
* - 为订单生成用户套票账户 + 释放计划(幂等)
* - 若模板配置了 startSendQty则发放时自动核销对应数量用于“第一次送水”场景
*/
@Slf4j
@Component