feat:消费机退款

This commit is contained in:
dzc committed 2026-02-14 11:01:46 +08:00
1 parent d469688ab3
commit 265bdbd713
8 files changed
+148 -16

No files matched your search

@@ -3,7 +3,7 @@ package com.bsd.pjcloud.hard.api.dto.xfj;
import lombok.Data;
@Data
public class XfjTransactionRefundDto {
public class XfjOrderRefundDto {
/**
* 消费订单号(最大30字符)
@@ -3,7 +3,7 @@ package com.bsd.pjcloud.hard.api.vo.xfj;
import lombok.Data;
@Data
public class XfjTransactionRefundVo extends XfjBaseVo {
public class XfjOrderRefundVo extends XfjBaseVo {
/**
* 人员姓名
@@ -109,7 +109,7 @@ public class HardAfterSaleController {
@PreAuthorize("@pms.hasPermission('hard_hardAfterSale_adminRefund')")
public R<Boolean> adminRefund(@RequestBody HardAdminRefundDto dto) {
PjcloudUser user = SecurityUtils.getUser();
return R.ok(hardAfterSaleService.adminRefund(dto, user));
return R.ok(hardAfterSaleService.adminRefund(dto, user.getId()));
}
@PostMapping(value = "/admin-reinforce-refund")
@@ -118,7 +118,7 @@ public class HardAfterSaleController {
@PreAuthorize("@pms.hasPermission('hard_hardAfterSale_adminRefund')")
public R<Boolean> adminReinforceRefund(@RequestBody HardAdminRefundReinforceDto dto) {
PjcloudUser user = SecurityUtils.getUser();
return R.ok(hardAfterSaleService.adminReinforceRefund(dto, user));
return R.ok(hardAfterSaleService.adminReinforceRefund(dto, user.getId()));
}
@GetMapping(value = "/history")
@@ -4,6 +4,7 @@ import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.hard.api.vo.xfj.XfjCountsVo;
import com.bsd.pjcloud.hard.api.vo.xfj.XfjServerTimeVo;
import com.bsd.pjcloud.hard.api.vo.xfj.XfjTransactionInquiryVo;
import com.bsd.pjcloud.hard.api.vo.xfj.XfjOrderRefundVo;
import com.bsd.pjcloud.hard.service.HardXfjService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -56,13 +57,20 @@ public class HardXfjController {
return hardXfjService.counts(httpEntity.getBody(), headers);
}
@Operation(summary = "终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细(或者退款接口)")
@Operation(summary = "终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细")
@PostMapping("/v1/transaction")
@Inner(value = false)
public Object transaction(HttpEntity<String> httpEntity, @RequestHeader Map<String, String> headers) {
return hardXfjService.transaction(httpEntity.getBody(), headers);
}
@Operation(summary = "订单退款接口")
@PostMapping("/v1/OrderRefund")
@Inner(value = false)
public XfjOrderRefundVo orderRefund(HttpEntity<String> httpEntity, @RequestHeader Map<String, String> headers) {
return hardXfjService.orderRefund(httpEntity.getBody(), headers);
}
@Operation(summary = "KeepAlive")
@PostMapping("/v1/KeepAlive")
@Inner(value = false)
@@ -68,15 +68,20 @@ public interface HardAfterSaleService extends IService<HardAfterSaleEntity> {
/**
* 后台退款
*/
Boolean adminRefund(HardAdminRefundDto dto, PjcloudUser user);
Boolean adminRefund(HardAdminRefundDto dto, Long userId);
/**
* 后台强化退款
*/
Boolean adminReinforceRefund(HardAdminRefundReinforceDto dto, PjcloudUser user);
Boolean adminReinforceRefund(HardAdminRefundReinforceDto dto, Long userId);
/**
* 消费机限时退款
*/
Boolean adTimeLintRefund(Long orderId, String reason, PjcloudUser user);
/**
* 涉笔退款
*/
Boolean adRefund(Long orderId, String reason);
}
@@ -28,10 +28,15 @@ public interface HardXfjService {
XfjCountsVo counts(String body, Map<String, String> headers);
/**
* 终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细(或者退款接口)
* 终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细
*/
Object transaction(String body, Map<String, String> headers);
/**
* 订单退款接口
*/
XfjOrderRefundVo orderRefund(String body, Map<String, String> headers);
/**
* KeepAlive
*/
@@ -489,7 +489,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
@Override
// @GlobalTransactional
@Transactional(rollbackFor = Exception.class)
public Boolean adminRefund(HardAdminRefundDto dto, PjcloudUser user) {
public Boolean adminRefund(HardAdminRefundDto dto, Long userId) {
// 校验订单是否可以退款
HardOrderVo order = validateOrderCanRefund(dto.getOrderId());
// 添加售后订单
@@ -501,7 +501,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
saveObj.setOrderId(order.getId());
saveObj.setRefundPrice(order.getPayPrice());
saveObj.setUserId(order.getUserId());
saveObj.setAuditUserId(user.getId());
saveObj.setAuditUserId(userId);
saveObj.setAuditTime(LocalDateTime.now());
saveObj.setAuditReason("后台退款");
baseMapper.insert(saveObj);
@@ -527,7 +527,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean adminReinforceRefund(HardAdminRefundReinforceDto dto, PjcloudUser user) {
public Boolean adminReinforceRefund(HardAdminRefundReinforceDto dto, Long userId) {
// 校验订单是否可以退款
HardOrderVo order = validateOrderCanRefund(dto.getOrderId());
@@ -567,7 +567,7 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
saveObj.setOrderId(order.getId());
saveObj.setRefundPrice(refundPrice);
saveObj.setUserId(order.getUserId());
saveObj.setAuditUserId(user.getId());
saveObj.setAuditUserId(userId);
saveObj.setAuditTime(LocalDateTime.now());
saveObj.setAuditReason("后台退款");
baseMapper.insert(saveObj);
@@ -658,6 +658,54 @@ public class HardAfterSaleServiceImpl extends ServiceImpl<HardAfterSaleMapper, H
return true;
}
@Override
public Boolean adRefund(Long orderId, String reason) {
HardOrderEntity orderDetail = hardOrderService.getById(orderId);
if (ObjectUtil.isEmpty(orderDetail)) {
throw new RuntimeException("订单不存在");
}
orderDetail = validateOrderCanRefund(orderDetail.getId());
if (ObjectUtil.isEmpty(orderDetail)) {
throw new RuntimeException("订单已退款");
}
try {
// 添加售后订单
String refundCode = "hard|ad_" + orderDetail.getId();
HardAfterSaleEntity saveObj = new HardAfterSaleEntity();
saveObj.setType(HardSaleTypeEnum.AFTER_SALE.getType());
saveObj.setStatus(HardSaleStatusEnum.COMPLETE.getStatus());
saveObj.setNo(refundCode);
saveObj.setWay("10");
saveObj.setOrderId(orderDetail.getId());
saveObj.setRefundPrice(orderDetail.getPayPrice());
saveObj.setUserId(orderDetail.getUserId());
saveObj.setAuditUserId(orderDetail.getUserId());
saveObj.setAuditTime(LocalDateTime.now());
saveObj.setApplyReason(reason);
saveObj.setAuditReason(reason);
saveObj.setApplyDescription(reason);
this.save(saveObj);
// 添加售后进度
HardAfterSaleLogEntity saveLogObj = HardAfterSaleLogEntity.builder()
.afterSaleId(saveObj.getId())
.userId(orderDetail.getUserId())
.operateType(HardAfterSaleOperateTypeEnum.ADMIN_REFUND.getType())
.beforeStatus(orderDetail.getOrderStatus())
.afterStatus(HardSaleStatusEnum.COMPLETE.getStatus())
.content(HardSaleStatusEnum.COMPLETE.getContent())
.build();
hardAfterSaleLogMapper.insert(saveLogObj);
// 执行退款
getSelf().refund(saveObj.getId(), "hard|ad");
} catch (Exception e) {
String msg = String.format("退款错误,%s", e.getMessage());
log.error(msg, e.getMessage());
// 抛出错误
throw new RuntimeException(e.getMessage());
}
return true;
}
private HardAfterSaleServiceImpl getSelf() {
return SpringUtil.getBean(getClass());
}
@@ -3,20 +3,20 @@ package com.bsd.pjcloud.hard.service.impl.xfj;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.admin.api.dto.UserInfo;
import com.bsd.pjcloud.admin.api.feign.RemoteUserService;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.hard.api.constant.HardTypeEnum;
import com.bsd.pjcloud.hard.api.constant.xfj.HardXfjTypeEnum;
import com.bsd.pjcloud.hard.api.dto.order.HardAdminRefundReinforceDto;
import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto;
import com.bsd.pjcloud.hard.api.dto.order.xfj.HardXfjFastCreateOrderDto;
import com.bsd.pjcloud.hard.api.dto.xfj.XfjQRCodeTransactionDto;
import com.bsd.pjcloud.hard.api.dto.xfj.XfjTransactionDto;
import com.bsd.pjcloud.hard.api.dto.xfj.XfjTransactionInquiryDto;
import com.bsd.pjcloud.hard.api.dto.xfj.XfjOrderRefundDto;
import com.bsd.pjcloud.hard.api.entity.manager.HardManagerEntity;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.entity.xfj.HardXfjLogEntity;
@@ -53,6 +53,7 @@ public class HardXfjServiceImpl implements HardXfjService {
private final HardXfjLogService hardXfjLogService;
private final HardOrderService hardOrderService;
private final HardOrderTotalService hardOrderTotalService;
private final HardAfterSaleService hardAfterSaleService;
private final HardOrderMapper hardOrderMapper;
@@ -269,11 +270,11 @@ public class HardXfjServiceImpl implements HardXfjService {
}
/**
* 终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细(或者退款接口)
* 终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细
*/
@Override
public Object transaction(String body, Map<String, String> headers) {
HardXfjLogEntity logger = initLogger(body, headers, "终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细(或者退款接口)");
HardXfjLogEntity logger = initLogger(body, headers, "终端设备待查状态,按上翻/下翻键向服务器请求,服务器返回一条消费明细");
XfjTransactionVo result = new XfjTransactionVo();
try {
HardManagerEntity hardEntity = checkSignAndReturnConfig(body, headers);
@@ -347,6 +348,71 @@ public class HardXfjServiceImpl implements HardXfjService {
return null;
}
/**
* 订单退款接口
*/
@Override
public XfjOrderRefundVo orderRefund(String body, Map<String, String> headers) {
HardXfjLogEntity logger = initLogger(body, headers, "订单退款接口");
XfjOrderRefundVo result = new XfjOrderRefundVo();
try {
HardManagerEntity hardEntity = checkSignAndReturnConfig(body, headers);
logger.setUniqueCode(hardEntity.getUniqueCode());
// 获取参数
XfjOrderRefundDto dto = JSONUtil.toBean(body, XfjOrderRefundDto.class);
// 退款
if (ObjectUtil.isEmpty(dto) || ObjectUtil.isEmpty(dto.getOrderSeralid()) || ObjectUtil.isEmpty(dto.getAmount())) {
result.setStatus(XfjBaseVo.STATUS_FAIL);
result.setMsg("参数错误");
return result;
}
// 查询订单
HardOrderEntity order = hardOrderService.getById(Long.valueOf(dto.getOrderSeralid()));
if (ObjectUtil.isEmpty(order)) {
result.setStatus(XfjBaseVo.STATUS_FAIL);
result.setMsg("参数错误");
return result;
}
// 执行退款
Boolean isRefund = hardAfterSaleService.adRefund(order.getId(), "退还消费");
if (!isRefund) {
result.setStatus(XfjBaseVo.STATUS_FAIL);
result.setMsg("退款失败");
return result;
}
// 查询用户
String username = "未知用户";
UserInfo user = remoteUserService.getInnerByUserId(order.getUserId()).getData();
if (ObjectUtil.isNotEmpty(user) && ObjectUtil.isNotEmpty(user.getSysUser().getName())) {
username = user.getSysUser().getName();
}
// 余额(分)
int balance = 0;
WalletManageVo wallet = walletService.getWalletById(order.getWalletId()).getData();
if (ObjectUtil.isNotEmpty(wallet) && ObjectUtil.isNotEmpty(wallet.getBalance())) {
balance = wallet.getBalance();
}
result.setName(username);
result.setCardNo("");
result.setMoney(fenToYuan(BigDecimal.valueOf(balance)));
result.setSubsidy("");
result.setTimes("0");
result.setIntegral("0");
result.setAmount(dto.getAmount());
result.setCmdType(11);
logger.setRes(JSONUtil.toJsonStr(result));
return result;
} catch (Exception e) {
logger.setError(e.getMessage());
e.printStackTrace();
log.error("|订单退款接口|意外的错误error:{}", e.getMessage());
} finally {
logger.setRes(JSONUtil.toJsonStr(result));
saveLogger(logger);
}
return null;
}
/**
* 付款码(二维码)支付接口
*/