feat(ticket): 添加套票模板起始送水自动核销功能
- 在套票发放时根据模板配置的startSendQty自动核销对应数量 - 新增CHANGE_TYPE_START_SEND_WRITE_OFF变更类型用于标识起始送水自动核销 - 实现自动核销逻辑:计算可用数量并更新用户套票的可用和已用数量 - 记录自动核销日志并关联原始商城订单便于追溯核销来源 - 更新套票发放任务注释说明自动核销功能应用场景
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
* GLT 套票发放任务:
|
||||
* - 每分钟扫描一次今日订单(tenantId=10584, formId in 套票模板 goodsId, payStatus=1, orderStatus=0)
|
||||
* - 为订单生成用户套票账户 + 释放计划(幂等)
|
||||
* - 若模板配置了 startSendQty,则发放时自动核销对应数量(用于“第一次送水”场景)
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
|
||||
Reference in New Issue
Block a user