From 6322e20ea435ec751d63058d2560a638aa35d896 Mon Sep 17 00:00:00 2001 From: luojiaquan <1583622118@qq.com> Date: Mon, 21 Sep 2026 14:50:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E4=BF=A1=E7=94=A8=E9=A2=9D=E5=BA=A6=EF=BC=8C=E4=B8=B4?= =?UTF-8?q?=E6=97=B6=E9=A2=9D=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/CustomerAccountApiImpl.java | 3 +- .../task/TempCreditExpireTask.java | 46 ++++++------------- .../job_customer_credit_expire.sql | 15 ++++++ 3 files changed, 31 insertions(+), 33 deletions(-) create mode 100644 bms-back/sql/customer+supplier/job_customer_credit_expire.sql diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/api/impl/CustomerAccountApiImpl.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/api/impl/CustomerAccountApiImpl.java index 42929a56..3781910b 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/api/impl/CustomerAccountApiImpl.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/api/impl/CustomerAccountApiImpl.java @@ -294,7 +294,8 @@ public class CustomerAccountApiImpl implements ICustomerAccountApi Long userId = currentUserId(); // 计费开单准入:客户被停用(含删除)时直接拦截,与账户状态接口口径保持一致。 // 仅占用(新增计费)校验;释放/核销等清欠动作不受限,避免客户被停用后无法平账。 - assertCustomerActive(customerId); + //9月20 调整,客户被停用不拦截计费,继续占用信用额度, +// assertCustomerActive(customerId); CustomerAccount account = lockAccountForUsage(customerId, currency, username); if (account == null) { diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/task/TempCreditExpireTask.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/task/TempCreditExpireTask.java index 12e67a7d..a46b6567 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/task/TempCreditExpireTask.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/customer/customermoney/task/TempCreditExpireTask.java @@ -3,22 +3,20 @@ package com.ruoyi.customer.customermoney.task; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.ApplicationArguments; -import org.springframework.boot.ApplicationRunner; -import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import com.ruoyi.customer.customermoney.api.ICustomerAccountApi; /** * 客户授信(信用额度/临时额度)到期自动失效任务。 * - *

每天 01:30 扫描授信已到期(信用或临时额度>0 且失效日期早于今天)的CNY账户, + *

扫描授信已到期(信用或临时额度>0 且失效日期早于今天)的CNY账户, * 逐户独立事务物化失效:额度清零 -> 释放角色额度池 -> 回写客户档案 -> 写 EXPIRE 额度流水。 * 失效日当天额度仍有效,故严格按「早于今天」判断。

* - *

除惰性触发(访问资金接口时即查即失效)外,本任务保证展示口径一致: - * 客户列表可用额度是账户表现算,不经过惰性入口,需由本任务把到期状态落库。 - * 应用启动后也会执行一次,避免停机期间错过调度。

+ *

本任务纳入 RuoYi 定时任务菜单(Quartz / sys_job)统一管理: + * 调用目标为 {@code customerCreditTask.expireCredits()},cron、启停均在 + * 「系统监控 - 定时任务」中配置,不再使用 @Scheduled 硬编码。 + * 除定时调度外,资金接口访问时仍有惰性失效(即查即失效)兜底。

* *

到期不影响已用额度:已确认账单形成的授信占用仍然有效,客户回款核销后 * used_credit 自然下降;可用额度可能短暂为负,新计费开单会被额度校验拦截。

@@ -26,37 +24,21 @@ import com.ruoyi.customer.customermoney.api.ICustomerAccountApi; * @author ruoyi * @date 2026-09-17 */ -@Component -public class TempCreditExpireTask implements ApplicationRunner +@Component("customerCreditTask") +public class TempCreditExpireTask { private static final Logger log = LoggerFactory.getLogger(TempCreditExpireTask.class); @Autowired private ICustomerAccountApi customerAccountApi; - /** 每天 01:30 执行(cron: 秒 分 时 日 月 周) */ - @Scheduled(cron = "0 30 1 * * ?") - public void scheduled() + /** + * 授信到期失效(sys_job 调用目标:customerCreditTask.expireCredits())。 + * 异常直接抛出,由 Quartz 框架记录任务执行失败日志。 + */ + public void expireCredits() { - runExpire(); - } - - @Override - public void run(ApplicationArguments args) - { - runExpire(); - } - - private void runExpire() - { - try - { - int count = customerAccountApi.expireAllDueCredits(); - log.info("客户授信到期失效任务执行完成,失效账户数={}", count); - } - catch (Exception e) - { - log.error("客户授信到期失效任务执行异常", e); - } + int count = customerAccountApi.expireAllDueCredits(); + log.info("客户授信到期失效任务执行完成,失效账户数={}", count); } } diff --git a/bms-back/sql/customer+supplier/job_customer_credit_expire.sql b/bms-back/sql/customer+supplier/job_customer_credit_expire.sql new file mode 100644 index 00000000..ad0ee552 --- /dev/null +++ b/bms-back/sql/customer+supplier/job_customer_credit_expire.sql @@ -0,0 +1,15 @@ +-- ============================================================= +-- 客户授信到期失效 - 纳入 RuoYi 定时任务菜单(Quartz / sys_job) +-- 调用目标:customerCreditTask.expireCredits() +-- cron:每天 01:30(失效日当天仍有效,严格按「早于今天」判断) +-- 幂等:已存在同名调用目标则跳过 +-- ============================================================= +INSERT INTO sys_job + (job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark) +SELECT '客户授信到期失效', 'DEFAULT', 'customerCreditTask.expireCredits()', + '0 30 1 * * ?', '3', '1', '0', 'admin', NOW(), + '每天01:30扫描已到期的信用/临时额度并物化失效(额度清零、释放额度池、写EXPIRE流水);失效日当天仍有效' +FROM DUAL +WHERE NOT EXISTS ( + SELECT 1 FROM sys_job WHERE invoke_target = 'customerCreditTask.expireCredits()' +);