瀏覽代碼

Merge branch 'dev_v1.3.5_20220929'

Eric 3 年之前
父節點
當前提交
13dd91e6b6
共有 21 個文件被更改,包括 622 次插入39 次删除
  1. 2 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  2. 40 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/teacher/TeacherVO.java
  3. 5 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java
  4. 11 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java
  5. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java
  6. 40 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherQueryInfo.java
  7. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java
  8. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  9. 7 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java
  10. 69 23
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  11. 16 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  12. 16 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  13. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java
  14. 77 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/activity/UserRewardWrapper.java
  15. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java
  16. 10 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml
  17. 18 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  18. 4 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentActivityController.java
  19. 91 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/ActivityVo.java
  20. 43 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ActivityController.java
  21. 136 0
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/io/request/ActivityVo.java

+ 2 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.yonge.cooleshow.admin.io.request.TeacherBindingUserVo;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
 import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
 import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
@@ -324,7 +325,7 @@ public class TeacherController extends BaseController {
             return failed("无效的请求参数");
         }
 
-        IPage<MyFens> pages = teacherService.queryMyFans(PageUtil.getPage(query), query.getTeacherId());
+        IPage<MyFens> pages = teacherService.queryMyFans(PageUtil.getPage(query), TeacherQueryInfo.FansQuery.from(query.jsonString()));
 
         // 数据转换
         List<TeacherVO.TeacherFans> responses = JSON.parseArray(JSON.toJSONString(pages.getRecords()),

+ 40 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/teacher/TeacherVO.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -59,8 +60,47 @@ public class TeacherVO {
     @AllArgsConstructor
     public static class TeacherFansQuery extends QueryInfo {
 
+        @ApiModelProperty("搜索条件:昵称/编号/手机号")
+        private String search;
+
         @ApiModelProperty("老师ID")
         private Long teacherId;
+
+        @ApiModelProperty("开始时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Date startTime;
+
+        @ApiModelProperty("结束时间")
+        @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+        private Date endTime;
+
+        private String nickname;
+        private Long userId;
+        private String phone;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public void setSearch(String search) {
+            if (StringUtils.isNotEmpty(search)) {
+
+                if (search.matches(MK.EXP_INT)) {
+
+                    if (search.matches(MK.EXP_MOBILE_NUMBER)) {
+
+                        setPhone(search);
+                    } else {
+                        setUserId(Long.parseLong(search));
+                    }
+
+                } else {
+                    // 昵称
+                    setNickname(search);
+                }
+            }
+            this.search = search;
+        }
     }
 
     /**

+ 5 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.dto.BasicUserInfo;
 import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.HotTeacherVo;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
@@ -88,11 +89,11 @@ public interface TeacherDao extends BaseMapper<Teacher> {
 
     /**
      * 查询我的粉丝
-     * @param page
-     * @param teacherId
-     * @return
+     * @param page IPage<MyFens>
+     * @param query TeacherQueryInfo.FansQuery
+     * @return List<MyFens>
      */
-    List<MyFens> queryMyFans(@Param("page") IPage<MyFens> page, @Param("teacherId") Long teacherId);
+    List<MyFens> queryMyFans(@Param("page") IPage<MyFens> page, @Param("record") TeacherQueryInfo.FansQuery query);
     
     /**
      * 查询热门老师

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/OrderReq.java

@@ -83,6 +83,9 @@ public class OrderReq {
         @ApiModelProperty(value = "活动id")
         private Long activityId;
 
+        // 透传订单类型
+        private OrderTypeEnum orderType;
+
         public BigDecimal getActualPrice() {
             return actualPrice;
         }
@@ -170,6 +173,14 @@ public class OrderReq {
         public void setRecomUserId(Long recomUserId) {
             this.recomUserId = recomUserId;
         }
+
+        public OrderTypeEnum getOrderType() {
+            return orderType;
+        }
+
+        public void setOrderType(OrderTypeEnum orderType) {
+            this.orderType = orderType;
+        }
     }
 
     public Long getRewardId() {

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/OrderTypeEnum.java

@@ -16,7 +16,8 @@ public enum OrderTypeEnum implements BaseEnum<String, OrderTypeEnum> {
     VIDEO("视频课购买"),
     MUSIC("单曲点播"),
     PINAO_ROOM("琴房时长"),
-    ACTI_REGIST("活动报名")
+    ACTI_REGIST("活动报名"),
+    ALBUM("专辑购买"),
     ;
     @EnumValue
     private String code;

+ 40 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherQueryInfo.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.alibaba.fastjson.JSON;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Created by Eric.Shang on 2022/10/9.
+ */
+public class TeacherQueryInfo {
+
+    /**
+     * 老师粉丝数查询条件
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class FansQuery implements Serializable {
+
+        private Long teacherId;
+        private Date startTime;
+        private Date endTime;
+        // 昵称
+        private String nickname;
+        // 编号/手机号
+        private Long userId;
+        private String phone;
+
+        public static FansQuery from(String recv) {
+
+            return JSON.parseObject(recv, FansQuery.class);
+        }
+    }
+}

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/MusicSheetPurchaseRecordService.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 
 /**
  * MusicSheetPurchaseRecordService服务类
@@ -19,5 +20,5 @@ public interface MusicSheetPurchaseRecordService extends IService<MusicSheetPurc
      * @param musicSheetId 曲目id
      * @return boolean
      */
-    MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType);
+    MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType, PurchaseRecordTypeEnum purchaseType);
 }

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -139,6 +140,14 @@ public interface TeacherService extends IService<Teacher> {
     IPage<MyFens> queryMyFans(IPage<MyFens> page, Long teacherId);
 
     /**
+     * 老师粉丝查询
+     * @param page IPage<MyFens>
+     * @param query TeacherQueryInfo.FansQuery
+     * @return IPage<MyFens>
+     */
+    IPage<MyFens> queryMyFans(IPage<MyFens> page, TeacherQueryInfo.FansQuery query);
+
+    /**
      * 设置老师标签
      *
      * @param userId 老师id

+ 7 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetPurchaseRecordServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.MusicSheetPurchaseRecordService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,12 +33,13 @@ public class MusicSheetPurchaseRecordServiceImpl extends ServiceImpl<MusicSheetP
     }
 
     @Override
-    public MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType) {
+    public MusicSheetPurchaseRecord checkPurchase(Long userId, Long musicSheetId, ClientEnum clientType, PurchaseRecordTypeEnum purchaseType) {
         List<MusicSheetPurchaseRecord> list = this.lambdaQuery()
-                                                  .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
-                                                  .eq(MusicSheetPurchaseRecord::getStudentId, userId)
-                                                  .eq(MusicSheetPurchaseRecord::getClientType, clientType)
-                                                  .list();
+                .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
+                .eq(MusicSheetPurchaseRecord::getStudentId, userId)
+                .eq(MusicSheetPurchaseRecord::getClientType, clientType)
+                .eq(MusicSheetPurchaseRecord::getPurchaseType, purchaseType)
+                .list();
         if (CollectionUtils.isEmpty(list)) {
             return null;
         }

+ 69 - 23
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java

@@ -6,7 +6,9 @@ import com.baomidou.mybatisplus.extension.service.additional.update.impl.LambdaU
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dao.MusicAlbumDao;
 import com.yonge.cooleshow.biz.dal.dto.*;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.common.enums.ActivityShareEnum;
@@ -114,6 +116,8 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     private StudentStarService studentStarService;
     @Autowired
     private UserOrderService userOrderService;
+    @Autowired
+    private MusicAlbumDao musicAlbumMapper;
 
     public MusicSheetDao getDao() {
         return musicSheetDao;
@@ -286,7 +290,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         if (ChargeTypeEnum.CHARGE.getCode().equals(detail.getChargeType().getCode())) {
             // 学生须判断是否能播放曲目
             MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
-                    studentId, detail.getId(), userType);
+                    studentId, detail.getId(), userType, PurchaseRecordTypeEnum.MUSIC);
             if (musicSheetPurchaseRecord != null) {
                 detail.setOrderStatus(musicSheetPurchaseRecord.getOrderStatus());
                 detail.setOrderNo(musicSheetPurchaseRecord.getOrderNo());
@@ -297,7 +301,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         } else if (ChargeTypeEnum.VIP.getCode().equals(detail.getChargeType().getCode())) {
             // 先判断是否购买过
             MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
-                    studentId, detail.getId(), userType);
+                    studentId, detail.getId(), userType, PurchaseRecordTypeEnum.MUSIC);
             if (musicSheetPurchaseRecord != null) {
                 detail.setPlay(YesOrNoEnum.YES);
             } else
@@ -645,24 +649,53 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         MusicSheetPayDto musicSheetPayDto = JSON.parseObject(
                 JSON.toJSONString(orderReqInfo.getBizContent()), MusicSheetPayDto.class);
 
-        MusicSheet musicSheet = this.getById(musicSheetPayDto.getMusicSheetId());
         OrderCreateRes orderCreateRes = new OrderCreateRes();
-        if (musicSheet == null) {
-            throw new BizException("不存在曲目信息");
-        }
+        orderCreateRes.setGoodType(orderCreateRes.getGoodType());
+        orderCreateRes.setGoodNum(1);
+        orderCreateRes.setOrderType(orderReqInfo.getOrderType());
+
+        switch (orderReqInfo.getOrderType()) {
+            case MUSIC: // 单曲
+                {
+                    MusicSheet musicSheet = this.getById(musicSheetPayDto.getMusicSheetId());
+                    if (musicSheet == null) {
+                        throw new BizException("不存在曲目信息");
+                    }
 
-        // 检查已经购买
-        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(), musicSheetPayDto.getClientType());
+                    orderCreateRes.setRes(true);
+                    if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
+                        orderCreateRes.setMerchId(musicSheet.getUserId());
+                    }
 
-        orderCreateRes.setRes(true);
-        if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
-            orderCreateRes.setMerchId(musicSheet.getUserId());
+
+                    orderCreateRes.setBizId(musicSheet.getId());
+                    orderCreateRes.setOriginalPrice(musicSheet.getMusicPrice());
+                    orderCreateRes.setExpectPrice(musicSheet.getMusicPrice());
+                }
+                break;
+            case ALBUM: // 专辑
+                {
+                    MusicAlbum album = musicAlbumMapper.selectById(musicSheetPayDto.getMusicSheetId());
+
+                    if (Objects.isNull(album)) {
+                        throw new BizException("无效的专辑信息");
+                    }
+
+                    orderCreateRes.setRes(true);
+                    orderCreateRes.setMerchId(0L);
+                    orderCreateRes.setBizId(album.getId());
+                    orderCreateRes.setOriginalPrice(BigDecimal.valueOf(album.getAlbumPrice()));
+                    orderCreateRes.setExpectPrice(BigDecimal.valueOf(album.getAlbumPrice()));
+                }
+                break;
+            default:
+                break;
         }
-        orderCreateRes.setGoodType(orderCreateRes.getGoodType());
-        orderCreateRes.setBizId(musicSheet.getId());
-        orderCreateRes.setGoodNum(1);
-        orderCreateRes.setOriginalPrice(musicSheet.getMusicPrice());
-        orderCreateRes.setExpectPrice(musicSheet.getMusicPrice());
+
+        // 检查已经购买,抛出已购买异常
+        checkoutPay(orderReqInfo.getUserId(), musicSheetPayDto.getMusicSheetId(), musicSheetPayDto.getClientType(),
+                PurchaseRecordTypeEnum.valueOf(orderReqInfo.getOrderType().getCode()));
+
         return HttpResponseResult.succeed(orderCreateRes);
 
     }
@@ -674,12 +707,13 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      * @param musicSheetId 曲目id
      * @param clientType
      */
-    private void checkoutPay(Long userId, Long musicSheetId, String clientType) {
+    private void checkoutPay(Long userId, Long musicSheetId, String clientType, PurchaseRecordTypeEnum purchaseType) {
         List<MusicSheetPurchaseRecord> list = musicSheetPurchaseRecordService
                 .lambdaQuery()
                 .eq(MusicSheetPurchaseRecord::getMusicSheetId, musicSheetId)
                 .eq(MusicSheetPurchaseRecord::getStudentId, userId)
                 .eq(MusicSheetPurchaseRecord::getClientType, clientType)
+                .eq(MusicSheetPurchaseRecord::getPurchaseType, purchaseType)
                 .eq(MusicSheetPurchaseRecord::getOrderStatus, OrderStatusEnum.PAID)
                 .list();
         if (!CollectionUtils.isEmpty(list)) {
@@ -786,8 +820,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
      * @param serviceFeeAmount  服务费
      */
     private void addMusicSheetPurchaseRecord(UserOrderDetailVo userOrderDetailVo, BigDecimal actualPrice, BigDecimal serviceFeeAmount) {
-        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
+        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
+                userOrderDetailVo.getUserId(),
+                userOrderDetailVo.getBizId(),
+                userOrderDetailVo.getOrderClient(),
+                PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getOrderType().getCode()));
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -801,6 +838,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         musicSheetPurchaseRecord.setMusicSheetServiceFee(serviceFeeAmount);
         musicSheetPurchaseRecord.setOrderStatus(OrderStatusEnum.PAID);
         musicSheetPurchaseRecord.setStudentId(userOrderDetailVo.getUserId());
+        musicSheetPurchaseRecord.setPurchaseType(PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getOrderType().getCode()));
         musicSheetPurchaseRecordService.saveOrUpdate(musicSheetPurchaseRecord);
     }
 
@@ -826,8 +864,11 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
     @Transactional(rollbackFor = Exception.class)
     public void orderAfterSheet(UserOrderDetailVo userOrderDetailVo) {
         // 保存购买记录
-        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
+        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
+                userOrderDetailVo.getUserId(),
+                userOrderDetailVo.getBizId(),
+                userOrderDetailVo.getOrderClient(),
+                PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getOrderType().getCode()));
         if (musicSheetPurchaseRecord == null) {
             musicSheetPurchaseRecord = new MusicSheetPurchaseRecord();
         }
@@ -838,14 +879,19 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
         musicSheetPurchaseRecord.setOriginalPrice(userOrderDetailVo.getOriginalPrice());
         musicSheetPurchaseRecord.setOrderStatus(OrderStatusEnum.WAIT_PAY);
         musicSheetPurchaseRecord.setStudentId(userOrderDetailVo.getUserId());
+        musicSheetPurchaseRecord.setPurchaseType(PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getOrderType().getCode()));
+
         musicSheetPurchaseRecordService.saveOrUpdate(musicSheetPurchaseRecord);
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void buyMusicSheetCancel(UserOrderDetailVo userOrderDetailVo) {
-        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService
-                .checkPurchase(userOrderDetailVo.getUserId(), userOrderDetailVo.getBizId(), userOrderDetailVo.getOrderClient());
+        MusicSheetPurchaseRecord musicSheetPurchaseRecord = musicSheetPurchaseRecordService.checkPurchase(
+                userOrderDetailVo.getUserId(),
+                userOrderDetailVo.getBizId(),
+                userOrderDetailVo.getOrderClient(),
+                PurchaseRecordTypeEnum.valueOf(userOrderDetailVo.getOrderType().getCode()));
 
         if (musicSheetPurchaseRecord == null) return;
         musicSheetPurchaseRecordService.removeById(musicSheetPurchaseRecord.getId());

+ 16 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -14,6 +14,7 @@ import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
 import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import org.redisson.api.RMap;
@@ -613,7 +614,21 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
 
     public IPage<MyFens> queryMyFans(IPage<MyFens> page, Long teacherId) {
-        List<MyFens> teacherVos = baseMapper.queryMyFans(page, teacherId);
+        List<MyFens> teacherVos = baseMapper.queryMyFans(page, TeacherQueryInfo.FansQuery.builder().teacherId(teacherId).build());
+        return page.setRecords(teacherVos);
+    }
+
+    /**
+     * 老师粉丝查询
+     *
+     * @param page  IPage<MyFens>
+     * @param query TeacherQueryInfo.FansQuery
+     * @return IPage<MyFens>
+     */
+    @Override
+    public IPage<MyFens> queryMyFans(IPage<MyFens> page, TeacherQueryInfo.FansQuery query) {
+
+        List<MyFens> teacherVos = baseMapper.queryMyFans(page, query);
         return page.setRecords(teacherVos);
     }
 

+ 16 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java

@@ -349,6 +349,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 return HttpResponseResult.failed("订单商品信息获取失败");
             }
             info.setOrderNo(orderReq.getOrderNo());
