begin new project

This commit is contained in:
wangjinlei
2026-04-22 15:55:42 +08:00
commit 5e6bde0862
1370 changed files with 129431 additions and 0 deletions

View File

@@ -0,0 +1,523 @@
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":"延期中西汇通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++) {
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("天医币不足");
}
}
}