记得上下班打卡 | git大法好,push需谨慎

Commit d7d8ae09 authored by 姜秀龙's avatar 姜秀龙

Merge branch 'refs/heads/dev-1.6-shouqianba' into container-test

parents 43f75418 c7fcc512
......@@ -211,7 +211,7 @@ public class SqbBiz {
/**
* 查询券码
*/
public CouponQueryData queryCoupon(CouponQueryRequest request) {
public List<CouponQueryData> queryCoupon(CouponQueryRequest request) {
return executeShouQianBaRequest("/optimus/core/voucher/queryOrderVoucherList", "查询优惠券", request, CouponQueryResponse.class);
}
......@@ -222,7 +222,7 @@ public class SqbBiz {
* @param signature 订单密码
* @return
*/
public CouponQueryData queryCoupon(String sn, String signature) {
public List<CouponQueryData> queryCoupon(String sn, String signature) {
CouponQueryRequest couponQueryRequest = new CouponQueryRequest();
couponQueryRequest.setAppid(sqbConfig.getAppId());
couponQueryRequest.setSeller(cachedSeller);
......
......@@ -6,6 +6,8 @@ import com.liquidnet.common.third.sqb.param.response.data.CouponQueryData;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* 券详情查询响应
*/
......@@ -13,5 +15,5 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class CouponQueryResponse extends BaseResponse<CouponQueryData>{
public class CouponQueryResponse extends BaseResponse<List<CouponQueryData>>{
}
package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.common.third.sqb.biz.SqbBiz;
import com.liquidnet.common.third.sqb.param.request.CommonRequest;
import com.liquidnet.common.third.sqb.param.request.CouponQueryRequest;
import com.liquidnet.common.third.sqb.param.request.CouponRefundRequest;
import com.liquidnet.common.third.sqb.param.response.data.CouponQueryData;
import com.liquidnet.common.third.sqb.param.response.data.CouponRefundData;
import com.liquidnet.commons.lang.util.IDGenerator;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.entity.GoblinSqbOrder;
import com.liquidnet.service.goblin.mapper.GoblinSqbOrderMapper;
import com.liquidnet.service.goblin.service.IGoblinSqbService;
import com.liquidnet.service.goblin.util.GoblinMongoUtils;
import com.liquidnet.service.goblin.util.GoblinRedisUtils;
......@@ -49,6 +50,9 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
private SqbBiz sqbBiz;
private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Autowired
private GoblinSqbOrderMapper goblinSqbOrderMapper;
// ================================ 获取券码 ================================
......@@ -56,10 +60,26 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
public ResponseDto<GoblinSqbCouponVo> queryCoupon(String userId, String orderId) {
log.info("[收钱吧券码] 开始获取 userId={}, orderId={}", userId, orderId);
// 支付态以商城订单为准(收钱吧扩展状态仅用于核销等业务态)
GoblinStoreOrderVo storeOrderVo = goblinRedisUtils.getGoblinOrder(orderId);
if (storeOrderVo == null) return ResponseDto.failure("订单不存在");
if (!userId.equals(storeOrderVo.getUserId())) return ResponseDto.failure("无权限访问该订单");
if (!(storeOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_2.getValue()
|| storeOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_STATUS_4.getValue())) {
return ResponseDto.failure("订单未支付,无法获取券码");
}
GoblinSqbOrderVo orderVo = goblinSqbRedisUtils.getSqbOrder(orderId);
if (orderVo == null) return ResponseDto.failure("订单不存在");
if (!userId.equals(orderVo.getUserId())) return ResponseDto.failure("无权限访问该订单");
if (!Integer.valueOf(1).equals(orderVo.getStatus())) return ResponseDto.failure("订单未支付,无法获取券码");
if (orderVo == null) {
orderVo = loadSqbOrderVoFromDb(orderId);
if (orderVo != null) {
goblinSqbRedisUtils.setSqbOrderForever(orderId, orderVo);
} else {
return ResponseDto.failure("订单不存在");
}
}
// 兜底:以商城订单的 userId 为准,这里仅防御脏数据
if (orderVo.getUserId() != null && !userId.equals(orderVo.getUserId())) return ResponseDto.failure("无权限访问该订单");
// 幂等:已存在则直接返回
if (orderVo.getCouponQrCode() != null && !orderVo.getCouponQrCode().isEmpty()) {
......@@ -71,8 +91,9 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
}
// 调用收钱吧查询券码
CouponQueryData couponData = sqbBiz.queryCoupon(orderVo.getSqbOrderSn(), orderVo.getSqbOrderSignature());
if (couponData == null) return ResponseDto.failure("获取券码失败");
List<CouponQueryData> couponList = sqbBiz.queryCoupon(orderVo.getSqbOrderSn(), orderVo.getSqbOrderSignature());
if (CollectionUtils.isEmpty(couponList)) return ResponseDto.failure("暂无可用券码");
CouponQueryData couponData = couponList.get(0);
// 更新订单 coupon 字段
String now = LocalDateTime.now().format(DTF);
......@@ -312,6 +333,12 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
}
GoblinSqbOrderVo sqbOrderVo = goblinSqbRedisUtils.getSqbOrder(orderId);
if (sqbOrderVo == null) {
sqbOrderVo = loadSqbOrderVoFromDb(orderId);
if (sqbOrderVo != null) {
goblinSqbRedisUtils.setSqbOrderForever(orderId, sqbOrderVo);
}
}
GoblinSqbOrderDetailVo detailVo = buildDetailVo(storeOrderVo, skuVo, sqbOrderVo);
log.info("[收钱吧订单详情] 查询成功,orderId={}", orderId);
......@@ -353,6 +380,50 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
return detailVo;
}
private GoblinSqbOrderVo loadSqbOrderVoFromDb(String orderId) {
if (orderId == null || orderId.trim().isEmpty()) {
return null;
}
try {
LambdaQueryWrapper<GoblinSqbOrder> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(GoblinSqbOrder::getOrderId, orderId).last("LIMIT 1");
GoblinSqbOrder dbOrder = goblinSqbOrderMapper.selectOne(wrapper);
if (dbOrder == null) {
return null;
}
GoblinSqbOrderVo vo = new GoblinSqbOrderVo();
vo.setOrderId(dbOrder.getOrderId());
vo.setUserId(dbOrder.getUserId());
vo.setPerformancesId(dbOrder.getPerformancesId());
vo.setSpuId(dbOrder.getSpuId());
vo.setSkuId(dbOrder.getSkuId());
vo.setQuantity(dbOrder.getQuantity());
vo.setAmount(dbOrder.getAmount());
vo.setSqbOrderSn(dbOrder.getSqbOrderSn());
vo.setSqbOrderSignature(dbOrder.getSqbOrderSignature());
vo.setSqbAcquiringSn(dbOrder.getSqbAcquiringSn());
vo.setSqbAcquiringSign(dbOrder.getSqbAcquiringSign());
vo.setSqbCheckoutItemsId(dbOrder.getSqbCheckoutItemsId());
vo.setCouponSn(dbOrder.getCouponSn());
vo.setCouponQrCode(dbOrder.getCouponQrCode());
vo.setCouponExpireTime(dbOrder.getCouponExpireTime());
vo.setStatus(dbOrder.getStatus());
vo.setRefundReason(dbOrder.getRefundReason());
vo.setRefundSn(dbOrder.getSqbRefundSn());
vo.setRefundSignature(dbOrder.getSqbRefundSignature());
vo.setCreatedAt(dbOrder.getCreatedAt());
vo.setUpdatedAt(dbOrder.getUpdatedAt());
if (Integer.valueOf(2).equals(dbOrder.getStatus())) {
vo.setCouponUsedStatus(1);
}
return vo;
} catch (Exception e) {
log.warn("[收钱吧订单详情] sqbOrderVo 降级回源失败 orderId={}", orderId, e);
return null;
}
}
/**
* 构建收钱吧请求唯一ID,规则:AppCode(4位)+ id,总长不超过40位。
*
......
......@@ -30,6 +30,14 @@ public class GoblinSqbRedisUtils {
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo, RedisKeyExpireConst.SQB_ORDER_EXPIRE);
}
/**
* 写入收钱吧订单缓存(不过期)。
* 用于详情接口降级回源后补齐缓存,使其与 storeOrderVo 缓存策略一致。
*/
public void setSqbOrderForever(String orderId, GoblinSqbOrderVo vo) {
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo);
}
public GoblinSqbOrderVo getSqbOrder(String orderId) {
String redisKey = GoblinRedisConst.SQB_ORDER.concat(orderId);
Object object = redisUtil.get(redisKey);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment