From 07934839d7b54beb9138ce355085a6e018120a87 Mon Sep 17 00:00:00 2001 From: wuchunlei Date: Tue, 16 Sep 2025 14:09:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0vip=E5=BC=80=E9=80=9A?= =?UTF-8?q?=E6=98=8E=E7=BB=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../peanut/modules/common/entity/UserVip.java | 3 + .../modules/common/entity/UserVipLog.java | 43 ++- .../common/service/UserVipLogService.java | 18 ++ .../service/impl/UserVipLogServiceImpl.java | 51 ++++ .../master/controller/UserVipController.java | 245 +++++++++++++++++- 5 files changed, 325 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/peanut/modules/common/service/UserVipLogService.java create mode 100644 src/main/java/com/peanut/modules/common/service/impl/UserVipLogServiceImpl.java diff --git a/src/main/java/com/peanut/modules/common/entity/UserVip.java b/src/main/java/com/peanut/modules/common/entity/UserVip.java index 217ae285..a25d9dc0 100644 --- a/src/main/java/com/peanut/modules/common/entity/UserVip.java +++ b/src/main/java/com/peanut/modules/common/entity/UserVip.java @@ -8,6 +8,7 @@ import lombok.Data; import java.io.Serializable; import java.util.Date; +import java.util.List; @Data @TableName("user_vip") @@ -48,5 +49,7 @@ public class UserVip implements Serializable { @TableField(exist = false) private MyUserEntity user; + @TableField(exist = false) + private List userVipLogs; } diff --git a/src/main/java/com/peanut/modules/common/entity/UserVipLog.java b/src/main/java/com/peanut/modules/common/entity/UserVipLog.java index a449c327..33f0270f 100644 --- a/src/main/java/com/peanut/modules/common/entity/UserVipLog.java +++ b/src/main/java/com/peanut/modules/common/entity/UserVipLog.java @@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; - import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; @Data -@TableName("user_vip") +@TableName("user_vip_log") public class UserVipLog implements Serializable { private static final long serialVersionUID = 1L; @@ -20,35 +19,23 @@ public class UserVipLog implements Serializable { */ @TableId private int id; - /** - * 管理员ID - */ - private Integer adminId; - /** - * 会员 ID - */ private Integer userId; - /** - * 1超级2医学3国学 - */ - private Integer type; - /** - * 天数 - */ - private Integer days; - - - private BigDecimal point; - - + //会员表id + private Integer userVipId; + //充值渠道order master等 + private String type; + private String orderSn; + private Integer adminId; + private Date startTime; + private Date endTime; + private BigDecimal fee; + private BigDecimal dayAmount; + private String payType; private BigDecimal jf; - - + private String remark; + //预留字段 + private String state; private Date createTime; - /** - * 删除标识 - */ @TableLogic private Integer delFlag; - } diff --git a/src/main/java/com/peanut/modules/common/service/UserVipLogService.java b/src/main/java/com/peanut/modules/common/service/UserVipLogService.java new file mode 100644 index 00000000..dfb34be9 --- /dev/null +++ b/src/main/java/com/peanut/modules/common/service/UserVipLogService.java @@ -0,0 +1,18 @@ +package com.peanut.modules.common.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.peanut.modules.common.entity.UserVip; +import com.peanut.modules.common.entity.UserVipLog; + +import java.math.BigDecimal; +import java.util.Map; + +public interface UserVipLogService extends IService { + + boolean addUserVipLog(UserVipLog userVipLog); + + boolean addUserVipLog(Map params, UserVip userVip); + + BigDecimal countDayAmount(UserVipLog userVipLog); + +} diff --git a/src/main/java/com/peanut/modules/common/service/impl/UserVipLogServiceImpl.java b/src/main/java/com/peanut/modules/common/service/impl/UserVipLogServiceImpl.java new file mode 100644 index 00000000..559fbf55 --- /dev/null +++ b/src/main/java/com/peanut/modules/common/service/impl/UserVipLogServiceImpl.java @@ -0,0 +1,51 @@ +package com.peanut.modules.common.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.peanut.modules.common.dao.UserVipLogDao; +import com.peanut.modules.common.entity.UserVip; +import com.peanut.modules.common.entity.UserVipLog; +import com.peanut.modules.common.service.UserVipLogService; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.StringUtils; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Map; + +@Slf4j +@Service("commonUserVipLogService") +public class UserVipLogServiceImpl extends ServiceImpl implements UserVipLogService { + + @Override + public boolean addUserVipLog(UserVipLog userVipLog) { + userVipLog.setDayAmount(countDayAmount(userVipLog)); + return this.save(userVipLog); + } + + @Override + public boolean addUserVipLog(Map params, UserVip userVip) { + UserVipLog userVipLog = new UserVipLog(); + userVipLog.setUserId(userVip.getUserId()); + userVipLog.setUserVipId(userVip.getId()); + userVipLog.setType(params.get("userVipType").toString()); + userVipLog.setAdminId(Integer.parseInt(params.get("adminId").toString())); + userVipLog.setStartTime(userVip.getStartTime()); + userVipLog.setEndTime(userVip.getEndTime()); + userVipLog.setFee(new BigDecimal(params.get("fee").toString())); + userVipLog.setJf(new BigDecimal(StringUtils.isEmpty(params.get("jf").toString()) ? "0" : params.get("jf").toString())); + userVipLog.setPayType(params.get("payType").toString()); + userVipLog.setRemark(params.get("remark").toString()); + userVipLog.setDayAmount(countDayAmount(userVipLog)); + return this.save(userVipLog); + } + + @Override + public BigDecimal countDayAmount(UserVipLog userVipLog) { + if ("海外支付".equals(userVipLog.getPayType())) { + return BigDecimal.ZERO; + }else { + BigDecimal days = new BigDecimal((userVipLog.getEndTime().getTime()-userVipLog.getStartTime().getTime())/24/60/60/1000); + return userVipLog.getFee().divide(days, 2, BigDecimal.ROUND_HALF_UP); + } + } +} diff --git a/src/main/java/com/peanut/modules/master/controller/UserVipController.java b/src/main/java/com/peanut/modules/master/controller/UserVipController.java index 6b6f1b02..a1d70139 100644 --- a/src/main/java/com/peanut/modules/master/controller/UserVipController.java +++ b/src/main/java/com/peanut/modules/master/controller/UserVipController.java @@ -1,11 +1,14 @@ package com.peanut.modules.master.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.github.yulichang.wrapper.MPJLambdaWrapper; import com.peanut.common.utils.DateUtils; import com.peanut.common.utils.R; -import com.peanut.modules.common.entity.MyUserEntity; -import com.peanut.modules.common.entity.UserVip; +import com.peanut.modules.book.service.TransactionDetailsService; +import com.peanut.modules.common.entity.*; +import com.peanut.modules.common.service.JfTransactionDetailsService; +import com.peanut.modules.common.service.UserVipLogService; import com.peanut.modules.master.service.MyUserService; import com.peanut.modules.master.service.UserVipService; import lombok.extern.slf4j.Slf4j; @@ -27,9 +30,237 @@ import java.util.*; public class UserVipController { @Autowired - private UserVipService vipService; + private UserVipService userVipService; @Autowired private MyUserService userService; + @Autowired + private UserVipLogService userVipLogService; + @Autowired + private TransactionDetailsService transactionDetailsService; + @Autowired + private JfTransactionDetailsService jfTransactionDetailsService; + + @RequestMapping("/getUserVipList") + public R getUserVipList(@RequestBody Map params) { + MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); + wrapper.select(MyUserEntity::getId,MyUserEntity::getName,MyUserEntity::getTel,MyUserEntity::getEmail); + wrapper.rightJoin(UserVip.class, UserVip::getUserId, MyUserEntity::getId); + if (params.containsKey("userName")&& StringUtils.isNotEmpty(params.get("userName").toString())) { + wrapper.like(MyUserEntity::getName,params.get("userName")); + } + if (params.containsKey("tel")&& StringUtils.isNotEmpty(params.get("tel").toString())) { + wrapper.like(MyUserEntity::getTel,params.get("tel")); + } + if (params.containsKey("email")&& StringUtils.isNotEmpty(params.get("email").toString())) { + wrapper.like(MyUserEntity::getEmail,params.get("email")); + } + if (params.containsKey("type")&& StringUtils.isNotEmpty(params.get("type").toString())) { + wrapper.eq(UserVip::getType,params.get("type")); + } + if (params.containsKey("state")&& StringUtils.isNotEmpty(params.get("state").toString())) { + wrapper.eq(UserVip::getState,params.get("state")); + } + wrapper.groupBy(UserVip::getUserId); + Page page = userService.page(new Page<>( + Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())), wrapper); + List users = page.getRecords(); + for (MyUserEntity user : users) { + List userVips = userVipService.list(new LambdaQueryWrapper() + .eq(UserVip::getUserId, user.getId()) + .eq(StringUtils.isNotEmpty(params.get("state").toString()),UserVip::getState, params.get("state").toString())); + user.setUserVips(userVips); + for(UserVip userVip : userVips){ + userVip.setUserVipLogs(userVipLogService.list(new LambdaQueryWrapper() + .eq(UserVipLog::getUserVipId,userVip.getId()))); + } + } + return R.ok().put("result", page); + } + + @RequestMapping("/addUserVipByAdmin") + @Transactional + public R addUserVipByAdmin(@RequestBody Map params) { + params.put("userVipType","master"); + Date startTime = new Date(); + Date endTime = DateUtils.addDateYears(startTime, Integer.parseInt(params.get("year").toString())); + BigDecimal fee = new BigDecimal(params.get("fee").toString()); + BigDecimal jf = new BigDecimal(StringUtils.isEmpty(params.get("jf").toString()) ? "0" : params.get("jf").toString()); + if ("天医币".equals(params.get("payType"))){ + MyUserEntity user = userService.getById(params.get("userId").toString()); + if(user.getPeanutCoin().compareTo(fee)>=0){ + user.setPeanutCoin(user.getPeanutCoin().subtract(fee)); + TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity(); + transactionDetailsEntity.setRemark("后台充扣操作"); + transactionDetailsEntity.setUserId(user.getId()); + transactionDetailsEntity.setUserName(user.getNickname()); + transactionDetailsEntity.setChangeAmount(fee.negate()); + transactionDetailsEntity.setUserBalance(user.getPeanutCoin()); + transactionDetailsEntity.setTel(user.getTel()); + transactionDetailsEntity.setOrderType("扣费"); + transactionDetailsEntity.setNote("购买VIP"); + transactionDetailsService.save(transactionDetailsEntity); + }else { + return R.error("天医币不足"); + } + if (jf.compareTo(BigDecimal.ZERO)>0){ + if(user.getJf().compareTo(jf)>=0){ + user.setJf(user.getJf().subtract(jf)); + JfTransactionDetails jfDetail = new JfTransactionDetails(); + jfDetail.setUserId(user.getId()); + jfDetail.setActType(1); + jfDetail.setChangeAmount(jf.negate()); + jfDetail.setUserBalance(user.getJf()); + jfDetail.setRemark("购买VIP扣除"); + jfTransactionDetailsService.save(jfDetail); + }else { + return R.error("积分不足"); + } + } + userService.updateById(user); + } + List typeList = new ArrayList<>(); + int count = 1; + if ("11".equals(params.get("type").toString())) {//超v + count = 6; + for (int i=4;i<10;i++){ + typeList.add(i); + } + }else if ("12".equals(params.get("type").toString())) {//简易超v + count = 5; + for (int i=4;i<10;i++){ + if (i==7){ + continue; + } + typeList.add(i); + } + }else if ("1".equals(params.get("type").toString())) {//医学超级 + count = 4; + for (int i=4;i<8;i++){ + if (i==7){ + i = 9; + } + typeList.add(i); + } + }else if ("2".equals(params.get("type").toString())) {//国心超级 + count = 2; + for (int i=7;i<9;i++){ + typeList.add(i); + } + }else { + typeList.add(Integer.parseInt(params.get("type").toString())); + } + for (Integer t : typeList) { + UserVip userVip = new UserVip(); + userVip.setUserId(Integer.parseInt(params.get("userId").toString())); + userVip.setStartTime(startTime); + userVip.setEndTime(endTime); + userVip.setType(t); + userVipService.save(userVip); + params.put("fee",fee.divide(new BigDecimal(count),2, BigDecimal.ROUND_HALF_UP)); + params.put("jf",jf.divide(new BigDecimal(count),2, BigDecimal.ROUND_HALF_UP)); + userVipLogService.addUserVipLog(params, userVip); + } + return R.ok(); + } + + @RequestMapping("/getUserVipInfoByUserId") + public R getUserVipInfoByUserId(@RequestBody Map params) { + List userVips = userVipService.list(new LambdaQueryWrapper() + .eq(UserVip::getUserId,params.get("userId").toString()) + .eq("0".equals(params.get("state").toString()),UserVip::getState,params.get("state").toString())); + for (UserVip userVip : userVips) { + userVip.setUserVipLogs(userVipLogService.list(new LambdaQueryWrapper() + .eq(UserVipLog::getUserVipId,userVip.getId()))); + } + return R.ok().put("userVips", userVips); + } + + @RequestMapping("/addUserVipLog") + @Transactional + public R addUserVipLog(@RequestBody Map params) { + List userVips = new ArrayList<>(); + String vipType = params.get("vipType").toString(); + String userId = params.get("userId").toString(); + if ("11".equals(vipType)){//超级所有 + userVips = userVipService.list(new LambdaQueryWrapper() + .eq(UserVip::getUserId,userId) + .in(UserVip::getType,4,5,6,7,8,9)); + } + if ("12".equals(vipType)){//简易超v + userVips = userVipService.list(new LambdaQueryWrapper() + .eq(UserVip::getUserId,userId) + .in(UserVip::getType,4,5,6,8,9)); + } + if ("1".equals(vipType)){//简易超v + userVips = userVipService.list(new LambdaQueryWrapper() + .eq(UserVip::getUserId,userId) + .in(UserVip::getType,4,5,6,9)); + } + if ("2".equals(vipType)){//国心超级 + userVips = userVipService.list(new LambdaQueryWrapper() + .eq(UserVip::getUserId,userId) + .in(UserVip::getType,7,8)); + } + if (userVips.size()>0){ + for (UserVip userVip : userVips) { + UserVipLog userVipLog = new UserVipLog(); + userVipLog.setUserId(userVip.getUserId()); + userVipLog.setUserVipId(userVip.getId()); + userVipLog.setType(params.get("type").toString()); + if (params.containsKey("orderSn")){ + userVipLog.setOrderSn(params.get("orderSn").toString()); + } + userVipLog.setAdminId(Integer.parseInt(params.get("adminId").toString())); + userVipLog.setStartTime(DateUtils.stringToDate(params.get("startTime").toString(), "yyyy-MM-dd HH:mm:ss")); + userVipLog.setEndTime(DateUtils.stringToDate(params.get("endTime").toString(), "yyyy-MM-dd HH:mm:ss")); + BigDecimal fee = new BigDecimal(params.get("fee").toString()); + BigDecimal jf = new BigDecimal(params.get("jf").toString()); + userVipLog.setFee(fee.divide(new BigDecimal(userVips.size()),2, BigDecimal.ROUND_HALF_UP)); + userVipLog.setJf(jf.divide(new BigDecimal(userVips.size()),2, BigDecimal.ROUND_HALF_UP)); + userVipLog.setPayType(params.get("payType").toString()); + if (params.containsKey("remark")){ + userVipLog.setRemark(params.get("remark").toString()); + } + userVipLogService.addUserVipLog(userVipLog); + } + return R.ok(); + }else { + UserVipLog userVipLog = new UserVipLog(); + userVipLog.setUserId(Integer.parseInt(userId)); + userVipLog.setUserVipId(Integer.parseInt(params.get("userVipId").toString())); + userVipLog.setType(params.get("type").toString()); + if (params.containsKey("orderSn")){ + userVipLog.setOrderSn(params.get("orderSn").toString()); + } + userVipLog.setAdminId(Integer.parseInt(params.get("adminId").toString())); + userVipLog.setStartTime(DateUtils.stringToDate(params.get("startTime").toString(), "yyyy-MM-dd HH:mm:ss")); + userVipLog.setEndTime(DateUtils.stringToDate(params.get("endTime").toString(), "yyyy-MM-dd HH:mm:ss")); + userVipLog.setFee(new BigDecimal(params.get("fee").toString())); + userVipLog.setJf(new BigDecimal(params.get("jf").toString())); + userVipLog.setPayType(params.get("payType").toString()); + if (params.containsKey("remark")){ + userVipLog.setRemark(params.get("remark").toString()); + } + userVipLogService.addUserVipLog(userVipLog); + } + return R.ok(); + } + + @RequestMapping("/delUserVipLogById") + public R delUserVipLogById(@RequestBody UserVipLog userVipLog) { + userVipLogService.removeById(userVipLog); + return R.ok(); + } + + @RequestMapping("/updateUserVipLogById") + public R updateUserVipLogById(@RequestBody UserVipLog userVipLog) { + userVipLog.setDayAmount(userVipLogService.countDayAmount(userVipLog)); + if (userVipLogService.updateById(userVipLog)){ + return R.ok(); + }else { + return R.error("数据异常添加失败"); + } + } @RequestMapping("/listByPage") public R listByPage(@RequestBody Map params) { @@ -53,7 +284,7 @@ public class UserVipController { } wrapper.orderByAsc(UserVip::getState); wrapper.orderByAsc(UserVip::getEndTime); - Page page = vipService.page(new Page<>( + Page page = userVipService.page(new Page<>( Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())), wrapper); List userVips = page.getRecords(); if (userVips.size() > 0){ @@ -74,7 +305,7 @@ public class UserVipController { userVip.setUserId(Integer.parseInt(params.get("userId").toString())); userVip.setType(Integer.parseInt(params.get("type").toString())); userVip.setEndTime(DateUtils.addDateMonths(new Date(),Integer.parseInt(params.get("month").toString()))); - vipService.save(userVip); + userVipService.save(userVip); user.setPeanutCoin(user.getPeanutCoin().subtract(new BigDecimal(params.get("point").toString()))); user.setJf(user.getJf().subtract(new BigDecimal(params.get("jf").toString()))); user.setVip(params.get("type").toString()); @@ -91,13 +322,13 @@ public class UserVipController { //延长过期时间,month为延长月数 @RequestMapping("/extendUserVip") public R extendUserVip(@RequestBody Map params) { - UserVip userVip = vipService.getById(params.get("userVipId").toString()); + UserVip userVip = userVipService.getById(params.get("userVipId").toString()); MyUserEntity user = userService.getById(userVip.getUserId()); if (user.getPeanutCoin().compareTo(new BigDecimal(params.get("point").toString()))>=0){ if (user.getPeanutCoin().compareTo(new BigDecimal(params.get("jf").toString()))>=0){ Date newEndTime = DateUtils.addDateMonths(userVip.getEndTime(),Integer.parseInt(params.get("month").toString())); userVip.setEndTime(newEndTime); - vipService.saveOrUpdate(userVip); + userVipService.saveOrUpdate(userVip); user.setPeanutCoin(user.getPeanutCoin().subtract(new BigDecimal(params.get("point").toString()))); user.setJf(user.getJf().subtract(new BigDecimal(params.get("jf").toString()))); userService.saveOrUpdate(user);