Commit 6ddd65ec authored by libin's avatar libin

抽奖逻修改

parent 3eda9793
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;
}
}
......@@ -18,4 +18,5 @@ public class LotteryVo {
private String prizeName;
private Integer serialNumber;
private String expiryDateCode;
private String message;
}
......@@ -9,6 +9,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
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 tk.mybatis.spring.annotation.MapperScan;
......@@ -24,6 +26,8 @@ import tk.mybatis.spring.annotation.MapperScan;
"com.github.wxiaoqi.security.common.log",
"com.github.wxiaoqi.security.admin.support.aop"
})
@EnableAspectJAutoProxy(exposeProxy = true)
@EnableAsync
@EnableDiscoveryClient
@EnableScheduling
@EnableAceAuthClient
......
......@@ -13,6 +13,7 @@ import com.xxfc.platform.activity.entity.ActivityAttendanceRecord;
import com.xxfc.platform.activity.mapper.ActivityAttendanceRecordMapper;
import com.xxfc.platform.activity.vo.ActivityAttendanceRecordTotalVo;
import com.xxfc.platform.activity.vo.ActivityAttendanceRecordVo;
import lombok.RequiredArgsConstructor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellRangeAddress;
......@@ -20,18 +21,20 @@ import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.assertj.core.util.Lists;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
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.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.function.Supplier;
import java.util.stream.Stream;
......@@ -44,19 +47,35 @@ import java.util.stream.Stream;
*/
@Transactional(rollbackFor = Exception.class)
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecordMapper,ActivityAttendanceRecord> {
@Resource(name = "redisTemplate")
private ValueOperations<String, Object> valueOperations;
private final RedisTemplate<String,Object> redisTemplate;
public void attendActivity(Integer activityId, String activityName,AppUserDTO appUserDTO) {
ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord();
activityAttendanceRecord.setActivityId(activityId);
activityAttendanceRecord.setActivityName(activityName);
activityAttendanceRecord.setUserId(appUserDTO.getUserid());
activityAttendanceRecord.setPhone(appUserDTO.getUsername());
activityAttendanceRecord.setUserName(StringUtils.isEmpty(appUserDTO.getRealname())?appUserDTO.getNickname():appUserDTO.getRealname());
activityAttendanceRecord.setPositionId(appUserDTO.getPositionId());
activityAttendanceRecord.setPositionName(appUserDTO.getPositionName());
activityAttendanceRecord.setCrtTime(new Date());
mapper.insertSelective(activityAttendanceRecord);
ActivityAttendanceRecord record = new ActivityAttendanceRecord();
record.setActivityId(activityId);
record.setUserId(appUserDTO.getUserid());
int num = mapper.selectCount(record);
if (num==0) {
ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord();
activityAttendanceRecord.setActivityId(activityId);
activityAttendanceRecord.setActivityName(activityName);
activityAttendanceRecord.setUserId(appUserDTO.getUserid());
activityAttendanceRecord.setPhone(appUserDTO.getUsername());
activityAttendanceRecord.setUserName(StringUtils.isEmpty(appUserDTO.getRealname()) ? appUserDTO.getNickname() : appUserDTO.getRealname());
activityAttendanceRecord.setPositionId(appUserDTO.getPositionId());
activityAttendanceRecord.setPositionName(appUserDTO.getPositionName());
activityAttendanceRecord.setCrtTime(new Date());
mapper.insertSelective(activityAttendanceRecord);
String onlineKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, PrizeTypeEnum.ONLINE.getCode());
String localeKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, PrizeTypeEnum.LOCALE.getCode());
redisTemplate.delete(Arrays.asList(onlineKey,localeKey));
valueOperations.set(onlineKey, 1L);
valueOperations.set(localeKey, 1L);
}
}
......@@ -99,6 +118,10 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
}
public Boolean hasNumberOfLuckyDrawByType(Integer activityId, Integer prizeType, Integer userid) {
Object lotteryNum = valueOperations.get(String.format("%d:%d:%d", userid, activityId, prizeType));
if (lotteryNum!=null){
return Integer.valueOf(lotteryNum.toString()) >0;
}
ActivityAttendanceRecord activityAttendanceRecord = new ActivityAttendanceRecord();
activityAttendanceRecord.setActivityId(activityId);
activityAttendanceRecord.setUserId(userid);
......@@ -107,9 +130,11 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
return false;
}
if (prizeType == PrizeTypeEnum.ONLINE.getCode()){
valueOperations.set(String.format("%d:%d:%d", userid, activityId, prizeType),activityAttendanceRecord.getOnlineLotteryNum());
return activityAttendanceRecord.getOnlineLotteryNum()>0;
}
if (prizeType ==PrizeTypeEnum.LOCALE.getCode()){
valueOperations.set(String.format("%d:%d:%d", userid, activityId, prizeType),activityAttendanceRecord.getLocaleLotteryNum());
return activityAttendanceRecord.getLocaleLotteryNum()>0;
}
return false;
......@@ -172,6 +197,7 @@ public class ActivityAttendanceRecordBiz extends BaseBiz<ActivityAttendanceRecor
timeStr};
}
@Async
public void updateLotteryNumByActivityIdAndUserIdAndPrizeType(Integer activityId,Integer userId,Integer prizeType){
mapper.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId,userId,prizeType);
}
......
package com.xxfc.platform.activity.biz;
import cn.hutool.core.date.DateUtil;
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.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.dto.UserCouponSendDTO;
import com.xxfc.platform.activity.entity.ActivityPrize;
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.vo.ActivityPrizeVo;
import com.xxfc.platform.activity.vo.LotteryVo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.scheduling.annotation.Async;
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 tk.mybatis.mapper.entity.Example;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
......@@ -34,6 +41,7 @@ import java.util.stream.Collectors;
* @email 18178966185@163.com
* @date 2019-12-03 16:46:02
*/
@Slf4j
@Transactional(rollbackFor = Exception.class)
@Service
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
......@@ -46,8 +54,8 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
private final RedisTemplate<String, Object> redisTemplate;
@Resource(name = "redisTemplate")
private ValueOperations<String, Object> valueOperations;
private final String LOTTERY_PRE_KEY ="lottery";
private final RedissonLock redissonLock;
private final String LOTTERY_PRE_KEY ="lottery:";
/**
* 查询奖品
......@@ -71,6 +79,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
*
* @param activityPrizes
*/
@CacheClear(pre = LOTTERY_PRE_KEY)
public void saveActivityPrizes(List<ActivityPrize> activityPrizes) {
if (CollectionUtils.isEmpty(activityPrizes)) {
throw new BaseException("奖品不能为空");
......@@ -98,6 +107,7 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* @param prizeType
* @return
*/
@Cache(key = LOTTERY_PRE_KEY+"{1}")
public List<ActivityPrize> findActivityPrizeByType(Integer prizeType) {
Example example = new Example(ActivityPrize.class);
example.orderBy("serialNumber").asc();
......@@ -107,13 +117,20 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
if (CollectionUtils.isEmpty(activityPrizes)) {
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()));
}
}
return activityPrizes;
}
/**
* 抽奖
* //todo
*
* @param activityId
* @param prizeType
......@@ -122,75 +139,108 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
*/
public LotteryVo activityLottery(Integer activityId, Integer prizeType, String lotteryDate,AppUserDTO appUserDTO) {
LotteryVo lotteryVo = new LotteryVo();
/* Boolean hasNum = activityAttendanceRecordBiz.hasNumberOfLuckyDrawByType(activityId, prizeType, appUserDTO.getUserid());
if (!hasNum){
lotteryVo.setPrizeName("谢谢惠顾");
lotteryVo.setSerialNumber(8);
return 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(0);
activityPrize.setPrizeGoodsType(PrizeGoodsTypeEnum.NO_PRIZE.getCode());
activityPrize.setType(prizeType);
activityPrize.setSerialNumber(8);
return activityPrize;
});
int index = LotteryUtils.getrandomIndex(activityPrizes);
ActivityPrize activityPrize = activityPrizes.get(index);
try {
//库存为0
if (activityPrize.getPrizeGoodsType() != 0 && activityPrize.getTotalStock() != null && activityPrize.getTotalStock() == 0) {
activityPrize = notActivityPrize;
String lotteryNumKey = String.format("%d:%d:%d", appUserDTO.getUserid(), activityId, prizeType);
Object lotteryNum = valueOperations.get(lotteryNumKey);
boolean hasLotteryNum = lotteryNum ==null?activityAttendanceRecordBiz.hasNumberOfLuckyDrawByType(activityId,prizeType,appUserDTO.getUserid()):((Integer)lotteryNum) >0;
if (hasLotteryNum) {
//更改抽奖次数
activityAttendanceRecordBiz.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId, appUserDTO.getUserid(), prizeType);
valueOperations.decrement(lotteryNumKey);
//抽奖
int index = LotteryUtils.getrandomIndex(activityPrizes);
//获取对应的奖品
ActivityPrize activityPrize = activityPrizes.get(index);
//判断是否设置最大奖品数
if (activityPrize.getDayMaxUse() != null) {
String key = String.format("%s:%s%d:%s", lotteryDate, LOTTERY_PRE_KEY, activityId, activityPrize.getSerialNumber());
Long prizeDayUseStock = valueOperations.increment(key);
//达到日上限
if (prizeDayUseStock.intValue() > activityPrize.getDayMaxUse()) {
activityPrize = notActivityPrize;
}
}
}catch (Exception ex){
System.out.println("+++++"+activityPrize);
}
// if (activityPrize.getDayMaxUse()!=null){
// String key = String.format("%s:%s:%d:%s",lotteryDate,LOTTERY_PRE_KEY, activityId, activityPrize.getSerialNumber());
// Long prizeDayUseStock = valueOperations.increment(key);
// //达到日上限
// if (prizeDayUseStock.intValue() > activityPrize.getDayMaxUse()){
// activityPrize = notActivityPrize;
// }
// }
ActivityWinningRecord activityWinningRecord = new ActivityWinningRecord();
activityWinningRecord.setActivityId(activityId);
activityWinningRecord.setPrizeType(prizeType);
activityWinningRecord.setUserId(appUserDTO.getUserid());
activityWinningRecord.setHasWinning(0);
if (activityPrize.getPrizeGoodsType() !=0 && activityPrize.getTotalStock() != 0) {
if (PrizeTypeEnum.LOCALE.getCode() == prizeType) {
//兑奖码生成
String expiryDateCode = ReferralCodeUtil.encode(valueOperations.increment(String.valueOf(activityId)).intValue());
activityWinningRecord.setExpiryDateCode(expiryDateCode);
lotteryVo.setExpiryDateCode(expiryDateCode);
//根据商品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;
}
}
//发放优惠券
if (activityPrize.getPrizeGoodsType() == 0) {
UserCouponSendDTO userCouponSendDTO = new UserCouponSendDTO();
userCouponSendDTO.setCouponId(activityPrize.getGoodsId());
userCouponSendDTO.setCouponNum(1);
userCouponSendDTO.setPhone(appUserDTO.getUsername());
userCouponBiz.sendCoupon(userCouponSendDTO);
activityWinningRecord.setGoodsId(activityPrize.getGoodsId());
ActivityWinningRecord activityWinningRecord = new ActivityWinningRecord();
activityWinningRecord.setActivityId(activityId);
activityWinningRecord.setPrizeType(prizeType);
activityWinningRecord.setUserId(appUserDTO.getUserid());
activityWinningRecord.setHasWinning(0);
boolean hasStock = activityPrize.getPrizeGoodsType() != PrizeGoodsTypeEnum.NO_PRIZE.getCode() && activityPrize.getTotalStock() != 0 && prizeStock != null && (Integer)prizeStock != 0;
if (hasStock) {
String key = String.format("%s%d:%d:%d", LOTTERY_PRE_KEY, activityId, prizeType, activityPrize.getSerialNumber());
RLock rLock = redissonLock.getRLock(key);
try {
boolean isSuccess = rLock.tryLock(1, 2, TimeUnit.SECONDS);
if (isSuccess) {
prizeStock = valueOperations.get(prizeStockKey);
log.info("tryLock success, key = [{}]", key);
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.setLotteryTime(new Date());
} else {
activityPrize = notActivityPrize;
}
} catch (Exception ex) {
log.error("抽奖失败:【{}】", ex);
rLock.unlock();
} finally {
rLock.unlock();
log.info("releaseLock success, key = [{}]", key);
}
} else {
// 获取锁失败
log.info("tryLock fail, key = [{}]", key);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
if (PrizeTypeEnum.LOCALE.getCode() == prizeType) {
//兑奖码生成
String expiryDateCode = ReferralCodeUtil.encode(valueOperations.increment(String.valueOf(activityId)).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());
}
}
//更改抽奖次数
activityAttendanceRecordBiz.updateLotteryNumByActivityIdAndUserIdAndPrizeType(activityId, appUserDTO.getUserid(), prizeType);
//更新库存
updatePrizeStock(prizeType, activityPrize.getSerialNumber());
//设置为已中奖
activityWinningRecord.setHasWinning(1);
activityWinningRecord.setIconPath(activityPrize.getIconPath());
activityWinningRecord.setLotteryTime(new Date());
activityWinningRecord.setPrizeName(activityPrize.getName());
activityWinningRecordBiz.saveRecord(activityWinningRecord);
lotteryVo.setSerialNumber(activityPrize.getSerialNumber());
}else{
lotteryVo.setMessage("抽奖次数已用完!!!");
}
activityWinningRecordBiz.saveRecord(activityWinningRecord);
lotteryVo.setSerialNumber(activityPrize.getSerialNumber());
return lotteryVo;
}
......@@ -200,7 +250,8 @@ public class ActivityPrizeBiz extends BaseBiz<ActivityPrizeMapper, ActivityPrize
* @param prizeType
* @param serialNumber
*/
private void updatePrizeStock(Integer prizeType, Integer serialNumber) {
@Async
public void updatePrizeStock(Integer prizeType, Integer serialNumber) {
mapper.updatePrizeStock(prizeType, serialNumber);
}
}
\ No newline at end of file
......@@ -5,9 +5,12 @@ 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}
*
......@@ -20,15 +23,15 @@ import org.springframework.data.redis.serializer.StringRedisSerializer;
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Object> userRedisTemplate(RedisConnectionFactory factory) {
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(factory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
RedisSerializer<String> stringSerializer = new StringRedisSerializer(Charset.forName("UTF-8"));
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
redisTemplate.afterPropertiesSet();
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;
}
}
......@@ -4,7 +4,6 @@ import com.github.wxiaoqi.security.admin.feign.dto.AppUserDTO;
import com.github.wxiaoqi.security.common.msg.ObjectRestResponse;
import com.xxfc.platform.activity.biz.ActivityPrizeBiz;
import com.xxfc.platform.activity.entity.ActivityPrize;
import com.xxfc.platform.activity.vo.ActivityPrizeVo;
import com.xxfc.platform.activity.vo.LotteryVo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -19,7 +19,7 @@
</resultMap>
<select id="selectActivityWinningRecord" resultType="com.xxfc.platform.activity.dto.ActivityWinningRecordPageDTO">
select awr.*,aar.* 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
where 1=1
<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