feat:消费机退款
This commit is contained in:
1 parent
d469688ab3
commit
265bdbd713
8 files changed
+148
-16
No files matched your search
+1
-1
@@ -3,7 +3,7 @@ package com.bsd.pjcloud.hard.api.dto.xfj;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class XfjTransactionRefundDto {
|
||||
public class XfjOrderRefundDto {
|
||||
|
||||
/**
|
||||
* 消费订单号(最大30字符)
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
/**
|
||||
* 人员姓名
|
||||
+2
-2
@@ -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")
|
||||
|
||||
+9
-1
@@ -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)
|
||||
|
||||
+7
-2
@@ -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);
|
||||
}
|
||||
+6
-1
@@ -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
|
||||
*/
|
||||
|
||||
+52
-4
@@ -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());
|
||||
}
|
||||
|
||||
+70
-4
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 付款码(二维码)支付接口
|
||||
*/
|
||||
|
||||
Reference in new issue
Block a user