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

Commit 821aa560 authored by 胡佳晨's avatar 胡佳晨

转赠相关接口提交

涉及项目
platfrom - 定时任务
kylin - 转赠相关
consumer-kylin - 转赠过期定时任务部分逻辑(reids)
admin - 转赠相关配置(退款与转赠不能并存)
executor - 转正过期定时任务
parent cf956133
......@@ -10,44 +10,46 @@ import java.math.BigDecimal;
@Data
@ApiModel
public class KylinOrderListVo implements Serializable,Cloneable {
public class KylinOrderListVo implements Serializable, Cloneable {
private static final long serialVersionUID = 6554829077875538374L;
@ApiModelProperty(value = "订单id",example = "")
@ApiModelProperty(value = "订单id", example = "")
private String orderTicketsId;
@ApiModelProperty(value = "演出id",example = "")
@ApiModelProperty(value = "演出id", example = "")
private String performanceId;
@ApiModelProperty(value = "票种id",example = "")
@ApiModelProperty(value = "票种id", example = "")
private String ticketId;
@ApiModelProperty(value = "演出标题",example = "")
@ApiModelProperty(value = "演出标题", example = "")
private String performanceTitle;
@ApiModelProperty(value = "演出图片",example = "")
@ApiModelProperty(value = "演出图片", example = "")
private String performanceImg;
@ApiModelProperty(value = "订单号",example = "")
@ApiModelProperty(value = "订单号", example = "")
private String orderCode;
@ApiModelProperty(value = "开售时间",example = "")
@ApiModelProperty(value = "开售时间", example = "")
private String timeStart;
@ApiModelProperty(value = "票种名称",example = "")
@ApiModelProperty(value = "票种名称", example = "")
private String ticketTitle;
@ApiModelProperty(value = "适用开始时间",example = "")
@ApiModelProperty(value = "适用开始时间", example = "")
private String useStart;
@ApiModelProperty(value = "订单过期时间",example = "")
@ApiModelProperty(value = "订单过期时间", example = "")
private String overdueAt;
@ApiModelProperty(value = "过期倒计时",example = "")
@ApiModelProperty(value = "过期倒计时", example = "")
private Long restTime;
@ApiModelProperty(value = "实际支付价格",example = "")
@ApiModelProperty(value = "实际支付价格", example = "")
private BigDecimal priceActual;
@ApiModelProperty(value = "数量",example = "")
@ApiModelProperty(value = "数量", example = "")
private Integer number;
@ApiModelProperty(value = "订单状态(订单状态:0待付款,1已付款,2已关闭,3正在退款,4已退款, 5待关闭 6部分退款 11转赠中 14被赠中)",example = "")
@ApiModelProperty(value = "订单状态(订单状态:0待付款,1已付款,2已关闭,3正在退款,4已退款, 5待关闭,6部分退款," +
"11转赠中,12已转增,13被转赠,14被赠中,15已退回,16被退回)", example = "")
private Integer status;
@ApiModelProperty(value = "快递状态",example = "")
@ApiModelProperty(value = "快递状态", example = "")
private Integer expressStatus;
@ApiModelProperty(value = "取票方式",example = "")
@ApiModelProperty(value = "取票方式", example = "")
private String getTicketType;
@ApiModelProperty(value = "创建时间",example = "")
@ApiModelProperty(value = "创建时间", example = "")
private String createdAt;
private static final KylinOrderListVo obj = new KylinOrderListVo();
public static KylinOrderListVo getNew() {
try {
return (KylinOrderListVo) obj.clone();
......@@ -75,11 +77,23 @@ public class KylinOrderListVo implements Serializable,Cloneable {
this.getTicketType = vo.getGetTicketType();
this.createdAt = vo.getCreatedAt();
this.restTime = 0L;
if(vo.getTransferStatus().equals(1)){
if (vo.getTransferStatus().equals(1)) {
this.status = 11;
}else if(vo.getTransferStatus().equals(4)){
}
if (vo.getTransferStatus().equals(2)) {
this.status = 12;
}
if (vo.getTransferStatus().equals(3)) {
this.status = 13;
}
if (vo.getTransferStatus().equals(4)) {
this.status = 14;
}else{
}
if (vo.getTransferStatus().equals(5)) {
this.status = 15;
} else if (vo.getTransferStatus().equals(6)) {
this.status = 16;
} else {
this.status = vo.getStatus();
}
return this;
......
......@@ -62,4 +62,7 @@ public interface IKylinOrderTicketsService {
//拒绝转赠订单
ResponseDto<String> orderTransferReject();
//拒绝转赠订单
ResponseDto<String> orderTransferBack(String orderId);
}
......@@ -183,7 +183,7 @@ public interface IKylinPerformancesAdminService {
* 修改 演出退款配置
* @return
*/
boolean changeRefundConfig(String performancesId,
String changeRefundConfig(String performancesId,
Integer isCanRefund,
String refundOpenTime,
String refundCloseTime);
......@@ -199,7 +199,7 @@ public interface IKylinPerformancesAdminService {
* 修改 演出转赠配置
* @return
*/
boolean changeTransferConfig(String performancesId,
String changeTransferConfig(String performancesId,
Integer isCanRefund,
String refundOpenTime,
String refundCloseTime);
......
......@@ -199,8 +199,8 @@ public class KylinPerformancesController extends BaseController {
@RequestParam("isCanRefund") Integer isCanRefund,
@RequestParam("refundOpenTime") String refundOpenTime,
@RequestParam("refundCloseTime") String refundCloseTime) {
boolean result = kylinPerformancesService.changeRefundConfig(performancesId, isCanRefund, refundOpenTime, refundCloseTime);
return toAjax(result);
String result = kylinPerformancesService.changeRefundConfig(performancesId, isCanRefund, refundOpenTime, refundCloseTime);
return this.success(result);
}
@GetMapping(value = "/transferConfig/{performancesId}")
......@@ -217,7 +217,7 @@ public class KylinPerformancesController extends BaseController {
@RequestParam("isCanTransfer") Integer isCanTransfer,
@RequestParam("transferStartTime") String transferStartTime,
@RequestParam("transferEndTime") String transferEndTime) {
boolean result = kylinPerformancesService.changeTransferConfig(performancesId, isCanTransfer, transferStartTime, transferEndTime);
return toAjax(result);
String result = kylinPerformancesService.changeTransferConfig(performancesId, isCanTransfer, transferStartTime, transferEndTime);
return this.success(result);
}
}
......@@ -87,6 +87,7 @@
$.operate.post(prefix + "/refundConfig/change",
param,
function (res) {
alert(res.msg);
location.reload();
});
}
......
......@@ -40,11 +40,13 @@
</div>
<div class="form-group">
<label class="col-sm-3 control-label is-required">定时: </label>
<input th:field="${performanceTransferConfigVo.transferStartTime}" type="text" style="width: 200px;float: left"
<input th:field="${performanceTransferConfigVo.transferStartTime}" type="text"
style="width: 200px;float: left"
class="form-control" id="startTime" placeholder="开始时间选择" name="transferOpenTime"
required/>
<span class="control-label" style="float: left;margin-left: 10px;margin-right: 10px"></span>
<input th:field="${performanceTransferConfigVo.transferEndTime}" type="text" style="width: 200px;float: left"
<input th:field="${performanceTransferConfigVo.transferEndTime}" type="text"
style="width: 200px;float: left"
class="form-control" id="endTime" placeholder="结束时间选择" name="transferCloseTime"
required/>
</div>
......@@ -87,6 +89,7 @@
$.operate.post(prefix + "/transferConfig/change",
param,
function (res) {
alert(res.msg);
location.reload();
});
}
......
......@@ -591,10 +591,15 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
}
@Override
public boolean changeTransferConfig(String performancesId,
public String changeTransferConfig(String performancesId,
Integer isCanTransfer,
String transferStartTime,
String transferEndTime) {
KylinPerformanceStatus kylinPerformanceStatusData = performanceStatusMapper.selectOne(new UpdateWrapper<KylinPerformanceStatus>().eq("performance_id", performancesId));
if(kylinPerformanceStatusData.getIsCanRefund().equals(1) && isCanTransfer.equals(1)){
return "修改失败,演出已开启退款";
}
KylinPerformanceStatus kylinPerformanceStatus = new KylinPerformanceStatus();
kylinPerformanceStatus.setIsTransfer(isCanTransfer);
kylinPerformanceStatus.setTransferStartTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(transferStartTime));
......@@ -602,18 +607,23 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
try {
performanceStatusMapper.update(kylinPerformanceStatus, new UpdateWrapper<KylinPerformanceStatus>().eq("performance_id", performancesId));
performanceVoUtils.performanceVoStatus(performancesId);
return true;
return "修改成功";
} catch (Exception e) {
e.printStackTrace();
return false;
return "修改失败";
}
}
@Override
public boolean changeRefundConfig(String performancesId,
public String changeRefundConfig(String performancesId,
Integer isCanRefund,
String refundOpenTime,
String refundCloseTime) {
KylinPerformanceStatus kylinPerformanceStatusData = performanceStatusMapper.selectOne(new UpdateWrapper<KylinPerformanceStatus>().eq("performance_id", performancesId));
if(kylinPerformanceStatusData.getIsTransfer().equals(1) && isCanRefund.equals(1)){
return "修改失败,演出已开启转赠";
}
KylinPerformanceStatus kylinPerformanceStatus = new KylinPerformanceStatus();
kylinPerformanceStatus.setIsCanRefund(isCanRefund);
kylinPerformanceStatus.setRefundOpenTime(DateUtil.Formatter.yyyyMMddHHmmss.parse(refundOpenTime));
......@@ -621,10 +631,10 @@ public class KylinPerformancesAdminServiceImpl extends ServiceImpl<KylinPerforma
try {
performanceStatusMapper.update(kylinPerformanceStatus, new UpdateWrapper<KylinPerformanceStatus>().eq("performance_id", performancesId));
performanceVoUtils.performanceVoStatus(performancesId);
return true;
return "修改成功";
} catch (Exception e) {
e.printStackTrace();
return false;
return "修改失败";
}
}
......
......@@ -45,7 +45,9 @@ public class MQConst {
SQL_ORDER_WITHDRAW("kylin:stream:rk.order.withdraw", "group.order.withdraw", "订单申请撤回"),
SQL_ORDER_OVERTIME_REFUND("kylin:stream:rk.order.overtime.refund", "group.order.overtime.refund", "超时支付申请退款"),
SQL_STATION("kylin:stream:rk.station", "group.station", "验票更新"),
SQL_TRANSFER("kylin:stream:rk.transfer", "group.transfer", "订单转赠"),
SQL_TRANSFER("kylin:stream:rk.transfer", "group.transfer", "订单发起转赠"),
SQL_TRANSFER_RESULT("kylin:stream:rk.transfer.result", "group.transfer.result", "订单结果转赠"),
SQL_TRANSFER_OVERTIME("kylin:stream:rk.transfer.overtime", "group.transfer.overtime", "订单结果转赠"),
;
private final String key;
private final String group;
......
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
public class KylinOrderTask implements Serializable {
@TableId(value = "mid", type = IdType.AUTO)
private Integer mid;
/**
* order_id
*/
private String orderId;
/**
* status
*/
private Integer status;
/**
* created_at
*/
private LocalDateTime createdAt;
/**
* updated_at
*/
private LocalDateTime updatedAt;
/**
* comment
*/
private String comment;
}
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.dao.BannerDetailsDao;
import com.liquidnet.service.kylin.dao.BannerDetailsListDao;
import com.liquidnet.service.kylin.entity.KylinBanners;
import com.liquidnet.service.kylin.entity.KylinOrderTask;
import java.util.List;
import java.util.Map;
/**
* <p>
* 轮播图 Mapper 接口 处理数据库
* </p>
*
* @author jiangxiulong
* @since 2021-05-01
*/
public interface KylinOrderTaskMapper extends BaseMapper<KylinOrderTask> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.service.kylin.mapper.KylinOrderTaskMapper">
</mapper>
......@@ -19,4 +19,7 @@ public interface FeignPlatformTaskClient {
@PostMapping("platform/performance/checkPerformanceTime")
ResponseDto<String> checkPerformanceTime();
@PostMapping("platform/performance/checkTransferOrder")
ResponseDto<Boolean> checkTransferOrder();
}
package com.liquidnet.service.consumer.kylin.config;
import com.liquidnet.service.consumer.kylin.receiver.ConsumerKylinTransferOverTimeRdsReceiver;
import lombok.var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.stream.Consumer;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.ReadOffset;
import org.springframework.data.redis.connection.stream.StreamOffset;
import org.springframework.data.redis.stream.StreamMessageListenerContainer;
import org.springframework.data.redis.stream.Subscription;
import java.time.Duration;
import static com.liquidnet.service.base.constant.MQConst.KylinQueue.SQL_TRANSFER_OVERTIME;
@Configuration
public class ConsumerKylinOptTransferOverTimeRedisStreamConfig {
@Autowired
ConsumerKylinTransferOverTimeRdsReceiver consumerKylinTransferOverTimeRdsReceiver;
private StreamMessageListenerContainer<String, MapRecord<String, String, String>> buildStreamMessageListenerContainer(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
return StreamMessageListenerContainer.create(factory, options);
}
/**
* 验票更新
*
* @param listenerContainer
* @param t
* @return
*/
private Subscription receiveTransferOverTimeResult(StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer, int t) {
return listenerContainer.receiveAutoAck(
Consumer.from(SQL_TRANSFER_OVERTIME.getGroup(), SQL_TRANSFER_OVERTIME.name() + t),
StreamOffset.create(SQL_TRANSFER_OVERTIME.getKey(), ReadOffset.lastConsumed()), consumerKylinTransferOverTimeRdsReceiver
);
}
/* —————————————————————————— | —————————————————————————— | —————————————————————————— */
/* -------------------------------------------------------- | 验票更新 */
@Bean
public Subscription subscriptionReceiveTransferOverTime1(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferOverTimeResult(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferOverTime2(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferOverTimeResult(listenerContainer, 2);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferOverTime3(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferOverTimeResult(listenerContainer, 3);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferOverTime4(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferOverTimeResult(listenerContainer, 4);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferOverTime5(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferOverTimeResult(listenerContainer, 5);
listenerContainer.start();
return subscription;
}
/* -------------------------------------------------------- | */
}
package com.liquidnet.service.consumer.kylin.config;
import com.liquidnet.service.consumer.kylin.receiver.ConsumerKylinTransferResultRdsReceiver;
import lombok.var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.stream.Consumer;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.ReadOffset;
import org.springframework.data.redis.connection.stream.StreamOffset;
import org.springframework.data.redis.stream.StreamMessageListenerContainer;
import org.springframework.data.redis.stream.Subscription;
import java.time.Duration;
import static com.liquidnet.service.base.constant.MQConst.KylinQueue.SQL_TRANSFER_RESULT;
@Configuration
public class ConsumerKylinSqlTransferResultRedisStreamConfig {
@Autowired
ConsumerKylinTransferResultRdsReceiver consumerKylinTransferResultRdsReceiver;
private StreamMessageListenerContainer<String, MapRecord<String, String, String>> buildStreamMessageListenerContainer(RedisConnectionFactory factory) {
var options = StreamMessageListenerContainer
.StreamMessageListenerContainerOptions
.builder()
.pollTimeout(Duration.ofMillis(1))
.build();
return StreamMessageListenerContainer.create(factory, options);
}
/**
* 验票更新
*
* @param listenerContainer
* @param t
* @return
*/
private Subscription receiveTransferResult(StreamMessageListenerContainer<String, MapRecord<String, String, String>> listenerContainer, int t) {
return listenerContainer.receiveAutoAck(
Consumer.from(SQL_TRANSFER_RESULT.getGroup(), SQL_TRANSFER_RESULT.name() + t),
StreamOffset.create(SQL_TRANSFER_RESULT.getKey(), ReadOffset.lastConsumed()), consumerKylinTransferResultRdsReceiver
);
}
/* —————————————————————————— | —————————————————————————— | —————————————————————————— */
/* -------------------------------------------------------- | 验票更新 */
@Bean
public Subscription subscriptionReceiveTransferResult1(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferResult(listenerContainer, 1);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferResult2(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferResult(listenerContainer, 2);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferResult3(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferResult(listenerContainer, 3);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferResult4(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferResult(listenerContainer, 4);
listenerContainer.start();
return subscription;
}
@Bean
public Subscription subscriptionReceiveTransferResult5(RedisConnectionFactory factory) {
var listenerContainer = this.buildStreamMessageListenerContainer(factory);
var subscription = receiveTransferResult(listenerContainer, 5);
listenerContainer.start();
return subscription;
}
/* -------------------------------------------------------- | */
}
package com.liquidnet.service.consumer.kylin.receiver;
import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.base.OrderCloseMapping;
import com.liquidnet.service.consumer.kylin.Utils.KylinUtils;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.stream.MapRecord;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.stream.StreamListener;
import java.util.HashMap;
@Slf4j
public abstract class AbstractOptOrderTransferOverTimeRedisReceiver implements StreamListener<String, MapRecord<String, String, String>> {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Autowired
private RedisUtil redisUtil;
@Autowired
private KylinUtils kylinUtils;
@Override
public void onMessage(MapRecord<String, String, String> message) {
log.debug("CONSUMER SQL[streamKey:{},messageId:{},stream:{},body:{}]",
this.getRedisStreamKey(), message.getId(), message.getStream(), message.getValue());
boolean result = this.consumerOrderTransferOverTimeHandler(message.getValue().get("message"));
log.info("CONSUMER SQL RESULT:{} ==> MESSAGE_ID:{}", result, message.getId());
try {
stringRedisTemplate.opsForStream().acknowledge(getRedisStreamGroup(), message);
stringRedisTemplate.opsForStream().delete(this.getRedisStreamKey(), message.getId());
} catch (Exception e) {
log.error("#CONSUMER SQL RESULT:{} ==> DEL_REDIS_QUEUE_MSG_EXCEPTION[MESSAGE_ID:{},MSG:{}]", result, message.getId(), JsonUtils.toJson(message), e);
} finally {
try {
stringRedisTemplate.opsForStream().acknowledge(getRedisStreamGroup(), message);
stringRedisTemplate.opsForStream().delete(this.getRedisStreamKey(), message.getId());
} catch (Exception ignored) {
}
}
}
private boolean consumerOrderTransferOverTimeHandler(String msg) {
boolean aBoolean = false;
try {
OrderCloseMapping.orderCloseMessage mqMessage = JsonUtils.fromJson(msg, OrderCloseMapping.orderCloseMessage.class);
for (int x = 0; x < mqMessage.getOrderTicketIds().size(); x++) {
String orderTicketId = mqMessage.getOrderTicketIds().get(x);
KylinOrderTicketVo vo = kylinUtils.getOrderTicketVo(orderTicketId);
String uid = vo.getUserId();
vo.setTransferUid("");
vo.setTransferStatus(0);
redisUtil.del(KylinRedisConst.ORDER_TRANSFER.concat(uid));
redisUtil.set("kylin:order:id:" + orderTicketId, vo);
kylinUtils.resetOrderListVo(uid, 2, orderTicketId, vo);
}
aBoolean = true;
} catch (Exception e) {
log.error("CONSUMER SQL FAIL ==> {}", e.getMessage(), e);
} finally {
if (!aBoolean) {
HashMap<String, String> map = CollectionUtil.mapStringString();
map.put("message", msg);
stringRedisTemplate.opsForStream().add(StreamRecords.mapBacked(map).withStreamKey(this.getRedisStreamKey()));
}
}
return aBoolean;
}
protected abstract String getRedisStreamKey();
protected abstract String getRedisStreamGroup();
}
package com.liquidnet.service.consumer.kylin.receiver;
import com.liquidnet.service.base.constant.MQConst;
import org.springframework.stereotype.Component;
@Component
public class ConsumerKylinTransferOverTimeRdsReceiver extends AbstractOptOrderTransferOverTimeRedisReceiver {
@Override
protected String getRedisStreamKey() {
return MQConst.KylinQueue.SQL_TRANSFER_OVERTIME.getKey();
}
@Override
protected String getRedisStreamGroup() {
return MQConst.KylinQueue.SQL_TRANSFER_OVERTIME.getGroup();
}
}
package com.liquidnet.service.consumer.kylin.receiver;
import com.liquidnet.service.base.constant.MQConst;
import org.springframework.stereotype.Component;
@Component
public class ConsumerKylinTransferResultRdsReceiver extends AbstractSqlRedisReceiver {
@Override
protected String getRedisStreamKey() {
return MQConst.KylinQueue.SQL_TRANSFER_RESULT.getKey();
}
@Override
protected String getRedisStreamGroup() {
return MQConst.KylinQueue.SQL_TRANSFER_RESULT.getGroup();
}
}
......@@ -46,6 +46,17 @@ public class KylinTaskHandler {
}
}
@XxlJob(value = "sev-platform:checkTransferOrderHandler")
public ReturnT<String> checkTransferOrderHandler() {
try {
boolean result = feignPlatformTaskClient.checkTransferOrder().getData();
log.info("checkTransferOrderHandler:结果:"+result);
return ReturnT.SUCCESS;
} catch (Exception e) {
return ReturnT.FAIL;
}
}
// @Autowired
// private FeignSequenceClient feignSequenceClient;
//
......
......@@ -28,5 +28,11 @@ XGROUP CREATE kylin:stream:rk.station group.station 0
XADD kylin:stream:rk.transfer * 0 0
XGROUP CREATE kylin:stream:rk.transfer group.transfer 0
XADD kylin:stream:rk.transfer.result * 0 0
XGROUP CREATE kylin:stream:rk.transfer.result group.transfer.result 0
XADD kylin:stream:rk.transfer.overtime * 0 0
XGROUP CREATE kylin:stream:rk.transfer.overtime group.transfer.overtime 0
# ==================================================
# XGROUP DESTROY adam:stream:rk.sms.notice group.sms.sender 0
......@@ -162,9 +162,16 @@ public class KylinOrderTicketsController {
}
@PostMapping("transferReject")
@ApiOperation("转赠订单退回")
@ApiOperation("转赠订单拒收")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<String> orderTransferReject() {
return orderTicketsService.orderTransferReject();
}
@PostMapping("transferBack")
@ApiOperation("转赠订单退回")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<String> orderTransferBack(@RequestParam(value = "orderId") String orderId) {
return orderTicketsService.orderTransferBack(orderId);
}
}
......@@ -579,4 +579,78 @@ public class DataUtils {
return (KylinOrderExpressVo) redisUtil.get(redisKey);
}
/**
* 演出是否实名
*
* @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;
}
}
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));
}
}
// 获取 用户维度 演出购买数量
public int getUserPBuyCount(String userId, String performanceId) {
try {
return (int) redisUtil.get(KylinRedisConst.USERID_BUY_INFO + userId + ":" + KylinRedisConst.PERFORMANCE_ID + ":" + performanceId);
} catch (Exception e) {
return 0;
}
}
// 获取 用户维度 票种购买数量
public int getUserTBuyCount(String userId, String ticketId) {
try {
return (int) redisUtil.get(KylinRedisConst.USERID_BUY_INFO + userId + ":" + KylinRedisConst.TICKET_ID + ":" + ticketId);
} catch (Exception e) {
return 0;
}
}
// 获取 证件维度 演出购买数量
public int getIdCardPBuyCount(String idCard, String performanceId) {
try {
return (int) redisUtil.get(KylinRedisConst.IDCARD_BUY_INFO + idCard + ":" + KylinRedisConst.PERFORMANCE_ID + ":" + performanceId);
} catch (Exception e) {
return 0;
}
}
// 获取 证件维度 票种购买数量
public int getIdCardTBuyCount(String idCard, String ticketId) {
try {
return (int) redisUtil.get(KylinRedisConst.IDCARD_BUY_INFO + idCard + ":" + KylinRedisConst.TICKET_ID + ":" + ticketId);
} catch (Exception e) {
return 0;
}
}
}
package com.liquidnet.service.kylin.utils;
import com.fasterxml.jackson.core.type.TypeReference;
import com.liquidnet.commons.lang.util.HttpUtil;
import com.liquidnet.commons.lang.util.JsonUtils;
import com.liquidnet.service.adam.dto.vo.AdamEntersVo;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderListVo;
import com.liquidnet.service.kylin.dto.vo.returns.PayInnerResultVo;
......@@ -24,6 +26,95 @@ public class OrderUtils {
@Value("${liquidnet.adam.url}")
private DataUtils adamUrl;
public String judgeOrderLimit(
int type,
String userId,
String idCard,
String performanceId,
String ticketId,
int performanceLimitCount,
int performanceMemberLimitCount,
int ticketLimitCount,
int ticketMemberLimitCount,
int performanceBuyCount,
int ticketBuyCount,
int memberType,
int isTrueName
) {
Integer[] integers;
if (101 == type) {
integers = festivalOrderLimit(userId, idCard, performanceId, ticketId, performanceBuyCount, ticketBuyCount, isTrueName);
} else {
integers = roadShowOrderLimit(userId, idCard, performanceId, ticketId, performanceBuyCount, ticketBuyCount, isTrueName);
}
return judgeMemberType(performanceLimitCount, performanceMemberLimitCount, ticketLimitCount, ticketMemberLimitCount, memberType, integers[0], integers[1], isTrueName);
}
public Integer[] roadShowOrderLimit(
String userId,
String idCard,
String performanceId,
String ticketId,
int performanceBuyCount,
int ticketBuyCount,
int isTrueName
) {
if (1 == isTrueName) {//实名
performanceBuyCount += dataUtils.getIdCardPBuyCount(idCard, performanceId);
ticketBuyCount += dataUtils.getIdCardTBuyCount(idCard, ticketId);
} else {//非实名
performanceBuyCount += dataUtils.getUserPBuyCount(userId, performanceId);
ticketBuyCount += dataUtils.getUserTBuyCount(userId, ticketId);
}
Integer[] array = new Integer[2];
array[0] = performanceBuyCount;
array[1] = ticketBuyCount;
return array;
}
public Integer[] festivalOrderLimit(
String userId,
String idCard,
String performanceId,
String ticketId,
int performanceBuyCount,
int ticketBuyCount,
int isTrueName
) {
if (1 == isTrueName) {//实名
performanceBuyCount += dataUtils.getIdCardPBuyCount(idCard, performanceId);
ticketBuyCount += dataUtils.getIdCardTBuyCount(idCard, ticketId);
} else {//非实名
performanceBuyCount += dataUtils.getUserPBuyCount(userId, performanceId);
ticketBuyCount += dataUtils.getUserTBuyCount(userId, ticketId);
}
Integer[] array = new Integer[2];
array[0] = performanceBuyCount;
array[1] = ticketBuyCount;
return array;
}
public String judgeMemberType(int performanceLimitCount, int performanceMemberLimitCount, int ticketLimitCount, int ticketMemberLimitCount, int memberType, int performanceBuyCount, int ticketBuyCount, int isTrueName) {
if (memberType == 1 || memberType == 2) {
if (performanceBuyCount > performanceMemberLimitCount && performanceMemberLimitCount != 0) {
return (1 == isTrueName ? "实名制" : "本场") + "演出限购" + performanceMemberLimitCount + "张,已超出";//超过演出维度购买量
}
if (ticketBuyCount > ticketMemberLimitCount && ticketMemberLimitCount != 0) {
return (1 == isTrueName ? "实名制" : "该") + "票种限购" + ticketMemberLimitCount + "张,已超出";//超过票维度购买量
}
} else {//非会员区间
if (performanceBuyCount > performanceLimitCount && performanceLimitCount != 0) {
return (1 == isTrueName ? "实名制" : "本场") + "演出限购" + performanceLimitCount + "张,已超出";//超过演出维度购买量
}
if (ticketBuyCount > ticketLimitCount && ticketLimitCount != 0) {
return (1 == isTrueName ? "实名制" : "该") + "票种限购" + ticketLimitCount + "张,已超出";//超过票维度购买量
}
}
return "";
}
/**
* @param userId 用户id
* @param type 1新增 2修改
......@@ -89,7 +180,8 @@ public class OrderUtils {
public List<AdamEntersVo> getEnters(String entersIds, String uid){
String returnVo = HttpUtil.get(adamUrl+"/adam/rsc/inquire/enters?entersIds="+entersIds+"&uid="+uid,null);
// List<AdamEntersVo> adamEntersVo = JsonUtils.fromJson(returnVo,null);
return null;
ResponseDto<List<AdamEntersVo>> ResponseVo = JsonUtils.fromJson(returnVo, new TypeReference<ResponseDto<List<AdamEntersVo>>>() {
});
return ResponseVo.getData();
}
}
......@@ -35,4 +35,11 @@ public class KylinOrderTicketsController {
public ResponseDto<Boolean> checkOrderTime() {
return ResponseDto.success(kylinCheckOrderTime.checkOrderTime(""));
}
@PostMapping("checkTransferOrder")
@ApiOperation("转赠订单失效脚本")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<Boolean> checkTransferOrder() {
return ResponseDto.success(kylinCheckOrderTime.checkTransferOrder());
}
}
package com.liquidnet.service.platform.service.impl.kylin;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liquidnet.commons.lang.util.CollectionUtil;
import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.service.base.OrderCloseMapping;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.dao.OrderScriptDto;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.entity.KylinOrderTicketRelations;
import com.liquidnet.service.kylin.entity.KylinOrderTicketStatus;
import com.liquidnet.service.kylin.entity.KylinOrderTickets;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.mapper.KylinOrderTaskMapper;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketRelationsMapper;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketStatusMapper;
import com.liquidnet.service.kylin.mapper.KylinOrderTicketsMapper;
......@@ -18,6 +19,7 @@ import com.liquidnet.service.platform.utils.DataUtils;
import com.liquidnet.service.platform.utils.QueueUtils;
import com.mongodb.BasicDBObject;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MongoConverter;
......@@ -55,6 +57,8 @@ public class DMCheckOrderTimeImpl extends ServiceImpl<KylinOrderTicketsMapper, K
private KylinOrderTicketStatusMapper orderTicketStatusMapper;
@Autowired
private KylinOrderTicketRelationsMapper orderTicketRelationsMapper;
@Autowired
private KylinOrderTaskMapper orderTaskMapper;
public boolean checkOrderTime(String userId) {
List<OrderScriptDto> dtoData = orderTicketsMapper.orderScriptDto(userId);
......@@ -141,4 +145,53 @@ public class DMCheckOrderTimeImpl extends ServiceImpl<KylinOrderTicketsMapper, K
}
return true;
}
public boolean checkTransferOrder() {
LocalDateTime now = LocalDateTime.now();
List<KylinOrderTask> task = orderTaskMapper.selectList(
Wrappers.lambdaQuery(KylinOrderTask.class).eq(KylinOrderTask::getStatus, 10).ge(KylinOrderTask::getCreatedAt,now.plusHours(2))
);
ArrayList<String> orderIdList = CollectionUtil.arrayListString();
for (KylinOrderTask item : task) {
orderIdList.add(item.getOrderId());
}
//处理原订单mongo
HashMap<String, Object> mapMongo = new HashMap<>();
mapMongo.put("transferStatus", 0);
mapMongo.put("transferUid", "");
mapMongo.put("updatedAt", DateUtil.Formatter.yyyyMMddHHmmssSSS.format(now));
mapMongo.put("changeDate", now);
mongoTemplate.getCollection(KylinOrderTicketVo.class.getSimpleName()).updateMany(
Query.query(Criteria.where("orderTicketsId").in(orderIdList)).getQueryObject(),
new BasicDBObject("$set", mongoConverter.convertToMongoType(mapMongo))
);
//处理原订单mysql
KylinOrderTicketStatus orderTicketStatus = new KylinOrderTicketStatus();
orderTicketStatus.setTransferStatus(0);
orderTicketStatus.setUpdatedAt(now);
orderTicketStatusMapper.update(orderTicketStatus, new UpdateWrapper<KylinOrderTicketStatus>().in("order_id", orderIdList));
KylinOrderTicketRelations orderTicketRelations = new KylinOrderTicketRelations();
orderTicketRelations.setTransferUid("");
orderTicketRelations.setUpdatedAt(now);
orderTicketRelationsMapper.update(orderTicketRelations, new UpdateWrapper<KylinOrderTicketRelations>().in("order_id", orderIdList));
//mysql 删除持久化数据
orderTaskMapper.delete(Wrappers.lambdaQuery(KylinOrderTask.class).eq(KylinOrderTask::getStatus, 10).ge(KylinOrderTask::getCreatedAt,now.plusHours(2)));
//处理原订单redis
int forSize = 500;
int forCount = orderIdList.size() % forSize == 0 ? orderIdList.size() / forSize : (orderIdList.size() / forSize) + 1;
for (int i = 0; i < forCount; i++) {
LinkedList<String> mqList = new LinkedList<>();
for (int y = 0; y < forSize; y++) {
try {
String t = orderIdList.get(i * 500 + y);
mqList.add(t);
} catch (Exception e) {
break;
}
}
queueUtils.sendMsgByRedis(MQConst.KylinQueue.SQL_TRANSFER_OVERTIME.getKey(), OrderCloseMapping.get(mqList));
}
return true;
}
}
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