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

Commit 633393cd authored by jiangxiulong's avatar jiangxiulong

退款回调

parent e7b703bb
......@@ -189,7 +189,8 @@ public class GoblinStatusConst {
ORDER_STATUS_1(1, "待付款(用户刚下单)"),
ORDER_STATUS_2(2, "已付款(用户付完款 等待商城发货)"),
ORDER_STATUS_3(3, "已取消(未付款取消订单"),
ORDER_STATUS_4(4, "已退款(超时支付)"),
ORDER_STATUS_4(4, "退款中(超时支付)"),
ORDER_STATUS_5(5, "已退款(超时支付)"),
ORDER_REFUND_STATUS_1(1, "申请"),
ORDER_REFUND_STATUS_2(2, "退款成功"),
......
......@@ -129,13 +129,13 @@ CREATE TABLE goblin_nft_order
ucoupon_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '券id',
store_coupon_id VARCHAR(255) NOT NULL DEFAULT '' COMMENT '商铺券id',
red_envelope_code VARCHAR(64) NOT NULL DEFAULT '' COMMENT '红包code',
status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单状态 0-待付款(用户刚下单)|1-已付款|2-已取消(未付款取消订单)|3-已退款(超时支付)',
source VARCHAR(32) NOT NULL DEFAULT '' COMMENT '订单来源 app|h5|applet',
order_type TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单类型 0-购买订单|1-兑换订单|2-演出赠送订单',
status TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单状态 1待付款 2已付款 3未付款取消订单 4退款中 5已退款',
source VARCHAR(32) NOT NULL DEFAULT '' COMMENT '订单来源 app h5 applet',
order_type TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '订单类型 1购买订单 2兑换订单 3演出赠送订单',
pay_time DATETIME NULL DEFAULT NULL COMMENT '支付时间',
pay_code VARCHAR(64) NOT NULL DEFAULT '' COMMENT '支付单号',
pay_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型 wepay-微信支付|alipay-阿里支付|douyinpay-抖音支付|unionpay-银联支付',
device_from VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型来源[wap|js]',
pay_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付类型 wepay微信 alipay阿里 douyinpay抖音 unionpay银联',
device_from VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付终端 app wap js applet',
payment_type VARCHAR(32) NOT NULL DEFAULT '' COMMENT '支付中心返回实际支付类型',
payment_id VARCHAR(128) NOT NULL DEFAULT '' COMMENT '支付中心返回支付id',
pay_store_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '钱到了哪个支付平台 平台的订单id为''',
......@@ -170,9 +170,9 @@ CREATE TABLE goblin_nft_order_refund
order_code VARCHAR(64) NOT NULL DEFAULT '' COMMENT '订单编号',
store_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '商铺id',
user_id VARCHAR(64) NOT NULL DEFAULT '' COMMENT '用户id',
sku_id_nums VARCHAR(255) NOT NULL DEFAULT '' COMMENT '退货的单品ID多个用,分开 退款的时候不需要,因为退款只能整单退1001-1,1002-3 表示单品id为1001 的单品退货1件 单品id为1002的单品退货3件',
sku_id_nums VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'skuId',
real_back_price DECIMAL(8, 2) NOT NULL DEFAULT 0 COMMENT '退货时候实际退款金额',
status INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '退款状态 1申请|2退款成功|3退款失败',
status INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '退款状态 1申请 2退款成功 3退款失败',
refund_at DATETIME NULL DEFAULT NULL COMMENT '退款时间',
error_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '退款失败原因',
created_at DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
......
......@@ -466,111 +466,59 @@ public class GoblinNftOrderServiceImpl implements IGoblinNftOrderService {
@Override
public String refundSyncOrder(GoblinNftOrderRefundCallbackParam refundCallbackParam) {
LocalDateTime now = LocalDateTime.now();
String nowStr = DateUtil.getNowTime();
log.info("refundCallback订单退款回调参数: [RefundCallbackParam={}]", refundCallbackParam);
GoblinBackOrderVo backOrderVo = goblinMongoUtils.getGoblinBackOrderVoByBackCode(refundCallbackParam.getOrderRefundCode());
if (backOrderVo == null) {
log.info("refundCallback: 退款订单查询失败,编号{}", refundCallbackParam.getOrderRefundCode());
log.info("NftRefundCallback订单退款回调参数: [RefundCallbackParam={}]", refundCallbackParam);
GoblinNftOrderCallBackVo nftOrderRefundVo = goblinMongoUtils.getGoblinNftOrderRefundVo(refundCallbackParam.getOrderRefundCode());
if (nftOrderRefundVo == null) {
log.info("NftRefundCallback: 退款订单查询失败,编号{}", refundCallbackParam.getOrderRefundCode());
return "fail";
}
if (backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_20.getValue() || backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_201.getValue()) {
log.info("refundCallback: 退款订单已取消,编号{}", refundCallbackParam.getOrderRefundCode());
return "fail";
}
if (backOrderVo.getStatus() == GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue()) {
log.info("refundCallback: 退款订单已完成,编号{}", refundCallbackParam.getOrderRefundCode());
if (nftOrderRefundVo.getStatus() == GoblinStatusConst.NftStatus.ORDER_REFUND_STATUS_2.getValue()) {
log.info("NftRefundCallback: 退款订单已完成,编号{}", refundCallbackParam.getOrderRefundCode());
return "success";
}
Integer status = refundCallbackParam.getStatus();
if (1 == status && (backOrderVo.getStatus() == 0 || backOrderVo.getStatus() == 10)) { // 退款成功
if (1 == status) { // 退款成功
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlsOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlsOrderSku = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlsBackOrder = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("goblin_order.store.refundPrice"));
sqls.add(SqlMapping.get("goblin_order.store.refundSkuPrice"));
sqls.add(SqlMapping.get("goblin_order.store.refundBackOrder"));
String orderId = backOrderVo.getOrderId();
List<GoblinBackOrderSkuVo> backOrderSkuVos = backOrderVo.getBackOrderSkuVos();
GoblinStoreOrderVo orderVo = goblinRedisUtils.getGoblinOrder(orderId);
orderVo.setPriceRefund(orderVo.getPriceRefund() == null ? BigDecimal.ZERO : orderVo.getPriceRefund().add(refundCallbackParam.getRefundPrice()));
if (orderVo.getPriceRefund().compareTo(orderVo.getPriceActual()) >= 0) {
//整单退款 退券
orderVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_6.getValue());
if (!(orderVo.getUcouponId() == null || orderVo.getUcouponId().equals(""))) {
goblinOrderUtils.backCoupon(orderVo.getUcouponId(), orderVo.getUserId());
}
if (!(orderVo.getStoreCouponId() == null || orderVo.getStoreCouponId().equals(""))) {
List<BackCouponParam> params = ObjectUtil.getBackCouponParam();
BackCouponParam backCouponParam = BackCouponParam.getNew();
backCouponParam.setuCouponIds(orderVo.getStoreCouponId());
backCouponParam.setUid(orderVo.getUserId());
params.add(backCouponParam);
goblinOrderUtils.backStoreCoupon(params);
}
sqls.add(SqlMapping.get("goblin_nft_order.update.refund"));
sqls.add(SqlMapping.get("goblin_nft_order_refund.refund"));
String orderId = nftOrderRefundVo.getOrderId();
GoblinNftOrderVo nftOrder = nftOrderUtils.getNftOrder(orderId);
//整单退款 退券
nftOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_5.getValue());
if (StringUtil.isNotEmpty(nftOrder.getUcouponId())) {
goblinOrderUtils.backCoupon(nftOrder.getUcouponId(), nftOrder.getUserId());
}
backOrderVo.setStatus(GoblinStatusConst.Status.ORDER_BACK_STATUS_2.getValue());
backOrderVo.setRefundAt(nowStr);
for (GoblinBackOrderSkuVo backOrderSkuVo : backOrderSkuVos) {
GoblinOrderSkuVo orderSkuVo = goblinRedisUtils.getGoblinOrderSkuVo(backOrderSkuVo.getOrderSkuId());
BigDecimal refundSkuPrice = backOrderSkuVo.getRefundPrice();
orderSkuVo.setPriceRefund(orderSkuVo.getPriceRefund() == null ? refundSkuPrice : orderSkuVo.getPriceRefund().add(refundSkuPrice));
if (orderSkuVo.getPriceRefund().compareTo(orderSkuVo.getSkuPriceActual()) >= 0) {
orderSkuVo.setStatus(GoblinStatusConst.Status.ORDER_STATUS_6.getValue());
String pre = GoblinStatusConst.MarketPreStatus.getPre(orderSkuVo.getSkuId());
String skuId = orderSkuVo.getSkuId();
goblinRedisUtils.incrSkuStock(pre, skuId, orderSkuVo.getNum());
goblinRedisUtils.decrSkuCountByUid(orderVo.getUserId(), skuId, orderSkuVo.getNum());
}
goblinRedisUtils.setGoblinOrderSku(backOrderSkuVo.getOrderSkuId(), orderSkuVo);
goblinMongoUtils.updateGoblinOrderSkuVo(backOrderSkuVo.getOrderSkuId(), orderSkuVo);
sqlsOrderSku.add(new Object[]{
orderSkuVo.getPriceRefund(), orderSkuVo.getStatus(), now,
backOrderSkuVo.getOrderSkuId(), now, now
});
GoblinOrderLogVo logVo = GoblinOrderLogVo.getNew();
logVo.setOrderId(orderVo.getOrderId());
logVo.setOrderCode(orderVo.getOrderCode());
logVo.setPayCode(orderVo.getPayCode());
if (orderSkuVo.getSkuId().indexOf(GoblinStatusConst.MarketPreStatus.MARKET_PRE_ZHENGZAI.getValue()) > 0) {
logVo.setOrderType("zhengzai");
} else {
logVo.setOrderType("order");
}
logVo.setStoreId(orderVo.getStoreId());
logVo.setSpuId(orderSkuVo.getSpuId());
logVo.setSpuName(backOrderSkuVo.getSpuName());
logVo.setSkuId(backOrderSkuVo.getSkuId());
// if (orderVo.getStatus().equals(GoblinStatusConst.Status.ORDER_STATUS_6.getValue())) {
// refundSkuPrice = refundSkuPrice.add(orderVo.getPriceExpress());
// }
logVo.setSkuPriceActual(refundSkuPrice.multiply(BigDecimal.valueOf(100)).negate().longValue());
logVo.setStatus(GoblinStatusConst.Status.ORDER_LOG_STATUS_22.getValue());
logVo.setRemark("订单退款");
logVo.setOperationId(backOrderVo.getUserId());
logVo.setOperationType(GoblinStatusConst.Type.OPERATION_TYPE_2.getValue());
logVo.setCreatedAt(now);
goblinMongoUtils.insertGoblinOrderLogVo(logVo);
if (StringUtil.isNotEmpty(nftOrder.getStoreCouponId())) {
List<BackCouponParam> params = ObjectUtil.getBackCouponParam();
BackCouponParam backCouponParam = BackCouponParam.getNew();
backCouponParam.setuCouponIds(nftOrder.getStoreCouponId());
backCouponParam.setUid(nftOrder.getUserId());
params.add(backCouponParam);
goblinOrderUtils.backStoreCoupon(params);
}
nftOrderRefundVo.setStatus(GoblinStatusConst.NftStatus.ORDER_REFUND_STATUS_2.getValue());
nftOrderRefundVo.setRefundAt(now);
//redis
goblinRedisUtils.setGoblinOrder(orderId, orderVo);
goblinRedisUtils.setBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
nftOrderUtils.setNftOrder(nftOrder);
nftOrderUtils.setBackOrderVo(nftOrderRefundVo);
//mongo
goblinMongoUtils.updateGoblinStoreOrderVo(orderId, orderVo);
goblinMongoUtils.updateGoblinBackOrderVo(backOrderVo.getBackOrderId(), backOrderVo);
goblinMongoUtils.updateGoblinNftOrderVo(nftOrder);
goblinMongoUtils.updateGoblinNftOrderRefundVo(nftOrderRefundVo);
//mysql
sqlsOrder.add(new Object[]{
orderVo.getPriceRefund(), orderVo.getStatus(), now,
nftOrder.getStatus(), now,
orderId, now, now
});
sqlsBackOrder.add(new Object[]{
backOrderVo.getStatus(), now, now, backOrderVo.getBackOrderId(), now, now
nftOrderRefundVo.getStatus(), now, now, nftOrderRefundVo.getOrderRefundId(), now, now
});
queueUtils.sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_STORE_ORDER_OPERA.getKey(),
SqlMapping.gets(sqls, sqlsOrder, sqlsOrderSku, sqlsBackOrder));
SqlMapping.gets(sqls, sqlsOrder, sqlsBackOrder));
//减积分
goblinOrderUtils.desTask(orderVo.getUserId(), backOrderVo.getRealBackPrice());
goblinOrderUtils.desTask(nftOrder.getUserId(), nftOrderRefundVo.getRealBackPrice());
} else if (0 == status) {
return "fail";
}
......
......@@ -124,5 +124,16 @@ public class GoblinMongoUtils {
public GoblinNftOrderCallBackVo insertGoblinNftOrderRefundVo(GoblinNftOrderCallBackVo vo) {
return mongoTemplate.insert(vo, GoblinNftOrderCallBackVo.class.getSimpleName());
}
//获取 订单退款数据
public GoblinNftOrderCallBackVo getGoblinNftOrderRefundVo(String refundCode) {
return mongoTemplate.findOne(Query.query(Criteria.where("refundCode").is(refundCode)), GoblinNftOrderCallBackVo.class, GoblinNftOrderCallBackVo.class.getSimpleName());
}
//修改 订单退款数据
public UpdateResult updateGoblinNftOrderRefundVo(GoblinNftOrderCallBackVo data) {
BasicDBObject object = ObjectUtil.cloneBasicDBObject().append("$set", mongoConverter.convertToMongoType(data));
return mongoTemplate.getCollection(GoblinBackOrderVo.class.getSimpleName()).updateOne(
Query.query(Criteria.where("orderRefundId").is(data.getOrderRefundId())).getQueryObject(),
object);
}
}
......@@ -49,4 +49,6 @@ goblin_order.store.backOrder=INSERT INTO goblin_back_order (`back_order_id`,`bac
#-------- NFT -------
goblin_nft_order.insert=INSERT INTO goblin_nft_order (`order_id`,`store_id`,`store_name`,`order_code`,`user_id`,`user_name`,`user_mobile`,`price_total`,`pay_code`,`price_actual`,`price_coupon`,`store_price_coupon`,`price_voucher`,`status`,`ucoupon_id`,`store_coupon_id`,`pay_type`,`device_from`,`source`,`version`,`is_member`,`order_type`,`pay_countdown_minute`,`ip_address`,`created_at`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
goblin_nft_order.update.pay=UPDATE goblin_nft_order SET payment_type = ?, payment_id=?, pay_code = ?, pay_time = ?, status = ?, updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
goblin_nft_order_refund.insert=INSERT INTO goblin_nft_order_refund (`order_refund_id`,`refund_code`,`order_id`,`order_code`,`store_id`,`user_id`,`sku_id_nums`,`real_back_price`,`status`,`refund_at`,`error_reason`) VALUES (?,?,?,?,?,?,?,?,?,?,?)
\ No newline at end of file
goblin_nft_order.update.refund=UPDATE goblin_nft_order SET status = ?, updated_at = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
goblin_nft_order_refund.insert=INSERT INTO goblin_nft_order_refund (`order_refund_id`,`refund_code`,`order_id`,`order_code`,`store_id`,`user_id`,`sku_id_nums`,`real_back_price`,`status`,`refund_at`,`error_reason`) VALUES (?,?,?,?,?,?,?,?,?,?,?)
goblin_nft_order_refund.refund=UPDATE goblin_nft_order_refund SET status = ?, refund_at = ?, updated_at = ? WHERE order_refund_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
\ No newline at end of file
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