Commit c4499b84 authored by jiaorz's avatar jiaorz

Merge remote-tracking branch 'origin/luck_draw_feature' into luck_draw_feature

parents ae0762da 2a93467a
...@@ -16,6 +16,7 @@ import javax.validation.Validator; ...@@ -16,6 +16,7 @@ import javax.validation.Validator;
import javax.validation.executable.ExecutableValidator; import javax.validation.executable.ExecutableValidator;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Parameter; import java.lang.reflect.Parameter;
import java.util.Collection;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
...@@ -62,8 +63,13 @@ public class ValidParamAop { ...@@ -62,8 +63,13 @@ public class ValidParamAop {
for (int i =0;i<argLength;i++){ for (int i =0;i<argLength;i++){
BeanValid beanValidAnnotation = parameters[i].getDeclaredAnnotation(BeanValid.class); BeanValid beanValidAnnotation = parameters[i].getDeclaredAnnotation(BeanValid.class);
if (Objects.nonNull(beanValidAnnotation)){ if (Objects.nonNull(beanValidAnnotation)){
if (args[i].getClass().isArray()){ if ((args[i] instanceof Collection) || (args[i].getClass().isArray())){
Object[] arrayArg =(Object[])args[i]; Object[] arrayArg = null;
if(args[i] instanceof Collection){
arrayArg = ((Collection)args[i]).toArray();
}else {
arrayArg = (Object[])args[i];
}
for (Object item:arrayArg){ for (Object item:arrayArg){
Set<ConstraintViolation<Object>> validateResult = this.validator.validate(item, beanValidAnnotation.value()); Set<ConstraintViolation<Object>> validateResult = this.validator.validate(item, beanValidAnnotation.value());
if (!validateResult.isEmpty()){ if (!validateResult.isEmpty()){
......
...@@ -10,6 +10,8 @@ import lombok.Data; ...@@ -10,6 +10,8 @@ import lombok.Data;
*/ */
@Data @Data
public class InviteMemberBO { public class InviteMemberBO {
private Integer userId;
private Integer parentId;
private String username; private String username;
private String headUrl; private String headUrl;
private Long joinTime; private Long joinTime;
......
...@@ -34,7 +34,7 @@ import java.util.stream.Collectors; ...@@ -34,7 +34,7 @@ import java.util.stream.Collectors;
*/ */
@Service @Service
@Slf4j @Slf4j
public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRelation> { public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper, AppUserRelation> {
@Autowired @Autowired
AppUserRelationTempBiz relationTempBiz; AppUserRelationTempBiz relationTempBiz;
...@@ -60,12 +60,13 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -60,12 +60,13 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
/** /**
* 关系绑定 * 关系绑定
* 规则A->B (B无有效上线+无有效下线) * 规则A->B (B无有效上线+无有效下线)
*
* @param userId * @param userId
* @param parentId * @param parentId
*/ */
public void bindRelation(Integer userId,Integer parentId,Integer type){ public void bindRelation(Integer userId, Integer parentId, Integer type) {
if (userId.equals(parentId)){ if (userId.equals(parentId)) {
log.info("----userId==="+userId+"----parentId===="+parentId+"----自己不能成为自己的上线"); log.info("----userId===" + userId + "----parentId====" + parentId + "----自己不能成为自己的上线");
return; return;
} }
...@@ -74,34 +75,34 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -74,34 +75,34 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
log.info("----userId==="+userId+"----parentId===="+parentId+"----该用户不存在"); log.info("----userId==="+userId+"----parentId===="+parentId+"----该用户不存在");
return; return;
}*/ }*/
AppUserVo appUserVo=userDetailBiz.getUserInfoById(parentId); AppUserVo appUserVo = userDetailBiz.getUserInfoById(parentId);
if (appUserVo==null){ if (appUserVo == null) {
log.info("----userId==="+userId+"----parentId===="+parentId+"----该上线用户不存在"); log.info("----userId===" + userId + "----parentId====" + parentId + "----该上线用户不存在");
return; return;
} }
AppUserRelation relation=getMyBiz().getRelationByUserId(parentId); AppUserRelation relation = getMyBiz().getRelationByUserId(parentId);
Long time=System.currentTimeMillis(); Long time = System.currentTimeMillis();
if(relation==null){ if (relation == null) {
relation=new AppUserRelation(); relation = new AppUserRelation();
relation.setUserId(parentId); relation.setUserId(parentId);
relation.setBindType(type); relation.setBindType(type);
insertSelective(relation); insertSelective(relation);
} }
Long bindTime=time-validTime; Long bindTime = time - validTime;
//判断用户是否有有效的下线 //判断用户是否有有效的下线
if (getCountByParentId(userId,bindTime)==0L){ if (getCountByParentId(userId, bindTime) == 0L) {
relation=getMyBiz().getRelationByUserId(userId); relation = getMyBiz().getRelationByUserId(userId);
if(relation==null){ if (relation == null) {
relation=new AppUserRelation(); relation = new AppUserRelation();
relation.setUserId(userId); relation.setUserId(userId);
relation.setParentId(parentId); relation.setParentId(parentId);
relation.setBindType(type); relation.setBindType(type);
relation.setBindTime(time); relation.setBindTime(time);
insertSelective(relation); insertSelective(relation);
}else { } else {
//判断用户是否有有效的上线 //判断用户是否有有效的上线
log.info("----userId==="+userId+"----bindTime===="+bindTime+"----relation.getBindTime()==="+relation.getBindTime()); log.info("----userId===" + userId + "----bindTime====" + bindTime + "----relation.getBindTime()===" + relation.getBindTime());
if(relation.getParentId()==null||relation.getParentId()==0||(relation.getIsForever()!=1&&validTime>0&&relation.getBindTime()<bindTime)){ if (relation.getParentId() == null || relation.getParentId() == 0 || (relation.getIsForever() != 1 && validTime > 0 && relation.getBindTime() < bindTime)) {
relation.setParentId(parentId); relation.setParentId(parentId);
relation.setBindType(type); relation.setBindType(type);
relation.setBindTime(time); relation.setBindTime(time);
...@@ -110,65 +111,69 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -110,65 +111,69 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
} }
} }
} }
//首页关系绑定 //首页关系绑定
public ObjectRestResponse appBindRelation(Integer userId,String code){ public ObjectRestResponse appBindRelation(Integer userId, String code) {
Integer parentId=0; Integer parentId = 0;
if (StringUtils.isNotBlank(code)){ if (StringUtils.isNotBlank(code)) {
//判断处理活动关键字 //判断处理活动关键字
String[] codes = code.split("_"); String[] codes = code.split("_");
if(codes.length > 1) { if (codes.length > 1) {
code = codes[0]; code = codes[0];
} }
parentId=appUserDetailBiz.getUserByCode(code); parentId = appUserDetailBiz.getUserByCode(code);
} }
if (parentId!=null&&parentId>0&&userId!=null&&userId>0){ if (parentId != null && parentId > 0 && userId != null && userId > 0) {
getMyBiz().bindRelation(userId,parentId,1); getMyBiz().bindRelation(userId, parentId, 1);
} }
return ObjectRestResponse.succ(); return ObjectRestResponse.succ();
} }
//后台关系绑定 //后台关系绑定
public ObjectRestResponse adminBindRelation(UserRelationDTO relationDTO){ public ObjectRestResponse adminBindRelation(UserRelationDTO relationDTO) {
String phone=relationDTO.getPhone(); String phone = relationDTO.getPhone();
Integer userId=relationDTO.getUserId(); Integer userId = relationDTO.getUserId();
if (StringUtils.isBlank(phone)||userId==null||userId==0){ if (StringUtils.isBlank(phone) || userId == null || userId == 0) {
return ObjectRestResponse.createFailedResult(ResultCode.NULL_CODE,"参数不能为空"); return ObjectRestResponse.createFailedResult(ResultCode.NULL_CODE, "参数不能为空");
} }
AppUserLogin userLogin=appUserLoginBiz.checkeUserLogin(phone); AppUserLogin userLogin = appUserLoginBiz.checkeUserLogin(phone);
if (userLogin==null){ if (userLogin == null) {
return ObjectRestResponse.createFailedResult(ResultCode.NULL_CODE,"该上级不存在"); return ObjectRestResponse.createFailedResult(ResultCode.NULL_CODE, "该上级不存在");
} }
Integer parentId=userLogin.getId(); Integer parentId = userLogin.getId();
getMyBiz().bindRelation(userId,parentId,1); getMyBiz().bindRelation(userId, parentId, 1);
return ObjectRestResponse.succ(); return ObjectRestResponse.succ();
} }
//永久稳定关系 //永久稳定关系
public void foreverBind(Integer user_id ){ public void foreverBind(Integer user_id) {
AppUserRelation relation=getMyBiz().getRelationByUserId(user_id); AppUserRelation relation = getMyBiz().getRelationByUserId(user_id);
if(relation!=null&&relation.getIsForever()==0&&relation.getParentId()!=null&&relation.getParentId()>0){ if (relation != null && relation.getIsForever() == 0 && relation.getParentId() != null && relation.getParentId() > 0) {
relation.setIsForever(1); relation.setIsForever(1);
getMyBiz().updRelation(relation); getMyBiz().updRelation(relation);
} }
} }
/** /**
* 小程序分享上下线绑定 * 小程序分享上下线绑定
*
* @param userid 当前人小程序id * @param userid 当前人小程序id
* @param pid 分享人id * @param pid 分享人id
* @param platform_userid 当前人统一平台id * @param platform_userid 当前人统一平台id
*/ */
public ObjectRestResponse shareParentByUserId(Integer userid, Integer pid, Integer platform_userid){ public ObjectRestResponse shareParentByUserId(Integer userid, Integer pid, Integer platform_userid) {
if(pid==null||pid==0||((platform_userid==null||platform_userid==0)&&(userid==0||userid==null))){ if (pid == null || pid == 0 || ((platform_userid == null || platform_userid == 0) && (userid == 0 || userid == null))) {
return ObjectRestResponse.createFailedResult(ResultCode.NULL_CODE, "参数为空"); return ObjectRestResponse.createFailedResult(ResultCode.NULL_CODE, "参数为空");
} }
if(platform_userid==null||platform_userid==0){ if (platform_userid == null || platform_userid == 0) {
upRelationTemp(pid,userid); upRelationTemp(pid, userid);
}else { } else {
AppUserVo userVo=userDetailBiz.getUserInfoById(platform_userid); AppUserVo userVo = userDetailBiz.getUserInfoById(platform_userid);
if(userVo==null){ if (userVo == null) {
upRelationTemp(pid,userid); upRelationTemp(pid, userid);
}else { } else {
bindRelation(platform_userid,pid,2); bindRelation(platform_userid, pid, 2);
} }
} }
return ObjectRestResponse.succ(); return ObjectRestResponse.succ();
...@@ -177,17 +182,18 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -177,17 +182,18 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
/** /**
* 新增临时关系 * 新增临时关系
*
* @param pid * @param pid
* @param userid * @param userid
*/ */
public void upRelationTemp(Integer pid,Integer userid){ public void upRelationTemp(Integer pid, Integer userid) {
AppUserRelationTemp relationTemp=new AppUserRelationTemp(); AppUserRelationTemp relationTemp = new AppUserRelationTemp();
relationTemp.setTempId(userid); relationTemp.setTempId(userid);
relationTemp.setIsDel(0); relationTemp.setIsDel(0);
relationTemp.setType(1); relationTemp.setType(1);
AppUserRelationTemp relationTemp1= relationTempBiz.selectOne(relationTemp); AppUserRelationTemp relationTemp1 = relationTempBiz.selectOne(relationTemp);
if(relationTemp1==null){ if (relationTemp1 == null) {
relationTemp.setUserId(pid); relationTemp.setUserId(pid);
relationTempBiz.insertSelective(relationTemp); relationTempBiz.insertSelective(relationTemp);
} }
...@@ -196,67 +202,69 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -196,67 +202,69 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
/** /**
* 小程序上下线绑定 * 小程序上下线绑定
*
* @param platform_userid 当前人统一平台id * @param platform_userid 当前人统一平台id
* @param userid 当前人小程序id * @param userid 当前人小程序id
*/ */
public void bindByUserId(Integer platform_userid,Integer userid){ public void bindByUserId(Integer platform_userid, Integer userid) {
if(platform_userid==null||platform_userid==0||userid==null||userid==0){ if (platform_userid == null || platform_userid == 0 || userid == null || userid == 0) {
return; return;
} }
AppUserRelationTemp relationTemp =new AppUserRelationTemp(); AppUserRelationTemp relationTemp = new AppUserRelationTemp();
relationTemp.setTempId(userid); relationTemp.setTempId(userid);
relationTemp.setIsValid(0); relationTemp.setIsValid(0);
relationTemp.setType(1); relationTemp.setType(1);
relationTemp.setIsDel(0); relationTemp.setIsDel(0);
relationTemp=relationTempBiz.selectOne(relationTemp); relationTemp = relationTempBiz.selectOne(relationTemp);
if(relationTemp==null){ if (relationTemp == null) {
return; return;
} }
Integer parentId=relationTemp.getUserId(); Integer parentId = relationTemp.getUserId();
bindRelation(platform_userid,parentId,2); bindRelation(platform_userid, parentId, 2);
} }
/** /**
* 获取用户的上线关系 * 获取用户的上线关系
*
* @param userId * @param userId
* @return * @return
*/ */
@Cache(key="user:relation{1}") @Cache(key = "user:relation{1}")
public AppUserRelation getRelationByUserId(Integer userId){ public AppUserRelation getRelationByUserId(Integer userId) {
AppUserRelation relation=new AppUserRelation(); AppUserRelation relation = new AppUserRelation();
relation.setUserId(userId); relation.setUserId(userId);
return selectOne(relation); return selectOne(relation);
} }
//获取有效的上线 //获取有效的上线
public AppUserRelation getRelationByIdUserIdAndTime(Integer userId){ public AppUserRelation getRelationByIdUserIdAndTime(Integer userId) {
AppUserRelation userRelation= getMyBiz().getRelationByUserId(userId); AppUserRelation userRelation = getMyBiz().getRelationByUserId(userId);
if (userRelation==null){ if (userRelation == null) {
return null; return null;
} }
log.info("---userId==="+userId+"-----isForever==="+userRelation.getIsForever()); log.info("---userId===" + userId + "-----isForever===" + userRelation.getIsForever());
if (validTime==null||validTime==0){ if (validTime == null || validTime == 0) {
return userRelation; return userRelation;
} }
Long time=System.currentTimeMillis()-validTime; Long time = System.currentTimeMillis() - validTime;
if (userRelation.getIsForever()==1||userRelation.getBindTime()>time){ if (userRelation.getIsForever() == 1 || userRelation.getBindTime() > time) {
return userRelation; return userRelation;
} }
log.info("---userId==="+userId+"-----time==="+time+"----userRelation.getBindTime()==="+userRelation.getBindTime()); log.info("---userId===" + userId + "-----time===" + time + "----userRelation.getBindTime()===" + userRelation.getBindTime());
return null; return null;
} }
//获取用户的下线总数 //获取用户的下线总数
public int getCountByParentId(Integer parentId,Long time){ public int getCountByParentId(Integer parentId, Long time) {
if (validTime<=0){ if (validTime <= 0) {
time= validTime; time = validTime;
} }
return mapper.countByParentId(parentId,time); return mapper.countByParentId(parentId, time);
} }
@CacheClear(key="user:relation{1.userId}") @CacheClear(key = "user:relation{1.userId}")
public int updRelation(AppUserRelation appUserRelation){ public int updRelation(AppUserRelation appUserRelation) {
return super.updateSelectiveByIdRe(appUserRelation); return super.updateSelectiveByIdRe(appUserRelation);
} }
...@@ -273,16 +281,16 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -273,16 +281,16 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
InviteMemberVo inviteMemberVo = new InviteMemberVo(); InviteMemberVo inviteMemberVo = new InviteMemberVo();
inviteMemberVo.setPage(page); inviteMemberVo.setPage(page);
inviteMemberVo.setLimit(limit); inviteMemberVo.setLimit(limit);
inviteMemberVo.setFailureTime(failureTime*24*60*60); inviteMemberVo.setFailureTime(failureTime * 24 * 60 * 60);
Example example = new Example(AppUserRelation.class); Example example = new Example(AppUserRelation.class);
Example.Criteria criteria = example.createCriteria(); Example.Criteria criteria = example.createCriteria();
if (state!=null) { if (state != null) {
criteria.andEqualTo("isForever", state); criteria.andEqualTo("isForever", state);
} }
criteria.andEqualTo("parentId",leaderId); criteria.andEqualTo("parentId", leaderId);
PageDataVO<AppUserRelation> pageDataVO = PageDataVO.pageInfo(page, limit, () -> mapper.selectByExample(example)); PageDataVO<AppUserRelation> pageDataVO = PageDataVO.pageInfo(page, limit, () -> mapper.selectByExample(example));
List<AppUserRelation> appUserRelations = pageDataVO.getData(); List<AppUserRelation> appUserRelations = pageDataVO.getData();
if (CollectionUtils.isEmpty(appUserRelations)){ if (CollectionUtils.isEmpty(appUserRelations)) {
inviteMemberVo.setInviteMembers(Collections.EMPTY_LIST); inviteMemberVo.setInviteMembers(Collections.EMPTY_LIST);
return inviteMemberVo; return inviteMemberVo;
} }
...@@ -294,14 +302,16 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -294,14 +302,16 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
List<InviteMemberBO> inviteMemberBOS = new ArrayList<>(); List<InviteMemberBO> inviteMemberBOS = new ArrayList<>();
InviteMemberBO inviteMemberBO; InviteMemberBO inviteMemberBO;
for (AppUserRelation appUserRelation : appUserRelations) { for (AppUserRelation appUserRelation : appUserRelations) {
if (userIdAndUserLoginMap==null || userIdAndUserDetailMap==null){ if (userIdAndUserLoginMap == null || userIdAndUserDetailMap == null) {
continue; continue;
} }
inviteMemberBO = new InviteMemberBO(); inviteMemberBO = new InviteMemberBO();
inviteMemberBO.setUserId(appUserRelation.getUserId());
inviteMemberBO.setParentId(appUserRelation.getParentId());
inviteMemberBO.setBindTime(appUserRelation.getBindTime()); inviteMemberBO.setBindTime(appUserRelation.getBindTime());
inviteMemberBO.setJoinTime(appUserRelation.getBindTime()); inviteMemberBO.setJoinTime(appUserRelation.getBindTime());
inviteMemberBO.setUsername(userIdAndUserLoginMap==null?"":userIdAndUserLoginMap.get(appUserRelation.getUserId())==null?"":userIdAndUserLoginMap.get(appUserRelation.getUserId()).getUsername()); inviteMemberBO.setUsername(userIdAndUserLoginMap == null ? "" : userIdAndUserLoginMap.get(appUserRelation.getUserId()) == null ? "" : userIdAndUserLoginMap.get(appUserRelation.getUserId()).getUsername());
inviteMemberBO.setHeadUrl(userIdAndUserDetailMap==null?"":userIdAndUserDetailMap.get(appUserRelation.getUserId())==null?"":userIdAndUserDetailMap.get(appUserRelation.getUserId()).getHeadimgurl()); inviteMemberBO.setHeadUrl(userIdAndUserDetailMap == null ? "" : userIdAndUserDetailMap.get(appUserRelation.getUserId()) == null ? "" : userIdAndUserDetailMap.get(appUserRelation.getUserId()).getHeadimgurl());
inviteMemberBOS.add(inviteMemberBO); inviteMemberBOS.add(inviteMemberBO);
} }
inviteMemberVo.setTotalCount(pageDataVO.getTotalCount().intValue()); inviteMemberVo.setTotalCount(pageDataVO.getTotalCount().intValue());
...@@ -313,65 +323,66 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel ...@@ -313,65 +323,66 @@ public class AppUserRelationBiz extends BaseBiz<AppUserRelationMapper,AppUserRel
public Integer findLeaderIdByMemberId(Integer userId) { public Integer findLeaderIdByMemberId(Integer userId) {
Example example = new Example(AppUserRelation.class); Example example = new Example(AppUserRelation.class);
Example.Criteria criteria = example.createCriteria(); Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("userId",userId); criteria.andEqualTo("userId", userId);
List<AppUserRelation> appUserRelations = mapper.selectByExample(example); List<AppUserRelation> appUserRelations = mapper.selectByExample(example);
if (CollectionUtils.isEmpty(appUserRelations)){ if (CollectionUtils.isEmpty(appUserRelations)) {
return 0; return 0;
} }
return appUserRelations.get(0).getParentId(); return appUserRelations.get(0).getParentId();
} }
public Map<Integer, Integer> findMemberSateAndCountMapByLeaderId(Integer userId) { public Map<Integer, Integer> findMemberSateAndCountMapByLeaderId(Integer userId) {
Map<Integer,Integer> memberSateAndCountMap = new HashMap<>(); Map<Integer, Integer> memberSateAndCountMap = new HashMap<>();
AppUserRelation appUserRelation = new AppUserRelation(); List<AppUserRelation> appUserRelationList = mapper.selectCountByLeaderId(userId);
appUserRelation.setParentId(userId); if (CollectionUtils.isEmpty(appUserRelationList)){
appUserRelation.setIsForever(0); memberSateAndCountMap.put(0, 0);
int totalCount = mapper.selectCount(appUserRelation); memberSateAndCountMap.put(1, 0);
appUserRelation.setIsForever(1); }
int activityCount = mapper.selectCount(appUserRelation); Map<Boolean, Long> resultMap = appUserRelationList.stream().collect(Collectors.partitioningBy(x -> x.getIsForever() == 0, Collectors.counting()));
memberSateAndCountMap.put(0,totalCount); memberSateAndCountMap.put(0, resultMap.get(Boolean.TRUE)==null?0:resultMap.get(Boolean.TRUE).intValue());
memberSateAndCountMap.put(1,activityCount); memberSateAndCountMap.put(1, resultMap.get(Boolean.FALSE)==null?0:resultMap.get(Boolean.FALSE).intValue());
return memberSateAndCountMap; return memberSateAndCountMap;
} }
public void deleteByMemberIds(Collection<Integer> userIds) { public void deleteByMemberIds(Collection<Integer> userIds) {
Example example = new Example(AppUserRelation.class); Example example = new Example(AppUserRelation.class);
Example.Criteria criteria = example.createCriteria(); Example.Criteria criteria = example.createCriteria();
criteria.andIn("parentId",userIds); criteria.andIn("parentId", userIds);
List<AppUserRelation> list=mapper.selectByExample(example); List<AppUserRelation> list = mapper.selectByExample(example);
for (AppUserRelation appUserRelation:list){ for (AppUserRelation appUserRelation : list) {
getMyBiz().delRelation(appUserRelation.getUserId()); getMyBiz().delRelation(appUserRelation.getUserId());
} }
mapper.deleteByExample(example); mapper.deleteByExample(example);
Example example2 = new Example(AppUserRelation.class); Example example2 = new Example(AppUserRelation.class);
Example.Criteria criteria1 = example2.createCriteria(); Example.Criteria criteria1 = example2.createCriteria();
criteria1.andIn("userId",userIds); criteria1.andIn("userId", userIds);
mapper.deleteByExample(example2); mapper.deleteByExample(example2);
for (Integer userId:userIds){ for (Integer userId : userIds) {
getMyBiz().delRelation(userId); getMyBiz().delRelation(userId);
} }
} }
@CacheClear(key="user:relation{1}")
public void delRelation(Integer userId){ @CacheClear(key = "user:relation{1}")
public void delRelation(Integer userId) {
} }
public List<AppUserRelation> findLeaderByUserIds(List<Integer> userIds) { public List<AppUserRelation> findLeaderByUserIds(List<Integer> userIds) {
List<AppUserRelation> appUserRelationList = mapper.selectByUserIds(userIds); List<AppUserRelation> appUserRelationList = mapper.selectByUserIds(userIds);
return appUserRelationList==null?Collections.EMPTY_LIST:appUserRelationList; return appUserRelationList == null ? Collections.EMPTY_LIST : appUserRelationList;
} }
public void initParentId(AppUserDTO userDTO, Integer userid) { public void initParentId(AppUserDTO userDTO, Integer userid) {
AppUserRelation relation = getRelationByIdUserIdAndTime(userid); AppUserRelation relation = getRelationByIdUserIdAndTime(userid);
Integer parentId=0; Integer parentId = 0;
if (relation!=null){ if (relation != null) {
parentId=relation.getParentId(); parentId = relation.getParentId();
} }
userDTO.setParentId(parentId); userDTO.setParentId(parentId);
if (parentId!=null&&parentId>0){ if (parentId != null && parentId > 0) {
AppUserPositionTemp positionTemp= positionTempBiz.getOne(parentId); AppUserPositionTemp positionTemp = positionTempBiz.getOne(parentId);
if (positionTemp!=null){ if (positionTemp != null) {
userDTO.setParentPositionId(positionTemp.getPositionId()); userDTO.setParentPositionId(positionTemp.getPositionId());
userDTO.setParentPositionTempId(positionTemp.getId()); userDTO.setParentPositionTempId(positionTemp.getId());
userDTO.setParentCompanyId(positionTemp.getCompanyId()); userDTO.setParentCompanyId(positionTemp.getCompanyId());
......
...@@ -23,4 +23,6 @@ public interface AppUserRelationMapper extends Mapper<AppUserRelation> { ...@@ -23,4 +23,6 @@ public interface AppUserRelationMapper extends Mapper<AppUserRelation> {
public int countByParentId(@Param("parentId")Integer parentId,@Param("bindTime")Long bindTime); public int countByParentId(@Param("parentId")Integer parentId,@Param("bindTime")Long bindTime);
List<AppUserRelation> selectByUserIds(@Param("userIds") List<Integer> userIds); List<AppUserRelation> selectByUserIds(@Param("userIds") List<Integer> userIds);
List<AppUserRelation> selectCountByLeaderId(Integer userId);
} }
...@@ -21,4 +21,8 @@ ...@@ -21,4 +21,8 @@
#{userId} #{userId}
</foreach> </foreach>
</select> </select>
<select id="selectCountByLeaderId" resultType="com.github.wxiaoqi.security.admin.entity.AppUserRelation">
select * from `app_user_relation` as `aur` inner join `app_user_login` as `aul` on aul.id=aur.user_id where aur.is_del=0 and aul.isdel=0 and aur.parent_id=#{userId}
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
IFNULL(ausww.income,0) AS `income` IFNULL(ausww.income,0) AS `income`
FROM FROM
`app_user_relation` AS `aur` `app_user_relation` AS `aur`
INNER JOIN (select `id` from `app_user_login` where isdel=0)as `aul` ON aul.id=aur.user_id
LEFT JOIN (SELECT DISTINCT LEFT JOIN (SELECT DISTINCT
`source_id` AS userId, `source_id` AS userId,
IFNULL( IFNULL(
......
package com.xxfc.platform.activity.constant;
/**
* @author libin
* @version 1.0
* @description
* @data 2019/12/6 12:11
*/
public enum PrizeGoodsTypeEnum {
PRIZE(1,"奖品"),
COUPON(2,"优惠券"),
NO_PRIZE(0,"谢谢惠顾");
private int code;
private String desc;
PrizeGoodsTypeEnum(int code, String desc) {
this.code = code;
this.desc = desc;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
...@@ -8,6 +8,8 @@ import javax.persistence.Column; ...@@ -8,6 +8,8 @@ import javax.persistence.Column;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
...@@ -25,32 +27,47 @@ public class ActivityPrize implements Serializable { ...@@ -25,32 +27,47 @@ public class ActivityPrize implements Serializable {
@Id @Id
@GeneratedValue(generator = "JDBC") @GeneratedValue(generator = "JDBC")
private Integer id; private Integer id;
@NotNull(message = "编号不能为null")
@ApiModelProperty("编号") @ApiModelProperty("编号")
@Column(name = "serial_number") @Column(name = "serial_number")
private Integer serialNumber; private Integer serialNumber;
@NotEmpty(message = "奖品名称不能为空")
@Column(name = "name") @Column(name = "name")
private String name; private String name;
@NotEmpty(message = "奖品地址不能为空")
@ApiModelProperty("奖品图片地址") @ApiModelProperty("奖品图片地址")
@Column(name = "icon_path") @Column(name = "icon_path")
private String iconPath; private String iconPath;
@ApiModelProperty("每天最多中奖份数") @ApiModelProperty("每天最多中奖份数")
@Column(name = "day_max_use") @Column(name = "day_max_use")
private Integer dayMaxUse; private Integer dayMaxUse;
@NotNull(message = "奖品库存不能为null")
@Column(name = "total_stock") @Column(name = "total_stock")
private Integer totalStock; private Integer totalStock;
@NotNull(message = "权重|概率不能为null")
@Column(name = "probability") @Column(name = "probability")
private Double probability; private Double probability;
@NotNull(message = "奖品设置类型不能null")
@ApiModelProperty("1:线上 2:现场") @ApiModelProperty("1:线上 2:现场")
@Column(name = "type") @Column(name = "type")
private Integer type; private Integer type;
@Column(name = "crt_time") @Column(name = "crt_time")
private Date crtTime; private Date crtTime;
@Column(name = "upd_time") @Column(name = "upd_time")
private Date updTime; private Date updTime;
@Column(name = "is_entity")
private Integer isEntity;
@Column(name = "goods_id") @Column(name = "goods_id")
private Integer goodsId; private Integer goodsId;
@Column(name = "is_prize")
private Integer isPrize; @NotNull(message = "奖品类型不能为null")
@Column(name = "prize_goods_type")
private Integer prizeGoodsType;
} }
...@@ -19,6 +19,7 @@ import java.util.Date; ...@@ -19,6 +19,7 @@ import java.util.Date;
public class ActivityWinningRecordVo { public class ActivityWinningRecordVo {
private String userName; private String userName;
private String phone;
private String positionName; private String positionName;
@ApiModelProperty("1:线上 2:现场") @ApiModelProperty("1:线上 2:现场")
private Integer prizeType; private Integer prizeType;
......
...@@ -16,5 +16,7 @@ import lombok.NoArgsConstructor; ...@@ -16,5 +16,7 @@ import lombok.NoArgsConstructor;
public class LotteryVo { public class LotteryVo {
private String prizeName; private String prizeName;
private Integer serialNumber;
private String expiryDateCode; private String expiryDateCode;
private String message;
} }
...@@ -9,6 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; ...@@ -9,6 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
import tk.mybatis.spring.annotation.MapperScan; import tk.mybatis.spring.annotation.MapperScan;
...@@ -22,8 +24,11 @@ import tk.mybatis.spring.annotation.MapperScan; ...@@ -22,8 +24,11 @@ import tk.mybatis.spring.annotation.MapperScan;
"com.xxfc.platform", "com.xxfc.platform",
"com.github.wxiaoqi.security.common.handler", "com.github.wxiaoqi.security.common.handler",
"com.github.wxiaoqi.security.common.log", "com.github.wxiaoqi.security.common.log",
"com.github.wxiaoqi.security.admin.support.aop" "com.github.wxiaoqi.security.admin.support.aop",
"com.github.wxiaoqi.security.common.support"
}) })
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableAsync
@EnableDiscoveryClient @EnableDiscoveryClient
@EnableScheduling @EnableScheduling
@EnableAceAuthClient @EnableAceAuthClient
......
...@@ -13,6 +13,7 @@ import com.xxfc.platform.activity.entity.ActivityAttendanceRecord; ...@@ -13,6 +13,7 @@ import com.xxfc.platform.activity.entity.ActivityAttendanceRecord;
import com.xxfc.platform.activity.mapper.ActivityAttendanceRecordMapper; import com.xxfc.platform.activity.mapper.ActivityAttendanceRecordMapper;
import com.xxfc.platform.activity.vo.ActivityAttendanceRecordTotalVo; import com.xxfc.platform.activity.vo.ActivityAttendanceRecordTotalVo;
import com.xxfc.platform.activity.vo.ActivityAttendanceRecordVo; import com.xxfc.platform.activity.vo.ActivityAttendanceRecordVo;
import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
...@@ -20,18 +21,22 @@ import org.apache.poi.xssf.usermodel.XSSFSheet; ...@@ -20,18 +21,22 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.assertj.core.util.Lists; import org.assertj.core.util.Lists;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.ArrayList; import java.util.*;
import java.util.Date; import java.util.concurrent.TimeUnit;
import java.util.List;
import java.util.Objects;
import java.util.function.Supplier; import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
...@@ -44,19 +49,38 @@ import java.util.stream.Stream; ...@@ -44,19 +49,38 @@ import java.util.stream.Stream;
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Service @Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecordMapper,ActivityAttendanceRecord> { public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecordMapper,ActivityAttendanceRecord> {
@Resource(name = "redisTemplate")
private ValueOperations<String, Object> valueOperations;
private final RedisTemplate<String,Object> redisTemplate;
@Value("${lottery.expire.days:60}")
private int expirDays;
public void attendActivity(Integer activityId, String activityName,AppUserDTO appUserDTO) { public void attendActivity(Integer activityId, String activityName,AppUserDTO appUserDTO) {
ActivityAttendanceRecord record = new ActivityAttendanceRecord();
record.setActivityId(activityId);
record.setUserId(appUserDTO.getUserid());
int num = mapper.selectCount(record);
if (num==0) {
ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord(); ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord();
activityAttendanceRecord.setActivityId(activityId); activityAttendanceRecord.setActivityId(activityId);
activityAttendanceRecord.setActivityName(activityName); activityAttendanceRecord.setActivityName(activityName);
activityAttendanceRecord.setUserId(appUserDTO.getUserid()); activityAttendanceRecord.setUserId(appUserDTO.getUserid());
activityAttendanceRecord.setPhone(appUserDTO.getUsername()); activityAttendanceRecord.setPhone(appUserDTO.getUsername());
activityAttendanceRecord.setUserName(StringUtils.isEmpty(appUserDTO.getRealname())?appUserDTO.getNickname():appUserDTO.getRealname()); activityAttendanceRecord.setUserName(StringUtils.isEmpty(appUserDTO.getRealname()) ? appUserDTO.getNickname() : appUserDTO.getRealname());
activityAttendanceRecord.setPositionId(appUserDTO.getPositionId()); activityAttendanceRecord.setPositionId(appUserDTO.getPositionId());
activityAttendanceRecord.setPositionName(appUserDTO.getPositionName()); activityAttendanceRecord.setPositionName(appUserDTO.getPositionName());
activityAttendanceRecord.setCrtTime(new Date()); activityAttendanceRecord.setCrtTime(new Date());
mapper.insertSelective(activityAttendanceRecord); mapper.insertSelective(activityAttendanceRecord);
String onlineKey = String.format("%s%d:%d:%d", ActivityPrizeBiz.USER_LOTTERY_PRE_KEY,appUserDTO.getUserid(), activityId, PrizeTypeEnum.ONLINE.getCode());
String localeKey = String.format("%s%d:%d:%d",ActivityPrizeBiz.USER_LOTTERY_PRE_KEY,appUserDTO.getUserid(), activityId, PrizeTypeEnum.LOCALE.getCode());
redisTemplate.delete(Arrays.asList(onlineKey,localeKey));
valueOperations.set(onlineKey, 1L,expirDays, TimeUnit.DAYS);
valueOperations.set(localeKey, 1L,expirDays, TimeUnit.DAYS);
}
} }
...@@ -99,6 +123,10 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -99,6 +123,10 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
} }
public Boolean hasNumberOfLuckyDrawByType(Integer activityId, Integer prizeType, Integer userid) { public Boolean hasNumberOfLuckyDrawByType(Integer activityId, Integer prizeType, Integer userid) {
Object lotteryNum = valueOperations.get(String.format("%s%d:%d:%d",ActivityPrizeBiz.USER_LOTTERY_PRE_KEY,userid, activityId, prizeType));
if (lotteryNum!=null){
return Integer.valueOf(lotteryNum.toString()) >0;
}
ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord(); ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord();
activityAttendanceRecord.setActivityId(activityId); activityAttendanceRecord.setActivityId(activityId);
activityAttendanceRecord.setUserId(userid); activityAttendanceRecord.setUserId(userid);
...@@ -107,9 +135,11 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -107,9 +135,11 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
return false; return false;
} }
if (prizeType == PrizeTypeEnum.ONLINE.getCode()){ if (prizeType == PrizeTypeEnum.ONLINE.getCode()){
valueOperations.set(String.format("%s%d:%d:%d",ActivityPrizeBiz.USER_LOTTERY_PRE_KEY, userid, activityId, prizeType),activityAttendanceRecord.getOnlineLotteryNum(),expirDays, TimeUnit.DAYS);
return activityAttendanceRecord.getOnlineLotteryNum()>0; return activityAttendanceRecord.getOnlineLotteryNum()>0;
} }
if (prizeType ==PrizeTypeEnum.LOCALE.getCode()){ if (prizeType ==PrizeTypeEnum.LOCALE.getCode()){
valueOperations.set(String.format("%s%d:%d:%d",ActivityPrizeBiz.USER_LOTTERY_PRE_KEY,userid, activityId, prizeType),activityAttendanceRecord.getLocaleLotteryNum(),expirDays, TimeUnit.DAYS);
return activityAttendanceRecord.getLocaleLotteryNum()>0; return activityAttendanceRecord.getLocaleLotteryNum()>0;
} }
return false; return false;
...@@ -171,4 +201,9 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor ...@@ -171,4 +201,9 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
activityAttendanceRecordDTO.getPrizes(), activityAttendanceRecordDTO.getPrizes(),
timeStr}; timeStr};
} }
@Async
public void updateLotteryNumByActivityIdAndUserIdAndPrizeType(Integer activityId,Integer userId,Integer prizeType){
mapper.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId,userId,prizeType);
}
} }
\ No newline at end of file
package com.xxfc.platform.activity.biz; package com.xxfc.platform.activity.biz;
import com.ace.cache.annotation.Cache;
import com.ace.cache.annotation.CacheClear;
import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO; import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import com.github.wxiaoqi.security.common.util.ReferralCodeUtil;
import com.xxfc.platform.activity.config.RedissonLock;
import com.xxfc.platform.activity.constant.PrizeGoodsTypeEnum;
import com.xxfc.platform.activity.constant.PrizeTypeEnum; import com.xxfc.platform.activity.constant.PrizeTypeEnum;
import com.xxfc.platform.activity.dto.UserCouponSendDTO;
import com.xxfc.platform.activity.entity.ActivityPrize;
import com.xxfc.platform.activity.entity.ActivityWinningRecord; import com.xxfc.platform.activity.entity.ActivityWinningRecord;
import com.xxfc.platform.activity.mapper.ActivityPrizeMapper;
import com.xxfc.platform.activity.util.LotteryUtils; import com.xxfc.platform.activity.util.LotteryUtils;
import com.xxfc.platform.activity.vo.ActivityPrizeVo; import com.xxfc.platform.activity.vo.ActivityPrizeVo;
import com.xxfc.platform.activity.vo.LotteryVo; import com.xxfc.platform.activity.vo.LotteryVo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
import org.redisson.api.RLock;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.xxfc.platform.activity.entity.ActivityPrize;
import com.xxfc.platform.activity.mapper.ActivityPrizeMapper;
import com.github.wxiaoqi.security.common.biz.BaseBiz;
import com.github.wxiaoqi.security.common.exception.BaseException;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example; import tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -28,14 +42,25 @@ import java.util.stream.Collectors; ...@@ -28,14 +42,25 @@ import java.util.stream.Collectors;
* @email 18178966185@163.com * @email 18178966185@163.com
* @date 2019-12-03 16:46:02 * @date 2019-12-03 16:46:02
*/ */
@Slf4j
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Service @Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired)) @RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize> { public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize> {
private final ActivityWinningRecordBiz activityWinningRecordBiz; private final ActivityWinningRecordBiz activityWinningRecordBiz;
private final ActivityAttendanceRecordBiz activityAttendanceRecordBiz;
private final UserCouponBiz userCouponBiz; private final UserCouponBiz userCouponBiz;
private final RedisTemplate<String, Object> redisTemplate;
@Resource(name = "redisTemplate")
private ValueOperations<String, Object> valueOperations;
private final RedissonLock redissonLock;
@Value("${lottery.expire.days:60}")
private int expirDays;
private static final String LOTTERY_PRE_KEY = "lottery:";
public static final String USER_LOTTERY_PRE_KEY = "user:lottery:";
/** /**
* 查询奖品 * 查询奖品
* *
...@@ -58,6 +83,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -58,6 +83,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* *
* @param activityPrizes * @param activityPrizes
*/ */
@CacheClear(pre = LOTTERY_PRE_KEY)
public void saveActivityPrizes(List<ActivityPrize> activityPrizes) { public void saveActivityPrizes(List<ActivityPrize> activityPrizes) {
if (CollectionUtils.isEmpty(activityPrizes)) { if (CollectionUtils.isEmpty(activityPrizes)) {
throw new BaseException("奖品不能为空"); throw new BaseException("奖品不能为空");
...@@ -66,7 +92,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -66,7 +92,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
//保存 //保存
List<ActivityPrize> activityPrizesOfSave = activityPrizeMap.get(Boolean.FALSE); List<ActivityPrize> activityPrizesOfSave = activityPrizeMap.get(Boolean.FALSE);
if (CollectionUtils.isNotEmpty(activityPrizesOfSave)) { if (CollectionUtils.isNotEmpty(activityPrizesOfSave)) {
activityPrizesOfSave.stream().peek(x->x.setCrtTime(new Date())).count(); activityPrizesOfSave.stream().peek(x -> x.setCrtTime(new Date())).count();
mapper.insertList(activityPrizesOfSave); mapper.insertList(activityPrizesOfSave);
} }
//更新 //更新
...@@ -85,46 +111,164 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize ...@@ -85,46 +111,164 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* @param prizeType * @param prizeType
* @return * @return
*/ */
@Cache(key = LOTTERY_PRE_KEY + "{1}")
public List<ActivityPrize> findActivityPrizeByType(Integer prizeType) { public List<ActivityPrize> findActivityPrizeByType(Integer prizeType) {
Example example = new Example(ActivityPrize.class); Example example = new Example(ActivityPrize.class);
example.orderBy("serialNumber").asc(); example.orderBy("serialNumber").asc();
Example.Criteria criteria = example.createCriteria(); Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("type",prizeType); criteria.andEqualTo("type", prizeType);
List<ActivityPrize> activityPrizes = mapper.selectByExample(example); List<ActivityPrize> activityPrizes = mapper.selectByExample(example);
if (CollectionUtils.isEmpty(activityPrizes)) { if (CollectionUtils.isEmpty(activityPrizes)) {
return Collections.EMPTY_LIST; return Collections.EMPTY_LIST;
} }
for (ActivityPrize activityPrize : activityPrizes) {
if (activityPrize.getTotalStock() != null) {
String prizeStockKey = String.format("%s%d:%d", LOTTERY_PRE_KEY, prizeType, activityPrize.getSerialNumber());
redisTemplate.delete(prizeStockKey);
valueOperations.set(prizeStockKey, Integer.valueOf(activityPrize.getTotalStock().toString()), expirDays, TimeUnit.DAYS);
}
}
return activityPrizes; return activityPrizes;
} }
/** /**
* 抽奖 * 抽奖
* //todo *
* @param activityId * @param activityId
* @param prizeType * @param prizeType
* @param appUserDTO * @param appUserDTO
* @return * @return
*/ */
public LotteryVo activityLottery(Integer activityId, Integer prizeType, AppUserDTO appUserDTO) { public LotteryVo activityLottery(Integer activityId, Integer prizeType, String lotteryDate, AppUserDTO appUserDTO) {
LotteryVo lotteryVo = new LotteryVo(); LotteryVo lotteryVo = new LotteryVo();
List<ActivityPrize> activityPrizes = findActivityPrizeByType(prizeType); List<ActivityPrize> activityPrizes = ((ActivityPrizeBiz) AopContext.currentProxy()).findActivityPrizeByType(prizeType);
ActivityPrize notActivityPrize = activityPrizes.stream().filter(x -> x.getPrizeGoodsType() == 0).findFirst().orElseGet(() -> {
ActivityPrize activityPrize = new ActivityPrize();
activityPrize.setName("谢谢参与");
activityPrize.setPrizeGoodsType(PrizeGoodsTypeEnum.NO_PRIZE.getCode());
activityPrize.setType(prizeType);
activityPrize.setSerialNumber(8);
return activityPrize;
});
String lotteryNumKey = String.format("%s%d:%d:%d",USER_LOTTERY_PRE_KEY, appUserDTO.getUserid(), activityId, prizeType);
Object lotteryNum = valueOperations.get(lotteryNumKey);
boolean hasLotteryNum = lotteryNum == null ? activityAttendanceRecordBiz.hasNumberOfLuckyDrawByType(activityId, prizeType, appUserDTO.getUserid()) : ((Integer) lotteryNum) > 0;
if (hasLotteryNum) {
//抽奖
int index = LotteryUtils.getrandomIndex(activityPrizes); int index = LotteryUtils.getrandomIndex(activityPrizes);
//获取对应的奖品
ActivityPrize activityPrize = activityPrizes.get(index); ActivityPrize activityPrize = activityPrizes.get(index);
if (activityPrize.getTotalStock() == 0){ //判断是否设置最大奖品数(谢谢参与排除)
lotteryVo.setPrizeName("谢谢参与"); if (activityPrize.getDayMaxUse() != null && activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode()) {
return lotteryVo; String key = String.format("%s:%s%d:%s", lotteryDate, LOTTERY_PRE_KEY, activityId, activityPrize.getSerialNumber());
Long prizeDayUseStock = valueOperations.increment(key);
//第一次时设置每天奖品份数的过期时间为1天
if (prizeDayUseStock.intValue() == 1) {
redisTemplate.expire(key, 1, TimeUnit.DAYS);
} }
if (PrizeTypeEnum.LOCALE.getCode()==prizeType){ //达到日上限
//兑奖码生成 if (prizeDayUseStock.intValue() > activityPrize.getDayMaxUse()) {
activityPrize = notActivityPrize;
}
}
//根据商品key获取库存
String prizeStockKey = String.format("%s%d:%d", LOTTERY_PRE_KEY, prizeType, activityPrize.getSerialNumber());
Object prizeStock = valueOperations.get(prizeStockKey);
if (activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode() && activityPrize.getTotalStock() != null) {
//库存为0
if (prizeStock == null || (Integer) prizeStock == 0) {
activityPrize = notActivityPrize;
} }
}
ActivityWinningRecord activityWinningRecord = new ActivityWinningRecord(); ActivityWinningRecord activityWinningRecord = new ActivityWinningRecord();
activityWinningRecord.setActivityId(activityId); activityWinningRecord.setActivityId(activityId);
activityWinningRecord.setPrizeType(prizeType); activityWinningRecord.setPrizeType(prizeType);
activityWinningRecord.setUserId(appUserDTO.getUserid()); activityWinningRecord.setUserId(appUserDTO.getUserid());
activityWinningRecord.setHasWinning(0);
boolean hasStock = activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode()
&& activityPrize.getTotalStock() != null
&& activityPrize.getTotalStock()!=0
&& prizeStock != null
&& (Integer) prizeStock != 0;
if (hasStock) {
String lockKey = String.format("%s%d:%d:%d", LOTTERY_PRE_KEY, activityId, prizeType, activityPrize.getSerialNumber());
RLock rLock = redissonLock.getRLock(lockKey);
try {
boolean isSuccess = rLock.tryLock(1, 2, TimeUnit.SECONDS);
if (isSuccess) {
prizeStock = valueOperations.get(prizeStockKey);
log.info("tryLock success, key = [{}]", lockKey);
try {
if (prizeStock != null && (Integer) prizeStock > 0) {
//更新库存
((ActivityPrizeBiz) AopContext.currentProxy()).updatePrizeStock(prizeType, activityPrize.getSerialNumber());
//更新缓存库存
valueOperations.decrement(prizeStockKey);
//设置为已中奖
activityWinningRecord.setHasWinning(1);
activityWinningRecord.setIconPath(activityPrize.getIconPath()); activityWinningRecord.setIconPath(activityPrize.getIconPath());
activityWinningRecord.setLotteryTime(new Date());
} else {
activityPrize = notActivityPrize;
}
} catch (Exception ex) {
log.error("抽奖失败:【{}】", ex);
rLock.unlock();
} finally {
rLock.unlock();
log.info("releaseLock success, key = [{}]", lockKey);
}
} else {
// 获取锁失败
log.info("tryLock fail, key = [{}]", lockKey);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (PrizeTypeEnum.LOCALE.getCode() == prizeType) {
//兑奖码生成
String expireDateCodeKey = String.format("%s:%s%d",lotteryDate.substring(0,4),LOTTERY_PRE_KEY, activityId);
Long expireDateCodeCounter = valueOperations.increment(expireDateCodeKey);
if (expireDateCodeCounter == 1) {
redisTemplate.expire(expireDateCodeKey, expirDays, TimeUnit.DAYS);
}
String expiryDateCode = ReferralCodeUtil.encode(expireDateCodeCounter.intValue());
activityWinningRecord.setExpiryDateCode(expiryDateCode);
lotteryVo.setExpiryDateCode(expiryDateCode);
}
//发放优惠券
if (activityPrize.getPrizeGoodsType() == PrizeGoodsTypeEnum.COUPON.getCode()) {
UserCouponSendDTO userCouponSendDTO = new UserCouponSendDTO();
userCouponSendDTO.setCouponId(activityPrize.getGoodsId());
userCouponSendDTO.setCouponNum(1);
userCouponSendDTO.setPhone(appUserDTO.getUsername());
userCouponBiz.sendCoupon(userCouponSendDTO);
activityWinningRecord.setGoodsId(activityPrize.getGoodsId());
}
}
activityWinningRecord.setPrizeName(activityPrize.getName());
activityWinningRecordBiz.saveRecord(activityWinningRecord); activityWinningRecordBiz.saveRecord(activityWinningRecord);
lotteryVo.setSerialNumber(activityPrize.getSerialNumber());
//更改对应抽奖类型的抽奖次数
activityAttendanceRecordBiz.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId, appUserDTO.getUserid(), prizeType);
valueOperations.decrement(lotteryNumKey);
} else {
lotteryVo.setMessage("抽奖次数已用完!!!");
}
return lotteryVo; return lotteryVo;
} }
/**
* 更新库存
*
* @param prizeType
* @param serialNumber
*/
@Async
public void updatePrizeStock(Integer prizeType, Integer serialNumber) {
mapper.updatePrizeStock(prizeType, serialNumber);
}
} }
\ No newline at end of file
package com.xxfc.platform.activity.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.nio.charset.Charset;
/**
* ${DESCRIPTION}
*
* @author wanghaobin
* @create 2017-06-21 8:39
*/
@Configuration
@Primary
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer(Charset.forName("UTF-8"));
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
return redisTemplate;
}
}
package com.xxfc.platform.activity.config;
import org.redisson.api.*;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author libin
* @version 1.0
* @description TODO
* @data 2019/6/20 16:51
*/
@Component
public class RedissonLock {
@Resource
private RedissonClient redissonClient;
/**
* 获取锁
* @param key
* @return
*/
public RLock getRLock(String key){
return redissonClient.getLock(key);
}
/**
* 获取读写锁
* @param key
* @return
*/
public RReadWriteLock getRWLock(String key){
return redissonClient.getReadWriteLock(key);
}
/**
* 获取记数锁
* @param key
* @return
*/
public RCountDownLatch getRCountDownLatch(String key){
return redissonClient.getCountDownLatch(key);
}
/**
* 获取消息的Topic
* @param key
* @return
*/
public RTopic getRTopic(String key){
RTopic rTopic = redissonClient.getTopic(key);
return rTopic;
}
}
...@@ -3,6 +3,7 @@ package com.xxfc.platform.activity.mapper; ...@@ -3,6 +3,7 @@ package com.xxfc.platform.activity.mapper;
import com.xxfc.platform.activity.dto.ActivityAttendanceRecordDTO; import com.xxfc.platform.activity.dto.ActivityAttendanceRecordDTO;
import com.xxfc.platform.activity.dto.ActivityAttendanceRecordFindDTO; import com.xxfc.platform.activity.dto.ActivityAttendanceRecordFindDTO;
import com.xxfc.platform.activity.entity.ActivityAttendanceRecord; import com.xxfc.platform.activity.entity.ActivityAttendanceRecord;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.Mapper;
import java.util.List; import java.util.List;
...@@ -17,4 +18,8 @@ import java.util.List; ...@@ -17,4 +18,8 @@ import java.util.List;
public interface ActivityAttendanceRecordMapper extends Mapper<ActivityAttendanceRecord> { public interface ActivityAttendanceRecordMapper extends Mapper<ActivityAttendanceRecord> {
List<ActivityAttendanceRecordDTO> selectActivityAttendanceRecord(ActivityAttendanceRecordFindDTO activityAttendanceRecordFindDTO); List<ActivityAttendanceRecordDTO> selectActivityAttendanceRecord(ActivityAttendanceRecordFindDTO activityAttendanceRecordFindDTO);
void updateLotteryNumByActivityIdAndUserIdAndPrizeType(@Param("activityId") Integer activityId,
@Param("userId") Integer userId,
@Param("prizeType") Integer prizeType);
} }
package com.xxfc.platform.activity.mapper; package com.xxfc.platform.activity.mapper;
import com.xxfc.platform.activity.entity.ActivityPrize; import com.xxfc.platform.activity.entity.ActivityPrize;
import org.apache.ibatis.annotations.Param;
import tk.mybatis.mapper.additional.insert.InsertListMapper; import tk.mybatis.mapper.additional.insert.InsertListMapper;
import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.Mapper;
...@@ -13,4 +14,6 @@ import tk.mybatis.mapper.common.Mapper; ...@@ -13,4 +14,6 @@ import tk.mybatis.mapper.common.Mapper;
*/ */
public interface ActivityPrizeMapper extends Mapper<ActivityPrize>, InsertListMapper<ActivityPrize> { public interface ActivityPrizeMapper extends Mapper<ActivityPrize>, InsertListMapper<ActivityPrize> {
void updatePrizeStock(@Param("prizeType") Integer prizeType,
@Param("serialNumber") Integer serialNumber);
} }
...@@ -4,7 +4,6 @@ import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO; ...@@ -4,7 +4,6 @@ import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.xxfc.platform.activity.biz.ActivityPrizeBiz; import com.xxfc.platform.activity.biz.ActivityPrizeBiz;
import com.xxfc.platform.activity.entity.ActivityPrize; import com.xxfc.platform.activity.entity.ActivityPrize;
import com.xxfc.platform.activity.vo.ActivityPrizeVo;
import com.xxfc.platform.activity.vo.LotteryVo; import com.xxfc.platform.activity.vo.LotteryVo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -48,8 +47,9 @@ public class ActivityPrizeController { ...@@ -48,8 +47,9 @@ public class ActivityPrizeController {
@PostMapping("/lottery/{activityId}/{prizeType}") @PostMapping("/lottery/{activityId}/{prizeType}")
public ObjectRestResponse<LotteryVo> activityLottery(@PathVariable(value = "activityId") Integer activityId, public ObjectRestResponse<LotteryVo> activityLottery(@PathVariable(value = "activityId") Integer activityId,
@PathVariable(value = "prizeType") Integer prizeType, @PathVariable(value = "prizeType") Integer prizeType,
@RequestParam(value = "lottery") String lottery,
AppUserDTO appUserDTO) { AppUserDTO appUserDTO) {
LotteryVo lotteryVo = activityPrizeBiz.activityLottery(activityId,prizeType,appUserDTO); LotteryVo lotteryVo = activityPrizeBiz.activityLottery(activityId,prizeType,lottery,appUserDTO);
return ObjectRestResponse.succ(lotteryVo); return ObjectRestResponse.succ(lotteryVo);
} }
......
package com.xxfc.platform.activity.rest.admin; package com.xxfc.platform.activity.rest.admin;
import com.github.wxiaoqi.security.common.annotation.BeanValid;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.xxfc.platform.activity.biz.ActivityPrizeBiz; import com.xxfc.platform.activity.biz.ActivityPrizeBiz;
import com.xxfc.platform.activity.entity.ActivityPrize; import com.xxfc.platform.activity.entity.ActivityPrize;
...@@ -24,7 +25,7 @@ public class ActivityPrizeAdminController { ...@@ -24,7 +25,7 @@ public class ActivityPrizeAdminController {
private final ActivityPrizeBiz activityPrizeBiz; private final ActivityPrizeBiz activityPrizeBiz;
@PostMapping("/save") @PostMapping("/save")
public ObjectRestResponse<Void> savePrize(@RequestBody List<ActivityPrize> activityPrizes) { public ObjectRestResponse<Void> savePrize(@BeanValid @RequestBody List<ActivityPrize> activityPrizes) {
activityPrizeBiz.saveActivityPrizes(activityPrizes); activityPrizeBiz.saveActivityPrizes(activityPrizes);
return ObjectRestResponse.succ(); return ObjectRestResponse.succ();
} }
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
aar.user_name as `userName`, aar.user_name as `userName`,
aar.phone, aar.phone,
aar.position_name as `positionName`, aar.position_name as `positionName`,
apr.inviteNum, IFNULL(apr.inviteNum,0),
awr.prizes awr.prizes
from (select `user_id`,`popularize_id`,`current_progress`,`status`,`crt_time` from activity_popularize_user where from (select `user_id`,`popularize_id`,`current_progress`,`status`,`crt_time` from activity_popularize_user where
`popularize_id`=#{activityId} `popularize_id`=#{activityId}
...@@ -64,4 +64,21 @@ ...@@ -64,4 +64,21 @@
order by apu.current_progress desc order by apu.current_progress desc
</select> </select>
<update id="updateLotteryNumByActivityIdAndUserIdAndPrizeType">
update `activity_attendance_record`
<if test="prizeType==1">
set `online_lottery_num`=`online_lottery_num`-1
</if>
<if test="prizeType==2">
set `locale_lottery_num`=`locale_lottery_num`-1
</if>
where `activity_id`=#{activityId} and `user_id`=#{userId}
<if test="prizeType==1">
and `online_lottery_num`>0
</if>
<if test="prizeType==2">
and `locale_lottery_num`>0
</if>
</update>
</mapper> </mapper>
\ No newline at end of file
...@@ -14,9 +14,12 @@ ...@@ -14,9 +14,12 @@
<result property="probability" column="probability"/> <result property="probability" column="probability"/>
<result property="type" column="type"/> <result property="type" column="type"/>
<result property="crtTime" column="crt_time"/> <result property="crtTime" column="crt_time"/>
<result property="isEntity" column="is_entity"/>
<result property="goodsId" column="goods_id"/> <result property="goodsId" column="goods_id"/>
<result property="isPrize" column="is_prize"/> <result property="prizeGoodsType" column="prize_goods_type"/>
</resultMap> </resultMap>
<update id="updatePrizeStock">
update `activity_prize` set `total_stock`=`total_stock`-1 where `type`=#{prizeType} and `serial_number`=#{serialNumber} and `total_stock`>0;
</update>
</mapper> </mapper>
\ No newline at end of file
...@@ -19,7 +19,7 @@ ...@@ -19,7 +19,7 @@
</resultMap> </resultMap>
<select id="selectActivityWinningRecord" resultType="com.xxfc.platform.activity.dto.ActivityWinningRecordPageDTO"> <select id="selectActivityWinningRecord" resultType="com.xxfc.platform.activity.dto.ActivityWinningRecordPageDTO">
select * from `activity_winning_record` as `awr` select aar.user_id as `userId`,aar.user_name as `userName`, aar.phone as `phone`,aar.position_name as `positionName`,awr.* from `activity_winning_record` as `awr`
left join `activity_attendance_record` as `aar` ON aar.user_id=awr.user_id and aar.activity_id=awr.activity_id left join `activity_attendance_record` as `aar` ON aar.user_id=awr.user_id and aar.activity_id=awr.activity_id
where 1=1 where 1=1
<if test="activityId!=null"> <if test="activityId!=null">
......
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