This commit is contained in:
77
2024-03-25 22:48:10 +08:00
parent 08778d4a92
commit 65aaaf39c8
34 changed files with 966 additions and 23 deletions

View File

@@ -4,11 +4,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.ConsumeLog;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.UserExtend;
import com.ruoyi.xq.dto.admin.user.UserExtendAdminVo;
import com.ruoyi.xq.dto.admin.user.req.UpdateIncomeCoinReq;
import com.ruoyi.xq.dto.admin.user.req.UpdateWxTransNumReq;
import com.ruoyi.xq.dto.app.account.AccountDetailVo;
import com.ruoyi.xq.enums.account.WxTransLogCateEnum;
import com.ruoyi.xq.enums.user.AccountChangeCodeEnum;
import java.math.BigDecimal;
@@ -35,8 +36,11 @@ public interface UserExtendService extends IService<UserExtend> {
void updateWxTransNum(UpdateWxTransNumReq bo);
boolean consumeWxTrans(Long sponsorUserId, User receiveUser, String traceId);
boolean incsWxTrans(Long userId,Integer wxTransNum, WxTransLogCateEnum cateEnum, String traceId, String remark);
UserExtend getByUserId(Long id);
}

View File

@@ -0,0 +1,22 @@
package com.ruoyi.xq.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.WxTransData;
import com.ruoyi.xq.dto.app.account.StarWxTransReq;
import com.ruoyi.xq.dto.app.account.WxTransDataListAppVo;
import com.ruoyi.xq.dto.app.account.WxTransDataQuery;
/**
* 微信交换数据Service接口
*
* @author 77
* @date 2024-03-25
*/
public interface WxTransDataService extends IService<WxTransData> {
void start(StarWxTransReq starWxTransReq);
Page<WxTransDataListAppVo> pageApp(PageQuery pageQuery, WxTransDataQuery wxTransDataQuery);
}

View File

@@ -0,0 +1,24 @@
package com.ruoyi.xq.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.WxTransLog;
import com.ruoyi.xq.dto.app.account.WxTransLogListVo;
import com.ruoyi.xq.dto.app.account.WxTransLogQuery;
import com.ruoyi.xq.enums.account.WxTransLogCateEnum;
/**
* 微信交换记录Service接口
*
* @author 77
* @date 2024-03-25
*/
public interface WxTransLogService extends IService<WxTransLog> {
Page<WxTransLogListVo> pageApp(PageQuery pageQuery, WxTransLogQuery query);
void consumerSaveLog(Long sponsorUserId, String traceId, User receiveUser);
void saveLog(Long userId, Integer wxTransNum, WxTransLogCateEnum cateEnum, String traceId, String remark);
}

View File

@@ -5,6 +5,11 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.WxTransOrder;
import com.ruoyi.xq.dto.admin.wxtrans.WxTransOrderAdminVo;
import com.ruoyi.xq.dto.app.pay.ConsumeResp;
import com.ruoyi.xq.enums.pay.PlatformTypeEnum;
import org.springframework.transaction.annotation.Transactional;
import java.util.Map;
/**
* 微信交换订单Service接口
@@ -14,7 +19,12 @@ import com.ruoyi.xq.dto.admin.wxtrans.WxTransOrderAdminVo;
*/
public interface WxTransOrderService extends IService<WxTransOrder> {
WxTransOrder createVipOrder(Long userId, Integer wxTransNum);
WxTransOrder createWxTransOrder(Long userId, Integer wxTransNum);
WxTransOrder getByOrderNo(String orderNo);
@Transactional(rollbackFor = Exception.class)
ConsumeResp doSuccess(String orderNo, Map<String, String> params, String appId, PlatformTypeEnum payTypeEnum);
Page<WxTransOrderAdminVo> pageAdmin(PageQuery pageQuery, WxTransOrderAdminVo bo);
}

View File

