Files
nuttyreading-server/src/main/java/com/peanut/modules/master/controller/UserVipController.java

526 lines
27 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<String, Object> params) {
MPJLambdaWrapper<MyUserEntity> 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<MyUserEntity> page = userService.page(new Page<>(
Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())), wrapper);
List<MyUserEntity> users = page.getRecords();
for (MyUserEntity user : users) {
List<UserVip> userVips = userVipService.list(new MPJLambdaWrapper<UserVip>()
.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<UserVipLog>()
.eq(UserVipLog::getUserVipId,userVip.getId())));
}
}
return R.ok().put("result", page);
}
@RequestMapping("/addUserVipByAdmin")
@Transactional
public R addUserVipByAdmin(@RequestBody Map<String, Object> 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<Integer> 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<typeList.size();i++) {
Integer t = typeList.get(i);
UserVip userVip = new UserVip();
userVip.setUserId(Integer.parseInt(params.get("userId").toString()));
userVip.setStartTime(startTime);
userVip.setEndTime(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(),userVip.getStartTime(),userVip.getEndTime());
}
return R.ok();
}
@RequestMapping("/renewUserVipByAdmin")
@Transactional
public R renewUserVipByAdmin(@RequestBody Map<String, Object> 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<Integer> 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<typeList.size();i++) {
Date uvlStartTime = new Date();
Integer t = typeList.get(i);
UserVip userVip = userVipService.getOne(new LambdaQueryWrapper<UserVip>()
.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<String, Object> params) {
List<UserVip> userVips = userVipService.list(new LambdaQueryWrapper<UserVip>()
.eq(UserVip::getUserId,params.get("userId").toString())
.eq("0".equals(params.get("state").toString()),UserVip::getState,params.get("state").toString())
.orderByDesc(UserVip::getEndTime));
Map<String,Object> map = new HashMap<>();
List<UserVip> resUserVips = new ArrayList<>();
//将失效详情添加到有效条目里
for (UserVip userVip : userVips) {
if (!map.containsKey(userVip.getType()+"")){
userVip.setUserVipLogs(userVipLogService.list(new LambdaQueryWrapper<UserVipLog>()
.eq(UserVipLog::getUserVipId,userVip.getId())));
map.put(userVip.getType()+"",userVip);
resUserVips.add(userVip);
}else {
UserVip uv = (UserVip) map.get(userVip.getType()+"");
List<UserVipLog> list = uv.getUserVipLogs();
list.addAll(userVipLogService.list(new LambdaQueryWrapper<UserVipLog>()
.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<String, Object> params) {
List<UserVip> userVips = new ArrayList<>();
String vipType = params.get("vipType").toString();
String userId = params.get("userId").toString();
if ("11".equals(vipType)){//超级所有
userVips = userVipService.list(new LambdaQueryWrapper<UserVip>()
.eq(UserVip::getUserId,userId)
.in(UserVip::getType,4,5,6,7,8,9));
}
if ("12".equals(vipType)){//简易超v
userVips = userVipService.list(new LambdaQueryWrapper<UserVip>()
.eq(UserVip::getUserId,userId)
.in(UserVip::getType,4,5,6,8,9));
}
if ("1".equals(vipType)){//简易超v
userVips = userVipService.list(new LambdaQueryWrapper<UserVip>()
.eq(UserVip::getUserId,userId)
.in(UserVip::getType,4,5,6,9));
}
if ("2".equals(vipType)){//国心超级
userVips = userVipService.list(new LambdaQueryWrapper<UserVip>()
.eq(UserVip::getUserId,userId)
.in(UserVip::getType,7,8));
}
if (userVips.size()>0){
for (int i=0;i<userVips.size();i++) {
UserVip userVip = userVips.get(i);
UserVipLog userVipLog = new UserVipLog();
userVipLog.setUserId(userVip.getUserId());
userVipLog.setUserVipId(userVip.getId());
userVipLog.setType(params.get("type").toString());
userVipLog.setPayTime(params.containsKey("payTime")?DateUtils.stringToDate(params.get("payTime").toString(), "yyyy-MM-dd HH:mm:ss"):new Date());
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 totalFee = new BigDecimal(params.get("fee").toString());
BigDecimal totalJf = new BigDecimal(params.get("jf").toString());
BigDecimal fee = totalFee.divide(new BigDecimal(userVips.size()),2, BigDecimal.ROUND_HALF_UP);
BigDecimal jf = totalJf.divide(new BigDecimal(userVips.size()),2, BigDecimal.ROUND_HALF_UP);
if (i==(userVips.size()-1)){
userVipLog.setPrice(totalFee.subtract(fee.multiply(new BigDecimal(userVips.size()-1))));
userVipLog.setFee(totalFee.subtract(fee.multiply(new BigDecimal(userVips.size()-1))));
userVipLog.setJf(totalJf.subtract(jf.multiply(new BigDecimal(userVips.size()-1))));
}else {
userVipLog.setPrice(fee);
userVipLog.setFee(fee);
userVipLog.setJf(jf);
}
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());
userVipLog.setPayTime(params.containsKey("payTime")?DateUtils.stringToDate(params.get("payTime").toString(), "yyyy-MM-dd HH:mm:ss"):new Date());
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.setPrice(new BigDecimal(params.get("fee").toString()));
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<String, Object> params) {
MPJLambdaWrapper<UserVip> 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<UserVip> page = userVipService.page(new Page<>(
Long.parseLong(params.get("current").toString()), Long.parseLong(params.get("limit").toString())), wrapper);
List<UserVip> 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<String, Object> 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<String, Object> 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("天医币不足");
}
}
}