Bladeren bron

Merge branch 'online' of http://git.dayaedu.com/yonge/cooleshow into online

yonge 2 jaren geleden
bovenliggende
commit
737e4c1ff6
46 gewijzigde bestanden met toevoegingen van 787 en 176 verwijderingen
  1. 1 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/RewardTypeEnum.java
  2. 9 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderItem.java
  3. 9 0
      cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderReturnApply.java
  4. 18 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderItemMapper.xml
  5. 18 3
      cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderReturnApplyMapper.xml
  6. 1 1
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderReturnApplyServiceImpl.java
  7. 11 2
      cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java
  8. 2 2
      cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderItemDao.xml
  9. 2 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java
  10. 9 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java
  11. 4 4
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponIssueController.java
  12. 1 1
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java
  13. 18 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityEvaluationRecordDao.java
  14. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java
  15. 8 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java
  16. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityPlanDto.java
  17. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityPlanSearch.java
  18. 25 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlan.java
  19. 15 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanReward.java
  20. 24 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityReward.java
  21. 26 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityUserReward.java
  22. 34 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/activity/ActivityRankingRuleEnum.java
  23. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityPlanRewardService.java
  24. 5 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java
  25. 0 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInfoService.java
  26. 5 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponIssueService.java
  27. 24 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationRecordServiceImpl.java
  28. 35 12
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationServiceImpl.java
  29. 75 19
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java
  30. 4 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java
  31. 44 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  32. 6 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanStandardServiceImpl.java
  33. 5 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRegistrationServiceImpl.java
  34. 124 30
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java
  35. 33 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityUserRewardServiceImpl.java
  36. 12 13
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInfoServiceImp.java
  37. 15 10
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponIssueServiceImp.java
  38. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  39. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ActivityRewardVo.java
  40. 33 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserRewardVo.java
  41. 35 12
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityEvaluationRecordMapper.xml
  42. 3 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanMapper.xml
  43. 2 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml
  44. 38 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml
  45. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityUserRewardMapper.xml
  46. 1 1
      toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

+ 1 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/RewardTypeEnum.java

@@ -14,6 +14,7 @@ public enum RewardTypeEnum implements BaseEnum<String, RewardTypeEnum> {
     ACTUAL("实物"),
     VIP("小酷AI会员"),
     PIAMO_ROOM("琴房时长"),
+    COUPON("优惠券"),
     ;
 
     @EnumValue

+ 9 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderItem.java

@@ -69,8 +69,17 @@ public class OmsOrderItem implements Serializable {
     @ApiModelProperty("退货状态:-1 ->未退款;0->待处理;1->退货中;2->已完成;3->已拒绝")
     private Integer returnStatus;
 
+    private BigDecimal precisionAmount;
+
     private static final long serialVersionUID = 1L;
 
+    public BigDecimal getPrecisionAmount() {
+        return precisionAmount;
+    }
+
+    public void setPrecisionAmount(BigDecimal precisionAmount) {
+        this.precisionAmount = precisionAmount;
+    }
 
     public Long getPromoterId() {
         return promoterId;

+ 9 - 0
cooleshow-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/model/OmsOrderReturnApply.java

@@ -92,8 +92,17 @@ public class OmsOrderReturnApply implements Serializable {
     @ApiModelProperty("退货单号")
     private String deliverySn;
 
+    private BigDecimal precisionAmount;
+
     private static final long serialVersionUID = 1L;
 
+    public BigDecimal getPrecisionAmount() {
+        return precisionAmount;
+    }
+
+    public void setPrecisionAmount(BigDecimal precisionAmount) {
+        this.precisionAmount = precisionAmount;
+    }
 
     public Long getOrderItemId() {
         return orderItemId;

+ 18 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderItemMapper.xml

@@ -26,6 +26,7 @@
     <result column="returnStatus" jdbcType="INTEGER" property="returnStatus" />
     <result column="promoter_id" jdbcType="INTEGER" property="promoterId" />
     <result column="share_proportion_" jdbcType="INTEGER" property="shareProportion" />
+    <result column="precision_amount" jdbcType="INTEGER" property="precisionAmount" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -89,7 +90,7 @@
     id, order_id, order_sn, product_id, product_pic, product_name, product_brand, product_sn, 
     product_price, product_quantity, product_sku_id, product_sku_code, product_category_id, 
     promotion_name, promotion_amount, coupon_amount, integration_amount, real_amount, 
-    gift_integration, gift_growth, product_attr,promoter_id,share_proportion_
+    gift_integration, gift_growth, product_attr,promoter_id,share_proportion_,precision_amount
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItemExample" resultMap="BaseResultMap">
     select a.*,if(oora.status is null,-1,oora.status) as returnStatus from  (
@@ -133,14 +134,14 @@
       product_sku_id, product_sku_code, product_category_id, 
       promotion_name, promotion_amount, coupon_amount, 
       integration_amount, real_amount, gift_integration, 
-      gift_growth, product_attr,promoter_id,share_proportion_)
+      gift_growth, product_attr,promoter_id,share_proportion_,precision_amount)
     values (#{orderId,jdbcType=BIGINT}, #{orderSn,jdbcType=VARCHAR}, #{productId,jdbcType=BIGINT}, 
       #{productPic,jdbcType=VARCHAR}, #{productName,jdbcType=VARCHAR}, #{productBrand,jdbcType=VARCHAR}, 
       #{productSn,jdbcType=VARCHAR}, #{productPrice,jdbcType=DECIMAL}, #{productQuantity,jdbcType=INTEGER}, 
       #{productSkuId,jdbcType=BIGINT}, #{productSkuCode,jdbcType=VARCHAR}, #{productCategoryId,jdbcType=BIGINT}, 
       #{promotionName,jdbcType=VARCHAR}, #{promotionAmount,jdbcType=DECIMAL}, #{couponAmount,jdbcType=DECIMAL}, 
       #{integrationAmount,jdbcType=DECIMAL}, #{realAmount,jdbcType=DECIMAL}, #{giftIntegration,jdbcType=INTEGER}, 
-      #{giftGrowth,jdbcType=INTEGER}, #{productAttr,jdbcType=VARCHAR},#{promoterId},#{shareProportion})
+      #{giftGrowth,jdbcType=INTEGER}, #{productAttr,jdbcType=VARCHAR},#{promoterId},#{shareProportion},#{precisionAmount})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItem">
     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -214,6 +215,9 @@
       <if test="shareProportion != null">
         share_proportion_,
       </if>
+      <if test="precisionAmount != null">
+        precision_amount,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="orderId != null">
@@ -282,6 +286,9 @@
       <if test="shareProportion != null">
         #{shareProportion,jdbcType=VARCHAR},
       </if>
+      <if test="precisionAmount != null">
+        #{precisionAmount},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderItemExample" resultType="java.lang.Long">
@@ -362,6 +369,9 @@
       <if test="record.shareProportion != null">
         share_proportion_ = #{record.shareProportion,jdbcType=VARCHAR},
       </if>
+      <if test="record.precisionAmount != null">
+        precision_amount = #{record.precisionAmount,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -391,6 +401,7 @@
       gift_growth = #{record.giftGrowth,jdbcType=INTEGER},
       promoter_id = #{record.promoterId,jdbcType=INTEGER},
       share_proportion_ = #{record.shareProportion},
+      precision_amount = #{record.precisionAmount},
       product_attr = #{record.productAttr,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -465,6 +476,9 @@
       <if test="shareProportion != null">
         share_proportion_ = #{shareProportion,jdbcType=VARCHAR},
       </if>
+      <if test="precisionAmount != null">
+        precision_amount = #{precisionAmount,jdbcType=VARCHAR},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -491,6 +505,7 @@
       gift_growth = #{giftGrowth,jdbcType=INTEGER},
       promoter_id = #{promoterId,jdbcType=INTEGER},
     share_proportion_ = #{shareProportion},
+    precision_amount = #{precisionAmount},
       product_attr = #{productAttr,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>

+ 18 - 3
cooleshow-mall/mall-mbg/src/main/resources/config/mybatis/OmsOrderReturnApplyMapper.xml

@@ -11,6 +11,7 @@
     <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
     <result column="member_username" jdbcType="VARCHAR" property="memberUsername" />
     <result column="return_amount" jdbcType="DECIMAL" property="returnAmount" />
+    <result column="precision_amount" jdbcType="DECIMAL" property="precisionAmount" />
     <result column="return_name" jdbcType="VARCHAR" property="returnName" />
     <result column="return_phone" jdbcType="VARCHAR" property="returnPhone" />
     <result column="status" jdbcType="INTEGER" property="status" />
@@ -94,7 +95,7 @@
     id, order_id, company_address_id, product_id, order_sn, create_time, member_username, 
     return_amount, return_name, return_phone, status, handle_time, product_pic, product_name, 
     product_brand, product_attr, product_count, product_price, product_real_price, reason, 
-    description, proof_pics, handle_note, handle_man, receive_man, receive_time, receive_note,delivery_sn,order_item_id
+    description, proof_pics, handle_note, handle_man, receive_man, receive_time, receive_note,delivery_sn,order_item_id,precision_amount
   </sql>
   <select id="selectByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderReturnApplyExample" resultMap="BaseResultMap">
     select
@@ -138,7 +139,7 @@
       product_count, product_price, product_real_price, 
       reason, description, proof_pics, 
       handle_note, handle_man, receive_man, 
-      receive_time, receive_note,delivery_sn,order_item_id)
+      receive_time, receive_note,delivery_sn,order_item_id,precision_amount)
     values (#{orderId,jdbcType=BIGINT}, #{companyAddressId,jdbcType=BIGINT}, #{productId,jdbcType=BIGINT}, 
       #{orderSn,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{memberUsername,jdbcType=VARCHAR}, 
       #{returnAmount,jdbcType=DECIMAL}, #{returnName,jdbcType=VARCHAR}, #{returnPhone,jdbcType=VARCHAR}, 
@@ -147,7 +148,7 @@
       #{productCount,jdbcType=INTEGER}, #{productPrice,jdbcType=DECIMAL}, #{productRealPrice,jdbcType=DECIMAL}, 
       #{reason,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{proofPics,jdbcType=VARCHAR}, 
       #{handleNote,jdbcType=VARCHAR}, #{handleMan,jdbcType=VARCHAR}, #{receiveMan,jdbcType=VARCHAR}, 
-      #{receiveTime,jdbcType=TIMESTAMP}, #{receiveNote,jdbcType=VARCHAR},#{deliverySn},#{orderItemId})
+      #{receiveTime,jdbcType=TIMESTAMP}, #{receiveNote,jdbcType=VARCHAR},#{deliverySn},#{orderItemId},#{precisionAmount})
   </insert>
   <insert id="insertSelective" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderReturnApply">
     <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
@@ -239,6 +240,9 @@
       <if test="orderItemId != null">
         order_item_id,
       </if>
+      <if test="precisionAmount != null">
+        precision_amount,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="orderId != null">
@@ -325,6 +329,9 @@
       <if test="orderItemId != null">
         #{orderItemId},
       </if>
+      <if test="precisionAmount != null">
+        #{precisionAmount},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.yonge.cooleshow.mbg.model.OmsOrderReturnApplyExample" resultType="java.lang.Long">
@@ -423,6 +430,9 @@
       <if test="record.orderItemId != null">
         order_item_id = #{record.orderItemId},
       </if>
+      <if test="record.precisionAmount != null">
+        precision_amount = #{record.precisionAmount},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -458,6 +468,7 @@
       receive_time = #{record.receiveTime,jdbcType=TIMESTAMP},
       receive_note = #{record.receiveNote,jdbcType=VARCHAR},
       order_item_id = #{record.orderItemId},
+      precision_amount = #{record.precisionAmount},
       delivery_sn = #{record.deliverySn,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -550,6 +561,9 @@
       <if test="orderItemId != null">
         order_item_id = #{orderItemId},
       </if>
+      <if test="precisionAmount != null">
+        precision_amount = #{precisionAmount},
+      </if>
     </set>
     where id = #{id,jdbcType=BIGINT}
   </update>
@@ -582,6 +596,7 @@
       receive_time = #{receiveTime,jdbcType=TIMESTAMP},
       receive_note = #{receiveNote,jdbcType=VARCHAR},
       order_item_id = #{orderItemId},
+      precision_amount = #{precisionAmount},
       delivery_sn = #{deliverySn,jdbcType=VARCHAR}
     where id = #{id,jdbcType=BIGINT}
   </update>

+ 1 - 1
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderReturnApplyServiceImpl.java

@@ -90,7 +90,7 @@ public class OmsPortalOrderReturnApplyServiceImpl implements OmsPortalOrderRetur
         }
         realApply.setProductPrice(omsOrderItem.getProductPrice());
         realApply.setProductRealPrice(omsOrderItem.getRealAmount());
-
+        realApply.setPrecisionAmount(omsOrderItem.getPrecisionAmount());
         realApply.setCreateTime(new Date());
         realApply.setStatus(0);
         return returnApplyMapper.insert(realApply);

+ 11 - 2
cooleshow-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -380,7 +380,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
             }
             MallOrderItemDto teacherShareDto = new MallOrderItemDto();
             BeanUtils.copyProperties(omsOrderItem,teacherShareDto);
-            teacherShareDto.setRealAmount(omsOrderItem.getRealAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())));
+            teacherShareDto.setRealAmount(omsOrderItem.getRealAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity()))
+                                                      .subtract(omsOrderItem.getPrecisionAmount()));
             teacherShareDto.setStatus(status);
             teacherShareDto.setUserId(detail.getMemberId());
             list.add(teacherShareDto);