+            info.setOrderType(orderReq.getOrderType());
             Long subOrderNo = idGeneratorService.generatorId("subOrderNo");
             info.setSubOrderNo(Long.toString(subOrderNo));
             info.setUserId(orderReq.getUserId());
@@ -663,6 +664,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
             UserOrderDetailVo orderDetail = new UserOrderDetailVo();
             orderDetail.setOrderNo(data.getOrderNo());
+            orderDetail.setOrderType(orderReq.getOrderType());
             orderDetail.setSubOrderNo(data.getSubOrderNo());
             orderDetail.setMerchId(res.getMerchId());
             orderDetail.setGoodType(res.getGoodType());
@@ -800,10 +802,17 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             return;
         }
 
+        // 订单基本信息
+        UserOrder order = getById(userOrder.getId());
+        if (Objects.isNull(order)) {
+            throw new BizException("无效的订单编号");
+        }
+
         List<UserOrderDetailVo> orderDetailList = orderDetailService.getOrderDetilListByOrderNo(userOrder.getOrderNo());
         for (UserOrderDetailVo orderDetailVo : orderDetailList) {
             orderDetailVo.setUserId(userOrder.getUserId());
             orderDetailVo.setOrderId(userOrder.getId());
+            orderDetailVo.setOrderType(order.getOrderType());
             //调用业务
             Consumer<UserOrderDetailVo> userOrderVoConsumer = orderCancel.get(orderDetailVo.getGoodType());
             if (!Objects.isNull(userOrderVoConsumer)) {
@@ -841,6 +850,12 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
                 && !OrderStatusEnum.PAYING.equals(detail.getStatus())) {
             return;
         }
+        // 用户订单信息
+        UserOrder order = getById(detail.getId());
+        if (Objects.isNull(order)) {
+            throw new BizException("无效的订单编号");
+        }
+
         //修改订单状态
         Date now = new Date();
         detail.setStatus(OrderStatusEnum.PAID);
@@ -882,6 +897,7 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
             orderDetailVo.setRecomUserId(detail.getRecomUserId());
             orderDetailVo.setActivityId(detail.getActivityId());
             orderDetailVo.setRewardId(detail.getRewardId());
+            orderDetailVo.setOrderType(order.getOrderType());
             //调用业务
             Consumer<UserOrderDetailVo> userOrderVoConsumer = orderSuccess.get(orderDetailVo.getGoodType());
             if (!Objects.isNull(userOrderVoConsumer)) {

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserOrderDetailVo.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo;
 
 import com.yonge.cooleshow.biz.dal.entity.UserOrderDetail;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -42,6 +43,9 @@ public class UserOrderDetailVo extends UserOrderDetail {
     @ApiModelProperty("活动奖品id")
     private Long rewardId;
 
+    // 透传订单类型
+    private OrderTypeEnum orderType;
+
     public Long getRewardId() {
         return rewardId;
     }
@@ -121,4 +125,12 @@ public class UserOrderDetailVo extends UserOrderDetail {
     public void setRecomUserId(Long recomUserId) {
         this.recomUserId = recomUserId;
     }
+
+    public OrderTypeEnum getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(OrderTypeEnum orderType) {
+        this.orderType = orderType;
+    }
 }

+ 77 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/activity/UserRewardWrapper.java

@@ -1,5 +1,11 @@
 package com.yonge.cooleshow.biz.dal.vo.activity;
 
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
 /**
  * Description
  *
@@ -7,4 +13,75 @@ package com.yonge.cooleshow.biz.dal.vo.activity;
  * @date 2022-10-09
  */
 public class UserRewardWrapper {
+
+
+    // ("领奖id")
+    private Long receiveRewardId;
+
+    // ("奖品名称 ")
+    private String rewardName;
+
+     // ("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 COUPON(优惠券)")
+    private RewardTypeEnum rewardType;
+
+    // ("奖品描述 ")
+    private String rewardDescribe;
+
+    // ("奖品图片 ")
+    private String imgUrl;
+
+    // ("获奖时间")
+    private Date winningTime;
+
+    public Long getReceiveRewardId() {
+        return receiveRewardId;
+    }
+
+    public void setReceiveRewardId(Long receiveRewardId) {
+        this.receiveRewardId = receiveRewardId;
+    }
+
+    public String getRewardName() {
+        return rewardName;
+    }
+
+    public void setRewardName(String rewardName) {
+        this.rewardName = rewardName;
+    }
+
+    public RewardTypeEnum getRewardType() {
+        return rewardType;
+    }
+
+    public void setRewardType(RewardTypeEnum rewardType) {
+        this.rewardType = rewardType;
+    }
+
+    public String getRewardDescribe() {
+        return rewardDescribe;
+    }
+
+    public void setRewardDescribe(String rewardDescribe) {
+        this.rewardDescribe = rewardDescribe;
+    }
+
+    public String getImgUrl() {
+        return imgUrl;
+    }
+
+    public void setImgUrl(String imgUrl) {
+        this.imgUrl = imgUrl;
+    }
+
+    public Date getWinningTime() {
+        return winningTime;
+    }
+
+    public void setWinningTime(Date winningTime) {
+        this.winningTime = winningTime;
+    }
+
+    public String jsonString() {
+        return JSON.toJSONString(this);
+    }
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java

@@ -1,6 +1,7 @@
 package com.yonge.cooleshow.biz.dal.vo.res;
 
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -42,6 +43,9 @@ public class OrderCreateRes {
     @ApiModelProperty(value = "冗余字段,用于传递参数用")
     private Object bizParam;
 
+    // 透传订单类型
+    private OrderTypeEnum orderType;
+
     public Long getRewardId() {
         return rewardId;
     }
@@ -145,4 +149,12 @@ public class OrderCreateRes {
     public void setCouponAmount(BigDecimal couponAmount) {
         this.couponAmount = couponAmount;
     }
+
+    public OrderTypeEnum getOrderType() {
+        return orderType;
+    }
+
+    public void setOrderType(OrderTypeEnum orderType) {
+        this.orderType = orderType;
+    }
 }

+ 10 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml

@@ -106,7 +106,7 @@
     </update>
     <sql id="selectReceiveRewardSql">
         <where>
-            ar.reward_type != 'ACTUAL'
+            ar.reward_type_ != 'ACTUAL'
             <if test="query.userId != null">
                 and aur.user_id_ = #{query.userId}
             </if>
@@ -120,9 +120,17 @@
     </sql>
 
     <select id="selectReceiveRewardList" resultType="com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper">
-        select * from
+        select
+            aur.id_ as receiveRewardId,
+            ar.reward_name_ as rewardName,
+            ar.reward_type_ as rewardType,
+            ar.reward_describe_ as rewardDescribe,
+            ar.img_url_ as imgUrl,
+            aur.winning_time_ as winningTime
+        from
         activity_user_reward aur
         left join activity_plan ap on ap.id_ = aur.activity_id_
+        left join activity_reward ar on ar.id_ = aur.reward_id_
         <include refid="selectReceiveRewardSql"/>
     </select>
     <!--分享活动关联老师-->

+ 18 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -262,7 +262,24 @@
         FROM student_star s
         LEFT JOIN sys_user u ON s.student_id_ = u.id_
         LEFT JOIN student sr ON s.student_id_ = sr.user_id_
-        WHERE u.del_flag_ = 0 and s.teacher_id_ =#{teacherId}
+        <where>
+            u.del_flag_ = 0
+            <if test="record.teacherId != null">
+                AND s.teacher_id_ =#{record.teacherId}
+            </if>
+            <if test="record.nickname != null">
+                AND u.username_ = #{record.nickname}
+            </if>
+            <if test="record.userId != null">
+                AND u.id_ = #{record.userId}
+            </if>
+            <if test="record.phone != null">
+                AND u.phone_ = #{record.phone}
+            </if>
+            <if test="record.startTime != null and record.endTime != null">
+                AND ( #{record.startTime} &lt;= s.create_time_ AND s.create_time_ &lt;= #{record.endTime})
+            </if>
+        </where>
     </select>
     
     <select id="queryHotTeacherList" resultMap="HotTeacherVoMap">

+ 4 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/StudentActivityController.java

@@ -115,6 +115,10 @@ public class StudentActivityController extends BaseController {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
 
+        query.setClient(ClientEnum.TEACHER);
+        query.setReceive(YesOrNoEnum.NO);
+        query.setUserId(user.getId());
+
         IPage<UserRewardWrapper> iPage = activityUserRewardService.receiveRewardList(PageUtil.getPage(query), UserRewardQueryInfo.from(query.jsonString()));
 
         // 数据转换

+ 91 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/io/request/ActivityVo.java

@@ -1,11 +1,15 @@
 package com.yonge.cooleshow.student.io.request;
 
 import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import java.util.Date;
+
 /**
  * Description
  *
@@ -17,12 +21,48 @@ public class ActivityVo {
     @ApiModel("ReceiveRewardQuery-活动领取奖品查询")
     public static class ReceiveRewardQuery extends QueryInfo {
 
+        // 用户id
+        @ApiModelProperty(hidden = true)
+        private Long userId;
+
+        // 客户端类型
+        @ApiModelProperty(hidden = true)
+        private ClientEnum client;
+
+
+        // 是否领取
+        @ApiModelProperty("是否已领取,1是 2:否")
+        private YesOrNoEnum receive;
 
 
         public String jsonString() {
             return JSON.toJSONString(this);
         }
 
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
+        public ClientEnum getClient() {
+            return client;
+        }
+
+        public void setClient(ClientEnum client) {
+            this.client = client;
+        }
+
+        public YesOrNoEnum getReceive() {
+            return receive;
+        }
+
+        public void setReceive(YesOrNoEnum receive) {
+            this.receive = receive;
+        }
+
     }
 
     @ApiModel("ReceiveRewardList-活动领取奖品列表")
@@ -42,5 +82,56 @@ public class ActivityVo {
 
         @ApiModelProperty("奖品图片 ")
         private String imgUrl;
+
+        @ApiModelProperty("获奖时间")
+        private Date winningTime;
+
+        public Long getReceiveRewardId() {
+            return receiveRewardId;
+        }
+
+        public void setReceiveRewardId(Long receiveRewardId) {
+            this.receiveRewardId = receiveRewardId;
+        }
+
+        public String getRewardName() {
+            return rewardName;
+        }
+
+        public void setRewardName(String rewardName) {
+            this.rewardName = rewardName;
+        }
+
+        public RewardTypeEnum getRewardType() {
+            return rewardType;
+        }
+
+        public void setRewardType(RewardTypeEnum rewardType) {
+            this.rewardType = rewardType;
+        }
+
+        public String getRewardDescribe() {
+            return rewardDescribe;
+        }
+
+        public void setRewardDescribe(String rewardDescribe) {
+            this.rewardDescribe = rewardDescribe;
+        }
+
+        public String getImgUrl() {
+            return imgUrl;
+        }
+
+        public void setImgUrl(String imgUrl) {
+            this.imgUrl = imgUrl;
+        }
+
+        public Date getWinningTime() {
+            return winningTime;
+        }
+
+        public void setWinningTime(Date winningTime) {
+            this.winningTime = winningTime;
+        }
     }
 }

+ 43 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/ActivityController.java

@@ -1,17 +1,24 @@
 package com.yonge.cooleshow.teacher.controller;
 
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.EvaluationRecordDto;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.queryInfo.UserRewardQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.service.ActivityUserRewardService;
 import com.yonge.cooleshow.biz.dal.vo.CheckVo;
+import com.yonge.cooleshow.biz.dal.vo.activity.UserRewardWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.cooleshow.teacher.io.request.ActivityVo;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -20,6 +27,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 
 @Api(tags = "活动接口")
 @RestController
@@ -48,5 +57,39 @@ public class ActivityController extends BaseController {
 
         return succeed(checkVo);
     }
+
+
+    @ApiOperation(value = "查看领奖列表")
+    @PostMapping("/receiveRewardList")
+    public HttpResponseResult<PageInfo<ActivityVo.ReceiveRewardList>> receiveRewardList(@RequestBody ActivityVo.ReceiveRewardQuery query){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        query.setClient(ClientEnum.TEACHER);
+        query.setReceive(YesOrNoEnum.NO);
+        query.setUserId(user.getId());
+
+        IPage<UserRewardWrapper> iPage = activityUserRewardService.receiveRewardList(PageUtil.getPage(query), UserRewardQueryInfo.from(query.jsonString()));
+
+        // 数据转换
+        List<ActivityVo.ReceiveRewardList> pageInfos = JSON.parseArray(JSON.toJSONString(iPage.getRecords()),
+                                                                       ActivityVo.ReceiveRewardList.class);
+
+        return succeed(PageUtil.getPageInfo(iPage,pageInfos));
+    }
+
+
+    @ApiOperation(value = "领取奖品")
+    @PostMapping("/receiveReward/{receiveRewardId}")
+    public HttpResponseResult<CheckVo> receiveReward(@PathVariable Long receiveRewardId){
+
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        return status(activityUserRewardService.receiveReward(user.getId(), receiveRewardId));
+    }
 }
 

+ 136 - 0
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/io/request/ActivityVo.java

@@ -0,0 +1,136 @@
+package com.yonge.cooleshow.teacher.io.request;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-09
+ */
+public class ActivityVo {
+
+    @ApiModel("ReceiveRewardQuery-活动领取奖品查询")
+    public static class ReceiveRewardQuery extends QueryInfo {
+
+        // 用户id
+        @ApiModelProperty(hidden = true)
+        private Long userId;
+
+        // 客户端类型
+        @ApiModelProperty(hidden = true)
+        private ClientEnum client;
+
+
+        // 是否领取
+        @ApiModelProperty("是否已领取,1是 2:否")
+        private YesOrNoEnum receive;
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
+        public ClientEnum getClient() {
+            return client;
+        }
+
+        public void setClient(ClientEnum client) {
+            this.client = client;
+        }
+
+        public YesOrNoEnum getReceive() {
+            return receive;
+        }
+
+        public void setReceive(YesOrNoEnum receive) {
+            this.receive = receive;
+        }
+    }
+
+    @ApiModel("ReceiveRewardList-活动领取奖品列表")
+    public static class ReceiveRewardList {
+
+        @ApiModelProperty("领奖id")
+        private Long receiveRewardId;
+
+        @ApiModelProperty("奖品名称 ")
+        private String rewardName;
+
+        @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 COUPON(优惠券)")
+        private RewardTypeEnum rewardType;
+
+        @ApiModelProperty("奖品描述 ")
+        private String rewardDescribe;
+
+        @ApiModelProperty("奖品图片 ")
+        private String imgUrl;
+
+        @ApiModelProperty("获奖时间")
+        private Date winningTime;
+
+        public Long getReceiveRewardId() {
+            return receiveRewardId;
+        }
+
+        public void setReceiveRewardId(Long receiveRewardId) {
+            this.receiveRewardId = receiveRewardId;
+        }
+
+        public String getRewardName() {
+            return rewardName;
+        }
+
+        public void setRewardName(String rewardName) {
+            this.rewardName = rewardName;
+        }
+
+        public RewardTypeEnum getRewardType() {
+            return rewardType;
+        }
+
+        public void setRewardType(RewardTypeEnum rewardType) {
+            this.rewardType = rewardType;
+        }
+
+        public String getRewardDescribe() {
+            return rewardDescribe;
+        }
+
+        public void setRewardDescribe(String rewardDescribe) {
+            this.rewardDescribe = rewardDescribe;
+        }
+
+        public String getImgUrl() {
+            return imgUrl;
+        }
+
+        public void setImgUrl(String imgUrl) {
+            this.imgUrl = imgUrl;
+        }
+
+        public Date getWinningTime() {
+            return winningTime;
+        }
+
+        public void setWinningTime(Date winningTime) {
+            this.winningTime = winningTime;
+        }
+    }
+}