diff --git a/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationAuth.java b/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationAuth.java index e5cf629..f4e7e13 100644 --- a/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationAuth.java +++ b/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationAuth.java @@ -21,7 +21,7 @@ public class ZTicketVerificationAuth extends Model { // 权限ID @TableId(type = IdType.ASSIGN_ID) - private String authId; + private Long authId; // 用户ID private Integer memberId; // 演出ID diff --git a/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationRecords.java b/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationRecords.java index 60eba62..585a1cb 100644 --- a/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationRecords.java +++ b/java/common/src/main/java/com/cpop/nftmeta/common/entity/ZTicketVerificationRecords.java @@ -31,7 +31,7 @@ public class ZTicketVerificationRecords extends Model { List getList(); - IPage getPage(Page page); + IPage getPage(Page page,Long showId); ZTicketVerificationAuth getByZTicketVerificationAuthId(Integer id); ZTicketVerificationAuth add(ZTicketVerificationAuth zTicketVerificationAuth); diff --git a/java/nft-admin/src/main/java/com/cpop/nftmeta/admin/service/impl/ZTicketVerificationAuthServiceImpl.java b/java/nft-admin/src/main/java/com/cpop/nftmeta/admin/service/impl/ZTicketVerificationAuthServiceImpl.java index 8ac4fbf..4178dd3 100644 --- a/java/nft-admin/src/main/java/com/cpop/nftmeta/admin/service/impl/ZTicketVerificationAuthServiceImpl.java +++ b/java/nft-admin/src/main/java/com/cpop/nftmeta/admin/service/impl/ZTicketVerificationAuthServiceImpl.java @@ -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 implements ZTicketVerificationAuthService { + @Autowired + private ZMemberService zMemberService; @Override public List getList() { return this.list(); } @Override - public IPage getPage(Page page) { + public IPage getPage(Page page,Long showId) { LambdaQueryWrapper lambdaQueryWrapper=new LambdaQueryWrapper<>(); - // 用户名 手机号 id - return this.page(page, lambdaQueryWrapper); + lambdaQueryWrapper.eq(ZTicketVerificationAuth::getShowId,showId); + Page authPage = this.page(page, lambdaQueryWrapper); + List records = authPage.getRecords(); + // 用户名 手机号 id + List 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) { diff --git a/java/nft-admin/src/main/java/com/cpop/nftmeta/admin/vo/TicketVerificationAuthVO.java b/java/nft-admin/src/main/java/com/cpop/nftmeta/admin/vo/TicketVerificationAuthVO.java new file mode 100644 index 0000000..9eddc47 --- /dev/null +++ b/java/nft-admin/src/main/java/com/cpop/nftmeta/admin/vo/TicketVerificationAuthVO.java @@ -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; +} diff --git a/java/nft-api/src/main/java/com/cpop/nftmeta/api/controller/ZTicketFolderController.java b/java/nft-api/src/main/java/com/cpop/nftmeta/api/controller/ZTicketFolderController.java index 5153898..fc34746 100644 --- a/java/nft-api/src/main/java/com/cpop/nftmeta/api/controller/ZTicketFolderController.java +++ b/java/nft-api/src/main/java/com/cpop/nftmeta/api/controller/ZTicketFolderController.java @@ -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); + } + /** * 核销门票 * diff --git a/java/nft-api/src/main/java/com/cpop/nftmeta/api/dto/TicketRealnameDTO.java b/java/nft-api/src/main/java/com/cpop/nftmeta/api/dto/TicketRealnameDTO.java new file mode 100644 index 0000000..31a44f1 --- /dev/null +++ b/java/nft-api/src/main/java/com/cpop/nftmeta/api/dto/TicketRealnameDTO.java @@ -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; +} diff --git a/java/nft-api/src/main/java/com/cpop/nftmeta/api/mapper/ZTicketUniqueCodeMapper.java b/java/nft-api/src/main/java/com/cpop/nftmeta/api/mapper/ZTicketUniqueCodeMapper.java index 1c20f70..a02265d 100644 --- a/java/nft-api/src/main/java/com/cpop/nftmeta/api/mapper/ZTicketUniqueCodeMapper.java +++ b/java/nft-api/src/main/java/com/cpop/nftmeta/api/mapper/ZTicketUniqueCodeMapper.java @@ -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 { /** * 检查重复观演人 * - * @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); } diff --git a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/ZTicketFolderService.java b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/ZTicketFolderService.java index 4116128..b77d47c 100644 --- a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/ZTicketFolderService.java +++ b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/ZTicketFolderService.java @@ -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 { * @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); } diff --git a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketBlindCodeServiceImpl.java b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketBlindCodeServiceImpl.java index 5f6071a..d516171 100644 --- a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketBlindCodeServiceImpl.java +++ b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketBlindCodeServiceImpl.java @@ -140,6 +140,21 @@ public class ZTicketBlindCodeServiceImpl extends ServiceImpl 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 0){ - return R.fail("同一身份证只能绑定一张门票"); - } - // 票档是否有效 - LambdaQueryWrapper 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 queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ZTicketBlindCode::getUniqudeCode, exchangeBlindDTO.getUniqueCode()); diff --git a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketFolderServiceImpl.java b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketFolderServiceImpl.java index fc76870..2539012 100644 --- a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketFolderServiceImpl.java +++ b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketFolderServiceImpl.java @@ -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 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 getList() { return this.list(); @@ -60,6 +77,41 @@ public class ZTicketFolderServiceImpl extends ServiceImpl 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().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().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().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("核销失败"); } } diff --git a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketUniqueCodeServiceImpl.java b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketUniqueCodeServiceImpl.java index 7a1d7d5..d6f4fd0 100644 --- a/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketUniqueCodeServiceImpl.java +++ b/java/nft-api/src/main/java/com/cpop/nftmeta/api/service/impl/ZTicketUniqueCodeServiceImpl.java @@ -102,6 +102,14 @@ public class ZTicketUniqueCodeServiceImpl extends ServiceImpl 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 0){ - return R.fail("同一身份证只能绑定一张门票"); - } // 兑换门票 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(ZTicketUniqueCode::getUniqudeCode, exchangeTicketDTO.getUniqueCode()); - ZTicketUniqueCode zTicketUniqueCode = this.getOne(queryWrapper); zTicketUniqueCode.setStatus(1); this.update(zTicketUniqueCode); // 插入票夹 diff --git a/java/nft-api/src/main/resources/mapper/ZTicketUniqueCodeMapper.xml b/java/nft-api/src/main/resources/mapper/ZTicketUniqueCodeMapper.xml index 46a3b99..153a53e 100644 --- a/java/nft-api/src/main/resources/mapper/ZTicketUniqueCodeMapper.xml +++ b/java/nft-api/src/main/resources/mapper/ZTicketUniqueCodeMapper.xml @@ -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}