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.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; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.transaction.Transactional; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 超V管理 */ @Slf4j @RestController("masterUserVip") @RequestMapping("master/userVip") public class UserVipController { @Autowired 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")); } if (params.containsKey("isLog")&& StringUtils.isNotEmpty(params.get("isLog").toString())) { wrapper.inSql(UserVip::getUserId,"select user_id from (select uv.*,uvl.id uvlid from user_vip uv left join user_vip_log uvl on uvl.user_vip_id = uv.id where uv.del_flag = 0 ) t where t.uvlid is null group by user_id"); } 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 MPJLambdaWrapper() .rightJoin("(select max(end_time) endTime,type from user_vip where del_flag =0 and user_id = "+user.getId()+" group by type)" + " t1 on t1.endTime = t.end_time and t1.type = t.type") .selectAll(UserVip.class) .eq(UserVip::getUserId, user.getId()) .eq(StringUtils.isNotEmpty(params.get("state").toString()),UserVip::getState, params.get("state").toString()) .orderByAsc(UserVip::getEndTime,UserVip::getType)); 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(); int year = Integer.parseInt(params.get("year").toString()); Date endTime = DateUtils.addDateYears(startTime, year); 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(fee.compareTo(BigDecimal.ZERO)>=0){ if(user.getPeanutCoin().compareTo(fee)<0){ return R.error("天医币不足"); } } if(jf.compareTo(BigDecimal.ZERO)>=0){ if(user.getJf().compareTo(jf)<0){ return R.error("积分不足"); } } String vipType = "11".equals(params.get("type").toString())?"超级VIP": "12".equals(params.get("type").toString())?"开通简易超v": "1".equals(params.get("type").toString())?"开通医学超级VIP": "2".equals(params.get("type").toString())?"开通国心超级VIP": "4".equals(params.get("type").toString())?"开通中医学VIP": "5".equals(params.get("type").toString())?"开通针灸学VIP": "6".equals(params.get("type").toString())?"开通肿瘤学VIP": "7".equals(params.get("type").toString())?"开通国学VIP": "8".equals(params.get("type").toString())?"开通心理学VIP":"开通中西汇通VIP"; if(fee.compareTo(BigDecimal.ZERO)>0){ user.setPeanutCoin(user.getPeanutCoin().subtract(fee)); TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity(); transactionDetailsEntity.setUserId(user.getId()); transactionDetailsEntity.setUserName(user.getNickname()); transactionDetailsEntity.setChangeAmount(fee.negate()); transactionDetailsEntity.setUserBalance(user.getPeanutCoin()); transactionDetailsEntity.setTel(user.getTel()); transactionDetailsEntity.setOrderType("后台扣费"); transactionDetailsEntity.setNote(vipType+year+"年"+params.get("remark").toString()); transactionDetailsService.save(transactionDetailsEntity); } if(jf.compareTo(BigDecimal.ZERO)>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(vipType+year+"年"); jfTransactionDetailsService.save(jfDetail); } 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 (int i=0;i params) { params.put("userVipType","master"); Date startTime = new Date(); int year = Integer.parseInt(params.get("year").toString()); Date endTime = DateUtils.addDateYears(startTime, year); BigDecimal fee = new BigDecimal(params.get("fee").toString()); BigDecimal jf = new BigDecimal(StringUtils.isEmpty(params.get("jf").toString()) ? "0" : params.get("jf").toString()); MyUserEntity user = userService.getById(params.get("userId").toString()); if ("天医币".equals(params.get("payType"))){ if(fee.compareTo(BigDecimal.ZERO)>=0){ if(user.getPeanutCoin().compareTo(fee)<0){ return R.error("天医币不足"); } } if(jf.compareTo(BigDecimal.ZERO)>=0){ if(user.getJf().compareTo(jf)<0){ return R.error("积分不足"); } } String vipType = "11".equals(params.get("type").toString())?"延期超级VIP": "12".equals(params.get("type").toString())?"延期简易超v": "1".equals(params.get("type").toString())?"延期医学超级VIP": "2".equals(params.get("type").toString())?"延期国心超级VIP": "4".equals(params.get("type").toString())?"延期中医学VIP": "5".equals(params.get("type").toString())?"延期针灸学VIP": "6".equals(params.get("type").toString())?"延期肿瘤学VIP": "7".equals(params.get("type").toString())?"延期国学VIP": "8".equals(params.get("type").toString())?"延期心理学VIP": "10".equals(params.get("type").toString())?"妇幼生殖学VIP":"延期中西汇通VIP"; if(fee.compareTo(BigDecimal.ZERO)>0){ user.setPeanutCoin(user.getPeanutCoin().subtract(fee)); TransactionDetailsEntity transactionDetailsEntity = new TransactionDetailsEntity(); transactionDetailsEntity.setUserId(user.getId()); transactionDetailsEntity.setUserName(user.getNickname()); transactionDetailsEntity.setChangeAmount(fee.negate()); transactionDetailsEntity.setUserBalance(user.getPeanutCoin()); transactionDetailsEntity.setTel(user.getTel()); transactionDetailsEntity.setOrderType("后台扣费"); transactionDetailsEntity.setNote(vipType+year+"年"+params.get("remark").toString()); transactionDetailsService.save(transactionDetailsEntity); } if(jf.compareTo(BigDecimal.ZERO)>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(vipType+year+"年"); jfTransactionDetailsService.save(jfDetail); } userService.updateById(user); } List typeList = new ArrayList<>(); int count = 1; if ("11".equals(params.get("type").toString())) {//超v count = 7; 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 = 5; for (int i=4;i<=10;i++){ if (i==7){ i = 9; } log.info("=========000000===="+i); 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 (int i=0;i() .eq(UserVip::getUserId,user.getId()) .eq(UserVip::getType,t) .eq(UserVip::getState,0)); if (userVip!=null){ Date oldEndTime = userVip.getEndTime(); uvlStartTime = oldEndTime; userVip.setEndTime(DateUtils.addDateYears(oldEndTime,year)); userVipService.updateById(userVip); }else { userVip = new UserVip(); userVip.setUserId(Integer.parseInt(params.get("userId").toString())); userVip.setStartTime(startTime); userVip.setEndTime(endTime); uvlStartTime = endTime; userVip.setType(t); userVipService.save(userVip); } BigDecimal lfee = fee.divide(new BigDecimal(count),2, BigDecimal.ROUND_HALF_UP); BigDecimal ljf = jf.divide(new BigDecimal(count),2, BigDecimal.ROUND_HALF_UP); if (i==(typeList.size()-1)){ params.put("fee",fee.subtract(lfee.multiply(new BigDecimal(typeList.size()-1)))); params.put("jf",jf.subtract(ljf.multiply(new BigDecimal(typeList.size()-1)))); }else { params.put("fee",lfee); params.put("jf",ljf); } userVipLogService.addUserVipLog(params, userVip.getUserId(),userVip.getId(),uvlStartTime,userVip.getEndTime()); } 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()) .orderByDesc(UserVip::getEndTime)); Map map = new HashMap<>(); List resUserVips = new ArrayList<>(); //将失效详情添加到有效条目里 for (UserVip userVip : userVips) { if (!map.containsKey(userVip.getType()+"")){ userVip.setUserVipLogs(userVipLogService.list(new LambdaQueryWrapper() .eq(UserVipLog::getUserVipId,userVip.getId()))); map.put(userVip.getType()+"",userVip); resUserVips.add(userVip); }else { UserVip uv = (UserVip) map.get(userVip.getType()+""); List list = uv.getUserVipLogs(); list.addAll(userVipLogService.list(new LambdaQueryWrapper() .eq(UserVipLog::getUserVipId,userVip.getId()))); uv.setUserVipLogs(list.stream().sorted((UserVipLog uvl1,UserVipLog uvl2)->{ return uvl1.getEndTime().compareTo(uvl2.getEndTime()); }).collect(Collectors.toList())); } } return R.ok().put("userVips", resUserVips); } @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 (int i=0;i params) { MPJLambdaWrapper wrapper = new MPJLambdaWrapper(); wrapper.selectAll(UserVip.class); wrapper.leftJoin(MyUserEntity.class, MyUserEntity::getId, UserVip::getUserId); 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.orderByAsc(UserVip::getState); wrapper.orderByAsc(UserVip::getEndTime); 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){ for (UserVip userVip : userVips) { userVip.setUser(userService.getById(userVip.getUserId())); } } return R.ok().put("result", page); } @RequestMapping("/saveUserVip") @Transactional public R saveUserVip(@RequestBody Map params) { MyUserEntity user = userService.getById(params.get("userId").toString()); if (user.getPeanutCoin().compareTo(new BigDecimal(params.get("point").toString()))>=0){ if (user.getPeanutCoin().compareTo(new BigDecimal(params.get("jf").toString()))>=0){ UserVip userVip = new UserVip(); 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()))); 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()); userService.saveOrUpdate(user); return R.ok(); }else { return R.error("积分不足"); } }else { return R.error("天医币不足"); } } //延长过期时间,month为延长月数 @RequestMapping("/extendUserVip") public R extendUserVip(@RequestBody Map params) { 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); 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); return R.ok(); }else { return R.error("积分不足"); } }else { return R.error("天医币不足"); } } }