@@ -14,21 +14,18 @@ import com.ruoyi.xq.domain.WxTransOrder;
import com.ruoyi.xq.dto.admin.user.UserExtendAdminVo;
import com.ruoyi.xq.dto.admin.user.req.UpdateIncomeCoinReq;
import com.ruoyi.xq.dto.admin.user.req.UpdateWxTransNumReq;
import com.ruoyi.xq.dto.app.account.AccountDetailVo;
import com.ruoyi.xq.enums.account.WxTransLogCateEnum;
import com.ruoyi.xq.enums.common.OrderTypeEnum;
import com.ruoyi.xq.enums.common.SystemConfigEnum;
import com.ruoyi.xq.enums.consumer.ConsumerTypeEnum;
import com.ruoyi.xq.enums.pay.PayStatusEnum;
import com.ruoyi.xq.enums.pay.PlatformTypeEnum;
import com.ruoyi.xq.enums.user.AccountChangeCodeEnum;
import com.ruoyi.xq.enums.wxtrans.WxTransSourceEnum;
import com.ruoyi.xq.enums.account.WxTransSourceEnum;
import com.ruoyi.xq.manager.OrderNoUtil;
import com.ruoyi.xq.manager.SystemConfigManager;
import com.ruoyi.xq.mapper.UserExtendMapper;
import com.ruoyi.xq.service.AccountChangeLogService;
import com.ruoyi.xq.service.UserExtendService;
import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.WxTransOrderService;
import com.ruoyi.xq.service.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -55,6 +52,8 @@ public class UserExtendServiceImpl extends ServiceImpl<UserExtendMapper,UserExte
private SystemConfigManager systemConfigManager;
@Autowired
private AccountChangeLogService accountChangeLogService;
@Autowired
private WxTransLogService wxTransLogService;
@Override
public boolean withdraw(Long userId, BigDecimal withdrawPrice,String traceId){
@@ -159,6 +158,24 @@ public class UserExtendServiceImpl extends ServiceImpl<UserExtendMapper,UserExte
wxTransOrderService.save(wxTransOrder);
}
@Override
public boolean consumeWxTrans(Long sponsorUserId, User receiveUser, String traceId) {
boolean success = baseMapper.incsWxTransNum(sponsorUserId, 1);
if(success){
wxTransLogService.consumerSaveLog(sponsorUserId, traceId,receiveUser);
}
return success;
}
@Override
public boolean incsWxTrans(Long userId, Integer wxTransNum, WxTransLogCateEnum cateEnum, String traceId, String remark) {
boolean success = baseMapper.incsWxTransNum(userId, wxTransNum);
if(success){
wxTransLogService.saveLog(userId, wxTransNum,cateEnum,traceId,remark);
}
return success;
}
@Override
public UserExtend getByUserId(Long userId) {
return this.getOne(Wrappers.lambdaQuery(UserExtend.class).eq(UserExtend::getUserId, userId).last("limit 1"));

View File

@@ -123,6 +123,7 @@ public class VipOrderServiceImpl extends ServiceImpl<VipOrderMapper,VipOrder> im
resp.setUserId(vipOrder.getUserId());
resp.setTraceId(traceId);
resp.setSuccess(true);
resp.setVipId(vipOrder.getVipId());
return resp;
}

View File

