refactor(glt-ticket): 调整套票发放逻辑,移除自动核销功能
- 修改套票发放任务注释,明确发放阶段不再自动核销/自动下单 - 移除起始送水自动核销相关代码和常量定义 - 删除自动核销相关的服务依赖注入 - 更新套票发放逻辑,按整改需求仅记录startSendQty配置但不执行自动核销 - 移除构建起始送水订单的相关方法 - 添加送水时间格式化常量用于立刻送水场景 - 实现立刻送水时自动设置当前时间为配送时间的功能
This commit is contained in:
@@ -2,27 +2,22 @@ package com.gxwebsoft.glt.service;
|
||||
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.gxwebsoft.glt.entity.GltTicketOrder;
|
||||
import com.gxwebsoft.glt.entity.GltTicketTemplate;
|
||||
import com.gxwebsoft.glt.entity.GltUserTicket;
|
||||
import com.gxwebsoft.glt.entity.GltUserTicketLog;
|
||||
import com.gxwebsoft.glt.entity.GltUserTicketRelease;
|
||||
import com.gxwebsoft.shop.entity.ShopOrder;
|
||||
import com.gxwebsoft.shop.entity.ShopOrderGoods;
|
||||
import com.gxwebsoft.shop.entity.ShopUserAddress;
|
||||
import com.gxwebsoft.shop.service.ShopOrderGoodsService;
|
||||
import com.gxwebsoft.shop.service.ShopOrderService;
|
||||
import com.gxwebsoft.shop.service.ShopUserAddressService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.support.TransactionTemplate;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.LocalTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@@ -43,8 +38,6 @@ 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,
|
||||
@@ -60,8 +53,6 @@ public class GltTicketIssueService {
|
||||
private final GltUserTicketService gltUserTicketService;
|
||||
private final GltUserTicketReleaseService gltUserTicketReleaseService;
|
||||
private final GltUserTicketLogService gltUserTicketLogService;
|
||||
private final GltTicketOrderService gltTicketOrderService;
|
||||
private final ShopUserAddressService shopUserAddressService;
|
||||
private final TransactionTemplate transactionTemplate;
|
||||
|
||||
/**
|
||||
@@ -357,51 +348,13 @@ public class GltTicketIssueService {
|
||||
issueLog.setUpdateTime(now);
|
||||
gltUserTicketLogService.save(issueLog);
|
||||
|
||||
// 按模板配置:自动“使用掉第一次水票”(起始送水数量)
|
||||
// 按整改需求:水票购买(囤券预付费)与水票核销(下单履约)应为两次独立用户动作;
|
||||
// 因此模板 startSendQty 不再在“发放”阶段自动核销/自动生成送水订单。
|
||||
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) {
|
||||
log.info("起始送水自动核销 - tenantId={}, orderNo={}, templateId={}, userTicketId={}, startSendQty={}, availableBefore={}, toUse={}",
|
||||
tenantId, order.getOrderNo(), template.getId(), userTicket.getId(), startSendQty, availableBefore, toUse);
|
||||
userTicket.setAvailableQty(availableBefore - toUse);
|
||||
userTicket.setUsedQty(usedBefore + toUse);
|
||||
userTicket.setUpdateTime(now);
|
||||
if (!gltUserTicketService.updateById(userTicket)) {
|
||||
throw new IllegalStateException("起始送水自动核销:更新用户水票失败 userTicketId=" + userTicket.getId());
|
||||
}
|
||||
|
||||
// 起始送水:自动核销成功后,生成一条送水订单(用于配送端/后台跟踪)
|
||||
GltTicketOrder ticketOrder = buildStartSendTicketOrder(tenantId, order, userTicket, toUse, now);
|
||||
if (!gltTicketOrderService.save(ticketOrder)) {
|
||||
throw new IllegalStateException("起始送水自动核销:创建送水订单失败 userTicketId=" + userTicket.getId());
|
||||
}
|
||||
|
||||
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(ticketOrder.getId());
|
||||
writeOffLog.setOrderNo(ticketOrder.getId() == null ? null : String.valueOf(ticketOrder.getId()));
|
||||
writeOffLog.setUserId(order.getUserId());
|
||||
writeOffLog.setSortNumber(0);
|
||||
writeOffLog.setComments("起始送水自动核销(来源商城订单:" + safe(order.getOrderNo()) + ")");
|
||||
writeOffLog.setStatus(0);
|
||||
writeOffLog.setDeleted(0);
|
||||
writeOffLog.setTenantId(tenantId);
|
||||
writeOffLog.setCreateTime(now);
|
||||
writeOffLog.setUpdateTime(now);
|
||||
gltUserTicketLogService.save(writeOffLog);
|
||||
}
|
||||
log.info("套票模板配置了 startSendQty,但不再自动送水/自动核销 - tenantId={}, orderNo={}, templateId={}, userTicketId={}, startSendQty={}",
|
||||
tenantId, order.getOrderNo(), template.getId(), userTicket.getId(), startSendQty);
|
||||
}
|
||||
|
||||
log.info("套票发放成功 - tenantId={}, orderNo={}, orderGoodsId={}, templateId={}, userTicketId={}, orderGoodsQty={}, buyQty={}, giftQty={}, startSendQty={}, totalQty={}",
|
||||
@@ -492,77 +445,4 @@ public class GltTicketIssueService {
|
||||
return LocalDateTime.of(adjusted, time);
|
||||
}
|
||||
|
||||
private static final DateTimeFormatter DATETIME_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
private GltTicketOrder buildStartSendTicketOrder(Integer tenantId,
|
||||
ShopOrder shopOrder,
|
||||
GltUserTicket userTicket,
|
||||
int totalNum,
|
||||
LocalDateTime now) {
|
||||
GltTicketOrder o = new GltTicketOrder();
|
||||
o.setUserTicketId(userTicket.getId());
|
||||
o.setUserId(shopOrder.getUserId());
|
||||
o.setStoreId(shopOrder.getStoreId());
|
||||
o.setWarehouseId(shopOrder.getWarehouseId());
|
||||
o.setRiderId(shopOrder.getRiderId());
|
||||
o.setTotalNum(totalNum);
|
||||
o.setPrice(BigDecimal.ZERO);
|
||||
o.setBuyerRemarks(shopOrder.getBuyerRemarks());
|
||||
|
||||
// 地址快照:优先使用地址表快照;兜底使用商城订单上的 address 字段
|
||||
Integer addressId = shopOrder.getAddressId();
|
||||
o.setAddressId(addressId);
|
||||
String addressSnapshot = null;
|
||||
if (addressId != null) {
|
||||
ShopUserAddress addr = shopUserAddressService.getOne(new LambdaQueryWrapper<ShopUserAddress>()
|
||||
.eq(ShopUserAddress::getId, addressId)
|
||||
.eq(ShopUserAddress::getUserId, shopOrder.getUserId())
|
||||
.eq(ShopUserAddress::getTenantId, tenantId)
|
||||
.last("limit 1"));
|
||||
addressSnapshot = buildAddressSnapshot(addr);
|
||||
}
|
||||
if (addressSnapshot == null || addressSnapshot.isBlank()) {
|
||||
addressSnapshot = shopOrder.getAddress();
|
||||
}
|
||||
o.setAddress(addressSnapshot);
|
||||
|
||||
String preferredSendTime = shopOrder.getSendStartTime();
|
||||
if (preferredSendTime == null || preferredSendTime.isBlank()) {
|
||||
preferredSendTime = now.format(DATETIME_FMT);
|
||||
}
|
||||
o.setSendTime(preferredSendTime);
|
||||
o.setDeliveryStatus(GltTicketOrderService.DELIVERY_STATUS_WAITING);
|
||||
o.setSortNumber(0);
|
||||
o.setComments("起始送水自动下单(来源商城订单:" + safe(shopOrder.getOrderNo()) + ")");
|
||||
o.setStatus(0);
|
||||
o.setDeleted(0);
|
||||
o.setTenantId(tenantId);
|
||||
o.setCreateTime(now);
|
||||
o.setUpdateTime(now);
|
||||
return o;
|
||||
}
|
||||
|
||||
private static String buildAddressSnapshot(ShopUserAddress addr) {
|
||||
if (addr == null) {
|
||||
return null;
|
||||
}
|
||||
if (addr.getFullAddress() != null && !addr.getFullAddress().isBlank()) {
|
||||
return addr.getFullAddress();
|
||||
}
|
||||
// 兼容旧数据:fullAddress 为空时,拼接省市区 + 详细地址
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (addr.getProvince() != null) sb.append(addr.getProvince());
|
||||
if (addr.getCity() != null) sb.append(addr.getCity());
|
||||
if (addr.getRegion() != null) sb.append(addr.getRegion());
|
||||
if (addr.getAddress() != null) sb.append(addr.getAddress());
|
||||
String s = sb.toString();
|
||||
if (!s.isBlank()) {
|
||||
return s;
|
||||
}
|
||||
return addr.getAddress();
|
||||
}
|
||||
|
||||
private static String safe(String s) {
|
||||
return s == null ? "" : s;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
||||
private static final BigDecimal RIDER_UNIT_COMMISSION = new BigDecimal("0.10");
|
||||
private static final int RIDER_COMMISSION_SCALE = 2;
|
||||
private static final int TENANT_ID_10584 = 10584;
|
||||
private static final DateTimeFormatter SEND_TIME_FMT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
@Resource
|
||||
private GltUserTicketMapper gltUserTicketMapper;
|
||||
@@ -166,6 +167,10 @@ public class GltTicketOrderServiceImpl extends ServiceImpl<GltTicketOrderMapper,
|
||||
if (gltTicketOrder.getCreateTime() == null) {
|
||||
gltTicketOrder.setCreateTime(now);
|
||||
}
|
||||
// “立刻送水”下单场景不再需要前端选择配送时间;若未传则默认当前时间,便于排序与派单。
|
||||
if (!StringUtils.hasText(gltTicketOrder.getSendTime())) {
|
||||
gltTicketOrder.setSendTime(now.format(SEND_TIME_FMT));
|
||||
}
|
||||
gltTicketOrder.setUpdateTime(now);
|
||||
if (!this.save(gltTicketOrder)) {
|
||||
throw new BusinessException("创建订单失败");
|
||||
|
||||
@@ -18,7 +18,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||
* GLT 套票发放任务:
|
||||
* - 每30秒扫描一次今日订单(tenantId=10584, formId in 套票模板 goodsId, payStatus=1, orderStatus=0)
|
||||
* - 为订单生成用户套票账户 + 释放计划(幂等)
|
||||
* - 若模板配置了 startSendQty,则发放时自动核销对应数量(用于“第一次送水”场景)
|
||||
* - 按整改需求:发放阶段不再自动核销/自动下单;“送水下单核销”由用户在履约时主动触发
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
|
||||
Reference in New Issue
Block a user