1、修复基础配置

2、修复业务模块
This commit is contained in:
2026-09-03 15:59:20 +08:00
parent 88b04b7dac
commit a8d866231b
14 changed files with 200 additions and 14 deletions
@@ -74,6 +74,9 @@ public class PortTerminalExcel implements Serializable {
@ExcelProperty("国家*")
private String country;
@ExcelProperty("所属省份*")
private String provinceName;
@ExcelProperty("城市*")
private String city;
@@ -48,6 +48,9 @@ public class PortTerminalExportExcel implements Serializable {
@ExcelProperty("国家")
private String country;
@ExcelProperty("所属省份")
private String provinceName;
@ExcelProperty("城市")
private String city;
@@ -27,6 +27,7 @@ package org.springblade.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Param;
import org.springblade.system.pojo.entity.PortTerminal;
import org.springblade.system.pojo.vo.PortTerminalVO;
@@ -39,6 +40,16 @@ import java.util.List;
*/
public interface PortTerminalMapper extends BaseMapper<PortTerminal> {
/**
* 按编码查询港口码头(包含逻辑删除记录,用于导入恢复)。
*/
PortTerminal selectByCodeIncludingDeleted(@Param("code") String code);
/**
* 恢复逻辑删除港口码头。
*/
int restoreById(@Param("id") Long id);
/**
* 自定义分页
*
@@ -19,6 +19,8 @@
<result column="parent_code" property="parentCode"/>
<result column="parent_name" property="parentName"/>
<result column="country" property="country"/>
<result column="province_code" property="provinceCode"/>
<result column="province_name" property="provinceName"/>
<result column="city" property="city"/>
<result column="district_code" property="districtCode"/>
<result column="district_name" property="districtName"/>
@@ -30,6 +32,19 @@
<result column="remark" property="remark"/>
</resultMap>
<select id="selectByCodeIncludingDeleted" resultType="org.springblade.system.pojo.entity.PortTerminal">
SELECT *
FROM blade_port_terminal
WHERE code = #{code}
</select>
<update id="restoreById">
UPDATE blade_port_terminal
SET is_deleted = 0
WHERE id = #{id}
AND is_deleted = 1
</update>
<select id="selectPortTerminalPage" resultMap="portTerminalResultMap">
SELECT
pt.id,
@@ -48,6 +63,8 @@
pt.parent_code,
pt.parent_name,
pt.country,
pt.province_code,
pt.province_name,
pt.city,
pt.district_code,
pt.district_name,
@@ -95,6 +112,12 @@
<if test="portTerminal.city != null and portTerminal.city != ''">
AND pt.city = #{portTerminal.city}
</if>
<if test="portTerminal.provinceName != null and portTerminal.provinceName != ''">
AND pt.province_name = #{portTerminal.provinceName}
</if>
<if test="portTerminal.provinceCode != null and portTerminal.provinceCode != ''">
AND pt.province_code = #{portTerminal.provinceCode}
</if>
<if test="portTerminal.districtCode != null and portTerminal.districtCode != ''">
AND pt.district_code = #{portTerminal.districtCode}
</if>
@@ -40,6 +40,16 @@ import java.util.List;
*/
public interface RailwayStationMapper extends BaseMapper<RailwayStation> {
/**
* 按编码查询铁路车站(包含逻辑删除记录,用于导入恢复)。
*/
RailwayStation selectByCodeIncludingDeleted(@Param("code") String code);
/**
* 恢复逻辑删除铁路车站。
*/
int restoreById(@Param("id") Long id);
/**
* 自定义分页
*
@@ -32,6 +32,19 @@
<result column="remark" property="remark"/>
</resultMap>
<select id="selectByCodeIncludingDeleted" resultType="org.springblade.system.pojo.entity.RailwayStation">
SELECT *
FROM blade_railway_station
WHERE code = #{code}
</select>
<update id="restoreById">
UPDATE blade_railway_station
SET is_deleted = 0
WHERE id = #{id}
AND is_deleted = 1
</update>
<select id="selectRailwayStationPage" resultMap="railwayStationResultMap">
SELECT
rs.id,
@@ -71,7 +71,7 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
private static final String SOURCE_BATCH = "批量导入";
private static final String SOURCE_MANUAL = "手动录入";
private static final String SOURCE_MANUAL_OLD = "手工导入";
private static final String DEFAULT_COUNTRY_CODE = "+86";
private static final int PROVINCE_REGION_LEVEL = 1;
private static final int STATUS_ENABLED = 1;
private static final int STATUS_DISABLED = 2;
private static final int CODE_MAX_LENGTH = 20;
@@ -164,7 +164,9 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
return errorList;
}
for (AirportMaster airportMaster : airportMasterList) {
if (!save(airportMaster)) {
// 编码命中逻辑删除记录时复用原主键,恢复后更新,避免唯一索引冲突。
prepareSubmitTarget(airportMaster);
if (!saveOrUpdate(airportMaster)) {
throw new ServiceException("空港机场保存失败");
}
}
@@ -408,9 +410,10 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
province = regionService.getById(airportMaster.getProvinceCode());
}
if (Func.isEmpty(province) && Func.isNotEmpty(airportMaster.getProvinceName())) {
String provinceName = normalizeRegionName(airportMaster.getProvinceName());
province = regionService.getOne(Wrappers.<Region>lambdaQuery()
.eq(Region::getParentCode, DEFAULT_COUNTRY_CODE)
.eq(Region::getName, airportMaster.getProvinceName()), false);
.eq(Region::getRegionLevel, PROVINCE_REGION_LEVEL)
.eq(Region::getName, provinceName), false);
}
if (Func.isEmpty(province)) {
throw new ServiceException("请选择省份");
@@ -520,7 +523,11 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
}
private String trimToEmpty(String value) {
return value == null ? "" : value.trim();
return value == null ? "" : value.replace("\uFEFF", "").strip();
}
private String normalizeRegionName(String value) {
return trimToEmpty(value);
}
private String trimToNull(String value) {
@@ -172,7 +172,8 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
try {
prepare(portTerminal, SOURCE_BATCH);
validate(portTerminal);
if (!save(portTerminal)) {
prepareImportTarget(portTerminal);
if (!saveOrUpdate(portTerminal)) {
throw new ServiceException("港口码头保存失败");
}
} catch (Exception exception) {
@@ -183,6 +184,22 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
}
}
private void prepareImportTarget(PortTerminal portTerminal) {
if (Func.isNotEmpty(portTerminal.getId())) {
return;
}
PortTerminal existingPortTerminal = baseMapper.selectByCodeIncludingDeleted(portTerminal.getCode());
if (existingPortTerminal == null) {
return;
}
if (!Objects.equals(existingPortTerminal.getIsDeleted(), 1)) {
throw new ServiceException("该编码已存在");
}
baseMapper.restoreById(existingPortTerminal.getId());
portTerminal.setId(existingPortTerminal.getId());
portTerminal.setIsDeleted(0);
}
private String formatImportErrorMessage(List<String> validationErrors) {
StringBuilder errorMessage = new StringBuilder();
for (int index = 0; index < validationErrors.size(); index++) {
@@ -213,6 +230,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
portTerminal.setParentName(excel.getParentName());
portTerminal.setParentCode(CATEGORY_TERMINAL.equals(trimToEmpty(excel.getCategory())) ? excel.getPortCode() : excel.getParentCode());
portTerminal.setCountry(excel.getCountry());
portTerminal.setProvinceName(excel.getProvinceName());
portTerminal.setCity(excel.getCity());
portTerminal.setDistrictName(excel.getDistrictName());
portTerminal.setDetailAddress(excel.getDetailAddress());
@@ -241,6 +259,8 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
}
portTerminal.setParentName(trimToNull(portTerminal.getParentName()));
portTerminal.setCountry(trimToEmpty(portTerminal.getCountry()));
portTerminal.setProvinceCode(trimToNull(portTerminal.getProvinceCode()));
portTerminal.setProvinceName(trimToNull(portTerminal.getProvinceName()));
portTerminal.setCity(trimToEmpty(portTerminal.getCity()));
portTerminal.setDistrictCode(trimToNull(portTerminal.getDistrictCode()));
portTerminal.setDistrictName(trimToNull(portTerminal.getDistrictName()));
@@ -283,6 +303,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
}
validateImportLength(portTerminal.getName(), NAME_MAX_LENGTH, "港口/码头名称不能超过100字", validationErrors);
validateImportLength(portTerminal.getCountry(), REGION_MAX_LENGTH, "国家不能超过50字", validationErrors);
validateImportLength(portTerminal.getProvinceName(), REGION_MAX_LENGTH, "所属省份不能超过50字", validationErrors);
validateImportLength(portTerminal.getCity(), REGION_MAX_LENGTH, "城市不能超过50字", validationErrors);
validateImportLength(portTerminal.getDistrictName(), REGION_MAX_LENGTH, "区县不能超过50字", validationErrors);
validateImportLength(portTerminal.getRegionCode(), REGION_CODE_MAX_LENGTH, "行政区划编码不能超过32字", validationErrors);
@@ -341,6 +362,9 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
if (Func.isEmpty(portTerminal.getCity())) {
addValidationError(validationErrors, "城市不能为空");
}
if (Func.isEmpty(portTerminal.getProvinceName())) {
addValidationError(validationErrors, "所属省份不能为空");
}
if (Func.isEmpty(portTerminal.getDistrictCode()) && Func.isEmpty(portTerminal.getDistrictName())) {
addValidationError(validationErrors, "区县不能为空");
return;
@@ -410,6 +434,8 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
portTerminal.setCategory(trimToEmpty(portTerminal.getCategory()));
portTerminal.setName(trimToEmpty(portTerminal.getName()));
portTerminal.setCountry(trimToEmpty(portTerminal.getCountry()));
portTerminal.setProvinceCode(trimToNull(portTerminal.getProvinceCode()));
portTerminal.setProvinceName(trimToNull(portTerminal.getProvinceName()));
portTerminal.setCity(trimToEmpty(portTerminal.getCity()));
portTerminal.setDistrictCode(trimToNull(portTerminal.getDistrictCode()));
portTerminal.setDistrictName(trimToNull(portTerminal.getDistrictName()));
@@ -454,6 +480,8 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
portTerminal.setParentCode(parent.getCode());
portTerminal.setParentName(parent.getName());
portTerminal.setCountry(inheritParentValue(parent.getCountry(), portTerminal.getCountry()));
portTerminal.setProvinceCode(inheritParentValue(parent.getProvinceCode(), portTerminal.getProvinceCode()));
portTerminal.setProvinceName(inheritParentValue(parent.getProvinceName(), portTerminal.getProvinceName()));
portTerminal.setCity(inheritParentValue(parent.getCity(), portTerminal.getCity()));
portTerminal.setDistrictCode(inheritParentValue(parent.getDistrictCode(), portTerminal.getDistrictCode()));
portTerminal.setDistrictName(inheritParentValue(parent.getDistrictName(), portTerminal.getDistrictName()));
@@ -464,6 +492,18 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
}
private void fillRegion(PortTerminal portTerminal) {
Region selectedProvince = null;
if (Func.isNotEmpty(portTerminal.getProvinceCode())) {
selectedProvince = regionService.getById(portTerminal.getProvinceCode());
}
if (Func.isEmpty(selectedProvince) && Func.isNotEmpty(portTerminal.getProvinceName())) {
selectedProvince = regionService.getOne(Wrappers.<Region>lambdaQuery()
.eq(Region::getName, portTerminal.getProvinceName())
.eq(Region::getRegionLevel, 1), false);
}
if (Func.isEmpty(selectedProvince)) {
throw new ServiceException("请选择所属省份");
}
Region district = null;
if (Func.isNotEmpty(portTerminal.getDistrictCode())) {
district = regionService.getById(portTerminal.getDistrictCode());
@@ -472,6 +512,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
if (Func.isNotEmpty(portTerminal.getCity())) {
List<Region> cityList = regionService.list(Wrappers.<Region>lambdaQuery()
.eq(Region::getName, portTerminal.getCity())
.eq(Region::getParentCode, selectedProvince.getCode())
.eq(Region::getRegionLevel, 2));
for (Region city : cityList) {
district = regionService.getOne(Wrappers.<Region>lambdaQuery()
@@ -495,9 +536,26 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
if (Func.isEmpty(city)) {
throw new ServiceException("区县所属城市不存在");
}
Region province = regionService.getById(city.getParentCode());
if (Func.isEmpty(province)) {
throw new ServiceException("城市所属省份不存在");
}
if (Func.isNotEmpty(portTerminal.getProvinceCode())
&& !Objects.equals(portTerminal.getProvinceCode(), province.getCode())) {
throw new ServiceException("城市与省份不匹配");
}
if (Func.isNotEmpty(portTerminal.getProvinceName())
&& !Objects.equals(portTerminal.getProvinceName(), province.getName())) {
throw new ServiceException("城市与省份不匹配");
}
if (!Objects.equals(selectedProvince.getCode(), province.getCode())) {
throw new ServiceException("城市与省份不匹配");
}
if (Func.isNotEmpty(portTerminal.getCity()) && !Objects.equals(portTerminal.getCity(), city.getName())) {
throw new ServiceException("区县与城市不匹配");
}
portTerminal.setProvinceCode(province.getCode());
portTerminal.setProvinceName(province.getName());
portTerminal.setCity(city.getName());
portTerminal.setDistrictCode(district.getCode());
portTerminal.setDistrictName(district.getName());
@@ -517,6 +575,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
validateLength(portTerminal.getCode(), CODE_MAX_LENGTH, "编码不能超过30字");
validateLength(portTerminal.getName(), NAME_MAX_LENGTH, "港口/码头名称不能超过100字");
validateLength(portTerminal.getCountry(), REGION_MAX_LENGTH, "国家不能超过50字");
validateLength(portTerminal.getProvinceName(), REGION_MAX_LENGTH, "所属省份不能超过50字");
validateLength(portTerminal.getCity(), REGION_MAX_LENGTH, "城市不能超过50字");
validateLength(portTerminal.getDistrictName(), REGION_MAX_LENGTH, "区县不能超过50字");
validateLength(portTerminal.getRegionCode(), REGION_CODE_MAX_LENGTH, "行政区划编码不能超过32字");
@@ -537,6 +596,9 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
if (Func.isEmpty(portTerminal.getCity())) {
throw new ServiceException("城市不能为空");
}
if (Func.isEmpty(portTerminal.getProvinceCode())) {
throw new ServiceException("请选择所属省份");
}
if (Func.isEmpty(portTerminal.getDistrictCode())) {
throw new ServiceException("区县不能为空");
}
@@ -74,7 +74,7 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
private static final String SOURCE_MANUAL = "手动";
private static final String SOURCE_MANUAL_RECORD = "手动录入";
private static final String SOURCE_MANUAL_OLD = "手工导入";
private static final String DEFAULT_COUNTRY_CODE = "+86";
private static final int PROVINCE_REGION_LEVEL = 1;
private static final int STATUS_ENABLED = 1;
private static final int STATUS_DISABLED = 2;
private static final int CODE_MAX_LENGTH = 20;
@@ -169,13 +169,30 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
return errorList;
}
for (RailwayStation railwayStation : railwayStationList) {
if (!save(railwayStation)) {
prepareImportTarget(railwayStation);
if (!saveOrUpdate(railwayStation)) {
throw new ServiceException("铁路车站保存失败");
}
}
return errorList;
}
private void prepareImportTarget(RailwayStation railwayStation) {
if (Func.isNotEmpty(railwayStation.getId())) {
return;
}
RailwayStation existingRailwayStation = baseMapper.selectByCodeIncludingDeleted(railwayStation.getCode());
if (existingRailwayStation == null) {
return;
}
if (!Objects.equals(existingRailwayStation.getIsDeleted(), 1)) {
throw new ServiceException("该编码已存在");
}
baseMapper.restoreById(existingRailwayStation.getId());
railwayStation.setId(existingRailwayStation.getId());
railwayStation.setIsDeleted(0);
}
private Map<String, Integer> buildImportValueCountMap(List<String> values) {
Map<String, Integer> valueCountMap = new HashMap<>();
for (String value : values) {
@@ -437,9 +454,10 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
province = regionService.getById(railwayStation.getProvinceCode());
}
if (Func.isEmpty(province) && Func.isNotEmpty(railwayStation.getProvinceName())) {
String provinceName = normalizeRegionName(railwayStation.getProvinceName());
province = regionService.getOne(Wrappers.<Region>lambdaQuery()
.eq(Region::getParentCode, DEFAULT_COUNTRY_CODE)
.eq(Region::getName, railwayStation.getProvinceName()), false);
.eq(Region::getRegionLevel, PROVINCE_REGION_LEVEL)
.eq(Region::getName, provinceName), false);
}
if (Func.isEmpty(province)) {
throw new ServiceException("请选择所属省份");
@@ -530,7 +548,11 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
}
private String trimToEmpty(String value) {
return value == null ? "" : value.trim();
return value == null ? "" : value.replace("\uFEFF", "").strip();
}
private String normalizeRegionName(String value) {
return trimToEmpty(value);
}
private String trimToNull(String value) {