From b722014829db579d3d5ba6d6b674c4188c8feab9 Mon Sep 17 00:00:00 2001 From: terrfly Date: Wed, 29 Mar 2023 11:37:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E8=B4=A6=E8=A1=A5=E5=8D=95=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PayOrderDivisionRecordReissueTask.java | 118 ++++++++++++++++++ .../mapper/PayOrderDivisionRecordMapper.java | 6 + .../mapper/PayOrderDivisionRecordMapper.xml | 15 +++ 3 files changed, 139 insertions(+) create mode 100644 jeepay-payment/src/main/java/com/jeequan/jeepay/pay/task/PayOrderDivisionRecordReissueTask.java diff --git a/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/task/PayOrderDivisionRecordReissueTask.java b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/task/PayOrderDivisionRecordReissueTask.java new file mode 100644 index 0000000..e72dad6 --- /dev/null +++ b/jeepay-payment/src/main/java/com/jeequan/jeepay/pay/task/PayOrderDivisionRecordReissueTask.java @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2021-2031, 河北计全科技有限公司 (https://www.jeequan.com & jeequan@126.com). + *

+ * Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.gnu.org/licenses/lgpl.html + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.jeequan.jeepay.pay.task; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.jeequan.jeepay.core.entity.PayOrderDivisionRecord; +import com.jeequan.jeepay.service.impl.PayOrderDivisionRecordService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; + +/* +* 分账补单定时任务 +* +* @author terrfly +* @site https://www.jeequan.com +* @date 2023/3/29 11:35 +*/ +@Slf4j +@Component +public class PayOrderDivisionRecordReissueTask { + + private static final int QUERY_PAGE_SIZE = 100; //每次查询数量 + + @Autowired private PayOrderDivisionRecordService payOrderDivisionRecordService; + + @Scheduled(cron="0 0/1 * * * ?") // 每分钟执行一次 + public void start() { + + log.info("处理分账补单任务 开始"); + + //当前时间 减去5分钟。 + Date offsetDate = DateUtil.offsetMinute(new Date(), -5); + + //查询条件: 受理中的订单 & ( 订单创建时间 + 5分钟 >= 当前时间 ) + LambdaQueryWrapper lambdaQueryWrapper = PayOrderDivisionRecord.gw(). + eq(PayOrderDivisionRecord::getState, PayOrderDivisionRecord.STATE_ACCEPT).le(PayOrderDivisionRecord::getCreatedAt, offsetDate); + + int currentPageIndex = 1; //当前页码 + + while(true){ + + try { + + IPage pageRecordList = payOrderDivisionRecordService.getBaseMapper().distinctBatchOrderIdList(new Page(currentPageIndex, QUERY_PAGE_SIZE), lambdaQueryWrapper); + + log.info("处理分账补单任务, 共计{}条", pageRecordList.getTotal()); + + //本次查询无结果, 不再继续查询; + if(pageRecordList == null || pageRecordList.getRecords() == null || pageRecordList.getRecords().isEmpty()){ + break; + } + + for(PayOrderDivisionRecord batchRecord: pageRecordList.getRecords()){ + + try { + String batchOrderId = batchRecord.getBatchOrderId(); + + // 通过 batchId 查询出列表( 注意: 需要按照ID 排序!!!! ) + List recordList = payOrderDivisionRecordService.list(PayOrderDivisionRecord.gw() + .eq(PayOrderDivisionRecord::getState, PayOrderDivisionRecord.STATE_ACCEPT) + .eq(PayOrderDivisionRecord::getBatchOrderId, batchOrderId) + .orderByAsc(PayOrderDivisionRecord::getRecordId) + ); + + if(recordList == null || recordList.isEmpty()){ + continue; + } + + // 调用渠道侧的查单接口: 注意: 渠道内需保证: + // 1. 返回的条目 必须全部来自recordList, 可以少于recordList但是不得高于 recordList 数量; + // 2. recordList 的记录可能与接口返回的数量不一致, 接口实现不要求对条目数量做验证; + // 3. 接口查询的记录若recordList 不存在, 忽略即可。 ( 例如两条相同的accNo, 则可能仅匹配一条。 那么另外一条将在下一次循环中处理。 ) + // 4. 仅明确状态的再返回,若不明确则不需返回; + +// channelOrderReissueService.processPayOrder(payOrder); + + } catch (Exception e1) { + log.error("处理补单任务单条[{}]异常", batchRecord.getBatchOrderId(), e1); + } + } + + //已经到达页码最大量,无需再次查询 + if(pageRecordList.getPages() <= currentPageIndex){ + break; + } + currentPageIndex++; + + + } catch (Exception e) { //出现异常,直接退出,避免死循环。 + log.error("处理分账补单任务, error", e); + break; + } + + } + } + +} diff --git a/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.java b/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.java index 5f9ed16..a8c4e6b 100644 --- a/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.java +++ b/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.java @@ -1,7 +1,10 @@ package com.jeequan.jeepay.service.mapper; +import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.jeequan.jeepay.core.entity.PayOrderDivisionRecord; +import org.apache.ibatis.annotations.Param; /** *

@@ -16,4 +19,7 @@ public interface PayOrderDivisionRecordMapper extends BaseMapper distinctBatchOrderIdList(IPage page, @Param("ew") Wrapper wrapper); + } diff --git a/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.xml b/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.xml index 36b9acc..94fd80d 100644 --- a/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.xml +++ b/jeepay-service/src/main/java/com/jeequan/jeepay/service/mapper/PayOrderDivisionRecordMapper.xml @@ -40,4 +40,19 @@ + + + + +