From aa4a6d97257e738a05a419cde56ea4fc97faf3c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Mon, 9 Feb 2026 17:35:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(ticket):=20=E6=B7=BB=E5=8A=A0=E5=A5=97?= =?UTF-8?q?=E7=A5=A8=E6=A8=A1=E6=9D=BF=E8=B5=B7=E5=A7=8B=E9=80=81=E6=B0=B4?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=A0=B8=E9=94=80=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在套票发放时根据模板配置的startSendQty自动核销对应数量 - 新增CHANGE_TYPE_START_SEND_WRITE_OFF变更类型用于标识起始送水自动核销 - 实现自动核销逻辑:计算可用数量并更新用户套票的可用和已用数量 - 记录自动核销日志并关联原始商城订单便于追溯核销来源 - 更新套票发放任务注释说明自动核销功能应用场景 --- .../glt/service/GltTicketIssueService.java | 39 +++++++++++++++++++ .../glt/task/GltTicketIssue10584Task.java | 1 + 2 files changed, 40 insertions(+) diff --git a/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java b/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java index 55a0473..6c8726a 100644 --- a/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java +++ b/src/main/java/com/gxwebsoft/glt/service/GltTicketIssueService.java @@ -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); diff --git a/src/main/java/com/gxwebsoft/glt/task/GltTicketIssue10584Task.java b/src/main/java/com/gxwebsoft/glt/task/GltTicketIssue10584Task.java index 2cc7b68..bb34a8d 100644 --- a/src/main/java/com/gxwebsoft/glt/task/GltTicketIssue10584Task.java +++ b/src/main/java/com/gxwebsoft/glt/task/GltTicketIssue10584Task.java @@ -18,6 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean; * GLT 套票发放任务: * - 每分钟扫描一次今日订单(tenantId=10584, formId in 套票模板 goodsId, payStatus=1, orderStatus=0) * - 为订单生成用户套票账户 + 释放计划(幂等) + * - 若模板配置了 startSendQty,则发放时自动核销对应数量(用于“第一次送水”场景) */ @Slf4j @Component