This commit is contained in:
777
2025-11-29 17:37:28 +08:00
parent 7f9b7bc639
commit 52ea057ea1
15 changed files with 159 additions and 15 deletions

6
doc/20251128.sql Normal file
View File

@@ -0,0 +1,6 @@
alter table cai_account
add column `points` bigint(20) default 0 not null comment '积分';
ALTER TABLE cai_goods
ADD COLUMN `give_point` bigint(20) default 0 not null comment '充值赠送积分';
ALTER TABLE cai_recharge_order
ADD COLUMN `distribution` tinyint default 0 not null comment '是否參與分銷';

View File

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.cai.domain.Account;
import com.ruoyi.cai.dto.AddRechargeOrderAdminDto;
import com.ruoyi.cai.dto.admin.vo.AccountAdminVo;
import com.ruoyi.cai.manager.ConsumerManager;
import com.ruoyi.cai.service.AccountService;
import com.ruoyi.cai.service.RechargeOrderService;
import com.ruoyi.common.annotation.Log;
@@ -16,6 +17,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.core.validate.AddGroup;
import com.ruoyi.common.enums.BusinessType;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -58,12 +60,15 @@ public class AccountController extends BaseController {
return R.ok(accountService.getById(id));
}
@Autowired
private ConsumerManager consumerManager;
@SaCheckPermission("cai:account:add")
@Log(title = "用户账户调账", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping("/updateCoin")
public R<Void> add(@RequestBody AddRechargeOrderAdminDto bo) {
rechargeOrderService.updateAdminRechargeOrder(bo);
consumerManager.rechargeOrderSuccessAdmin(bo);
return R.ok();
}
}

View File

