From 56340d0ea0633f3a1e3bb9be6be7d9c3429ace71 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Wed, 28 Oct 2026 22:09:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A5=97=E9=A4=90=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E7=89=88=E6=9C=AC=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/i18n/messages.properties | 1 + .../service/impl/PrcPriceSetServiceImpl.java | 51 +++++++- .../set/components/create/StepDetails.vue | 8 +- .../detail/SetVersionDetailDrawer.vue | 3 +- .../set/components/detail/SetVersionTable.vue | 37 ++++-- bms-front/src/views/price/set/create.vue | 7 +- bms-front/src/views/price/set/detail.vue | 117 +++++++++++++----- 7 files changed, 177 insertions(+), 47 deletions(-) diff --git a/bms-back/bms-admin/src/main/resources/i18n/messages.properties b/bms-back/bms-admin/src/main/resources/i18n/messages.properties index 140ebd22..fe2ceafc 100644 --- a/bms-back/bms-admin/src/main/resources/i18n/messages.properties +++ b/bms-back/bms-admin/src/main/resources/i18n/messages.properties @@ -205,6 +205,7 @@ price.bill.fee.idRequired=费用ID不能为空 price.set.version.effectiveTime.empty=版本生效时间不能为空 price.set.version.effectiveTime.beforePrev=生效时间不能早于上一版本的生效时间 +price.set.version.effectiveTime.hitBoundary=生效时间不能与已有版本的生效时间或失效时间相同 price.set.version.notExists=套餐版本不存在 price.set.version.activate.statusNotAllowed=仅草稿或待生效版本可设置生效时间 price.set.version.delete.statusNotAllowed=仅草稿、待生效或已生效版本可删除 diff --git a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java index dc84b7b4..399fea03 100644 --- a/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java +++ b/bms-back/bms-system/src/main/java/com/bms/price/service/impl/PrcPriceSetServiceImpl.java @@ -401,10 +401,20 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService { throw new ServiceException(MessageUtils.message("price.set.edit.stopped")); } - Date prevEffective = findPrevVersionEffectiveTime(version); - if (prevEffective != null && effectiveTime.before(prevEffective)) + boolean importFresh = "IMPORT_FRESH".equalsIgnoreCase(StringUtils.trim(version.getPriceBuildMode())); + if (importFresh) { - throw new ServiceException(MessageUtils.message("price.set.version.effectiveTime.beforePrev")); + // May start inside a prior version window; forbid equal to any other version's eff/exp. + // refreshVersionStatus then sets B.expire=A.eff, A.expire=B.oldExpire and syncs children. + validateImportFreshActivateTime(version, effectiveTime); + } + else + { + Date prevEffective = findPrevVersionEffectiveTime(version); + if (prevEffective != null && effectiveTime.before(prevEffective)) + { + throw new ServiceException(MessageUtils.message("price.set.version.effectiveTime.beforePrev")); + } } // Set schedule; refreshVersionStatus decides PENDING(3) vs EFFECT(1) and chains expire_time version.setEffectiveTime(effectiveTime); @@ -415,6 +425,41 @@ public class PrcPriceSetServiceImpl implements IPrcPriceSetService return 1; } + /** + * IMPORT_FRESH activate: allow effective time earlier than prev-by-seq (incl. inside prior window B). + * Must not equal any other timed version's effectiveTime or expireTime. + */ + private void validateImportFreshActivateTime(PrcPriceSetVersion version, Date effectiveTime) + { + if (version == null || version.getPriceSetId() == null || effectiveTime == null) + { + return; + } + PrcPriceSetVersion q = new PrcPriceSetVersion(); + q.setPriceSetId(version.getPriceSetId()); + q.setPriceType(com.bms.price.domain.PriceType.SALES); + List list = versionMapper.selectPrcPriceSetVersionList(q); + if (list == null || list.isEmpty()) + { + return; + } + for (PrcPriceSetVersion v : list) + { + if (v == null) + { + continue; + } + if (version.getPsvId() != null && version.getPsvId().equals(v.getPsvId())) + { + continue; + } + if (sameTime(v.getEffectiveTime(), effectiveTime) || sameTime(v.getExpireTime(), effectiveTime)) + { + throw new ServiceException(MessageUtils.message("price.set.version.effectiveTime.hitBoundary")); + } + } + } + /** Previous version (lower version_seq) effective_time; null if none. */ private Date findPrevVersionEffectiveTime(PrcPriceSetVersion version) { diff --git a/bms-front/src/views/price/set/components/create/StepDetails.vue b/bms-front/src/views/price/set/components/create/StepDetails.vue index 9a42c765..3cddc5f8 100644 --- a/bms-front/src/views/price/set/components/create/StepDetails.vue +++ b/bms-front/src/views/price/set/components/create/StepDetails.vue @@ -58,6 +58,7 @@
按产品库基础价生成套餐产品列表,可再导入 Excel 修改价格