@@ -0,0 +1,136 @@
package com.ruoyi.xq.service.impl;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.WxTransData;
import com.ruoyi.xq.dto.app.account.StarWxTransReq;
import com.ruoyi.xq.dto.app.account.WxTransDataListAppVo;
import com.ruoyi.xq.dto.app.account.WxTransDataQuery;
import com.ruoyi.xq.enums.ErrorEnum;
import com.ruoyi.xq.enums.account.WxTransDataStatusEnum;
import com.ruoyi.xq.enums.common.TraceIdEnum;
import com.ruoyi.xq.mapper.WxTransDataMapper;
import com.ruoyi.xq.service.UserExtendService;
import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.WxTransDataService;
import com.ruoyi.xq.util.BirthdayUtil;
import com.ruoyi.xq.util.PageConvert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 微信交换数据Service业务层处理
*
* @author 77
* @date 2024-03-25
*/
@Service
public class WxTransDataServiceImpl extends ServiceImpl<WxTransDataMapper,WxTransData> implements WxTransDataService {
@Autowired
private UserExtendService userExtendService;
@Autowired
private UserService userService;
@Override
@Transactional(rollbackFor = Exception.class)
public void start(StarWxTransReq starWxTransReq) {
if(starWxTransReq.getSponsorUserId().equals(starWxTransReq.getReceiveUserId())){
throw new ServiceException("自己不能和自己交换微信哦");
}
User receiveUser = userService.getById(starWxTransReq.getReceiveUserId());
if(receiveUser == null){
throw new ServiceException("接受用户不存在");
}
String traceId = TraceIdEnum.WX_TRANS.getCode();
boolean success = userExtendService.consumeWxTrans(starWxTransReq.getSponsorUserId(),receiveUser, traceId);
if(!success){
throw new ServiceException(ErrorEnum.WX_TRANS_ERROR);
}
User sponsorUser = userService.getById(starWxTransReq.getSponsorUserId());
WxTransData data = new WxTransData();
data.setTraceId(traceId);
data.setSponsorUserId(sponsorUser.getId());
data.setSponsorUsercode(sponsorUser.getUsercode());
data.setSponsorWx(sponsorUser.getWxCode());
data.setReceiveUserId(receiveUser.getId());
data.setReceiveUsercode(receiveUser.getUsercode());
data.setReceiveWx(receiveUser.getWxCode());
data.setStatus(WxTransDataStatusEnum.READY.getCode());
this.save(data);
}
@Override
public Page<WxTransDataListAppVo> pageApp(PageQuery pageQuery, WxTransDataQuery wxTransDataQuery) {
Page<WxTransData> page = baseMapper.pageApp(pageQuery.build(), wxTransDataQuery);
List<WxTransData> records = page.getRecords();
if(CollectionUtils.isEmpty(records)){
return PageConvert.convertEmpty(page);
}
Long userId = wxTransDataQuery.getUserId();
List<Long> userIdList = new ArrayList<>();
for (WxTransData record : records) {
userIdList.add(record.getSponsorUserId());
userIdList.add(record.getReceiveUserId());
}
List<User> users = userService.listByIds(userIdList);
Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));
List<WxTransDataListAppVo> res = new ArrayList<>();
for (WxTransData record : records) {
WxTransDataListAppVo vo = new WxTransDataListAppVo();
vo.setId(record.getId());
vo.setCreateTime(record.getCreateTime());
vo.setStatus(record.getStatus());
if(record.getSponsorUserId().equals(userId)){
vo.setUserId(record.getSponsorUserId());
vo.setUsercode(record.getSponsorUsercode());
User user = userMap.get(record.getSponsorUserId());
if(user != null){
vo.setAvatar(user.getAvatar());
vo.setGender(user.getGender());
vo.setNickname(user.getNickname());
vo.setBirthday(user.getBirthday());
vo.setBirthdayStr(BirthdayUtil.getMinBirthday(user.getBirthday()));
vo.setAge(BirthdayUtil.getAge(user.getBirthday()));
vo.setResidenceCityName(user.getResidenceCityName());
vo.setEducation(user.getEducation());
vo.setProfession(user.getProfession());
}
if(WxTransDataStatusEnum.SUCCESS.getCode().equals(record.getStatus())){
vo.setWxCode(record.getReceiveWx());
}
} else {
vo.setUserId(record.getReceiveUserId());
vo.setUsercode(record.getReceiveUsercode());
User user = userMap.get(record.getReceiveUserId());
if(user != null){
vo.setAvatar(user.getAvatar());
vo.setGender(user.getGender());
vo.setNickname(user.getNickname());
vo.setBirthday(user.getBirthday());
vo.setBirthdayStr(BirthdayUtil.getMinBirthday(user.getBirthday()));
vo.setAge(BirthdayUtil.getAge(user.getBirthday()));
vo.setResidenceCityName(user.getResidenceCityName());
vo.setEducation(user.getEducation());
vo.setProfession(user.getProfession());
}
if(WxTransDataStatusEnum.SUCCESS.getCode().equals(record.getStatus())){
vo.setWxCode(record.getSponsorWx());
}
}
res.add(vo);
}
return PageConvert.convert(page,res);
}
}

View File

