钱包导出时间不对、第三方扣款

This commit is contained in:
dzc committed 2025-03-05 21:12:39 +08:00
1 parent 8e6d2c6f01
commit 31fe4d3bb4
24 files changed
+369 -121

No files matched your search

@@ -17,6 +17,7 @@ public enum HardOrderTypeEnum {
RESERVE("2", "线上订餐"),
FOREIGN_TICKET("3", "外来人员"),
STRIDE_DEPT("4", "跨单位"),
ZY("5", "正元公务餐"),
;
private final String type;
private final String description;
@@ -0,0 +1,25 @@
package com.bsd.pjcloud.hard.api.constant.third;
import cn.hutool.core.util.ObjectUtil;
import com.bsd.pjcloud.hard.api.constant.HardPrintStatusEnum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
@AllArgsConstructor
@Getter
public enum HardCallbackPayStatus {
SUCCESS("0", "省平台认为流水交易完成,扣费成功"),
REPETITION("0001", "省平台则会每天定时重新发起扣费流程"),
ERROR("0002", "省平台则不再扣费,认为是坏账"),
NOT_SUFFICIENT_FUNDS("0003", "余额不足返回,省平台将会禁止该账户后续交易权限"),
;
private final String type;
private final String description;
public static HardCallbackPayStatus valueOfByType(String type) {
if (ObjectUtil.isEmpty(type)) return null;
return Arrays.stream(values()).filter(v -> ObjectUtil.equals(type, v.getType())).findFirst().get();
}
}
@@ -0,0 +1,18 @@
package com.bsd.pjcloud.hard.api.dto.third;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class HardCallbackPayDto {
private Long userId;
private Integer payPrice;
private LocalDateTime payTime;
private String orderNo;
}
@@ -0,0 +1,7 @@
package com.bsd.pjcloud.hard.api.dto.third;
import lombok.Data;
@Data
public class HardCallbackRefundDto {
}
@@ -1,19 +1,24 @@
package com.bsd.pjcloud.hard.api.feign;
import com.bsd.pjcloud.common.core.constant.ServiceNameConstants;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.feign.annotation.NoToken;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto;
import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(contextId = "remoteHardThirdSelfZyService", value = ServiceNameConstants.HARDWARE_SERVICE)
public interface RemoteHardThirdSelfZyService {
@NoToken
@PostMapping("/hard-third-callback/pay")
void pay();
R<HardCallbackPayVo> pay(@RequestBody HardCallbackPayDto dto);
@NoToken
@PostMapping("/hard-third-callback/refund")
void refund();
String refund(@RequestBody HardCallbackRefundDto dto);
}
@@ -0,0 +1,20 @@
package com.bsd.pjcloud.hard.api.vo.third;
import com.bsd.pjcloud.hard.api.constant.third.HardCallbackPayStatus;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class HardCallbackPayVo {
private Long orderId;
private HardCallbackPayStatus code;
private LocalDateTime payTime;
private Long userId;
private String username;
}
@@ -166,7 +166,7 @@ public class HardOrderController {
if (ObjectUtil.isNotEmpty(dto.getPayTimeList())) {
map.put("timeSpan", " 到 ");
map.put("startTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN));
map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN));
map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN));
}
if (ObjectUtil.isNotEmpty(excelList)) {
BigDecimal totalPriceSum = BigDecimal.ZERO;
@@ -85,7 +85,7 @@ public class HardOrderTotalController {
if (ObjectUtil.isNotEmpty(dto.getPayTimeList())) {
map.put("timeSpan", " 到 ");
map.put("startTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN));
map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN));
map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN));
}
if (ObjectUtil.isNotEmpty(list)) {
BigDecimal priceTotal = BigDecimal.ZERO;
@@ -128,7 +128,7 @@ public class HardOrderTotalController {
if (ObjectUtil.isNotEmpty(dto.getPayTimeList())) {
map.put("timeSpan", " 到 ");
map.put("startTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN));
map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN));
map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN));
}
if (ObjectUtil.isNotEmpty(list)) {
BigDecimal priceTotal = BigDecimal.ZERO;
@@ -1,22 +1,17 @@
package com.bsd.pjcloud.hard.controller.third;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.idempotent.annotation.Idempotent;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.annotation.Inner;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto;
import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo;
import com.bsd.pjcloud.hard.service.HardThirdSelfZyService;
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
import org.springframework.web.bind.annotation.*;
@RestController
@RequiredArgsConstructor
@@ -29,20 +24,18 @@ public class HardThirdSelfZyController {
/* ************************************* start 远程调用 start ************************************* */
@Inner(value = false)
@PostMapping("/pay")
@SysLog("正元支付")
@Operation(summary = "正元支付")
public void pay() {
hardThirdSelfZyService.pay();
public R<HardCallbackPayVo> pay(@RequestBody HardCallbackPayDto dto) {
return R.ok(hardThirdSelfZyService.pay(dto));
}
@Inner(value = false)
@PostMapping("/refund")
@SysLog("正元退款")
@Operation(summary = "正元退款")
public void refund() {
hardThirdSelfZyService.refund();
public String refund(@RequestBody HardCallbackRefundDto dto) {
return hardThirdSelfZyService.refund(dto);
}
/* ************************************* end 远程调用 end ************************************* */
@@ -1,16 +1,19 @@
package com.bsd.pjcloud.hard.service;
import java.util.Map;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto;
import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo;
public interface HardThirdSelfZyService {
/**
* 正元支付
*/
void pay();
HardCallbackPayVo pay(HardCallbackPayDto dto);
/**
* 正元退款
*/
void refund();
String refund(HardCallbackRefundDto dto);
}
@@ -1,11 +1,28 @@
package com.bsd.pjcloud.hard.service.impl.hard;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum;
import com.bsd.pjcloud.hard.api.constant.order.HardOrderTypeEnum;
import com.bsd.pjcloud.hard.api.constant.third.HardCallbackPayStatus;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackPayDto;
import com.bsd.pjcloud.hard.api.dto.third.HardCallbackRefundDto;
import com.bsd.pjcloud.hard.api.entity.order.HardOrderEntity;
import com.bsd.pjcloud.hard.api.vo.third.HardCallbackPayVo;
import com.bsd.pjcloud.hard.service.HardOrderService;
import com.bsd.pjcloud.hard.service.HardThirdSelfZyService;
import com.bsd.pjcloud.wallet.api.constant.WalletTypeEnum;
import com.bsd.pjcloud.wallet.api.entity.WalletManageEntity;
import com.bsd.pjcloud.wallet.api.feign.RemoteWalletService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.time.LocalDateTime;
@Validated
@Slf4j
@@ -13,14 +30,70 @@ import org.springframework.validation.annotation.Validated;
@Service
public class HardThirdSelfZyServiceImpl implements HardThirdSelfZyService {
@Override
public void pay() {
private static final String TAG = "硬件正元回调";
private final RemoteWalletService remoteWalletService;
private final HardOrderService hardOrderService;
/**
* 正元支付
*/
@Override
@Transactional(rollbackFor = Exception.class)
public HardCallbackPayVo pay(HardCallbackPayDto dto) {
// 钱包
try {
WalletManageEntity wallet = remoteWalletService.getWallet(dto.getUserId(), WalletTypeEnum.EAT).getData();
if (ObjectUtil.isEmpty(wallet)) throw new RuntimeException("用户钱包不存在");
Integer balance = wallet.getBalance();
int totalPrice = dto.getPayPrice();
if (balance < totalPrice) {
HardCallbackPayVo res = new HardCallbackPayVo();
res.setCode(HardCallbackPayStatus.NOT_SUFFICIENT_FUNDS);
return res;
}
String subject = "正元公务餐扣款";
// 添加硬件订单
HardOrderEntity orderObj = HardOrderEntity.builder()
.userId(dto.getUserId())
.parentCarId(null)
.sysType(null)
.orderStatus(HardOrderStatusEnum.PAY.getType())
.merchantId(null)
.orderType(HardOrderTypeEnum.ZY.getType())
.payType(HardOrderTypeEnum.RESERVE.getType())
.orderSourceTypeId(null)
.totalPrice(totalPrice)
.extraPrice(0)
.payPrice(totalPrice)
.isOfflineOrder(YesNoEnum.NO.getCode())
.productDesc(subject)
.walletId(wallet.getId())
.build();
boolean isCreateOrder = hardOrderService.save(orderObj);
if (!isCreateOrder) throw new RuntimeException("创建订单失败");
hardOrderService.fastReduceBalance(orderObj);
HardCallbackPayVo result = new HardCallbackPayVo();
result.setCode(HardCallbackPayStatus.SUCCESS);
result.setOrderId(orderObj.getId());
result.setPayTime(LocalDateTime.now());
return result;
} catch (Exception e) {
log.error("|{}|意外得错误dto:|{}|", TAG, JSONUtil.toJsonStr(dto), e);
HardCallbackPayVo result = new HardCallbackPayVo();
result.setCode(HardCallbackPayStatus.REPETITION);
return result;
}
}
/**
* 正元退款
*/
@Override
public void refund() {
@Transactional(rollbackFor = Exception.class)
public String refund(HardCallbackRefundDto dto) {
return "-1";
}
}