Browse Source

处理订阅章节逻辑

master
前端-胡立永 3 weeks ago
parent
commit
ee462cfe70
11 changed files with 205 additions and 69 deletions
  1. +7
    -0
      module-common/src/main/java/org/jeecg/api/controller/AppletBookController.java
  2. +2
    -2
      module-common/src/main/java/org/jeecg/api/controller/AppletOrderController.java
  3. +3
    -0
      module-common/src/main/java/org/jeecg/api/service/AppletBookService.java
  4. +1
    -1
      module-common/src/main/java/org/jeecg/api/service/AppletOrderService.java
  5. +52
    -4
      module-common/src/main/java/org/jeecg/api/service/impl/AppletBookServiceImpl.java
  6. +1
    -1
      module-common/src/main/java/org/jeecg/api/service/impl/AppletIndexServiceImpl.java
  7. +121
    -60
      module-common/src/main/java/org/jeecg/api/service/impl/AppletOrderServiceImpl.java
  8. +2
    -0
      module-common/src/main/java/org/jeecg/modules/commonConfig/service/ICommonConfigService.java
  9. +11
    -0
      module-common/src/main/java/org/jeecg/modules/commonConfig/service/impl/CommonConfigServiceImpl.java
  10. +4
    -0
      module-common/src/main/java/org/jeecg/modules/commonShop/entity/CommonShop.java
  11. +1
    -1
      module-system/src/main/resources/pay_weixin.properties

+ 7
- 0
module-common/src/main/java/org/jeecg/api/controller/AppletBookController.java View File

@ -76,4 +76,11 @@ public class AppletBookController {
return appletBookService.deleteBookshelfByBookId(token, bookId);
}
//根据书籍id获取当前阅读章节
@ApiOperation(value="根据书籍id获取当前阅读章节", notes="根据书籍id获取当前阅读章节")
@GetMapping(value = "/getReadChapterByBookId")
public Result<?> getReadChapterByBookId(@RequestHeader("X-Access-Token") String token, Long bookId){
return appletBookService.getReadChapterByBookId(token, bookId);
}
}

+ 2
- 2
module-common/src/main/java/org/jeecg/api/controller/AppletOrderController.java View File

