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

Commit 55e30f76 authored by 姜秀龙's avatar 姜秀龙

Merge branch 'dev-doudou-v2' into 'master'

Dev doudou v2

See merge request !390
parents 023567ed 87fc550a
...@@ -63,6 +63,7 @@ public class SweetConstant { ...@@ -63,6 +63,7 @@ public class SweetConstant {
// doudou // doudou
public final static String REDIS_KEY_SWEET_DOUDOU_USER = "sweet:doudou:uid:"; public final static String REDIS_KEY_SWEET_DOUDOU_USER = "sweet:doudou:uid:";
public final static String REDIS_KEY_SWEET_DOUDOU_SCOPE_MOBILE = "sweet:doudou:scope:mobile:"; public final static String REDIS_KEY_SWEET_DOUDOU_SCOPE_MOBILE = "sweet:doudou:scope:mobile:";
public static final String REDIS_KEY_SWEET_DOUDOU_ACTIVE = "sweet:doudou:active";
// 城市投票活动 // 城市投票活动
public final static String REDIS_KEY_SWEET_CITY_VOTE_STAT_LIST = ":StatList"; public final static String REDIS_KEY_SWEET_CITY_VOTE_STAT_LIST = ":StatList";
public final static String REDIS_KEY_SWEET_CITY_VOTE_CITY_CODE = ":cityCode:"; public final static String REDIS_KEY_SWEET_CITY_VOTE_CITY_CODE = ":cityCode:";
......
...@@ -20,6 +20,10 @@ public class SweetDouDouCheckParam implements Serializable { ...@@ -20,6 +20,10 @@ public class SweetDouDouCheckParam implements Serializable {
@NotBlank(message = "doudouId不能为空") @NotBlank(message = "doudouId不能为空")
private String doudouId; private String doudouId;
@ApiModelProperty(position = 4, required = true, value = "activeId", example = "3189092902231364195328061")
@NotBlank(message = "activeId不能为空")
private String activeId;
@ApiModelProperty(position = 3, required = true, value = "用户ID", example = "937724050260131847782985") @ApiModelProperty(position = 3, required = true, value = "用户ID", example = "937724050260131847782985")
@NotBlank(message = "userId不能为空") @NotBlank(message = "userId不能为空")
private String userId; private String userId;
......
...@@ -21,15 +21,16 @@ public class SweetDouDouParam implements Serializable { ...@@ -21,15 +21,16 @@ public class SweetDouDouParam implements Serializable {
@NotBlank(message = "phone不能为空") @NotBlank(message = "phone不能为空")
private String phone; private String phone;
@ApiModelProperty(position = 12, required = true, value = "购买平台", example = "大麦") @ApiModelProperty(position = 12, required = true, value = "3442", example = "活动 ID")
@NotBlank(message = "platform不能为空") @NotBlank(message = "activeId不能为空")
private String platform; private String activeId;
@ApiModelProperty(position = 13, required = true, value = "购买订单号", example = "23424353477473") @ApiModelProperty(position = 13, required = true, value = "img", example = "图片地址")
@NotBlank(message = "orderCodee不能为空") @NotBlank(message = "imgUrl不能为空")
private String orderCode; private String imgUrl;
@ApiModelProperty(position = 14, required = true, value = "想给doudou说的话", example = "我爱你啦啦啦") @ApiModelProperty(position = 14, required = true, value = "想给doudou说的话", example = "我爱你啦啦啦")
private String mark; private String mark;
} }
...@@ -5,10 +5,12 @@ import com.liquidnet.service.base.ResponseDto; ...@@ -5,10 +5,12 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.entity.SweetDoudou; import com.liquidnet.service.sweet.entity.SweetDoudou;
import com.liquidnet.service.sweet.param.SweetDouDouCheckParam; import com.liquidnet.service.sweet.param.SweetDouDouCheckParam;
import com.liquidnet.service.sweet.param.SweetDouDouParam; import com.liquidnet.service.sweet.param.SweetDouDouParam;
import com.liquidnet.service.sweet.vo.SweetDouDouActiveVo;
import com.liquidnet.service.sweet.vo.SweetDouDouVo; import com.liquidnet.service.sweet.vo.SweetDouDouVo;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
/** /**
* <p> * <p>
...@@ -20,7 +22,7 @@ import javax.validation.Valid; ...@@ -20,7 +22,7 @@ import javax.validation.Valid;
*/ */
public interface ISweetDoudouService extends IService<SweetDoudou> { public interface ISweetDoudouService extends IService<SweetDoudou> {
ResponseDto<SweetDouDouVo> info(); ResponseDto<SweetDouDouVo> info(String activeId);
ResponseDto<SweetDouDouVo> create(@Valid SweetDouDouParam param); ResponseDto<SweetDouDouVo> create(@Valid SweetDouDouParam param);
...@@ -29,4 +31,8 @@ public interface ISweetDoudouService extends IService<SweetDoudou> { ...@@ -29,4 +31,8 @@ public interface ISweetDoudouService extends IService<SweetDoudou> {
ResponseDto<SweetDouDouVo> detail(SweetDouDouCheckParam param); ResponseDto<SweetDouDouVo> detail(SweetDouDouCheckParam param);
boolean winningUpload(MultipartFile file); boolean winningUpload(MultipartFile file);
ResponseDto<List<SweetDouDouActiveVo>> getActiveList();
ResponseDto<SweetDouDouActiveVo> getActiveDetail(String activeId);
} }
package com.liquidnet.service.sweet.vo;
import com.liquidnet.service.sweet.entity.SweetDoudouActive;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("SweetDouDouActiveVo")
public class SweetDouDouActiveVo implements Serializable, Cloneable {
@ApiModelProperty("doudou_id")
private String doudouId;
@ApiModelProperty("user_id")
private String userId;
@ApiModelProperty("活动ID")
private String activeId;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("活动详情")
private String details;
@ApiModelProperty("卡片背景图")
private String cardImages;
@ApiModelProperty("活动详情背景图")
private String detailImages;
@ApiModelProperty("活动详情URL")
private String targetUrl;
@ApiModelProperty("活动状态:2:进行中 3:已结束")
private Integer activeStatus;
@ApiModelProperty("状态 0未登记 1已登记 2未中签 3已中签 4已核销")
private Integer status;
private static final SweetDouDouActiveVo obj = new SweetDouDouActiveVo();
public static SweetDouDouActiveVo getNew() {
try {
return (SweetDouDouActiveVo) obj.clone();
} catch (CloneNotSupportedException e) {
return new SweetDouDouActiveVo();
}
}
public SweetDouDouActiveVo copy(SweetDoudouActive source) {
if (null == source) return this;
this.activeId = source.getActiveId();
this.title = source.getTitle();
this.cardImages = source.getCardImages();
this.detailImages = source.getDetailImages();
this.targetUrl = source.getTargetUrl();
this.details = source.getDetails();
return this;
}
}
...@@ -21,11 +21,11 @@ public class SweetDouDouVo implements Serializable, Cloneable { ...@@ -21,11 +21,11 @@ public class SweetDouDouVo implements Serializable, Cloneable {
@ApiModelProperty("观演人手机号") @ApiModelProperty("观演人手机号")
private String phone; private String phone;
@ApiModelProperty("购买平台") @ApiModelProperty("图片地址")
private String platform; private String imgUrl;
@ApiModelProperty("购买订单号") @ApiModelProperty("活动 ID")
private String orderCode; private String activeId;
@ApiModelProperty("想给doudou说的话") @ApiModelProperty("想给doudou说的话")
private String mark; private String mark;
......
...@@ -43,4 +43,10 @@ public class RedisKeyExpireConst { ...@@ -43,4 +43,10 @@ public class RedisKeyExpireConst {
// kylin:luckybag 过期时间30天 // kylin:luckybag 过期时间30天
public static final long KYLIN_LUCKY_BAG_EXPIRE = 30 * 24 * 60 * 60; public static final long KYLIN_LUCKY_BAG_EXPIRE = 30 * 24 * 60 * 60;
// sweet:douduo:active 过期时间30天
public static final long SWEET_DOUDOU_ACTIVE_EXPIRE = 30 * 24 * 60 * 60;
// sweet:doudou:scope:mobile 过期时间3天
public static final long SWEET_DOUDOU_SCOPE_MOBILE_EXPIRE = 3 * 24 * 60 * 60;
} }
package com.liquidnet.service.sweet.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
@Data
@EqualsAndHashCode(callSuper = false)
public class SweetDoudouActive {
private static final long serialVersionUID = 1L;
@TableId(value = "mid", type = IdType.AUTO)
private Long mid;
/**
* active_id
*/
private String activeId;
/**
* 标题
*/
private String title;
/**
* 活动详情
*/
private String details;
/**
* 卡片背景图
*/
private String cardImages;
/**
* 活动详情背景图
*/
private String detailImages;
/**
* 活动详情URL
*/
private String targetUrl;
/**
* 开始时间
*/
private String beginAt;
/**
* 结束时间
*/
private String endAt;
/**
* 排序,越大越靠前
*/
private Integer sort;
/**
* 状态 1可用 0不可用
*/
private Integer status;
/**
* 创建时间
*/
private LocalDateTime createdAt;
/**
* 更新时间
*/
private LocalDateTime updatedAt;
}
package com.liquidnet.service.sweet.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.liquidnet.service.sweet.entity.SweetDoudou;
import com.liquidnet.service.sweet.entity.SweetDoudouActive;
/**
* <p>
* doudou预约签名CD记录表 Mapper 接口
* </p>
*
* @author jiangxiulong
* @since 2025-06-04
*/
public interface SweetDoudouActiveMapper extends BaseMapper<SweetDoudouActive> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.liquidnet.service.sweet.mapper.SweetDoudouActiveMapper">
</mapper>
...@@ -20,6 +20,14 @@ CREATE TABLE `sweet_doudou` ...@@ -20,6 +20,14 @@ CREATE TABLE `sweet_doudou`
COLLATE utf8mb4_unicode_ci COLLATE utf8mb4_unicode_ci
ROW_FORMAT = DYNAMIC COMMENT 'doudou预约签名CD记录表'; ROW_FORMAT = DYNAMIC COMMENT 'doudou预约签名CD记录表';
alter table sweet_doudou
add active_id varchar(100) default '' not null comment '活动id' after order_code;
alter table sweet_doudou
add img_url varchar(255) default '' not null comment '订单截图 url' after active_id;
-- 20250604 doudou预约签名核验权限表 -- 20250604 doudou预约签名核验权限表
drop TABLE if exists `sweet_doudou_scope`; drop TABLE if exists `sweet_doudou_scope`;
CREATE TABLE `sweet_doudou_scope` CREATE TABLE `sweet_doudou_scope`
......
drop TABLE if exists `sweet_doudou_active`;
CREATE TABLE `sweet_doudou_active` (
`mid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`active_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT 'active_id',
`title` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '标题',
`details` varchar(1000) COLLATE utf8mb4_unicode_ci default '' COMMENT '活动详情/兑换说明',
`card_images` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '卡片背景图',
`detail_images` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动详情背景图',
`target_url` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '活动详情URL',
`begin_at` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '开始时间',
`end_at` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '结束时间',
`sort` tinyint(4) NOT NULL DEFAULT '1' COMMENT '排序,越大越靠前',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态 1可用 0不可用',
`created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`mid`),
UNIQUE KEY `active_id_ind` (`active_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='doudou活动表';
\ No newline at end of file
...@@ -5,6 +5,7 @@ import com.liquidnet.service.base.ResponseDto; ...@@ -5,6 +5,7 @@ import com.liquidnet.service.base.ResponseDto;
import com.liquidnet.service.sweet.param.SweetDouDouCheckParam; import com.liquidnet.service.sweet.param.SweetDouDouCheckParam;
import com.liquidnet.service.sweet.param.SweetDouDouParam; import com.liquidnet.service.sweet.param.SweetDouDouParam;
import com.liquidnet.service.sweet.service.ISweetDoudouService; import com.liquidnet.service.sweet.service.ISweetDoudouService;
import com.liquidnet.service.sweet.vo.SweetDouDouActiveVo;
import com.liquidnet.service.sweet.vo.SweetDouDouVo; import com.liquidnet.service.sweet.vo.SweetDouDouVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.validation.Valid; import javax.validation.Valid;
import java.util.List;
/** /**
* <p> * <p>
...@@ -29,10 +31,22 @@ public class SweetDoudouController { ...@@ -29,10 +31,22 @@ public class SweetDoudouController {
@Autowired @Autowired
private ISweetDoudouService iSweetDoudouService; private ISweetDoudouService iSweetDoudouService;
@GetMapping("/active/list")
@ApiOperation("获取活动列表")
public ResponseDto<List<SweetDouDouActiveVo>> getActiveList() {
return iSweetDoudouService.getActiveList();
}
@GetMapping("/active/detail")
@ApiOperation("获取活动详情")
public ResponseDto<SweetDouDouActiveVo> getActiveDetail(@RequestParam(value = "activeId") String activeId){
return iSweetDoudouService.getActiveDetail(activeId);
}
@GetMapping("") @GetMapping("")
@ApiOperation("获取用户预约详情") @ApiOperation("获取用户预约详情")
public ResponseDto<SweetDouDouVo> info() { public ResponseDto<SweetDouDouVo> info(@RequestParam(value = "activeId") String activeId) {
return iSweetDoudouService.info(); return iSweetDoudouService.info(activeId);
} }
@PostMapping("") @PostMapping("")
...@@ -41,6 +55,8 @@ public class SweetDoudouController { ...@@ -41,6 +55,8 @@ public class SweetDoudouController {
return iSweetDoudouService.create(param); return iSweetDoudouService.create(param);
} }
// ################################## 二维码核销 ###############################################
@PostMapping("/detail") @PostMapping("/detail")
@ApiOperation("核验-码详情") @ApiOperation("核验-码详情")
public ResponseDto<SweetDouDouVo> detail(@Valid @RequestBody SweetDouDouCheckParam param) { public ResponseDto<SweetDouDouVo> detail(@Valid @RequestBody SweetDouDouCheckParam param) {
......
...@@ -61,6 +61,9 @@ public class RedisDataUtils { ...@@ -61,6 +61,9 @@ public class RedisDataUtils {
private SweetIntegralActivityDrawMapper sweetIntegralActivityDrawMapper; private SweetIntegralActivityDrawMapper sweetIntegralActivityDrawMapper;
@Autowired @Autowired
private SweetDoudouScopeMapper sweetDoudouScopeMapper; private SweetDoudouScopeMapper sweetDoudouScopeMapper;
@Autowired
private SweetDoudouActiveMapper sweetDoudouActiveMapper;
@Autowired @Autowired
@Lazy @Lazy
private FeignSlimeApiClient feignSlimeApiClient; private FeignSlimeApiClient feignSlimeApiClient;
...@@ -462,12 +465,12 @@ public class RedisDataUtils { ...@@ -462,12 +465,12 @@ public class RedisDataUtils {
// doudou // doudou
public void setSweetDouDou(SweetDouDouVo vo) { public void setSweetDouDou(SweetDouDouVo vo) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_USER.concat(vo.getUserId()); String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_USER.concat(vo.getUserId()).concat(":activeId:" + vo.getActiveId());
redisUtil.set(redisKey, vo); redisUtil.set(redisKey, vo);
} }
public SweetDouDouVo getSweetDouDou(String uid) { public SweetDouDouVo getSweetDouDou(String uid, String activeId) {
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_USER.concat(uid); String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_USER.concat(uid).concat(":activeId:" + activeId);
return (SweetDouDouVo) redisUtil.get(redisKey); return (SweetDouDouVo) redisUtil.get(redisKey);
} }
...@@ -490,7 +493,7 @@ public class RedisDataUtils { ...@@ -490,7 +493,7 @@ public class RedisDataUtils {
public void setSweetDouDouScopeVo(SweetDouDouScopeVo sweetDouDouScopeVo){ public void setSweetDouDouScopeVo(SweetDouDouScopeVo sweetDouDouScopeVo){
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_SCOPE_MOBILE.concat(sweetDouDouScopeVo.getMobile()); String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_SCOPE_MOBILE.concat(sweetDouDouScopeVo.getMobile());
redisUtil.set(redisKey, sweetDouDouScopeVo); redisUtil.set(redisKey, sweetDouDouScopeVo, RedisKeyExpireConst.SWEET_DOUDOU_SCOPE_MOBILE_EXPIRE);
} }
//草莓音乐节活动海报相关 //草莓音乐节活动海报相关
...@@ -966,4 +969,27 @@ public class RedisDataUtils { ...@@ -966,4 +969,27 @@ public class RedisDataUtils {
} }
} }
public List<SweetDoudouActive> getSweetDouDouActive() {
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_ACTIVE;
Object obj = redisUtil.get(redisKey);
if (obj == null) {
LambdaQueryWrapper<SweetDoudouActive> queryWrapper = new QueryWrapper<SweetDoudouActive>()
.lambda()
.eq(SweetDoudouActive::getStatus, 1)
.orderByDesc(SweetDoudouActive::getSort);
List<SweetDoudouActive> doudouActives = sweetDoudouActiveMapper.selectList(queryWrapper);
if (doudouActives.isEmpty()) {
return Collections.emptyList();
}
setSweetDouDouActive(doudouActives);
return doudouActives;
}else {
return (List<SweetDoudouActive>) obj;
}
}
public void setSweetDouDouActive(List<SweetDoudouActive> activeList){
String redisKey = SweetConstant.REDIS_KEY_SWEET_DOUDOU_ACTIVE;
redisUtil.set(redisKey, activeList, RedisKeyExpireConst.SWEET_DOUDOU_ACTIVE_EXPIRE);
}
} }
...@@ -10,3 +10,4 @@ ...@@ -10,3 +10,4 @@
90093=\u60A8\u672A\u4E2D\u7B7E 90093=\u60A8\u672A\u4E2D\u7B7E
90094=\u5DF2\u88AB\u6838\u9500 90094=\u5DF2\u88AB\u6838\u9500
90095=\u4E8C\u7EF4\u7801\u65E0\u6548 90095=\u4E8C\u7EF4\u7801\u65E0\u6548
90096=\u672A\u67E5\u8BE2\u5230\u8BE5\u6D3B\u52A8
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