diff --git a/module-common/src/main/java/org/jeecg/api/controller/AppletBookController.java b/module-common/src/main/java/org/jeecg/api/controller/AppletBookController.java index 9639ffd..cd1f468 100644 --- a/module-common/src/main/java/org/jeecg/api/controller/AppletBookController.java +++ b/module-common/src/main/java/org/jeecg/api/controller/AppletBookController.java @@ -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); + } + } diff --git a/module-common/src/main/java/org/jeecg/api/controller/AppletOrderController.java b/module-common/src/main/java/org/jeecg/api/controller/AppletOrderController.java index b1e57ef..4cb1f3f 100644 --- a/module-common/src/main/java/org/jeecg/api/controller/AppletOrderController.java +++ b/module-common/src/main/java/org/jeecg/api/controller/AppletOrderController.java @@ -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); } //充值套餐列表 diff --git a/module-common/src/main/java/org/jeecg/api/service/AppletBookService.java b/module-common/src/main/java/org/jeecg/api/service/AppletBookService.java index 03a9aa6..6d0949c 100644 --- a/module-common/src/main/java/org/jeecg/api/service/AppletBookService.java +++ b/module-common/src/main/java/org/jeecg/api/service/AppletBookService.java @@ -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); } diff --git a/module-common/src/main/java/org/jeecg/api/service/AppletOrderService.java b/module-common/src/main/java/org/jeecg/api/service/AppletOrderService.java index 1f0b7f9..9a58cab 100644 --- a/module-common/src/main/java/org/jeecg/api/service/AppletOrderService.java +++ b/module-common/src/main/java/org/jeecg/api/service/AppletOrderService.java @@ -25,7 +25,7 @@ public interface AppletOrderService { //创建支付套餐订单 - Result createPayPackageOrder(String token, String packageId); + Result createPayPackageOrder(String token, String packageId, String payType); //充值套餐列表 Result getPayPackageList(); diff --git a/module-common/src/main/java/org/jeecg/api/service/impl/AppletBookServiceImpl.java b/module-common/src/main/java/org/jeecg/api/service/impl/AppletBookServiceImpl.java index 8838a5d..7f95bea 100644 --- a/module-common/src/main/java/org/jeecg/api/service/impl/AppletBookServiceImpl.java +++ b/module-common/src/main/java/org/jeecg/api/service/impl/AppletBookServiceImpl.java @@ -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("该书籍暂无可阅读章节"); + } + } diff --git a/module-common/src/main/java/org/jeecg/api/service/impl/AppletIndexServiceImpl.java b/module-common/src/main/java/org/jeecg/api/service/impl/AppletIndexServiceImpl.java index a66e1ee..240bda5 100644 --- a/module-common/src/main/java/org/jeecg/api/service/impl/AppletIndexServiceImpl.java +++ b/module-common/src/main/java/org/jeecg/api/service/impl/AppletIndexServiceImpl.java @@ -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); }); } diff --git a/module-common/src/main/java/org/jeecg/api/service/impl/AppletOrderServiceImpl.java b/module-common/src/main/java/org/jeecg/api/service/impl/AppletOrderServiceImpl.java index 08876ae..a3deef2 100644 --- a/module-common/src/main/java/org/jeecg/api/service/impl/AppletOrderServiceImpl.java +++ b/module-common/src/main/java/org/jeecg/api/service/impl/AppletOrderServiceImpl.java @@ -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 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 chaptersToSubscribe = new ArrayList<>(); + List 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 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() + "个章节"); } } diff --git a/module-common/src/main/java/org/jeecg/modules/commonConfig/service/ICommonConfigService.java b/module-common/src/main/java/org/jeecg/modules/commonConfig/service/ICommonConfigService.java index 6e544a3..a4a85b6 100644 --- a/module-common/src/main/java/org/jeecg/modules/commonConfig/service/ICommonConfigService.java +++ b/module-common/src/main/java/org/jeecg/modules/commonConfig/service/ICommonConfigService.java @@ -11,4 +11,6 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface ICommonConfigService extends IService { + String getContentByName(String chapterSubscribeNum); + } diff --git a/module-common/src/main/java/org/jeecg/modules/commonConfig/service/impl/CommonConfigServiceImpl.java b/module-common/src/main/java/org/jeecg/modules/commonConfig/service/impl/CommonConfigServiceImpl.java index 5830d5c..86e16a5 100644 --- a/module-common/src/main/java/org/jeecg/modules/commonConfig/service/impl/CommonConfigServiceImpl.java +++ b/module-common/src/main/java/org/jeecg/modules/commonConfig/service/impl/CommonConfigServiceImpl.java @@ -16,4 +16,15 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @Service public class CommonConfigServiceImpl extends ServiceImpl implements ICommonConfigService { + + @Override + public String getContentByName(String name) { + CommonConfig one = lambdaQuery() + .eq(CommonConfig::getKeyName, name) + .one(); + if (one != null){ + return one.getKeyContent(); + } + return null; + } } diff --git a/module-common/src/main/java/org/jeecg/modules/commonShop/entity/CommonShop.java b/module-common/src/main/java/org/jeecg/modules/commonShop/entity/CommonShop.java index daa62a1..ba50c52 100644 --- a/module-common/src/main/java/org/jeecg/modules/commonShop/entity/CommonShop.java +++ b/module-common/src/main/java/org/jeecg/modules/commonShop/entity/CommonShop.java @@ -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; } diff --git a/module-system/src/main/resources/pay_weixin.properties b/module-system/src/main/resources/pay_weixin.properties index 2f3f3d7..98d78be 100644 --- a/module-system/src/main/resources/pay_weixin.properties +++ b/module-system/src/main/resources/pay_weixin.properties @@ -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