浏览代码

增加专辑付费功能

Eric 2 年之前
父节点
当前提交
55ea4591b3

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/MusicAlbumDao.java

@@ -5,8 +5,10 @@ import com.yonge.cooleshow.biz.dal.dto.search.MusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicAlbumSearch;
 import com.yonge.cooleshow.biz.dal.entity.MusicAlbum;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.vo.MusicAlbumVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
@@ -64,4 +66,12 @@ public interface MusicAlbumDao extends BaseMapper<MusicAlbum> {
      * @return page
      */
     List<MusicAlbumVo> selectStudentPage(@Param("page") IPage<MusicAlbumVo> page, @Param("query") MusicAlbumSearch query, @Param("clientType") ClientEnum clientType);
+
+    /**
+     * 专辑单曲付费类型统计
+     * @param albumId 专辑ID
+     * @param paymentType 付费方式
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectAlbumMusicSheetStatInfo(@Param("albumId") Long albumId, @Param("paymentType") ChargeTypeEnum paymentType);
 }

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

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
 import javax.validation.constraints.NotNull;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -38,6 +39,8 @@ public class MusicAlbumDetailSearch extends MusicSheetSearch {
     @ApiModelProperty(value = "艺术家")
     private String composer;  //音乐家
 
+    private List<String> paymentTypes;
+
     public Integer getRelatedNum() {
         return relatedNum;
     }
@@ -87,4 +90,12 @@ public class MusicAlbumDetailSearch extends MusicSheetSearch {
     public void setDelFlag(Boolean delFlag) {
         this.delFlag = delFlag;
     }
+
+    public List<String> getPaymentTypes() {
+        return paymentTypes;
+    }
+
+    public void setPaymentTypes(List<String> paymentTypes) {
+        this.paymentTypes = paymentTypes;
+    }
 }

+ 24 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicAlbum.java

@@ -90,6 +90,14 @@ public class MusicAlbum extends BaseEntity {
 	@ApiModelProperty("假删除标识 0:未删除 1:已删除")
 	private Boolean delFlag;
 
+	@TableField("album_price_")
+	@ApiModelProperty("专辑价格 ")
+	private Double albumPrice;
+
+	@TableField("payment_type_")
+	@ApiModelProperty("专辑价格 ")
+	private String paymentType;
+
 	public String getSubjectId() {
 		return subjectId;
 	}
@@ -236,4 +244,20 @@ public class MusicAlbum extends BaseEntity {
 	public void setAuditVersion(YesOrNoEnum auditVersion) {
 		this.auditVersion = auditVersion;
 	}
+
+	public Double getAlbumPrice() {
+		return albumPrice;
+	}
+
+	public void setAlbumPrice(Double albumPrice) {
+		this.albumPrice = albumPrice;
+	}
+
+	public String getPaymentType() {
+		return paymentType;
+	}
+
+	public void setPaymentType(String paymentType) {
+		this.paymentType = paymentType;
+	}
 }

+ 13 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/MusicSheetPurchaseRecord.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.entity;
 
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -67,6 +68,10 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
     @ApiModelProperty(value = "订单状态(WAIT_PAY:待支付;PAYING:支付中,PAID:已付款)")
     private OrderStatusEnum orderStatus;  //订单状态(1:已完成;0:取消)
 
+	@TableField("purchase_type_")
+	@ApiModelProperty("购买类型 ")
+	private PurchaseRecordTypeEnum purchaseType;
+
 	public ClientEnum getClientType() {
 		return clientType;
 	}
@@ -163,8 +168,15 @@ public class MusicSheetPurchaseRecord extends BaseEntity {
 	    return this.orderStatus;
 	}
 
+	public PurchaseRecordTypeEnum getPurchaseType() {
+		return purchaseType;
+	}
+
+	public void setPurchaseType(PurchaseRecordTypeEnum purchaseType) {
+		this.purchaseType = purchaseType;
+	}
 
-    @Override
+	@Override
     public String toString() {
         return ToStringBuilder.reflectionToString(this);
     }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/ChargeTypeEnum.java

@@ -30,4 +30,14 @@ public enum ChargeTypeEnum implements BaseEnum<String, ChargeTypeEnum> {
     public String getCode() {
         return this.code;
     }
+
+    /**
+     * 收费类型匹配
+     * @param type 收费类型
+     * @return boolean
+     */
+    public boolean match(String type) {
+
+        return getCode().equals(type);
+    }
 }

