From f529067ae36fb3d0681961682c315cad3e7f70ef Mon Sep 17 00:00:00 2001 From: luojiaquan <1583622118@qq.com> Date: Fri, 18 Sep 2026 18:14:41 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A2=9D=E5=BA=A6=E9=99=90=E5=88=B6=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=EF=BC=8C=E8=AE=A1=E8=B4=B9=E5=90=8E=E9=A2=9D=E5=BA=A6?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E4=B8=BA=E8=B4=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/impl/CustomerAccountApiImpl.java | 36 ++++++++++++-- .../ruoyi/system/domain/BmsExchangeRate.java | 19 ++++---- .../impl/BmsExchangeRateServiceImpl.java | 19 ++++---- .../customerinfo/customermoney/index.vue | 15 +++--- .../src/views/data/exchangerate/index.vue | 47 +++---------------- 5 files changed, 69 insertions(+), 67 deletions(-) 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 a3b8587b..5119fbdb 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 @@ -249,6 +249,9 @@ public class CustomerAccountApiImpl implements ICustomerAccountApi String currency = resolveCurrency(command.getCurrency()); String username = currentUsername(); Long userId = currentUserId(); + // 计费开单准入:客户被停用(含删除)时直接拦截,与账户状态接口口径保持一致。 + // 仅占用(新增计费)校验;释放/核销等清欠动作不受限,避免客户被停用后无法平账。 + assertCustomerActive(customerId); CustomerAccount account = lockAccountForUsage(customerId, currency, username); if (account == null) { @@ -259,10 +262,20 @@ public class CustomerAccountApiImpl implements ICustomerAccountApi BigDecimal beforeUsed = nz(account.getUsedCredit()); BigDecimal totalAvailable = nz(account.getTotalCredit()).add(nz(account.getExtraCredit())) .subtract(beforeUsed); - if (Boolean.TRUE.equals(command.getCheckAvailable()) && totalAvailable.compareTo(amount) < 0) + if (Boolean.TRUE.equals(command.getCheckAvailable())) { - throw new ServiceException("客户可用额度不足,当前可用额度:" + totalAvailable.toPlainString() - + " " + currency + ",本次需占用:" + amount.toPlainString()); + // 已处于超额(欠费)状态:可用额度已为负,任何新增计费一律拦截 + if (totalAvailable.compareTo(BigDecimal.ZERO) < 0) + { + throw new ServiceException("客户已超额(欠费),当前可用额度:" + totalAvailable.toPlainString() + + " " + currency + ",请先回款核销恢复额度后再计费开单"); + } + if (totalAvailable.compareTo(amount) < 0) + { + throw new ServiceException("客户可用额度不足,当前可用额度:" + totalAvailable.toPlainString() + + " " + currency + ",本次需占用:" + amount.toPlainString() + + ",请回款核销或申请调整额度"); + } } BigDecimal afterUsed = beforeUsed.add(amount).setScale(MONEY_SCALE, RoundingMode.HALF_UP); account.setUsedCredit(afterUsed); @@ -558,6 +571,23 @@ public class CustomerAccountApiImpl implements ICustomerAccountApi customerMoneyMapper.insertCreditFlow(flow); } + /** + * 计费开单准入:客户档案必须存在且为启用状态(is_enable='0')。 + * 删除(del_flag='1',查询返回null)或停用(is_enable='1')均拒绝新增授信占用。 + */ + private void assertCustomerActive(Long customerId) + { + BmsCustomer customer = bmsCustomerMapper.selectBmsCustomerByCustomerId(customerId); + if (customer == null) + { + throw new ServiceException("客户不存在或已删除,不可计费开单(客户ID:" + customerId + ")"); + } + if ("1".equals(customer.getIsEnable())) + { + throw new ServiceException("客户【" + customer.getCustomerName() + "】已停用,不可计费开单"); + } + } + private void validateUsageCommand(CreditUsageCommand command) { if (command == null || (command.getCustomerId() == null && !StringUtils.hasText(command.getCustomerCode()))) diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/domain/BmsExchangeRate.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/domain/BmsExchangeRate.java index cfa4ee5d..fdbfca70 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/domain/BmsExchangeRate.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/domain/BmsExchangeRate.java @@ -22,14 +22,15 @@ public class BmsExchangeRate extends BaseEntity /** 系统本位币 */ public static final String BASE_CURRENCY = "CNY"; - /** 汇率类型:即期汇率 */ + /** 汇率类型:即期汇率(当前系统仅启用即期汇率) */ public static final String RATE_TYPE_SPOT = "0"; - /** 汇率类型:月初汇率 */ - public static final String RATE_TYPE_MONTH_BEGIN = "1"; - /** 汇率类型:月末汇率 */ - public static final String RATE_TYPE_MONTH_END = "2"; - /** 汇率类型:固定汇率 */ - public static final String RATE_TYPE_FIXED = "3"; + // 月初/月末/固定汇率暂不启用,先只做即期,后续需要时再恢复: + // /** 汇率类型:月初汇率 */ + // public static final String RATE_TYPE_MONTH_BEGIN = "1"; + // /** 汇率类型:月末汇率 */ + // public static final String RATE_TYPE_MONTH_END = "2"; + // /** 汇率类型:固定汇率 */ + // public static final String RATE_TYPE_FIXED = "3"; /** 汇率ID */ private Long rateId; @@ -42,8 +43,8 @@ public class BmsExchangeRate extends BaseEntity @Excel(name = "目标币种") private String toCurrency; - /** 汇率类型(0即期 1月初 2月末 3固定) */ - @Excel(name = "汇率类型", readConverterExp = "0=即期汇率,1=月初汇率,2=月末汇率,3=固定汇率") + /** 汇率类型(当前仅 0即期;月初/月末/固定暂不启用) */ + @Excel(name = "汇率类型", readConverterExp = "0=即期汇率") private String rateType; /** 汇率值(1源币种=?目标币种) */ diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BmsExchangeRateServiceImpl.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BmsExchangeRateServiceImpl.java index f1ec4516..6c473ad0 100644 --- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BmsExchangeRateServiceImpl.java +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/BmsExchangeRateServiceImpl.java @@ -31,6 +31,8 @@ public class BmsExchangeRateServiceImpl implements IBmsExchangeRateService @Override public List selectExchangeRateList(BmsExchangeRate exchangeRate) { + // 当前仅启用即期汇率:列表/导出只展示即期配置 + exchangeRate.setRateType(BmsExchangeRate.RATE_TYPE_SPOT); return exchangeRateMapper.selectExchangeRateList(exchangeRate); } @@ -77,7 +79,9 @@ public class BmsExchangeRateServiceImpl implements IBmsExchangeRateService { String from = normalizeCurrency(fromCurrency); String to = normalizeCurrency(toCurrency); - String type = StringUtils.isNotEmpty(rateType) ? rateType : BmsExchangeRate.RATE_TYPE_SPOT; + // 当前系统只启用即期汇率:忽略外部传入的 rateType,统一按即期处理。 + // 后续启用月初/月末/固定汇率时,恢复为:StringUtils.isNotEmpty(rateType) ? rateType : RATE_TYPE_SPOT + String type = BmsExchangeRate.RATE_TYPE_SPOT; Date date = truncateToDay(bizDate != null ? bizDate : DateUtils.getNowDate()); // 同币种 @@ -212,10 +216,8 @@ public class BmsExchangeRateServiceImpl implements IBmsExchangeRateService { rate.setFromCurrency(normalizeCurrency(rate.getFromCurrency())); rate.setToCurrency(normalizeCurrency(rate.getToCurrency())); - if (StringUtils.isEmpty(rate.getRateType())) - { - rate.setRateType(BmsExchangeRate.RATE_TYPE_SPOT); - } + // 当前仅启用即期汇率,新增/编辑统一落即期(月初/月末/固定暂不启用) + rate.setRateType(BmsExchangeRate.RATE_TYPE_SPOT); if (StringUtils.isEmpty(rate.getSource())) { rate.setSource("手工录入"); @@ -273,9 +275,10 @@ public class BmsExchangeRateServiceImpl implements IBmsExchangeRateService { switch (type) { - case BmsExchangeRate.RATE_TYPE_MONTH_BEGIN: return "月初汇率"; - case BmsExchangeRate.RATE_TYPE_MONTH_END: return "月末汇率"; - case BmsExchangeRate.RATE_TYPE_FIXED: return "固定汇率"; + // 月初/月末/固定汇率暂不启用,先只做即期: + // case BmsExchangeRate.RATE_TYPE_MONTH_BEGIN: return "月初汇率"; + // case BmsExchangeRate.RATE_TYPE_MONTH_END: return "月末汇率"; + // case BmsExchangeRate.RATE_TYPE_FIXED: return "固定汇率"; case BmsExchangeRate.RATE_TYPE_SPOT: default: return "即期汇率"; } diff --git a/bms-front/src/views/customersuppliermanagement/customerinfo/customermoney/index.vue b/bms-front/src/views/customersuppliermanagement/customerinfo/customermoney/index.vue index c02d32ef..87b9b0f0 100644 --- a/bms-front/src/views/customersuppliermanagement/customerinfo/customermoney/index.vue +++ b/bms-front/src/views/customersuppliermanagement/customerinfo/customermoney/index.vue @@ -295,13 +295,14 @@ - - - + + + + + + + + @@ -61,11 +56,6 @@ - - - - - @@ -97,11 +87,6 @@ {{ scope.row.toCurrency }} - - -