From ba8170046301d57ea3f5ed573b4ef8d0cb7af3d8 Mon Sep 17 00:00:00 2001
From: wuweihua <88888888>
Date: Tue, 22 Sep 2026 10:15:17 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=99=84=E5=8A=A0=E8=B4=B9?=
=?UTF-8?q?=E6=93=8D=E4=BD=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/price/SurchargeController.java | 32 +++-
.../price/mapper/PrcSurchargeMapper.java | 8 +-
.../price/mapper/PrcSurchargeRelMapper.java | 4 +
.../price/service/IPrcSurchargeService.java | 9 +-
.../service/impl/PrcSurchargeServiceImpl.java | 126 +++++++++++++--
.../PrcPriceSetVersionSurchargeMapper.xml | 2 +-
.../mapper/price/PrcSurchargeMapper.xml | 40 ++---
.../mapper/price/PrcSurchargeRelMapper.xml | 7 +
bms-front/src/api/price/surcharge.js | 16 +-
.../src/views/price/basic/product/index.vue | 3 -
.../components/SurchargeFormDialog.vue | 14 +-
.../components/SurchargeVoidDrawer.vue | 149 ++++++++++++++++++
.../src/views/price/basic/surcharge/index.vue | 79 ++++++----
.../set/components/create/StepDetails.vue | 6 +-
14 files changed, 397 insertions(+), 98 deletions(-)
create mode 100644 bms-front/src/views/price/basic/surcharge/components/SurchargeVoidDrawer.vue
diff --git a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/SurchargeController.java b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/SurchargeController.java
index 525700cc..1822255d 100644
--- a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/SurchargeController.java
+++ b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/SurchargeController.java
@@ -108,20 +108,42 @@ public class SurchargeController extends BaseController
return toAjax(surchargeService.insertPrcSurcharge(surcharge));
}
+ /**
+ * 修改(版本化):内容无变化时返回 warn 提示,否则原记录作废 + 插入新记录,产品关联自动重指向新记录。
+ */
@PreAuthorize("@ss.hasPermi('price:surcharge:edit')")
@Log(title = "附加费配置", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@Validated @RequestBody PrcSurcharge surcharge)
{
surcharge.setUpdateBy(getUsername());
- return toAjax(surchargeService.updatePrcSurcharge(surcharge));
+ int rows = surchargeService.updatePrcSurcharge(surcharge);
+ if (rows == -1)
+ {
+ return AjaxResult.warn("未做任何修改");
+ }
+ return toAjax(rows);
}
+ /**
+ * 停用(原地修改 ss_code=of,不新增数据,不物理删除)。
+ */
@PreAuthorize("@ss.hasPermi('price:surcharge:remove')")
- @Log(title = "附加费配置", businessType = BusinessType.DELETE)
- @DeleteMapping("/{scIds}")
- public AjaxResult remove(@PathVariable Long[] scIds)
+ @Log(title = "附加费停用", businessType = BusinessType.UPDATE)
+ @PutMapping("/disable/{scIds}")
+ public AjaxResult disable(@PathVariable Long[] scIds)
{
- return toAjax(surchargeService.deletePrcSurchargeByIds(scIds));
+ return toAjax(surchargeService.disablePrcSurchargeByIds(scIds, getUsername()));
+ }
+
+ /**
+ * 启用(原地修改 ss_code=on,不新增数据)。
+ */
+ @PreAuthorize("@ss.hasPermi('price:surcharge:remove')")
+ @Log(title = "附加费启用", businessType = BusinessType.UPDATE)
+ @PutMapping("/enable/{scIds}")
+ public AjaxResult enable(@PathVariable Long[] scIds)
+ {
+ return toAjax(surchargeService.enablePrcSurchargeByIds(scIds, getUsername()));
}
}
diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeMapper.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeMapper.java
index 4f74b137..52c301c4 100644
--- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeMapper.java
+++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeMapper.java
@@ -1,11 +1,14 @@
package com.ruoyi.price.mapper;
import java.util.List;
+import org.apache.ibatis.annotations.Param;
import com.ruoyi.price.domain.PrcSurcharge;
/**
* 附加费配置 数据层
*
+ * 附加费为计费主数据:不做物理修改/删除,编辑=作废旧记录插入新记录,删除=仅作废。
+ *
* @author ruoyi
*/
public interface PrcSurchargeMapper
@@ -16,7 +19,6 @@ public interface PrcSurchargeMapper
public int insertPrcSurcharge(PrcSurcharge surcharge);
- public int updatePrcSurcharge(PrcSurcharge surcharge);
-
- public int deletePrcSurchargeByIds(Long[] scIds);
+ /** 状态原地更新(不新增数据):停用置 of,版本化作废旧记录置 vd */
+ public int updateSsCodeByIds(@Param("scIds") Long[] scIds, @Param("ssCode") String ssCode, @Param("operator") String operator);
}
diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeRelMapper.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeRelMapper.java
index 529ba8c9..a3fc8383 100644
--- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeRelMapper.java
+++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeRelMapper.java
@@ -1,6 +1,7 @@
package com.ruoyi.price.mapper;
import java.util.List;
+import org.apache.ibatis.annotations.Param;
import com.ruoyi.price.domain.PrcSurchargeRel;
/**
@@ -21,4 +22,7 @@ public interface PrcSurchargeRelMapper
/** 删除产品时清理其关联 */
public int deleteRelByProductCodes(String[] productCodes);
+
+ /** 附加费版本化编辑后,把产品关联从旧记录重指向新记录 */
+ public int rebindRelScId(@Param("oldScId") Long oldScId, @Param("newScId") Long newScId, @Param("operator") String operator);
}
diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/IPrcSurchargeService.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/IPrcSurchargeService.java
index 510b5094..f42b7b6c 100644
--- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/IPrcSurchargeService.java
+++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/IPrcSurchargeService.java
@@ -6,6 +6,8 @@ import com.ruoyi.price.domain.PrcSurcharge;
/**
* 附加费配置 服务层
*
+ * 附加费为计费主数据:编辑=原记录作废+插入新记录(版本化),删除=仅作废不物理删除。
+ *
* @author ruoyi
*/
public interface IPrcSurchargeService
@@ -16,7 +18,12 @@ public interface IPrcSurchargeService
public int insertPrcSurcharge(PrcSurcharge surcharge);
+ /** 版本化更新:原记录作废(ss_code=vd),插入新记录,产品关联重指向新记录;状态继承原记录 */
public int updatePrcSurcharge(PrcSurcharge surcharge);
- public int deletePrcSurchargeByIds(Long[] scIds);
+ /** 停用(原地修改 ss_code=of,不新增数据) */
+ public int disablePrcSurchargeByIds(Long[] scIds, String operator);
+
+ /** 启用(原地修改 ss_code=on,不新增数据) */
+ public int enablePrcSurchargeByIds(Long[] scIds, String operator);
}
diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcSurchargeServiceImpl.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcSurchargeServiceImpl.java
index 069e54f5..1be3cf31 100644
--- a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcSurchargeServiceImpl.java
+++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcSurchargeServiceImpl.java
@@ -3,24 +3,36 @@ package com.ruoyi.price.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.MessageUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.price.domain.PrcSurcharge;
import com.ruoyi.price.mapper.PrcSurchargeMapper;
+import com.ruoyi.price.mapper.PrcSurchargeRelMapper;
import com.ruoyi.price.service.IPrcSurchargeService;
/**
* 附加费配置 服务层实现
*
+ * 附加费为计费主数据,不做物理修改/删除:
+ * - 编辑 = 原记录作废(ss_code=vd)+ 插入新记录(状态继承),产品关联重指向新记录(保留变更历史)
+ * - 停用 = 原地修改 ss_code=of,不新增数据
+ *
* @author ruoyi
*/
@Service
public class PrcSurchargeServiceImpl implements IPrcSurchargeService
{
+ /** 作废状态:区别于启用(on)/停用(of),列表默认不显示 */
+ public static final String SS_CODE_VOID = "vd";
+
@Autowired
private PrcSurchargeMapper surchargeMapper;
+ @Autowired
+ private PrcSurchargeRelMapper surchargeRelMapper;
+
@Override
public PrcSurcharge selectPrcSurchargeById(Long scId)
{
@@ -37,6 +49,106 @@ public class PrcSurchargeServiceImpl implements IPrcSurchargeService
public int insertPrcSurcharge(PrcSurcharge surcharge)
{
validate(surcharge);
+ applyInsertDefaults(surcharge);
+ return surchargeMapper.insertPrcSurcharge(surcharge);
+ }
+
+ /**
+ * 版本化更新:内容无变化时返回 -1(不产生新版本),否则原记录作废 + 插入新记录 + 产品关联重指向。
+ */
+ @Override
+ @Transactional
+ public int updatePrcSurcharge(PrcSurcharge surcharge)
+ {
+ validate(surcharge);
+ PrcSurcharge old = surchargeMapper.selectPrcSurchargeById(surcharge.getScId());
+ if (old == null)
+ {
+ throw new ServiceException("附加费不存在或已被作废,无法修改");
+ }
+ // 无实际变化:不置作废、不插新记录,返回 -1 由 Controller 提示"未修改"
+ if (isUnchanged(old, surcharge))
+ {
+ return -1;
+ }
+ String operator = StringUtils.isNotEmpty(surcharge.getUpdateBy()) ? surcharge.getUpdateBy() : surcharge.getCreateBy();
+ // 1. 原记录作废(保留历史)
+ surchargeMapper.updateSsCodeByIds(new Long[] { surcharge.getScId() }, SS_CODE_VOID, operator);
+ // 2. 按表单内容插入新记录(状态继承原记录,状态变更只能走列表停用操作)
+ PrcSurcharge fresh = new PrcSurcharge();
+ fresh.setScName(surcharge.getScName());
+ fresh.setFeeType(StringUtils.isNotEmpty(surcharge.getFeeType()) ? surcharge.getFeeType() : old.getFeeType());
+ fresh.setChargeType(surcharge.getChargeType());
+ fresh.setChargeValue(surcharge.getChargeValue());
+ fresh.setCurrency(surcharge.getCurrency());
+ fresh.setRoundMode(surcharge.getRoundMode());
+ fresh.setSsCode(old.getSsCode());
+ fresh.setCountryCode(surcharge.getCountryCode());
+ fresh.setScNote(surcharge.getScNote());
+ applyInsertDefaults(fresh);
+ fresh.setCreateBy(operator);
+ int rows = surchargeMapper.insertPrcSurcharge(fresh);
+ // 3. 产品关联重指向新记录,保持产品附加费配置不失效
+ surchargeRelMapper.rebindRelScId(surcharge.getScId(), fresh.getScId(), operator);
+ return rows;
+ }
+
+ /** 逐字段比对编辑内容与原记录是否一致(字符串 trim 后比较,数值统一 BigDecimal 比较) */
+ private boolean isUnchanged(PrcSurcharge old, PrcSurcharge updated)
+ {
+ return eq(old.getScName(), updated.getScName())
+ && eq(old.getFeeType(), updated.getFeeType())
+ && eq(old.getChargeType(), updated.getChargeType())
+ && eqDecimal(old.getChargeValue(), updated.getChargeValue())
+ && eq(old.getCurrency(), updated.getCurrency())
+ && eq(old.getRoundMode(), updated.getRoundMode())
+ && eq(old.getCountryCode(), updated.getCountryCode())
+ && eq(old.getScNote(), updated.getScNote());
+ }
+
+ private boolean eq(String a, String b)
+ {
+ String sa = a == null ? "" : a.trim();
+ String sb = b == null ? "" : b.trim();
+ return sa.equals(sb);
+ }
+
+ private boolean eqDecimal(java.math.BigDecimal a, java.math.BigDecimal b)
+ {
+ if (a == null && b == null) return true;
+ if (a == null || b == null) return false;
+ return a.compareTo(b) == 0;
+ }
+
+ /**
+ * 停用(原地修改 ss_code=of,不新增数据、不动产品关联)。
+ */
+ @Override
+ public int disablePrcSurchargeByIds(Long[] scIds, String operator)
+ {
+ return updateStatusByIds(scIds, "of", operator);
+ }
+
+ /**
+ * 启用(原地修改 ss_code=on,不新增数据)。
+ */
+ @Override
+ public int enablePrcSurchargeByIds(Long[] scIds, String operator)
+ {
+ return updateStatusByIds(scIds, "on", operator);
+ }
+
+ private int updateStatusByIds(Long[] scIds, String ssCode, String operator)
+ {
+ if (scIds == null || scIds.length == 0)
+ {
+ return 0;
+ }
+ return surchargeMapper.updateSsCodeByIds(scIds, ssCode, operator);
+ }
+
+ private void applyInsertDefaults(PrcSurcharge surcharge)
+ {
if (StringUtils.isEmpty(surcharge.getSsCode()))
{
surcharge.setSsCode("on");
@@ -49,20 +161,6 @@ public class PrcSurchargeServiceImpl implements IPrcSurchargeService
{
surcharge.setRoundMode("HALF_UP");
}
- return surchargeMapper.insertPrcSurcharge(surcharge);
- }
-
- @Override
- public int updatePrcSurcharge(PrcSurcharge surcharge)
- {
- validate(surcharge);
- return surchargeMapper.updatePrcSurcharge(surcharge);
- }
-
- @Override
- public int deletePrcSurchargeByIds(Long[] scIds)
- {
- return surchargeMapper.deletePrcSurchargeByIds(scIds);
}
private void validate(PrcSurcharge surcharge)
diff --git a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcPriceSetVersionSurchargeMapper.xml b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcPriceSetVersionSurchargeMapper.xml
index 23212985..bd25b3fd 100644
--- a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcPriceSetVersionSurchargeMapper.xml
+++ b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcPriceSetVersionSurchargeMapper.xml
@@ -161,7 +161,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where d.psv_id = #{psvId}
and ifnull(s.sc_name, '') <> ''
and s.charge_value is not null
- and lower(ifnull(s.ss_code, '')) <> 'of'
+ and lower(ifnull(s.ss_code, '')) not in ('of', 'vd')
and (r.detail_id is null or r.detail_id = d.product_country_id)
and (
s.country_code is null or s.country_code = ''
diff --git a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeMapper.xml b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeMapper.xml
index feb85dae..17f6d3fd 100644
--- a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeMapper.xml
+++ b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeMapper.xml
@@ -48,9 +48,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
AND round_mode = #{roundMode}
-
- AND ss_code = #{ssCode}
-
+
+
+ AND lower(ss_code) = lower(#{ssCode})
+
+
+
+ AND lower(ifnull(ss_code, '')) <> 'vd'
+
+
AND country_code = #{countryCode}
@@ -91,30 +97,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
)
-
+
+
update prc_surcharge
-
- sc_name = #{scName},
- fee_type = #{feeType},
- charge_type = #{chargeType},
- charge_value = #{chargeValue},
- currency = #{currency},
- round_mode = #{roundMode},
- ss_code = #{ssCode},
- country_code = #{countryCode},
- sc_note = #{scNote},
- tms_id = #{tmsId},
- updated_by = #{updateBy},
- update_time = sysdate()
-
- where sc_id = #{scId}
-
-
-
- delete from prc_surcharge where sc_id in
-
+ set ss_code = #{ssCode}, updated_by = #{operator}, update_time = sysdate()
+ where sc_id in
+
#{scId}
-
+
diff --git a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeRelMapper.xml b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeRelMapper.xml
index eb3fe1fb..5cc4ba21 100644
--- a/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeRelMapper.xml
+++ b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeRelMapper.xml
@@ -81,4 +81,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
+
+ update prc_surcharge_rel
+ set sc_id = #{newScId}, updated_by = #{operator}, update_time = sysdate()
+ where sc_id = #{oldScId}
+
+
diff --git a/bms-front/src/api/price/surcharge.js b/bms-front/src/api/price/surcharge.js
index 06ea5207..cae0d1ad 100644
--- a/bms-front/src/api/price/surcharge.js
+++ b/bms-front/src/api/price/surcharge.js
@@ -71,10 +71,18 @@ export function updateSurcharge(data) {
})
}
-/** 删除附加费配置 */
-export function delSurcharge(scIds) {
+/** 停用附加费配置(原地修改 ss_code=of,不新增数据、不物理删除) */
+export function disableSurcharge(scIds) {
return request({
- url: '/price/surcharge/' + scIds,
- method: 'delete'
+ url: '/price/surcharge/disable/' + scIds,
+ method: 'put'
+ })
+}
+
+/** 启用附加费配置(原地修改 ss_code=on,不新增数据) */
+export function enableSurcharge(scIds) {
+ return request({
+ url: '/price/surcharge/enable/' + scIds,
+ method: 'put'
})
}
diff --git a/bms-front/src/views/price/basic/product/index.vue b/bms-front/src/views/price/basic/product/index.vue
index 6d23a4d1..be6ef634 100644
--- a/bms-front/src/views/price/basic/product/index.vue
+++ b/bms-front/src/views/price/basic/product/index.vue
@@ -19,9 +19,6 @@
新建产品
-
- 修改
-
导入 Excel
diff --git a/bms-front/src/views/price/basic/surcharge/components/SurchargeFormDialog.vue b/bms-front/src/views/price/basic/surcharge/components/SurchargeFormDialog.vue
index 9d2877a1..41082411 100644
--- a/bms-front/src/views/price/basic/surcharge/components/SurchargeFormDialog.vue
+++ b/bms-front/src/views/price/basic/surcharge/components/SurchargeFormDialog.vue
@@ -100,16 +100,6 @@ const schemas = computed(() => [
width: '100%',
props: { filterable: true, clearable: true }
},
- {
- label: "状态",
- prop: 'ssCode',
- component: 'radio',
- span: 12,
- options: [
- { label: "有效", value: 'on' },
- { label: "停用", value: 'of' }
- ]
- },
{
label: "备注",
prop: 'scNote',
@@ -130,7 +120,6 @@ function emptyForm() {
chargeValue: undefined,
currency: 'CNY',
roundMode: 'HALF_UP',
- ssCode: 'on',
countryCode: undefined,
scNote: undefined
}
@@ -163,7 +152,6 @@ function open(row) {
}
getSurcharge(row.scId).then(res => {
const data = res.data || {}
- if (data.ssCode) data.ssCode = String(data.ssCode).toLowerCase()
form.value = { ...emptyForm(), ...data }
title.value = "修改附加费"
visible.value = true
@@ -182,6 +170,8 @@ function submitForm() {
proxy.$modal.msgSuccess(payload.scId != null ? "修改成功" : "新增成功")
visible.value = false
emit('success')
+ }).catch(() => {
+ // 后端返回 warn(601「未做任何修改」) 时由全局拦截器弹提示,此处吞掉 reject
})
})
}
diff --git a/bms-front/src/views/price/basic/surcharge/components/SurchargeVoidDrawer.vue b/bms-front/src/views/price/basic/surcharge/components/SurchargeVoidDrawer.vue
new file mode 100644
index 00000000..b9ebc5fe
--- /dev/null
+++ b/bms-front/src/views/price/basic/surcharge/components/SurchargeVoidDrawer.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+ 搜索
+ 重置
+
+
+
+
+
+
+ {{ feeTypeLabel(row.feeType) }}
+
+
+ {{ chargeTypeLabel(row.chargeType) }}
+
+
+
+ {{ formatChargeValue(row) }}
+
+
+
+ {{ roundModeLabel(row.roundMode) }}
+
+
+ {{ countryLabel(row.countryCode) }}
+
+
+
+ 作废
+
+
+
+
+ {{ timeStr(row.createTime) }}
+
+
+ {{ timeStr(row.updateTime) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/bms-front/src/views/price/basic/surcharge/index.vue b/bms-front/src/views/price/basic/surcharge/index.vue
index 1e2f3c5a..093fbc0c 100644
--- a/bms-front/src/views/price/basic/surcharge/index.vue
+++ b/bms-front/src/views/price/basic/surcharge/index.vue
@@ -7,7 +7,7 @@
:query="queryList"
row-key="scId"
>
-
+
修改
-
-
- 删除
+ icon="View"
+ @click="voidDrawerRef.open()"
+ v-hasPermi="['price:surcharge:list']"
+ >作废记录
-
- {{ (row.ssCode || '').toLowerCase() === 'on' ? '有效' : '停用' }}
-
+ {{ ssInfo(row.ssCode).label }}
@@ -59,17 +45,34 @@
编辑
- 删除
+ 停用
+ 启用
tableRef.refresh()" />
+