+ 41 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/album/PurchaseRecordTypeEnum.java

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.biz.dal.enums.album;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.yonge.toolset.base.enums.BaseEnum;
+
+/**
+ * 单曲、专辑付费购买类型
+ */
+public enum PurchaseRecordTypeEnum implements BaseEnum<String, PurchaseRecordTypeEnum> {
+
+    MUSIC("单曲"),
+    ALBUM("专辑"),
+    ;
+    @EnumValue
+    private String code;
+    private String msg;
+
+    PurchaseRecordTypeEnum(String msg) {
+        this.code = this.name();
+        this.msg = msg;
+    }
+
+    public String getMsg() {
+        return this.msg;
+    }
+
+    @Override
+    public String getCode() {
+        return this.code;
+    }
+
+    /**
+     * 收费类型匹配
+     * @param type 收费类型
+     * @return boolean
+     */
+    public boolean match(String type) {
+
+        return getCode().equals(type);
+    }
+}

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

@@ -2,15 +2,28 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.dao.AlbumMusicRelateDao;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetDao;
+import com.yonge.cooleshow.biz.dal.dao.MusicSheetPurchaseRecordDao;
+import com.yonge.cooleshow.biz.dal.entity.MusicSheetPurchaseRecord;
+import com.yonge.cooleshow.biz.dal.enums.ChargeTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.album.PurchaseRecordTypeEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.CollectionUtils;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.additional.query.impl.LambdaQueryChainWrapper;
@@ -62,6 +75,13 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
 
     @Autowired
     private AlbumFavoriteService albumFavoriteService;
+    @Autowired
+    private MusicSheetPurchaseRecordDao musicSheetPurchaseRecordMapper;
+    @Autowired
+    private MusicSheetDao musicSheetMapper;
+    @Autowired
+    private AlbumMusicRelateDao albumMusicRelateMapper;
+
 
     public MusicAlbumDao getDao() {
         return musicAlbumDao;
@@ -101,10 +121,29 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         albumDetailVo.setAlbumCoverUrl(musicAlbum.getAlbumCoverUrl());
         albumDetailVo.setAlbumStatue(musicAlbum.getAlbumStatus());
         albumDetailVo.setAlbumFavoriteCount(musicAlbum.getAlbumFavoriteCount());
+        albumDetailVo.setAlbumPrice(musicAlbum.getAlbumPrice());
+        albumDetailVo.setPaymentType(musicAlbum.getPaymentType());
         albumDetailVo.setMusicTagNames(musicTagService.getMusicTagNames(StringUtil.toLongList(musicAlbum.getAlbumTag())));
 
+        // 新增专辑曲目查询条件
         if (query.getType() != null && query.getType() == 1) {
             query.setSubjectIds(musicAlbum.getSubjectId());
+
+            // 判断专辑收费类型;非免费类型,只能添加平台曲目
+            if (!ChargeTypeEnum.FREE.match(musicAlbum.getPaymentType())) {
+
+                // 曲目来源
+                query.setSourceType(SourceTypeEnum.PLATFORM);
+                // 曲目收费类型
+                if (musicAlbum.getPaymentType().contains(",")) {
+                    // 多种付费方式
+                    query.setPaymentTypes(Lists.newArrayList(musicAlbum.getPaymentType(), ChargeTypeEnum.FREE.getCode()));
+                } else {
+                    // 单一付费方式
+                    query.setChargeType(ChargeTypeEnum.valueOf(musicAlbum.getPaymentType()));
+                }
+
+            }
         }
 
         IPage<MusicSheetVo> musicSheetVoIPage = musicSheetService.selectAlbumDetailPage(page,query);
@@ -121,6 +160,20 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (musicAlbum == null) {
             throw  new BizException("未找到专辑信息");
         }
+
+        // 付费专辑,需要校验是否已存在购买记录
+        if (!ChargeTypeEnum.VIP.match(musicAlbum.getPaymentType())) {
+
+            // 统计付费专辑的购买数量
+            Integer count = musicSheetPurchaseRecordMapper.selectCount(Wrappers.<MusicSheetPurchaseRecord>lambdaQuery()
+                    .eq(MusicSheetPurchaseRecord::getMusicSheetId, albumId)
+                    .eq(MusicSheetPurchaseRecord::getPurchaseType, PurchaseRecordTypeEnum.ALBUM)
+            );
+            if (Optional.ofNullable(count).orElse(0) > 0) {
+                throw new BizException("当前专辑已有购买记录");
+            }
+        }
+
         List<Long> musicSheetIdList = StringUtil.toLongList(musicSheetIds);
         return albumMusicRelateService.delMusicSheet(albumId,musicSheetIdList);
     }
@@ -132,6 +185,31 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (musicAlbum == null) {
             throw  new BizException("未找到专辑信息");
         }
