update 可提现金额,减去当天申请金额

This commit is contained in:
Guoqs
2025-11-18 13:33:26 +08:00
parent 277fad8918
commit e778d34941
13 changed files with 2077 additions and 36 deletions

View File

@@ -1,6 +1,7 @@
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.github.pagehelper.PageHelper;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.huifu.adapay.core.exception.BaseAdaPayException;
@@ -28,8 +29,10 @@ import com.jsowell.pile.domain.OrderDetail;
import com.jsowell.pile.domain.OrderUnsplitRecord;
import com.jsowell.pile.dto.AfterSettleOrderDTO;
import com.jsowell.pile.dto.DebugOrderDTO;
import com.jsowell.pile.service.AdapayUnsplitRecordService;
import com.jsowell.pile.service.OrderBasicInfoService;
import com.jsowell.pile.service.OrderUnsplitRecordService;
import com.jsowell.pile.vo.AdapayUnsplitRecordVO;
import org.apache.commons.collections4.CollectionUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -75,6 +78,9 @@ public class PaymentTestController {
@Autowired
private OrderBasicInfoService orderBasicInfoService;
@Autowired
private AdapayUnsplitRecordService adapayUnsplitRecordService;
/**
* 从payment_ids文件中获取支付id, 并批量查询分账信息
* 如需撤销分账, 请使用 {@link PaymentTestController#testCreateConfirmReverse()} 可以本地运行
@@ -412,10 +418,10 @@ public class PaymentTestController {
*/
@Test
public void createPaymentReverseRequestTest() {
String paymentId = "002212025100513581210820790129447211008";
BigDecimal refundAmount = new BigDecimal("0.5");
String memberId = "84488845";
String orderCode = "C82180436213";
String paymentId = "002212025010720373310722683516795273216";
BigDecimal refundAmount = new BigDecimal("1.08");
String memberId = "48781184";
String orderCode = "C67335843091";
// 延迟分账未确认调撤销调撤销接口退款
PaymentReverseOperation operation = new PaymentReverseOperation();
@@ -787,4 +793,26 @@ public class PaymentTestController {
orderBasicInfoService.splittingMethodTemp(afterSettleOrderDTO);
}
@Test
public void processUnSettledOrder() {
// 现查询需要分账或者退款的数据
int pageNum = 1;
int pageSize = 3;
PageHelper.startPage(pageNum, pageSize);
List<AdapayUnsplitRecordVO> adapayUnsplitRecordVOS = adapayUnsplitRecordService.queryList();
for (AdapayUnsplitRecordVO adapayUnsplitRecordVO : adapayUnsplitRecordVOS) {
System.out.println(adapayUnsplitRecordVO);
// 获取待分账金额
String waitSplitAmount = adapayUnsplitRecordVO.getWaitSplitAmount();
// 如果waitSplitAmount > 0, 调用分账接口
if (waitSplitAmount != null && !"".equals(waitSplitAmount)) {
// 调用分账接口
}
// 获取待退款金额
String refundPayAmount = adapayUnsplitRecordVO.getRefundPayAmount();
}
PageHelper.clearPage();
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -15,6 +15,7 @@ import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.util.*;
@@ -53,6 +54,9 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
public static final DateTimeFormatter DEFAULT_DATE_TIME_FORMATTER =
DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
/**
* 获取当前Date型日期
*
@@ -251,10 +255,10 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
*/
public static long minutesSince(String dateString) {
// 定义日期时间格式
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 解析给定的日期字符串
LocalDateTime givenDateTime = LocalDateTime.parse(dateString, formatter);
LocalDateTime givenDateTime = LocalDateTime.parse(dateString, DEFAULT_DATE_TIME_FORMATTER);
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
@@ -283,6 +287,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return Date.from(instant);
}
/**
* LocalDate转Date
*
* @param localDate
* @return
*/
public static Date localDate2Date(LocalDate localDate) {
if (localDate == null) {
return null;
@@ -393,8 +403,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
// 判断是否包含时间部分
if (trimmed.contains(":")) {
// 包含时间部分,按完整日期时间格式解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, formatter).toLocalDate().atStartOfDay());
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, DEFAULT_DATE_TIME_FORMATTER).toLocalDate().atStartOfDay());
} else {
// 不包含时间部分,按日期格式解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -416,8 +426,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
// 判断是否包含时间部分
if (trimmed.contains(":")) {
// 包含时间部分,按完整日期时间格式解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, formatter).toLocalDate().atTime(LocalTime.MAX));
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return DateUtils.formatDateTime(LocalDateTime.parse(trimmed, DEFAULT_DATE_TIME_FORMATTER).toLocalDate().atTime(LocalTime.MAX));
} else {
// 不包含时间部分,按日期格式解析
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -425,6 +435,32 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
}
}
/**
* 判断时间是否是今天
*
* @param dateTimeStr 日期时间字符串,格式为 "yyyy-MM-dd HH:mm:ss"
* @return
*/
public static boolean isToday(String dateTimeStr) {
// 判断入参 时间是否在 今天
if (dateTimeStr == null || dateTimeStr.trim().isEmpty()) {
return false;
}
try {
// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DEFAULT_DATE_TIME_FORMATTER);
LocalDate date = dateTime.toLocalDate();
LocalDate today = LocalDate.now();
return date.isEqual(today);
} catch (DateTimeParseException e) {
// 如果解析失败,说明格式不正确
return false;
}
}
public enum IntervalType {
DAY,
HOUR,
@@ -632,6 +668,12 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return c.getTime();
}
/**
* 时间格式化
*
* @param date
* @return
*/
public static String formatDateTime(Date date) {
if (date == null) {
return "";
@@ -640,6 +682,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return simpleDateFormat.format(date);
}
/**
* 时间格式化
* @param localDateTime
* @return
*/
public static String formatDateTime(LocalDateTime localDateTime) {
if (localDateTime == null) {
return "";
@@ -648,6 +695,11 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return formatDateTime(date);
}
/**
* 时间格式化
* @param localTime
* @return
*/
public static String formatDateTime(LocalTime localTime) {
if (localTime == null) {
return "";
@@ -1239,7 +1291,7 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return LocalDateTime.of(
LocalDate.now(),
LocalTime.parse(timeStr, DateTimeFormatter.ofPattern("HH:mm")).withSecond(0)
).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
).format(DEFAULT_DATE_TIME_FORMATTER);
}
@@ -1251,15 +1303,15 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static String convertDateToDateTime(String dateStr) {
LocalDate endLocalDate = LocalDate.parse(dateStr);
LocalDateTime endLocalDateTime = endLocalDate.atStartOfDay();
return endLocalDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
return endLocalDateTime.format(DEFAULT_DATE_TIME_FORMATTER);
}
public static String getEndTime(String dateStr) {
DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate date = LocalDate.parse(dateStr, inputFormatter);
LocalDateTime endTime = date.atTime(23, 59, 59);
DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return endTime.format(outputFormatter);
// DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
return endTime.format(DEFAULT_DATE_TIME_FORMATTER);
}
}

View File

@@ -678,8 +678,8 @@ public class AdapayService {
// if (CollectionUtils.isNotEmpty(withdrawInfoVOS)) {
// totalWithdraw = withdrawInfoVOS.stream().map(WithdrawInfoVO::getCashAmt).reduce(BigDecimal.ZERO, BigDecimal::add);
// }
BigDecimal totalWithdraw = clearingWithdrawInfoService.queryTotalWithdraw(merchantId);
vo.setTotalWithdraw(totalWithdraw);
// BigDecimal totalWithdraw = clearingWithdrawInfoService.queryTotalWithdraw(merchantId);
vo.setTotalWithdraw(clearingWithdrawInfoService.queryTotalWithdraw(merchantId));
// 在途金额
BigDecimal pendingAmount = BigDecimal.ZERO;
@@ -692,6 +692,13 @@ public class AdapayService {
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
vo.setPendingAmount(pendingAmount);
// 查询今天的提现金额
BigDecimal todayWithdrawalAmount = clearingWithdrawInfoService.queryTodayWithdrawalAmount(merchantId);
// 如果大于0则重新更新LastAvlBalance
if (todayWithdrawalAmount.compareTo(BigDecimal.ZERO) > 0) {
vo.setLastAvlBalance(BigDecimal.ZERO.max(vo.getLastAvlBalance().subtract(todayWithdrawalAmount)));
}
return vo;
}

View File

@@ -22,7 +22,7 @@ public class AdapayAccountBalanceVO {
// 冻结余额,当配置了自动结算功能,在每日发起结算时会将可用余额转为冻结金额。该部分金额不允许取现。
private BigDecimal frzBalance;
// 昨日日终余额。
// 昨日日终余额。(页面显示为可提现金额)
private BigDecimal lastAvlBalance;
// 汇付会员id

View File

@@ -1,6 +1,7 @@
package com.jsowell.pile.mapper;
import com.jsowell.pile.domain.AdapayUnsplitRecord;
import com.jsowell.pile.vo.AdapayUnsplitRecordVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -29,4 +30,6 @@ public interface AdapayUnsplitRecordMapper {
int batchInsert(@Param("list") List<AdapayUnsplitRecord> list);
List<AdapayUnsplitRecord> queryUnsplitOrders(@Param("startTime") String startTime, @Param("endTime") String endTime);
List<AdapayUnsplitRecordVO> queryList();
}

View File

@@ -1,6 +1,8 @@
package com.jsowell.pile.service;
import com.jsowell.pile.domain.AdapayUnsplitRecord;
import com.jsowell.pile.vo.AdapayUnsplitRecordVO;
import java.util.List;
public interface AdapayUnsplitRecordService{
@@ -27,4 +29,6 @@ public interface AdapayUnsplitRecordService{
int batchInsert(List<AdapayUnsplitRecord> list);
List<AdapayUnsplitRecord> queryUnsplitOrders(String startTime, String endTime);
List<AdapayUnsplitRecordVO> queryList();
}

View File

@@ -43,4 +43,7 @@ public interface ClearingWithdrawInfoService{
PageResponse queryWithdrawList(QueryWithdrawListDTO dto) throws BaseAdaPayException;
BigDecimal queryTotalWithdraw(String merchantId);
// 获取今日提现总额
BigDecimal queryTodayWithdrawalAmount(String merchantId);
}

View File

@@ -5,7 +5,6 @@ import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.jsowell.adapay.dto.QueryWithdrawListDTO;
import com.jsowell.adapay.service.AdapayService;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.page.PageResponse;
import com.jsowell.common.util.DateUtils;
@@ -13,11 +12,9 @@ import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.domain.ClearingWithdrawInfo;
import com.jsowell.pile.mapper.ClearingWithdrawInfoMapper;
import com.jsowell.pile.service.ClearingWithdrawInfoService;
import com.jsowell.pile.service.PileMerchantInfoService;
import com.jsowell.pile.vo.web.ClearingBillVO;
import com.jsowell.pile.vo.web.WithdrawInfoVO;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -164,4 +161,36 @@ public class ClearingWithdrawInfoServiceImpl implements ClearingWithdrawInfoServ
return clearingWithdrawInfoMapper.queryTotalWithdraw(merchantId);
}
/**
* 查询今日提现总额
* @param merchantId
* @return
*/
@Override
public BigDecimal queryTodayWithdrawalAmount(String merchantId) {
BigDecimal todayWithdrawalAmount = BigDecimal.ZERO;
QueryWithdrawListDTO dto = QueryWithdrawListDTO.builder()
.merchantId(merchantId)
.pageNum(1)
.pageSize(10)
.build();
PageResponse pageResponse = null;
try {
pageResponse = queryWithdrawList(dto);
} catch (BaseAdaPayException e) {
throw new RuntimeException(e);
}
if (pageResponse != null && pageResponse.getList() != null && !pageResponse.getList().isEmpty()) {
List<WithdrawInfoVO> list = (List<WithdrawInfoVO>) pageResponse.getList();
for (WithdrawInfoVO vo : list) {
// 如果applicationTime在当天则加到todayWithdrawalAmount中
if (DateUtils.isToday(vo.getApplicationTime())) {
todayWithdrawalAmount = todayWithdrawalAmount.add(vo.getCashAmt());
}
}
}
return todayWithdrawalAmount;
}
}

View File

@@ -0,0 +1,30 @@
package com.jsowell.pile.vo;
import lombok.Data;
@Data
public class AdapayUnsplitRecordVO {
// 订单号
private String orderCode;
// 支付金额
private String payAmount;
// 结算金额
private String settleAmount;
// 确认分账金额
private String confirmedSplitAmount;
// 待分账金额
private String waitSplitAmount;
// 应退款金额
private String refundAmount;
// 已退款金额
private String paidAmount;
// 待退款金额
private String refundPayAmount;
}

View File

@@ -3,6 +3,7 @@ package com.jsowell.web.controller.pile;
import com.jsowell.pile.domain.AdapayUnsplitRecord;
import com.jsowell.pile.mapper.AdapayUnsplitRecordMapper;
import com.jsowell.pile.service.AdapayUnsplitRecordService;
import com.jsowell.pile.vo.AdapayUnsplitRecordVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -73,4 +74,9 @@ public class AdapayUnsplitRecordServiceImpl implements AdapayUnsplitRecordServic
return adapayUnsplitRecordMapper.queryUnsplitOrders(startTime, endTime);
}
@Override
public List<AdapayUnsplitRecordVO> queryList() {
return adapayUnsplitRecordMapper.queryList();
}
}

View File

@@ -706,4 +706,20 @@
and settle_amount is null
and order_code like 'C%'
</select>
<select id="queryList" resultType="com.jsowell.pile.vo.AdapayUnsplitRecordVO">
SELECT
order_code as orderCode,
pay_amount as payAmount,
settle_amount as settleAmount,
confirmed_split_amount as confirmedSplitAmount,
GREATEST(0, settle_amount - confirmed_split_amount) AS waitSplitAmount,
due_refund_amount as refundAmount,
refund_amount as paidAmount,
GREATEST(0, due_refund_amount - refund_amount) AS refundPayAmount
FROM adapay_unsplit_record
WHERE
(due_refund_amount > confirmed_split_amount)
OR (due_refund_amount > refund_amount)
</select>
</mapper>

View File

@@ -411,11 +411,15 @@ public class JsowellTask {
// processUnSettledOrderOld(); // 旧方法
for (int i = 0; i < 35; i++) {
int batchNum = i + 1;
processUnSettledOrderNew(batchNum); // 新方法
processUnSettledOrderV1(batchNum); // 新方法
}
}
private void processUnSettledOrderNew(int batchNum) {
/**
* V1方法获取退款金额与结算金额
* @param batchNum
*/
private void processUnSettledOrderV1(int batchNum) {
String startTime = "2025-01-01 00:00:00";
String endTime = "2025-12-31 23:59:59";
@@ -456,6 +460,10 @@ public class JsowellTask {
log.info("第{}批次,共更新{}条数据", batchNum, updateList.size());
}
private void processUnSettledOrderV2(int batchNum) {
}
// private void processUnSettledOrderOld() {
// String startTime = "2023-01-01 00:00:00";
// String endTime = "2024-12-31 23:59:59";