diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/ClearingBillInfoMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/ClearingBillInfoMapper.java index adbe40874..70e29c367 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/ClearingBillInfoMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/ClearingBillInfoMapper.java @@ -2,7 +2,6 @@ package com.jsowell.pile.mapper; import com.jsowell.pile.domain.ClearingBillInfo; import com.jsowell.pile.dto.GetClearingBillDTO; -import com.jsowell.pile.vo.web.ClearingBillVO; import com.jsowell.pile.vo.web.MerchantClearingBillVO; import org.apache.ibatis.annotations.Param; @@ -25,6 +24,10 @@ public interface ClearingBillInfoMapper { */ int insert(ClearingBillInfo record); + int insertOrUpdate(ClearingBillInfo record); + + int insertOrUpdateSelective(ClearingBillInfo record); + /** * insert record to table selective * @@ -57,12 +60,19 @@ public interface ClearingBillInfoMapper { */ int updateByPrimaryKey(ClearingBillInfo record); + int updateBatch(List list); + + int updateBatchSelective(List list); + + int batchInsert(@Param("list") List list); + List selectByMerchantId(@Param("merchantId") String merchantId, @Param("billStatus") String billStatus); void updateStatus(@Param("clearingBillIds") List clearingBillIds, @Param("billStatus") String billStatus); /** * 后管用 查询运营商账单列表 + * * @param dto * @return */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingBillInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingBillInfoService.java index 529a4a6d6..bb808777d 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingBillInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/ClearingBillInfoService.java @@ -6,7 +6,7 @@ import com.jsowell.pile.vo.web.MerchantClearingBillVO; import java.util.List; -public interface ClearingBillInfoService{ +public interface ClearingBillInfoService { int deleteByPrimaryKey(Integer id); @@ -27,8 +27,20 @@ public interface ClearingBillInfoService{ /** * 后管用 查询运营商账单列表 + * * @param dto * @return */ List getMerchantClearingBillList(GetClearingBillDTO dto); + + int insertOrUpdate(ClearingBillInfo record); + + int insertOrUpdateSelective(ClearingBillInfo record); + + int updateBatch(List list); + + int updateBatchSelective(List list); + + int batchInsert(List list); } + diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingBillInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingBillInfoServiceImpl.java index 1c9d3bb1b..4f8e0ef19 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingBillInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/ClearingBillInfoServiceImpl.java @@ -13,7 +13,7 @@ import javax.annotation.Resource; import java.util.List; @Service -public class ClearingBillInfoServiceImpl implements ClearingBillInfoService{ +public class ClearingBillInfoServiceImpl implements ClearingBillInfoService { @Resource private ClearingBillInfoMapper clearingBillInfoMapper; @@ -63,6 +63,7 @@ public class ClearingBillInfoServiceImpl implements ClearingBillInfoService{ /** * 后管用 查询运营商账单列表 + * * @param dto * @return */ @@ -71,4 +72,29 @@ public class ClearingBillInfoServiceImpl implements ClearingBillInfoService{ return clearingBillInfoMapper.getMerchantClearingBillList(dto); } + @Override + public int insertOrUpdate(ClearingBillInfo record) { + return clearingBillInfoMapper.insertOrUpdate(record); + } + + @Override + public int insertOrUpdateSelective(ClearingBillInfo record) { + return clearingBillInfoMapper.insertOrUpdateSelective(record); + } + + @Override + public int updateBatch(List list) { + return clearingBillInfoMapper.updateBatch(list); + } + + @Override + public int updateBatchSelective(List list) { + return clearingBillInfoMapper.updateBatchSelective(list); + } + + @Override + public int batchInsert(List list) { + return clearingBillInfoMapper.batchInsert(list); + } } + 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 fb5eebcee..ae61d0680 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 @@ -1465,27 +1465,34 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况 List list = calculateSplitTheBillAmount(orderBasicInfo.getMemberId(), settleAmount); - for (BalanceDeductionAmountVO vo : list) { - String paymentId = vo.getPaymentId(); - BigDecimal deductionAmount = vo.getDeductionAmount(); + List collect = list.stream().map(BalanceDeductionAmountVO::getPaymentId).collect(Collectors.toList()); + // 校验是否分账 + OrderSettleResult result = verifyOrderConfirmAmount(collect, orderCode, settleAmount, wechatAppId); + if (!AdapayStatusEnum.SUCCEEDED.getValue().equals(result.getStatus())) { + // 没有分账,执行分账逻辑 + for (BalanceDeductionAmountVO vo : list) { + String paymentId = vo.getPaymentId(); + BigDecimal deductionAmount = vo.getDeductionAmount(); - // 延时分账,使用确认交易API - PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, - adapayMemberAccount, deductionAmount, orderCode, wechatAppId); + // 延时分账,使用确认交易API + PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, + adapayMemberAccount, deductionAmount, orderCode, wechatAppId); - if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) { - confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirm_amt())); - feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt())); - status = paymentConfirmResponse.getStatus(); - memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount(paymentId, confirmAmt, confirmAmt); + if (paymentConfirmResponse != null && paymentConfirmResponse.isNotFailed()) { + confirmAmt = confirmAmt.add(new BigDecimal(paymentConfirmResponse.getConfirm_amt())); + feeAmt = feeAmt.add(new BigDecimal(paymentConfirmResponse.getFee_amt())); + status = paymentConfirmResponse.getStatus(); + memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount(paymentId, confirmAmt, confirmAmt); + } } + + // 分账接口返回的信息 + result = new OrderSettleResult(); + result.setConfirmAmt(confirmAmt.toString()); + result.setStatus(status); + result.setFeeAmt(feeAmt.toString()); } - // 分账接口返回的信息 - OrderSettleResult result = new OrderSettleResult(); - result.setConfirmAmt(confirmAmt.toString()); - result.setStatus(status); - result.setFeeAmt(feeAmt.toString()); return result; } @@ -1592,15 +1599,69 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 订单结算金额 BigDecimal settleAmount = orderBasicInfo.getSettleAmount(); - // 调汇付的分账接口 确认交易 - PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, - adapayMemberAccount, settleAmount, orderCode, wechatAppId); + OrderSettleResult result = verifyOrderConfirmAmount(Lists.newArrayList(paymentId), orderCode, settleAmount, wechatAppId); + + // 校验订单是否分账 状态为非交易完成的时候,进行分账处理 + if (!AdapayStatusEnum.SUCCEEDED.getValue().equals(result.getStatus())) { + // 调汇付的分账接口 确认交易 + PaymentConfirmResponse paymentConfirmResponse = adapayService.createPaymentConfirmRequest(paymentId, + adapayMemberAccount, settleAmount, orderCode, wechatAppId); + + // 分账接口返回的信息 + result = new OrderSettleResult(); + result.setConfirmAmt(paymentConfirmResponse.getConfirm_amt()); + result.setStatus(paymentConfirmResponse.getStatus()); + result.setFeeAmt(paymentConfirmResponse.getFee_amt()); + } + return result; + } + + /** + * 校验订单分账金额 + * @param paymentIds 支付id集合 + * @param orderCode 订单编号 + * @param settleAmount 结算金额 + */ + private OrderSettleResult verifyOrderConfirmAmount(List paymentIds, String orderCode, BigDecimal settleAmount, String wechatAppId) { + // 分账金额 + BigDecimal confirmAmt = BigDecimal.ZERO; + // 手续费 + BigDecimal feeAmt = BigDecimal.ZERO; + // 通过支付id查询分账情况 + for (String paymentId : paymentIds) { + QueryPaymentConfirmDTO dto = new QueryPaymentConfirmDTO(); + dto.setPaymentId(paymentId); + dto.setWechatAppId(wechatAppId); + QueryPaymentConfirmDetailResponse response = adapayService.queryPaymentConfirmList(dto); + if (response != null) { + List confirms = response.getPaymentConfirms(); + if (CollectionUtils.isNotEmpty(confirms)) { + for (QueryPaymentConfirmDetailResponse.PaymentConfirmInfo confirm : confirms) { + JSONObject jsonObject = JSON.parseObject(confirm.getDescription()); + if (StringUtils.equals(jsonObject.getString("orderCode"), orderCode)) { + // 订单号对的上,累计分账金额 + confirmAmt = confirmAmt.add(new BigDecimal(confirm.getConfirmAmt())); + feeAmt = feeAmt.add(new BigDecimal(confirm.getFeeAmt())); + } + } + } + } + } - // 分账接口返回的信息 OrderSettleResult result = new OrderSettleResult(); - result.setConfirmAmt(paymentConfirmResponse.getConfirm_amt()); - result.setStatus(paymentConfirmResponse.getStatus()); - result.setFeeAmt(paymentConfirmResponse.getFee_amt()); + result.setOrderCode(orderCode); + result.setSettleAmt(settleAmount.toString()); + result.setConfirmAmt(confirmAmt.toString()); + result.setFeeAmt(feeAmt.toString()); + String status; + // 如果确认金额和结算金额相等,返回succeeded,其他情况返回PENDING + if (settleAmount.compareTo(confirmAmt) >= 0) { + // 返回succeeded 标识该笔订单已经完成了分账,不要再次执行分账 + status = AdapayStatusEnum.SUCCEEDED.getValue(); + } else { + status = AdapayStatusEnum.PENDING.getValue(); + } + result.setStatus(status); return result; } diff --git a/jsowell-pile/src/main/resources/mapper/pile/ClearingBillInfoMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/ClearingBillInfoMapper.xml index 40090e19c..652189fff 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/ClearingBillInfoMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/ClearingBillInfoMapper.xml @@ -248,6 +248,494 @@ del_flag = #{delFlag,jdbcType=VARCHAR} where id = #{id,jdbcType=INTEGER} + + + update clearing_bill_info + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.billStatus,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.tradeDate,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.clearingBillCode,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.clearingTime,jdbcType=TIMESTAMP} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.merchantId,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.orderSource,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.receivableAmount,jdbcType=DECIMAL} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.shouldClearingAmount,jdbcType=DECIMAL} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.actualClearingAmount,jdbcType=DECIMAL} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.feeAmount,jdbcType=DECIMAL} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.withdrawableAmount,jdbcType=DECIMAL} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.withdrawCode,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.createBy,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.createTime,jdbcType=TIMESTAMP} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.updateBy,jdbcType=VARCHAR} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.updateTime,jdbcType=TIMESTAMP} + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.delFlag,jdbcType=VARCHAR} + + + + where id in + + #{item.id,jdbcType=INTEGER} + + + + + update clearing_bill_info + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.billStatus,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.tradeDate,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.clearingBillCode,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.clearingTime,jdbcType=TIMESTAMP} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.merchantId,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.orderSource,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.receivableAmount,jdbcType=DECIMAL} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.shouldClearingAmount,jdbcType=DECIMAL} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.actualClearingAmount,jdbcType=DECIMAL} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.feeAmount,jdbcType=DECIMAL} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.withdrawableAmount,jdbcType=DECIMAL} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.withdrawCode,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.createBy,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.createTime,jdbcType=TIMESTAMP} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.updateBy,jdbcType=VARCHAR} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.updateTime,jdbcType=TIMESTAMP} + + + + + + + when id = #{item.id,jdbcType=INTEGER} then #{item.delFlag,jdbcType=VARCHAR} + + + + + where id in + + #{item.id,jdbcType=INTEGER} + + + + + insert into clearing_bill_info + (bill_status, trade_date, clearing_bill_code, clearing_time, merchant_id, order_source, + receivable_amount, should_clearing_amount, actual_clearing_amount, fee_amount, + withdrawable_amount, withdraw_code, create_by, create_time, update_by, update_time, + del_flag) + values + + (#{item.billStatus,jdbcType=VARCHAR}, #{item.tradeDate,jdbcType=VARCHAR}, #{item.clearingBillCode,jdbcType=VARCHAR}, + #{item.clearingTime,jdbcType=TIMESTAMP}, #{item.merchantId,jdbcType=VARCHAR}, #{item.orderSource,jdbcType=VARCHAR}, + #{item.receivableAmount,jdbcType=DECIMAL}, #{item.shouldClearingAmount,jdbcType=DECIMAL}, + #{item.actualClearingAmount,jdbcType=DECIMAL}, #{item.feeAmount,jdbcType=DECIMAL}, + #{item.withdrawableAmount,jdbcType=DECIMAL}, #{item.withdrawCode,jdbcType=VARCHAR}, + #{item.createBy,jdbcType=VARCHAR}, #{item.createTime,jdbcType=TIMESTAMP}, #{item.updateBy,jdbcType=VARCHAR}, + #{item.updateTime,jdbcType=TIMESTAMP}, #{item.delFlag,jdbcType=VARCHAR}) + + + + + insert into clearing_bill_info + + + id, + + bill_status, + trade_date, + clearing_bill_code, + clearing_time, + merchant_id, + order_source, + receivable_amount, + should_clearing_amount, + actual_clearing_amount, + fee_amount, + withdrawable_amount, + withdraw_code, + create_by, + create_time, + update_by, + update_time, + del_flag, + + values + + + #{id,jdbcType=INTEGER}, + + #{billStatus,jdbcType=VARCHAR}, + #{tradeDate,jdbcType=VARCHAR}, + #{clearingBillCode,jdbcType=VARCHAR}, + #{clearingTime,jdbcType=TIMESTAMP}, + #{merchantId,jdbcType=VARCHAR}, + #{orderSource,jdbcType=VARCHAR}, + #{receivableAmount,jdbcType=DECIMAL}, + #{shouldClearingAmount,jdbcType=DECIMAL}, + #{actualClearingAmount,jdbcType=DECIMAL}, + #{feeAmount,jdbcType=DECIMAL}, + #{withdrawableAmount,jdbcType=DECIMAL}, + #{withdrawCode,jdbcType=VARCHAR}, + #{createBy,jdbcType=VARCHAR}, + #{createTime,jdbcType=TIMESTAMP}, + #{updateBy,jdbcType=VARCHAR}, + #{updateTime,jdbcType=TIMESTAMP}, + #{delFlag,jdbcType=VARCHAR}, + + on duplicate key update + + + id = #{id,jdbcType=INTEGER}, + + bill_status = #{billStatus,jdbcType=VARCHAR}, + trade_date = #{tradeDate,jdbcType=VARCHAR}, + clearing_bill_code = #{clearingBillCode,jdbcType=VARCHAR}, + clearing_time = #{clearingTime,jdbcType=TIMESTAMP}, + merchant_id = #{merchantId,jdbcType=VARCHAR}, + order_source = #{orderSource,jdbcType=VARCHAR}, + receivable_amount = #{receivableAmount,jdbcType=DECIMAL}, + should_clearing_amount = #{shouldClearingAmount,jdbcType=DECIMAL}, + actual_clearing_amount = #{actualClearingAmount,jdbcType=DECIMAL}, + fee_amount = #{feeAmount,jdbcType=DECIMAL}, + withdrawable_amount = #{withdrawableAmount,jdbcType=DECIMAL}, + withdraw_code = #{withdrawCode,jdbcType=VARCHAR}, + create_by = #{createBy,jdbcType=VARCHAR}, + create_time = #{createTime,jdbcType=TIMESTAMP}, + update_by = #{updateBy,jdbcType=VARCHAR}, + update_time = #{updateTime,jdbcType=TIMESTAMP}, + del_flag = #{delFlag,jdbcType=VARCHAR}, + + + + + insert into clearing_bill_info + + + id, + + + bill_status, + + + trade_date, + + + clearing_bill_code, + + + clearing_time, + + + merchant_id, + + + order_source, + + + receivable_amount, + + + should_clearing_amount, + + + actual_clearing_amount, + + + fee_amount, + + + withdrawable_amount, + + + withdraw_code, + + + create_by, + + + create_time, + + + update_by, + + + update_time, + + + del_flag, + + + values + + + #{id,jdbcType=INTEGER}, + + + #{billStatus,jdbcType=VARCHAR}, + + + #{tradeDate,jdbcType=VARCHAR}, + + + #{clearingBillCode,jdbcType=VARCHAR}, + + + #{clearingTime,jdbcType=TIMESTAMP}, + + + #{merchantId,jdbcType=VARCHAR}, + + + #{orderSource,jdbcType=VARCHAR}, + + + #{receivableAmount,jdbcType=DECIMAL}, + + + #{shouldClearingAmount,jdbcType=DECIMAL}, + + + #{actualClearingAmount,jdbcType=DECIMAL}, + + + #{feeAmount,jdbcType=DECIMAL}, + + + #{withdrawableAmount,jdbcType=DECIMAL}, + + + #{withdrawCode,jdbcType=VARCHAR}, + + + #{createBy,jdbcType=VARCHAR}, + + + #{createTime,jdbcType=TIMESTAMP}, + + + #{updateBy,jdbcType=VARCHAR}, + + + #{updateTime,jdbcType=TIMESTAMP}, + + + #{delFlag,jdbcType=VARCHAR}, + + + on duplicate key update + + + id = #{id,jdbcType=INTEGER}, + + + bill_status = #{billStatus,jdbcType=VARCHAR}, + + + trade_date = #{tradeDate,jdbcType=VARCHAR}, + + + clearing_bill_code = #{clearingBillCode,jdbcType=VARCHAR}, + + + clearing_time = #{clearingTime,jdbcType=TIMESTAMP}, + + + merchant_id = #{merchantId,jdbcType=VARCHAR}, + + + order_source = #{orderSource,jdbcType=VARCHAR}, + + + receivable_amount = #{receivableAmount,jdbcType=DECIMAL}, + + + should_clearing_amount = #{shouldClearingAmount,jdbcType=DECIMAL}, + + + actual_clearing_amount = #{actualClearingAmount,jdbcType=DECIMAL}, + + + fee_amount = #{feeAmount,jdbcType=DECIMAL}, + + + withdrawable_amount = #{withdrawableAmount,jdbcType=DECIMAL}, + + + withdraw_code = #{withdrawCode,jdbcType=VARCHAR}, + + + create_by = #{createBy,jdbcType=VARCHAR}, + + + create_time = #{createTime,jdbcType=TIMESTAMP}, + + + update_by = #{updateBy,jdbcType=VARCHAR}, + + + update_time = #{updateTime,jdbcType=TIMESTAMP}, + + + del_flag = #{delFlag,jdbcType=VARCHAR}, + + + +