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

Commit 5ff77e13 authored by wangyifan's avatar wangyifan

platform、order、kylin、consumer-order 下单发起拼团、加入拼团、退款修改拼团功能

parent d37a7e7b
......@@ -71,4 +71,17 @@ public class PayOrderParam {
private String referrerApp;
@ApiModelProperty(value = "粉丝俱乐部侧用户id")
private String referrerUserId;
@ApiModelProperty(value = "拼团订单ID,加入拼团时传")
private String groupOrderId;
@ApiModelProperty(value = "拼团活动ID,发起拼团时传")
private String groupBuyActivityId;
@ApiModelProperty(value = "是否公开拼团 1公开 0私密,发起时传,默认1")
private Integer isPublic;
@ApiModelProperty(value = "分享token,私密团加入时传")
private String shareToken;
}
......@@ -49,6 +49,8 @@ public class KylinOrderTicketVo implements Serializable, Cloneable {
private String referrerApp;
@ApiModelProperty(position = 19, value = "粉丝俱乐部侧用户id")
private String referrerUserId;
@ApiModelProperty(position = 19, value = "拼团订单ID")
private String groupOrderId;
@ApiModelProperty(position = 20, value = "下单版本")
private String orderVersion;
@ApiModelProperty(position = 20, value = "数量")
......
......@@ -9,13 +9,18 @@ import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.consumer.order.utils.GoblinNftUtils;
import com.liquidnet.service.consumer.order.utils.KylinOrderUtils;
import com.liquidnet.service.goblin.constant.GoblinRedisConst;
import com.liquidnet.service.goblin.constant.GoblinStatusConst;
import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.goblin.param.BackCouponParam;
import com.liquidnet.service.kylin.constant.GroupBuyStatusConst;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyMemberVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyOrderVo;
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;
......@@ -386,9 +391,18 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
sqlDataOrderRelation.add(new Object[]{
now, kylinOrderTicketVo.getOrderTicketsId(),
});
// 拼团:Mongo + Redis + MySQL(MQ) 回收未支付占坑
LinkedList<Object[]> gbMember = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> gbOrder = CollectionUtil.linkedListObjectArr();
boolean hasGroupBuySql = appendGroupBuyCloseSql(kylinOrderTicketVo, now, sqls, gbMember, gbOrder);
if (hasGroupBuySql) {
sendMsgByRedis(MQConst.KylinQueue.SQL_ORDER_PAY.getKey(),
SqlMapping.gets(sqls, sqlDataOrder, sqlDataOrderStatus, sqlDataOrderRelation, gbMember, gbOrder));
} else {
sendMsgByRedis(MQConst.KylinQueue.SQL_ORDER_PAY.getKey(),
SqlMapping.gets(sqls, sqlDataOrder, sqlDataOrderStatus, sqlDataOrderRelation));
}
}
return true;
} catch (Exception e) {
log.error("checkTicketOrderTime异常 [valueData:{}, e:{}]", orderId, e);
......@@ -396,6 +410,107 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
}
}
/**
* 关单回收拼团占坑:先改 Mongo/Redis,再组装 MySQL SQL。
* @return 是否追加了拼团 SQL
*/
private boolean appendGroupBuyCloseSql(KylinOrderTicketVo ticket, LocalDateTime now,
LinkedList<String> sqls,
LinkedList<Object[]> gbMember,
LinkedList<Object[]> gbOrder) {
KylinGroupBuyOrderVo group = findGroupBuyForClose(ticket);
if (group == null || CollectionUtil.isEmpty(group.getMembers())) {
return false;
}
String lockKey = KylinRedisConst.GROUP_BUY_ORDER_LOCK.concat(group.getGroupOrderId());
if (!redisDataSourceUtil.getRedisKylinUtil().lock(lockKey, 1, 15)) {
log.warn("关单拼团获取锁失败 orderTicketsId={}, groupOrderId={}",
ticket.getOrderTicketsId(), group.getGroupOrderId());
return false;
}
try {
group = mongoTemplate.findOne(
Query.query(Criteria.where("groupOrderId").is(group.getGroupOrderId())),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
if (group == null || CollectionUtil.isEmpty(group.getMembers())) {
return false;
}
KylinGroupBuyMemberVo member = null;
for (KylinGroupBuyMemberVo m : group.getMembers()) {
if (ticket.getOrderTicketsId().equals(m.getOrderTicketsId())) {
member = m;
break;
}
}
if (member == null || !GroupBuyStatusConst.MemberStatus.PENDING_PAY.equals(member.getStatus())) {
return false;
}
boolean isLeaderPrepare = GroupBuyStatusConst.OrderStatus.PREPARE.equals(group.getStatus())
&& Objects.equals(group.getLeaderUserId(), ticket.getUserId());
member.setStatus(GroupBuyStatusConst.MemberStatus.CANCELLED);
String nowStr = DateUtil.Formatter.yyyyMMddHHmmss.format(now);
if (isLeaderPrepare) {
group.setStatus(GroupBuyStatusConst.OrderStatus.CANCELLED);
group.setCurrentCount(0);
} else if (GroupBuyStatusConst.OrderStatus.PENDING.equals(group.getStatus())
|| GroupBuyStatusConst.OrderStatus.PREPARE.equals(group.getStatus())) {
int count = group.getCurrentCount() == null ? 0 : group.getCurrentCount();
group.setCurrentCount(Math.max(0, count - 1));
}
group.setUpdatedAt(nowStr);
mongoTemplate.remove(Query.query(Criteria.where("groupOrderId").is(group.getGroupOrderId())),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
mongoTemplate.insert(group, KylinGroupBuyOrderVo.class.getSimpleName());
if (isLeaderPrepare) {
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.GROUP_BUY_ORDER.concat(group.getGroupOrderId()));
if (StringUtils.isNotBlank(group.getShareToken())) {
redisDataSourceUtil.getRedisKylinUtil().del(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(group.getShareToken()));
}
} else {
redisDataSourceUtil.getRedisKylinUtil().set(KylinRedisConst.GROUP_BUY_ORDER.concat(group.getGroupOrderId()),
group, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
if (StringUtils.isNotBlank(group.getShareToken())) {
redisDataSourceUtil.getRedisKylinUtil().set(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(group.getShareToken()),
group, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
}
}
sqls.add(SqlMapping.get("kylin_group_buy_member.cancel_by_order_tickets"));
gbMember.add(new Object[]{ticket.getOrderTicketsId()});
if (isLeaderPrepare) {
sqls.add(SqlMapping.get("kylin_group_buy_order.cancel_if_prepare"));
gbOrder.add(new Object[]{now, group.getGroupOrderId()});
} else {
sqls.add(SqlMapping.get("kylin_group_buy_order.decr_count_if_pending"));
gbOrder.add(new Object[]{now, group.getGroupOrderId()});
}
return true;
} finally {
redisDataSourceUtil.getRedisKylinUtil().uLock(lockKey);
}
}
private KylinGroupBuyOrderVo findGroupBuyForClose(KylinOrderTicketVo ticket) {
if (StringUtils.isNotBlank(ticket.getGroupOrderId())) {
Object cached = redisDataSourceUtil.getRedisKylinUtil()
.get(KylinRedisConst.GROUP_BUY_ORDER.concat(ticket.getGroupOrderId()));
if (cached instanceof KylinGroupBuyOrderVo) {
return (KylinGroupBuyOrderVo) cached;
}
KylinGroupBuyOrderVo byId = mongoTemplate.findOne(
Query.query(Criteria.where("groupOrderId").is(ticket.getGroupOrderId())),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
if (byId != null) {
return byId;
}
}
return mongoTemplate.findOne(
Query.query(Criteria.where("members.orderTicketsId").is(ticket.getOrderTicketsId())),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
}
private UpdateResult updateGoblinStoreOrderVo(String orderId, GoblinStoreOrderVo data) {
BasicDBObject object = cloneBasicDBObject().append("$set", mongoConverter.convertToMongoType(data));
return mongoTemplate.getCollection(GoblinStoreOrderVo.class.getSimpleName()).updateOne(
......
......@@ -10,3 +10,12 @@ goblin_activity.code.admin=UPDATE goblin_nft_ex_code SET admin_uid = ? where co
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 = ?
# ------------------------演出票拼团-未支付关单----------------------------
kylin_group_buy_member.cancel_by_order_tickets=UPDATE kylin_group_buy_member SET status=2 WHERE order_tickets_id=? AND status=-1
kylin_group_buy_order.cancel_if_prepare=UPDATE kylin_group_buy_order SET status=3, current_count=0, updated_at=? WHERE group_order_id=? AND status=-1
kylin_group_buy_order.decr_count_if_pending=UPDATE kylin_group_buy_order SET current_count=current_count-1, updated_at=? WHERE group_order_id=? AND status=0 AND current_count>0
kylin_group_buy_order.delete=DELETE FROM kylin_group_buy_order WHERE group_order_id = ?
kylin_group_buy_order.insert=INSERT INTO kylin_group_buy_order (group_order_id,activity_id,leader_user_id,order_tickets_id,target_count,current_count,status,is_public,share_token,expires_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
kylin_group_buy_member.delete_by_group=DELETE FROM kylin_group_buy_member WHERE group_order_id = ?
kylin_group_buy_member.insert=INSERT INTO kylin_group_buy_member (member_id,group_order_id,user_id,order_tickets_id,ticket_count,status,join_time,created_at) VALUES (?,?,?,?,?,?,?,?)
\ No newline at end of file
......@@ -71,7 +71,9 @@ public class KylinOrderTicketsRefundController {
@ApiImplicitParam(type = "form", dataType = "String", name = "expressContacts", value = "发货人姓名"),
@ApiImplicitParam(type = "form", dataType = "String", name = "expressPhone", value = "发货人联系方式"),
@ApiImplicitParam(type = "form", dataType = "String", name = "sendExpressAddress", value = "取件地址"),
@ApiImplicitParam(type = "form", dataType = "String", name = "appointmentTime", value = "预约取件时间")
@ApiImplicitParam(type = "form", dataType = "String", name = "appointmentTime", value = "预约取件时间"),
@ApiImplicitParam(type = "form", dataType = "Boolean", name = "skipCharges", value = "系统退款免手续费"),
@ApiImplicitParam(type = "form", dataType = "Boolean", name = "autoApproved", value = "系统退款自动审批")
})
public ResponseDto sendOrderRefund(
@RequestParam(value = "orderId", required = true) @NotNull(message = "订单ID不能为空") String orderId,
......@@ -86,9 +88,14 @@ public class KylinOrderTicketsRefundController {
@RequestParam(value = "expressContacts", required = false) String expressContacts,
@RequestParam(value = "expressPhone", required = false) String expressPhone,
@RequestParam(value = "sendExpressAddress", required = false) String sendExpressAddress,
@RequestParam(value = "appointmentTime", required = false) String appointmentTime
@RequestParam(value = "appointmentTime", required = false) String appointmentTime,
@RequestParam(value = "skipCharges", required = false) Boolean skipCharges,
@RequestParam(value = "autoApproved", required = false) Boolean autoApproved
) {
// 退款
boolean systemRefund = Boolean.TRUE.equals(skipCharges) && Boolean.TRUE.equals(autoApproved);
if (systemRefund) {
return kylinOrderTicketsRefundService.systemFullRefund(orderId, orderTicketEntitiesId, reason);
}
return kylinOrderTicketsRefundService.sendOrderRefund(
orderId, orderTicketEntitiesId, reason, picList, ticketNum,
sendExpressType, expressNumber, expressContacts, expressPhone, sendExpressAddress, appointmentTime
......
......@@ -184,11 +184,42 @@ public class KylinGroupBuyOrderServiceImpl implements IKylinGroupBuyOrderService
if (!uid.equals(order.getLeaderUserId())) return ResponseDto.failure("仅团长可取消拼团");
if (GroupBuyStatusConst.OrderStatus.SUCCESS.equals(order.getStatus())) return ResponseDto.failure("拼团已成,不可取消");
if (!GroupBuyStatusConst.OrderStatus.PENDING.equals(order.getStatus())) return ResponseDto.failure("当前状态不可取消");
String lockKey = KylinRedisConst.GROUP_BUY_ORDER_LOCK.concat(groupOrderId);
if (!redisUtil.lock(lockKey, 1, 15)) {
return ResponseDto.failure("拼团处理中,请稍后重试");
}
List<KylinGroupBuyMemberVo> joinedToRefund = new ArrayList<>();
try {
// 持锁后回源,仅 PENDING → CANCELLED
order = mongoTemplate.findOne(
Query.query(Criteria.where("groupOrderId").is(groupOrderId)),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
if (order == null) return ResponseDto.failure("拼团不存在");
if (!GroupBuyStatusConst.OrderStatus.PENDING.equals(order.getStatus())) {
return ResponseDto.failure("当前状态不可取消");
}
order.setStatus(GroupBuyStatusConst.OrderStatus.CANCELLED);
order.setUpdatedAt(now());
if (!CollectionUtils.isEmpty(order.getMembers())) {
for (KylinGroupBuyMemberVo member : order.getMembers()) {
if (GroupBuyStatusConst.MemberStatus.JOINED.equals(member.getStatus())) {
joinedToRefund.add(member);
member.setStatus(GroupBuyStatusConst.MemberStatus.REFUNDED);
} else if (GroupBuyStatusConst.MemberStatus.PENDING_PAY.equals(member.getStatus())) {
member.setStatus(GroupBuyStatusConst.MemberStatus.CANCELLED);
}
}
}
order.setCurrentCount(0);
saveOrder(order);
refundAllGroupMembers(order, "团长取消拼团,全额退款");
notifyLeaderCancelled(order.getGroupOrderId());
} finally {
redisUtil.uLock(lockKey);
}
for (KylinGroupBuyMemberVo member : joinedToRefund) {
refundJoinedMember(member.getOrderTicketsId(), "团长取消拼团,全额退款");
}
notifyLeaderCancelled(groupOrderId);
return ResponseDto.success(true);
}
......@@ -262,7 +293,7 @@ public class KylinGroupBuyOrderServiceImpl implements IKylinGroupBuyOrderService
}
private void sendReplaceOrderSql(KylinGroupBuyOrderVo order, String queueKey) {
if (order.getOrderTicketsId() == null || order.getExpiresAt() == null) return;
if (order.getOrderTicketsId() == null) return;
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> od = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> oi = CollectionUtil.linkedListObjectArr();
......@@ -287,7 +318,7 @@ public class KylinGroupBuyOrderServiceImpl implements IKylinGroupBuyOrderService
return new Object[]{vo.getGroupOrderId(), vo.getActivityId(), vo.getLeaderUserId(),
vo.getOrderTicketsId(), vo.getTargetCount(), vo.getCurrentCount(), vo.getStatus(),
vo.getIsPublic(), vo.getShareToken(),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getExpiresAt()),
vo.getExpiresAt() == null ? null : DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getExpiresAt()),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getCreatedAt()),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getUpdatedAt())};
}
......@@ -324,14 +355,18 @@ public class KylinGroupBuyOrderServiceImpl implements IKylinGroupBuyOrderService
DateUtil.Formatter.yyyyMMddHHmmss.parse(order.getExpiresAt())).getSeconds());
}
private void refundAllGroupMembers(KylinGroupBuyOrderVo order, String reason) {
if (CollectionUtils.isEmpty(order.getMembers())) return;
for (KylinGroupBuyMemberVo member : order.getMembers()) {
KylinOrderTicketVo ticketVo = dataUtils.getOrderTicketVo(member.getOrderTicketsId());
if (ticketVo == null || CollectionUtils.isEmpty(ticketVo.getEntitiesVoList())) continue;
private void refundJoinedMember(String orderTicketsId, String reason) {
KylinOrderTicketVo ticketVo = dataUtils.getOrderTicketVo(orderTicketsId);
if (ticketVo == null || CollectionUtils.isEmpty(ticketVo.getEntitiesVoList())) {
return;
}
for (KylinOrderTicketEntitiesVo entity : ticketVo.getEntitiesVoList()) {
refundService.sendOrderRefund(ticketVo.getOrderTicketsId(), entity.getOrderTicketEntitiesId(),
reason, "", "", 0, "", "", "", "", "");
try {
refundService.systemFullRefund(ticketVo.getOrderTicketsId(),
entity.getOrderTicketEntitiesId(), reason);
} catch (Exception e) {
log.error("拼团散团退款失败 orderTicketsId={}, entityId={}",
orderTicketsId, entity.getOrderTicketEntitiesId(), e);
}
}
}
......
......@@ -171,6 +171,20 @@ public class KylinOrderTicketsRefundServiceImpl {
}
public ResponseDto sendOrderRefund(String orderId, String orderTicketEntitiesId, String reason, String picList, String ticketNum, Integer sendExpressType, String expressNumber, String expressContacts, String expressPhone, String sendExpressAddress, String appointmentTime) {
return sendOrderRefund(orderId, orderTicketEntitiesId, reason, picList, ticketNum,
sendExpressType, expressNumber, expressContacts, expressPhone, sendExpressAddress, appointmentTime,
false, false);
}
/**
* 系统全额退(拼团散团/超时):跳过票主登录态与退票窗口,免手续费并触发自动退款。
*/
public ResponseDto systemFullRefund(String orderId, String orderTicketEntitiesId, String reason) {
return sendOrderRefund(orderId, orderTicketEntitiesId, reason, "", "",
0, "", "", "", "", "", true, true);
}
public ResponseDto sendOrderRefund(String orderId, String orderTicketEntitiesId, String reason, String picList, String ticketNum, Integer sendExpressType, String expressNumber, String expressContacts, String expressPhone, String sendExpressAddress, String appointmentTime, boolean skipCharges, boolean autoApproved) {
boolean isLock = dataUtils.setRefundLock(orderTicketEntitiesId);
if (!isLock) {
return ResponseDto.failure("正在处理,请勿重复操作~");
......@@ -178,12 +192,21 @@ public class KylinOrderTicketsRefundServiceImpl {
KylinOrderTicketEntitiesVo orderTicketEntitiesVo = null;
try {
String uid = CurrentUtil.getCurrentUid();
String uid = null;
try {
uid = CurrentUtil.getCurrentUid();
} catch (Exception ignore) {
// 系统退款可能无登录态
}
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderId);
List<KylinOrderRefundsVo> kylinOrderRefundsVoBaseList = dataUtils.getOrderRefundVoByOrderId(orderTicketVo.getOrderTicketsId());
if (!SuperAccountUtils.isSuperAccount(uid, orderTicketVo.getUserId())) {
if (!autoApproved) {
if (uid == null || !SuperAccountUtils.isSuperAccount(uid, orderTicketVo.getUserId())) {
return ResponseDto.failure(ErrorMapping.get("20003"));
}
} else if (uid == null) {
uid = "system";
}
// if (uid.equals("809406") || uid.equals("773650")) {
// } else {
// if (!orderTicketVo.getUserId().equals(uid)) {
......@@ -209,6 +232,7 @@ public class KylinOrderTicketsRefundServiceImpl {
}
}
if (!autoApproved) {
if (null != performanceVo.getIsCanRefund() && performanceVo.getIsCanRefund() == 1) {
LocalDateTime refundOpenDate = DateUtil.Formatter.yyyyMMddHHmmss.parse(performanceVo.getRefundOpenTime());
LocalDateTime refundCloseDate = DateUtil.Formatter.yyyyMMddHHmmss.parse(performanceVo.getRefundCloseTime());
......@@ -222,6 +246,7 @@ public class KylinOrderTicketsRefundServiceImpl {
} else {
return ResponseDto.failure("暂不支持退款");
}
}
List<KylinOrderTicketEntitiesVo> entitiesVos = orderTicketVo.getEntitiesVoList();
for (KylinOrderTicketEntitiesVo item : entitiesVos) {
......@@ -240,9 +265,12 @@ public class KylinOrderTicketsRefundServiceImpl {
BigDecimal singlePrice = orderTicketVo.getPriceActual().subtract(orderTicketVo.getPriceExpress()).divide(BigDecimal.valueOf(orderTicketVo.getNumber()), 2, BigDecimal.ROUND_HALF_UP);
// 手续费处理 TODO 修改了手续费根据票单算
BigDecimal priceCharges = BigDecimal.ZERO;
if (!skipCharges) {
BigDecimal chargesRatio = getChargesRatio(orderTicketVo.getUseStart(), performanceVo.getIsRefundPoundage(dataUtils.getRefundPoundage(1, performanceVo.getPerformancesId()).size()), performanceVo.getPerformancesId());
BigDecimal priceCharges = singlePrice.multiply(chargesRatio).setScale(2, BigDecimal.ROUND_HALF_UP);
priceCharges = singlePrice.multiply(chargesRatio).setScale(2, BigDecimal.ROUND_HALF_UP);
refundSinglePrice = refundSinglePrice.subtract(priceCharges);
}
if (refundSinglePrice.compareTo(BigDecimal.ZERO) <= 0) {
return ResponseDto.failure("申请金额不得小于0哦~");
}
......@@ -265,16 +293,20 @@ public class KylinOrderTicketsRefundServiceImpl {
}
}
String username = "system";
if (!autoApproved) {
Map token = CurrentUtil.getTokenClaims();
String username = StringUtils.defaultString(((String) token.get("nickname")), "");
String orderRefundId = refundsStatusService.userOrderTicketRefunding(orderTicketVo, refundSinglePrice, priceExpress, priceCharges, orderTicketEntitiesId, reason, picList, ticketNum, uid, username, kylinOrderRefundsVoBaseList.size(), sendExpressType);
username = StringUtils.defaultString(((String) token.get("nickname")), "");
}
Integer expressTypeParam = sendExpressType == null ? 0 : sendExpressType;
String orderRefundId = refundsStatusService.userOrderTicketRefunding(orderTicketVo, refundSinglePrice, priceExpress, priceCharges, orderTicketEntitiesId, reason, picList, ticketNum, uid, username, kylinOrderRefundsVoBaseList.size(), expressTypeParam);
if (!orderRefundId.isEmpty()) {
// 退款申请成功 异步去快递下单
if (orderTicketVo.getGetTicketType().equals("express") && sendExpressType > 0) {// 快递票
expressPlace(sendExpressType, expressNumber, expressContacts, expressPhone, sendExpressAddress, appointmentTime, orderTicketVo, performanceVo, orderRefundId);
if (orderTicketVo.getGetTicketType().equals("express") && expressTypeParam > 0) {// 快递票
expressPlace(expressTypeParam, expressNumber, expressContacts, expressPhone, sendExpressAddress, appointmentTime, orderTicketVo, performanceVo, orderRefundId);
}
//电子票自动退款
if (orderTicketVo.getGetTicketType().equals("electronic")){
//电子票自动退款;系统退款一律触发自动审批
if (autoApproved || orderTicketVo.getGetTicketType().equals("electronic")){
try {
MultiValueMap<String, String> params = new LinkedMultiValueMap();
params.add("orderRefundsId", orderRefundId);
......
......@@ -50,3 +50,6 @@ kylin_group_buy_order.insert=INSERT INTO kylin_group_buy_order (group_order_id,a
kylin_group_buy_order.update_status=UPDATE kylin_group_buy_order SET status = ?, updated_at = ? WHERE group_order_id = ? AND status = ?
kylin_group_buy_member.delete_by_group=DELETE FROM kylin_group_buy_member WHERE group_order_id = ?
kylin_group_buy_member.insert=INSERT INTO kylin_group_buy_member (member_id,group_order_id,user_id,order_tickets_id,ticket_count,status,join_time,created_at) VALUES (?,?,?,?,?,?,?,?)
kylin_group_buy_member.cancel_by_order_tickets=UPDATE kylin_group_buy_member SET status=2 WHERE order_tickets_id=? AND status=-1
kylin_group_buy_order.cancel_if_prepare=UPDATE kylin_group_buy_order SET status=3, current_count=0, updated_at=? WHERE group_order_id=? AND status=-1
kylin_group_buy_order.decr_count_if_pending=UPDATE kylin_group_buy_order SET current_count=current_count-1, updated_at=? WHERE group_order_id=? AND status=0 AND current_count>0
\ No newline at end of file
......@@ -82,6 +82,8 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
private TaobaoTicketUtils taobaoTicketUtils;
@Autowired
private OrderRefundOvertimeServiceImpl orderRefundsCallbackService;
@Autowired
private GroupBuyOrderHelper groupBuyOrderHelper;
ArrayList<Integer> canBuyStatus = new ArrayList() {{
add(6);
......@@ -367,6 +369,13 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
return ResponseDto.failure(ErrorMapping.get("20015"));//入场人数量错误
}
// 拼团:库存前校验(禁券 + 发起/加入)
ResponseDto<Boolean> groupBuyCheck = groupBuyOrderHelper.validateBeforeOrder(payOrderParam, uid);
if (!groupBuyCheck.isSuccess()) {
orderUtils.backAdvanceCoupon(payOrderParam.getAdvanceCode(), uid);
return ResponseDto.failure(groupBuyCheck.getMessage());
}
// 判断库存
int surplusGeneral = orderUtils.changeSurplus(isPay, payOrderParam.getTicketId(), -payOrderParam.getNumber());
......@@ -522,18 +531,26 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
orderTickets.setCouponType("no");
}
if (isMember) {
boolean isGroupBuy = groupBuyOrderHelper.isGroupBuyOrder(payOrderParam);
BigDecimal groupUnitPrice = groupBuyOrderHelper.resolveUnitPrice(payOrderParam, ticketData.getPrice());
if (isGroupBuy) {
if (groupUnitPrice == null) {
throw new Exception("拼团价计算失败");
}
orderTickets.setPriceTotal(groupUnitPrice.multiply(BigDecimal.valueOf(payOrderParam.getNumber()))
.add(payOrderParam.getIsExpress() == 1 ? priceExpress : BigDecimal.valueOf(0)));
} else if (isMember) {
orderTickets.setPriceTotal(ticketData.getMemberPrice().multiply(BigDecimal.valueOf(payOrderParam.getNumber())).add(payOrderParam.getIsExpress() == 1 ? priceExpress : BigDecimal.valueOf(0)));
} else {
orderTickets.setPriceTotal(ticketData.getPrice().multiply(BigDecimal.valueOf(payOrderParam.getNumber())).add(payOrderParam.getIsExpress() == 1 ? priceExpress : BigDecimal.valueOf(0)));
}
orderTickets.setPriceVoucher(BigDecimal.ZERO);
//券的使用逻辑
//券的使用逻辑(拼团禁券)
sqls.add(SqlMapping.get("kylin_order_coupon.add"));
LinkedList<Object[]> sqlsDataE = ObjectUtil.cloneLinkedListObj();
ArrayList<KylinOrderCoupons> couponsList = new ArrayList();
if (advanceMap != null) {
if (!isGroupBuy && advanceMap != null) {
BigDecimal priceVoucher = (BigDecimal) advanceMap.get("voucher");
Integer typeVoucher = (Integer) advanceMap.get("type");
KylinOrderCoupons couponsAdvance = KylinOrderCoupons.getNew();
......@@ -548,7 +565,7 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
});
}
if (payOrderParam.getVoucherCode() != null) {
if (!isGroupBuy && payOrderParam.getVoucherCode() != null) {
HashMap<String, Object> hashMap = orderUtils.useCoupon(payOrderParam.getVoucherCode(), content, orderTickets.getPriceTotal().subtract(priceExpress), payOrderParam.getPerformanceId(), payOrderParam.getTimeId(), payOrderParam.getTicketId(),performanceData.getType());
if (null != hashMap) {
BigDecimal priceVoucher = (BigDecimal) hashMap.get("voucher");
......@@ -820,6 +837,14 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
orderTicketVo.setOverdueAt(orderTickets.getCreatedAt().plusMinutes(performanceData.getPayCountdownMinute()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
orderTicketVo.setCreatedAt(orderTickets.getCreatedAt().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
orderTicketVo.setChangeDate(orderTickets.getCreatedAt());
// 拼团:写团 + member(-1),票单冗余 groupOrderId
if (isGroupBuy) {
String nickname = StringUtils.defaultString((String) token.get("nickname"), "");
String avatar = StringUtils.defaultString((String) token.get("avatar"), "");
String groupOrderId = groupBuyOrderHelper.createOrJoinOnOrder(
payOrderParam, uid, orderTicketId, payOrderParam.getNumber(), nickname, avatar);
orderTicketVo.setGroupOrderId(groupOrderId);
}
mongoTemplate.insert(orderTicketVo, KylinOrderTicketVo.class.getSimpleName());
orderUtils.resetOrderListVo(uid, 1, orderTicketVo.getOrderTicketsId(), orderTicketVo);
......@@ -1169,6 +1194,17 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
// innerService.reportO(orderTicketData, "摩登天空");
//大麦回调
sycDamaiOrder(orderTickets.getOrderTicketsId(), orderTicketData.getIsMember());
// 拼团:按票单确认成员 / 开团 / 成团;团已取消则自动退
try {
KylinOrderTicketVo paidTicket = dataUtils.getOrderTicketVo(orderTicketData.getOrderTicketsId());
int gbResult = groupBuyOrderHelper.confirmPaidMember(paidTicket);
if (gbResult == 2) {
orderRefundsCallbackService.refundApply(orderTicketData.getOrderTicketsId(),
syncOrderParam.getPaymentId(), syncOrderParam.getPaymentType());
}
} catch (Exception gbEx) {
log.error("拼团支付确认失败 orderTicketsId={}", orderTicketData.getOrderTicketsId(), gbEx);
}
}
log.info(UserPathDto.setData("订单支付成功回调", syncOrderParam, ""));
return "success";
......
......@@ -79,3 +79,9 @@ dragon_orders.updateNotifyStatus=update dragon_orders t set t.notify_status = ?
#---- \u85CF\u54C1\u8BA2\u5355\u5173\u8054\u85CF\u54C1ID
goblin_nft_order.update_artwork=UPDATE goblin_nft_order SET artwork_id=? WHERE order_id=?
#----
# ------------------------演出票拼团----------------------------
kylin_group_buy_order.delete=DELETE FROM kylin_group_buy_order WHERE group_order_id = ?
kylin_group_buy_order.insert=INSERT INTO kylin_group_buy_order (group_order_id,activity_id,leader_user_id,order_tickets_id,target_count,current_count,status,is_public,share_token,expires_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
kylin_group_buy_member.delete_by_group=DELETE FROM kylin_group_buy_member WHERE group_order_id = ?
kylin_group_buy_member.insert=INSERT INTO kylin_group_buy_member (member_id,group_order_id,user_id,order_tickets_id,ticket_count,status,join_time,created_at) VALUES (?,?,?,?,?,?,?,?)
......@@ -13,6 +13,7 @@ import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyMemberVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyOrderVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.platform.utils.GroupBuyPlatformHelper;
import com.liquidnet.service.platform.utils.QueueUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -27,6 +28,7 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Service
......@@ -39,6 +41,8 @@ public class PlatformGroupBuyTaskServiceImpl {
private RedisUtil redisUtil;
@Autowired
private QueueUtils queueUtils;
@Autowired
private GroupBuyPlatformHelper groupBuyPlatformHelper;
@Value("${liquidnet.service.kylin.url}")
private String kylinUrl;
......@@ -50,19 +54,43 @@ public class PlatformGroupBuyTaskServiceImpl {
List<KylinGroupBuyOrderVo> orders = mongoTemplate.find(query,
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
for (KylinGroupBuyOrderVo order : orders) {
Query cas = Query.query(Criteria.where("groupOrderId").is(order.getGroupOrderId())
.and("status").is(GroupBuyStatusConst.OrderStatus.PENDING)
.and("expiresAt").lt(now));
Update update = Update.update("status", GroupBuyStatusConst.OrderStatus.FAILED)
.set("updatedAt", now);
if (mongoTemplate.updateFirst(cas, update,
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName()).getModifiedCount() == 1) {
order.setStatus(GroupBuyStatusConst.OrderStatus.FAILED);
order.setUpdatedAt(now);
sendOrderStatusSql(order.getGroupOrderId(), GroupBuyStatusConst.OrderStatus.PENDING,
GroupBuyStatusConst.OrderStatus.FAILED, LocalDateTime.now());
cacheOrder(order);
refundMembers(order, "拼团超时未成团,全额退款");
String groupOrderId = order.getGroupOrderId();
if (!groupBuyPlatformHelper.tryLock(groupOrderId)) {
log.warn("拼团超时任务获取锁失败 groupOrderId={}", groupOrderId);
continue;
}
try {
KylinGroupBuyOrderVo fresh = groupBuyPlatformHelper.loadFromMongo(groupOrderId);
if (fresh == null || !GroupBuyStatusConst.OrderStatus.PENDING.equals(fresh.getStatus())) {
continue;
}
if (fresh.getExpiresAt() == null
|| !DateUtil.Formatter.yyyyMMddHHmmss.parse(fresh.getExpiresAt()).isBefore(LocalDateTime.now())) {
continue;
}
fresh.setStatus(GroupBuyStatusConst.OrderStatus.FAILED);
fresh.setUpdatedAt(now);
List<String> joinedOrderTicketIds = new ArrayList<>();
if (!CollectionUtils.isEmpty(fresh.getMembers())) {
for (KylinGroupBuyMemberVo member : fresh.getMembers()) {
if (GroupBuyStatusConst.MemberStatus.PENDING_PAY.equals(member.getStatus())) {
member.setStatus(GroupBuyStatusConst.MemberStatus.CANCELLED);
} else if (GroupBuyStatusConst.MemberStatus.JOINED.equals(member.getStatus())) {
joinedOrderTicketIds.add(member.getOrderTicketsId());
member.setStatus(GroupBuyStatusConst.MemberStatus.REFUNDED);
}
}
}
fresh.setCurrentCount(0);
// Mongo + Redis + MySQL(delete/insert 全量同步团与成员)
groupBuyPlatformHelper.saveGroup(fresh);
for (String orderTicketsId : joinedOrderTicketIds) {
refundJoinedTicket(orderTicketsId, "拼团超时未成团,全额退款");
}
} catch (Exception e) {
log.error("拼团超时处理失败 groupOrderId={}", groupOrderId, e);
} finally {
groupBuyPlatformHelper.unlock(groupOrderId);
}
}
return true;
......@@ -106,47 +134,36 @@ public class PlatformGroupBuyTaskServiceImpl {
return true;
}
private void cacheOrder(KylinGroupBuyOrderVo order) {
redisUtil.del(KylinRedisConst.GROUP_BUY_ORDER.concat(order.getGroupOrderId()));
redisUtil.del(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(order.getShareToken()));
redisUtil.set(KylinRedisConst.GROUP_BUY_ORDER.concat(order.getGroupOrderId()), order, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
redisUtil.set(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(order.getShareToken()), order, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
}
private void cacheActivity(KylinGroupBuyActivityVo activity) {
redisUtil.del(KylinRedisConst.GROUP_BUY_ACTIVITY.concat(activity.getActivityId()));
redisUtil.set(KylinRedisConst.GROUP_BUY_ACTIVITY.concat(activity.getActivityId()), activity, RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
}
private void sendOrderStatusSql(String groupOrderId, Integer fromStatus, Integer toStatus, LocalDateTime updatedAt) {
queueUtils.sendMsgByRedis(MQConst.KylinQueue.SQL_ORDER_OVERTIME_REFUND.getKey(),
SqlMapping.get("kylin_group_buy_order.update_status", toStatus, updatedAt, groupOrderId, fromStatus));
}
private void sendActivityStatusSql(String activityId, Integer fromStatus, Integer toStatus, LocalDateTime updatedAt) {
queueUtils.sendMsgByRedis(MQConst.SlimeQueue.SQL_SLIME_FIELD.getKey(),
SqlMapping.get("kylin_group_buy_activity.update_status", toStatus, updatedAt, activityId, fromStatus));
}
private void refundMembers(KylinGroupBuyOrderVo order, String reason) {
if (CollectionUtils.isEmpty(order.getMembers())) {
return;
}
for (KylinGroupBuyMemberVo member : order.getMembers()) {
private void refundJoinedTicket(String orderTicketsId, String reason) {
KylinOrderTicketVo orderTicketVo = mongoTemplate.findOne(
Query.query(Criteria.where("orderTicketsId").is(member.getOrderTicketsId())),
Query.query(Criteria.where("orderTicketsId").is(orderTicketsId)),
KylinOrderTicketVo.class, KylinOrderTicketVo.class.getSimpleName());
if (orderTicketVo == null) {
continue;
return;
}
List<KylinOrderTicketEntitiesVo> entities = mongoTemplate.find(
List<KylinOrderTicketEntitiesVo> entities = orderTicketVo.getEntitiesVoList();
if (CollectionUtils.isEmpty(entities)) {
entities = mongoTemplate.find(
Query.query(Criteria.where("orderId").is(orderTicketVo.getOrderTicketsId())),
KylinOrderTicketEntitiesVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
}
if (CollectionUtils.isEmpty(entities)) {
return;
}
for (KylinOrderTicketEntitiesVo entity : entities) {
autoRefund(orderTicketVo.getOrderTicketsId(), entity.getOrderTicketEntitiesId(), reason);
}
}
}
private void autoRefund(String orderId, String orderTicketEntitiesId, String reason) {
try {
......
......@@ -22,6 +22,7 @@ import com.liquidnet.service.kylin.mapper.KylinOrderTicketStatusMapper;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketsMapper;
import com.liquidnet.service.kylin.service.IKylinOrderRefundsService;
import com.liquidnet.service.platform.utils.DataUtils;
import com.liquidnet.service.platform.utils.GroupBuyPlatformHelper;
import com.mongodb.BasicDBObject;
import com.mongodb.client.result.UpdateResult;
import lombok.extern.slf4j.Slf4j;
......@@ -80,6 +81,8 @@ public class OrderRefundsCallbackServiceImpl extends ServiceImpl<KylinOrderRefun
private MongoConverter mongoConverter;
@Autowired
private DataUtils dataUtils;
@Autowired
private GroupBuyPlatformHelper groupBuyPlatformHelper;
public String refundCallback(RefundCallbackParam refundCallbackParam) {
log.info("refundCallback订单退款回调参数: [RefundCallbackParam={}]", refundCallbackParam);
......@@ -112,6 +115,11 @@ public class OrderRefundsCallbackServiceImpl extends ServiceImpl<KylinOrderRefun
if (1 == status) { // 退款成功
boolean res = kylinRefundsStatusServiceImpl.orderTicketRefunded(refundCallbackParam, refundInfo);
if (res) {
try {
groupBuyPlatformHelper.onTicketRefunded(refundInfo.getOrderTicketsId());
} catch (Exception e) {
log.error("拼团退款回写异常 orderTicketsId={}", refundInfo.getOrderTicketsId(), e);
}
return "success";
} else {
return "fail";
......
package com.liquidnet.service.platform.utils;
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.service.base.SqlMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.base.constant.RedisKeyExpireConst;
import com.liquidnet.service.kylin.constant.GroupBuyStatusConst;
import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyMemberVo;
import com.liquidnet.service.kylin.dto.vo.groupbuy.KylinGroupBuyOrderVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
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.CollectionUtils;
import java.time.LocalDateTime;
import java.util.LinkedList;
import java.util.function.Consumer;
/**
* platform 侧拼团:锁、退款回写、Mongo/Redis/MySQL 快照同步。
*/
@Component
@Slf4j
public class GroupBuyPlatformHelper {
private static final int LOCK_SECONDS = 15;
@Autowired
private MongoTemplate mongoTemplate;
@Autowired
private RedisUtil redisUtil;
@Autowired
private QueueUtils queueUtils;
public boolean tryLock(String groupOrderId) {
if (StringUtils.isBlank(groupOrderId)) {
return false;
}
return redisUtil.lock(KylinRedisConst.GROUP_BUY_ORDER_LOCK.concat(groupOrderId), 1, LOCK_SECONDS);
}
public void unlock(String groupOrderId) {
if (StringUtils.isBlank(groupOrderId)) {
return;
}
redisUtil.uLock(KylinRedisConst.GROUP_BUY_ORDER_LOCK.concat(groupOrderId));
}
public void withGroupLock(String groupOrderId, Runnable action) {
if (!tryLock(groupOrderId)) {
throw new IllegalStateException("拼团处理中,请稍后重试");
}
try {
action.run();
} finally {
unlock(groupOrderId);
}
}
public boolean withGroupLockQuiet(String groupOrderId, Consumer<KylinGroupBuyOrderVo> action) {
if (!tryLock(groupOrderId)) {
log.warn("拼团锁获取失败 groupOrderId={}", groupOrderId);
return false;
}
try {
KylinGroupBuyOrderVo group = loadFromMongo(groupOrderId);
if (group == null) {
return false;
}
action.accept(group);
return true;
} finally {
unlock(groupOrderId);
}
}
/**
* 票单退款成功:JOINED → REFUNDED;PENDING 团则 count--。幂等。
*/
public void onTicketRefunded(String orderTicketsId) {
if (StringUtils.isBlank(orderTicketsId)) {
return;
}
KylinGroupBuyOrderVo group = mongoTemplate.findOne(
Query.query(Criteria.where("members.orderTicketsId").is(orderTicketsId)),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
if (group == null || CollectionUtils.isEmpty(group.getMembers())) {
return;
}
String groupOrderId = group.getGroupOrderId();
if (!tryLock(groupOrderId)) {
log.warn("退款回写拼团获取锁失败 orderTicketsId={}, groupOrderId={}", orderTicketsId, groupOrderId);
return;
}
try {
group = loadFromMongo(groupOrderId);
if (group == null || CollectionUtils.isEmpty(group.getMembers())) {
return;
}
KylinGroupBuyMemberVo member = null;
for (KylinGroupBuyMemberVo m : group.getMembers()) {
if (orderTicketsId.equals(m.getOrderTicketsId())) {
member = m;
break;
}
}
if (member == null) {
return;
}
if (GroupBuyStatusConst.MemberStatus.REFUNDED.equals(member.getStatus())
|| GroupBuyStatusConst.MemberStatus.CANCELLED.equals(member.getStatus())) {
return;
}
// 仅已支付成员回写;未支付占坑由关单/散团处理
if (!GroupBuyStatusConst.MemberStatus.JOINED.equals(member.getStatus())) {
return;
}
member.setStatus(GroupBuyStatusConst.MemberStatus.REFUNDED);
if (GroupBuyStatusConst.OrderStatus.PENDING.equals(group.getStatus())) {
int count = group.getCurrentCount() == null ? 0 : group.getCurrentCount();
group.setCurrentCount(Math.max(0, count - 1));
}
group.setUpdatedAt(now());
saveGroup(group);
log.info("拼团退款回写完成 orderTicketsId={}, groupOrderId={}, groupStatus={}, currentCount={}",
orderTicketsId, groupOrderId, group.getStatus(), group.getCurrentCount());
} catch (Exception e) {
log.error("拼团退款回写失败 orderTicketsId={}", orderTicketsId, e);
} finally {
unlock(groupOrderId);
}
}
public KylinGroupBuyOrderVo loadFromMongo(String groupOrderId) {
if (StringUtils.isBlank(groupOrderId)) {
return null;
}
return mongoTemplate.findOne(
Query.query(Criteria.where("groupOrderId").is(groupOrderId)),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
}
public void saveGroup(KylinGroupBuyOrderVo group) {
if (group == null) {
return;
}
clearCache(group);
mongoTemplate.remove(Query.query(Criteria.where("groupOrderId").is(group.getGroupOrderId())),
KylinGroupBuyOrderVo.class, KylinGroupBuyOrderVo.class.getSimpleName());
mongoTemplate.insert(group, KylinGroupBuyOrderVo.class.getSimpleName());
cache(group);
sendReplaceSql(group);
}
public void cache(KylinGroupBuyOrderVo group) {
if (group == null) {
return;
}
redisUtil.set(KylinRedisConst.GROUP_BUY_ORDER.concat(group.getGroupOrderId()), group,
RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
if (StringUtils.isNotBlank(group.getShareToken())) {
redisUtil.set(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(group.getShareToken()), group,
RedisKeyExpireConst.KYLIN_GROUP_BUY_EXPIRE);
}
}
public void clearCache(KylinGroupBuyOrderVo group) {
if (group == null) {
return;
}
redisUtil.del(KylinRedisConst.GROUP_BUY_ORDER.concat(group.getGroupOrderId()));
if (StringUtils.isNotBlank(group.getShareToken())) {
redisUtil.del(KylinRedisConst.GROUP_BUY_ORDER_SHARE.concat(group.getShareToken()));
}
}
public void sendReplaceSql(KylinGroupBuyOrderVo group) {
LinkedList<String> sqls = CollectionUtil.linkedListString();
LinkedList<Object[]> od = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> oi = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> md = CollectionUtil.linkedListObjectArr();
LinkedList<Object[]> mi = CollectionUtil.linkedListObjectArr();
sqls.add(SqlMapping.get("kylin_group_buy_order.delete"));
od.add(new Object[]{group.getGroupOrderId()});
sqls.add(SqlMapping.get("kylin_group_buy_order.insert"));
oi.add(orderInsertObject(group));
sqls.add(SqlMapping.get("kylin_group_buy_member.delete_by_group"));
md.add(new Object[]{group.getGroupOrderId()});
if (!CollectionUtils.isEmpty(group.getMembers())) {
sqls.add(SqlMapping.get("kylin_group_buy_member.insert"));
for (KylinGroupBuyMemberVo m : group.getMembers()) {
mi.add(memberInsertObject(m));
}
queueUtils.sendMsgByRedis(MQConst.KylinQueue.SQL_ORDER_OVERTIME_REFUND.getKey(),
SqlMapping.gets(sqls, od, oi, md, mi));
} else {
queueUtils.sendMsgByRedis(MQConst.KylinQueue.SQL_ORDER_OVERTIME_REFUND.getKey(),
SqlMapping.gets(sqls, od, oi, md));
}
}
private Object[] orderInsertObject(KylinGroupBuyOrderVo vo) {
return new Object[]{
vo.getGroupOrderId(), vo.getActivityId(), vo.getLeaderUserId(), vo.getOrderTicketsId(),
vo.getTargetCount(), vo.getCurrentCount(), vo.getStatus(), vo.getIsPublic(), vo.getShareToken(),
vo.getExpiresAt() == null ? null : DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getExpiresAt()),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getCreatedAt()),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getUpdatedAt())
};
}
private Object[] memberInsertObject(KylinGroupBuyMemberVo vo) {
return new Object[]{
vo.getMemberId(), vo.getGroupOrderId(), vo.getUserId(), vo.getOrderTicketsId(),
vo.getTicketCount(), vo.getStatus(),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getJoinTime()),
DateUtil.Formatter.yyyyMMddHHmmss.parse(vo.getCreatedAt())
};
}
private String now() {
return DateUtil.Formatter.yyyyMMddHHmmss.format(LocalDateTime.now());
}
}
......@@ -8,3 +8,7 @@ kylin_camera_record.insert=INSERT INTO kylin_camera_record (camera_record_id, ca
# ------------------------演出票拼团----------------------------
kylin_group_buy_order.update_status=UPDATE kylin_group_buy_order SET status = ?, updated_at = ? WHERE group_order_id = ? AND status = ?
kylin_group_buy_activity.update_status=UPDATE kylin_group_buy_activity SET status = ?, updated_at = ? WHERE activity_id = ? AND status = ?
kylin_group_buy_order.delete=DELETE FROM kylin_group_buy_order WHERE group_order_id = ?
kylin_group_buy_order.insert=INSERT INTO kylin_group_buy_order (group_order_id,activity_id,leader_user_id,order_tickets_id,target_count,current_count,status,is_public,share_token,expires_at,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)
kylin_group_buy_member.delete_by_group=DELETE FROM kylin_group_buy_member WHERE group_order_id = ?
kylin_group_buy_member.insert=INSERT INTO kylin_group_buy_member (member_id,group_order_id,user_id,order_tickets_id,ticket_count,status,join_time,created_at) VALUES (?,?,?,?,?,?,?,?)
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