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

Commit e46da29e authored by 姜秀龙's avatar 姜秀龙

Merge branch 'dev_fudai_v2' into 'master'

福袋补充需求

See merge request !387
parents 070425b7 167618ea
package com.liquidnet.service.kylin.constant;
import lombok.Getter;
@Getter
public enum LuckyBagStatusEnum {
// 兑换码显示类型
CODE_SHOW_TYPE_CODE(1, "兑换码"),
CODE_SHOW_TYPE_QR_CODE(2, "二维码"),
// 解锁状态
UNLOCK_STATUS_NOT_UNLOCKED(0, "未解锁"),
UNLOCK_STATUS_UNLOCKED(1, "已解锁"),
// 可用状态
AVAILABLE_STATUS_UNAVAILABLE(0, "不可用"),
AVAILABLE_STATUS_AVAILABLE(1, "可用"),
AVAILABLE_STATUS_RECEIVED(2, "已领取");
private final Integer value;
private final String desc;
LuckyBagStatusEnum(Integer value, String desc) {
this.value = value;
this.desc = desc;
}
}
package com.liquidnet.service.kylin.dto.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@ApiModel(value = "福袋兑换码详情VO")
public class KylinLuckyBagCodeDetailVo {
@ApiModelProperty(value = "福袋ID")
private String luckyBagId;
@ApiModelProperty(value = "福袋名称")
private String luckyBagName;
@ApiModelProperty(value = "兑换码")
private String code;
@ApiModelProperty(value = "状态 0:不可用 1:可用 2:已领取")
private int useStatus;
@ApiModelProperty(value = "发放时间")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createdAt;
@ApiModelProperty(value = "领取时间")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updatedAt;
@ApiModelProperty(value = "领取人信息")
private UserInfo userInfo;
@ApiModelProperty(value = "关联订单订单")
private OrderInfo orderInfo;
@ApiModelProperty(value = "核验人")
private Operator operator;
@ApiModel(value = "用户信息")
@Data
public static class UserInfo {
@ApiModelProperty(value = "用户ID")
private String uid;
@ApiModelProperty(value = "用户昵称")
private String userName;
@ApiModelProperty(value = "用户手机号")
private String userMobile;
}
@ApiModel(value = "订单信息")
@Data
public static class OrderInfo {
@ApiModelProperty(value = "订单ID")
private String orderId;
@ApiModelProperty(position = 15, value = "订单号")
private String orderCode;
@ApiModelProperty(value = "演出名称")
private String performanceTitle;
@ApiModelProperty(value = "票种名称")
private String ticketTitle;
@ApiModelProperty(value = "数量")
private Integer number;
@ApiModelProperty(value = "退款张数")
private Integer refundNumber;
@ApiModelProperty(value = "订单生成时间")
private String createdAt;
@ApiModelProperty(value = "适用时间")
private String useStart;
}
@ApiModel(value = "和燕人")
@Data
@AllArgsConstructor
public static class Operator{
@ApiModelProperty(value = "手机号")
private String mobile;
@ApiModelProperty(value = "昵称")
private String nickName;
}
}
package com.liquidnet.service.kylin.dto.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "福袋Scope VO")
public class KylinLuckyBagScopeVo {
@ApiModelProperty(value = "福袋ID")
private String luckyBagId;
@ApiModelProperty(value = "福袋名称")
private String name;
@ApiModelProperty(value = "福袋描述")
private String introduction;
@ApiModelProperty(value = "关联演出ID")
private String performanceId;
@ApiModelProperty(value = "关联演出名称")
private String performanceName;
}
...@@ -8,7 +8,6 @@ import lombok.Data; ...@@ -8,7 +8,6 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set;
@Data @Data
...@@ -52,13 +51,27 @@ public class KylinLuckyBagVo implements Serializable { ...@@ -52,13 +51,27 @@ public class KylinLuckyBagVo implements Serializable {
@ApiModelProperty(value = "福袋描述") @ApiModelProperty(value = "福袋描述")
private String introduction; private String introduction;
@ApiModelProperty(value = "兑换码显示状态 1:兑换码 2:二维码")
private Integer codeShowType;
@ApiModelProperty(value = "状态 0:未解锁 1:已解锁") @ApiModelProperty(value = "状态 0:未解锁 1:已解锁")
private int status; private Integer status;
@ApiModelProperty(value = "兑换码") @ApiModelProperty(value = "兑换码")
private Set<String> rewardCodeList; private List<RewardCodeVo> rewardCodeVoList;
} }
@Data
@ApiModel(value = "兑换码VO")
public static class RewardCodeVo {
@ApiModelProperty(value = "状态 0:不可用 1:可用 2:已领取")
private Integer useStatus;
@ApiModelProperty(value = "兑换码")
private String code;
}
public static KylinLuckyBagVo of(List<LuckyBagVo> luckyBagVoList, public static KylinLuckyBagVo of(List<LuckyBagVo> luckyBagVoList,
LuckyBagActivityVo luckyBagActivityVo){ LuckyBagActivityVo luckyBagActivityVo){
KylinLuckyBagVo kylinLuckyBagVo = new KylinLuckyBagVo(); KylinLuckyBagVo kylinLuckyBagVo = new KylinLuckyBagVo();
......
package com.liquidnet.service.kylin.service; package com.liquidnet.service.kylin.service;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagCodeDetailVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagScopeVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo; import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo;
import java.util.List;
public interface IKylinLuckyBagService { public interface IKylinLuckyBagService {
KylinLuckyBagVo getLuckyBagByOrderId(String orderId); /**
* 根据订单ID获取福袋
*
* @param orderId
* @return
*/
ResponseDto<KylinLuckyBagVo> getLuckyBagByOrderId(String orderId);
/**
* 获取福袋验码列表
*
* @param mobile
* @return
*/
ResponseDto<List<KylinLuckyBagScopeVo>> getLuckyBagListScope(String mobile);
/**
* 获取福袋详情
*
* @param authMobile
* @param code
* @param luckyBagId
* @return
*/
ResponseDto<KylinLuckyBagCodeDetailVo> getCodeDetail(String authMobile, String code, String luckyBagId);
/**
* 验码
* @param authMobile
* @param code
* @param luckyBagId
* @return
*/
ResponseDto<Boolean> consumeCode(String authMobile, String code, String luckyBagId);
} }
...@@ -104,7 +104,7 @@ spring: ...@@ -104,7 +104,7 @@ spring:
database: ${liquidnet.mongodb.database} database: ${liquidnet.mongodb.database}
datasource: datasource:
name: ${liquidnet.mysql.database-name} name: ${liquidnet.mysql.database-name}
url: jdbc:mysql://${liquidnet.mysql.urlHostAndPort}/${liquidnet.mysql.database-name}?serverTimezone=UTC&characterEncoding=utf-8&useSSL=false url: jdbc:mysql://${liquidnet.mysql.urlHostAndPort}/${liquidnet.mysql.database-name}?serverTimezone=Asia/Shanghai&characterEncoding=utf-8&useSSL=false
username: ${liquidnet.mysql.username} username: ${liquidnet.mysql.username}
password: ${liquidnet.mysql.password} password: ${liquidnet.mysql.password}
# type: com.alibaba.druid.pool.DruidDataSource # type: com.alibaba.druid.pool.DruidDataSource
...@@ -154,6 +154,9 @@ global-auth: ...@@ -154,6 +154,9 @@ global-auth:
# 场地摄像头列表 # 场地摄像头列表
- ${liquidnet.info.context}/camera/list - ${liquidnet.info.context}/camera/list
- ${liquidnet.info.context}/inner/** - ${liquidnet.info.context}/inner/**
# 福袋
- ${liquidnet.info.context}/luckyBag/scope
- ${liquidnet.info.context}/luckyBag/code/**
oncheck-url-pattern: oncheck-url-pattern:
- ${liquidnet.info.context}/order/details - ${liquidnet.info.context}/order/details
- ${liquidnet.info.context}/order/transfer* - ${liquidnet.info.context}/order/transfer*
......
...@@ -47,6 +47,10 @@ public class KylinLuckyBag implements Serializable, Cloneable{ ...@@ -47,6 +47,10 @@ public class KylinLuckyBag implements Serializable, Cloneable{
*/ */
private String performanceId; private String performanceId;
/**
* 所属演出名称
*/
private String performanceName;
/** /**
* 所属场次ID * 所属场次ID
...@@ -58,6 +62,11 @@ public class KylinLuckyBag implements Serializable, Cloneable{ ...@@ -58,6 +62,11 @@ public class KylinLuckyBag implements Serializable, Cloneable{
*/ */
private String ticketsId; private String ticketsId;
/**
* 兑换码显示状态 1:兑换码 2:二维码
*/
private Integer codeShowType;
/** /**
* 状态: 1-可用, 0-不可用 * 状态: 1-可用, 0-不可用
*/ */
......
package com.liquidnet.service.kylin.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
public class KylinLuckyBagScope implements Serializable, Cloneable{
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* 手机号
*/
private String mobile;
/**
* 福袋ID
*/
private String luckyBagId;
/**
* 昵称
*/
private String nickName;
/**
* 真实姓名
*/
private String realName;
/**
* 身份证号码
*/
private String idCard;
/**
* 状态: 1-可用, 0-不可用
*/
private Integer state;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 修改时间
*/
private LocalDateTime updatedAt;
}
...@@ -47,7 +47,7 @@ public class KylinRewardUser implements Serializable, Cloneable{ ...@@ -47,7 +47,7 @@ public class KylinRewardUser implements Serializable, Cloneable{
private String code; private String code;
/** /**
* 状态 0不可用 1可用 * 状态 0不可用 1可用 2已使用
*/ */
private Integer state; private Integer state;
......
package com.liquidnet.service.kylin.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.kylin.entity.KylinLuckyBagScope;
public interface KylinLuckyBagScopeMapper extends BaseMapper<KylinLuckyBagScope> {
}
package com.liquidnet.service.kylin.controller; package com.liquidnet.service.kylin.controller;
import com.liquidnet.service.base.ResponseDto; import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagCodeDetailVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagScopeVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo; import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo;
import com.liquidnet.service.kylin.service.IKylinLuckyBagService; import com.liquidnet.service.kylin.service.IKylinLuckyBagService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -12,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping; ...@@ -12,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Api(tags = "前端-获取福袋相关") @Api(tags = "前端-获取福袋相关")
@RestController @RestController
@RequestMapping("/luckyBag") @RequestMapping("/luckyBag")
...@@ -19,12 +23,34 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -19,12 +23,34 @@ import org.springframework.web.bind.annotation.RestController;
public class KylinLuckyBagController { public class KylinLuckyBagController {
@Autowired @Autowired
private IKylinLuckyBagService benefitsService; private IKylinLuckyBagService luckyBagService;
@GetMapping("") @GetMapping("")
@ApiOperation("获取福袋权益列表") @ApiOperation("获取福袋权益列表")
public ResponseDto<KylinLuckyBagVo> getLuckyBagByOrderId(@RequestParam(value = "orderId") String orderId) { public ResponseDto<KylinLuckyBagVo> getLuckyBagByOrderId(@RequestParam(value = "orderId") String orderId) {
return ResponseDto.success(benefitsService.getLuckyBagByOrderId(orderId)); return luckyBagService.getLuckyBagByOrderId(orderId);
}
@GetMapping("/scope")
@ApiOperation("获取验码福袋列表")
public ResponseDto<List<KylinLuckyBagScopeVo>> getLuckyBagListScope(@RequestParam(value = "mobile") String mobile){
return luckyBagService.getLuckyBagListScope(mobile);
}
@ApiOperation("兑换码详情")
@GetMapping("/code/detail")
public ResponseDto<KylinLuckyBagCodeDetailVo> getCodeDetail(@RequestParam(value = "mobile") String mobile,
@RequestParam(value = "code") String code,
@RequestParam(value = "luckyBagId") String luckyBagId){
return luckyBagService.getCodeDetail(mobile, code, luckyBagId);
}
@GetMapping("/code/consume")
@ApiOperation("兑换码核销")
public ResponseDto<Boolean> consumeCode(@RequestParam(value = "mobile") String mobile,
@RequestParam(value = "code") String code,
@RequestParam(value = "luckyBagId") String luckyBagId){
return luckyBagService.consumeCode(mobile, code, luckyBagId);
} }
} }
...@@ -3,18 +3,21 @@ package com.liquidnet.service.kylin.service.impl; ...@@ -3,18 +3,21 @@ package com.liquidnet.service.kylin.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.liquidnet.common.cache.redis.util.RedisUtil; import com.liquidnet.common.cache.redis.util.RedisUtil;
import com.liquidnet.common.exception.LiquidnetServiceException;
import com.liquidnet.commons.lang.util.CurrentUtil; import com.liquidnet.commons.lang.util.CurrentUtil;
import com.liquidnet.commons.lang.util.DateUtil; import com.liquidnet.commons.lang.util.DateUtil;
import com.liquidnet.commons.lang.util.StringUtil;
import com.liquidnet.service.base.ErrorMapping; import com.liquidnet.service.base.ErrorMapping;
import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.kylin.constant.KylinRedisConst; import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.constant.LuckyBagStatusEnum;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagCodeDetailVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagScopeVo;
import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo; import com.liquidnet.service.kylin.dto.vo.KylinLuckyBagVo;
import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo; import com.liquidnet.service.kylin.dto.vo.mongo.KylinOrderTicketVo;
import com.liquidnet.service.kylin.dto.vo.returns.OrderDetailsVo; import com.liquidnet.service.kylin.dto.vo.returns.OrderDetailsVo;
import com.liquidnet.service.kylin.entity.KylinLuckyBag; import com.liquidnet.service.kylin.entity.*;
import com.liquidnet.service.kylin.entity.KylinLuckyBagActivity; import com.liquidnet.service.kylin.mapper.KylinLuckyBagMapper;
import com.liquidnet.service.kylin.entity.KylinRewardCode; import com.liquidnet.service.kylin.mapper.KylinLuckyBagScopeMapper;
import com.liquidnet.service.kylin.entity.KylinRewardUser;
import com.liquidnet.service.kylin.mapper.KylinRewardCodeMapper; import com.liquidnet.service.kylin.mapper.KylinRewardCodeMapper;
import com.liquidnet.service.kylin.mapper.KylinRewardUserMapper; import com.liquidnet.service.kylin.mapper.KylinRewardUserMapper;
import com.liquidnet.service.kylin.service.IFeishuBotService; import com.liquidnet.service.kylin.service.IFeishuBotService;
...@@ -52,51 +55,243 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -52,51 +55,243 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
private KylinRewardCodeMapper kylinRewardCodeMapper; private KylinRewardCodeMapper kylinRewardCodeMapper;
@Autowired @Autowired
private KylinRewardUserMapper kylinRewardUserMapper; private KylinRewardUserMapper kylinRewardUserMapper;
@Autowired
private KylinLuckyBagScopeMapper kylinLuckyBagScopeMapper;
@Autowired
private KylinLuckyBagMapper kylinLuckyBagMapper;
@Override @Override
public KylinLuckyBagVo getLuckyBagByOrderId(String orderId) { public ResponseDto<KylinLuckyBagVo> getLuckyBagByOrderId(String orderId) {
//1. 首先校验用户权限 //1. 首先校验用户权限
OrderDetailsVo vo = orderTicketsService.orderDetails(orderId); // OrderDetailsVo vo = orderTicketsService.orderDetails(orderId);
String uid = CurrentUtil.getCurrentUid();
if (null == vo) { final KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(orderId);
final String uid = CurrentUtil.getCurrentUid();
if (orderTicketVo == null) {
log.error("[getLuckyBagByOrderId] 未查询到订单, orderId: {}, uid: {}.", orderId, uid);
return ResponseDto.failure(ErrorMapping.get("20024"));
}
if (!orderTicketVo.getUserId().equals(uid)) {
log.error("[getLuckyBagByOrderId] 无权查看该订单, orderId: {}, uid: {}.", orderId, uid); log.error("[getLuckyBagByOrderId] 无权查看该订单, orderId: {}, uid: {}.", orderId, uid);
ErrorMapping.ErrorMessage errorMessage = ErrorMapping.get("20003"); return ResponseDto.failure(ErrorMapping.get("20003"));
throw new LiquidnetServiceException(errorMessage.getCode(), errorMessage.getMessage());
} }
log.info("[getLuckyBagByOrderId] 获取福袋详情, orderId: {}, uid: {}.", orderId, uid); log.info("[getLuckyBagByOrderId] 获取福袋详情, orderId: {}, uid: {}.", orderId, uid);
// 判断订单状态 // 判断订单状态
if (vo.getOrderTicketVo().getStatus() != 1 || vo.getOrderTicketVo().getPayStatus() != 1) { if (isEligibleForWelfare(orderTicketVo)) {
// 2. 订单关联的演出ID
List<KylinLuckyBagVo.LuckyBagActivityVo> activityVos = getLuckyBagActivityVos(orderTicketVo.getPerformanceId());
//3. 再查询满足的权益
List<KylinLuckyBagVo.LuckyBagVo> luckyBagVos = getLuckyBagVos(orderTicketVo);
if (activityVos.isEmpty()) {
return ResponseDto.success(KylinLuckyBagVo.of(luckyBagVos, null));
} else {
return ResponseDto.success(KylinLuckyBagVo.of(luckyBagVos, activityVos.get(0)));
}
}else {
log.info("[getLuckyBagByOrderId] 该订单状态不满足权益要求, orderId: {}, uid: {}, status: {}, payStatus: {}.", orderId, log.info("[getLuckyBagByOrderId] 该订单状态不满足权益要求, orderId: {}, uid: {}, status: {}, payStatus: {}.", orderId,
uid, vo.getOrderTicketVo().getStatus(), vo.getOrderTicketVo().getPayStatus()); uid, orderTicketVo.getStatus(), orderTicketVo.getPayStatus());
return KylinLuckyBagVo.ofEmpty(); return ResponseDto.success(KylinLuckyBagVo.ofEmpty());
} }
}
// 2. 订单关联的演出ID
List<KylinLuckyBagVo.LuckyBagActivityVo> activityVos = getLuckyBagActivityVos(vo.getOrderTicketVo().getPerformanceId());
//3. 再查询满足的权益 @Override
List<KylinLuckyBagVo.LuckyBagVo> luckyBagVos = getLuckyBagVos(vo); public ResponseDto<List<KylinLuckyBagScopeVo>> getLuckyBagListScope(String mobile) {
if (StringUtil.isBlank(mobile)) {
log.info("[getLuckyBagListScope] 手机号为空");
return ResponseDto.failure(ErrorMapping.get("20004"));
}
LambdaQueryWrapper<KylinLuckyBagScope> queryWrapper = new QueryWrapper<KylinLuckyBagScope>()
.lambda()
.eq(KylinLuckyBagScope::getMobile, mobile)
.eq(KylinLuckyBagScope::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
List<KylinLuckyBagScope> kylinLuckyBagScopes = kylinLuckyBagScopeMapper.selectList(queryWrapper);
if (kylinLuckyBagScopes.isEmpty()) {
log.info("[getLuckyBagListScope] 暂无验码权限, mobile: {}.", mobile);
return ResponseDto.failure(ErrorMapping.get("20003"));
}
if (activityVos.isEmpty()) { // 查询福袋列表
return KylinLuckyBagVo.of(luckyBagVos, null); List<KylinLuckyBag> luckyBagList = dataUtils.getKylinLuckyBagList();
}else { if (luckyBagList.isEmpty()) {
return KylinLuckyBagVo.of(luckyBagVos, activityVos.get(0)); log.info("[getLuckyBagListScope] 获取福袋列表为空.");
return ResponseDto.success();
}
// 该手机号可以核验的福袋ID列表
Set<String> collected = kylinLuckyBagScopes.stream()
.map(KylinLuckyBagScope::getLuckyBagId)
.collect(Collectors.toSet());
return ResponseDto.success(luckyBagList.stream()
.filter(l -> collected.contains(l.getLuckyBagId()))
.map(l -> {
KylinLuckyBagScopeVo vo = new KylinLuckyBagScopeVo();
vo.setLuckyBagId(l.getLuckyBagId());
vo.setName(l.getName());
vo.setIntroduction(l.getIntroduction());
vo.setPerformanceId(l.getPerformanceId());
vo.setPerformanceName(l.getPerformanceName());
return vo;
})
.collect(Collectors.toList()));
}
@Override
public ResponseDto<KylinLuckyBagCodeDetailVo> getCodeDetail(String authMobile, String code, String luckyBagId) {
if (!checkScopeByMobile(authMobile, luckyBagId)) {
log.info("暂无验码权限, mobile: {}, luckyBagId: {}.", authMobile, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20003"));
}
LambdaQueryWrapper<KylinRewardUser> queryWrapper = new QueryWrapper<KylinRewardUser>()
.lambda()
.eq(KylinRewardUser::getCode, code)
.eq(KylinRewardUser::getLuckyBagId, luckyBagId);
KylinRewardUser rewardUser = kylinRewardUserMapper.selectOne(queryWrapper);
if (rewardUser == null) {
log.error("兑换码或福袋不存在, code: {}, luckyBagId: {}.", code, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20800"));
} }
KylinOrderTicketVo orderTicketVo = dataUtils.getOrderTicketVo(rewardUser.getOrderId());
if (orderTicketVo == null) {
log.error("订单详情为空, orderId: {}.", rewardUser.getOrderId());
iFeishuBotService.sendTextMessage("订单不存在, orderId: " + rewardUser.getOrderId());
return ResponseDto.failure(ErrorMapping.get("20801"));
}
return ResponseDto.success(buildCodeDetailVo(rewardUser, orderTicketVo));
}
@Override
public ResponseDto<Boolean> consumeCode(String authMobile, String code, String luckyBagId) {
if (!checkScopeByMobile(authMobile, luckyBagId)) {
log.info("暂无验码权限, mobile: {}, luckyBagId: {}.", authMobile, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20003"));
}
LambdaQueryWrapper<KylinRewardUser> queryWrapper = new QueryWrapper<KylinRewardUser>()
.lambda()
.eq(KylinRewardUser::getCode, code)
.eq(KylinRewardUser::getLuckyBagId, luckyBagId);
KylinRewardUser rewardUser = kylinRewardUserMapper.selectOne(queryWrapper);
if (rewardUser == null) {
log.error("兑换码或福袋不存在, code: {}, luckyBagId: {}.", code, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20800"));
}
if (LuckyBagStatusEnum.AVAILABLE_STATUS_RECEIVED.getValue().equals(rewardUser.getState())) {
log.info("兑换码被使用, code: {}, luckyBagId: {}.", code, luckyBagId);
return ResponseDto.failure(ErrorMapping.get("20802"));
}
rewardUser.setState(LuckyBagStatusEnum.AVAILABLE_STATUS_RECEIVED.getValue());
rewardUser.setComment(authMobile);
rewardUser.setUpdatedAt(LocalDateTime.now());
int updateById = kylinRewardUserMapper.updateById(rewardUser);
log.info("核销兑换码: {}.", updateById > 0);
return ResponseDto.success(updateById > 0);
}
private KylinLuckyBagCodeDetailVo buildCodeDetailVo(KylinRewardUser rewardUser,
KylinOrderTicketVo orderTicketVo) {
KylinLuckyBagCodeDetailVo detailVo = new KylinLuckyBagCodeDetailVo();
detailVo.setLuckyBagId(rewardUser.getLuckyBagId());
KylinLuckyBag luckyBag = getLuckyBagById(rewardUser.getLuckyBagId());
if (luckyBag != null) {
detailVo.setLuckyBagName(luckyBag.getName());
}
detailVo.setCode(rewardUser.getCode());
detailVo.setUseStatus(rewardUser.getState());
detailVo.setCreatedAt(rewardUser.getCreatedAt());
detailVo.setUpdatedAt(rewardUser.getUpdatedAt());
detailVo.setUserInfo(getUserInfo(orderTicketVo));
detailVo.setOrderInfo(getOrderInfo(orderTicketVo));
detailVo.setOperator(getOperator(rewardUser.getComment(), rewardUser.getLuckyBagId()));
return detailVo;
}
/**
* 根据福袋ID获取福袋信息
*
* @param luckyBagId
* @return
*/
private KylinLuckyBag getLuckyBagById(String luckyBagId) {
LambdaQueryWrapper<KylinLuckyBag> wrapper = new QueryWrapper<KylinLuckyBag>().lambda()
.eq(KylinLuckyBag::getLuckyBagId, luckyBagId);
return kylinLuckyBagMapper.selectOne(wrapper);
}
/**
* 获取用户信息
*
* @param orderTicketVo
* @return
*/
private KylinLuckyBagCodeDetailVo.UserInfo getUserInfo(KylinOrderTicketVo orderTicketVo) {
if (orderTicketVo == null) {
return null;
}
KylinLuckyBagCodeDetailVo.UserInfo userInfo = new KylinLuckyBagCodeDetailVo.UserInfo();
userInfo.setUid(orderTicketVo.getUserId());
userInfo.setUserName(orderTicketVo.getUserName());
userInfo.setUserMobile(orderTicketVo.getUserMobile());
return userInfo;
}
/**
* 获取订单信息
*
* @param orderTicketVo
* @return
*/
private KylinLuckyBagCodeDetailVo.OrderInfo getOrderInfo(KylinOrderTicketVo orderTicketVo) {
if (orderTicketVo == null) {
return null;
}
KylinLuckyBagCodeDetailVo.OrderInfo orderInfo = new KylinLuckyBagCodeDetailVo.OrderInfo();
orderInfo.setOrderId(orderTicketVo.getOrderTicketsId());
orderInfo.setOrderCode(orderTicketVo.getOrderCode());
orderInfo.setPerformanceTitle(orderTicketVo.getPerformanceTitle());
orderInfo.setTicketTitle(orderTicketVo.getTicketTitle());
orderInfo.setNumber(orderTicketVo.getNumber());
orderInfo.setRefundNumber(orderTicketVo.getRefundNumber());
orderInfo.setCreatedAt(orderTicketVo.getCreatedAt());
orderInfo.setUseStart(orderTicketVo.getUseStart());
return orderInfo;
}
/**
* 获取核验人信息
*
* @return
*/
private KylinLuckyBagCodeDetailVo.Operator getOperator(String mobile, String luckyBagId) {
if (StringUtil.isBlank(mobile)) {
return null;
}
LambdaQueryWrapper<KylinLuckyBagScope> queryWrapper = new QueryWrapper<KylinLuckyBagScope>().lambda()
.eq(KylinLuckyBagScope::getMobile, mobile)
.eq(KylinLuckyBagScope::getLuckyBagId, luckyBagId);
KylinLuckyBagScope luckyBagScope = kylinLuckyBagScopeMapper.selectOne(queryWrapper);
if (luckyBagScope == null) {
return null;
}
return new KylinLuckyBagCodeDetailVo.Operator(luckyBagScope.getMobile(), luckyBagScope.getNickName());
} }
/** /**
* 获取福袋列表 * 获取福袋列表
* *
* @param vo * @param orderTicketVo
* @return * @return
*/ */
private List<KylinLuckyBagVo.LuckyBagVo> getLuckyBagVos(OrderDetailsVo vo) { private List<KylinLuckyBagVo.LuckyBagVo> getLuckyBagVos(KylinOrderTicketVo orderTicketVo) {
final String performanceId = vo.getOrderTicketVo().getPerformanceId(); final String performanceId = orderTicketVo.getPerformanceId();
final String orderId = vo.getOrderTicketVo().getOrderTicketsId(); final String orderId = orderTicketVo.getOrderTicketsId();
final String uid = vo.getOrderTicketVo().getUserId(); final String uid = orderTicketVo.getUserId();
List<KylinLuckyBag> luckyBagList = dataUtils.getKylinLuckyBagList(); List<KylinLuckyBag> luckyBagList = dataUtils.getKylinLuckyBagList();
...@@ -117,6 +312,7 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -117,6 +312,7 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
luckyBagVo.setLuckyBagId(l.getLuckyBagId()); luckyBagVo.setLuckyBagId(l.getLuckyBagId());
luckyBagVo.setName(l.getName()); luckyBagVo.setName(l.getName());
luckyBagVo.setIntroduction(l.getIntroduction()); luckyBagVo.setIntroduction(l.getIntroduction());
luckyBagVo.setCodeShowType(l.getCodeShowType());
final String sendTime = l.getSendTime(); final String sendTime = l.getSendTime();
final String nowTime = DateUtil.getNowTime(); final String nowTime = DateUtil.getNowTime();
...@@ -128,15 +324,22 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -128,15 +324,22 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
if (kylinRewardUserList.isEmpty()) { if (kylinRewardUserList.isEmpty()) {
// 根据购买数量来分配兑换码 // 根据购买数量来分配兑换码
log.info("[getLuckyBagVos] 福袋[{}]已到发放时间,但未给用户分配兑换码, uid: {}, orderId: {}.", l.getName(), uid, orderId); log.info("[getLuckyBagVos] 福袋[{}]已到发放时间,但未给用户分配兑换码, uid: {}, orderId: {}.", l.getName(), uid, orderId);
kylinRewardUserList = getRandomRewardCode(vo, l.getLuckyBagId()); kylinRewardUserList = getRandomRewardCode(orderTicketVo, l.getLuckyBagId());
} }
Set<String> codeSet = kylinRewardUserList.stream().map(KylinRewardUser::getCode).collect(Collectors.toSet()); List<KylinLuckyBagVo.RewardCodeVo> codeVoList = kylinRewardUserList.stream().map(k -> {
luckyBagVo.setRewardCodeList(codeSet); KylinLuckyBagVo.RewardCodeVo rewardCodeVo = new KylinLuckyBagVo.RewardCodeVo();
luckyBagVo.setStatus(kylinRewardUserList.isEmpty() ? 0 : 1); rewardCodeVo.setUseStatus(k.getState());
rewardCodeVo.setCode(k.getCode());
return rewardCodeVo;
}).collect(Collectors.toList());
luckyBagVo.setRewardCodeVoList(codeVoList);
luckyBagVo.setStatus(kylinRewardUserList.isEmpty() ?
LuckyBagStatusEnum.UNLOCK_STATUS_NOT_UNLOCKED.getValue() : LuckyBagStatusEnum.UNLOCK_STATUS_UNLOCKED.getValue());
} else { } else {
log.info("[getLuckyBagVos] 福袋[{}]未到发放时间.", l.getName()); log.info("[getLuckyBagVos] 福袋[{}]未到发放时间.", l.getName());
luckyBagVo.setStatus(0); luckyBagVo.setStatus(LuckyBagStatusEnum.UNLOCK_STATUS_NOT_UNLOCKED.getValue());
luckyBagVo.setRewardCodeList(Collections.emptySet()); luckyBagVo.setRewardCodeVoList(Collections.emptyList());
} }
} }
activityVos.add(luckyBagVo); activityVos.add(luckyBagVo);
...@@ -145,22 +348,17 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -145,22 +348,17 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
return activityVos; return activityVos;
} }
/** /**
* 分配兑换码 * 分配兑换码
* *
* @param vo * @param orderTicketVo
* @return
*/
/**
* 分配兑换码
*
* @param vo
* @return * @return
*/ */
private List<KylinRewardUser> getRandomRewardCode(OrderDetailsVo vo, String luckyBagId) { private List<KylinRewardUser> getRandomRewardCode(KylinOrderTicketVo orderTicketVo, String luckyBagId) {
final int limitTotal = vo.getOrderTicketVo().getNumber(); final int limitTotal = orderTicketVo.getNumber() - orderTicketVo.getRefundNumber();
if (limitTotal <= 0) { if (limitTotal <= 0) {
log.error("[getRandomRewardCode] 用户订单购买数量错误, orderId: {}.", vo.getOrderTicketVo().getOrderTicketsId()); log.error("[getRandomRewardCode] 用户订单购买数量错误, orderId: {}.", orderTicketVo.getOrderTicketsId());
return Collections.emptyList(); return Collections.emptyList();
} }
...@@ -173,7 +371,7 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -173,7 +371,7 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
LambdaQueryWrapper<KylinRewardCode> lambdaQueryWrapper = new QueryWrapper<KylinRewardCode>().lambda() LambdaQueryWrapper<KylinRewardCode> lambdaQueryWrapper = new QueryWrapper<KylinRewardCode>().lambda()
.eq(KylinRewardCode::getLuckyBagId, luckyBagId) .eq(KylinRewardCode::getLuckyBagId, luckyBagId)
.eq(KylinRewardCode::getState, 1) .eq(KylinRewardCode::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue())
.last(true, " limit " + limitTotal); .last(true, " limit " + limitTotal);
//2. 搜索未分配的兑换码 //2. 搜索未分配的兑换码
List<KylinRewardCode> rewardCodes = kylinRewardCodeMapper.selectList(lambdaQueryWrapper); List<KylinRewardCode> rewardCodes = kylinRewardCodeMapper.selectList(lambdaQueryWrapper);
...@@ -187,7 +385,6 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -187,7 +385,6 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
} }
//3. 写入 //3. 写入
final KylinOrderTicketVo orderTicketVo = vo.getOrderTicketVo();
List<KylinRewardUser> rewardUsers = new ArrayList<>(limitTotal); List<KylinRewardUser> rewardUsers = new ArrayList<>(limitTotal);
try { try {
...@@ -201,7 +398,8 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -201,7 +398,8 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
int inserted = kylinRewardUserMapper.insert(rewardUser); int inserted = kylinRewardUserMapper.insert(rewardUser);
if (inserted > 0) { if (inserted > 0) {
// 将兑换码状态更新为已领取 // 将兑换码状态更新为已领取
int updateResult = kylinRewardCodeMapper.updateByMid(lockedRewardCode.getMid(), 0); int updateResult = kylinRewardCodeMapper.updateByMid(lockedRewardCode.getMid(),
LuckyBagStatusEnum.AVAILABLE_STATUS_UNAVAILABLE.getValue());
if (updateResult <= 0) { if (updateResult <= 0) {
log.error("[getRandomRewardCode] 修改兑换码状态失败, luckyBagId: {}, orderId: {}, code: {}.", log.error("[getRandomRewardCode] 修改兑换码状态失败, luckyBagId: {}, orderId: {}, code: {}.",
luckyBagId, orderTicketVo.getOrderTicketsId(), lockedRewardCode.getCode()); luckyBagId, orderTicketVo.getOrderTicketsId(), lockedRewardCode.getCode());
...@@ -234,9 +432,9 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -234,9 +432,9 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
user.setOrderId(orderId); user.setOrderId(orderId);
user.setOrderTicketEntitiesId(orderTicketEntitiesId); user.setOrderTicketEntitiesId(orderTicketEntitiesId);
user.setCode(code); user.setCode(code);
user.setState(1); user.setState(LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
user.setCreatedAt(LocalDateTime.now()); user.setCreatedAt(LocalDateTime.now());
user.setUpdatedAt(LocalDateTime.now()); // user.setUpdatedAt(LocalDateTime.now());
return user; return user;
} }
...@@ -261,4 +459,48 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService { ...@@ -261,4 +459,48 @@ public class KylinLuckyBagServiceImpl implements IKylinLuckyBagService {
}); });
return activityVos; return activityVos;
} }
/**
* 校验手机号是否有权限验码
*
* @param mobile
* @param luckyBagId
* @return
*/
private boolean checkScopeByMobile(String mobile, String luckyBagId) {
if (StringUtil.isBlank(mobile)) {
log.info("mobile is blank.");
return false;
}
LambdaQueryWrapper<KylinLuckyBagScope> queryWrapper = new QueryWrapper<KylinLuckyBagScope>().lambda()
.eq(KylinLuckyBagScope::getMobile, mobile)
.eq(KylinLuckyBagScope::getLuckyBagId, luckyBagId)
.eq(KylinLuckyBagScope::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
KylinLuckyBagScope kylinLuckyBagScope = kylinLuckyBagScopeMapper.selectOne(queryWrapper);
return kylinLuckyBagScope != null;
}
/**
* 判断是否满足发放福利条件
*
* @param orderTicketVo 订单票务信息对象
* @return 是否满足条件
*/
private boolean isEligibleForWelfare(KylinOrderTicketVo orderTicketVo) {
if (orderTicketVo == null) {
log.info("[isEligibleForWelfare] 订单信息为空.");
return false;
}
Integer status = orderTicketVo.getStatus();
Integer payStatus = orderTicketVo.getPayStatus();
Integer number = orderTicketVo.getNumber();
Integer refundNumber = orderTicketVo.getRefundNumber();
log.info("[isEligibleForWelfare] 订单信息, status: {}, payStatus: {}, number: {}, refundNumber: {}.",
status, payStatus, number, refundNumber);
return (status != null && (status.equals(1) || status.equals(6))) &&
(payStatus != null && payStatus.equals(1)) &&
(number != null && refundNumber != null && (number - refundNumber) > 0);
}
} }
...@@ -13,6 +13,7 @@ import com.liquidnet.service.goblin.dto.manage.vo.GoblinGoodsAnticipateValueVo; ...@@ -13,6 +13,7 @@ import com.liquidnet.service.goblin.dto.manage.vo.GoblinGoodsAnticipateValueVo;
import com.liquidnet.service.goblin.dto.vo.*; import com.liquidnet.service.goblin.dto.vo.*;
import com.liquidnet.service.kylin.constant.KylinRedisConst; import com.liquidnet.service.kylin.constant.KylinRedisConst;
import com.liquidnet.service.kylin.constant.KylinTableStatusConst; import com.liquidnet.service.kylin.constant.KylinTableStatusConst;
import com.liquidnet.service.kylin.constant.LuckyBagStatusEnum;
import com.liquidnet.service.kylin.dao.KylinTicketActive; import com.liquidnet.service.kylin.dao.KylinTicketActive;
import com.liquidnet.service.kylin.dto.vo.KylinApiCameraDevicesVo; import com.liquidnet.service.kylin.dto.vo.KylinApiCameraDevicesVo;
import com.liquidnet.service.kylin.dto.vo.KylinPerformanceSubscribeUpushVo; import com.liquidnet.service.kylin.dto.vo.KylinPerformanceSubscribeUpushVo;
...@@ -1624,7 +1625,7 @@ public class DataUtils { ...@@ -1624,7 +1625,7 @@ public class DataUtils {
// 从数据库查询 状态为可用的 // 从数据库查询 状态为可用的
LambdaQueryWrapper<KylinLuckyBagActivity> lambdaQueryWrapper = new QueryWrapper<KylinLuckyBagActivity>() LambdaQueryWrapper<KylinLuckyBagActivity> lambdaQueryWrapper = new QueryWrapper<KylinLuckyBagActivity>()
.lambda() .lambda()
.eq(KylinLuckyBagActivity::getState, 1) .eq(KylinLuckyBagActivity::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue())
.orderByDesc(KylinLuckyBagActivity::getSort); .orderByDesc(KylinLuckyBagActivity::getSort);
List<KylinLuckyBagActivity> bagActivities = kylinLuckyBagActivityMapper.selectList(lambdaQueryWrapper); List<KylinLuckyBagActivity> bagActivities = kylinLuckyBagActivityMapper.selectList(lambdaQueryWrapper);
setKylinLuckyBagActivityList(bagActivities); setKylinLuckyBagActivityList(bagActivities);
...@@ -1656,7 +1657,7 @@ public class DataUtils { ...@@ -1656,7 +1657,7 @@ public class DataUtils {
// 从数据库查询 状态为可用的 // 从数据库查询 状态为可用的
LambdaQueryWrapper<KylinLuckyBag> lambdaQueryWrapper = new QueryWrapper<KylinLuckyBag>() LambdaQueryWrapper<KylinLuckyBag> lambdaQueryWrapper = new QueryWrapper<KylinLuckyBag>()
.lambda() .lambda()
.eq(KylinLuckyBag::getState, 1); .eq(KylinLuckyBag::getState, LuckyBagStatusEnum.AVAILABLE_STATUS_AVAILABLE.getValue());
List<KylinLuckyBag> bagActivities = kylinLuckyBagMapper.selectList(lambdaQueryWrapper); List<KylinLuckyBag> bagActivities = kylinLuckyBagMapper.selectList(lambdaQueryWrapper);
setKylinLuckyBagList(bagActivities); setKylinLuckyBagList(bagActivities);
return bagActivities; return bagActivities;
...@@ -1686,8 +1687,7 @@ public class DataUtils { ...@@ -1686,8 +1687,7 @@ public class DataUtils {
LambdaQueryWrapper<KylinRewardUser> lambdaQueryWrapper = new QueryWrapper<KylinRewardUser>().lambda() LambdaQueryWrapper<KylinRewardUser> lambdaQueryWrapper = new QueryWrapper<KylinRewardUser>().lambda()
.eq(KylinRewardUser::getUid, uid) .eq(KylinRewardUser::getUid, uid)
.eq(KylinRewardUser::getOrderId, orderId) .eq(KylinRewardUser::getOrderId, orderId)
.eq(KylinRewardUser::getLuckyBagId, luckyBagId) .eq(KylinRewardUser::getLuckyBagId, luckyBagId);
.eq(KylinRewardUser::getState, 1);
return kylinRewardUserMapper.selectList(lambdaQueryWrapper); return kylinRewardUserMapper.selectList(lambdaQueryWrapper);
} }
} }
40001=登录信息有误 40001=\u767B\u5F55\u4FE1\u606F\u6709\u8BEF
40002=账号已在另一台设备登录 40002=\u8D26\u53F7\u5DF2\u5728\u53E6\u4E00\u53F0\u8BBE\u5907\u767B\u5F55
40003=登录已过期 40003=\u767B\u5F55\u5DF2\u8FC7\u671F
# ------------------------ 4开头错误码作系统保留 # ------------------------ 4\u5F00\u5934\u9519\u8BEF\u7801\u4F5C\u7CFB\u7EDF\u4FDD\u7559
#APP ERROR #APP ERROR
20001=验证码发送失败 20001=\u9A8C\u8BC1\u7801\u53D1\u9001\u5931\u8D25
20002=验证码错误,请重新输入 20002=\u9A8C\u8BC1\u7801\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u8F93\u5165
20003=无权查看 20003=\u65E0\u6743\u67E5\u770B
20004=参数错误 20004=\u53C2\u6570\u9519\u8BEF
20005=手机号获取失败,请更换登录方式 20005=\u624B\u673A\u53F7\u83B7\u53D6\u5931\u8D25\uFF0C\u8BF7\u66F4\u6362\u767B\u5F55\u65B9\u5F0F
20006=第三方账号未注册 20006=\u7B2C\u4E09\u65B9\u8D26\u53F7\u672A\u6CE8\u518C
20007=数量错误 20007=\u6570\u91CF\u9519\u8BEF
20008=无权购买 20008=\u65E0\u6743\u8D2D\u4E70
20009=非会员用户暂不可购买 20009=\u975E\u4F1A\u5458\u7528\u6237\u6682\u4E0D\u53EF\u8D2D\u4E70
20010=当前不可购买 20010=\u5F53\u524D\u4E0D\u53EF\u8D2D\u4E70
20011=未开始售卖 20011=\u672A\u5F00\u59CB\u552E\u5356
20012=售卖已结束 20012=\u552E\u5356\u5DF2\u7ED3\u675F
20013=已超过快递票截止时间 20013=\u5DF2\u8D85\u8FC7\u5FEB\u9012\u7968\u622A\u6B62\u65F6\u95F4
20014=快递票未填写收货地址 20014=\u5FEB\u9012\u7968\u672A\u586B\u5199\u6536\u8D27\u5730\u5740
20015=入场人数量错误 20015=\u5165\u573A\u4EBA\u6570\u91CF\u9519\u8BEF
20016=库存不足 20016=\u5E93\u5B58\u4E0D\u8DB3
20017=年龄不符合 20017=\u5E74\u9F84\u4E0D\u7B26\u5408
20018=下单失败 20018=\u4E0B\u5355\u5931\u8D25
20019=申请失败 20019=\u7533\u8BF7\u5931\u8D25
20020=当前状态不可撤回 20020=\u5F53\u524D\u72B6\u6001\u4E0D\u53EF\u64A4\u56DE
20021=退款金额不能为0 20021=\u9000\u6B3E\u91D1\u989D\u4E0D\u80FD\u4E3A0
20022=申请金额不得小于0 20022=\u7533\u8BF7\u91D1\u989D\u4E0D\u5F97\u5C0F\u4E8E0
20023=请求频繁 20023=\u8BF7\u6C42\u9891\u7E41
20024=订单不存在 20024=\u8BA2\u5355\u4E0D\u5B58\u5728
20025=订单已支付 20025=\u8BA2\u5355\u5DF2\u652F\u4ED8
20026=订单已关闭 20026=\u8BA2\u5355\u5DF2\u5173\u95ED
20028=订单已失效 20028=\u8BA2\u5355\u5DF2\u5931\u6548
20027=您已支付请刷新再试 20027=\u60A8\u5DF2\u652F\u4ED8\u8BF7\u5237\u65B0\u518D\u8BD5
20029=未选择支付方式 20029=\u672A\u9009\u62E9\u652F\u4ED8\u65B9\u5F0F
20030=查看失败 20030=\u67E5\u770B\u5931\u8D25
#APP JDM #APP JDM
20201= 20201=
# 专业版APP # \u4E13\u4E1A\u7248APP
20601=账号不存在 20601=\u8D26\u53F7\u4E0D\u5B58\u5728
20602=密码错误 20602=\u5BC6\u7801\u9519\u8BEF
20603= 20603=
20604= 20604=
20605= 20605=
20606=当前账号无关联演出数据 20606=\u5F53\u524D\u8D26\u53F7\u65E0\u5173\u8054\u6F14\u51FA\u6570\u636E
20607=当前账号未关联当前演出 20607=\u5F53\u524D\u8D26\u53F7\u672A\u5173\u8054\u5F53\u524D\u6F14\u51FA
20608=当前演出还未开放下载 20608=\u5F53\u524D\u6F14\u51FA\u8FD8\u672A\u5F00\u653E\u4E0B\u8F7D
# 演出 # \u6F14\u51FA
20700=演出详情获取失败 20700=\u6F14\u51FA\u8BE6\u60C5\u83B7\u53D6\u5931\u8D25
20701=巡演获取失败 20701=\u5DE1\u6F14\u83B7\u53D6\u5931\u8D25
20702=获取演出场次票种失败 20702=\u83B7\u53D6\u6F14\u51FA\u573A\u6B21\u7968\u79CD\u5931\u8D25
20703=获取支付前详情失败 20703=\u83B7\u53D6\u652F\u4ED8\u524D\u8BE6\u60C5\u5931\u8D25
#\u798F\u888B
20800=\u5151\u6362\u7801\u65E0\u6548
20801=\u8BA2\u5355\u4E0D\u5B58\u5728
20802=\u5151\u6362\u7801\u5DF2\u88AB\u4F7F\u7528
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