Commit 33b37714 by renyizhao

充值失败列表

parent 2e932f1f
package com.luhu.computility.module.member.controller.admin.recharge;
import com.luhu.computility.framework.common.pojo.CommonResult;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeManualReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
import com.luhu.computility.module.member.service.recharge.MemberRechargeService;
......@@ -33,4 +35,20 @@ public class MemberRechargeController {
return CommonResult.success(rechargeService.getRechargePage(reqVO));
}
@GetMapping("/pending-page")
@Operation(summary = "获取待充值记录分页")
@PreAuthorize("@ss.hasPermission('member:recharge:query')")
public CommonResult<PageResult<MemberRechargeRespVO>> getPendingRechargePage(@Validated PageParam pageParam) {
return CommonResult.success(rechargeService.getPendingRechargePage(pageParam));
}
@PostMapping("/manual")
@Operation(summary = "人工充值处理")
@PreAuthorize("@ss.hasPermission('member:recharge:manual')")
public CommonResult<Boolean> manualRecharge(@Validated @RequestBody MemberRechargeManualReqVO reqVO) {
Long operatorId = getLoginUserId();
boolean success = rechargeService.manualRecharge(reqVO.getRechargeId(), operatorId, reqVO.getRedemptionCode());
return CommonResult.success(success);
}
}
package com.luhu.computility.module.member.controller.admin.recharge.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Schema(description = "管理后台 - 人工充值请求 VO")
@Data
public class MemberRechargeManualReqVO {
@Schema(description = "充值记录ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "充值记录ID不能为空")
private Long rechargeId;
@Schema(description = "人工填写的兑换码", requiredMode = Schema.RequiredMode.REQUIRED, example = "ABC123")
@NotBlank(message = "兑换码不能为空")
private String redemptionCode;
}
......@@ -72,10 +72,19 @@ public class MemberRechargeRespVO {
@Schema(description = "兑换额度")
private Long redemptionQuota;
@Schema(description = "是否已兑换(0-未兑换,1-已兑换,-1-兑换失败)")
@Schema(description = "充值状态(0-无需充值,1-已充值,2-待充值,3-已人工充值)")
private Integer redeemed;
@Schema(description = "兑换状态名称")
private String redeemedName;
@Schema(description = "人工处理人ID")
private Long manualOperatorId;
@Schema(description = "人工处理人名称")
private String manualOperatorName;
@Schema(description = "人工处理时间")
private LocalDateTime manualProcessTime;
}
......@@ -82,8 +82,18 @@ public class MemberRechargeDO extends BaseDO {
private Long redemptionQuota;
/**
* 是否已兑换(0-未兑换,1-已兑换,-1-兑换失败
* 充值状态(0-无需充值,1-已充值,2-待充值,3-已人工充值
*/
private Integer redeemed;
/**
* 人工处理人ID
*/
private Long manualOperatorId;
/**
* 人工处理时间
*/
private LocalDateTime manualProcessTime;
}
......@@ -39,4 +39,10 @@ public interface MemberRechargeMapper extends BaseMapperX<MemberRechargeDO> {
@Update("UPDATE member_recharge SET callback_status = #{callbackStatus} WHERE id = #{id}")
int updateCallbackStatus(@Param("id") Long id, @Param("callbackStatus") Integer callbackStatus);
default PageResult<MemberRechargeDO> selectPendingPage(com.luhu.computility.framework.common.pojo.PageParam pageParam) {
return selectPage(pageParam, new LambdaQueryWrapperX<MemberRechargeDO>()
.eq(MemberRechargeDO::getRedeemed, 2)
.orderByDesc(MemberRechargeDO::getId));
}
}
package com.luhu.computility.module.member.service.recharge;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargePageReqVO;
import com.luhu.computility.module.member.controller.admin.recharge.vo.MemberRechargeRespVO;
......@@ -49,9 +50,23 @@ public interface MemberRechargeService {
PageResult<MemberRechargeRespVO> getRechargePage(MemberRechargePageReqVO reqVO);
/**
* 分页查询待充值记录(后台管理)
*/
PageResult<MemberRechargeRespVO> getPendingRechargePage(PageParam pageParam);
/**
* 执行充值兑换(支付成功后调用)
* @return 是否兑换成功
*/
boolean executeRecharge(Long rechargeId);
/**
* 人工充值处理
* @param rechargeId 充值记录ID
* @param operatorId 操作人ID
* @param redemptionCode 人工填写的兑换码
* @return 是否成功
*/
boolean manualRecharge(Long rechargeId, Long operatorId, String redemptionCode);
}
package com.luhu.computility.module.member.service.recharge;
import com.luhu.computility.framework.common.pojo.PageParam;
import com.luhu.computility.framework.common.pojo.PageResult;
import com.luhu.computility.module.member.config.MemberNewApiClient;
import com.luhu.computility.module.member.config.MemberNewApiProperties;
......@@ -49,9 +50,10 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
);
private static final Map<Integer, String> REDEEM_STATUS_NAMES = Map.of(
-1, "兑换失败",
0, "未兑换",
1, "已兑换"
0, "无需充值",
1, "已充值",
2, "待充值",
3, "已人工充值"
);
/**
......@@ -144,6 +146,32 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
return new PageResult<>(voList, pageResult.getTotal());
}
@Override
public PageResult<MemberRechargeRespVO> getPendingRechargePage(PageParam pageParam) {
PageResult<MemberRechargeDO> pageResult = rechargeMapper.selectPendingPage(pageParam);
// 批量获取所有用户信息
List<Long> userIds = pageResult.getList().stream()
.map(MemberRechargeDO::getUserId)
.distinct()
.collect(Collectors.toList());
java.util.Map<Long, MemberUserDO> userMap = new java.util.HashMap<>();
for (Long uid : userIds) {
if (uid != null) {
MemberUserDO user = memberUserService.getUser(uid);
if (user != null) {
userMap.put(uid, user);
}
}
}
final java.util.Map<Long, MemberUserDO> finalUserMap = userMap;
List<MemberRechargeRespVO> voList = pageResult.getList().stream()
.map(recharge -> convertToRespVO(recharge, finalUserMap.get(recharge.getUserId())))
.collect(Collectors.toList());
return new PageResult<>(voList, pageResult.getTotal());
}
/**
* 执行充值兑换
* 流程:支付成功后调用
......@@ -173,14 +201,14 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
MemberUserDO user = memberUserService.getUser(recharge.getUserId());
if (user == null) {
log.error("[executeRecharge] 用户不存在,userId={}", recharge.getUserId());
updateRedeemedStatus(rechargeId, -1, "用户不存在");
updateRedeemedStatus(rechargeId, 2, "用户不存在");
return false;
}
// 4. 检查用户是否有 new api 信息
if (user.getNewapiAccessToken() == null || user.getNewapiUserId() == null) {
log.error("[executeRecharge] 用户未绑定new api账号,userId={}", recharge.getUserId());
updateRedeemedStatus(rechargeId, -1, "用户未绑定new api账号");
updateRedeemedStatus(rechargeId, 2, "用户未绑定new api账号");
return false;
}
......@@ -195,7 +223,7 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
if (createResp.getSuccess() == null || !createResp.getSuccess()) {
log.error("[executeRecharge] 创建兑换码失败:{}", createResp.getMessage());
updateRedeemedStatus(rechargeId, -1, "创建兑换码失败: " + createResp.getMessage());
updateRedeemedStatus(rechargeId, 2, "创建兑换码失败: " + createResp.getMessage());
return false;
}
......@@ -203,7 +231,7 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
String redemptionCode = createResp.getData();
if (redemptionCode == null || redemptionCode.isEmpty()) {
log.error("[executeRecharge] 兑换码为空");
updateRedeemedStatus(rechargeId, -1, "兑换码为空");
updateRedeemedStatus(rechargeId, 2, "兑换码为空");
return false;
}
......@@ -218,14 +246,14 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
if (useResp.getSuccess() == null || !useResp.getSuccess()) {
log.error("[executeRecharge] 使用兑换码失败:{}", useResp.getMessage());
// 保存兑换码和失败状态
updateRedeemedWithCode(rechargeId, -1, redemptionCode, quota, "使用兑换码失败: " + useResp.getMessage());
updateRedeemedWithCode(rechargeId, 2, redemptionCode, quota, "使用兑换码失败: " + useResp.getMessage() + ";兑换码:" + redemptionCode);
return false;
}
log.info("[executeRecharge] 使用兑换码成功,增加额度:{}", useResp.getData());
// 9. 更新兑换状态
updateRedeemedWithCode(rechargeId, 1, redemptionCode, quota, null);
updateRedeemedWithCode(rechargeId, 1, redemptionCode, quota, "兑换成功;兑换码:" + redemptionCode);
log.info("[executeRecharge] 充值兑换完成,rechargeId={}, quota={}", rechargeId, quota);
return true;
......@@ -259,6 +287,47 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
rechargeMapper.updateById(updateDO);
}
/**
* 人工充值处理
* @param rechargeId 充值记录ID
* @param operatorId 操作人ID
* @param redemptionCode 人工填写的兑换码
* @return 是否成功
*/
public boolean manualRecharge(Long rechargeId, Long operatorId, String redemptionCode) {
log.info("[manualRecharge] 开始人工充值,rechargeId={}, operatorId={}, code={}", rechargeId, operatorId, redemptionCode);
// 1. 获取充值记录
MemberRechargeDO recharge = rechargeMapper.selectById(rechargeId);
if (recharge == null) {
log.error("[manualRecharge] 充值记录不存在,rechargeId={}", rechargeId);
return false;
}
// 2. 检查状态是否为待充值(2)
if (recharge.getRedeemed() == null || recharge.getRedeemed() != 2) {
log.error("[manualRecharge] 该充值记录不是待充值状态,rechargeId={}, redeemed={}", rechargeId, recharge.getRedeemed());
return false;
}
// 3. 构建新的备注
String oldRemark = recharge.getRemark() != null ? recharge.getRemark() : "";
String newRemark = oldRemark + ";已人工处理,兑换码:" + redemptionCode;
// 4. 更新记录
MemberRechargeDO updateDO = MemberRechargeDO.builder().build();
updateDO.setId(rechargeId);
updateDO.setRedeemed(3); // 已人工充值
updateDO.setRedemptionCode(redemptionCode);
updateDO.setManualOperatorId(operatorId);
updateDO.setManualProcessTime(LocalDateTime.now());
updateDO.setRemark(newRemark);
rechargeMapper.updateById(updateDO);
log.info("[manualRecharge] 人工充值完成,rechargeId={}", rechargeId);
return true;
}
private MemberRechargeRespVO convertToRespVO(MemberRechargeDO recharge, MemberUserDO user) {
MemberRechargeRespVO vo = new MemberRechargeRespVO();
vo.setUserId(recharge.getUserId());
......@@ -283,6 +352,8 @@ public class MemberRechargeServiceImpl implements MemberRechargeService {
}
vo.setRedemptionCode(recharge.getRedemptionCode());
vo.setRedemptionQuota(recharge.getRedemptionQuota());
vo.setManualOperatorId(recharge.getManualOperatorId());
vo.setManualProcessTime(recharge.getManualProcessTime());
return vo;
}
......
......@@ -213,7 +213,7 @@ wx:
computility:
new-api:
base-url: http://172.25.164.0:3000
admin-token: zpdZ5iRZmEnaENEPvZbwaaDwMSUl1JE=
admin-token: nfcJyVtYb6xtREHA2MyL4f4o5TDg/qU=
admin-user-id: 1
captcha:
enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
......
......@@ -165,12 +165,17 @@ wx: # 参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-sta
# 芋道配置项,设置当前项目所有自定义的配置
computility:
new-api:
base-url: http://10.0.0.207:3000
admin-token: /Orh0txmpKUG5bg11EbwdkKegbfA
admin-user-id: 1
captcha:
enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
pay:
order-notify-url: https://phslgld.hnluchuan.com/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
refund-notify-url: https://phslgld.hnluchuan.com/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
transfer-notify-url: https://phslgld.hnluchuan.com/admin-api/pay/notify/transfer # 支付渠道的【转账】回调地址
notify-url-member: https://phslgld.hnluchuan.com/admin-api/member/wpgj/notify # 会员充值模块WPGJ回调地址
wpgj-pay:
# WPGJ旺铺聚合支付配置
# organiz-no: 105549
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment