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

Commit 8836e7cf authored by 姜秀龙's avatar 姜秀龙

Merge branch 'jxl-xiangou' into 'master'

Jxl xiangou

See merge request !397
parents b8beb1c4 aefaa773
......@@ -62,6 +62,7 @@ public class KylinRedisConst {
public static final String IDCARD_BUY_INFO = "kylin:buy:idCard:";
public static final String PERFORMANCE_ID = "performanceId";
public static final String TICKET_ID = "ticketId";
public static final String TIME_ID = "timeId";
public static final String USE_TIME = "useTime";
public static final String BUY_COUNT = "buyCount";
......
package com.liquidnet.service.kylin.constant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* 限购对象枚举
*/
@ApiModel("限购对象枚举")
public enum LimitTargetEnum {
@ApiModelProperty("账户")
ACCOUNT(1, "账户"),
@ApiModelProperty("实名")
IDCARD(2, "实名");
private final int code;
private final String desc;
LimitTargetEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static LimitTargetEnum valueOf(int code) {
for (LimitTargetEnum target : values()) {
if (target.code == code) {
return target;
}
}
return null;
}
}
\ No newline at end of file
package com.liquidnet.service.kylin.constant;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* 限购类型枚举
*/
@ApiModel("限购类型枚举")
public enum LimitTypeEnum {
@ApiModelProperty("演出")
PERFORMANCE(1, "演出"),
@ApiModelProperty("票种")
TICKET(2, "票种"),
@ApiModelProperty("场次")
TIME(3, "场次");
private final int code;
private final String desc;
LimitTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public String getDesc() {
return desc;
}
public static LimitTypeEnum valueOf(int code) {
for (LimitTypeEnum type : values()) {
if (type.code == code) {
return type;
}
}
return null;
}
}
\ No newline at end of file
......@@ -33,6 +33,10 @@ public class CreateTicketTimesParam implements Serializable {
@NotNull(message = "不能为空")
private Integer type;
@ApiModelProperty(value = "是否开启实名认证限购 0关闭 1开启", example = "0")
@NotNull(message = "实名认证限购不能为空")
private Integer realNameLimit;
@ApiModelProperty(value = "", example = "")
@JsonIgnore
private String createdAt;
......
......@@ -44,6 +44,9 @@ public class PerformanceStep2Param implements Serializable,Cloneable {
@ApiModelProperty(hidden = true)
private String merchantId;
@ApiModelProperty(value = "演出类型 1音乐节 2演唱会 3小型演出 4展览 6舞台剧", example = "3")
private Integer type;
@ApiModelProperty(value = "场次数据",hidden = true)
private List<TicketTimesTicketCreatePartnerVo> ticketTimes;
......
package com.liquidnet.service.kylin.dto.vo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketEntitiesForOrderVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 限购错误结果VO
*/
@ApiModel("限购错误结果VO")
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class LimitErrorResultVo {
/**
* 限购类型
*/
@ApiModelProperty("限购类型:1-演出,2-票种,3-场次")
private Integer limitType;
/**
* 限购对象
*/
@ApiModelProperty("限购对象:1-账户,2-实名")
private Integer limitTarget;
/**
* 限购数量
*/
@ApiModelProperty("限购数量")
private Integer limitCount;
/**
* 当前已购买数量
*/
@ApiModelProperty("当前已购买数量")
private Integer currentCount;
/**
* 会员逻辑
*/
@ApiModelProperty("0全员 2会员专属 1会员时间段")
private Integer memberType;
/**
* 演出 id
*/
@ApiModelProperty("演出 id")
private String performancesId;
/**
* 票种 id
*/
@ApiModelProperty("票种 id")
private String ticketsId;
/**
* 场次 id
*/
@ApiModelProperty("场次 id")
private String timeId;
/**
* 身份证
*/
@ApiModelProperty("身份证")
private String idCard;
/**
* 姓名
*/
@ApiModelProperty("姓名")
private String idName;
/**
* 入场人 id
*/
@ApiModelProperty("入场人 id")
private String entersId;
/**
* 错误信息
*/
@ApiModelProperty("错误信息")
private String errorMessage;
/**
* 已购买的票信息
*/
@ApiModelProperty("已购买的票信息")
private List<KylinOrderTicketEntitiesForOrderVo> entities;
}
\ No newline at end of file
......@@ -30,6 +30,8 @@ public class KylinTicketTimesVo implements Serializable,Cloneable{
private String useStart;
@ApiModelProperty(value = "适用结束时间")
private String useEnd;
@ApiModelProperty(value = "是否开启实名认证限购 0关闭 1开启")
private Integer realNameLimit;
@ApiModelProperty(value = "票种")
private List<KylinTicketVo> ticketList;
......@@ -47,6 +49,7 @@ public class KylinTicketTimesVo implements Serializable,Cloneable{
this.ticketTimesId = ticketTimes.getTicketTimesId();
this.title = ticketTimes.getTitle();
this.type = ticketTimes.getType();
this.realNameLimit = ticketTimes.getRealNameLimit();
this.useStart = DateUtil.Formatter.yyyyMMddHHmmss.format(ticketTimes.getUseStart());
this.useEnd = DateUtil.Formatter.yyyyMMddHHmmss.format(ticketTimes.getUseEnd());
}
......@@ -57,5 +60,6 @@ public class KylinTicketTimesVo implements Serializable,Cloneable{
this.type = ticketTimes.getType();
this.useStart = ticketTimes.getUseStart();
this.useEnd = ticketTimes.getUseEnd();
this.realNameLimit = ticketTimes.getRealNameLimit();
}
}
package com.liquidnet.service.kylin.dto.vo.mongo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class KylinOrderTicketEntitiesForOrderVo implements Serializable, Cloneable {
private String orderId;
private String timeId;
@ApiModelProperty("演出名称")
private String performanceTitle;
@ApiModelProperty("票种名称")
private String ticketTitle;
@ApiModelProperty("场次开始")
private String useStart;
@ApiModelProperty("场次开始结束")
private String useEnd;
@ApiModelProperty("isPayment")
private Integer isPayment;
private static final KylinOrderTicketEntitiesForOrderVo obj = new KylinOrderTicketEntitiesForOrderVo();
public static KylinOrderTicketEntitiesForOrderVo getNew() {
try {
return (KylinOrderTicketEntitiesForOrderVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new KylinOrderTicketEntitiesForOrderVo();
}
}
}
......@@ -37,6 +37,8 @@ public class KylinTicketTimesPartnerVo implements Serializable ,Cloneable{
@ApiModelProperty(value = "是否开启缺票登记")
private Integer isLackRegister;
@ApiModelProperty(value = "是否开启实名认证限购 0关闭 1开启")
private Integer realNameLimit;
@ApiModelProperty(value = "创建时间")
private String createdAt;
......@@ -61,6 +63,7 @@ public class KylinTicketTimesPartnerVo implements Serializable ,Cloneable{
this.setUseEnd(DateUtil.Formatter.yyyyMMddHHmmss.format(ticketTimes.getUseEnd()));
this.setStatus(ticketTimes.getStatus());
this.setType(ticketTimes.getType());
this.setRealNameLimit(ticketTimes.getRealNameLimit());
this.setCreatedAt(DateUtil.Formatter.yyyyMMddHHmmss.format(ticketTimes.getCreatedAt()));
this.setUpdatedAt(DateUtil.Formatter.yyyyMMddHHmmss.format(ticketTimes.getUpdatedAt()));
return this;
......
......@@ -31,6 +31,9 @@ public class TicketTimesTicketCreatePartnerVo implements Serializable ,Cloneable
@ApiModelProperty(value = "状态 1单日票 2通票")
private Integer type;
@ApiModelProperty(value = "是否开启实名认证限购 0关闭 1开启")
private Integer realNameLimit;
@ApiModelProperty(value = "创建时间")
private String createdAt;
......
package com.liquidnet.service.kylin.dto.vo.returns;
import com.liquidnet.service.kylin.dto.vo.LimitErrorResultVo;
import com.liquidnet.service.kylin.dto.vo.middle.PayDataVo;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
@Data
public class PayInnerResultVo implements Serializable,Cloneable {
......@@ -18,6 +20,7 @@ public class PayInnerResultVo implements Serializable,Cloneable {
private String returnUrl;
private BigDecimal price;
private PayDataVo payData;
private List<LimitErrorResultVo> limitResult;
private static final PayInnerResultVo obj = new PayInnerResultVo();
public static PayInnerResultVo getNew() {
......
......@@ -6,6 +6,7 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.param.PayAgainParam;
import com.liquidnet.service.kylin.dto.param.PayOrderParam;
import com.liquidnet.service.kylin.dto.param.SyncOrderParam;
import com.liquidnet.service.kylin.dto.vo.LimitErrorResultVo;
import com.liquidnet.service.kylin.dto.vo.returns.*;
import com.liquidnet.service.kylin.entity.KylinOrderTickets;
......@@ -73,4 +74,6 @@ public interface IKylinOrderTicketsService {
//获取 订单Ar激活码
ResponseDto<List<String>> getOrderArCode(String orderId);
ResponseDto<List<LimitErrorResultVo>> limitInfo(List<LimitErrorResultVo> param);
}
......@@ -117,6 +117,14 @@
<label>演出实名限购:</label>
<span th:text="*{idCount}"></span>
</div>
<div class="panel-footer">
<label>场次实名限购:</label>
<span th:each="dict, iterStat : ${kylinPerformanceMisVo.ticketTimes}"
th:if="${dict.realNameLimit == 1}"
th:text="${#strings.replace(#strings.replace(dict.title, ' 00:00', ''), ' 00:00', '')} + ${iterStat.last ? '' : '; '}">
</span>
<span th:if="${#lists.isEmpty(kylinPerformanceMisVo.ticketTimes.?[realNameLimit == 1])}"></span>
</div>
<div class="panel-footer">
<label>时间:</label>
<span th:text="*{timeStart}"></span>
......
......@@ -69,6 +69,11 @@ public class KylinTicketTimes implements Serializable ,Cloneable {
*/
private LocalDateTime updatedAt;
/**
* 是否开启实名认证限购 0关闭 1开启
*/
private Integer realNameLimit;
private static final KylinTicketTimes obj = new KylinTicketTimes();
public static KylinTicketTimes getNew() {
try {
......@@ -82,7 +87,8 @@ public class KylinTicketTimes implements Serializable ,Cloneable {
return new Object[]{
vo.getTicketTimesId(),vo.getTitle(),vo.getStatus(),
vo.getType(),vo.getUseStart(),vo.getUseEnd(),
vo.getComment(),vo.getCreatedAt(),vo.getUpdatedAt()
vo.getComment(),vo.getCreatedAt(),vo.getUpdatedAt(),
vo.getRealNameLimit()
};
}
}
......@@ -341,7 +341,7 @@ public abstract class AbstractOrderCloseReceiver implements StreamListener<Strin
// 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.changeBuyInfo(items.getUserId(), items.getEnterIdCode(), items.getPerformanceId(), items.getTicketId(), items.getTimeId(), -1);
}
//改库存
kylinOrderUtils.changeSurplusGeneral(kylinOrderTicketVo.getTicketId(), kylinOrderTicketVo.getNumber());
......
......@@ -135,11 +135,12 @@ public class KylinOrderUtils {
* @param ticketId
* @param buyCount
*/
public void changeBuyInfo(String userId, String idCard, String performanceId, String ticketId, int buyCount) {
public void changeBuyInfo(String userId, String idCard, String performanceId, String ticketId, String timeId, int buyCount) {
String redisKeyUid;
String redisKeyIdCard;
String performanceIdKeyIdCard="";
String ticketIdKeyIdCard="";
String timeIdKeyIdCard = "";
int isTrueName = getPerformanceIsTrueName(performanceId);
......@@ -150,6 +151,7 @@ public class KylinOrderUtils {
if (isTrueName != 0) {
performanceIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.PERFORMANCE_ID + ":" + performanceId;
ticketIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.TICKET_ID + ":" + ticketId;
timeIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.TIME_ID + ":" + timeId;
}
if (buyCount > 0) {
......@@ -158,11 +160,13 @@ public class KylinOrderUtils {
if (isTrueName != 0) {
redisDataSourceUtil.getRedisKylinUtil().incr(ticketIdKeyIdCard, buyCount);
redisDataSourceUtil.getRedisKylinUtil().incr(performanceIdKeyIdCard, buyCount);
redisDataSourceUtil.getRedisKylinUtil().incr(timeIdKeyIdCard, buyCount);
}
} else {
if (isTrueName != 0) {
redisDataSourceUtil.getRedisKylinUtil().decr(ticketIdKeyIdCard, Math.abs(buyCount));
redisDataSourceUtil.getRedisKylinUtil().decr(performanceIdKeyIdCard, Math.abs(buyCount));
redisDataSourceUtil.getRedisKylinUtil().decr(timeIdKeyIdCard, Math.abs(buyCount));
}
redisDataSourceUtil.getRedisKylinUtil().decr(ticketIdKeyUid, Math.abs(buyCount));
redisDataSourceUtil.getRedisKylinUtil().decr(performanceIdKeyUid, Math.abs(buyCount));
......
-- 添加实名认证限购字段到场次表
USE ln_scene;
-- 在kylin_ticket_times表中添加real_name_limit字段
ALTER TABLE kylin_ticket_times
ADD COLUMN real_name_limit tinyint NOT NULL DEFAULT 0 COMMENT '是否开启实名认证限购 0关闭 1开启' AFTER comment;
\ No newline at end of file
......@@ -8,6 +8,7 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.param.PayAgainParam;
import com.liquidnet.service.kylin.dto.param.PayOrderParam;
import com.liquidnet.service.kylin.dto.param.SyncOrderParam;
import com.liquidnet.service.kylin.dto.vo.LimitErrorResultVo;
import com.liquidnet.service.kylin.dto.vo.returns.*;
import com.liquidnet.service.kylin.service.IKylinOrderTicketsService;
import io.swagger.annotations.*;
......@@ -167,6 +168,13 @@ public class KylinOrderTicketsController {
return orderTicketsService.getOrderArCode(orderId);
}
@PostMapping("limitInfo")
@ApiOperation("获取用户限购详细信息")
@ApiResponse(code = 200, message = "接口返回对象参数")
public ResponseDto<List<LimitErrorResultVo>> limitInfo(@RequestBody List<LimitErrorResultVo> param) {
return orderTicketsService.limitInfo(param);
}
/*@GetMapping("toOrderRefundDetails")
@ApiOperation("想要退款订单详情")
@ApiResponse(code = 200, message = "接口返回对象参数")
......
......@@ -10,6 +10,7 @@ import com.liquidnet.service.base.SqlMapping;
import com.liquidnet.service.base.UserPathDto;
import com.liquidnet.service.base.constant.MQConst;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.dto.vo.LimitErrorResultVo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketTimesVo;
import com.liquidnet.service.kylin.dto.vo.middle.KylinTicketVo;
import com.liquidnet.service.kylin.dto.vo.mongo.*;
......@@ -383,7 +384,7 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsService {
KylinTicketPartnerVo kylinTicketPartnerVo = dataUtils.getKylinTicketPartnerVoByTicketId(ticketsId);
if (null != kylinTicketPartnerVo && null != kylinTicketPartnerVo.getViewersNumber()) {
return kylinTicketPartnerVo.getViewersNumber() == 1;
}else {
} else {
log.info("[isSingleTicket] 票信息为空, ticketsId: {}", ticketsId);
return false;
}
......@@ -1364,4 +1365,36 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsService {
return ResponseDto.success(dataUtils.getOrderArCode(orderId));
}
@Override
public ResponseDto<List<LimitErrorResultVo>> limitInfo(List<LimitErrorResultVo> param) {
for (LimitErrorResultVo vo : param) {
Criteria criteria = Criteria.where("performanceId").is(vo.getPerformancesId())
.and("isPayment").in(Arrays.asList(0, 1, 2, 4));
if (vo.getLimitTarget().equals(2)) {
criteria.and("enterIdCode").is(vo.getIdCard());
}
if (vo.getLimitType().equals(2)) {
criteria.and("ticketId").is(vo.getTicketsId());
}
if (vo.getLimitType().equals(3)) {
criteria.and("timeId").is(vo.getTimeId());
}
Query query = Query.query(criteria);
List<KylinOrderTicketEntitiesForOrderVo> list = mongoTemplate.find(query,
KylinOrderTicketEntitiesForOrderVo.class, KylinOrderTicketEntitiesVo.class.getSimpleName());
List<KylinOrderTicketEntitiesForOrderVo> newList = new ArrayList<>();
for (KylinOrderTicketEntitiesForOrderVo entities : list) {
if (entities.getIsPayment().equals(0)) {
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(entities.getOrderId());
if (orderTicketVo.getStatus().equals(2)) {
continue;
}
}
newList.add(entities);
}
vo.setEntities(newList);
}
return ResponseDto.success(param);
}
}
......@@ -26,6 +26,7 @@ import com.liquidnet.service.kylin.dto.vo.returns.PayInnerResultVo;
import com.liquidnet.service.kylin.dto.vo.returns.PayResultVo;
import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.service.IKylinOrderTicketsOrderService;
import com.liquidnet.service.kylin.dto.vo.LimitErrorResultVo;
import com.liquidnet.service.order.utils.*;
import com.taobao.api.TaobaoClient;
import com.taobao.api.request.AlibabaDamaiMevOpenBatchpushticketRequest;
......@@ -255,6 +256,10 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
}
// 获取限购 实名
Integer timeRealNameLimit = ticketTimesData.getRealNameLimit();
if (timeRealNameLimit == null) {
timeRealNameLimit = 0;
}
int ticketLimit = 1;
int ticketMemberLimit = ticketData.getLimitCountMember();//会员票种限购
int ticketIdCount = ticketData.getIdCount();//实名票种限购
......@@ -399,25 +404,41 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
//限购判断 如果实名 则身份证维度限购 如果不实名则数量限购
if (entersVoList.size() > 0) {
for (int i = 0; i < entersVoList.size(); i++) {
dataUtils.changeBuyInfo(uid, entersVoList.get(i).getIdCard(), performanceData.getPerformancesId(), ticketData.getTicketsId(), 1);
String res1 = orderUtils.judgeOrderLimit(uid, entersVoList.get(i).getIdCard(), payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), performanceLimit, performanceMemberLimit, performanceIdCount, ticketLimit, ticketMemberLimit, ticketIdCount, memberType, isTrueName);
if (!res1.equals("")) {
AdamEntersVo adamEntersVo = entersVoList.get(i);
dataUtils.changeBuyInfo(uid, adamEntersVo.getIdCard(), performanceData.getPerformancesId(), ticketData.getTicketsId(), payOrderParam.getTimeId(), 1);
LimitErrorResultVo limitResult = orderUtils.judgeOrderLimit(uid, entersVoList.get(i).getIdCard(), payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), payOrderParam.getTimeId(), performanceLimit, performanceMemberLimit, performanceIdCount, ticketLimit, ticketMemberLimit, ticketIdCount, timeRealNameLimit, memberType, isTrueName);
if (limitResult != null) {
for (int x = 0; x <= i; x++) {
dataUtils.changeBuyInfo(uid, entersVoList.get(x).getIdCard(), performanceData.getPerformancesId(), ticketData.getTicketsId(), -1);
dataUtils.changeBuyInfo(uid, entersVoList.get(x).getIdCard(), performanceData.getPerformancesId(), ticketData.getTicketsId(), payOrderParam.getTimeId(), -1);
}
orderUtils.changeSurplus(isPay, payOrderParam.getTicketId(), payOrderParam.getNumber());
orderUtils.backAdvanceCoupon(payOrderParam.getAdvanceCode(), uid);
return ResponseDto.failure(res1);//乱七八糟异常
PayInnerResultVo payInnerResultVo = PayInnerResultVo.getNew();
limitResult.setPerformancesId(payOrderParam.getPerformanceId());
limitResult.setTimeId(payOrderParam.getTimeId());
limitResult.setTicketsId(payOrderParam.getTicketId());
limitResult.setIdCard(adamEntersVo.getIdCard());
limitResult.setIdName(adamEntersVo.getName());
limitResult.setEntersId(adamEntersVo.getEntersId());
payInnerResultVo.setLimitResult(Collections.singletonList(limitResult));
return ResponseDto.failure("12345", "购买数量超出限制", payInnerResultVo);//返回完整的限购错误信息
}
}
} else {
dataUtils.changeBuyInfo(uid, "", performanceData.getPerformancesId(), ticketData.getTicketsId(), payOrderParam.getNumber());
String res1 = orderUtils.judgeOrderLimit(uid, "", payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), performanceLimit, performanceMemberLimit, performanceIdCount, ticketLimit, ticketMemberLimit, ticketIdCount, memberType, isTrueName);
if (!res1.equals("")) {
dataUtils.changeBuyInfo(uid, "", performanceData.getPerformancesId(), ticketData.getTicketsId(), -payOrderParam.getNumber());
dataUtils.changeBuyInfo(uid, "", performanceData.getPerformancesId(), ticketData.getTicketsId(), payOrderParam.getTimeId(), payOrderParam.getNumber());
LimitErrorResultVo limitResult = orderUtils.judgeOrderLimit(uid, "", payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), payOrderParam.getTimeId(), performanceLimit, performanceMemberLimit, performanceIdCount, ticketLimit, ticketMemberLimit, ticketIdCount, timeRealNameLimit, memberType, isTrueName);
if (limitResult != null) {
dataUtils.changeBuyInfo(uid, "", performanceData.getPerformancesId(), ticketData.getTicketsId(), payOrderParam.getTimeId(), -payOrderParam.getNumber());
orderUtils.changeSurplus(isPay, payOrderParam.getTicketId(), payOrderParam.getNumber());
orderUtils.backAdvanceCoupon(payOrderParam.getAdvanceCode(), uid);
return ResponseDto.failure(res1);//乱七八糟异常
PayInnerResultVo payInnerResultVo = PayInnerResultVo.getNew();
limitResult.setPerformancesId(payOrderParam.getPerformanceId());
limitResult.setTimeId(payOrderParam.getTimeId());
limitResult.setTicketsId(payOrderParam.getTicketId());
payInnerResultVo.setLimitResult(Collections.singletonList(limitResult)); // 设置为List
return ResponseDto.failure("12345", "购买数量超出限制", payInnerResultVo);//返回完整的限购错误信息
}
}
......@@ -435,11 +456,11 @@ public class KylinOrderTicketsServiceImpl implements IKylinOrderTicketsOrderServ
dataUtils.decrUseCouponCount(uid, performanceId);
}
for (AdamEntersVo enters : entersVoList) {
dataUtils.changeBuyInfo(uid, enters.getIdCard(), payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), -1);
dataUtils.changeBuyInfo(uid, enters.getIdCard(), payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), payOrderParam.getTimeId(), -1);
}
if (entersVoList.size() == 0) {
for (int i = 0; i < payOrderParam.getNumber(); i++) {
dataUtils.changeBuyInfo(uid, "", payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), -1);
dataUtils.changeBuyInfo(uid, "", payOrderParam.getPerformanceId(), payOrderParam.getTicketId(), payOrderParam.getTimeId(), -1);
}
}
}
......
......@@ -130,11 +130,12 @@ public class DataUtils {
* @param ticketId 票种id
* @param buyCount 购买数量 大于 0 增加 小于 0 减少 对应 支付 退款表
*/
public void changeBuyInfo(String userId, String idCard, String performanceId, String ticketId, int buyCount) {
public void changeBuyInfo(String userId, String idCard, String performanceId, String ticketId, String timeId, int buyCount) {
String redisKeyUid;
String redisKeyIdCard;
String performanceIdKeyIdCard = "";
String ticketIdKeyIdCard = "";
String timeIdKeyIdCard = "";
int isTrueName = getPerformanceIsTrueName(performanceId);
......@@ -145,6 +146,7 @@ public class DataUtils {
if (isTrueName != 0) {
performanceIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.PERFORMANCE_ID + ":" + performanceId;
ticketIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.TICKET_ID + ":" + ticketId;
timeIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.TIME_ID + ":" + timeId;
}
if (buyCount > 0) {
......@@ -153,11 +155,13 @@ public class DataUtils {
if (isTrueName != 0) {
redisUtil.incr(ticketIdKeyIdCard, buyCount);
redisUtil.incr(performanceIdKeyIdCard, buyCount);
redisUtil.incr(timeIdKeyIdCard, buyCount);
}
} else {
if (isTrueName != 0) {
redisUtil.decr(ticketIdKeyIdCard, Math.abs(buyCount));
redisUtil.decr(performanceIdKeyIdCard, Math.abs(buyCount));
redisUtil.decr(timeIdKeyIdCard, Math.abs(buyCount));
}
redisUtil.decr(ticketIdKeyUid, Math.abs(buyCount));
redisUtil.decr(performanceIdKeyUid, Math.abs(buyCount));
......@@ -202,6 +206,15 @@ public class DataUtils {
}
}
// 获取 证件维度 场次购买数量
public int getIdCardMBuyCount(String idCard, String timeId) {
try {
return (int) redisUtil.get(KylinRedisConst.IDCARD_BUY_INFO + idCard + ":" + KylinRedisConst.TIME_ID + ":" + timeId);
} catch (Exception e) {
return 0;
}
}
/**
* 删除订单redis
*
......
......@@ -20,6 +20,9 @@ import com.liquidnet.service.kylin.dto.vo.mongo.KylinCandyVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.returns.InnerReturnVo;
import com.liquidnet.service.kylin.dto.vo.returns.KylinOrderListVo;
import com.liquidnet.service.kylin.constant.LimitTargetEnum;
import com.liquidnet.service.kylin.constant.LimitTypeEnum;
import com.liquidnet.service.kylin.dto.vo.LimitErrorResultVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
......@@ -46,24 +49,27 @@ public class OrderUtils {
@Value("${liquidnet.service.smile.url}")
private String smile;
public String judgeOrderLimit(
public LimitErrorResultVo judgeOrderLimit(
String userId,
String idCard,
String performanceId,
String ticketId,
String timeId,
int performanceLimitCount,
int performanceMemberLimitCount,
int performanceLimitIdCard,
int ticketLimitCount,
int ticketMemberLimitCount,
int ticketLimitIdCard,
int timeRealNameLimit,
int memberType,
int isTrueName
) {
Integer[] integers = orderLimit(userId, idCard, performanceId, ticketId, isTrueName);
Integer[] integers = orderLimit(userId, idCard, performanceId, ticketId, timeId, isTrueName);
return judgeMemberType(performanceLimitCount, performanceMemberLimitCount, performanceLimitIdCard,
ticketLimitCount, ticketMemberLimitCount, ticketLimitIdCard,
memberType, integers[0], integers[1], integers[2], integers[3], isTrueName);
ticketLimitCount, ticketMemberLimitCount, ticketLimitIdCard, timeRealNameLimit,
memberType, integers[0], integers[1], integers[2], integers[3], integers[4], isTrueName);
}
public Integer[] orderLimit(
......@@ -71,75 +77,157 @@ public class OrderUtils {
String idCard,
String performanceId,
String ticketId,
String timeId,
int isTrueName
) {
int performanceBuyCountUid = 0;
int ticketBuyCountUid = 0;
int performanceBuyCountIdCard = 0;
int ticketBuyCountIdCard = 0;
int timeBuyCountIdCard = 0;
if (1 == isTrueName) {//实名
performanceBuyCountIdCard = dataUtils.getIdCardPBuyCount(idCard, performanceId);
ticketBuyCountIdCard = dataUtils.getIdCardTBuyCount(idCard, ticketId);
performanceBuyCountUid = dataUtils.getUserPBuyCount(userId, performanceId);
ticketBuyCountUid = dataUtils.getUserTBuyCount(userId, ticketId);
timeBuyCountIdCard = dataUtils.getIdCardMBuyCount(idCard, timeId);
} else {//非实名
performanceBuyCountUid = dataUtils.getUserPBuyCount(userId, performanceId);
ticketBuyCountUid = dataUtils.getUserTBuyCount(userId, ticketId);
}
Integer[] array = new Integer[4];
Integer[] array = new Integer[5];
array[0] = performanceBuyCountUid;
array[1] = ticketBuyCountUid;
array[2] = performanceBuyCountIdCard;
array[3] = ticketBuyCountIdCard;
array[4] = timeBuyCountIdCard;
return array;
}
public String judgeMemberType(int performanceLimitCount, int performanceMemberLimitCount, int performanceLimitIdCard,
int ticketLimitCount, int ticketMemberLimitCount, int ticketLimitIdCard, int memberType,
int performanceBuyCountUid, int ticketBuyCountUid, int performanceBuyCountIdCard, int ticketBuyCountIdCard, int isTrueName) {
public LimitErrorResultVo judgeMemberType(int performanceLimitCount, int performanceMemberLimitCount, int performanceLimitIdCard,
int ticketLimitCount, int ticketMemberLimitCount, int ticketLimitIdCard, int timeRealNameLimit, int memberType,
int performanceBuyCountUid, int ticketBuyCountUid, int performanceBuyCountIdCard, int ticketBuyCountIdCard,
int timeBuyCountIdCard,
int isTrueName) {
if (isTrueName == 1 && timeRealNameLimit != 0) {
if (timeBuyCountIdCard > timeRealNameLimit) {
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.TIME.getCode())
.limitTarget(LimitTargetEnum.IDCARD.getCode())
.limitCount(timeRealNameLimit)
.currentCount(timeBuyCountIdCard)
// .errorMessage("实名制场次限购" + timeRealNameLimit + "张,已超出")
.build();
}
}
if (memberType == 1 || memberType == 2) {
if (isTrueName == 1) {
if (performanceBuyCountIdCard > performanceMemberLimitCount && performanceMemberLimitCount != 0) {
return "实名制演出限购" + performanceMemberLimitCount + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.PERFORMANCE.getCode())
.limitTarget(LimitTargetEnum.IDCARD.getCode())
.memberType(memberType)
.limitCount(performanceMemberLimitCount)
.currentCount(performanceBuyCountIdCard)
// .errorMessage("实名制演出限购" + performanceMemberLimitCount + "张,已超出")
.build();
}
if (ticketBuyCountIdCard > ticketMemberLimitCount && ticketMemberLimitCount != 0) {
return "实名制票种限购" + ticketMemberLimitCount + "张,已超出";//超过票维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.TICKET.getCode())
.limitTarget(LimitTargetEnum.IDCARD.getCode())
.memberType(memberType)
.limitCount(ticketMemberLimitCount)
.currentCount(ticketBuyCountIdCard)
// .errorMessage("实名制票种限购" + ticketMemberLimitCount + "张,已超出")
.build();
}
} else {
if (performanceBuyCountUid > performanceMemberLimitCount && performanceMemberLimitCount != 0) {
return "本场演出限购" + performanceMemberLimitCount + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.PERFORMANCE.getCode())
.limitTarget(LimitTargetEnum.ACCOUNT.getCode())
.memberType(memberType)
.limitCount(performanceMemberLimitCount)
.currentCount(performanceBuyCountUid)
// .errorMessage("本场演出限购" + performanceMemberLimitCount + "张,已超出")
.build();
}
if (ticketBuyCountUid > ticketMemberLimitCount && ticketMemberLimitCount != 0) {
return "该票种限购" + ticketMemberLimitCount + "张,已超出";//超过票维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.TICKET.getCode())
.limitTarget(LimitTargetEnum.ACCOUNT.getCode())
.memberType(memberType)
.limitCount(ticketMemberLimitCount)
.currentCount(ticketBuyCountUid)
// .errorMessage("该票种限购" + ticketMemberLimitCount + "张,已超出")
.build();
}
}
} else {//非会员区间
if (isTrueName == 1) {
if (performanceBuyCountIdCard > performanceLimitIdCard && performanceLimitIdCard != 0) {
return "实名制演出限购" + performanceLimitIdCard + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.PERFORMANCE.getCode())
.limitTarget(LimitTargetEnum.IDCARD.getCode())
.limitCount(performanceLimitIdCard)
.currentCount(performanceBuyCountIdCard)
// .errorMessage("实名制演出限购" + performanceLimitIdCard + "张,已超出")
.build();
}
if (ticketBuyCountIdCard > ticketLimitIdCard && ticketLimitIdCard != 0) {
return "实名制票种限购" + ticketLimitIdCard + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.TICKET.getCode())
.limitTarget(LimitTargetEnum.IDCARD.getCode())
.limitCount(ticketLimitIdCard)
.currentCount(ticketBuyCountIdCard)
// .errorMessage("实名制票种限购" + ticketLimitIdCard + "张,已超出")
.build();
}
if (performanceBuyCountUid > performanceLimitCount && performanceLimitCount != 0) {
return "本场演出限购" + performanceLimitCount + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.PERFORMANCE.getCode())
.limitTarget(LimitTargetEnum.ACCOUNT.getCode())
.limitCount(performanceLimitCount)
.currentCount(performanceBuyCountUid)
// .errorMessage("本场演出限购" + performanceLimitCount + "张,已超出")
.build();
}
if (ticketBuyCountUid > ticketLimitCount && ticketLimitCount != 0) {
return "该票种限购" + ticketLimitCount + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.TICKET.getCode())
.limitTarget(LimitTargetEnum.ACCOUNT.getCode())
.limitCount(ticketLimitCount)
.currentCount(ticketBuyCountUid)
// .errorMessage("该票种限购" + ticketLimitCount + "张,已超出")
.build();
}
} else {
if (performanceBuyCountUid > performanceLimitCount && performanceLimitCount != 0) {
return "本场演出限购" + performanceLimitCount + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.PERFORMANCE.getCode())
.limitTarget(LimitTargetEnum.ACCOUNT.getCode())
.limitCount(performanceLimitCount)
.currentCount(performanceBuyCountUid)
// .errorMessage("本场演出限购" + performanceLimitCount + "张,已超出")
.build();
}
if (ticketBuyCountUid > ticketLimitCount && ticketLimitCount != 0) {
return "该票种限购" + ticketLimitCount + "张,已超出";//超过演出维度购买量
return LimitErrorResultVo.builder()
.limitType(LimitTypeEnum.TICKET.getCode())
.limitTarget(LimitTargetEnum.ACCOUNT.getCode())
.limitCount(ticketLimitCount)
.currentCount(ticketBuyCountUid)
// .errorMessage("该票种限购" + ticketLimitCount + "张,已超出")
.build();
}
}
}
return "";
return null;
}
......
......@@ -261,7 +261,7 @@ public class KylinRefundsStatusServiceImpl {
int surplusGeneral = dataUtils.changeSurplusGeneral(entitiesInfo.getTicketId(), 1);
log.info("refundCallback回滚库存res: [surplusGeneral={},ticketId={},orderRefundCode={}]", surplusGeneral, entitiesInfo.getTicketId(), refundCallbackParam.getOrderRefundCode());
log.info(UserPathDto.setData("changeBuyInfo", "UserId=" + orderInfo.getUserId() + "idCard=" + entitiesInfo.getEnterIdCode() + " PerformanceId=" + orderRelations.getPerformanceId() + " TicketId=" + entitiesInfo.getTicketId(), "info"));
dataUtils.changeBuyInfo(orderInfo.getUserId(), entitiesInfo.getEnterIdCode(), orderRelations.getPerformanceId(), entitiesInfo.getTicketId(), -1);
dataUtils.changeBuyInfo(orderInfo.getUserId(), entitiesInfo.getEnterIdCode(), orderRelations.getPerformanceId(), entitiesInfo.getTicketId(), entitiesInfo.getTimeId(), -1);
}
}
if (newStatus == KylinTableStatusConst.ORDER_STATUS4) {
......
......@@ -283,11 +283,12 @@ public class DataUtils {
* @param ticketId 票种id
* @param buyCount 购买数量 大于 0 增加 小于 0 减少 对应 支付 退款表
*/
public void changeBuyInfo(String userId, String idCard, String performanceId, String ticketId, int buyCount) {
public void changeBuyInfo(String userId, String idCard, String performanceId, String ticketId, String timeId, int buyCount) {
String redisKeyUid;
String redisKeyIdCard;
String performanceIdKeyIdCard="";
String ticketIdKeyIdCard="";
String timeIdKeyIdCard = "";
int isTrueName = getPerformanceIsTrueName(performanceId);
......@@ -298,6 +299,7 @@ public class DataUtils {
if (isTrueName != 0) {
performanceIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.PERFORMANCE_ID + ":" + performanceId;
ticketIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.TICKET_ID + ":" + ticketId;
timeIdKeyIdCard = redisKeyIdCard + ":" + KylinRedisConst.TIME_ID + ":" + timeId;
}
if (buyCount > 0) {
......@@ -306,11 +308,13 @@ public class DataUtils {
if (isTrueName != 0) {
redisDataSourceUtil.getRedisKylinUtil().incr(ticketIdKeyIdCard, buyCount);
redisDataSourceUtil.getRedisKylinUtil().incr(performanceIdKeyIdCard, buyCount);
redisDataSourceUtil.getRedisKylinUtil().incr(timeIdKeyIdCard, buyCount);
}
} else {
if (isTrueName != 0) {
redisDataSourceUtil.getRedisKylinUtil().decr(ticketIdKeyIdCard, Math.abs(buyCount));
redisDataSourceUtil.getRedisKylinUtil().decr(performanceIdKeyIdCard, Math.abs(buyCount));
redisDataSourceUtil.getRedisKylinUtil().decr(timeIdKeyIdCard, Math.abs(buyCount));
}
redisDataSourceUtil.getRedisKylinUtil().decr(ticketIdKeyUid, Math.abs(buyCount));
redisDataSourceUtil.getRedisKylinUtil().decr(performanceIdKeyUid, Math.abs(buyCount));
......
......@@ -107,6 +107,9 @@ public class KylinPerformancesPartnerServiceImpl implements IKylinPerformancesPa
PerformancePartnerVo performancePartnerVo = PerformancePartnerVo.getNew();
BeanUtils.copyProperties(step1Param, performancePartnerVo);
performancePartnerVo.setIsTrueName(0);
if (step1Param.getType().equals(101)) {
performancePartnerVo.setIsTrueName(1);
}
performancePartnerVo.setLimitCount(0);
performancePartnerVo.setIdCount(0);
performancePartnerVo.setCreatedAt(createdAt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
......
......@@ -94,6 +94,7 @@ public class KylinTicketTimesPartnerServiceImpl implements IKylinTicketTimesPart
kylinTicketTimesPartnerVo.setTitle(title);
kylinTicketTimesPartnerVo.setPerformancesId(createTicketTimesParam.getPerformancesId());
kylinTicketTimesPartnerVo.setType(createTicketTimesParam.getType());
kylinTicketTimesPartnerVo.setRealNameLimit(createTicketTimesParam.getRealNameLimit());
kylinTicketTimesPartnerVo.setCreatedAt(createdAt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mongoSlimeUtils.insertTicketTimesPartnerVo(kylinTicketTimesPartnerVo);
return ResponseDto.success(kylinTicketTimesPartnerVo);
......@@ -132,6 +133,7 @@ public class KylinTicketTimesPartnerServiceImpl implements IKylinTicketTimesPart
kylinTicketTimesPartnerVo.setTitle(title);
kylinTicketTimesPartnerVo.setPerformancesId(createTicketTimesParam.getPerformancesId());
kylinTicketTimesPartnerVo.setType(createTicketTimesParam.getType());
kylinTicketTimesPartnerVo.setRealNameLimit(createTicketTimesParam.getRealNameLimit());
kylinTicketTimesPartnerVo.setCreatedAt(createdAt.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
mongoSlimeUtils.insertTicketTimesPartnerVo(kylinTicketTimesPartnerVo);
return ResponseDto.success(kylinTicketTimesPartnerVo);
......
......@@ -495,6 +495,10 @@ public class PerformanceUtils {
log.info("performanceId = " + performanceId + " NEED CHANGE TIMES USE_START");
return true;
}
if (!times.getRealNameLimit().equals(timesVo.getRealNameLimit())) {
log.info("performanceId = " + performanceId + " NEED CHANGE TIMES RealNameLimit");
return true;
}
if (!times.getUseEnd().equals(timesVo.getUseEnd())) {
log.info("performanceId = " + performanceId + " NEED CHANGE TIMES USE_END");
return true;
......
......@@ -60,7 +60,7 @@ kylin_performance_relations.insert=INSERT INTO kylin_performance_relations (perf
kylin_ticket_times.del=DELETE FROM kylin_ticket_times WHERE ticket_times_id = ?
kylin_ticket_time_relation.del=DELETE FROM kylin_ticket_time_relation WHERE times_id = ?
kylin_ticket_times.insert=INSERT INTO kylin_ticket_times (ticket_times_id,title,status,type,use_start,use_end,comment,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?)
kylin_ticket_times.insert=INSERT INTO kylin_ticket_times (ticket_times_id,title,status,type,use_start,use_end,comment,created_at,updated_at,real_name_limit) VALUES (?,?,?,?,?,?,?,?,?,?)
kylin_ticket_time_relation.insert=INSERT INTO kylin_ticket_time_relation (ticket_time_relation_id,times_id,performance_id,created_at,updated_at) VALUES (?,?,?,?,?)
kylin_tickets.del=DELETE FROM kylin_tickets WHERE tickets_id = ?
......
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