|
|
@@ -18,6 +18,7 @@ import com.github.microservice.pay.client.type.ledger.TransactionType;
|
|
|
import com.github.microservice.types.payment.PaymentChannelType;
|
|
|
import com.github.microservice.types.payment.PaymentType;
|
|
|
import com.wechat.pay.java.service.payments.model.Transaction;
|
|
|
+import com.zhongshu.card.client.model.mqtt.SendMessageModel;
|
|
|
import com.zhongshu.card.client.model.pay.PayAccountParam;
|
|
|
import com.zhongshu.card.client.model.pay.QueryRechargeParam;
|
|
|
import com.zhongshu.card.client.model.pay.RechargeOrderModel;
|
|
|
@@ -30,10 +31,12 @@ import com.zhongshu.card.server.core.domain.org.UserAccount;
|
|
|
import com.zhongshu.card.server.core.domain.pay.BalanceRechargeOrder;
|
|
|
import com.zhongshu.card.server.core.domain.pay.PayAccount;
|
|
|
import com.zhongshu.card.server.core.service.base.SuperService;
|
|
|
+import com.zhongshu.card.server.core.service.mqtt.MqttServiceImpl;
|
|
|
import com.zhongshu.card.server.core.service.paySetting.OrgPayAccountService;
|
|
|
import com.zhongshu.card.server.core.service.paySetting.ProjectPaySettingServiceImpl;
|
|
|
import com.zhongshu.card.server.core.util.BeanUtils;
|
|
|
import com.zhongshu.card.server.core.util.CommonUtil;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -46,6 +49,7 @@ import java.util.Map;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
@Service
|
|
|
+@Slf4j
|
|
|
public class BalancePayService extends SuperService {
|
|
|
|
|
|
@Autowired
|
|
|
@@ -69,13 +73,16 @@ public class BalancePayService extends SuperService {
|
|
|
@Autowired
|
|
|
GeneralLedgerService generalLedgerService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ MqttServiceImpl mqttService;
|
|
|
+
|
|
|
|
|
|
/**
|
|
|
* 下单并生成调用支付参数
|
|
|
*/
|
|
|
@Transactional
|
|
|
public Object recharge(RechargeParam param) {
|
|
|
- String projectOid = getCurrentOid();
|
|
|
+ String projectOid = getCurrentProjectOid();
|
|
|
String userId = getCurrentUserId();
|
|
|
String appId = getCurrentAppId();
|
|
|
|
|
|
@@ -109,12 +116,16 @@ public class BalancePayService extends SuperService {
|
|
|
balanceRechargeOrder.setOrderNo(orderNo);
|
|
|
balanceRechargeOrder.setTotal(new BigDecimal(param.getTotal()));
|
|
|
balanceRechargeOrder.setPrepay(prepay.getContent());
|
|
|
+ balanceRechargeOrder.setDescription(param.getDescription());
|
|
|
rechargeOrderDao.save(balanceRechargeOrder);
|
|
|
return ResultContent.buildContent(toModel(balanceRechargeOrder));
|
|
|
}
|
|
|
|
|
|
public void handleWeChatCallback(WeChatMiniAppPayRet ret) {
|
|
|
BalanceRechargeOrder rechargeOrder = rechargeOrderDao.findTopByOrderNo(ret.getOutTradeNo());
|
|
|
+ if (!rechargeOrder.getStatus().equals(RechargeOrderStatus.Wait)){
|
|
|
+ return;
|
|
|
+ }
|
|
|
switch (ret.getTradeState()) {
|
|
|
case "SUCCESS" -> {
|
|
|
rechargeOrder.setStatus(RechargeOrderStatus.Success);
|
|
|
@@ -148,6 +159,15 @@ public class BalancePayService extends SuperService {
|
|
|
if (transfer.getState().equals(ResultState.Success)) {
|
|
|
//处理订单状态
|
|
|
rechargeOrder.setStatus(RechargeOrderStatus.Success);
|
|
|
+ // 发送成功通知消息
|
|
|
+ SendMessageModel sendMessageModel = new SendMessageModel();
|
|
|
+ sendMessageModel.setMessage(JsonUtil.toJson(Map.of("status", RechargeOrderStatus.Success.name(), "orderNo", rechargeOrder.getOrderNo())));
|
|
|
+ String userId = rechargeOrder.getUserId();
|
|
|
+ String topic = String.format("/wechat/pay/%s", userId);
|
|
|
+ sendMessageModel.setTopic(topic);
|
|
|
+ sendMessageModel.setUserId(userId);
|
|
|
+ log.info("mq topic : {}", topic);
|
|
|
+ mqttService.sendMessage(sendMessageModel);
|
|
|
}
|
|
|
}
|
|
|
case "PAYERROR", "REFUND" -> {
|
|
|
@@ -206,7 +226,8 @@ public class BalancePayService extends SuperService {
|
|
|
Long monthStartTime = DateUtils.getMonthStartTime(param.getYear(), param.getMonth());
|
|
|
Long monthEndTime = DateUtils.getMonthEndTime(param.getYear(), param.getMonth());
|
|
|
List<BalanceRechargeOrder> balanceRechargeOrders = rechargeOrderDao.listByMonth(param.getProjectOid(), param.getUserId(), monthStartTime, monthEndTime);
|
|
|
- return ResultContent.buildContent(balanceRechargeOrders.stream().map(this::toModel).toList());
|
|
|
+ Long amountTotal = rechargeOrderDao.sumTotal(param.getProjectOid(), param.getUserId(), RechargeOrderStatus.Success, monthStartTime, monthEndTime);
|
|
|
+ return ResultContent.buildContent(Map.of("list", balanceRechargeOrders.stream().map(this::toModel).toList(), "amountTotal", amountTotal));
|
|
|
}
|
|
|
|
|
|
public ResultContent<Long> queryUserBalance(String projectOid, String userId) {
|
|
|
@@ -226,6 +247,64 @@ public class BalancePayService extends SuperService {
|
|
|
return ResultContent.build(ResultState.Fail);
|
|
|
}
|
|
|
|
|
|
+ public ResultContent queryInfo(String orderNo){
|
|
|
+ BalanceRechargeOrder rechargeOrder = rechargeOrderDao.findTopByOrderNo(orderNo);
|
|
|
+ return ResultContent.buildContent(toModel(rechargeOrder));
|
|
|
+ }
|
|
|
+
|
|
|
+ public Object close(String orderNo){
|
|
|
+ BalanceRechargeOrder rechargeOrder = rechargeOrderDao.findTopByOrderNo(orderNo);
|
|
|
+ if (rechargeOrder==null){
|
|
|
+ return com.github.microservice.net.ResultContent.buildFail("订单号不存在");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!rechargeOrder.getStatus().equals(RechargeOrderStatus.Wait)){
|
|
|
+ return com.github.microservice.net.ResultContent.buildFail("当前状态不可关闭");
|
|
|
+ }
|
|
|
+
|
|
|
+ PayProductParameter<Object> parameter = new PayProductParameter<>();
|
|
|
+ String accountName = orgPayAccountService.queryOgPayAccount(rechargeOrder.getProjectOid(), rechargeOrder.getPaymentType());
|
|
|
+ parameter.setAccountName(accountName);
|
|
|
+ parameter.setMeta(Map.of("orderNo", orderNo));
|
|
|
+ ResultContent<Object> closeRet = miniAppPayService.close(parameter);
|
|
|
+ if (!closeRet.getState().equals(ResultState.Success)){
|
|
|
+ return com.github.microservice.net.ResultContent.buildFail("关闭失败");
|
|
|
+ }
|
|
|
+ rechargeOrder.setStatus(RechargeOrderStatus.Cancel);
|
|
|
+ rechargeOrderDao.save(rechargeOrder);
|
|
|
+ return ResultContent.build(ResultState.Success);
|
|
|
+ }
|
|
|
+
|
|
|
+ public ResultContent refund(String projectOid, String oid, String userId, String orderNo, BigDecimal total, String remark){
|
|
|
+ //获取用户余额支付子账户
|
|
|
+ PayAccount userAccount = payAccountService.getUserChildren(projectOid, userId, PaymentChannelType.BalancePayment);
|
|
|
+ //获取机构待结算子账户
|
|
|
+ PayAccount orgAccount = payAccountService.getOrgChildren(projectOid, oid, PaymentChannelType.WaitSettle);
|
|
|
+ //支付:用户余额子账+ 机构待结算子账-
|
|
|
+ //构建转账参数
|
|
|
+ TransferTransactionsModel transferModel = new TransferTransactionsModel();
|
|
|
+ //构建出账账户
|
|
|
+ TransferTransactionsModel.GeneralLedgerTransaction sourceTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
|
|
|
+ sourceTransaction.setAmount(total.negate().longValue());
|
|
|
+ sourceTransaction.setTransactionType(TransactionType.Refund);
|
|
|
+ sourceTransaction.setTransactionStatus(TransactionStatus.Success);
|
|
|
+ sourceTransaction.setOrderNumber(orderNo);
|
|
|
+ sourceTransaction.setGeneralLedgerId(orgAccount.getLedgerId());
|
|
|
+ sourceTransaction.setRemark(remark);
|
|
|
+ transferModel.setSource(new TransferTransactionsModel.GeneralLedgerTransaction[]{sourceTransaction});
|
|
|
+ //构建入账账户
|
|
|
+ TransferTransactionsModel.GeneralLedgerTransaction destinationTransaction = new TransferTransactionsModel.GeneralLedgerTransaction();
|
|
|
+ destinationTransaction.setAmount(total.longValue());
|
|
|
+ destinationTransaction.setTransactionType(TransactionType.Refund);
|
|
|
+ destinationTransaction.setTransactionStatus(TransactionStatus.Success);
|
|
|
+ destinationTransaction.setOrderNumber(orderNo);
|
|
|
+ destinationTransaction.setGeneralLedgerId(userAccount.getLedgerId());
|
|
|
+ destinationTransaction.setRemark(remark);
|
|
|
+ transferModel.setDestinations(new TransferTransactionsModel.GeneralLedgerTransaction[]{destinationTransaction});
|
|
|
+ //调用支付中心转账接口
|
|
|
+ return transactionLogService.transfer(transferModel);
|
|
|
+ }
|
|
|
+
|
|
|
private RechargeOrderModel toModel(BalanceRechargeOrder balanceRechargeOrder) {
|
|
|
RechargeOrderModel rechargeOrderModel = new RechargeOrderModel();
|
|
|
if (balanceRechargeOrder != null) {
|