From cb534520b3380a1701180ea6b303635a71b04987 Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Sat, 5 Aug 2023 16:15:20 +0800 Subject: [PATCH] update --- .../jsowell/api/uniapp/TempController.java | 2 +- .../response/BalancePaymentResponse.java | 55 ++++++++ .../adapay/service/AdapayMemberService.java | 17 ++- .../impl/OrderBasicInfoServiceImpl.java | 133 +++++++++--------- .../pile/vo/base/SplitSettleAmountVO.java | 21 +++ 5 files changed, 155 insertions(+), 73 deletions(-) create mode 100644 jsowell-pile/src/main/java/com/jsowell/adapay/response/BalancePaymentResponse.java create mode 100644 jsowell-pile/src/main/java/com/jsowell/pile/vo/base/SplitSettleAmountVO.java diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java index 00e8e61ae..ec4980d65 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/TempController.java @@ -225,7 +225,7 @@ public class TempController extends BaseController { public RestApiResponse testCreateBalancePayment(@RequestBody BalancePaymentRequestDTO dto) { RestApiResponse response = null; try { - adapayMemberService.createBalancePaymentRequest(dto.getOutMemberId(), dto.getInMemberId(), dto.getTransAmt()); + adapayMemberService.createBalancePaymentRequest(dto.getOutMemberId(), dto.getInMemberId(), dto.getTransAmt(), "测试余额支付", "测试余额支付描述"); response = new RestApiResponse<>(); } catch (BusinessException e) { logger.warn("测试余额支付接口warn", e); diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/response/BalancePaymentResponse.java b/jsowell-pile/src/main/java/com/jsowell/adapay/response/BalancePaymentResponse.java new file mode 100644 index 000000000..42f5e2409 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/response/BalancePaymentResponse.java @@ -0,0 +1,55 @@ +package com.jsowell.adapay.response; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class BalancePaymentResponse { + /** + * 当前交易结果状态,参见 状态 说明 + */ + private String status; + + private String error_code; + private String error_msg; + private String error_type; + + /** + * 商户客户号 + */ + private String mer_cust_id; + + /** + * + * 应用ID + */ + private String app_id; + + /** + * 订单号 + */ + private String order_no; + + /** + * 交易金额 + */ + private String trans_amt; + + /** + * 手续费 + */ + private String fee_amt; + + /** + * 余额支付流水号 + */ + private String balance_seq_id; + + /** + * 支付模式 + */ + private String pay_mode; +} diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java index 985dbe737..e7aa319dc 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java @@ -9,6 +9,7 @@ import com.huifu.adapay.model.*; import com.jsowell.adapay.dto.SettleAccountDTO; import com.jsowell.adapay.dto.UpdateAccountConfigDTO; import com.jsowell.adapay.dto.WithdrawDTO; +import com.jsowell.adapay.response.BalancePaymentResponse; import com.jsowell.adapay.response.QueryCorpMemberResponse; import com.jsowell.adapay.response.QueryMemberResponse; import com.jsowell.adapay.vo.AdapayAccountBalanceVO; @@ -17,6 +18,7 @@ import com.jsowell.adapay.vo.AdapayMemberInfoVO; import com.jsowell.adapay.vo.AdapaySettleAccountVO; import com.jsowell.common.constant.Constants; import com.jsowell.common.enums.DelFlagEnum; +import com.jsowell.common.enums.adapay.AdapayStatusEnum; import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.AdapayUtil; @@ -453,7 +455,7 @@ public class AdapayMemberService { throw new BusinessException(ReturnCodeEnum.CODE_ADAPAY_MEMBER_IS_NULL_ERROR); } - // 提现手续费 每笔固定10元 + // 提现手续费 每笔固定5元 BigDecimal feeAmt = new BigDecimal("5"); // 实际提现到账金额 @@ -484,7 +486,7 @@ public class AdapayMemberService { String id = (String) settleCount.get("id"); // 发起支付手续费请求 inMemberId为0表示本商户 - createBalancePaymentRequest(adapayAccountBalanceVO.getAdapayMemberId(), Constants.ZERO, feeAmt.toString()); + createBalancePaymentRequest(adapayAccountBalanceVO.getAdapayMemberId(), Constants.ZERO, feeAmt.toString(), "提现手续费", "提现单号:" + id); // 保存提现记录 ClearingWithdrawInfo record = new ClearingWithdrawInfo(); @@ -538,7 +540,7 @@ public class AdapayMemberService { log.info("更新企业账户param:{}", memberParams); Map member = AdapayCommon.requestAdapayFile(memberParams, file); log.info("更新企业账户result:{}", JSON.toJSONString(member)); - if (StringUtils.equals((String) member.get("status"), "failed")) { + if (AdapayStatusEnum.FAILED.getValue().equals((String) member.get("status"))) { throw new BusinessException("", (String) member.get("error_msg")); } return null; @@ -549,8 +551,10 @@ public class AdapayMemberService { * @param outMemberId 出账用户的member_id, 若为商户本身时,请传入0 * @param inMemberId 入账用户的member_id, 若为商户本身时,请传入0 * @param transAmt 交易金额, 必须大于0,保留两位小数点,如0.10、100.05等 + * @param title 标题 + * @param desc 描述信息 */ - public void createBalancePaymentRequest(String outMemberId, String inMemberId, String transAmt) throws BaseAdaPayException { + public BalancePaymentResponse createBalancePaymentRequest(String outMemberId, String inMemberId, String transAmt, String title, String desc) throws BaseAdaPayException { Map balanceParam = Maps.newHashMap(); balanceParam.put("app_id", ADAPAY_APP_ID); balanceParam.put("adapay_func_code", "settle_accounts.balancePay"); @@ -558,10 +562,11 @@ public class AdapayMemberService { balanceParam.put("out_member_id", outMemberId); balanceParam.put("in_member_id", inMemberId); balanceParam.put("trans_amt", AdapayUtil.formatAmount(transAmt)); - balanceParam.put("goods_title", "测试余额支付"); - balanceParam.put("goods_desc", "该商品信息用于测试余额支付"); + balanceParam.put("goods_title", title); + balanceParam.put("goods_desc", desc); Map paymentResult = AdapayCommon.requestAdapay(balanceParam); log.info("创建余额支付param:{}, result:{}", JSON.toJSONString(balanceParam), JSON.toJSONString(paymentResult)); + return JSONObject.parseObject(JSON.toJSONString(paymentResult), BalancePaymentResponse.class); } /** diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index 158dd4b6c..e26cf1b1f 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -16,7 +16,9 @@ import com.huifu.adapay.model.PaymentReverse; import com.huifu.adapay.model.Refund; import com.jsowell.adapay.common.CreateAdaPaymentParam; import com.jsowell.adapay.common.DivMember; +import com.jsowell.adapay.response.BalancePaymentResponse; import com.jsowell.adapay.response.PaymentConfirmResponse; +import com.jsowell.adapay.service.AdapayMemberService; import com.jsowell.adapay.vo.OrderSettleResult; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; @@ -41,10 +43,8 @@ import com.jsowell.pile.service.*; import com.jsowell.pile.transaction.dto.ClearingBillTransactionDTO; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; import com.jsowell.pile.transaction.service.TransactionService; -import com.jsowell.pile.vo.base.MerchantOrderInfoVO; -import com.jsowell.pile.vo.base.OrderAmountDetailVO; -import com.jsowell.pile.vo.base.OrderPeriodAmountVO; import com.jsowell.pile.vo.base.PileInfoVO; +import com.jsowell.pile.vo.base.*; import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO; import com.jsowell.pile.vo.uniapp.*; import com.jsowell.pile.vo.web.*; @@ -167,6 +167,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { @Autowired private IPileStationWhitelistService pileStationWhitelistService; + @Autowired + private AdapayMemberService adapayMemberService; + /** * 条件查询订单基本信息 * @@ -928,11 +931,15 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 执行分账 for (OrderBasicInfo orderBasicInfo : orderBasicInfos) { try { - OrderSettleResult orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount); + OrderSettleResult orderSettleResult = null; + if (PayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) { + // 余额支付的订单 只用余额支付转账 + orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount); + } else { + // 在线支付,进行支付确认分账 + orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount); + } if (orderSettleResult != null && AdapayStatusEnum.SUCCEEDED.getValue().equals(orderSettleResult.getStatus())) { - JSONObject jsonObject = JSON.parseObject(orderSettleResult.getDescription()); - String orderCode = (String) jsonObject.get("orderCode"); - // 应收金额 = 订单结算金额汇总 receivableAmount = receivableAmount.add(orderBasicInfo.getSettleAmount()); // 应清分金额 = 订单产生的电费+服务费实际消费 汇总 @@ -948,7 +955,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { ClearingBillDetail clearingBillDetail = ClearingBillDetail.builder() .clearingBillCode(clearingBillCode) - .orderCode(orderCode) + .orderCode(orderBasicInfo.getOrderCode()) .createTime(DateUtils.getNowDate()) .delFlag(DelFlagEnum.NORMAL.getValue()) .build(); @@ -1014,28 +1021,6 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { continue; } - // 清分账单信息 - // ClearingBillInfo clearingBillInfo = new ClearingBillInfo(); - // clearingBillInfo.setBillStatus("1"); - // String clearingBillCode = "CLE" + IdUtils.getOrderCode(); - // clearingBillInfo.setClearingBillCode(clearingBillCode); - // clearingBillInfo.setClearingTime(DateUtils.getNowDate()); - // clearingBillInfo.setMerchantId(merchantId); - // clearingBillInfo.setOrderSource("1"); - - // 应收金额 - // BigDecimal receivableAmount = BigDecimal.ZERO; - // // 应清分金额 - // BigDecimal shouldClearingAmount = BigDecimal.ZERO; - // // 实际清分金额 - // BigDecimal actualClearingAmount = BigDecimal.ZERO; - // // 手续费金额 - // BigDecimal feeAmount = BigDecimal.ZERO; - // // 可提现金额 - // BigDecimal withdrawableAmount = BigDecimal.ZERO; - - // 清分账单详情列表 - // List billDetailList = Lists.newArrayList(); // 执行分账 for (OrderBasicInfo orderBasicInfo : orderBasicInfos) { try { @@ -1044,49 +1029,47 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { JSONObject jsonObject = JSON.parseObject(orderSettleResult.getDescription()); String orderCode = (String) jsonObject.get("orderCode"); - // 应收金额 = 订单结算金额汇总 - // receivableAmount = receivableAmount.add(orderBasicInfo.getSettleAmount()); - // // 应清分金额 = 订单产生的电费+服务费实际消费 汇总 - // shouldClearingAmount = shouldClearingAmount.add(orderBasicInfo.getSettleAmount()); - // // 实际清分金额 = 汇付清分接口返回的清分金额 - // actualClearingAmount = actualClearingAmount.add(new BigDecimal(orderSettleResult.getConfirm_amt())); - // // 手续费金额 = 汇付清分接口返回的手续费金额 - // feeAmount = feeAmount.add(new BigDecimal(orderSettleResult.getFee_amt())); - // // 可提现金额 = 实际清分金额 - 手续费金额 - // withdrawableAmount = withdrawableAmount - // .add(new BigDecimal(orderSettleResult.getConfirm_amt())) - // .subtract(new BigDecimal(orderSettleResult.getFee_amt())); - - // ClearingBillDetail clearingBillDetail = ClearingBillDetail.builder() - // .clearingBillCode(clearingBillCode) - // .orderCode(orderCode) - // .createTime(DateUtils.getNowDate()) - // .delFlag(DelFlagEnum.NORMAL.getValue()) - // .build(); - // billDetailList.add(clearingBillDetail); } } catch (Exception e) { logger.error("订单交易确认失败:{}", orderBasicInfo.getOrderCode(), e); } } - // clearingBillInfo.setReceivableAmount(receivableAmount); - // clearingBillInfo.setShouldClearingAmount(shouldClearingAmount); - // clearingBillInfo.setFeeAmount(feeAmount); - // clearingBillInfo.setWithdrawableAmount(withdrawableAmount); - // clearingBillInfo.setActualClearingAmount(actualClearingAmount); - // clearingBillInfo.setCreateTime(DateUtils.getNowDate()); - // clearingBillInfo.setDelFlag(DelFlagEnum.NORMAL.getValue()); - - // 保存清分账单 - // ClearingBillTransactionDTO dto = new ClearingBillTransactionDTO(); - // dto.setClearingBillInfo(clearingBillInfo); - // dto.setBillDetailList(billDetailList); - // transactionService.createClearingBill(dto); } logger.info("运营商:{}, 交易日期:{}, 进行分账处理end", merchantId, tradeDate); } + /** + * 余额支付订单,使用余额支付转账 + * @param orderBasicInfo + * @param adapayMemberAccount + * @return + */ + public OrderSettleResult doBalancePayment(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount) throws BaseAdaPayException { + // 计算应该支付金额,和手续费 + SplitSettleAmountVO splitSettleAmountVO = splitSettleAmount(orderBasicInfo.getSettleAmount()); + BigDecimal feeAmount = splitSettleAmountVO.getFeeAmount(); + BigDecimal tradeAmount = splitSettleAmountVO.getTradeAmount(); + + String orderCode = orderBasicInfo.getOrderCode(); + // 使用汇付余额支付功能 + String outMemberId = Constants.ZERO; // 若为商户本身时,请传入0 + String inMemberId = adapayMemberAccount.getAdapayMemberId(); + String transAmt = AdapayUtil.formatAmount(tradeAmount); + String title = "订单结算入账"; + String desc = "订单号:" + orderCode + ", 结算金额"; + BalancePaymentResponse balancePaymentRequest = adapayMemberService.createBalancePaymentRequest(outMemberId, inMemberId, transAmt, title, desc); + + OrderSettleResult result = new OrderSettleResult(); + result.setConfirm_amt(balancePaymentRequest.getTrans_amt()); + result.setStatus(balancePaymentRequest.getStatus()); + result.setFee_amt(feeAmount.toString()); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("orderCode", orderCode); + result.setDescription(jsonObject.toJSONString()); + return result; + } + /** * 延迟交易订单 交易确认 * @param orderBasicInfo 订单 @@ -2361,9 +2344,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { settleOrderReport.setTradeDate(tradeDate); settleOrderReport.setOrderCodes(Joiner.on(",").join(orderCodeList)); // 计算手续费 = 结算金额 * 0.55% - BigDecimal tradeFee = totalSettleAmount.multiply(new BigDecimal(Constants.FEE_RATES)); - settleOrderReport.setTradeFee(tradeFee); - settleOrderReport.setTradeAmount(totalSettleAmount.subtract(tradeFee)); + SplitSettleAmountVO splitSettleAmountVO = splitSettleAmount(totalSettleAmount); + settleOrderReport.setTradeFee(splitSettleAmountVO.getFeeAmount()); + settleOrderReport.setTradeAmount(splitSettleAmountVO.getTradeAmount()); // 根据站点id和交易日期查询 SettleOrderReport selectResult = settleOrderReportService.selectByStationIdAndDate(stationId, tradeDate); if (selectResult != null) { @@ -2373,6 +2356,24 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { settleOrderReportService.insertOrUpdate(settleOrderReport); } + /** + * 通过结算金额,计算客户到账金额和手续费 + * @param settleAmount 需要拆分的结算金额 + * @return + */ + private SplitSettleAmountVO splitSettleAmount(BigDecimal settleAmount) { + SplitSettleAmountVO resultVO = new SplitSettleAmountVO(); + if (settleAmount == null) { + return resultVO; + } + // 计算手续费 = 结算金额 * 0.55% + BigDecimal fee = settleAmount.multiply(new BigDecimal(Constants.FEE_RATES)); + resultVO.setSettleAmount(settleAmount); + resultVO.setFeeAmount(fee); + resultVO.setTradeAmount(settleAmount.subtract(fee)); + return resultVO; + } + /** * 获取运营商订单列表 * diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/base/SplitSettleAmountVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/base/SplitSettleAmountVO.java new file mode 100644 index 000000000..4c6a64222 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/base/SplitSettleAmountVO.java @@ -0,0 +1,21 @@ +package com.jsowell.pile.vo.base; + +import lombok.*; + +import java.math.BigDecimal; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class SplitSettleAmountVO { + // 结算金额 + private BigDecimal settleAmount; + + // 手续费 = 结算金额 * 0.55% + private BigDecimal feeAmount; + + // 交易金额 = 结算金额 - 手续费 + private BigDecimal tradeAmount; +}