@@ -1312,10 +1313,18 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         for (OmsOrderItem orderItem : orderItemList) {
             //(商品价格/可用商品总价)*优惠券面额
             BigDecimal couponAmount = orderItem.getProductPrice()
-                                               .divide(totalAmount, 3, BigDecimal.ROUND_DOWN)
+                                               .divide(totalAmount, 2, BigDecimal.ROUND_DOWN)
                                                .multiply(coupon);
             orderItem.setCouponAmount(couponAmount);
+            orderItem.setPrecisionAmount(BigDecimal.ZERO);
+
         }
+        BigDecimal reduce = orderItemList.stream()
+                                         .map(omsOrderItem -> omsOrderItem.getCouponAmount().multiply(BigDecimal.valueOf(omsOrderItem.getProductQuantity())))
+                                         .reduce(BigDecimal.ZERO, BigDecimal::add);
+        OmsOrderItem omsOrderItem = orderItemList.get(0);
+        omsOrderItem.setPrecisionAmount(coupon.subtract(reduce));
+
     }
 
     /**

+ 2 - 2
cooleshow-mall/mall-portal/src/main/resources/config/mybatis/PortalOrderItemDao.xml

@@ -7,7 +7,7 @@
         product_sn, product_price, product_quantity,
         product_sku_id, product_category_id, product_sku_code,promotion_name,
         promotion_amount, coupon_amount, integration_amount,
-        real_amount,product_attr,promoter_id,share_proportion_) values
+        real_amount,product_attr,promoter_id,share_proportion_,precision_amount) values
         <foreach collection="list" item="item" separator="," index="index">
             (#{item.orderId,jdbcType=BIGINT}, #{item.orderSn,jdbcType=VARCHAR}, #{item.productId,jdbcType=BIGINT},
             #{item.productPic,jdbcType=VARCHAR}, #{item.productName,jdbcType=VARCHAR}, #{item.productBrand,jdbcType=VARCHAR},
@@ -16,7 +16,7 @@
             #{item.promotionName,jdbcType=VARCHAR},
             #{item.promotionAmount,jdbcType=DECIMAL}, #{item.couponAmount,jdbcType=DECIMAL},
             #{item.integrationAmount,jdbcType=DECIMAL},
-            #{item.realAmount,jdbcType=DECIMAL},#{item.productAttr,jdbcType=VARCHAR},#{item.promoterId},#{item.shareProportion})
+            #{item.realAmount,jdbcType=DECIMAL},#{item.productAttr,jdbcType=VARCHAR},#{item.promoterId},#{item.shareProportion},#{item.precisionAmount})
         </foreach>
     </insert>
 </mapper>

+ 2 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/config/ResourceServerConfig.java

@@ -25,8 +25,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
 	@Override
 	public void configure(HttpSecurity http) throws Exception {
 		http.csrf().disable().exceptionHandling().accessDeniedHandler(baseAccessDeniedHandler).authenticationEntryPoint(baseAuthenticationEntryPoint).and()
-				.authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
-				// .authorizeRequests().antMatchers("/task/**").permitAll()
+				// .authorizeRequests().antMatchers("/task/**").hasIpAddress("0.0.0.0/0")
+				.authorizeRequests().antMatchers("/task/**").permitAll()
 				.antMatchers("/v2/api-docs", "/code/*", "/api/*", "/appVersionInfo/queryByPlatform", "/uploadFile","/open/**").permitAll().anyRequest().authenticated()
 				.and().httpBasic();
 	}

+ 9 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/ActivityRewardController.java

@@ -9,6 +9,7 @@ import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.common.enums.RewardTypeEnum;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
@@ -30,6 +31,7 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 
 import java.util.List;
+import java.util.Optional;
 
 @RestController
 @RequestMapping("/activityReward")
@@ -94,6 +96,13 @@ public class ActivityRewardController extends BaseController {
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
+
+        // 校验请求参数
+        if (RewardTypeEnum.COUPON == activityReward.getRewardType()
+                && Optional.ofNullable(activityReward.getCouponId()).orElse(0L) <= 0) {
+            return failed("无效的优惠券ID");
+        }
+
         return status(activityRewardService.submit(activityReward, user));
     }
 

+ 4 - 4
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/coupon/CouponIssueController.java

@@ -3,13 +3,12 @@ package com.yonge.cooleshow.admin.controller.coupon;
 
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yonge.cooleshow.admin.io.request.coupon.CouponInfoVO;
 import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
+import com.yonge.cooleshow.biz.dal.enums.SendTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.coupon.CouponUseStateEnum;
-import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.CouponIssueService;
 import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
@@ -25,7 +24,7 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
-import java.time.Instant;
+import java.util.Date;
 import java.util.List;
 
 import static com.yonge.cooleshow.common.entity.HttpResponseResult.failed;
@@ -97,7 +96,8 @@ public class CouponIssueController {
         if (sysUser == null  || sysUser.getId() == null) {
             return failed("用户信息获取失败");
         }
-        couponIssueService.issueCoupon(param.getCouponId(),param.getUserParam(),sysUser.getId(),param.getRemark());
+        couponIssueService.issueCoupon(param.getCouponId(), param.getUserParam(), sysUser.getId(), param.getRemark(), true, true,
+                                       SendTypeEnum.PLATFORM, new Date());
 
         return succeed();
     }

+ 1 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/open/AdminClient.java

@@ -137,7 +137,7 @@ public class AdminClient extends BaseController {
                                    .collect(Collectors.toList());
         request.setIssueIds(collect);
         // 更新受影响优惠券数据
-        int ret = couponInfoService.updateCouponOrderInfo(CouponOrderWrapper.from(request.jsonString()));
+        int ret = couponInfoService.updateUserOrderCouponInfo(CouponOrderWrapper.from(request.jsonString()));
 
         return succeed(ret > 0);
     }

+ 18 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityEvaluationRecordDao.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingRuleEnum;
 import org.apache.ibatis.annotations.Param;
 
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
@@ -38,24 +39,33 @@ public interface ActivityEvaluationRecordDao extends BaseMapper<ActivityEvaluati
 	 * @return
 	 */
     List<Long> getJoinEvaluationIdList(@Param("activityId") Long activityId, @Param("userId") Long userId);
