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 class GltTicketIssueService {
|
||||||
|
|
||||||
public static final int CHANGE_TYPE_ISSUE = 10;
|
public static final int CHANGE_TYPE_ISSUE = 10;
|
||||||
|
/** 变更类型:起始送水自动核销(按模板 startSendQty 在发放时自动消耗) */
|
||||||
|
public static final int CHANGE_TYPE_START_SEND_WRITE_OFF = 12;
|
||||||
|
|
||||||
private enum IssueOutcome {
|
private enum IssueOutcome {
|
||||||
ISSUED,
|
ISSUED,
|
||||||
@@ -298,6 +300,43 @@ public class GltTicketIssueService {
|
|||||||
issueLog.setUpdateTime(now);
|
issueLog.setUpdateTime(now);
|
||||||
gltUserTicketLogService.save(issueLog);
|
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={}",
|
log.info("套票发放成功 - tenantId={}, orderNo={}, orderGoodsId={}, templateId={}, userTicketId={}, totalQty={}",
|
||||||
tenantId, order.getOrderNo(), og.getId(), template.getId(), userTicket.getId(), totalQty);
|
tenantId, order.getOrderNo(), og.getId(), template.getId(), userTicket.getId(), totalQty);
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
* GLT 套票发放任务:
|
* GLT 套票发放任务:
|
||||||
* - 每分钟扫描一次今日订单(tenantId=10584, formId in 套票模板 goodsId, payStatus=1, orderStatus=0)
|
* - 每分钟扫描一次今日订单(tenantId=10584, formId in 套票模板 goodsId, payStatus=1, orderStatus=0)
|
||||||
* - 为订单生成用户套票账户 + 释放计划(幂等)
|
* - 为订单生成用户套票账户 + 释放计划(幂等)
|
||||||
|
* - 若模板配置了 startSendQty,则发放时自动核销对应数量(用于“第一次送水”场景)
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
|
|||||||
Reference in New Issue
Block a user