记得上下班打卡 | 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 { ...@@ -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); return executeShouQianBaRequest("/optimus/core/voucher/queryOrderVoucherList", "查询优惠券", request, CouponQueryResponse.class);
} }
...@@ -222,7 +222,7 @@ public class SqbBiz { ...@@ -222,7 +222,7 @@ public class SqbBiz {
* @param signature 订单密码 * @param signature 订单密码
* @return * @return
*/ */
public CouponQueryData queryCoupon(String sn, String signature) { public List<CouponQueryData> queryCoupon(String sn, String signature) {
CouponQueryRequest couponQueryRequest = new CouponQueryRequest(); CouponQueryRequest couponQueryRequest = new CouponQueryRequest();
couponQueryRequest.setAppid(sqbConfig.getAppId()); couponQueryRequest.setAppid(sqbConfig.getAppId());
couponQueryRequest.setSeller(cachedSeller); couponQueryRequest.setSeller(cachedSeller);
......
...@@ -6,6 +6,8 @@ import com.liquidnet.common.third.sqb.param.response.data.CouponQueryData; ...@@ -6,6 +6,8 @@ import com.liquidnet.common.third.sqb.param.response.data.CouponQueryData;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List;
/** /**
* 券详情查询响应 * 券详情查询响应
*/ */
...@@ -13,5 +15,5 @@ import lombok.EqualsAndHashCode; ...@@ -13,5 +15,5 @@ import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data @Data
@JsonIgnoreProperties(ignoreUnknown = true) @JsonIgnoreProperties(ignoreUnknown = true)
public class CouponQueryResponse extends BaseResponse<CouponQueryData>{ public class CouponQueryResponse extends BaseResponse<List<CouponQueryData>>{
} }
package com.liquidnet.service.goblin.service.impl; package com.liquidnet.service.goblin.service.impl;
import com.liquidnet.common.third.sqb.biz.SqbBiz; 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.request.CouponRefundRequest;
import com.liquidnet.common.third.sqb.param.response.data.CouponQueryData; import com.liquidnet.common.third.sqb.param.response.data.CouponQueryData;
import com.liquidnet.common.third.sqb.param.response.data.CouponRefundData; import com.liquidnet.common.third.sqb.param.response.data.CouponRefundData;
import com.liquidnet.commons.lang.util.IDGenerator; 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.base.ResponseDto;
import com.liquidnet.service.goblin.constant.GoblinStatusConst; import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*; 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.service.IGoblinSqbService;
import com.liquidnet.service.goblin.util.GoblinMongoUtils; import com.liquidnet.service.goblin.util.GoblinMongoUtils;
import com.liquidnet.service.goblin.util.GoblinRedisUtils; import com.liquidnet.service.goblin.util.GoblinRedisUtils;
...@@ -49,6 +50,9 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService { ...@@ -49,6 +50,9 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
private SqbBiz sqbBiz; private SqbBiz sqbBiz;
private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 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 { ...@@ -56,10 +60,26 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
public ResponseDto<GoblinSqbCouponVo> queryCoupon(String userId, String orderId) { public ResponseDto<GoblinSqbCouponVo> queryCoupon(String userId, String orderId) {
log.info("[收钱吧券码] 开始获取 userId={}, orderId={}", userId, 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); GoblinSqbOrderVo orderVo = goblinSqbRedisUtils.getSqbOrder(orderId);
if (orderVo == null) return ResponseDto.failure("订单不存在"); if (orderVo == null) {
if (!userId.equals(orderVo.getUserId())) return ResponseDto.failure("无权限访问该订单"); orderVo = loadSqbOrderVoFromDb(orderId);
if (!Integer.valueOf(1).equals(orderVo.getStatus())) return ResponseDto.failure("订单未支付,无法获取券码"); 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()) { if (orderVo.getCouponQrCode() != null && !orderVo.getCouponQrCode().isEmpty()) {
...@@ -71,8 +91,9 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService { ...@@ -71,8 +91,9 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
} }
// 调用收钱吧查询券码 // 调用收钱吧查询券码
CouponQueryData couponData = sqbBiz.queryCoupon(orderVo.getSqbOrderSn(), orderVo.getSqbOrderSignature()); List<CouponQueryData> couponList = sqbBiz.queryCoupon(orderVo.getSqbOrderSn(), orderVo.getSqbOrderSignature());
if (couponData == null) return ResponseDto.failure("获取券码失败"); if (CollectionUtils.isEmpty(couponList)) return ResponseDto.failure("暂无可用券码");
CouponQueryData couponData = couponList.get(0);
// 更新订单 coupon 字段 // 更新订单 coupon 字段
String now = LocalDateTime.now().format(DTF); String now = LocalDateTime.now().format(DTF);
...@@ -312,6 +333,12 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService { ...@@ -312,6 +333,12 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
} }
GoblinSqbOrderVo sqbOrderVo = goblinSqbRedisUtils.getSqbOrder(orderId); GoblinSqbOrderVo sqbOrderVo = goblinSqbRedisUtils.getSqbOrder(orderId);
if (sqbOrderVo == null) {
sqbOrderVo = loadSqbOrderVoFromDb(orderId);
if (sqbOrderVo != null) {
goblinSqbRedisUtils.setSqbOrderForever(orderId, sqbOrderVo);
}
}
GoblinSqbOrderDetailVo detailVo = buildDetailVo(storeOrderVo, skuVo, sqbOrderVo); GoblinSqbOrderDetailVo detailVo = buildDetailVo(storeOrderVo, skuVo, sqbOrderVo);
log.info("[收钱吧订单详情] 查询成功,orderId={}", orderId); log.info("[收钱吧订单详情] 查询成功,orderId={}", orderId);
...@@ -353,6 +380,50 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService { ...@@ -353,6 +380,50 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
return detailVo; 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位。 * 构建收钱吧请求唯一ID,规则:AppCode(4位)+ id,总长不超过40位。
* *
......
...@@ -30,6 +30,14 @@ public class GoblinSqbRedisUtils { ...@@ -30,6 +30,14 @@ public class GoblinSqbRedisUtils {
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo, RedisKeyExpireConst.SQB_ORDER_EXPIRE); 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) { public GoblinSqbOrderVo getSqbOrder(String orderId) {
String redisKey = GoblinRedisConst.SQB_ORDER.concat(orderId); String redisKey = GoblinRedisConst.SQB_ORDER.concat(orderId);
Object object = redisUtil.get(redisKey); 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