-	
+
 	/**
 	 * 查询指定活动指定曲目的排行榜
-	 * @param activityPlanId 指定活动
+	 *
+	 * @param activityPlanId       指定活动
 	 * @param activityEvaluationId 指定曲目
-	 * @param limit 获奖人数
+	 * @param limit                获奖人数
+	 * @param rankingRule
 	 * @return
 	 */
-	List<ActivityRankingVo> queryRankingList(@Param("activityPlanId") Long activityPlanId, @Param("activityEvaluationId") Long activityEvaluationId, @Param("limit") int limit);
-	
-	ActivityRankingVo queryUserRanking(@Param("activityPlanId") Long activityPlanId, @Param("activityEvaluationId") Long activityEvaluationId, @Param("userId") Long userId);
+	List<ActivityRankingVo> queryRankingList(@Param("activityPlanId") Long activityPlanId, @Param(
+			"activityEvaluationId") Long activityEvaluationId, @Param("limit") int limit, @Param(
+			"rankRule") ActivityRankingRuleEnum rankingRule);
+
+	ActivityRankingVo queryUserRanking(@Param("activityPlanId") Long activityPlanId, @Param(
+			"activityEvaluationId") Long activityEvaluationId, @Param("userId") Long userId, @Param(
+			"rankRule") ActivityRankingRuleEnum rankRule);
 	
 	ActivityEvaluationRecord queryLastestRecord(@Param("activityPlanId") Long activityPlanId, @Param("userId") Long userId);
 
 	/**
 	 * 用户活动最高排名信息
-	 * @param userIds 用户ID
+	 *
+	 * @param userIds     用户ID
+	 * @param rankingRule
 	 * @return List<ActivityEvaluationRecord>
 	 */
-    List<ActivityEvaluationRecord> selectUserHighestRankingInfo(@Param("activityId") Long activityId, @Param("userIds") List<Long> userIds);
+	List<ActivityEvaluationRecord> selectUserHighestRankingInfo(@Param("activityId") Long activityId, @Param(
+			"userIds") List<Long> userIds, @Param("rankRule") ActivityRankingRuleEnum rankingRule);
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityPlanRewardDao.java

