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 5070271a3..98374938a 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 @@ -6,10 +6,12 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.*; +import com.jsowell.adapay.common.DivMember; 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.PaymentConfirmResponse; import com.jsowell.adapay.response.QueryCorpMemberResponse; import com.jsowell.adapay.response.QueryMemberResponse; import com.jsowell.adapay.vo.AdapayAccountBalanceVO; @@ -544,6 +546,46 @@ public class AdapayMemberService { return null; } + + /** + * 创建交易确认请求/创建分账请求 + * 这个方法只适用于给一个用户分账 + * @param paymentId 支付对象id + * @param adapayMemberAccount 收到该张的汇付会员信息 + * @param confirmAmt 确认的金额 + * @param orderCode 订单编号 + */ + public PaymentConfirmResponse createPaymentConfirmRequest(String paymentId, AdapayMemberAccount adapayMemberAccount, BigDecimal confirmAmt, String orderCode) { + // 调汇付的分账接口 确认交易 + Map confirmParams = Maps.newHashMap(); + // Adapay生成的支付对象id + confirmParams.put("payment_id", paymentId); + // 请求订单号,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 + confirmParams.put("order_no", "PC" + System.currentTimeMillis()); + // 确认金额,必须大于0,保留两位小数点,如0.10、100.05等。必须小于等于原支付金额-已确认金额-已撤销金额。 + confirmParams.put("confirm_amt", AdapayUtil.formatAmount(confirmAmt)); + // 附加说明 + JSONObject jsonObject = new JSONObject(); + jsonObject.put("orderCode", orderCode); + jsonObject.put("adapayMemberId", adapayMemberAccount.getAdapayMemberId()); + confirmParams.put("description", jsonObject.toJSONString()); + // 分账对象信息 一次最多7个 + DivMember divMember = new DivMember(); + divMember.setMember_id(adapayMemberAccount.getAdapayMemberId()); + divMember.setAmount(AdapayUtil.formatAmount(confirmAmt)); + divMember.setFee_flag(Constants.Y); + confirmParams.put("div_members", Lists.newArrayList(divMember)); + Map paymentConfirm = null; + try { + paymentConfirm = PaymentConfirm.create(confirmParams); + } catch (BaseAdaPayException e) { + log.error("创建交易确认请求error", e); + } + String jsonString = JSON.toJSONString(paymentConfirm); + log.info("调分账接口param:{}, result:{}", JSON.toJSONString(confirmParams), jsonString); + return JSONObject.parseObject(jsonString, PaymentConfirmResponse.class); + } + /** * 创建余额支付请求 * @param outMemberId 出账用户的member_id, 若为商户本身时,请传入0 @@ -552,7 +594,7 @@ public class AdapayMemberService { * @param title 标题 * @param desc 描述信息 */ - public BalancePaymentResponse createBalancePaymentRequest(String outMemberId, String inMemberId, String transAmt, String title, String desc) throws BaseAdaPayException { + public BalancePaymentResponse createBalancePaymentRequest(String outMemberId, String inMemberId, String transAmt, String title, String desc){ Map balanceParam = Maps.newHashMap(); balanceParam.put("app_id", ADAPAY_APP_ID); balanceParam.put("adapay_func_code", "settle_accounts.balancePay"); @@ -562,9 +604,15 @@ public class AdapayMemberService { balanceParam.put("trans_amt", AdapayUtil.formatAmount(transAmt)); 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); + Map paymentResult = null; + try { + paymentResult = AdapayCommon.requestAdapay(balanceParam); + } catch (BaseAdaPayException e) { + log.error("创建余额支付请求error", e); + } + String jsonString = JSON.toJSONString(paymentResult); + log.info("创建余额支付param:{}, result:{}", JSON.toJSONString(balanceParam), jsonString); + return JSONObject.parseObject(jsonString, BalancePaymentResponse.class); } /** @@ -579,4 +627,5 @@ public class AdapayMemberService { Map confirmReverseResult = AdapayCommon.requestAdapay(confirmReverseParams); log.info("创建支付确认撤销param:{}, result:{}", JSON.toJSONString(confirmReverseParams), JSON.toJSONString(confirmReverseResult)); } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/adapay/vo/OrderSettleResult.java b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/OrderSettleResult.java index 313f42ac6..96ae1aa5b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/adapay/vo/OrderSettleResult.java +++ b/jsowell-pile/src/main/java/com/jsowell/adapay/vo/OrderSettleResult.java @@ -24,5 +24,5 @@ public class OrderSettleResult { /** * 附加说明 */ - private String description; + // private String description; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java index f987f6433..4494b634a 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java @@ -37,4 +37,8 @@ public interface MemberAdapayRecordMapper { int insertOrUpdate(MemberAdapayRecord record); int insertOrUpdateSelective(MemberAdapayRecord record); + + List selectAdapayRecordList(@Param("memberId") String memberId, @Param("scenarioType") String scenarioType); + + MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId); } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java index 000052f23..e2c2a4803 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java @@ -19,4 +19,7 @@ public interface MemberAdapayRecordService{ int insertOrUpdateSelective(MemberAdapayRecord record); + List selectAdapayRecordList(String memberId, String scenarioType); + + MemberAdapayRecord selectByPaymentId(String paymentId); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java index a93b04338..bab5b97c9 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java @@ -1,11 +1,12 @@ package com.jsowell.pile.service.impl; -import org.springframework.stereotype.Service; -import javax.annotation.Resource; -import java.util.List; import com.jsowell.pile.domain.MemberAdapayRecord; import com.jsowell.pile.mapper.MemberAdapayRecordMapper; import com.jsowell.pile.service.MemberAdapayRecordService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; @Service public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{ @@ -47,4 +48,20 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{ return memberAdapayRecordMapper.insertOrUpdateSelective(record); } + /** + * 查询会员的支付记录,按照支付成功时间正序 + * @param memberId 会员id + * @param scenarioType 支付订单/充值余额 + * @return 支付记录列表 + */ + @Override + public List selectAdapayRecordList(String memberId, String scenarioType) { + return memberAdapayRecordMapper.selectAdapayRecordList(memberId, scenarioType); + } + + @Override + public MemberAdapayRecord selectByPaymentId(String paymentId) { + return memberAdapayRecordMapper.selectByPaymentId(paymentId); + } + } 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 f0c27a4a5..25c7a774d 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 @@ -170,6 +170,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { @Autowired private AdapayMemberService adapayMemberService; + @Autowired + private MemberAdapayRecordService memberAdapayRecordService; + /** * 条件查询订单基本信息 * @@ -957,10 +960,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 执行分账 for (OrderBasicInfo orderBasicInfo : orderBasicInfos) { try { - OrderSettleResult orderSettleResult = null; + OrderSettleResult orderSettleResult; if (OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue().equals(orderBasicInfo.getPayMode())) { - // 余额支付的订单 只用余额支付转账 - orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount); + // 余额支付的订单 + // orderSettleResult = doBalancePayment(orderBasicInfo, adapayMemberAccount); + orderSettleResult = doBalancePaymentV2(orderBasicInfo, adapayMemberAccount); } else { // 在线支付,进行支付确认分账 orderSettleResult = doPaymentConfirm(orderBasicInfo, adapayMemberAccount); @@ -1106,9 +1110,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { 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()); + // JSONObject jsonObject = new JSONObject(); + // jsonObject.put("orderCode", orderCode); + // result.setDescription(jsonObject.toJSONString()); return result; } @@ -1119,20 +1123,55 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { * @return */ public OrderSettleResult doBalancePaymentV2(OrderBasicInfo orderBasicInfo, AdapayMemberAccount adapayMemberAccount) throws BaseAdaPayException { - // 计算应该支付金额,和手续费 - SplitSettleAmountVO splitSettleAmountVO = splitSettleAmount(orderBasicInfo.getSettleAmount()); - BigDecimal feeAmount = splitSettleAmountVO.getFeeAmount(); - BigDecimal tradeAmount = splitSettleAmountVO.getTradeAmount(); - logger.info("余额支付订单使用余额支付转账, orderCode:{}, inMemberId:{}, transAmt:{}", orderBasicInfo.getOrderCode(), orderBasicInfo, tradeAmount); + BigDecimal settleAmount = orderBasicInfo.getSettleAmount(); + String orderCode = orderBasicInfo.getOrderCode(); - // 查询会员的余额充值记录 + BigDecimal confirmAmt = BigDecimal.ZERO; + BigDecimal feeAmt = BigDecimal.ZERO; + String status = null; + String description = null; - // 分账 + // 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况 + List list = calculateTheBalanceDeductionAmount(orderBasicInfo.getMemberId(), settleAmount); + for (BalanceDeductionAmountVO vo : list) { + String paymentId = vo.getPaymentId(); + BigDecimal deductionAmount = vo.getDeductionAmount(); + // 调汇付的分账接口 确认交易 + PaymentConfirmResponse paymentConfirmResponse = adapayMemberService.createPaymentConfirmRequest(paymentId, adapayMemberAccount, deductionAmount, orderCode); + if (paymentConfirmResponse != null) { + confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirmed_amt())); + feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt())); + status = paymentConfirmResponse.getStatus(); + description = paymentConfirmResponse.getDescription(); + } + MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId); + // 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额 + record.setSpendAmt(record.getSpendAmt().add(deductionAmount)); + // 更新此笔交易单的剩余金额 = 历史剩余金额 - 本次消费金额 + record.setBalanceAmt(record.getBalanceAmt().subtract(deductionAmount)); + memberAdapayRecordService.updateByPrimaryKeySelective(record); + } - // 更新余额充值记录 + // 分账接口返回的信息 + OrderSettleResult result = new OrderSettleResult(); + result.setConfirm_amt(confirmAmt.toString()); + result.setStatus(status); + result.setFee_amt(feeAmt.toString()); + // result.setDescription(description); + return result; + } + /** + * 计算余额扣除金额 + * @param memberId 会员id + * @param amount 消费金额 + */ + private List calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) { + List resultList = Lists.newArrayList(); + // 查询会员的余额充值记录 按照充值时间正序 + List memberAdapayRecords = memberAdapayRecordService.selectAdapayRecordList(memberId, ScenarioEnum.BALANCE.getValue()); - return null; + return resultList; } /** @@ -1155,22 +1194,17 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 调汇付的分账接口 确认交易 Map confirmParams = Maps.newHashMap(); - // Adapay生成的支付对象id confirmParams.put("payment_id", adapayCallbackRecord.getPaymentId()); - // 请求订单号,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 confirmParams.put("order_no", "PC" + System.currentTimeMillis()); - // 确认金额,必须大于0,保留两位小数点,如0.10、100.05等。必须小于等于原支付金额-已确认金额-已撤销金额。 confirmParams.put("confirm_amt", settleAmount); - // 附加说明 JSONObject jsonObject = new JSONObject(); jsonObject.put("orderCode", orderBasicInfo.getOrderCode()); jsonObject.put("adapayMemberId", adapayMemberAccount.getAdapayMemberId()); confirmParams.put("description", jsonObject.toJSONString()); - // 分账对象信息 DivMember divMember = new DivMember(); divMember.setMember_id(adapayMemberAccount.getAdapayMemberId()); @@ -1179,13 +1213,14 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { confirmParams.put("div_members", Lists.newArrayList(divMember)); Map paymentConfirm = PaymentConfirm.create(confirmParams); logger.info("调分账接口param:{}, result:{}", JSON.toJSONString(confirmParams), JSON.toJSONString(paymentConfirm)); + // 分账接口返回的信息 PaymentConfirmResponse paymentConfirmResponse = JSONObject.parseObject(JSON.toJSONString(paymentConfirm), PaymentConfirmResponse.class); OrderSettleResult result = new OrderSettleResult(); result.setConfirm_amt(paymentConfirmResponse.getConfirm_amt()); result.setStatus(paymentConfirmResponse.getStatus()); result.setFee_amt(paymentConfirmResponse.getFee_amt()); - result.setDescription(paymentConfirmResponse.getDescription()); + // result.setDescription(paymentConfirmResponse.getDescription()); return result; } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/BalanceDeductionAmountVO.java b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/BalanceDeductionAmountVO.java new file mode 100644 index 000000000..e369517e8 --- /dev/null +++ b/jsowell-pile/src/main/java/com/jsowell/pile/vo/web/BalanceDeductionAmountVO.java @@ -0,0 +1,27 @@ +package com.jsowell.pile.vo.web; + +import lombok.*; + +import java.math.BigDecimal; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class BalanceDeductionAmountVO { + /** + * 会员id + */ + private String memberId; + + /** + * 支付id + */ + private String paymentId; + + /** + * 扣除金额 + */ + private BigDecimal deductionAmount; +} diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml index 00b829000..c623d647c 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml @@ -450,4 +450,24 @@ + + + + \ No newline at end of file