@@ -0,0 +1,104 @@
package com.ruoyi.xq.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.WxTransLog;
import com.ruoyi.xq.dto.app.account.WxTransLogListVo;
import com.ruoyi.xq.dto.app.account.WxTransLogQuery;
import com.ruoyi.xq.dto.common.user.MinUser;
import com.ruoyi.xq.enums.account.WxTransLogCateEnum;
import com.ruoyi.xq.mapper.WxTransLogMapper;
import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.WxTransLogService;
import com.ruoyi.xq.util.PageConvert;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 微信交换记录Service业务层处理
*
* @author 77
* @date 2024-03-25
*/
@Service
public class WxTransLogServiceImpl extends ServiceImpl<WxTransLogMapper,WxTransLog> implements WxTransLogService {
@Autowired
private UserService userService;
@Override
public Page<WxTransLogListVo> pageApp(PageQuery pageQuery, WxTransLogQuery query) {
Page<WxTransLog> page = this.page(pageQuery.build(), Wrappers.lambdaQuery(WxTransLog.class).eq(WxTransLog::getUserId, query.getUserId()));
List<WxTransLog> records = page.getRecords();
if(CollectionUtils.isEmpty(records)){
return PageConvert.convertEmpty(page);
}
List<Long> userIdList = records.stream().map(WxTransLog::getTarUserId).filter(Objects::nonNull).collect(Collectors.toList());
List<User> users = userService.listByIds(userIdList);
Map<Long, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity()));
List<WxTransLogListVo> vo = new ArrayList<>();
for (WxTransLog record : records) {
WxTransLogListVo res = new WxTransLogListVo();
res.setUserId(record.getUserId());
res.setUsercode(record.getUsercode());
res.setTitle(record.getCateName());
res.setContent(record.getRemark());
res.setCreateTime(record.getCreateTime());
res.setChangeValue(record.getChangeValue());
User user = userMap.get(record.getTarUserId());
if(user != null){
res.setSourceUserId(user.getId());
res.setSourceNickname(user.getNickname());
res.setSourceImg(user.getAvatar());
}
vo.add(res);
}
return PageConvert.convert(page,vo);
}
@Override
public void consumerSaveLog(Long sponsorUserId, String traceId, User receiveUser) {
MinUser minUser = userService.getMinUserById(sponsorUserId);
WxTransLog wxTransLog = new WxTransLog();
wxTransLog.setUserId(minUser.getId());
wxTransLog.setUsercode(minUser.getUsercode());
wxTransLog.setTraceId(traceId);
wxTransLog.setCateId(WxTransLogCateEnum.CONSUMER.getCode());
wxTransLog.setCateName(WxTransLogCateEnum.CONSUMER.getText());
wxTransLog.setRemark("使用一次微信交换");
wxTransLog.setChangeValue(-1L);
wxTransLog.setTarUserJson(JSON.toJSONString(receiveUser));
wxTransLog.setTarUserId(receiveUser.getId());
wxTransLog.setTarUsercode(receiveUser.getUsercode());
this.save(wxTransLog);
}
@Override
public void saveLog(Long userId, Integer wxTransNum, WxTransLogCateEnum cateEnum, String traceId, String remark) {
MinUser minUser = userService.getMinUserById(userId);
WxTransLog wxTransLog = new WxTransLog();
wxTransLog.setUserId(minUser.getId());
wxTransLog.setUsercode(minUser.getUsercode());
wxTransLog.setTraceId(traceId);
wxTransLog.setCateId(cateEnum.getCode());
wxTransLog.setCateName(cateEnum.getText());
wxTransLog.setRemark(cateEnum.getText());
if(StringUtils.isNotBlank(remark)){
wxTransLog.setRemark(remark);
}
wxTransLog.setChangeValue(Long.valueOf(wxTransNum));
this.save(wxTransLog);
}
}

View File

