From 3994bd7998c1fb82bed385cc5859caa917317114 Mon Sep 17 00:00:00 2001 From: wuweihua <88888888> Date: Mon, 7 Sep 2026 16:50:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E9=99=84=E5=8A=A0=E8=B4=B9?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/data/BmsRegionController.java | 12 + .../controller/price/SurchargeController.java | 76 +++++ .../com/ruoyi/price/domain/PrcSurcharge.java | 84 +++++ .../price/mapper/PrcSurchargeMapper.java | 22 ++ .../price/service/IPrcSurchargeService.java | 22 ++ .../service/impl/PrcSurchargeServiceImpl.java | 86 +++++ .../mapper/price/PrcSurchargeMapper.xml | 120 +++++++ bms-back/sql/price/dict_charge_currency.sql | 59 ++++ bms-back/sql/price/dict_fee_round.sql | 47 +++ bms-back/sql/price/surcharge.sql | 55 ++++ bms-front/src/api/data/region.js | 8 + bms-front/src/api/price/surcharge.js | 46 +++ .../src/views/price/basic/surcharge/index.vue | 310 ++++++++++++++++++ 13 files changed, 947 insertions(+) create mode 100644 bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/SurchargeController.java create mode 100644 bms-back/ruoyi-system/src/main/java/com/ruoyi/price/domain/PrcSurcharge.java create mode 100644 bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeMapper.java create mode 100644 bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/IPrcSurchargeService.java create mode 100644 bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcSurchargeServiceImpl.java create mode 100644 bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeMapper.xml create mode 100644 bms-back/sql/price/dict_charge_currency.sql create mode 100644 bms-back/sql/price/dict_fee_round.sql create mode 100644 bms-back/sql/price/surcharge.sql create mode 100644 bms-front/src/api/price/surcharge.js create mode 100644 bms-front/src/views/price/basic/surcharge/index.vue diff --git a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/data/BmsRegionController.java b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/data/BmsRegionController.java index 1e43357b..b1d0a0f7 100644 --- a/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/data/BmsRegionController.java +++ b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/data/BmsRegionController.java @@ -50,6 +50,18 @@ public class BmsRegionController extends BaseController return getDataTable(list); } + /** + * 获取国家下拉选项列表(仅启用状态) + */ + @GetMapping("/optionselect") + public AjaxResult optionselect() + { + BmsRegion query = new BmsRegion(); + query.setStatus("0"); + List list = regionService.selectRegionList(query); + return success(list); + } + /** * 导出区域列表 */ 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 new file mode 100644 index 00000000..02c123ae --- /dev/null +++ b/bms-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/price/SurchargeController.java @@ -0,0 +1,76 @@ +package com.ruoyi.web.controller.price; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.core.page.TableDataInfo; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.price.domain.PrcSurcharge; +import com.ruoyi.price.service.IPrcSurchargeService; + +/** + * 附加费配置 + * + * @author ruoyi + */ +@RestController +@RequestMapping("/price/surcharge") +public class SurchargeController extends BaseController +{ + @Autowired + private IPrcSurchargeService surchargeService; + + @PreAuthorize("@ss.hasPermi('price:surcharge:list')") + @GetMapping("/list") + public TableDataInfo list(PrcSurcharge surcharge) + { + startPage(); + List list = surchargeService.selectPrcSurchargeList(surcharge); + return getDataTable(list); + } + + @PreAuthorize("@ss.hasPermi('price:surcharge:query')") + @GetMapping("/{scId}") + public AjaxResult getInfo(@PathVariable Long scId) + { + return success(surchargeService.selectPrcSurchargeById(scId)); + } + + @PreAuthorize("@ss.hasPermi('price:surcharge:add')") + @Log(title = "附加费配置", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@Validated @RequestBody PrcSurcharge surcharge) + { + surcharge.setCreateBy(getUsername()); + return toAjax(surchargeService.insertPrcSurcharge(surcharge)); + } + + @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)); + } + + @PreAuthorize("@ss.hasPermi('price:surcharge:remove')") + @Log(title = "附加费配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{scIds}") + public AjaxResult remove(@PathVariable Long[] scIds) + { + return toAjax(surchargeService.deletePrcSurchargeByIds(scIds)); + } +} diff --git a/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/domain/PrcSurcharge.java b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/domain/PrcSurcharge.java new file mode 100644 index 00000000..2b13f673 --- /dev/null +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/domain/PrcSurcharge.java @@ -0,0 +1,84 @@ +package com.ruoyi.price.domain; + +import java.math.BigDecimal; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * 附加费配置 prc_surcharge + * + * @author ruoyi + */ +public class PrcSurcharge extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 附加费配置ID */ + private Long scId; + /** 附加费名称 */ + private String scName; + /** 费用类型(字典 bms_fee_type) */ + private String feeType; + /** 计费方式 FIXED固定金额/WEIGHT按重量/RATE按比例 */ + private String chargeType; + /** 计费数值 */ + private BigDecimal chargeValue; + /** 币种 */ + private String currency; + /** 取值方式(字典 bms_round_mode)UP/DOWN/HALF_UP */ + private String roundMode; + /** 状态码 on/of */ + private String ssCode; + /** 适用国家ISO2(空=全部) */ + private String countryCode; + /** 备注 */ + private String scNote; + /** 租户ID */ + private Long tmsId; + + public Long getScId() { return scId; } + public void setScId(Long scId) { this.scId = scId; } + public String getScName() { return scName; } + public void setScName(String scName) { this.scName = scName; } + public String getFeeType() { return feeType; } + public void setFeeType(String feeType) { this.feeType = feeType; } + public String getChargeType() { return chargeType; } + public void setChargeType(String chargeType) { this.chargeType = chargeType; } + public BigDecimal getChargeValue() { return chargeValue; } + public void setChargeValue(BigDecimal chargeValue) { this.chargeValue = chargeValue; } + public String getCurrency() { return currency; } + public void setCurrency(String currency) { this.currency = currency; } + public String getRoundMode() { return roundMode; } + public void setRoundMode(String roundMode) { this.roundMode = roundMode; } + public String getSsCode() { return ssCode; } + public void setSsCode(String ssCode) { this.ssCode = ssCode; } + public String getCountryCode() { return countryCode; } + public void setCountryCode(String countryCode) { this.countryCode = countryCode; } + public String getScNote() { return scNote; } + public void setScNote(String scNote) { this.scNote = scNote; } + public Long getTmsId() { return tmsId; } + public void setTmsId(Long tmsId) { this.tmsId = tmsId; } + + @Override + public String toString() + { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("scId", getScId()) + .append("scName", getScName()) + .append("feeType", getFeeType()) + .append("chargeType", getChargeType()) + .append("chargeValue", getChargeValue()) + .append("currency", getCurrency()) + .append("roundMode", getRoundMode()) + .append("ssCode", getSsCode()) + .append("countryCode", getCountryCode()) + .append("scNote", getScNote()) + .append("tmsId", getTmsId()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} 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 new file mode 100644 index 00000000..4f74b137 --- /dev/null +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/mapper/PrcSurchargeMapper.java @@ -0,0 +1,22 @@ +package com.ruoyi.price.mapper; + +import java.util.List; +import com.ruoyi.price.domain.PrcSurcharge; + +/** + * 附加费配置 数据层 + * + * @author ruoyi + */ +public interface PrcSurchargeMapper +{ + public PrcSurcharge selectPrcSurchargeById(Long scId); + + public List selectPrcSurchargeList(PrcSurcharge surcharge); + + public int insertPrcSurcharge(PrcSurcharge surcharge); + + public int updatePrcSurcharge(PrcSurcharge surcharge); + + public int deletePrcSurchargeByIds(Long[] scIds); +} 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 new file mode 100644 index 00000000..510b5094 --- /dev/null +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/IPrcSurchargeService.java @@ -0,0 +1,22 @@ +package com.ruoyi.price.service; + +import java.util.List; +import com.ruoyi.price.domain.PrcSurcharge; + +/** + * 附加费配置 服务层 + * + * @author ruoyi + */ +public interface IPrcSurchargeService +{ + public PrcSurcharge selectPrcSurchargeById(Long scId); + + public List selectPrcSurchargeList(PrcSurcharge surcharge); + + public int insertPrcSurcharge(PrcSurcharge surcharge); + + public int updatePrcSurcharge(PrcSurcharge surcharge); + + public int deletePrcSurchargeByIds(Long[] scIds); +} 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 new file mode 100644 index 00000000..9e8b08d1 --- /dev/null +++ b/bms-back/ruoyi-system/src/main/java/com/ruoyi/price/service/impl/PrcSurchargeServiceImpl.java @@ -0,0 +1,86 @@ +package com.ruoyi.price.service.impl; + +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.price.domain.PrcSurcharge; +import com.ruoyi.price.mapper.PrcSurchargeMapper; +import com.ruoyi.price.service.IPrcSurchargeService; + +/** + * 附加费配置 服务层实现 + * + * @author ruoyi + */ +@Service +public class PrcSurchargeServiceImpl implements IPrcSurchargeService +{ + @Autowired + private PrcSurchargeMapper surchargeMapper; + + @Override + public PrcSurcharge selectPrcSurchargeById(Long scId) + { + return surchargeMapper.selectPrcSurchargeById(scId); + } + + @Override + public List selectPrcSurchargeList(PrcSurcharge surcharge) + { + return surchargeMapper.selectPrcSurchargeList(surcharge); + } + + @Override + public int insertPrcSurcharge(PrcSurcharge surcharge) + { + validate(surcharge); + if (StringUtils.isEmpty(surcharge.getSsCode())) + { + surcharge.setSsCode("on"); + } + if (StringUtils.isEmpty(surcharge.getFeeType())) + { + surcharge.setFeeType("SURCHARGE"); + } + if (StringUtils.isEmpty(surcharge.getRoundMode())) + { + 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) + { + if (StringUtils.isEmpty(surcharge.getScName())) + { + throw new ServiceException("附加费名称不能为空"); + } + if (StringUtils.isEmpty(surcharge.getChargeType())) + { + throw new ServiceException("计费方式不能为空"); + } + if (surcharge.getChargeValue() == null) + { + throw new ServiceException("计费数值不能为空"); + } + if (surcharge.getChargeValue().compareTo(java.math.BigDecimal.ZERO) < 0) + { + throw new ServiceException("计费数值不能为负数"); + } + } +} 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 new file mode 100644 index 00000000..f37c2e0e --- /dev/null +++ b/bms-back/ruoyi-system/src/main/resources/mapper/price/PrcSurchargeMapper.xml @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + select sc_id, sc_name, fee_type, charge_type, charge_value, currency, round_mode, ss_code, + country_code, sc_note, tms_id, created_by, created_at, updated_by, updated_at + from prc_surcharge + + + + + + + + insert into prc_surcharge ( + sc_name, + fee_type, + charge_type, + charge_value, + currency, + round_mode, + ss_code, + country_code, + sc_note, + tms_id, + created_by, + created_at + ) values ( + #{scName}, + #{feeType}, + #{chargeType}, + #{chargeValue}, + #{currency}, + #{roundMode}, + #{ssCode}, + #{countryCode}, + #{scNote}, + #{tmsId}, + #{createBy}, + sysdate() + ) + + + + 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}, + updated_at = sysdate() + + where sc_id = #{scId} + + + + delete from prc_surcharge where sc_id in + + #{scId} + + + + diff --git a/bms-back/sql/price/dict_charge_currency.sql b/bms-back/sql/price/dict_charge_currency.sql new file mode 100644 index 00000000..0f80048b --- /dev/null +++ b/bms-back/sql/price/dict_charge_currency.sql @@ -0,0 +1,59 @@ +-- ---------------------------- +-- BMS 计费字典:计费方式 / 币种 +-- charset: utf8mb4 +-- 幂等:dict_type 唯一键 + WHERE NOT EXISTS,可重复执行 +-- 默认值:计费方式 = FIXED(固定金额),币种 = CNY(人民币) +-- ---------------------------- + +-- 1) 字典类型 +INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) +SELECT '计费方式', 'bms_charge_type', '0', 'admin', sysdate(), '计费方式 FIXED固定金额/WEIGHT按重量/RATE按比例' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_charge_type'); + +INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) +SELECT '币种', 'bms_currency', '0', 'admin', sysdate(), '计费币种' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_currency'); + +-- 2) 计费方式字典数据(默认 FIXED 固定金额) +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 1, '固定金额(每票)', 'FIXED', 'bms_charge_type', 'Y', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_charge_type' AND dict_value = 'FIXED'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 2, '按重量(每KG)', 'WEIGHT', 'bms_charge_type', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_charge_type' AND dict_value = 'WEIGHT'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 3, '按比例(%)', 'RATE', 'bms_charge_type', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_charge_type' AND dict_value = 'RATE'); + +-- 3) 币种字典数据(默认 CNY 人民币) +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 1, '人民币', 'CNY', 'bms_currency', 'Y', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'CNY'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 2, '美元', 'USD', 'bms_currency', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'USD'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 3, '欧元', 'EUR', 'bms_currency', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'EUR'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 4, '英镑', 'GBP', 'bms_currency', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'GBP'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 5, '日元', 'JPY', 'bms_currency', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'JPY'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 6, '港币', 'HKD', 'bms_currency', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_currency' AND dict_value = 'HKD'); + +-- 4) 幂等修正默认值(数据已存在时强制对齐) +UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_charge_type' AND dict_value <> 'FIXED'; +UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_charge_type' AND dict_value = 'FIXED'; +UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_currency' AND dict_value <> 'CNY'; +UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_currency' AND dict_value = 'CNY'; diff --git a/bms-back/sql/price/dict_fee_round.sql b/bms-back/sql/price/dict_fee_round.sql new file mode 100644 index 00000000..095708c0 --- /dev/null +++ b/bms-back/sql/price/dict_fee_round.sql @@ -0,0 +1,47 @@ +-- ---------------------------- +-- BMS 计费字典:取值方式 / 费用类型 +-- charset: utf8mb4 +-- 幂等:dict_type 唯一键 + WHERE NOT EXISTS,可重复执行 +-- 默认值:费用类型 = SURCHARGE(附加费),取值方式 = HALF_UP(四舍五入) +-- ---------------------------- + +-- 1) 字典类型 +INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) +SELECT '取值方式', 'bms_round_mode', '0', 'admin', sysdate(), '计费金额取值方式' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_round_mode'); + +INSERT INTO sys_dict_type (dict_name, dict_type, status, create_by, create_time, remark) +SELECT '费用类型', 'bms_fee_type', '0', 'admin', sysdate(), '计费费用类型' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_type WHERE dict_type = 'bms_fee_type'); + +-- 2) 取值方式字典数据(默认 HALF_UP 四舍五入) +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 1, '向上取值', 'UP', 'bms_round_mode', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_round_mode' AND dict_value = 'UP'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 2, '向下取整', 'DOWN', 'bms_round_mode', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_round_mode' AND dict_value = 'DOWN'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 3, '四舍五入', 'HALF_UP', 'bms_round_mode', 'Y', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_round_mode' AND dict_value = 'HALF_UP'); + +-- 3) 费用类型字典数据(默认 SURCHARGE 附加费) +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 1, '基础运费', 'BASIC_FREIGHT', 'bms_fee_type', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_fee_type' AND dict_value = 'BASIC_FREIGHT'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 2, '挂号费', 'REGISTRATION_FEE', 'bms_fee_type', 'N', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_fee_type' AND dict_value = 'REGISTRATION_FEE'); + +INSERT INTO sys_dict_data (dict_sort, dict_label, dict_value, dict_type, is_default, status, create_by, create_time, remark) +SELECT 3, '附加费', 'SURCHARGE', 'bms_fee_type', 'Y', '0', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_dict_data WHERE dict_type = 'bms_fee_type' AND dict_value = 'SURCHARGE'); + +-- 4) 幂等修正默认值(数据已存在时强制对齐,保证重复执行后默认值仍正确) +UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_round_mode' AND dict_value <> 'HALF_UP'; +UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_round_mode' AND dict_value = 'HALF_UP'; +UPDATE sys_dict_data SET is_default = 'N' WHERE dict_type = 'bms_fee_type' AND dict_value <> 'SURCHARGE'; +UPDATE sys_dict_data SET is_default = 'Y' WHERE dict_type = 'bms_fee_type' AND dict_value = 'SURCHARGE'; diff --git a/bms-back/sql/price/surcharge.sql b/bms-back/sql/price/surcharge.sql new file mode 100644 index 00000000..68db1160 --- /dev/null +++ b/bms-back/sql/price/surcharge.sql @@ -0,0 +1,55 @@ +-- ---------------------------- +-- BMS price basic: surcharge config (附加费配置) +-- charset: utf8mb4 +-- menu_id: 2115-2119 +-- ---------------------------- + +CREATE TABLE IF NOT EXISTS prc_surcharge ( + sc_id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '附加费配置ID', + sc_name VARCHAR(100) NOT NULL COMMENT '附加费名称', + fee_type VARCHAR(30) NOT NULL DEFAULT 'SURCHARGE' COMMENT '费用类型(字典bms_fee_type)', + charge_type VARCHAR(20) NOT NULL COMMENT '计费方式 FIXED固定金额/WEIGHT按重量/RATE按比例', + charge_value DECIMAL(18,6) NOT NULL COMMENT '计费数值', + currency CHAR(3) NOT NULL DEFAULT 'CNY' COMMENT '币种', + round_mode VARCHAR(20) NOT NULL DEFAULT 'HALF_UP' COMMENT '取值方式(字典bms_round_mode)', + ss_code VARCHAR(20) NOT NULL DEFAULT 'on' COMMENT '状态 on/of', + country_code CHAR(2) DEFAULT NULL COMMENT '适用国家ISO2(空=全部)', + sc_note VARCHAR(500) DEFAULT NULL COMMENT '备注', + tms_id BIGINT(20) DEFAULT NULL COMMENT '租户ID', + created_by VARCHAR(64) DEFAULT '' COMMENT '创建人', + created_at DATETIME DEFAULT NULL COMMENT '创建时间', + updated_by VARCHAR(64) DEFAULT '' COMMENT '更新人', + updated_at DATETIME DEFAULT NULL COMMENT '更新时间', + PRIMARY KEY (sc_id), + INDEX idx_sc_ss_code (ss_code), + INDEX idx_sc_country (country_code), + INDEX idx_sc_tms_id (tms_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='附加费配置'; + +-- menus 2115-2119 +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) +SELECT 2115, N'附加费配置', 2100, 3, 'surcharge', 'price/basic/surcharge/index', '', 'PriceSurcharge', 1, 0, 'C', '0', '0', 'price:surcharge:list', 'money', 'admin', sysdate(), N'附加费配置菜单' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2115); + +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) +SELECT 2116, N'附加费查询', 2115, 1, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:query', '#', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2116); + +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) +SELECT 2117, N'附加费新增', 2115, 2, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:add', '#', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2117); + +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) +SELECT 2118, N'附加费修改', 2115, 3, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:edit', '#', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2118); + +INSERT INTO sys_menu (menu_id, menu_name, parent_id, order_num, path, component, query, route_name, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, remark) +SELECT 2119, N'附加费删除', 2115, 4, '', NULL, '', '', 1, 0, 'F', '0', '0', 'price:surcharge:remove', '#', 'admin', sysdate(), '' +FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_menu WHERE menu_id = 2119); + +-- role_id=1 grants +INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2115 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2115); +INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2116 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2116); +INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2117 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2117); +INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2118 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2118); +INSERT INTO sys_role_menu (role_id, menu_id) SELECT 1, 2119 FROM DUAL WHERE NOT EXISTS (SELECT 1 FROM sys_role_menu WHERE role_id = 1 AND menu_id = 2119); diff --git a/bms-front/src/api/data/region.js b/bms-front/src/api/data/region.js index d0c2c209..b5885fd1 100644 --- a/bms-front/src/api/data/region.js +++ b/bms-front/src/api/data/region.js @@ -9,6 +9,14 @@ export function listRegion(query) { }) } +// 查询国家下拉选项列表(仅启用) +export function listRegionOptions() { + return request({ + url: '/data/region/optionselect', + method: 'get' + }) +} + // 查询区域详细 export function getRegion(regionId) { return request({ diff --git a/bms-front/src/api/price/surcharge.js b/bms-front/src/api/price/surcharge.js new file mode 100644 index 00000000..a9412756 --- /dev/null +++ b/bms-front/src/api/price/surcharge.js @@ -0,0 +1,46 @@ +import request from '@/utils/request' + +// ========== 附加费配置 ========== + +/** 查询附加费配置列表 */ +export function listSurcharge(query) { + return request({ + url: '/price/surcharge/list', + method: 'get', + params: query + }) +} + +/** 查询附加费配置详细 */ +export function getSurcharge(scId) { + return request({ + url: '/price/surcharge/' + scId, + method: 'get' + }) +} + +/** 新增附加费配置 */ +export function addSurcharge(data) { + return request({ + url: '/price/surcharge', + method: 'post', + data: data + }) +} + +/** 修改附加费配置 */ +export function updateSurcharge(data) { + return request({ + url: '/price/surcharge', + method: 'put', + data: data + }) +} + +/** 删除附加费配置 */ +export function delSurcharge(scIds) { + return request({ + url: '/price/surcharge/' + scIds, + method: 'delete' + }) +} diff --git a/bms-front/src/views/price/basic/surcharge/index.vue b/bms-front/src/views/price/basic/surcharge/index.vue new file mode 100644 index 00000000..649de759 --- /dev/null +++ b/bms-front/src/views/price/basic/surcharge/index.vue @@ -0,0 +1,310 @@ + + + + +