@@ -144,22 +144,22 @@ public class PayController {
@Operation(summary = "微信支付efps")
@Log(title = "微信支付efps", businessType = BusinessType.OTHER, isSaveDb = true)
@SaIgnore
public R<WechatJSAPIResponse> efpsWx(HttpServletRequest request, @RequestBody V14PayDTO payDTO){
public V14R<WechatJSAPIResponse> efpsWx(HttpServletRequest request, @RequestBody V14PayDTO payDTO){
String efpsToken = request.getHeader("Efps-Token");
if(StringUtils.isBlank(efpsToken)){
return R.fail(600,"支付失败,鉴权失败或者未找到订单");
return V14R.fail14(600,"支付失败,鉴权失败或者未找到订单");
}
V14Token v14Token = v14Manager.checkToken(efpsToken);
if(v14Token == null){
return R.fail(600,"支付失败,鉴权失败或者未找到订单");
return V14R.fail14(600,"支付失败,鉴权失败或者未找到订单");
}
PayTrdConfig payTrdConfig = payTrdConfigService.getById(v14Token.getPayTrdConfigId());
if(payTrdConfig == null){
return R.fail(600,"支付失败,未找到支付通道信息");
return V14R.fail14(600,"支付失败,未找到支付通道信息");
}
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(v14Token.getOrderNo(),true);
if(payOrderInfo == null){
return R.fail(600,"支付失败,未找到订单");
return V14R.fail14(600,"支付失败,未找到订单");
}
try {
V14ExtendMapDTO extendMap = JSON.parseObject(payTrdConfig.getExtendData(), V14ExtendMapDTO.class);
@@ -167,10 +167,12 @@ public class PayController {
payOrderInfo.setOpenId(openId);
} catch (IOException e) {
log.error("获取openid失败",e);
return R.fail(600,"微信登录失败");
return V14R.fail14(600,"微信登录失败");
}
WechatJSAPIResponse pay = v14Manager.pay(payOrderInfo, payTrdConfig);
return R.ok(pay);
V14R<WechatJSAPIResponse> result = V14R.ok14(pay);
result.setWxJsapiParam(pay.getWxJsapiParam());
return result;
}

View File

@@ -36,6 +36,10 @@ public class Account implements Serializable {
* 收益的彩币数量
*/
private Long incomeCoin;
/**
* 积分
*/
private Long points;
/**
* 充值总额
*/

View File

@@ -47,6 +47,8 @@ public class Goods implements Serializable {
private Long wxAmount;
@TableField(exist = false)
private Long aliAmountDiff;
@Schema(description = "赠送积分")
private Long givePoint;
/**
* 状态 0 可用 1不可用
*/

View File

@@ -83,6 +83,8 @@ public class RechargeOrder implements Serializable {
*/
private Boolean admin;
private Boolean distribution;
private Long adminId;
private String remark;

View File

@@ -19,6 +19,10 @@ public class AddRechargeOrderAdminDto {
* 调整的金额
*/
private Long rechargeCoin;
/**
* 是否参与分销
*/
private boolean distribution;
private String remark;
}

View File

@@ -0,0 +1,11 @@
package com.ruoyi.cai.dto.admin.vo.order;
import com.ruoyi.cai.domain.RechargeOrder;
import com.ruoyi.cai.dto.commom.consumer.RechargeConsumerResp;
import lombok.Data;
@Data
public class UpdateAdminRechargeOrderDTO {
private RechargeConsumerResp resp;
private RechargeOrder rechargeOrder;
}

View File

@@ -78,7 +78,7 @@ public enum SystemConfigEnum {
GREET_INTERVAL_MIN("30", "群打招呼的间隔时间(分钟)",SystemConfigGroupEnum.BUSINESS, new NumberSystemConfigCheck()),
ANCHOR_TOP_MIN("30", "小火箭置顶间隔时间(分钟)",SystemConfigGroupEnum.BUSINESS, new NumberSystemConfigCheck()),
OPEN_ALI_PAY("1", "是否开启四方支付宝支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_SOURCE_ALI_PAY("1", "是否开启原生支付宝支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_SOURCE_ALI_PAY("1", "是否开启原生支付宝支付(废弃)",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_WX_PAY("1", "是否开启微信支付",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
ALI_PAY_FIRST("1", "支付宝支付显示是否在前面",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),
OPEN_WITHDRAW("1", "是否开启提现功能",SystemConfigGroupEnum.BUSINESS,new BooleanSystemConfigCheck()),

View File

@@ -5,6 +5,8 @@ import com.ruoyi.cai.domain.Account;
import com.ruoyi.cai.domain.ConsumeLog;
import com.ruoyi.cai.domain.Gift;
import com.ruoyi.cai.domain.User;
import com.ruoyi.cai.dto.AddRechargeOrderAdminDto;
import com.ruoyi.cai.dto.admin.vo.order.UpdateAdminRechargeOrderDTO;
import com.ruoyi.cai.dto.app.query.GiveGiftReq;
import com.ruoyi.cai.dto.app.query.GiveGuardReq;
import com.ruoyi.cai.dto.commom.consumer.GiftConsumerResp;
@@ -158,6 +160,26 @@ public class ConsumerManager {
@Autowired
private RankAdminManager rankAdminManager;
public RechargeConsumerResp rechargeOrderSuccessAdmin(AddRechargeOrderAdminDto dto){
UpdateAdminRechargeOrderDTO result = rechargeOrderService.updateAdminRechargeOrder(dto);
RechargeConsumerResp resp = result.getResp();
try {
amqpHttpProducer.sendCalculateSales(resp.getConsumeLogId()+"");
}catch (Exception e){
log.error("RabbitMq 发送失败, 充值分销流程流转失败!",e);
}
try {
Account account = accountService.getByUserId(resp.getUserId());
if(account != null){
Long totalCoin = account.getCoin() + account.getIncomeCoin();
yunxinHttpService.rechargeCoinSendMessage(resp.getUserId(), resp.getRechargeCoin(),totalCoin);
}
}catch (Exception e){
log.error("充值成功通知失败!",e);
}
return resp;
}
public RechargeConsumerResp rechargeOrderSuccess(String tradeNo, Map<String,String> params, String appId, PayTypeEnum payTypeEnum){
RechargeConsumerResp resp = rechargeOrderService.orderSuccess(tradeNo,params,appId,payTypeEnum);
if(resp.isSuccess()){

View File

@@ -0,0 +1,29 @@
package com.ruoyi.cai.pay;
import com.ruoyi.cai.trdpay.dto.v14.wechatJSAPI.WxJsapiParam;
import com.ruoyi.common.core.domain.R;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class V14R<T> extends R<T> {
private WxJsapiParam wxJsapiParam;
public static <T> V14R<T> fail14(int code, String msg) {
return restResult14(null, code, msg);
}
private static <T> V14R<T> restResult14(T data, int code, String msg) {
V14R<T> r = new V14R<>();
r.setCode(code);
r.setData(data);
r.setMsg(msg);
return r;
}
public static <T> V14R<T> ok14(T data) {
return restResult14(data, SUCCESS, "操作成功");
}
}

View File

@@ -36,6 +36,8 @@ public interface AccountService extends IService<Account> {
void recharge(ConsumeLog consumeLog);
void rechargeAdminIgnoreAccount(ConsumeLog consumeLog);
Page<AccountAdminVo> pageAdmin(PageQuery pageQuery, AccountAdminVo bo);
boolean distribution(ConsumeLog consumeLog, Long userId, Long amount, AccountChangeCodeEnum accountChangeEnum);

View File

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.cai.domain.RechargeOrder;
import com.ruoyi.cai.dto.AddRechargeOrderAdminDto;
import com.ruoyi.cai.dto.admin.vo.order.UpdateAdminRechargeOrderDTO;
import com.ruoyi.cai.dto.app.query.order.AddRechargeOrderDto;
import com.ruoyi.cai.dto.ConsumeResp;
import com.ruoyi.cai.dto.admin.vo.RechargeOrderAdminVo;
@@ -29,7 +30,7 @@ public interface RechargeOrderService extends IService<RechargeOrder> {
RechargeConsumerResp orderSuccess(String orderNo, Map<String,String> params, String appId, PayTypeEnum payTypeEnum);
RechargeOrder updateAdminRechargeOrder(AddRechargeOrderAdminDto dto);
UpdateAdminRechargeOrderDTO updateAdminRechargeOrder(AddRechargeOrderAdminDto dto);
void setFastPay(String orderNo);
}

View File

@@ -232,6 +232,22 @@ public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> impl
consumeLogService.save(consumeLog);
}
@Transactional(rollbackFor = Exception.class)
@Override
public void rechargeAdminIgnoreAccount(ConsumeLog consumeLog){
log.info("开始管理員充值 consumeLog={}", JSON.toJSONString(consumeLog));
Long userId = consumeLog.getSourceUserId();
Long amount = consumeLog.getAmount();
User user = userService.getById(userId);
Account account = this.getByUserId(userId);
if(account == null || user == null){
throw new ServiceException("无效账号");
}
// 获取分销的比例和用户
consumeLogService.calculateInitFenxiao(consumeLog);
consumeLogService.save(consumeLog);
}
@Override
public Page<AccountAdminVo> pageAdmin(PageQuery pageQuery, AccountAdminVo bo) {

View File

@@ -7,14 +7,13 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.cai.domain.*;
import com.ruoyi.cai.dto.AddRechargeOrderAdminDto;
import com.ruoyi.cai.dto.admin.vo.order.UpdateAdminRechargeOrderDTO;
import com.ruoyi.cai.dto.app.query.order.AddRechargeOrderDto;
import com.ruoyi.cai.dto.ConsumeResp;
import com.ruoyi.cai.dto.admin.vo.RechargeOrderAdminVo;
import com.ruoyi.cai.dto.commom.consumer.RechargeConsumerResp;
import com.ruoyi.cai.enums.ConsumeLogType;
import com.ruoyi.cai.enums.account.AccountChangeCodeEnum;
import com.ruoyi.cai.enums.account.AccountTypeEnum;
import com.ruoyi.cai.enums.version.VersionPlatformEnum;
import com.ruoyi.cai.manager.IdManager;
import com.ruoyi.cai.mapper.AccountMapper;
import com.ruoyi.cai.mapper.RechargeOrderMapper;
@@ -142,7 +141,7 @@ public class RechargeOrderServiceImpl extends ServiceImpl<RechargeOrderMapper,Re
@Override
@Transactional(rollbackFor = Exception.class)
public RechargeOrder updateAdminRechargeOrder(AddRechargeOrderAdminDto dto){
public UpdateAdminRechargeOrderDTO updateAdminRechargeOrder(AddRechargeOrderAdminDto dto){
User user = userService.getByUserCode(dto.getUsercode());
if(user == null){
throw new ServiceException("用户不存在");
@@ -151,6 +150,14 @@ public class RechargeOrderServiceImpl extends ServiceImpl<RechargeOrderMapper,Re
if(accountTypeEnum == null){
throw new ServiceException("参数错误");
}
if(dto.isDistribution()){
if(dto.getRechargeCoin() <= 0){
throw new ServiceException("开启分销情况下,无法调整金额为负数");
}
if(accountTypeEnum != AccountTypeEnum.COIN){
throw new ServiceException("只有调整余额才能开启分销");
}
}
Long userId = user.getId();
Long traceId = IdManager.nextId();
RechargeOrder order = new RechargeOrder();
@@ -167,7 +174,16 @@ public class RechargeOrderServiceImpl extends ServiceImpl<RechargeOrderMapper,Re
order.setOperateIp(ServletUtils.getClientIP());
order.setAdmin(true);
order.setAdminId(LoginHelper.getUserId());
order.setRemark(dto.getRemark());
String remark = dto.getRemark();
if(dto.isDistribution()){
if(remark == null){
remark = "[参与分销]";
}else{
remark = "[参与分销]"+remark;
}
}
order.setRemark(remark);
order.setDistribution(dto.isDistribution());
order.setTraceId(traceId);
this.save(order);
Account account = accountService.getByUserId(userId);
@@ -200,8 +216,30 @@ public class RechargeOrderServiceImpl extends ServiceImpl<RechargeOrderMapper,Re
accountChangeLogService.saveLogAdmin(user.getId(),user.getUsercode(), AccountChangeCodeEnum.SYSTEM_INCOME_COIN_DECR,dto.getRechargeCoin(),traceId);
}
}
return order;
UpdateAdminRechargeOrderDTO result = new UpdateAdminRechargeOrderDTO();
result.setRechargeOrder(order);
// 分销逻辑
if(dto.isDistribution()){
ConsumeLog consumeLog = new ConsumeLog();
consumeLog.init(user,null);
consumeLog.setTraceId(traceId);
consumeLog.setType(ConsumeLogType.RECHARGE.getCode());
consumeLog.setAmount(order.getRechargeCoin());
accountService.rechargeAdminIgnoreAccount(consumeLog);
RechargeConsumerResp resp = new RechargeConsumerResp();
resp.setSuccess(true);
resp.setConsumeLogId(consumeLog.getId());
resp.setUserId(user.getId());
resp.setUser(user);
resp.setTraceId(traceId);
resp.setPrice(order.getPrice());
resp.setRechargeCoin(order.getRechargeCoin());
resp.setOrderNo(order.getOrderNo());
result.setResp(resp);
}
return result;
}
@Override
public void setFastPay(String orderNo) {