票务核销接口

This commit is contained in:
yxz 2024-12-02 15:51:45 +08:00
parent ec840a0781
commit f8b4ebe394
14 changed files with 188 additions and 53 deletions

View File

@ -21,7 +21,7 @@ public class ZTicketVerificationAuth extends Model<ZTicketVerificationAuth> {
// 权限ID
@TableId(type = IdType.ASSIGN_ID)
private String authId;
private Long authId;
// 用户ID
private Integer memberId;
// 演出ID

View File

@ -31,7 +31,7 @@ public class ZTicketVerificationRecords extends Model<ZTicketVerificationRecords
// 演出ID
private Long showId;
// 核销人用户ID
private Long writeOffUserId;
private Integer writeOffUserId;
// 创建时间
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

View File

@ -28,9 +28,9 @@ public class ZTicketVerificationAuthController {
return R.success(zTicketVerificationAuthService.getList());
}
@GetMapping("page")
@ApiOperation(value = "分页查询")
public R page(Page page) {
return R.success(zTicketVerificationAuthService.getPage(page));
@ApiOperation(value = "分页查询该演出的核销人")
public R page(Page page,@RequestParam Long showId) {
return R.success(zTicketVerificationAuthService.getPage(page,showId));
}
@GetMapping("{Id}")

View File

@ -15,7 +15,7 @@ import java.util.List;
*/
public interface ZTicketVerificationAuthService extends IService<ZTicketVerificationAuth> {
List<ZTicketVerificationAuth> getList();
IPage<ZTicketVerificationAuth> getPage(Page page);
IPage<ZTicketVerificationAuth> getPage(Page page,Long showId);
ZTicketVerificationAuth getByZTicketVerificationAuthId(Integer id);
ZTicketVerificationAuth add(ZTicketVerificationAuth zTicketVerificationAuth);

View File

@ -4,13 +4,18 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cpop.nftmeta.admin.service.ZMemberService;
import com.cpop.nftmeta.admin.vo.TicketVerificationAuthVO;
import com.cpop.nftmeta.common.entity.ZMember;
import com.cpop.nftmeta.common.entity.ZTicketVerificationAuth;
import com.cpop.nftmeta.admin.mapper.ZTicketVerificationAuthMapper;
import com.cpop.nftmeta.admin.service.ZTicketVerificationAuthService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.stream.Collectors;
/**
* 门票核销权限表
@ -19,15 +24,31 @@ import java.util.List;
*/
@Service
public class ZTicketVerificationAuthServiceImpl extends ServiceImpl<ZTicketVerificationAuthMapper,ZTicketVerificationAuth> implements ZTicketVerificationAuthService {
@Autowired
private ZMemberService zMemberService;
@Override
public List<ZTicketVerificationAuth> getList() {
return this.list();
}
@Override
public IPage getPage(Page page) {
public IPage getPage(Page page,Long showId) {
LambdaQueryWrapper<ZTicketVerificationAuth> lambdaQueryWrapper=new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ZTicketVerificationAuth::getShowId,showId);
Page authPage = this.page(page, lambdaQueryWrapper);
List<ZTicketVerificationAuth> records = authPage.getRecords();
// 用户名 手机号 id
return this.page(page, lambdaQueryWrapper);
List<TicketVerificationAuthVO> authVOS = records.stream().map(e -> {
TicketVerificationAuthVO vo = new TicketVerificationAuthVO();
vo.setAuthId(e.getAuthId());
ZMember member = zMemberService.getById(e.getMemberId());
if (member != null) {
vo.setNickname(member.getNickname());
vo.setPhone(member.getUsername());
}
return vo;
}).collect(Collectors.toList());
authPage.setRecords(authVOS);
return authPage;
}
@Override
public ZTicketVerificationAuth getByZTicketVerificationAuthId(@NotNull(message = "Id不能为空") Integer id) {

View File

@ -0,0 +1,17 @@
package com.cpop.nftmeta.admin.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @Version: 1.0
* @since: 2024/12/2
* @author: yxz
*/
@Data
@ApiModel(description = "核销权限VO")
public class TicketVerificationAuthVO {
private Long authId;
private String nickname;
private String phone;
}

View File

@ -4,6 +4,8 @@ import cn.hutool.core.img.ImgUtil;
import cn.hutool.extra.qrcode.QrCodeUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cpop.nftmeta.api.dto.RealnameDTO;
import com.cpop.nftmeta.api.dto.TicketRealnameDTO;
import com.cpop.nftmeta.api.service.ZShowService;
import com.cpop.nftmeta.api.service.ZTicketTierService;
import com.cpop.nftmeta.api.vo.TicketFolderVO;
@ -132,6 +134,20 @@ public class ZTicketFolderController {
}
/**
* 实名认证
*
* @param ticketRealnameDTO 机票实名制
* @return {@link R }
* @author yxz
* @since 2024/12/02
*/
@ApiOperation(value = "实名认证")
@PostMapping("/real-name")
public R realNameTicket(@RequestBody TicketRealnameDTO ticketRealnameDTO) {
return zTicketFolderService.realNameTicket(ticketRealnameDTO);
}
/**
* 核销门票
*

View File

@ -0,0 +1,17 @@
package com.cpop.nftmeta.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Version: 1.0
* @since: 2024/12/2
* @author: yxz
*/
@Data
@ApiModel("门票实名信息DTO")
public class TicketRealnameDTO extends RealnameDTO {
@ApiModelProperty("门票ID")
private Long folderId;
}

View File

@ -3,6 +3,7 @@ package com.cpop.nftmeta.api.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.cpop.nftmeta.api.dto.ExchangeTicketDTO;
import com.cpop.nftmeta.common.entity.ZTicketUniqueCode;
import org.apache.ibatis.annotations.Param;
/**
* 门票唯一标识表
@ -13,10 +14,11 @@ public interface ZTicketUniqueCodeMapper extends BaseMapper<ZTicketUniqueCode> {
/**
* 检查重复观演人
*
* @param exchangeTicketDTO 兑换机票
* @param showId 显示id
* @param idNumber 身份证号码
* @return {@link Integer }
* @author yxz
* @since 2024/11/27
*/
Integer checkRepeatAudience(ExchangeTicketDTO exchangeTicketDTO);
Integer checkRepeatAudience(@Param("showId") Long showId, @Param("idNumber") String idNumber);
}

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.cpop.nftmeta.api.dto.RealnameDTO;
import com.cpop.nftmeta.api.dto.TicketRealnameDTO;
import com.cpop.nftmeta.common.entity.ZTicketFolder;
import com.cpop.nftmeta.common.vo.R;
@ -32,4 +34,14 @@ public interface ZTicketFolderService extends IService<ZTicketFolder> {
* @since 2024/11/29
*/
R verificationTicket(String ticketData);
/**
* 实名认证
*
* @param realnameDTO realname dto
* @return {@link R }
* @author yxz
* @since 2024/12/02
*/
R realNameTicket(TicketRealnameDTO realnameDTO);
}

View File

@ -140,6 +140,21 @@ public class ZTicketBlindCodeServiceImpl extends ServiceImpl<ZTicketBlindCodeMap
if (!ResultCode.SUCCESS.getCode().equals(code)){
return R.fail("未找到有效编码");
}
// 票档是否有效
LambdaQueryWrapper<ZTicketBlindCode> blindCodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
blindCodeLambdaQueryWrapper.eq(ZTicketBlindCode::getUniqudeCode, exchangeBlindDTO.getUniqueCode());
ZTicketBlindCode zTicketBlindCode = this.getOne(blindCodeLambdaQueryWrapper);
R result= zTicketTierService.checkTicketTierEnable(exchangeBlindDTO.getTicketTierId(), zTicketBlindCode.getFirstShowId());
if (result.getCode().equals(ResultCode.FAIL.getCode())){
return result;
}
// 同一身份证只允许绑定一张票
ExchangeTicketDTO exchangeTicketDTO = new ExchangeTicketDTO();
BeanUtils.copyProperties(exchangeBlindDTO, exchangeTicketDTO);
Integer count = zTicketUniqueCodeMapper.checkRepeatAudience(zTicketBlindCode.getFirstShowId(),exchangeBlindDTO.getIdNumber());
if (ObjectUtil.isNotNull(count) && count > 0){
return R.fail("同一身份证只能绑定一张门票");
}
if ("prod".equals(env)){
// 检查实名信息
RealNameVerifyDTO realNameVerifyDTO = new RealNameVerifyDTO();
@ -150,21 +165,6 @@ public class ZTicketBlindCodeServiceImpl extends ServiceImpl<ZTicketBlindCodeMap
return R.fail("实名认证失败,请检查身份信息");
}
}
// 同一身份证只允许绑定一张票
ExchangeTicketDTO exchangeTicketDTO = new ExchangeTicketDTO();
BeanUtils.copyProperties(exchangeBlindDTO, exchangeTicketDTO);
Integer count = zTicketUniqueCodeMapper.checkRepeatAudience(exchangeTicketDTO);
if (ObjectUtil.isNotNull(count) && count > 0){
return R.fail("同一身份证只能绑定一张门票");
}
// 票档是否有效
LambdaQueryWrapper<ZTicketBlindCode> blindCodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
blindCodeLambdaQueryWrapper.eq(ZTicketBlindCode::getUniqudeCode, exchangeBlindDTO.getUniqueCode());
ZTicketBlindCode zTicketBlindCode = this.getOne(blindCodeLambdaQueryWrapper);
R result= zTicketTierService.checkTicketTierEnable(exchangeBlindDTO.getTicketTierId(), zTicketBlindCode.getFirstShowId());
if (result.getCode().equals(ResultCode.FAIL.getCode())){
return result;
}
// 兑换盲盒
LambdaQueryWrapper<ZTicketBlindCode> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ZTicketBlindCode::getUniqudeCode, exchangeBlindDTO.getUniqueCode());

View File

@ -7,16 +7,28 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cpop.nftmeta.api.dto.ExchangeTicketDTO;
import com.cpop.nftmeta.api.dto.RealnameDTO;
import com.cpop.nftmeta.api.dto.TicketRealnameDTO;
import com.cpop.nftmeta.api.mapper.ZTicketUniqueCodeMapper;
import com.cpop.nftmeta.api.service.ZTicketVerificationAuthService;
import com.cpop.nftmeta.api.service.ZTicketVerificationRecordsService;
import com.cpop.nftmeta.common.context.CUserInfo;
import com.cpop.nftmeta.common.context.UserContext;
import com.cpop.nftmeta.common.entity.ZTicketFolder;
import com.cpop.nftmeta.api.mapper.ZTicketFolderMapper;
import com.cpop.nftmeta.api.service.ZTicketFolderService;
import com.cpop.nftmeta.common.entity.ZTicketVerificationAuth;
import com.cpop.nftmeta.common.entity.ZTicketVerificationRecords;
import com.cpop.nftmeta.common.realname.RealNameVerifyDTO;
import com.cpop.nftmeta.common.realname.RealNameVerifyService;
import com.cpop.nftmeta.common.utils.AESUtils;
import com.cpop.nftmeta.common.vo.R;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.validation.constraints.NotNull;
import java.util.List;
@ -31,6 +43,11 @@ import java.util.List;
public class ZTicketFolderServiceImpl extends ServiceImpl<ZTicketFolderMapper,ZTicketFolder> implements ZTicketFolderService {
private final ZTicketVerificationAuthService zTicketVerificationAuthService;
private final AESUtils aesUtils;
private final ZTicketVerificationRecordsService zTicketVerificationRecordsService;
private final RealNameVerifyService realNameVerifyService;
private final ZTicketUniqueCodeMapper zTicketUniqueCodeMapper;
@Value("${spring.profiles.active}")
private String env;
@Override
public List<ZTicketFolder> getList() {
return this.list();
@ -60,6 +77,41 @@ public class ZTicketFolderServiceImpl extends ServiceImpl<ZTicketFolderMapper,ZT
return this.removeById(id);
}
/**
* 实名认证
*
* @param realnameDTO realname dto
* @return {@link R }
* @author yxz
* @since 2024/12/02
*/
@Override
public R realNameTicket(TicketRealnameDTO realnameDTO) {
ZTicketFolder ticket = this.getById(realnameDTO.getFolderId());
if (ticket != null && (ticket.getAudienceName() != null || ticket.getIdNumber() != null)){
return R.fail("该门票已实名认证,请勿重复认证");
}
if ("prod".equals(env)){
// 检查实名信息
RealNameVerifyDTO realNameVerifyDTO = new RealNameVerifyDTO();
realNameVerifyDTO.setRealName(realnameDTO.getAudienceName());
realNameVerifyDTO.setIdCard(realnameDTO.getIdNumber());
Boolean aBoolean = realNameVerifyService.verify(realNameVerifyDTO);
if (!aBoolean){
return R.fail("实名认证失败,请检查身份信息");
}
}
// 同一身份证只允许绑定一张票
Integer count = zTicketUniqueCodeMapper.checkRepeatAudience(ticket.getShowId(),realnameDTO.getIdNumber());
if (ObjectUtil.isNotNull(count) && count > 0){
return R.fail("同一身份证只能绑定一张门票");
}
// 绑定实名信息
BeanUtils.copyProperties(realnameDTO, ticket);
boolean b = this.updateById(ticket);
return b ? R.success("实名认证成功") : R.fail("实名认证失败");
}
/**
* 核销门票
*
@ -69,33 +121,31 @@ public class ZTicketFolderServiceImpl extends ServiceImpl<ZTicketFolderMapper,ZT
* @since 2024/11/29
*/
@Override
@Transactional
public R verificationTicket(String ticketData) {
// 提取票据数据
String decrypt = aesUtils.decrypt(ticketData);
String[] parts = decrypt.split(":");
Long userId = Long.parseLong(parts[0]);
Long memberId = Long.parseLong(parts[0]);
Long folderId = Long.parseLong(parts[1]);
// 核销
ZTicketFolder ticketFolderEntity = this.getBaseMapper().selectOne(new QueryWrapper<ZTicketFolder>().eq("member_id", userId).eq("folder_id", folderId).eq("status",0));
/*CUserInfo userInfo = UserContext.getUserInfo();
zTicketVerificationAuthService.getOne()
// 验证权限
if (ObjectUtil.isNull(SecurityUtils.getUser().getAllowWriteOff()) || SecurityUtils.getUser().getAllowWriteOff() != 1) {{
return R.failed("无核销权限,核销失败");
}}*/
/*if (ObjectUtil.isNull(ticketFolderEntity)) {
return R.failed("未找到有效票据,核销失败");
ZTicketFolder ticketFolderEntity = this.getBaseMapper().selectOne(new QueryWrapper<ZTicketFolder>().eq("member_id", memberId).eq("folder_id", folderId).eq("status",0));
if (ObjectUtil.isNull(ticketFolderEntity)) {
return R.fail("未找到有效票据,核销失败");
}
// 验证权限
CUserInfo userInfo = UserContext.getUserInfo();
ZTicketVerificationAuth auth = zTicketVerificationAuthService.getOne(new QueryWrapper<ZTicketVerificationAuth>().eq("member_id", userInfo.getUserId()).eq("show_id", ticketFolderEntity.getShowId()));
if (auth == null){
return R.fail("无核销权限,核销失败");
}
// 核销
ticketFolderEntity.setStatus(1);
boolean b = this.updateById(ticketFolderEntity);
// 核销记录
VerificationRecordsEntity verificationRecords = new VerificationRecordsEntity();
ZTicketVerificationRecords verificationRecords = new ZTicketVerificationRecords();
BeanUtil.copyProperties(ticketFolderEntity, verificationRecords);
verificationRecords.setWriteOffUserId(SecurityUtils.getUser().getId());
verificationRecordsService.save(verificationRecords);
return b ? R.ok("核销成功") : R.failed("核销失败");*/
return null;
verificationRecords.setWriteOffUserId(userInfo.getUserId());
zTicketVerificationRecordsService.save(verificationRecords);
return b ? R.success("核销成功") : R.fail("核销失败");
}
}

View File

@ -102,6 +102,14 @@ public class ZTicketUniqueCodeServiceImpl extends ServiceImpl<ZTicketUniqueCodeM
if (!ResultCode.SUCCESS.getCode().equals(code)){
return R.fail("未找到有效编码");
}
// 同一身份证只允许绑定一张票
LambdaQueryWrapper<ZTicketUniqueCode> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ZTicketUniqueCode::getUniqudeCode, exchangeTicketDTO.getUniqueCode());
ZTicketUniqueCode zTicketUniqueCode = this.getOne(queryWrapper);
Integer count = zTicketUniqueCodeMapper.checkRepeatAudience(zTicketUniqueCode.getShowId(),exchangeTicketDTO.getIdNumber());
if (ObjectUtil.isNotNull(count) && count > 0){
return R.fail("同一身份证只能绑定一张门票");
}
if ("prod".equals(env)){
// 检查实名信息
RealNameVerifyDTO realNameVerifyDTO = new RealNameVerifyDTO();
@ -112,15 +120,7 @@ public class ZTicketUniqueCodeServiceImpl extends ServiceImpl<ZTicketUniqueCodeM
return R.fail("实名认证失败,请检查身份信息");
}
}
// 同一身份证只允许绑定一张票
Integer count = zTicketUniqueCodeMapper.checkRepeatAudience(exchangeTicketDTO);
if (ObjectUtil.isNotNull(count) && count > 0){
return R.fail("同一身份证只能绑定一张门票");
}
// 兑换门票
LambdaQueryWrapper<ZTicketUniqueCode> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ZTicketUniqueCode::getUniqudeCode, exchangeTicketDTO.getUniqueCode());
ZTicketUniqueCode zTicketUniqueCode = this.getOne(queryWrapper);
zTicketUniqueCode.setStatus(1);
this.update(zTicketUniqueCode);
// 插入票夹

View File

@ -22,7 +22,7 @@
SELECT count(tf.folder_id) FROM `z_ticket_folder` tf
INNER JOIN z_ticket_unique_code tuc
ON tf.show_id = tuc.show_id
WHERE tuc.uniqude_code = #{uniqueCode}
WHERE tuc.show_id = #{showId}
AND tf.id_number = #{idNumber}
</select>
</mapper>