@@ -25,7 +25,7 @@ public interface ActivityPlanRewardDao extends BaseMapper<ActivityPlanReward>{
 	 * @date 2022-08-17 11:13:13
 	 * @return: com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo
 	 */
-	ActivityPlanReward detailByActivityIdAndRewardId(@Param("activityId") Long activityId,@Param("rewardId") Long rewardId);
+	ActivityPlanReward detailByActivityIdAndRewardId(@Param("activityId") Long activityId,@Param("rewardId") Long rewardId, @Param("group") String group);
 	/**
 	 * 分页查询
      * @author liweifan

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ActivityRewardDao.java

@@ -4,6 +4,7 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
@@ -55,4 +56,11 @@ public interface ActivityRewardDao extends BaseMapper<ActivityReward> {
      * @return
      */
     Boolean userRewarded(@Param("userId") Long userId, @Param("activityId") Long activityId);
+
+    /**
+     * 奖品关联活动统计
+     * @param rewardIds 奖品ID
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectRewardActivityStatInfo(@Param("rewardIds") List<Long> rewardIds);
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/ActivityPlanDto.java

@@ -25,7 +25,7 @@ import java.util.Optional;
  * @Data: 2022-08-04 10:19:49
  */
 @ApiModel(value = "ActivityPlanDto对象", description = "活动计划表数据传输对象")
-public class ActivityPlanDto extends ActivityPlan{
+public class ActivityPlanDto extends ActivityPlan {
 	private static final long serialVersionUID = 1L;
 
 	@ApiModelProperty(value = "操作人id",hidden = true)

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/ActivityPlanSearch.java

@@ -2,10 +2,12 @@ package com.yonge.cooleshow.biz.dal.dto.search;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
@@ -36,11 +38,20 @@ public class ActivityPlanSearch extends QueryInfo{
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date endTime;
 
+	// 活动编号匹配
+	@ApiModelProperty("活动ID ")
+	private Long activityId;
+
 	public String getActivityName() {
 		return activityName;
 	}
 
 	public void setActivityName(String activityName) {
+
+		if (StringUtils.isNotEmpty(activityName) && activityName.matches(MK.EXP_INT)) {
+			setActivityId(Long.parseLong(activityName));
+		}
+
 		this.activityName = activityName;
 	}
 
@@ -91,4 +102,12 @@ public class ActivityPlanSearch extends QueryInfo{
 	public void setEndTime(Date endTime) {
 		this.endTime = endTime;
 	}
+
+	public Long getActivityId() {
+		return activityId;
+	}
+
+	public void setActivityId(Long activityId) {
+		this.activityId = activityId;
+	}
 }

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlan.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingRuleEnum;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 import com.yonge.cooleshow.common.enums.RegistrationMethodEnum;
 import io.swagger.annotations.ApiModel;
@@ -109,6 +110,14 @@ public class ActivityPlan implements Serializable {
     @TableField(value = "update_by_")
     private Long updateBy;
 
+    @ApiModelProperty("奖励名次 ")
+    @TableField(value = "ranking_")
+    private Integer ranking;
+
+    @ApiModelProperty("名次规则: EVALUATIONS_NUMBER(评测次数) EVALUATIONS_TIME(评测时间) ")
+    @TableField(value = "ranking_rule_")
+    private ActivityRankingRuleEnum rankingRule;
+
     public Long getId() {
         return id;
     }
@@ -292,4 +301,20 @@ public class ActivityPlan implements Serializable {
     public void setActivityClient(ClientEnum activityClient) {
         this.activityClient = activityClient;
     }
+
+    public Integer getRanking() {
+        return ranking;
+    }
+
+    public void setRanking(Integer ranking) {
+        this.ranking = ranking;
+    }
+
+    public ActivityRankingRuleEnum getRankingRule() {
+        return rankingRule;
+    }
+
+    public void setRankingRule(ActivityRankingRuleEnum rankingRule) {
+        this.rankingRule = rankingRule;
+    }
 }

+ 15 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityPlanReward.java

@@ -4,17 +4,15 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
-import java.util.Date;
-import com.fasterxml.jackson.annotation.JsonFormat;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Positive;
 import javax.validation.constraints.PositiveOrZero;
+import java.io.Serializable;
+import java.util.Date;
 
 /**
  * 活动计划奖品表
@@ -45,6 +43,10 @@ public class ActivityPlanReward implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
     private Date createTime;
 
+    @ApiModelProperty("奖品分组 ")
+    @TableField(value = "group_")
+    private String group;
+
 	public Long getId() {
         return id;
     }
@@ -84,5 +86,12 @@ public class ActivityPlanReward implements Serializable {
     public void setCreateTime(Date createTime) {
         this.createTime = createTime;
     }
-    
+
+    public String getGroup() {
+        return group;
+    }
+
+    public void setGroup(String group) {
+        this.group = group;
+    }
 }

+ 24 - 5
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityReward.java

@@ -41,15 +41,11 @@ public class ActivityReward implements Serializable {
     @TableField(value = "reward_name_")
     @NotBlank(message = "奖品名称不能为空")
     private String rewardName;
-    @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 ")
+    @ApiModelProperty("奖品类型:  ACTUAL 实物 VIP 小酷AI会员 PIAMO_ROOM 琴房时长 COUPON(优惠券)")
     @TableField(value = "reward_type_")
     @NotNull(message = "奖品类型不能为空")
     private RewardTypeEnum rewardType;
 
-    // @ApiModelProperty("关联优惠券ID ")
-    // @TableField(value = "coupon_id_")
-    // private Long couponId;
-
     @ApiModelProperty("奖品描述 ")
     @TableField(value = "reward_describe_")
     private String rewardDescribe;
@@ -92,6 +88,14 @@ public class ActivityReward implements Serializable {
     @TableField(value = "discount_price_")
     private BigDecimal discountPrice;
 
+    @ApiModelProperty("优惠券ID")
+    @TableField(value = "coupon_id_")
+    private Long couponId;
+
+    @ApiModelProperty(value = "奖品分组 ", hidden = true)
+    @TableField(exist = false)
+    private String group;
+
     public BigDecimal getDiscountPrice() {
         return discountPrice;
     }
@@ -220,4 +224,19 @@ public class ActivityReward implements Serializable {
         this.updateBy = updateBy;
     }
 
+    public String getGroup() {
+        return group;
+    }
+
+    public void setGroup(String group) {
+        this.group = group;
+    }
+
+    public Long getCouponId() {
+        return couponId;
+    }
+
+    public void setCouponId(Long couponId) {
+        this.couponId = couponId;
+    }
 }

+ 26 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/ActivityUserReward.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingRuleEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -56,6 +57,31 @@ public class ActivityUserReward implements Serializable {
     @TableField(value = "unit_")
     private String unit;
 
+    @ApiModelProperty("活动排名")
+    @TableField(value = "ranking_")
+    private Integer ranking;
+
+
+    @ApiModelProperty("活动排名规则")
+    @TableField(value = "ranking_rule_")
+    private ActivityRankingRuleEnum rankingRule;
+
+    public Integer getRanking() {
+        return ranking;
+    }
+
+    public void setRanking(Integer ranking) {
+        this.ranking = ranking;
+    }
+
+    public ActivityRankingRuleEnum getRankingRule() {
+        return rankingRule;
+    }
+
+    public void setRankingRule(ActivityRankingRuleEnum rankingRule) {
+        this.rankingRule = rankingRule;
+    }
+
     public String getUnit() {
         return unit;
     }

+ 34 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/activity/ActivityRankingRuleEnum.java

@@ -0,0 +1,34 @@
+package com.yonge.cooleshow.biz.dal.enums.activity;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 活动获奖排名规则
+ *
+ * @Author: Eric
+ * @Data: 2022/3/16 10:19
+ */
+public enum ActivityRankingRuleEnum implements BaseEnum<String, ActivityRankingRuleEnum> {
+
+    EVALUATIONS_NUMBER("评测次数"),
+    EVALUATIONS_TIME("评测时间"),
+    ;
+    @EnumValue
+    private String code;
+    private String name;
+
+    ActivityRankingRuleEnum(String name) {
+        this.code = this.name();
+        this.name = name;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

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

@@ -25,7 +25,7 @@ public interface ActivityPlanRewardService extends IService<ActivityPlanReward>
      */
     ActivityPlanRewardVo detail(Long id);
 
-    ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId);
+    ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId, String group);
     /**
      * 分页查询
      *

+ 5 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ActivityRewardService.java

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -85,7 +86,10 @@ public interface ActivityRewardService extends IService<ActivityReward>  {
 	 * 发放获奖奖品
 	 * @param userId 用户id
 	 * @param activityId 活动id
+	 * @param date
 	 * @return 返回发放成功奖品id
 	 */
-	List<Long> sendReward(Long userId, Long activityId);
+	List<Long> sendReward(Long userId, Long activityId, List<Long> rewardIdList, Date date);
+
+	Boolean userRewarded(Long userId, Long activityId);
 }

+ 0 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponInfoService.java

@@ -68,13 +68,6 @@ public interface CouponInfoService extends IService<CouponInfo> {
     int updateUserOrderCouponInfo(CouponOrderWrapper wrapper);
 
     /**
-     * 更新用户订单优惠券状态
-     * @param wrapper CouponOrderWrapper
-     * @return int 受影响的行数
-     */
-    int updateCouponOrderInfo( CouponOrderWrapper wrapper);
-
-    /**
      * 新增优惠券库存量调整信息
      * @param inventory CouponInventory
      * @return int 入库行数

+ 5 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/CouponIssueService.java

@@ -5,12 +5,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.dto.UserParam;
 import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SendTypeEnum;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponIssueQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponIssueWrapper;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -46,8 +48,10 @@ public interface CouponIssueService extends IService<CouponIssue> {
      * @param userParam 用户信息
      * @param issuer
      * @param reason
+     * @param date
+     * @return
      */
-    void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason);
+    Boolean issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason, Boolean sendMessage, Boolean throwE, SendTypeEnum issueWay, Date date);
 
     /**
      * 查询能发放优惠券的用户列表

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

@@ -6,6 +6,9 @@ import java.util.List;
 import java.util.Optional;
 
 import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingRuleEnum;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,6 +36,9 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
     @Autowired
     private ActivityEvaluationService activityEvaluationService;
 
+    @Autowired
+    private ActivityPlanService activityPlanService;
+
 	@Override
     public ActivityEvaluationRecordVo detail(Long id) {
         return baseMapper.detail(id);
@@ -91,14 +97,24 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
         activityEvaluationRecord.setActivityId(activityId);
         activityEvaluationRecord.setEvaluationId(activityEvaluation.getId());
         this.save(activityEvaluationRecord);
-    }	@Override
+    }
+
+    @Override
 	public List<ActivityRankingVo> queryRankingList(Long activityPlanId, Long activityEvaluationId, int limit) {
-		return baseMapper.queryRankingList(activityPlanId, activityEvaluationId, limit);
+        ActivityPlan activityPlan = activityPlanService.getById(activityPlanId);
+        if (activityPlan == null) {
+            throw new BizException("活动已结束");
+        }
+		return baseMapper.queryRankingList(activityPlanId, activityEvaluationId, limit,activityPlan.getRankingRule());
 	}
 
 	@Override
 	public ActivityRankingVo queryUserRanking(Long activityPlanId, Long activityEvaluationId, Long userId) {
-		return baseMapper.queryUserRanking(activityPlanId, activityEvaluationId, userId);
+        ActivityPlan activityPlan = activityPlanService.getById(activityPlanId);
+        if (activityPlan == null) {
+            throw new BizException("活动已结束");
+        }
+        return baseMapper.queryUserRanking(activityPlanId, activityEvaluationId, userId,activityPlan.getRankingRule());
 	}
 
     /**
@@ -114,9 +130,12 @@ public class ActivityEvaluationRecordServiceImpl extends ServiceImpl<ActivityEva
         if (CollectionUtils.isEmpty(userIds)) {
             return Lists.newArrayList();
         }
-
+        ActivityPlan activityPlan = activityPlanService.getById(activityId);
+        if (activityPlan == null) {
+            throw new BizException("活动已结束");
+        }
         // 用户最高排名信息
-        List<ActivityEvaluationRecord> records = getBaseMapper().selectUserHighestRankingInfo(activityId, userIds);
+        List<ActivityEvaluationRecord> records = getBaseMapper().selectUserHighestRankingInfo(activityId, userIds,activityPlan.getRankingRule());
 
         return Optional.ofNullable(records).orElse(Lists.newArrayList());
     }

+ 35 - 12
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityEvaluationServiceImpl.java

@@ -1,17 +1,5 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import org.apache.commons.collections.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -25,9 +13,11 @@ import com.yonge.cooleshow.biz.dal.dto.search.ActivityEvaluationSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MusicSheetSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluation;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationService;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.service.SubjectService;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
@@ -40,6 +30,18 @@ import com.yonge.cooleshow.common.enums.ActivityResourceEnum;
 import com.yonge.cooleshow.common.enums.ActivityTypeEnum;
 import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.toolset.base.exception.BizException;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 @Service
 public class ActivityEvaluationServiceImpl extends ServiceImpl<ActivityEvaluationDao, ActivityEvaluation> implements ActivityEvaluationService {
@@ -53,6 +55,12 @@ public class ActivityEvaluationServiceImpl extends ServiceImpl<ActivityEvaluatio
     @Autowired
     private ActivityEvaluationRecordService activityEvaluationRecordService;
 
+    @Autowired
+    private ActivityEvaluationService activityEvaluationService;
+
+    @Autowired
+    private ActivityPlanRewardService activityPlanRewardService;
+
     @Override
     public ActivityEvaluationVo detail(Long id) {
         return baseMapper.detail(id);
@@ -68,6 +76,7 @@ public class ActivityEvaluationServiceImpl extends ServiceImpl<ActivityEvaluatio
         return baseMapper.selectAll(query);
     }
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean addBatch(ActivityEvaluationDto param, SysUser user) {
 
@@ -149,6 +158,20 @@ public class ActivityEvaluationServiceImpl extends ServiceImpl<ActivityEvaluatio
                     .eq(ActivityPlan::getId,param.getActivityId())
             );
         }
+
+        // 更新评测活动奖品数
+        if (ActivityTypeEnum.EVALUATION == activity.getActivityType()) {
+
+            // 当前活动曲目数
+            int ret = activityEvaluationService.count(Wrappers.<ActivityEvaluation>lambdaQuery()
+                    .eq(ActivityEvaluation::getActivityId, activity.getId())
+                    .eq(ActivityEvaluation::getResourceType, ActivityResourceEnum.MUSIC_SHEET));
+
+            activityPlanRewardService.update(Wrappers.<ActivityPlanReward>lambdaUpdate()
+                            .set(ActivityPlanReward::getRewardNum, ret)
+                    .eq(ActivityPlanReward::getActivityId, activity.getId()));
+        }
+
         return true;
     }
 

+ 75 - 19
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanEvaluationServiceImpl.java

@@ -2,14 +2,20 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
+import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderPayReq;
 import com.yonge.cooleshow.biz.dal.dto.search.OrderSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluation;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo;
 import com.yonge.cooleshow.biz.dal.vo.UserOrderVo;
+import com.yonge.cooleshow.common.enums.ActivityResourceEnum;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.ss.formula.functions.T;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -19,8 +25,9 @@ import com.yonge.cooleshow.biz.dal.entity.ActivityPlanEvaluation;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanEvaluationDao;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
-import java.util.Set;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
 import java.util.stream.Collectors;
 
 
@@ -37,6 +44,15 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     @Autowired
     private ActivityPlanRewardService activityPlanRewardService;
 
+    @Autowired
+    private ActivityPlanService activityPlanService;
+
+    @Autowired
+    private ActivityEvaluationRecordService activityEvaluationRecordService;
+
+    @Autowired
+    private ActivityEvaluationService activityEvaluationService;
+
     @Override
     public boolean createOrUpdate(ActivityPlanDto activityPlan) {
         ActivityPlanEvaluation planExpand = activityPlan.getPlanEvaluation();
@@ -54,11 +70,11 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
     }
 
     @Override
-    public void closeActivity(Long activytyId) {
+    public void closeActivity(Long activityId) {
         OrderSearch query = new OrderSearch();
         query.setOrderType(OrderTypeEnum.ACTI_REGIST.getCode());
         query.setGoodType(GoodTypeEnum.ACTI_REGIST.getCode());
-        query.setBizId(activytyId);
+        query.setBizId(activityId);
         List<UserOrderVo> userOrderVos = userOrderService.selectAllList(query);
         for (UserOrderVo userOrderVo : userOrderVos) {
             OrderPayReq payReq = new OrderPayReq();
@@ -75,28 +91,68 @@ public class ActivityPlanEvaluationServiceImpl extends ServiceImpl<ActivityPlanE
         //关闭未付款订单
         closeActivity(activityId);
 
+        ActivityPlanVo detail = activityPlanService.detail(activityId);
+        List<ActivityUserReward> activityUserRewardList = new ArrayList<>();
+
+        List<ActivityEvaluation> activityEvaluationList = activityEvaluationService.lambdaQuery()
+                                                                 .eq(ActivityEvaluation::getActivityId, activityId)
+                                                                 .list();
+
         //活动需要发放的奖品
-        List<ActivityUserReward> activityUserRewardList = baseMapper.getUserReward(activityId);
+        Map<String, List<ActivityPlanRewardDto>> rewardMap = detail.getActivityRewardList().stream()
+                                                                                 .collect(Collectors.groupingBy(
+                                                                                         ActivityPlanReward::getGroup));
 
-        Set<Long> userIds = activityUserRewardList.stream().map(ActivityUserReward::getUserId).collect(Collectors.toSet());
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = new Date();
+        try {
+            date = formatter.parse(formatter.format(new Date()));
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        for (ActivityEvaluation activityEvaluation : activityEvaluationList) {
+
+            List<ActivityRankingVo> activityRankingVos = activityEvaluationRecordService.queryRankingList(activityId,
+                                                              activityEvaluation.getId(),detail.getRanking());
+            for (int i = 0; i < activityRankingVos.size(); i++) {
+
+                ActivityRankingVo activityRankingVo = activityRankingVos.get(i);
+
+                List<ActivityPlanRewardDto> activityPlanRewardDtos = rewardMap.get(i + 1 + "");
+                if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
+                    continue;
+                }
+
+                List<Long> rewardIdList = activityPlanRewardDtos.stream()
+                                   .map(activityPlanRewardDto -> activityPlanRewardDto.getActivityReward().getId())
+                                   .collect(Collectors.toList());
 
-        for (Long userId : userIds) {
-            //给用户发放奖品 传入用户id和活动id
-            List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId);
+                //给用户发放奖品 传入用户id和活动id
+                List<Long> successRewardIds = activityRewardService.sendReward(activityRankingVo.getUserId(), activityId,rewardIdList,date);
 
-            activityUserRewardList.stream().filter(o -> o.getUserId().equals(userId)).forEach(o -> {
-                for (Long successRewardId : successRewardIds) {
-                    if(o.getRewardId().equals(successRewardId)){
-                        o.setGrantFlag(1);
-                        return;
+                // 保存奖品发放记录
+                for (Long rewardId : rewardIdList) {
+                    ActivityUserReward activityUserReward = new ActivityUserReward();
+                    activityUserReward.setActivityId(activityId);
+                    activityUserReward.setBizId(activityEvaluation.getId());
+                    activityUserReward.setUserId(activityRankingVo.getUserId());
+                    activityUserReward.setRankingRule(detail.getRankingRule());
+                    activityUserReward.setRanking(i+1);
+                    activityUserReward.setGrantFlag(0);
+                    activityUserReward.setCreateTime(date);
+                    activityUserReward.setUpdateTime(date);
+                    activityUserReward.setRewardId(rewardId);
+                    if (successRewardIds.contains(rewardId)) {
+                        activityUserReward.setGrantFlag(1);
                     }
+                    activityUserRewardList.add(activityUserReward);
                 }
-                o.setGrantFlag(0);
-            });
+            }
+        }
+        if (!CollectionUtils.isEmpty(activityUserRewardList)) {
+            activityUserRewardService.saveBatch(activityUserRewardList);
         }
-        activityUserRewardService.saveBatch(activityUserRewardList);
-
         //发完奖后将库存归还
-        activityPlanRewardService.recoveryReward(activityId);
+        // activityPlanRewardService.recoveryReward(activityId);
     }
 }

+ 4 - 4
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanRewardServiceImpl.java

@@ -52,8 +52,8 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
     }
 
     @Override
-    public ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId) {
-        return baseMapper.detailByActivityIdAndRewardId(activityId, rewardId);
+    public ActivityPlanReward detailByActivityIdAndRewardId(Long activityId, Long rewardId, String group) {
+        return baseMapper.detailByActivityIdAndRewardId(activityId, rewardId, group);
     }
 
     @Override
@@ -81,7 +81,7 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
                                             , (param) -> {
                                                 ActivityRewardVo detail = activityRewardService.detail(param.getRewardId());
 
-                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId());
+                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId(), param.getGroup());
                                                 if (null == old) {
                                                     Integer stock = detail.getStock() - param.getRewardNum();
                                                     if (stock < 0) {
@@ -161,7 +161,7 @@ public class ActivityPlanRewardServiceImpl extends ServiceImpl<ActivityPlanRewar
                                             , (param) -> {
                                                 ActivityRewardVo detail = activityRewardService.detail(param.getRewardId());
 
-                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId());
+                                                ActivityPlanReward old = detailByActivityIdAndRewardId(param.getActivityId(), param.getRewardId(), reward.getGroup());
 
                                                 if (old.getRewardNum() > 0) {
                                                     //入库存变更记录

+ 44 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java

@@ -85,6 +85,9 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     private ActivityPlanRewardService activityPlanRewardService;
 
     @Autowired
+    private ActivityPlanDao activityPlanDao;
+
+    @Autowired
     private ActivityRewardService activityRewardService;
 
     @Resource
@@ -326,6 +329,7 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public Boolean updateActivityState(Long activityId, Integer activityState, Long id) {
         ActivityPlanVo detail = detail(activityId);
 
@@ -621,9 +625,47 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
             updateRewardDtoList = new ArrayList<>();
         }
 
+        // 活动信息
+        ActivityPlan activityPlan = activityPlanDao.selectById(activityId);
+        if (Objects.isNull(activityPlan)) {
+            throw new BizException("无效的活动ID");
+        }
+
+        int ret = 0;
+        if (ActivityTypeEnum.EVALUATION == activityPlan.getActivityType()) {
 
-        for (ActivityPlanRewardDto rewardDto : updateRewardDtoList) {
-            activityPlanRewardService.saveOrUpdateReward(rewardDto);
+            // 当前活动曲目数
+            ret = activityEvaluationService.count(Wrappers.<ActivityEvaluation>lambdaQuery()
+                    .eq(ActivityEvaluation::getActivityId, activityId)
+                    .eq(ActivityEvaluation::getResourceType, ActivityResourceEnum.MUSIC_SHEET));
+        }
+
+        ActivityPlanReward planReward;
+        for (ActivityPlanRewardDto item : updateRewardDtoList) {
+            // activityPlanRewardService.saveOrUpdateReward(item);
+
+            // 设置默认值
+            if (StringUtils.isEmpty(item.getGroup())) {
+                item.setGroup("1");
+            }
+
+            // 评测活动
+            if (ActivityTypeEnum.EVALUATION == activityPlan.getActivityType()) {
+                item.setRewardNum(ret);
+            }
+            planReward = activityPlanRewardService.detailByActivityIdAndRewardId(item.getActivityId(), item.getRewardId(), item.getGroup());
+
+            if (Objects.isNull(planReward)) {
+
+                // 新增
+                activityPlanRewardService.save(item);
+            } else {
+
+                // 更新
+                item.setId(planReward.getId());
+
+                activityPlanRewardService.updateById(item);
+            }
         }
 
         //还有删除的

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

@@ -7,12 +7,10 @@ import com.yonge.cooleshow.biz.dal.dto.ActivityPlanDto;
 import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
 import com.yonge.cooleshow.biz.dal.dto.search.UserFirstTimeSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.support.WrapperUtil;
 import com.yonge.cooleshow.biz.dal.vo.ActivityPlanVo;
 import com.yonge.cooleshow.common.enums.*;
-import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.payment.util.DistributedLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,7 +18,6 @@ import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import com.yonge.cooleshow.biz.dal.dao.ActivityPlanStandardDao;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -147,8 +144,12 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
     }
 
     private void sendUserReward(Long userId, Long activityId, Date createTime, List<ActivityPlanRewardDto> activityPlanRewardDtos) {
+        List<Long> rewardIdList = activityPlanRewardDtos.stream()
+                                                   .map(activityPlanRewardDto -> activityPlanRewardDto.getActivityReward()
+                                                                                                      .getId())
+                                                   .collect(Collectors.toList());
         //给用户发奖
-        List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId);
+        List<Long> successRewardIds = activityRewardService.sendReward(userId, activityId, rewardIdList, new Date());
 
         for (ActivityPlanRewardDto dto : activityPlanRewardDtos) {
             ActivityUserReward userReward = new ActivityUserReward();
@@ -184,6 +185,6 @@ public class ActivityPlanStandardServiceImpl extends ServiceImpl<ActivityPlanSta
         //处理活动发奖
         dealActivityIng(activytyId);
         //归还库存
-        activityPlanRewardService.recoveryReward(activytyId);
+        // activityPlanRewardService.recoveryReward(activytyId);
     }
 }

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

@@ -2,18 +2,18 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.ActivityRegistrationDao;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRegistrationSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
+import com.yonge.cooleshow.biz.dal.entity.ActivityRegistration;
 import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
+import com.yonge.cooleshow.biz.dal.service.ActivityRegistrationService;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRegistrationVo;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import com.yonge.cooleshow.biz.dal.entity.ActivityRegistration;
-import com.yonge.cooleshow.biz.dal.vo.ActivityRegistrationVo;
-import com.yonge.cooleshow.biz.dal.dto.search.ActivityRegistrationSearch;
-import com.yonge.cooleshow.biz.dal.dao.ActivityRegistrationDao;
-import com.yonge.cooleshow.biz.dal.service.ActivityRegistrationService;
 
 import java.util.List;
 import java.util.Map;

+ 124 - 30
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityRewardServiceImpl.java

@@ -1,44 +1,60 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.Maps;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.ActivityRewardChangeStockDao;
-import com.yonge.cooleshow.biz.dal.dto.ActivityPlanRewardDto;
+import com.yonge.cooleshow.biz.dal.dao.ActivityRewardDao;
 import com.yonge.cooleshow.biz.dal.dto.ActivityRewardDto;
+import com.yonge.cooleshow.biz.dal.dto.UserParam;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardChangeStockSearch;
+import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
+import com.yonge.cooleshow.biz.dal.entity.ActivityPlanReward;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.entity.ActivityRewardChangeStock;
-import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.InOrOutEnum;
+import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
+import com.yonge.cooleshow.biz.dal.entity.PianoRoomChangeRecord;
+import com.yonge.cooleshow.biz.dal.enums.*;
+import com.yonge.cooleshow.biz.dal.mapper.CouponInfoMapper;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanRewardService;
+import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
+import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
+import com.yonge.cooleshow.biz.dal.service.CouponIssueService;
+import com.yonge.cooleshow.biz.dal.service.MemberPriceSettingsService;
+import com.yonge.cooleshow.biz.dal.service.PianoRoomChangeRecordService;
+import com.yonge.cooleshow.biz.dal.service.SysMessageService;
 import com.yonge.cooleshow.biz.dal.vo.ActivityRewardChangeStockVo;
-import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
-import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
+import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.cooleshow.common.enums.RewardTypeEnum;
 import com.yonge.cooleshow.common.enums.UnitEnum;
 import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.util.StringUtil;
 import com.yonge.toolset.payment.util.DistributedLock;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import org.apache.commons.collections.CollectionUtils;
 import org.redisson.RedissonMultiLock;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import com.yonge.cooleshow.biz.dal.vo.ActivityRewardVo;
-import com.yonge.cooleshow.biz.dal.dto.search.ActivityRewardSearch;
-import com.yonge.cooleshow.biz.dal.dao.ActivityRewardDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 
@@ -62,13 +78,21 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
     @Autowired
     private PianoRoomChangeRecordService pianoRoomChangeRecordService;
 
+    @Autowired
+    private CouponInfoMapper couponInfoMapper;
 
     @Autowired
     private ActivityPlanRewardService activityPlanRewardService;
 
     @Autowired
+    private ActivityRewardService activityRewardService;
+
+    @Autowired
     private MemberPriceSettingsService memberPriceSettingsService;
 
+    @Autowired
+    private CouponIssueService couponIssueService;
+
     @Override
     public ActivityRewardVo detail(Long id) {
         return baseMapper.detail(id);
@@ -81,7 +105,43 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
     @Override
     public IPage<ActivityRewardVo> selectPage(IPage<ActivityRewardVo> page, ActivityRewardSearch query) {
-        return page.setRecords(baseMapper.selectPage(page, query));
+
+        List<ActivityRewardVo> rewardInfos = baseMapper.selectPage(page, query);
+
+        if (CollectionUtils.isEmpty(rewardInfos)) {
+            // 直接返回请求结果
+            return page.setRecords(rewardInfos);
+        }
+
+        // 优惠券奖品,查询优惠券名称
+        List<Long> couponIds = rewardInfos.stream()
+                .filter(x -> RewardTypeEnum.COUPON == x.getRewardType())
+                .map(ActivityReward::getCouponId)
+                .filter(x -> Optional.ofNullable(x).orElse(0L) > 0)
+                .distinct().collect(Collectors.toList());
+
+        // 优惠券名称
+        Map<Long, String> couponNameMap = Maps.newHashMap();
+        if (CollectionUtils.isNotEmpty(couponIds)) {
+
+            couponNameMap = couponInfoMapper.selectBatchIds(couponIds).stream()
+                    .collect(Collectors.toMap(CouponInfo::getId, CouponInfo::getName, (o, n) -> n));
+        }
+
+        // 奖品关联活动统计
+        List<Long> rewardIds = rewardInfos.stream()
+                .map(ActivityReward::getId).distinct().collect(Collectors.toList());
+
+        Map<Long, Integer> collect = getBaseMapper().selectRewardActivityStatInfo(rewardIds).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        for (ActivityRewardVo item : rewardInfos) {
+
+            item.activityNum(collect.getOrDefault(item.getId(), 0))
+                    .setCouponName(couponNameMap.getOrDefault(item.getCouponId(), ""));
+        }
+
+        return page.setRecords(rewardInfos);
     }
 
     @Override
@@ -108,6 +168,13 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
             activityReward.setStock(null);
             activityReward.setUpdateBy(user.getId());
 
+            // 校验奖品与活动是否存在关联
+            int count = activityPlanRewardService.count(Wrappers.<ActivityPlanReward>lambdaQuery()
+                    .eq(ActivityPlanReward::getRewardId, activityReward.getId()));
+            if (count > 0) {
+                throw new BizException("请先解除与活动奖品关联关系");
+            }
+
             baseMapper.updateById(activityReward);
         }
         return true;
@@ -120,6 +187,18 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
     @Override
     public Boolean updateStatus(Long id, Integer status, Long userId) {
+
+        if (EStatus.ENABLE.match(status)) {
+            // 更新奖品状态为禁用时,需要判断是否已经关联活动;若存在关联数据,提示用户先解除绑定关系
+
+            int rewardNum = activityPlanRewardService.count(Wrappers.<ActivityPlanReward>lambdaQuery()
+                    .eq(ActivityPlanReward::getRewardId, id));
+
+            if (rewardNum > 0) {
+                throw new BizException("奖品已被活动关联");
+            }
+        }
+
         ActivityReward activityReward = new ActivityReward();
         activityReward.setId(id);
         //更改活动状态
@@ -157,26 +236,29 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public List<Long> sendReward(Long userId, Long activityId) {
+    public List<Long> sendReward(Long userId, Long activityId, List<Long> rewardIdList, Date date) {
         if (userRewarded(userId, activityId)) {
             return new ArrayList<>();
         }
         ActivityPlan activityPlan = activityPlanService.getById(activityId);
         if (activityPlan == null) {
             log.warn("活动不存在");
-            return null;
+            return new ArrayList<>();
+        }
+        if (CollectionUtils.isEmpty(rewardIdList)) {
+            log.warn("奖品不存在");
+            return new ArrayList<>();
         }
 
-        List<ActivityPlanRewardDto> activityPlanRewardDtos = activityPlanRewardService.queryActivityPlanReward(
-                activityId);
+        Collection<ActivityReward> activityRewards = activityRewardService.listByIds(rewardIdList);
 
-        if (CollectionUtils.isEmpty(activityPlanRewardDtos)) {
+        if (CollectionUtils.isEmpty(activityRewards)) {
             return new ArrayList<>();
         }
 
         // 级联锁同时处理奖品库存
         List<RLock> lockList = new ArrayList<>();
-        for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
+        for (ActivityReward activityReward : activityRewards) {
             lockList.add(redissonClient.getLock(CacheNameEnum.LOCK_ACTIVITY_REWARD_STOCK.getRedisKey(activityReward.getId())));
         }
 
@@ -186,27 +268,38 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
         List<String> rewardNameList = new ArrayList<>();
         try {
             lock.lock();
-            for (ActivityPlanRewardDto activityReward : activityPlanRewardDtos) {
-                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getActivityReward().getId());
+            for (ActivityReward activityReward : activityRewards) {
+                int update = activityPlanRewardService.reduceStock(activityId, activityReward.getId());
                 if (update == 0) {
                     continue;
                 }
-                if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
+                if (activityReward.getRewardType().equals(RewardTypeEnum.PIAMO_ROOM)) {
                     PianoRoomChangeRecord pianoRoomChangeRecord = new PianoRoomChangeRecord();
                     pianoRoomChangeRecord.setUserId(userId);
                     pianoRoomChangeRecord.setInOrOut(InOrOutEnum.IN);
                     pianoRoomChangeRecord.setSourceType(SourceTypeEnum.ACTIVITY);
-                    pianoRoomChangeRecord.setTimes(activityReward.getActivityReward().getNum());
+                    pianoRoomChangeRecord.setTimes(activityReward.getNum());
                     pianoRoomChangeRecord.setBizId(activityId.toString());
                     pianoRoomChangeRecord.setCreateTime(new Date());
                     pianoRoomChangeRecord.setReason(activityPlan.getActivityName());
                     pianoRoomChangeRecordService.add(pianoRoomChangeRecord);
-                } else if (activityReward.getActivityReward().getRewardType().equals(RewardTypeEnum.VIP)) {
+                } else if (activityReward.getRewardType().equals(RewardTypeEnum.VIP)) {
                     memberPriceSettingsService.activityReward(userId, activityPlan.getActivityClient(),
-                                                              activityReward.getActivityReward(), activityId,activityPlan.getActivityName());
+                                                              activityReward, activityId,activityPlan.getActivityName());
+                } else if (activityReward.getRewardType().equals(RewardTypeEnum.COUPON)) {
+                    List<UserParam> list = new ArrayList<>();
+                    UserParam userParam = new UserParam();
+                    userParam.setUserId(userId);
+                    userParam.setClientType(activityPlan.getActivityClient());
+                    list.add(userParam);
+                    Boolean issueCoupon = couponIssueService.issueCoupon(activityReward.getCouponId(), list, null, activityPlan.getActivityName(),
+                                                                         false, false, SendTypeEnum.ACTIVITY,date);
+                    if (!issueCoupon) {
+                        continue;
+                    }
                 }
-                rewardNameList.add(activityReward.getActivityReward().getRewardName());
-                activityRewardIdList.add(activityReward.getActivityReward().getId());
+                rewardNameList.add(activityReward.getRewardName());
+                activityRewardIdList.add(activityReward.getId());
             }
             // 发送活动获奖推送
             if (!CollectionUtils.isEmpty(rewardNameList)) {
@@ -220,7 +313,8 @@ public class ActivityRewardServiceImpl extends ServiceImpl<ActivityRewardDao, Ac
         return activityRewardIdList;
     }
 
-    private Boolean userRewarded(Long userId, Long activityId) {
+    @Override
+    public Boolean userRewarded(Long userId, Long activityId) {
         return baseMapper.userRewarded(userId, activityId);
     }
 

+ 33 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityUserRewardServiceImpl.java

@@ -6,8 +6,10 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.yonge.cooleshow.biz.dal.dao.ActivityUserRewardDao;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityUserRewardSearch;
+import com.yonge.cooleshow.biz.dal.entity.ActivityEvaluationRecord;
 import com.yonge.cooleshow.biz.dal.entity.ActivityPlan;
 import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
+import com.yonge.cooleshow.biz.dal.service.ActivityEvaluationRecordService;
 import com.yonge.cooleshow.biz.dal.service.ActivityPlanService;
 import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 import com.yonge.cooleshow.biz.dal.entity.ActivityUserReward;
@@ -20,6 +22,7 @@ import com.yonge.cooleshow.common.enums.EStatus;
 import com.yonge.cooleshow.common.enums.RewardTypeEnum;
 import com.yonge.toolset.base.exception.BizException;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -28,6 +31,7 @@ import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -36,7 +40,8 @@ public class ActivityUserRewardServiceImpl extends ServiceImpl<ActivityUserRewar
 
     @Autowired
     private ActivityPlanService activityPlanService;
-
+    @Autowired
+    private ActivityEvaluationRecordService activityEvaluationRecordService;
     @Autowired
     private ActivityRewardService activityRewardService;
 
@@ -61,6 +66,33 @@ public class ActivityUserRewardServiceImpl extends ServiceImpl<ActivityUserRewar
         // 活动获奖用户信息
         List<UserRewardVo> userRewards = baseMapper.selectPage(page, query);
 
+        if (CollectionUtils.isEmpty(userRewards)) {
+            // 直接返回数据,忽略后续流程
+            return page.setRecords(userRewards);
+        }
+
+        List<Long> userIds = userRewards.stream().map(UserRewardVo::getUserId).distinct().collect(Collectors.toList());
+
+        // 评测活动,获奖记录时间
+        if (ActivityTypeEnum.EVALUATION == activityPlan.getActivityType()) {
+
+            Map<Long, ActivityEvaluationRecord> collect = activityEvaluationRecordService.queryActivityUserHighestRankingInfo(query.getActivityId(), userIds).stream()
+                    .collect(Collectors.toMap(ActivityEvaluationRecord::getUserId, Function.identity(), (o, n) -> n));
+
+            ActivityEvaluationRecord record;
+            for (UserRewardVo item : userRewards) {
+
+                if (collect.containsKey(item.getUserId())) {
+
+                    record = collect.get(item.getUserId());
+                    // 重置当前获奖用户分数,评测次数,评测时间
+                    item.score(record.getScore())
+                            .times(record.getTimes())
+                            .setEvaluationTime(record.getCreateTime());
+                }
+            }
+        }
+
         // 分享活动关联老师信息
         if (ActivityTypeEnum.SHARE == activityPlan.getActivityType()) {
 
@@ -69,8 +101,6 @@ public class ActivityUserRewardServiceImpl extends ServiceImpl<ActivityUserRewar
             // 关联老师ID
             Map<Long, String> teacherIdMap = Maps.newConcurrentMap();
 
-            List<Long> userIds = userRewards.stream().map(UserRewardVo::getUserId).distinct().collect(Collectors.toList());
-
             Lists.partition(userIds, 30).parallelStream().forEach(item -> {
 
                 List<UserRewardVo> retlist = getBaseMapper().selectActivityShareTeacher(activityPlan.getId(), item);

+ 12 - 13
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponInfoServiceImp.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.entity.ActivityReward;
 import com.yonge.cooleshow.biz.dal.entity.CouponInfo;
 import com.yonge.cooleshow.biz.dal.entity.CouponInventory;
 import com.yonge.cooleshow.biz.dal.entity.CouponIssue;
@@ -19,6 +20,7 @@ import com.yonge.cooleshow.biz.dal.mapper.CouponIssueMapper;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInfoQuery;
 import com.yonge.cooleshow.biz.dal.queryInfo.CouponInventoryQuery;
+import com.yonge.cooleshow.biz.dal.service.ActivityRewardService;
 import com.yonge.cooleshow.biz.dal.service.CouponInfoService;
 import com.yonge.cooleshow.biz.dal.vo.coupon.CouponInfoWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
@@ -56,6 +58,8 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
     private CouponInventoryMapper couponInventoryMapper;
     @Autowired
     private CouponIssueMapper couponIssueMapper;
+    @Autowired
+    private ActivityRewardService activityRewardService;
 
     /**
      * 分页查询优惠券信息
@@ -199,6 +203,13 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
                     throw new BizException("已过期优惠券不允许修改");
                 }
 
+                // 优惠券已关联奖品,不能停用
+                int ret = activityRewardService.count(Wrappers.<ActivityReward>lambdaQuery()
+                        .eq(ActivityReward::getCouponId, couponInfo.getId()));
+                if (ret > 0 && EStatus.DISABLE.match(couponInfo.getStatus())) {
+                    throw new BizException("优惠券已被奖品关联");
+                }
+
             } else {
 
                 // 优惠券已过期
@@ -310,6 +321,7 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
      * @param wrapper CouponOrderWrapper
      * @return int 受影响的行数
      */
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public int updateUserOrderCouponInfo( CouponOrderWrapper wrapper) {
 
@@ -359,19 +371,6 @@ public class CouponInfoServiceImp extends ServiceImpl<CouponInfoMapper, CouponIn
     }
 
     /**
-     * 更新用户订单优惠券状态
-     * 1、增加批量更新事务边界
-     * @param wrapper CouponOrderWrapper
-     * @return int 受影响的行数
-     */
-    @Transactional(rollbackFor = Exception.class)
-    @Override
-    public int updateCouponOrderInfo(CouponOrderWrapper wrapper) {
-
-        return updateUserOrderCouponInfo(wrapper);
-    }
-
-    /**
      * 新增优惠券库存量调整信息
      *
      * @param inventory CouponInventory

+ 15 - 10
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CouponIssueServiceImp.java

@@ -40,11 +40,7 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.time.ZoneId;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -127,7 +123,7 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
             }
 
             List<SysUser> users = userMap.get(couponIssueWrapper.getUserId());
-            if (!CollectionUtils.isEmpty(issuer)) {
+            if (!CollectionUtils.isEmpty(users)) {
                 couponIssueWrapper.setUsername(users.get(0).getUsername());
                 couponIssueWrapper.setRealName(users.get(0).getRealName());
                 couponIssueWrapper.setPhone(users.get(0).getPhone());
@@ -157,15 +153,18 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
 
     @Override
     @Transactional
-    public void issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason) {
+    public Boolean issueCoupon(Long couponId, List<UserParam> userParam, Long issuer, String reason, Boolean sendMessage, Boolean throwE, SendTypeEnum issueWay, Date date) {
         CouponInfo couponInfo = couponInfoService.queryCouponInfoById(couponId);
         if (couponInfo == null) {
+            if (!throwE) return false;
             throw new BizException("未找到优惠券信息");
         }
         if (couponInfo.getInventory() < userParam.size()) {
+            if (!throwE) return false;
             throw new BizException("库存不足");
         }
         if (couponInfo.getStatus() == EStatus.DISABLE.getValue()) {
+            if (!throwE) return false;
             throw new BizException("优惠券已被禁用");
         }
         // 判断优惠券类型 设置优惠券时间
@@ -182,16 +181,18 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
         List<CouponIssue> couponIssueList = new ArrayList<>();
         for (UserParam param : userParam) {
             if (param.getUserId() == null) {
+                if (!throwE) return false;
                 throw new BizException("发放用户id不能为空");
             }
             if (param.getClientType() == null) {
+                if (!throwE) return false;
                 throw new BizException("发放客户端不能为空");
             }
             CouponIssue couponIssue = new CouponIssue();
             couponIssue.setCouponId(couponId);
             couponIssue.setIssuer(issuer);
-            couponIssue.setIssueTime(DateTime.now().getMillis());
-            couponIssue.setIssueWay(SendTypeEnum.PLATFORM.getCode());
+            couponIssue.setIssueTime(date.toInstant().toEpochMilli());
+            couponIssue.setIssueWay(issueWay.getCode());
             couponIssue.setRemark(reason);
             couponIssue.setStartTime(startTime);
             couponIssue.setEndTime(endTime);
@@ -206,11 +207,15 @@ public class CouponIssueServiceImp extends ServiceImpl<CouponIssueMapper, Coupon
         //  优惠券扣减库存
         int i = couponInfoService.updateStock(couponId, userParam.size(), InOrOutEnum.OUT);
         if (i == 0) {
+            if (!throwE) return false;
             throw new BizException("库存不足");
         }
 
         // 发送消息
-        sendMessage(couponInfo.getName(),userParam);
+        if (sendMessage) {
+            sendMessage(couponInfo.getName(), userParam);
+        }
+        return true;
     }
 
     private void sendMessage(String couponName,List<UserParam> userParams) {

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

@@ -128,6 +128,9 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
     public void activityReward(Long userId, ClientEnum client, ActivityReward activityReward, Long activityId,String activityName) {
 
         VipCardRecord vipCardRecord = vipCardRecordService.buildVipCardRecordByOrderDetail(userId,client,activityReward,activityId,activityName);
+        if (vipCardRecord == null) {
+            return;
+        }
 
         getUserVipInfoVo(vipCardRecord);
     }

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/ActivityRewardVo.java

@@ -17,6 +17,12 @@ public class ActivityRewardVo extends ActivityReward{
 	@ApiModelProperty(value = "是否有活动引用")
 	private Boolean useFlag;
 
+	@ApiModelProperty(value = "优惠券名称")
+	private String couponName;
+
+	@ApiModelProperty(value = "奖品关联活动数")
+	private Integer activityNum;
+
 	public String getUpdateByName() {
 		return updateByName;
 	}
@@ -32,4 +38,25 @@ public class ActivityRewardVo extends ActivityReward{
 	public void setUseFlag(Boolean useFlag) {
 		this.useFlag = useFlag;
 	}
+
+	public String getCouponName() {
+		return couponName;
+	}
+
+	public void setCouponName(String couponName) {
+		this.couponName = couponName;
+	}
+
+	public Integer getActivityNum() {
+		return activityNum;
+	}
+
+	public void setActivityNum(Integer activityNum) {
+		this.activityNum = activityNum;
+	}
+
+	public ActivityRewardVo activityNum(Integer activityNum) {
+		this.activityNum = activityNum;
+		return this;
+	}
 }

+ 33 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/UserRewardVo.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.common.enums.RewardTypeEnum;
 import com.yonge.cooleshow.common.enums.UnitEnum;
@@ -30,11 +31,24 @@ public class UserRewardVo implements Serializable {
 	@ApiModelProperty("手机号")
 	private String phone;
 
-	@ApiModelProperty("获奖时间")
+	@ApiModelProperty("获奖/达标时间")
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date  createTime;
 
+	@ApiModelProperty("评测时间")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+	private Date evaluationTime;
+
+	@ApiModelProperty("分数 ")
+	@TableField(value = "score_")
+	private Double score;
+
+	@ApiModelProperty("次数")
+	@TableField(value = "times_")
+	private int times;
+
 	@ApiModelProperty("奖品名 逗号隔开")
 	private String rewardNames;
 
@@ -158,6 +172,14 @@ public class UserRewardVo implements Serializable {
 		this.teacherIds = teacherIds;
 	}
 
+	public Date getEvaluationTime() {
+		return evaluationTime;
+	}
+
+	public void setEvaluationTime(Date evaluationTime) {
+		this.evaluationTime = evaluationTime;
+	}
+
 	public UserRewardVo teacherName(String teacherName) {
 		this.teacherName = teacherName;
 		return this;
@@ -177,4 +199,14 @@ public class UserRewardVo implements Serializable {
 		this.amount = amount;
 		return this;
 	}
+
+	public UserRewardVo score(Double score) {
+		this.score = score;
+		return this;
+	}
+
+	public UserRewardVo times(int times) {
+		this.times = times;
+		return this;
+	}
 }

+ 35 - 12
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityEvaluationRecordMapper.xml

@@ -42,16 +42,33 @@
     </select>
 
     <select id="queryRankingList" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo">
-    	select * from 
-    	(
-		select aer.id_,aer.score_ score,aer.user_id_ userId,u.avatar_ userAvatar,u.username_ username, aer.create_time_ joinDate,s.name_ userSubject,aer.times_ times
-		from activity_evaluation_record aer left join sys_user u on aer.user_id_ = u.id_
-        left join student stu on stu.user_id_ = aer.user_id_
-        left join subject s on s.id_ = stu.subject_id_
-		where aer.activity_id_ = #{activityPlanId} and aer.evaluation_id_ = #{activityEvaluationId} and aer.score_ >= 0
-		order by aer.score_ desc,aer.times_ asc, aer.id_ asc limit 1000000
-		) a group by userId order by score desc,times asc,id_ asc
-		limit #{limit}
+        SELECT t.* FROM
+        (SELECT
+            @rownum :=@rownum + 1 AS rownum,
+            aer.id_,
+            aer.score_ AS score,
+            aer.user_id_ AS userId,
+            u.avatar_ AS userAvatar,
+            u.username_ AS username,
+            aer.create_time_ AS joinDate,
+            s.name_ AS userSubject,
+            aer.times_ AS times
+            FROM
+            (SELECT @rownum := 0) r,
+            activity_evaluation_record aer
+            LEFT JOIN sys_user u ON aer.user_id_ = u.id_
+            LEFT JOIN student stu ON stu.user_id_ = aer.user_id_
+            LEFT JOIN `subject` s ON s.id_ = stu.subject_id_
+            WHERE
+            aer.activity_id_ = #{activityPlanId} AND aer.evaluation_id_ = #{activityEvaluationId} AND aer.score_ > 0
+            ORDER BY
+            aer.score_ DESC,
+            <if test="rankRule != null and rankRule.code == 'EVALUATIONS_NUMBER'">
+                times asc,
+            </if>
+            aer.id_ ASC
+        ) t
+        GROUP BY t.userId ORDER BY t.rownum ASC LIMIT #{limit}
     </select>
 
     <select id="queryUserRanking" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityRankingVo">
@@ -61,7 +78,11 @@
         left join subject s on s.id_ = stu.subject_id_
 		where aer.id_ in (select * from (
 		select aer.id_ from activity_evaluation_record aer where aer.activity_id_ = #{activityPlanId} and aer.evaluation_id_ = #{activityEvaluationId} and aer.user_id_ = #{userId} and aer.score_ >= 0
-		order by aer.score_ desc,aer.times_ asc, aer.id_ asc limit 1) a
+		order by aer.score_ desc,
+        <if test="rankRule != null and rankRule.code == 'EVALUATIONS_NUMBER'">
+            aer.times_ asc,
+        </if>
+         aer.id_ asc limit 1) a
 		) 
     </select>
 
@@ -90,7 +111,9 @@
                  t1.activity_id_ = #{activityId}
              ORDER BY
                  t1.score_ DESC,
-                 t1.times_ ASC,
+                <if test="rankRule != null and rankRule.code == 'EVALUATIONS_NUMBER'">
+                    t1.times_ asc,
+                </if>
                  t1.id_ ASC
              ) t
         WHERE t.userId IN (<foreach collection="userIds" separator="," item="item">#{item}</foreach>)

+ 3 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanMapper.xml

@@ -43,6 +43,8 @@
         , t.registration_price_ as registrationPrice
         , t.share_rate_ as shareRate
         , t.share_type_ as shareType
+        , t.ranking_ as ranking
+        , t.ranking_rule_ as rankingRule
         , t.draft_flag_ as draftFlag
         , if(t.activity_state_ = 1, 1, 0) as activityState
         , t.create_time_ as createTime
@@ -68,7 +70,7 @@
         LEFT JOIN  sys_user u on t.update_by_ = u.id_
         <where>
             <if test="param.activityName != null and param.activityName != ''">
-                and t.activity_name_ like concat('%',#{param.activityName},'%')
+                and (t.activity_name_ like concat('%',#{param.activityName},'%') <if test="param.activityId != null"> OR t.id_ = #{param.activityId}</if> )
             </if>
             <if test="param.draftFlag != null">
                 and t.draft_flag_ = #{param.draftFlag}

+ 2 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityPlanRewardMapper.xml

@@ -15,6 +15,7 @@
         , t.activity_id_ as activityId
         , t.reward_id_ as rewardId
         , t.reward_num_ as rewardNum
+        , t.group_ AS `group`
         , t.create_time_ as createTime
         </sql>
     
@@ -30,7 +31,7 @@
         SELECT
             <include refid="baseColumns"/>
         FROM activity_plan_reward t
-        where t.activity_id_ = #{activityId} and t.reward_id_ = #{rewardId}
+        where t.activity_id_ = #{activityId} and t.reward_id_ = #{rewardId} AND t.group_ = #{group}
     </select>
 
     <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.vo.ActivityPlanRewardVo">

+ 38 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/ActivityRewardMapper.xml

@@ -8,6 +8,7 @@
         <result column="reward_name_" property="rewardName" />
         <result column="reward_type_" property="rewardType" />
         <result column="reward_describe_" property="rewardDescribe" />
+        <result column="coupon_id_" property="couponId" />
         <result column="img_url_" property="imgUrl" />
         <result column="stock_" property="stock" />
         <result column="num_" property="num" />
@@ -28,6 +29,7 @@
         , t.reward_name_ as rewardName
         , t.reward_type_ as rewardType
         , t.reward_describe_ as rewardDescribe
+        , t.coupon_id_ as couponId
         , t.img_url_ as imgUrl
         , t.stock_ as stock
         , t.num_ as num
@@ -94,8 +96,29 @@
         <include refid="selectSql"/>
     </select>
 
-    <select id="getActivityReward" resultMap="BaseResultMap">
-        select ar.*
+
+    <resultMap id="ActivityRewardResultMap" type="com.yonge.cooleshow.biz.dal.entity.ActivityReward">
+        <result column="id_" property="id" />
+        <result column="activity_id_" property="activityId" />
+        <result column="reward_client_" property="rewardClient" />
+        <result column="reward_name_" property="rewardName" />
+        <result column="reward_type_" property="rewardType" />
+        <result column="reward_describe_" property="rewardDescribe" />
+        <result column="img_url_" property="imgUrl" />
+        <result column="stock_" property="stock" />
+        <result column="num_" property="num" />
+        <result column="unit_" property="unit" />
+        <result column="status_" property="status" />
+        <result column="create_time_" property="createTime" />
+        <result column="create_by_" property="createBy" />
+        <result column="update_time_" property="updateTime" />
+        <result column="update_by_" property="updateBy" />
+        <result column="discount_price_" property="discountPrice" />
+
+        <result column="group_" property="group" />
+    </resultMap>
+    <select id="getActivityReward" resultMap="ActivityRewardResultMap">
+        select ar.*, apr.group_
         from activity_plan_reward apr
         left join activity_reward ar on apr.reward_id_ = ar.id_
         where apr.activity_id_ = #{activityPlanId}
@@ -105,4 +128,17 @@
         select (count(1)>0) as flag from activity_user_reward
         where activity_id_ = #{activityId} and user_id_ = #{userId}
     </select>
+
+    <!--奖品关联活动统计-->
+    <select id="selectRewardActivityStatInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.reward_id_ AS id, COUNT(DISTINCT t1.id_) AS total FROM activity_plan_reward t1
+        <where>
+            <if test="rewardIds != null">
+                AND t1.reward_id_ IN (<foreach collection="rewardIds" separator="," item="item">#{item}</foreach>)
+            </if>
+        </where>
+        GROUP BY t1.reward_id_
+    </select>
+    <!--奖品关联活动统计-->
 </mapper>

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

@@ -78,7 +78,7 @@
                 and  t.create_time_ &lt;= #{param.endTime}
             </if>
         </where>
-        <if test="param.activityGroupBy == 1">GROUP BY t.user_id_ , t.activity_id_</if>
+        <if test="param.activityGroupBy == 1">GROUP BY t.user_id_ , t.activity_id_ ORDER BY t.create_time_ ASC </if>
     </select>
 
     <!--分享活动关联老师-->

+ 1 - 1
toolset/toolset-payment/src/main/java/com/yonge/toolset/payment/util/DistributedLock.java

@@ -160,7 +160,7 @@ public class DistributedLock {
      * 解锁
      */
     public void unlock(RLock lock) {
-        if (lock.getHoldCount() != 0) {
+        if (lock.getHoldCount() != 0 && lock.isHeldByCurrentThread()) {
             lock.unlock();
         }
     }