@ -53,8 +53,8 @@ public class AppletOrderController {
//创建支付套餐订单
@ApiOperation( value="创建支付套餐订单", notes="创建支付套餐订单")
@PostMapping("/createPayPackageOrder")
public Result<?> createPayPackageOrder(@RequestHeader("X-Access-Token") String token, String packageId) {
return appletOrderService.createPayPackageOrder(token, packageId);
public Result<?> createPayPackageOrder(@RequestHeader("X-Access-Token") String token, String packageId, String payType) {
return appletOrderService.createPayPackageOrder(token, packageId, payType);
}
//充值套餐列表


+ 3
- 0
module-common/src/main/java/org/jeecg/api/service/AppletBookService.java View File

@ -28,4 +28,7 @@ public interface AppletBookService {
Result<?> isAddBook(String token, Long bookId);
Result<?> deleteBookshelfByBookId(String token, Long bookId);
//根据书籍ID获取当前阅读章节
Result<?> getReadChapterByBookId(String token, Long bookId);
}

+ 1
- 1
module-common/src/main/java/org/jeecg/api/service/AppletOrderService.java View File

@ -25,7 +25,7 @@ public interface AppletOrderService {
//创建支付套餐订单
Result<?> createPayPackageOrder(String token, String packageId);
Result<?> createPayPackageOrder(String token, String packageId, String payType);
//充值套餐列表
Result<?> getPayPackageList();


+ 52
- 4
module-common/src/main/java/org/jeecg/api/service/impl/AppletBookServiceImpl.java View File

@ -14,6 +14,7 @@ import org.jeecg.modules.commonBook.entity.CommonBook;
import org.jeecg.modules.commonBook.service.ICommonBookService;
import org.jeecg.modules.commonBookNovel.entity.CommonBookNovel;
import org.jeecg.modules.commonBookNovel.service.ICommonBookNovelService;
import org.jeecg.modules.commonChapterReadRecord.entity.CommonChapterReadRecord;
import org.jeecg.modules.commonChapterReadRecord.service.ICommonChapterReadRecordService;
import org.jeecg.modules.commonGiftBack.service.ICommonGiftBackService;
import org.jeecg.modules.commonIconImage.service.ICommonIconImageService;
@ -102,16 +103,15 @@ public class AppletBookServiceImpl implements AppletBookService {
public Result<?> saveOrUpdateReadBook(String token, CommonBook commonBook){
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
// 添加章节阅读记录 - 使用传入参数中的章节ID
chapterReadRecordService.addChapterReadRecord(hanHaiMember.getId(), commonBook.getShopId(), commonBook.getNovelId());
CommonBook one = commonBookService.lambdaQuery()
.eq(CommonBook::getShopId, commonBook.getShopId())
.eq(CommonBook::getUserId, hanHaiMember.getId())
.one();
if(one!=null){
// 添加章节阅读记录 - 使用传入参数中的章节ID
chapterReadRecordService.addChapterReadRecord(hanHaiMember.getId(), one.getShopId(), commonBook.getNovelId());
commonBook.setId(one.getId());
commonBookService.updateById(commonBook);
}
@ -174,5 +174,53 @@ public class AppletBookServiceImpl implements AppletBookService {
return Result.OK(remove);
}
@Override
public Result<?> getReadChapterByBookId(String token, Long bookId) {
//根据书籍ID获取当前阅读章节
if (StringUtils.isBlank(token)) {
return Result.error("token不能为空");
}
if (ObjectUtils.isEmpty(bookId)) {
return Result.error("书籍ID不能为空");
}
HanHaiMember hanHaiMember = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
// 从章节阅读记录表中查询用户对该书籍的最后阅读记录
CommonChapterReadRecord latestReadRecord = chapterReadRecordService.lambdaQuery()
.eq(CommonChapterReadRecord::getUserId, hanHaiMember.getId())
.eq(CommonChapterReadRecord::getBookId, bookId.toString())
.orderByDesc(CommonChapterReadRecord::getUpdateTime)
.orderByDesc(CommonChapterReadRecord::getCreateTime)
.last("limit 1")
.one();
if (ObjectUtils.isNotEmpty(latestReadRecord) && StringUtils.isNotBlank(latestReadRecord.getChapterId())) {
// 如果有阅读记录获取最后阅读章节的详细信息
CommonBookNovel currentChapter = commonBookNovelService.getById(latestReadRecord.getChapterId());
if (ObjectUtils.isNotEmpty(currentChapter)) {
return Result.OK("获取当前阅读章节成功", currentChapter);
}
}
// 如果没有阅读记录或章节不存在返回第一章
CommonBookNovel firstChapter = commonBookNovelService.lambdaQuery()
.eq(CommonBookNovel::getBookId, bookId.toString())
.eq(CommonBookNovel::getStatus, 1) // 状态为1表示已发布
.orderByAsc(CommonBookNovel::getSort)
.orderByAsc(CommonBookNovel::getCreateTime)
.last("limit 1")
.one();
if (ObjectUtils.isNotEmpty(firstChapter)) {
return Result.OK("获取第一章成功", firstChapter);
}
return Result.error("该书籍暂无可阅读章节");
}
}

+ 1
- 1
module-common/src/main/java/org/jeecg/api/service/impl/AppletIndexServiceImpl.java View File

@ -154,7 +154,7 @@ public class AppletIndexServiceImpl implements AppletIndexService {
qw.and(q -> {
q.like(StringUtils.isNotBlank(name), CommonShop::getName, name)
.or()
.in(CommonShop::getUserId, ids);
.in(ids.size() > 0, CommonShop::getUserId, ids);
});
}


+ 121
- 60
module-common/src/main/java/org/jeecg/api/service/impl/AppletOrderServiceImpl.java View File

@ -18,6 +18,7 @@ import org.jeecg.modules.GiveGifts.entity.GiveGifts;
import org.jeecg.modules.GiveGifts.service.IGiveGiftsService;
import org.jeecg.modules.commonBookNovel.entity.CommonBookNovel;
import org.jeecg.modules.commonBookNovel.service.ICommonBookNovelService;
import org.jeecg.modules.commonConfig.service.ICommonConfigService;
import org.jeecg.modules.commonGift.entity.CommonGift;
import org.jeecg.modules.commonGift.service.ICommonGiftService;
import org.jeecg.modules.commonGiftBack.service.ICommonGiftBackService;
@ -42,6 +43,8 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static org.jeecg.modules.online.auth.b.a.*;
@ -88,6 +91,9 @@ public class AppletOrderServiceImpl implements AppletOrderService {
@Autowired
private ICommonOrderService commonOrderService;
@Autowired
private ICommonConfigService commonConfigService;
//查询互动打赏礼物信息列表
@Override
@ -168,7 +174,7 @@ public class AppletOrderServiceImpl implements AppletOrderService {
//创建支付套餐订单
@Override
public Result<?> createPayPackageOrder(String token, String packageId){
public Result<?> createPayPackageOrder(String token, String packageId, String payType){
HanHaiMember member = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
//套餐标识不能为空
if(StringUtils.isEmpty(packageId)){
@ -193,19 +199,41 @@ public class AppletOrderServiceImpl implements AppletOrderService {
.status("0")
.build();
commonOrderService.save(order);
//吊起微信支付
commonOrderService.save(order);
Object appOrder = null;
int i = order.getPrice().multiply(new BigDecimal(100)).intValue();
Object appOrder = mpWxPayService.createOrder(
"充值豆豆",
"127.0.0.1",
order.getId(),
i,
order.getId(),
member.getAppletOpenid(),
"{}");
if ("web".equals(payType)){
HashMap<String, Object> map = new HashMap<>();
Object pay = mpWxPayService.createQrOrder(
"充值豆豆",
"127.0.0.1",
order.getId(),
i,
order.getId(),
"{}");
map.put("pay", pay);
map.put("orderId", order.getId());
appOrder = map;
}else {
//吊起微信支付
appOrder = mpWxPayService.createOrder(
"充值豆豆",
"127.0.0.1",
order.getId(),
i,
order.getId(),
member.getAppletOpenid(),
"{}");
}
return Result.OK("支付成功", appOrder);
}
@ -282,76 +310,109 @@ public class AppletOrderServiceImpl implements AppletOrderService {
.userId(member.getId())
.build());
// TODO 这里需要给作者分钱
return Result.OK("赠送礼物成功");
}
//购买章节
//购买章节(支持批量订阅多个章节ID用逗号隔开)
@Override
@Transactional
public Result<?> buyNovel(String token, String bookId, String novelId){
public Result<?> buyNovel(String token, String bookId, String novelIds){
HanHaiMember member = shiroRealm.checkUserTokenIsEffectHanHaiOpenId(token);
CommonShop book = commonShopService.getById(bookId);
CommonBookNovel chapter = commonBookNovelService.getById(novelId);
if(ObjectUtils.isEmpty(book)){
Result.error("书籍不存在");
return Result.error("书籍不存在");
}
if(ObjectUtils.isEmpty(chapter)){
Result.error("章节不存在");
if(StringUtils.isBlank(novelIds)){
return Result.error("章节ID不能为空");
}
// 解析章节ID列表
String[] novelIdArray = novelIds.split(",");
// 获取订阅配置
String subscribeNum = commonConfigService.getContentByName("chapter_subscribe_num");
int sNum = StringUtils.isNotBlank(subscribeNum) ? Integer.valueOf(subscribeNum) : 999999999;//默认不消耗豆豆
// 记录需要订阅的章节和总消费
List<CommonBookNovel> chaptersToSubscribe = new ArrayList<>();
List<String> chapterTitles = new ArrayList<>();
int totalCost = 0;
// 批量检查章节是否存在和是否已订阅
for(String novelId : novelIdArray){
novelId = novelId.trim();
if(StringUtils.isEmpty(novelId)){
continue;
}
CommonChapterSubscribe one = commonChapterSubscribeService.lambdaQuery()
.eq(CommonChapterSubscribe::getBookId, bookId)
.eq(CommonChapterSubscribe::getUserId, member.getId())
.eq(CommonChapterSubscribe::getChapterId, novelId)
.one();
if (ObjectUtils.isEmpty(one)){
//消耗的豆豆
// TODO 这里需要计算豆豆
Integer i = chapter.getNum() / 200;
if (member.getIntegerPrice().intValue() < i){
Result.error("豆豆不足");
CommonBookNovel chapter = commonBookNovelService.getById(novelId);
if(ObjectUtils.isEmpty(chapter)){
return Result.error("章节不存在: " + novelId);
}
// 检查是否已经订阅
CommonChapterSubscribe existSubscribe = commonChapterSubscribeService.lambdaQuery()
.eq(CommonChapterSubscribe::getBookId, bookId)
.eq(CommonChapterSubscribe::getUserId, member.getId())
.eq(CommonChapterSubscribe::getChapterId, novelId)
.one();
if (ObjectUtils.isEmpty(existSubscribe)){
// 计算消费的豆豆
Integer chapterCost = chapter.getNum() / sNum;
totalCost += chapterCost;
chaptersToSubscribe.add(chapter);
chapterTitles.add(chapter.getTitle());
}
}
// 如果没有需要订阅的章节
if(chaptersToSubscribe.isEmpty()){
return Result.OK("所有章节已订阅");
}
// 检查豆豆是否足够
if (member.getIntegerPrice().intValue() < totalCost){
return Result.error("豆豆不足,需要" + totalCost + "豆豆");
}
// 添加订阅记录
// 批量添加订阅记录
List<CommonChapterSubscribe> subscribeList = new ArrayList<>();
for(CommonBookNovel chapter : chaptersToSubscribe){
CommonChapterSubscribe subscribe = CommonChapterSubscribe.builder()
.authorId(book.getUserId())
.bookId(bookId)
.userId(member.getId())
.chapterId(novelId)
.chapterId(chapter.getId())
.build();
commonChapterSubscribeService.save(subscribe);
// 减去豆豆
BigDecimal integerPrice = member.getIntegerPrice();
member.setIntegerPrice(integerPrice.subtract(new BigDecimal(i)));
hanHaiMemberService.updateById(member);
//增加亲密值
commonRankingService.addIntimacy(member.getId(), bookId, i);
book.setQmNum(book.getQmNum() + i);
commonShopService.updateById(book);
// 添加消费记录
commonMoneyLogService.save(CommonMoneyLog.builder()
.title("订阅" + book.getName() + "的章节" + chapter.getTitle())
.oldMoney(integerPrice)
.money(new BigDecimal(i))
.type(1)//支付豆豆
.state(0)
.userId(member.getId())
.build());
// TODO 这里需要给作者分钱
subscribeList.add(subscribe);
}
return Result.OK("购买成功");
commonChapterSubscribeService.saveBatch(subscribeList);
// 扣除豆豆
BigDecimal integerPrice = member.getIntegerPrice();
member.setIntegerPrice(integerPrice.subtract(new BigDecimal(totalCost)));
hanHaiMemberService.updateById(member);
//增加亲密值
commonRankingService.addIntimacy(member.getId(), bookId, totalCost);
book.setQmNum(book.getQmNum() + totalCost);
commonShopService.updateById(book);
// 添加消费记录
String chapterNames = String.join("、", chapterTitles);
commonMoneyLogService.save(CommonMoneyLog.builder()
.title("订阅" + book.getName() + "的章节:" + chapterNames)
.oldMoney(integerPrice)
.money(new BigDecimal(totalCost))
.type(1)//支付豆豆
.state(0)
.userId(member.getId())
.build());
return Result.OK("批量购买成功,共订阅" + chaptersToSubscribe.size() + "个章节");
}
}

+ 2
- 0
module-common/src/main/java/org/jeecg/modules/commonConfig/service/ICommonConfigService.java View File

@ -11,4 +11,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ICommonConfigService extends IService<CommonConfig> {
String getContentByName(String chapterSubscribeNum);
}

+ 11
- 0
module-common/src/main/java/org/jeecg/modules/commonConfig/service/impl/CommonConfigServiceImpl.java View File

@ -16,4 +16,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@Service
public class CommonConfigServiceImpl extends ServiceImpl<CommonConfigMapper, CommonConfig> implements ICommonConfigService {
@Override
public String getContentByName(String name) {
CommonConfig one = lambdaQuery()
.eq(CommonConfig::getKeyName, name)
.one();
if (one != null){
return one.getKeyContent();
}
return null;
}
}

+ 4
- 0
module-common/src/main/java/org/jeecg/modules/commonShop/entity/CommonShop.java View File

@ -106,6 +106,10 @@ public class CommonShop implements Serializable {
@ApiModelProperty(value = "作品状态")
private java.lang.Integer bookStatus;
@Excel(name = "是否原创", width = 15)
@ApiModelProperty(value = "是否原创")
private java.lang.String isOriginal;
//字数
private java.lang.Integer bookSum;
}

+ 1
- 1
module-system/src/main/resources/pay_weixin.properties View File

@ -5,4 +5,4 @@ pay.keyPath=classpath:apiclient_cert.pem
pay.notifyUrl=https://prod-api.budingxiaoshuo.com/novel-admin/my_order/payNotify
pay.notifyUrlDev=https://prod-api.budingxiaoshuo.com/novel-admin/my_order/payNotify
pay.notifyOneUrl=https://prod-api.budingxiaoshuo.com/novel-admin/my_order/payNotify
pay.notifyUrlOneDev= http://h5.xzaiyp.top/novel-admin/my_order/payNotify
pay.notifyUrlOneDev=https://prod-api.budingxiaoshuo.com/novel-admin/my_order/payNotify

Loading…
Cancel
Save