+
+        // 付费专辑最多只能添加两首免费曲目
+        if (!ChargeTypeEnum.FREE.match(musicAlbum.getPaymentType())) {
+
+            // 新添加曲目统计
+            long freeNum = 0;
+            List<Long> musicIds = albumMusicList.stream()
+                    .map(MusicAlbumSheetDto.AlbumMusic::getMusicSheetId).distinct().collect(Collectors.toList());
+
+            if (CollectionUtils.isNotEmpty(musicIds)) {
+
+                freeNum = musicSheetMapper.selectBatchIds(musicIds).stream()
+                        .filter(x -> ChargeTypeEnum.FREE.match(x.getPaymentType()))
+                        .count();
+            }
+
+            // 已添加曲目统计
+            Map<Long, Integer> collect = getBaseMapper().selectAlbumMusicSheetStatInfo(albumId, ChargeTypeEnum.FREE).stream()
+                    .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+            if ((collect.getOrDefault(albumId, 0) + freeNum) > 2) {
+                throw new BizException("专辑免费曲目最多2首");
+            }
+        }
+
         return albumMusicRelateService.addMusicSheet(albumId,albumMusicList,userId);
     }
 
@@ -157,6 +235,20 @@ public class MusicAlbumServiceImpl extends ServiceImpl<MusicAlbumDao,MusicAlbum>
         if (musicAlbum.getAuditVersion() == null) {
             musicAlbum.setAuditVersion(YesOrNoEnum.NO);
         }
+
+        // 非付费类型,已添加曲目或者已购买,不允许修改付费方式
+        MusicAlbum album = getById(musicAlbum.getId());
+        if (Objects.nonNull(musicAlbum.getPaymentType())
+                && !album.getPaymentType().equals(musicAlbum.getPaymentType())) {
+
+            Integer count = albumMusicRelateMapper.selectCount(Wrappers.<AlbumMusicRelate>lambdaQuery()
+                    .eq(AlbumMusicRelate::getAlbumId, musicAlbum.getId()));
+
+            if (Optional.ofNullable(count).orElse(0) > 0) {
+                throw new BizException("当前专辑已添加曲目");
+            }
+        }
+
         return this.updateById(musicAlbum);
     }
 

+ 22 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/AlbumDetailVo.java

@@ -56,6 +56,12 @@ public class AlbumDetailVo {
     @ApiModelProperty("相关专辑")
     private List<MusicAlbumVo> relatedMusicAlbum;
 
+    @ApiModelProperty("专辑价格 ")
+    private Double albumPrice;
+
+    @ApiModelProperty("专辑价格 ")
+    private String paymentType;
+
 
     public String getSubjectId() {
         return subjectId;
@@ -179,4 +185,20 @@ public class AlbumDetailVo {
     public void setFavorite(YesOrNoEnum favorite) {
         this.favorite = favorite;
     }
+
+    public Double getAlbumPrice() {
+        return albumPrice;
+    }
+
+    public void setAlbumPrice(Double albumPrice) {
+        this.albumPrice = albumPrice;
+    }
+
+    public String getPaymentType() {
+        return paymentType;
+    }
+
+    public void setPaymentType(String paymentType) {
+        this.paymentType = paymentType;
+    }
 }

+ 20 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicAlbumMapper.xml

@@ -34,6 +34,8 @@
         t.create_time_,
         t.audit_version_,
         t.create_by_,
+        t.album_price_,
+        t.payment_type_,
         t.update_time_,
         t.update_by_
     </sql>
@@ -245,4 +247,22 @@
         </if>
         ,t.id_ desc
     </select>
+
+    <!--专辑曲目付费方式统计-->
+    <select id="selectAlbumMusicSheetStatInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.album_id_ AS id, COUNT(t1.id_) AS total
+        FROM album_music_relate t1 JOIN music_sheet t2 ON (t1.music_sheet_id_ = t2.id_)
+        <where>
+            <if test="albumId != null">
+                AND t1.album_id_ = #{albumId}
+            </if>
+            <if test="paymentType != null">
+                AND t2.payment_type_ = #{paymentType}
+            </if>
+        </where>
+        GROUP BY t1.album_id_
+    </select>
+    <!--专辑曲目付费方式统计-->
+
 </mapper>

+ 9 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/MusicSheetMapper.xml

@@ -191,6 +191,15 @@
             <if test="param.delFlag != null">
                 and t.del_flag_ = #{param.delFlag}
             </if>
+            <if test="param.sourceType != null">
+                AND t.source_type_ = #{param.sourceType}
+            </if>
+            <if test="param.chargeType != null">
+                AND (t.payment_type_ = 'FREE' OR FIND_IN_SET(#{param.chargeType}, t.payment_type_))
+            </if>
+            <if test="param.paymentTypes != null">
+                AND t.payment_type_ IN (<foreach collection="param.paymentTypes" separator="," item="item">#{item}</foreach>)
+            </if>
             <if test="param.id != null">
                 <if test="param.type == 2">
                     and amr.album_id_ = #{param.id}