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

Commit e00a0eff authored by 胡佳晨's avatar 胡佳晨

讲票务订单回滚逻辑 加入商城逻辑

parent dcac2b47
package com.liquidnet.service.consumer.order.receiver;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
......@@ -18,6 +20,9 @@ import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.entity.KylinOrderCoupons;
import com.liquidnet.service.kylin.entity.KylinOrderTicketRelations;
import com.liquidnet.service.kylin.entity.KylinOrderTicketStatus;
import com.liquidnet.service.kylin.entity.KylinOrderTickets;
import com.mongodb.BasicDBObject;
import com.mongodb.client.result.UpdateResult;
......@@ -183,12 +188,12 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
if (StringUtils.isEmpty(nftOrder.getBoxSkuId())) {// 购买藏品
GoblinListCollectVo goblinListCollectVo = goblinNftUtils.getCollectByNowNext(nowTime, nftOrder.getSkuId());
String listId = (null == goblinListCollectVo) ? null : goblinListCollectVo.getListId();
log.debug("listId : {}",listId);
log.debug("listId : {}", listId);
goblinNftUtils.incrSkuStock(listId, nftOrder.getSkuId(), nftOrder.getNum());
} else {// 购买盲盒
GoblinListCollectVo goblinListCollectVo = goblinNftUtils.getCollectByNowNext(nowTime, nftOrder.getBoxSkuId());
String listId = (null == goblinListCollectVo) ? null : goblinListCollectVo.getListId();
log.debug("listId : {}",listId);
log.debug("listId : {}", listId);
goblinNftUtils.incrSkuStock(listId, nftOrder.getBoxSkuId(), nftOrder.getNum());
}
......@@ -220,36 +225,65 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
try {
KylinOrderTicketVo kylinOrderTicketVo = kylinOrderUtils.getOrderTicketVo(orderId);
if (kylinOrderTicketVo.getStatus().equals(KylinTableStatusConst.ORDER_STATUS0)) {//待支付
// // 库存购买数量回滚
// goblinNftUtils.decrSkuCountByUid(nftOrder.getUserId(), nftOrder.getSkuId(), nftOrder.getNum());
// LocalDateTime nowTime = LocalDateTime.now();
// if (StringUtils.isEmpty(nftOrder.getBoxSkuId())) {// 购买藏品
// GoblinListCollectVo goblinListCollectVo = goblinNftUtils.getCollectByNowNext(nowTime, nftOrder.getSkuId());
// String listId = (null == goblinListCollectVo) ? null : goblinListCollectVo.getListId();
// log.debug("listId : {}",listId);
// goblinNftUtils.incrSkuStock(listId, nftOrder.getSkuId(), nftOrder.getNum());
// } else {// 购买盲盒
// GoblinListCollectVo goblinListCollectVo = goblinNftUtils.getCollectByNowNext(nowTime, nftOrder.getBoxSkuId());
// String listId = (null == goblinListCollectVo) ? null : goblinListCollectVo.getListId();
// log.debug("listId : {}",listId);
// goblinNftUtils.incrSkuStock(listId, nftOrder.getBoxSkuId(), nftOrder.getNum());
// }
//
// // 订单状态
// nftOrder.setStatus(GoblinStatusConst.NftStatus.ORDER_STATUS_3.getValue());
// nftOrder.setUpdatedAt(now);
// nftOrder.setCancelTime(now);
// nftOrder.setCancelReason("超时支付关闭");
// goblinNftUtils.setNftOrder(nftOrder);
// goblinNftUtils.updateGoblinNftOrderVo(nftOrder);
// LinkedList<String> sqls = CollectionUtil.linkedListString();
// LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
// sqls.add(SqlMapping.get("goblin_nft_order.update.close"));
// sqlDataOrder.add(new Object[]{
// nftOrder.getStatus(), now, now, "超时支付关闭", nftOrder.getOrderId(), now, now
// });
// sendMsgByRedis(MQConst.GoblinQueue.GOBLIN_ORDER_CLOSE.getKey(),
// SqlMapping.gets(sqls, sqlDataOrder));
//改redis
kylinOrderTicketVo.setStatus(2);
kylinOrderUtils.resetOrderListVo(kylinOrderTicketVo.getUserId(), 2, kylinOrderTicketVo.getOrderTicketsId(), kylinOrderTicketVo);
// redis 改限购
for (int i = 0; i < kylinOrderTicketVo.getEntitiesVoList().size(); i++) {
KylinOrderTicketEntitiesVo items = kylinOrderTicketVo.getEntitiesVoList().get(i);
kylinOrderUtils.changeBuyInfo(items.getUserId(), items.getEnterIdCode(), items.getPerformanceId(), items.getTicketId(), -1);
}
//改库存
kylinOrderUtils.changeSurplusGeneral(kylinOrderTicketVo.getTicketId(), kylinOrderTicketVo.getNumber());
//改mongo
HashMap<String, Object> mapMongo = CollectionUtil.mapStringObject();
mapMongo.put("status", KylinTableStatusConst.ORDER_STATUS2);
mapMongo.put("updatedAt", DateUtil.Formatter.yyyyMMddHHmmssSSS.format(now));
mapMongo.put("changeDate", now);
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("orderTicketsId").in(kylinOrderTicketVo.getOrderTicketsId())).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(mapMongo))
);
// //处理券
ArrayList<KylinOrderCoupons> orderCoupons = kylinOrderUtils.getOrderCoupon(kylinOrderTicketVo.getOrderTicketsId());
if (orderCoupons.size() > 0) {
for (KylinOrderCoupons item : orderCoupons) {
if (item.getCouponType() != 101) {
kylinOrderUtils.backCoupon(item.getCouponCode(), kylinOrderTicketVo.getUserId());
}
}
}
//mysql
KylinOrderTickets orderTickets = KylinOrderTickets.getNew();
orderTickets.setUpdatedAt(now);
// orderTicketsMapper.update(orderTickets, new UpdateWrapper<KylinOrderTickets>().in("order_tickets_id", orderIdList));
KylinOrderTicketStatus orderTicketStatus = KylinOrderTicketStatus.getNew();
orderTicketStatus.setStatus(2);
orderTicketStatus.setUpdatedAt(now);
// orderTicketStatusMapper.update(orderTicketStatus, new UpdateWrapper<KylinOrderTicketStatus>().in("order_id", orderIdList));
KylinOrderTicketRelations orderTicketRelations = KylinOrderTicketRelations.getNew();
orderTicketRelations.setUpdatedAt(now);
// orderTicketRelationsMapper.update(orderTicketRelations, new UpdateWrapper<KylinOrderTicketRelations>().in("order_id", orderIdList));
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> sqlDataOrder = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataOrderStatus = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> sqlDataOrderRelation = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("kylin_order_tickets.close"));
sqls.add(SqlMapping.get("kylin_order_ticket_status.close"));
sqls.add(SqlMapping.get("kylin_order_ticket_relations.close"));
sqlDataOrder.add(new Object[]{
now, kylinOrderTicketVo.getOrderTicketsId(),
});
sqlDataOrderStatus.add(new Object[]{
2,now, kylinOrderTicketVo.getOrderTicketsId(),
});
sqlDataOrderRelation.add(new Object[]{
now, kylinOrderTicketVo.getOrderTicketsId(),
});
sendMsgByRedis(MQConst.KylinQueue.SQL_ORDER_PAY.getKey(),
SqlMapping.gets(sqls, sqlDataOrder,sqlDataOrderStatus,sqlDataOrderRelation));
}
return true;
} catch (Exception e) {
......
package com.liquidnet.service.consumer.order.utils;
import com.alibaba.fastjson.JSON;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.service.candy.param.BackCouponParam;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.dto.vo.GoblinListCollectVo;
import com.liquidnet.service.goblin.dto.vo.GoblinNftOrderVo;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinPerformanceVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderListVo;
import com.liquidnet.service.kylin.entity.KylinOrderCoupons;
import com.mongodb.BasicDBObject;
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import java.time.LocalDateTime;
import java.util.ArrayList;
......@@ -23,16 +34,15 @@ import java.util.List;
import java.util.stream.Collectors;
@Component
@Slf4j
public class KylinOrderUtils {
@Value("${liquidnet.candy.url}")
private String candyUrl;
@Autowired
private RedisUtil redisUtil;
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private MongoConverter mongoConverter;
private static final BasicDBObject basicDBObject = new BasicDBObject();
//-------- TICKET --------
/**
......@@ -53,4 +63,171 @@ public class KylinOrderUtils {
return ticketData;
}
}
/**
* @param userId 用户id
* @param type 1新增 2修改
* @param orderId 订单id [需要新增或者修改的订单id]
*/
public Boolean resetOrderListVo(String userId, Integer type, String orderId, KylinOrderTicketVo dataSingle) {
List<KylinOrderListVo> vo = new ArrayList<>();
List<KylinOrderListVo> redisVo = new ArrayList();
KylinOrderTicketVo data = dataSingle;
KylinOrderListVo voItem = KylinOrderListVo.getNew().copy(data);
List<KylinOrderListVo> redisData = (List<KylinOrderListVo>) redisUtil.get(KylinRedisConst.ORDER_LIST + userId);
if(redisData==null){
return false;
}
if (type == 1) {
redisVo.add(voItem);
if (redisData.size() > 0) {
if (redisData.get(0).getOrderTicketsId().equals(orderId)) {
redisData.remove(0);
}
}
}
redisVo.addAll(redisData);
switch (type) {
case 1:
for (int i = 0; i < redisVo.size(); i++) {
if (i == 40) {
break;
}
if (i == 0) {
vo.add(voItem);
} else {
vo.add(redisVo.get(i));
}
}
if (redisVo.size() == 0) {
vo.add(voItem);
}
redisUtil.set(KylinRedisConst.ORDER_LIST + userId, vo);
return true;
case 2:
for (int i = 0; i < redisVo.size(); i++) {
if (i == 40) {
break;
}
if (redisVo.get(i).getOrderTicketsId().equals(orderId)) {
vo.add(voItem);
} else {
vo.add(redisVo.get(i));
}
}
redisUtil.set(KylinRedisConst.ORDER_LIST + userId, vo);
return true;
default:
return false;
}
}
/**
* 限购处理
* @param userId
* @param idCard
* @param performanceId
* @param ticketId
* @param buyCount
*/
public void changeBuyInfo(String userId, String idCard, String performanceId, String ticketId, int buyCount) {
String redisKey;
int isTrueName = getPerformanceIsTrueName(performanceId);
if (0 == isTrueName) {
redisKey = KylinRedisConst.USERID_BUY_INFO + userId;
} else {
redisKey = KylinRedisConst.IDCARD_BUY_INFO + idCard;
}
String performanceIdKey = redisKey + ":" + KylinRedisConst.PERFORMANCE_ID + ":" + performanceId;
String ticketIdKey = redisKey + ":" + KylinRedisConst.TICKET_ID + ":" + ticketId;
if (buyCount > 0) {
redisUtil.incr(ticketIdKey, buyCount);
redisUtil.incr(performanceIdKey, buyCount);
} else {
redisUtil.decr(ticketIdKey, Math.abs(buyCount));
redisUtil.decr(performanceIdKey, Math.abs(buyCount));
}
}
/**
* 演出是否实名
*
* @param performanceId
*/
public int getPerformanceIsTrueName(String performanceId) {
Object obj = redisUtil.get(KylinRedisConst.PERFORMANCES_TRUE_NAME + performanceId);
if (obj != null) {
return (int) obj;
} else {
int isTrueName = getPerformanceVo(performanceId).getIsTrueName();
redisUtil.set(KylinRedisConst.PERFORMANCES_TRUE_NAME + performanceId, isTrueName);
return isTrueName;
}
}
/**
* 根据演出id 获取 演出vo 详情
*
* @param performanceId
* @return
*/
public KylinPerformanceVo getPerformanceVo(String performanceId) {
if (redisUtil.hasKey(KylinRedisConst.PERFORMANCES + performanceId)) {
} else {
KylinPerformanceVo performanceData = mongoTemplate.findOne(Query.query(Criteria.where("performancesId").is(performanceId)), KylinPerformanceVo.class, KylinPerformanceVo.class.getSimpleName());
redisUtil.set(KylinRedisConst.PERFORMANCES + performanceId, performanceData);
}
return (KylinPerformanceVo) redisUtil.get(KylinRedisConst.PERFORMANCES + performanceId);
}
/**
* 修改普通库存 并 返回修改后的数量
*
* @param ticketId 票id
* @param surplusGeneral 普通库存
* @return 普通剩余库存
*/
public int changeSurplusGeneral(String ticketId, int surplusGeneral) {
if (surplusGeneral > 0) {
return (int) redisUtil.incr(KylinRedisConst.PERFORMANCES_INVENTORY + ticketId + ":" + KylinRedisConst.SURPLUS_GENERAL, surplusGeneral);
} else {
return (int) redisUtil.decr(KylinRedisConst.PERFORMANCES_INVENTORY + ticketId + ":" + KylinRedisConst.SURPLUS_GENERAL, Math.abs(surplusGeneral));
}
}
// 获取订单券的使用情况
public ArrayList<KylinOrderCoupons> getOrderCoupon(String orderId) {
String redisKey = KylinRedisConst.ORDER_COUPON.concat(orderId);
Object obj = redisUtil.get(redisKey);
if (obj == null) {
return getKylinOrderCouponsArrayList();
} else {
return (ArrayList<KylinOrderCoupons>) obj;
}
}
public void backCoupon(String uCouponId, String uid) {
try {
BackCouponParam param = BackCouponParam.getNew();
param.setuCouponIds(uCouponId);
param.setUid(uid);
MultiValueMap<String, String> header = CollectionUtil.linkedMultiValueMapStringString();
header.add("Authorization", "Bearer " + CurrentUtil.getToken());
ArrayList<BackCouponParam> params = new ArrayList();
params.add(param);
String jsonString = JSON.toJSONString(params);
String returnData = HttpUtil.postRaw(candyUrl + "/candy-coupon/useBack", jsonString, header);
} catch (Exception e) {
log.error("回退券ERROR:{}", e);
}
}
private static final ArrayList<KylinOrderCoupons> kylinOrderCouponsArrayList = new ArrayList<>();
public static ArrayList<KylinOrderCoupons> getKylinOrderCouponsArrayList() {
return (ArrayList<KylinOrderCoupons>) kylinOrderCouponsArrayList.clone();
}
}
......@@ -4,6 +4,9 @@ goblin_order.close.sku=UPDATE goblin_order_sku SET status = ? ,updated_at = ? WH
goblin_user_coupon.updateState=UPDATE goblin_user_coupon SET state = ? , used_for = ? ,updated_at = ? where ucoupon_id = ?
#-------- NFT -------
goblin_nft_order.update.close=UPDATE goblin_nft_order SET status = ?, updated_at = ?, cancel_time = ?, cancel_reason = ? WHERE order_id = ? and (updated_at <= ? or created_at = ? or updated_at is null)
#---- 兑换码操作
goblin_activity.code.admin=UPDATE goblin_nft_ex_code SET admin_uid = ? where code = ?
\ No newline at end of file
goblin_activity.code.admin=UPDATE goblin_nft_ex_code SET admin_uid = ? where code = ?
#---- 关闭票务订单
kylin_order_tickets.close=UPDATE kylin_order_tickets SET updated_at = ? where order_tickets_id = ?
kylin_order_ticket_status.close=UPDATE kylin_order_ticket_status SET status = ? , updated_at = ? where order_id = ?
kylin_order_ticket_relations.close=UPDATE kylin_order_ticket_relations SET updated_at = ? where order_id = ?
\ 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