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

Commit 86b59457 authored by 姜秀龙's avatar 姜秀龙

sqb 根据实际情况优化

parent c7fcc512
......@@ -165,7 +165,7 @@ CREATE TABLE `goblin_sqb_order` (
`coupon_sn` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '券码编号',
`coupon_qr_code` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '核销二维码',
`coupon_expire_time` datetime DEFAULT NULL COMMENT '券码过期时间',
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0-待支付 1-已支付 2-已核销 3-已退款 4-退款中 9-失败',
`coupon_used_status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0-未核销 1-已核销(订单进度见 goblin_store_order.status)',
`refund_reason` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '退款原因',
`sqb_refund_sn` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '收钱吧-退款号',
`sqb_refund_signature` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '收钱吧-退款号密码',
......
......@@ -23,7 +23,7 @@ public class GoblinSqbOrderDetailVo implements Serializable {
@ApiModelProperty(value = "订单号")
private String orderCode;
@ApiModelProperty(value = "goblin订单状态[0-待付款|2-已付款|5-取消]")
@ApiModelProperty(value = "商城主单状态(goblin_store_order):[0-待付款|2-代发货/已付款|3-代收货|4-已完成|5-取消(未付款前)|6-退款通过|7-退货通过|61-发起退款/退款中]")
private Integer status;
@ApiModelProperty(value = "实付金额")
......@@ -57,9 +57,6 @@ public class GoblinSqbOrderDetailVo implements Serializable {
// ========== 来自 GoblinSqbOrderVo(收钱吧扩展字段) ==========
@ApiModelProperty(value = "收钱吧订单状态:0-待支付 1-已支付 2-已核销 3-已退款 4-退款中 9-失败")
private Integer sqbStatus;
@ApiModelProperty(value = "关联演出ID")
private String performancesId;
......@@ -75,6 +72,6 @@ public class GoblinSqbOrderDetailVo implements Serializable {
@ApiModelProperty(value = "券码过期时间")
private String couponExpireTime;
@ApiModelProperty(value = "核销状态:0-未核销 1-已核销")
@ApiModelProperty(value = "券核销标记:0-未核销 1-已核销")
private Integer couponUsedStatus;
}
......@@ -58,9 +58,6 @@ public class GoblinSqbOrderVo implements Serializable {
// 券核销时间?
private String couponExpireTime;
// 0-待支付 1-已支付 2-已核销 3-已退款 4-退款中 5-已取消 9-失败
private Integer status;
// 退款备注
private String refundReason;
......@@ -77,7 +74,7 @@ public class GoblinSqbOrderVo implements Serializable {
private String updatedAt;
// 扩展属性
// 券核销状态 0-未核销 1-已核销
// 券核销状态 0-未核销 1-已核销(仅券回调 targetState=1 时置 1,与主单状态解耦)
private Integer couponUsedStatus;
}
......@@ -62,11 +62,6 @@ public class RedisKeyExpireConst {
*/
public static final long SQB_PERFORMANCE_GOODS_EXPIRE = 30 * 24 * 60 * 60;
/**
* 收钱吧订单详情过期时间 (2小时)
*/
public static final long SQB_ORDER_EXPIRE = 2 * 60 * 60;
/**
* 收钱吧下单防重锁过期时间 (10秒)
*/
......
......@@ -4,6 +4,7 @@ package com.liquidnet.common.third.sqb.param.callback;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
......@@ -24,8 +25,10 @@ public class CouponCallbackContent {
/** 门店id */
private String storeId;
/** 券列表信息 */
private List<VoucherItem> voucherList;
/**
* 券列表(收钱吧字段名为 orderVoucherList;单 SKU 场景取首条即可,多券需后续扩展结构)
*/
private List<VoucherItem> orderVoucherList;
@Data
/**
......@@ -36,7 +39,7 @@ public class CouponCallbackContent {
private String voucherNo;
/** 类型 */
private String type;
private Integer type;
/** 券状态 (0未核销, 1已核销, 2未核销退款, 3已核销退款中, 4未核销退款完成, 5已核销退款完成, 6已失效) */
private Byte targetState;
......@@ -74,17 +77,22 @@ public class CouponCallbackContent {
* VoucherProductInfo
*/
public static class VoucherProductInfo {
/** spuId */
private Long spuId;
/** spuId(回调里可能是字符串数字) */
private String spuId;
/** skuId */
private Long skuId;
private String skuId;
/** 商品标题 */
private String title;
/** 商品图片地址 */
private String img;
/** 商品图片 */
private String image;
private String qrCodeUrl;
private String qrCodeContent;
private BigDecimal oriAmount;
private BigDecimal receivedAmount;
}
@Data
......
......@@ -102,9 +102,9 @@ public class GoblinSqbOrder implements Serializable {
private String couponExpireTime;
/**
* 状态 0-待支付 1-已支付 2-已核销 3-已退款 4-退款中 5-已取消 9-失败
* 券核销标记 0-未核销 1-已核销
*/
private Integer status;
private Integer couponUsedStatus;
/**
* 收钱吧-退款号
......
......@@ -122,12 +122,15 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
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("订单状态不可退款");
GoblinStoreOrderVo storeOrderVo = goblinRedisUtils.getGoblinOrder(orderId);
if (storeOrderVo == null
|| !Integer.valueOf(GoblinStatusConst.Status.ORDER_STATUS_2.getValue()).equals(storeOrderVo.getStatus())) {
return ResponseDto.failure("订单状态不可退款");
}
if (Integer.valueOf(1).equals(orderVo.getCouponUsedStatus())) return ResponseDto.failure("券码已核销,不可退款");
// 更新状态为退款中
String now = LocalDateTime.now().format(DTF);
orderVo.setStatus(4);
orderVo.setUpdatedAt(now);
goblinSqbRedisUtils.setSqbOrder(orderId, orderVo);
syncOrderStatus(orderId, 4);
......@@ -157,7 +160,6 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
);
if (refundData == null) {
// 退款失败,回滚状态
orderVo.setStatus(1);
orderVo.setUpdatedAt(LocalDateTime.now().format(DTF));
goblinSqbRedisUtils.setSqbOrder(orderId, orderVo);
syncOrderStatus(orderId, 1);
......@@ -168,7 +170,6 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
orderVo.setRefundSn(refundData.getTicketsSn());
orderVo.setRefundSignature(refundData.getTicketSignature());
orderVo.setRefundReason(reason);
orderVo.setStatus(3);
orderVo.setUpdatedAt(LocalDateTime.now().format(DTF));
goblinSqbRedisUtils.setSqbOrder(orderId, orderVo);
goblinRedisUtils.incrSkuStock(null, orderVo.getSkuId(), orderVo.getQuantity());
......@@ -178,8 +179,7 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
return ResponseDto.success(Boolean.TRUE);
} catch (Exception e) {
log.error("[收钱吧退款] 退款异常,orderId={},回滚 status=1", orderId, e);
orderVo.setStatus(1);
log.error("[收钱吧退款] 退款异常,orderId={},回滚主单为已支付", orderId, e);
orderVo.setUpdatedAt(LocalDateTime.now().format(DTF));
goblinSqbRedisUtils.setSqbOrder(orderId, orderVo);
syncOrderStatus(orderId, 1);
......@@ -226,7 +226,6 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
(byte) 1);
if (couponUsed) {
String now = LocalDateTime.now().format(DTF);
orderVo.setStatus(2);
orderVo.setCouponUsedStatus(1);
orderVo.setUpdatedAt(now);
goblinSqbRedisUtils.setSqbOrder(orderId, orderVo);
......@@ -245,7 +244,7 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
// 查询该演出下 status=1(已支付)的订单(MySQL)
// TODO: 通过 GoblinSqbOrderMapper 查询(需注入后解注释)
// LambdaQueryWrapper<GoblinSqbOrder> query = new LambdaQueryWrapper<>();
// query.eq(GoblinSqbOrder::getPerformancesId, performancesId).eq(GoblinSqbOrder::getStatus, 1);
// query.eq(GoblinSqbOrder::getPerformancesId, performancesId).eq(GoblinSqbOrder::getCouponUsedStatus, 0);
// List<GoblinSqbOrder> orders = goblinSqbOrderMapper.selectList(query);
int successCount = 0;
......@@ -298,6 +297,12 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
if (!Integer.valueOf(33).equals(skuVo.getSkuType())) continue;
GoblinSqbOrderVo sqbOrderVo = goblinSqbRedisUtils.getSqbOrder(orderId);
if (sqbOrderVo == null) {
sqbOrderVo = loadSqbOrderVoFromDb(orderId);
if (sqbOrderVo != null) {
goblinSqbRedisUtils.setSqbOrderForever(orderId, sqbOrderVo);
}
}
result.add(buildDetailVo(storeOrderVo, skuVo, sqbOrderVo));
}
......@@ -367,15 +372,16 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
detailVo.setSkuName(skuVo.getSkuName());
detailVo.setSkuImage(skuVo.getSkuImage());
detailVo.setQuantity(skuVo.getNum());
// 来自 GoblinSqbOrderVo
// 来自 GoblinSqbOrderVo(Redis 或 DB;无扩展数据时券标记默认 0)
if (sqbOrderVo != null) {
detailVo.setSqbStatus(sqbOrderVo.getStatus());
detailVo.setPerformancesId(sqbOrderVo.getPerformancesId());
detailVo.setSqbAcquiringSn(sqbOrderVo.getSqbAcquiringSn());
detailVo.setCouponSn(sqbOrderVo.getCouponSn());
detailVo.setCouponQrCode(sqbOrderVo.getCouponQrCode());
detailVo.setCouponExpireTime(sqbOrderVo.getCouponExpireTime());
detailVo.setCouponUsedStatus(sqbOrderVo.getCouponUsedStatus());
detailVo.setCouponUsedStatus(sqbOrderVo.getCouponUsedStatus() != null ? sqbOrderVo.getCouponUsedStatus() : 0);
} else {
detailVo.setCouponUsedStatus(0);
}
return detailVo;
}
......@@ -408,15 +414,12 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
vo.setCouponSn(dbOrder.getCouponSn());
vo.setCouponQrCode(dbOrder.getCouponQrCode());
vo.setCouponExpireTime(dbOrder.getCouponExpireTime());
vo.setStatus(dbOrder.getStatus());
vo.setCouponUsedStatus(dbOrder.getCouponUsedStatus() != null ? dbOrder.getCouponUsedStatus() : 0);
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);
......@@ -486,10 +489,9 @@ public class GoblinSqbServiceImpl implements IGoblinSqbService {
}
/**
* goblin_sqb_order表status 转换成 goblin_store_order表对应status
* 收钱吧业务事件码 → 商城主单 goblin_store_order.status
*
* @param sqbOrderStatus
* @return
* @param sqbOrderStatus 0待支付 1已支付 2已核销(主单完成) 3已退款 4退款中 5取消 9失败
*/
private int sqbOrderStatusConvert(Integer sqbOrderStatus) {
if (null == sqbOrderStatus) {
......
......@@ -24,18 +24,17 @@ public class GoblinSqbRedisUtils {
@Autowired
private RedisUtil redisUtil;
/* ---------------------------------------- 订单操作(TTL 2h) ---------------------------------------- */
/* ---------------------------------------- 订单操作(与主单一致:不过期) ---------------------------------------- */
public void setSqbOrder(String orderId, GoblinSqbOrderVo vo) {
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo, RedisKeyExpireConst.SQB_ORDER_EXPIRE);
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo);
}
/**
* 写入收钱吧订单缓存(不过期)。
* 用于详情接口降级回源后补齐缓存,使其与 storeOrderVo 缓存策略一致。
* 与 {@link #setSqbOrder(String, GoblinSqbOrderVo)} 相同,保留方法名供回源等场景调用。
*/
public void setSqbOrderForever(String orderId, GoblinSqbOrderVo vo) {
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo);
setSqbOrder(orderId, vo);
}
public GoblinSqbOrderVo getSqbOrder(String orderId) {
......
......@@ -24,10 +24,10 @@ public class GoblinSqbRedisUtils {
@Autowired
private RedisUtil redisUtil;
/* ---------------------------------------- 订单操作(TTL 2h) ---------------------------------------- */
/* ---------------------------------------- 订单操作(与 goblin_store_order 一致:不过期) ---------------------------------------- */
public void setSqbOrder(String orderId, GoblinSqbOrderVo vo) {
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo, RedisKeyExpireConst.SQB_ORDER_EXPIRE);
redisUtil.set(GoblinRedisConst.SQB_ORDER.concat(orderId), vo);
}
public GoblinSqbOrderVo getSqbOrder(String orderId) {
......
......@@ -34,7 +34,7 @@ goblin.order.create.order_insert=INSERT INTO goblin_store_order (`master_order_c
goblin.order.create.attr_insert=INSERT INTO goblin_order_attr (`order_attr_id`,`order_id`,`express_contacts`,`express_address`,`express_address_detail`,`express_phone`,`express_type`,`created_at`) VALUES (?,?,?,?,?,?,?,?)
goblin.order.create.sku_insert=INSERT INTO goblin_order_sku (`order_sku_id`,`order_id`,`spu_id`,`spu_name`,`spu_pic`,`sku_id`,`num`,`sku_price`,`sku_price_actual`,`sku_name`,`sku_no`,`sku_image`,`sku_specs`,`price_voucher`,`spu_erp_code`,`sku_erp_code`,`erp_type`,`erp_warehouse_no`,`erp_hosting`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
# \u6536\u94B1\u5427\u6269\u5C55\u8868\uff08\u4e0e goblin \u670d\u52a1 sqlmap \u4e00\u81f4\uff09
goblin_sqb_order.insert=INSERT INTO goblin_sqb_order (order_id,user_id,performances_id,spu_id,sku_id,quantity,amount,sqb_order_sn,sqb_order_signature,sqb_acquiring_sn, sqb_acquiring_sign,sqb_checkout_items_id,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_sqb_order.insert=INSERT INTO goblin_sqb_order (order_id,user_id,performances_id,spu_id,sku_id,quantity,amount,sqb_order_sn,sqb_order_signature,sqb_acquiring_sn, sqb_acquiring_sign,sqb_checkout_items_id,coupon_used_status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_order_sku_assoc.insert=INSERT INTO goblin_order_sku_assoc (order_sku_id,is_true_name,id_type,id_name,id_no,operator,created_at) VALUES (?,?,?,?,?,?,?)
#---- \u518D\u6B21\u652F\u4ED8
goblin_order.pay.again=UPDATE goblin_store_order SET pay_type = ? ,device_from = ? ,pay_code = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
......
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