diff --git a/jsowell-admin/src/main/resources/application-dev.yml b/jsowell-admin/src/main/resources/application-dev.yml index 5f02bdae6..7224b24b0 100644 --- a/jsowell-admin/src/main/resources/application-dev.yml +++ b/jsowell-admin/src/main/resources/application-dev.yml @@ -36,10 +36,10 @@ spring: druid: # 主库数据源 master: - #url: jdbc:mysql://192.168.2.2:3306/jsowell_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - #username: jsowell_dev - url: jdbc:mysql://192.168.2.2:3306/jsowell_prd_copy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: jsowell_prd_copy + url: jdbc:mysql://192.168.2.2:3306/jsowell_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: jsowell_dev + #url: jdbc:mysql://192.168.2.2:3306/jsowell_prd_copy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + #username: jsowell_prd_copy password: 123456 # 从库数据源 slave: diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 7cd707986..4819c1436 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -288,9 +288,54 @@ public class SpringBootTestController { @Test public void testCalculateTheBalanceDeductionAmount() { String memberId = "123456"; - BigDecimal amount = new BigDecimal("99.9"); - List list = orderBasicInfoService.calculateTheBalanceDeductionAmount(memberId, amount); - System.out.println(JSON.toJSONString(list)); + BigDecimal amount = new BigDecimal("20"); + + List resultList = Lists.newArrayList(); + // 查询会员的余额充值记录 按照充值时间正序 + List memberAdapayRecords = Lists.newArrayList(); + memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("1").balanceAmt(new BigDecimal("50")).build()); + memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("2").balanceAmt(new BigDecimal("60")).build()); + memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("3").balanceAmt(new BigDecimal("10")).build()); + + // 定义一个临时金额等于消费金额 + BigDecimal tempAmount = new BigDecimal(amount.toString()); + for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) { + // 该笔支付剩余金额 取出一笔判断是否剩余金额够支付订单消费吗 + BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt(); + // 该笔支付扣除金额 + BigDecimal deductionAmount; + // 获取延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法 + // AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByPaymentId(memberAdapayRecord.getPaymentId()); + // String payMode = null; + // if (callbackRecord != null) { + // JSONObject expendJsonObject = JSON.parseObject(callbackRecord.getExpend()); + // payMode = expendJsonObject.getString("payMode"); + // } + // 消费金额 - 剩余金额 + tempAmount = tempAmount.subtract(balanceAmt); + if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) { + // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完 + deductionAmount = balanceAmt; + BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() + .memberId(memberId) + .paymentId(memberAdapayRecord.getPaymentId()) + .deductionAmount(deductionAmount) + .build(); + resultList.add(build); + } else { + // 如果小于0,则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环 + deductionAmount = balanceAmt.add(tempAmount); + BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() + .memberId(memberId) + .paymentId(memberAdapayRecord.getPaymentId()) + .deductionAmount(deductionAmount) + .build(); + resultList.add(build); + break; + } + } + + System.out.println(JSON.toJSONString(resultList)); } @Test diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPayRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPayRecordMapper.java index 9c48f455e..927f0407e 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPayRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/OrderPayRecordMapper.java @@ -38,9 +38,9 @@ public interface OrderPayRecordMapper { int insertOrUpdateSelective(OrderPayRecord record); - int deleteByPrimaryKey(Integer id); + // int deleteByPrimaryKey(Integer id); - int updateByPrimaryKey(OrderPayRecord record); + // int updateByPrimaryKey(OrderPayRecord record); List getOrderPayRecordList(@Param("orderCode") String orderCode); } \ 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 af917f6a7..d34885db2 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 @@ -20,6 +20,12 @@ public interface MemberAdapayRecordService{ int insertOrUpdateSelective(MemberAdapayRecord record); + /** + * 查询会员的汇付支付记录 + * @param memberId 会员id + * @param scenarioType 场景类型 订单/余额 + * @return + */ List selectAdapayRecordList(String memberId, String scenarioType); MemberAdapayRecord selectByPaymentId(String 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 c75091662..2a1d4d722 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 @@ -818,12 +818,22 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { private void freezeAmount(OrderBasicInfo orderBasicInfo) { String orderCode = orderBasicInfo.getOrderCode(); // 查询这笔订单的支付id/查询该笔订单的支付交易回调 - AdapayCallbackRecord adapayCallbackRecord = selectAdapayCallbackRecord(orderCode); - String paymentId = adapayCallbackRecord.getPaymentId(); - memberAdapayRecordService.updateFreezeAmount(paymentId, orderBasicInfo.getSettleAmount()); + + // 根据订单编号,查询订单支付记录,一般在线支付只有1条,余额支付可能有多条 + List orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); + + // 需要根据订单消费的金额,计算一下每个paymentId需要冻结多少钱 + + for (OrderPayRecord record : orderPayRecordList) { + // 支付的信息,json字符串包含,paymentId和支付金额 + String deductionRecord = record.getDeductionRecord(); + JSONObject jsonObject = JSON.parseObject(deductionRecord); + String paymentId = jsonObject.getString("paymentId"); + // 更新member_adapay_record 中的冻结金额 + memberAdapayRecordService.updateFreezeAmount(paymentId, orderBasicInfo.getSettleAmount()); + } // 订单支付记录,保存一下消费记录 deduction_record - List orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); if (CollectionUtils.isNotEmpty(orderPayRecordList)) { // } @@ -1335,33 +1345,25 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt(); // 该笔支付扣除金额 BigDecimal deductionAmount; - // 获取延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法 - AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByPaymentId(memberAdapayRecord.getPaymentId()); - String payMode = null; - if (callbackRecord != null) { - JSONObject expendJsonObject = JSON.parseObject(callbackRecord.getExpend()); - payMode = expendJsonObject.getString("payMode"); - } - // 消费金额 - 剩余金额 + + // 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额 tempAmount = tempAmount.subtract(balanceAmt); if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) { - // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完 + // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完,还要继续扣下一笔 deductionAmount = balanceAmt; BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() .memberId(memberId) .paymentId(memberAdapayRecord.getPaymentId()) .deductionAmount(deductionAmount) - .delayMode(payMode) .build(); resultList.add(build); } else { - // 如果小于0,则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环 - deductionAmount = balanceAmt.add(tempAmount); + // 如果小于0,则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环 + deductionAmount = balanceAmt.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额 BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder() .memberId(memberId) .paymentId(memberAdapayRecord.getPaymentId()) .deductionAmount(deductionAmount) - .delayMode(payMode) .build(); resultList.add(build); break; @@ -3036,6 +3038,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { .build(); memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); + // 查询余额充值有剩余的记录 + List list = calculateTheBalanceDeductionAmount(dto.getMemberId(), chargeAmount); + + + // 记录流水 if (principalPay != null) { payRecordList.add(OrderPayRecord.builder() 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 index 9a20750cf..e369517e8 100644 --- 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 @@ -24,10 +24,4 @@ public class BalanceDeductionAmountVO { * 扣除金额 */ private BigDecimal deductionAmount; - - /** - * 该笔支付单的分账方式 - * delay表示延时分账,其他情况表示实时分账 - */ - private String delayMode; } diff --git a/jsowell-pile/src/main/resources/mapper/pile/OrderPayRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/OrderPayRecordMapper.xml index 559dbe16d..572bcaba8 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/OrderPayRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/OrderPayRecordMapper.xml @@ -396,18 +396,6 @@ - - insert into order_pay_record - (order_code, pay_mode, pay_amount, acquirer, create_by) - values - - ( - #{item.orderCode,jdbcType=VARCHAR}, #{item.payMode,jdbcType=VARCHAR}, #{item.payAmount,jdbcType=DECIMAL}, - #{item.acquirer,jdbcType=VARCHAR}, #{item.createBy,jdbcType=VARCHAR} - ) - - -