@@ -1,25 +1,35 @@
package com.ruoyi.xq.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.xq.domain.User;
import com.ruoyi.xq.domain.WxTransOrder;
import com.ruoyi.xq.dto.admin.wxtrans.WxTransOrderAdminVo;
import com.ruoyi.xq.dto.app.pay.ConsumeResp;
import com.ruoyi.xq.enums.account.WxTransLogCateEnum;
import com.ruoyi.xq.enums.common.OrderTypeEnum;
import com.ruoyi.xq.enums.common.SystemConfigEnum;
import com.ruoyi.xq.enums.common.TraceIdEnum;
import com.ruoyi.xq.enums.pay.PayStatusEnum;
import com.ruoyi.xq.enums.wxtrans.WxTransSourceEnum;
import com.ruoyi.xq.enums.account.WxTransSourceEnum;
import com.ruoyi.xq.enums.pay.PlatformTypeEnum;
import com.ruoyi.xq.manager.OrderNoUtil;
import com.ruoyi.xq.manager.SystemConfigManager;
import com.ruoyi.xq.manager.TraceIdManager;
import com.ruoyi.xq.mapper.WxTransOrderMapper;
import com.ruoyi.xq.service.UserExtendService;
import com.ruoyi.xq.service.UserService;
import com.ruoyi.xq.service.WxTransOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Map;
/**
* 微信交换订单Service业务层处理
@@ -34,9 +44,11 @@ public class WxTransOrderServiceImpl extends ServiceImpl<WxTransOrderMapper,WxTr
private SystemConfigManager systemConfigManager;
@Autowired
private UserService userService;
@Autowired
private UserExtendService userExtendService;
@Override
public WxTransOrder createVipOrder(Long userId, Integer wxTransNum) {
public WxTransOrder createWxTransOrder(Long userId, Integer wxTransNum) {
BigDecimal price = systemConfigManager.getSystemConfigOfBigDecimal(SystemConfigEnum.WX_TRANS_PRICE);
String orderNo = OrderNoUtil.gen(OrderTypeEnum.WX_TRANS);
User user = userService.getById(userId);
@@ -53,6 +65,45 @@ public class WxTransOrderServiceImpl extends ServiceImpl<WxTransOrderMapper,WxTr
return order;
}
@Override
public WxTransOrder getByOrderNo(String orderNo){
return this.getOne(Wrappers.lambdaQuery(WxTransOrder.class).eq(WxTransOrder::getOrderNo, orderNo).last("limit 1"));
}
@Override
@Transactional(rollbackFor = Exception.class)
public ConsumeResp doSuccess(String orderNo, Map<String, String> params, String appId, PlatformTypeEnum payTypeEnum){
WxTransOrder wxTransOrder = this.getByOrderNo(orderNo);
if(wxTransOrder == null){
ConsumeResp resp = new ConsumeResp();
resp.setSuccess(false);
return resp;
}
String traceId = TraceIdManager.gen(TraceIdEnum.VIP);
boolean success = this.update(Wrappers.lambdaUpdate(WxTransOrder.class)
.eq(WxTransOrder::getId, wxTransOrder.getId())
.eq(WxTransOrder::getPayStatus, PayStatusEnum.READY_PAY.getCode())
.set(WxTransOrder::getPayStatus, PayStatusEnum.PAY.getCode())
.set(WxTransOrder::getTraceId, traceId)
.set(WxTransOrder::getReturnContent, JSON.toJSONString(params))
.set(WxTransOrder::getAppid,appId)
.set(WxTransOrder::getPlatformType, payTypeEnum.getCode()));
if(!success){
ConsumeResp resp = new ConsumeResp();
resp.setSuccess(false);
return resp;
}
userExtendService.incsWxTrans(wxTransOrder.getUserId(),wxTransOrder.getWxNum(), WxTransLogCateEnum.ORDER,wxTransOrder.getTraceId(),
"购买一次微信交换");
ConsumeResp resp = new ConsumeResp();
resp.setPrice(wxTransOrder.getWxPrice());
resp.setUserId(wxTransOrder.getUserId());
resp.setTraceId(traceId);
resp.setSuccess(true);
return resp;
}
@Override
public Page<WxTransOrderAdminVo> pageAdmin(PageQuery pageQuery, WxTransOrderAdminVo bo) {
return baseMapper.pageAdmin(pageQuery.build(), bo);