调整收付款问题

This commit is contained in:
2026-09-01 17:35:27 +08:00
parent 1363a526ff
commit 3edfb72d7d
21 changed files with 656 additions and 105 deletions
@@ -44,6 +44,7 @@ import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.excel.AirportMasterExcel;
import org.springblade.system.excel.AirportMasterExportExcel;
import org.springblade.system.excel.AirportMasterImporter;
import org.springblade.system.pojo.entity.AirportMaster;
import org.springblade.system.pojo.vo.AirportMasterVO;
@@ -180,8 +181,8 @@ public class AirportMasterController extends BladeController {
if (Func.isNotEmpty(ids)) {
queryWrapper.lambda().in(AirportMaster::getId, Func.toLongList(ids.toString()));
}
List<AirportMasterExcel> list = airportMasterService.exportAirportMaster(queryWrapper);
ExcelUtil.export(response, "空港机场主数据" + DateUtil.time(), "空港机场主数据表", list, AirportMasterExcel.class);
List<AirportMasterExportExcel> list = airportMasterService.exportAirportMaster(queryWrapper);
ExcelUtil.export(response, "空港机场主数据" + DateUtil.time(), "空港机场主数据表", list, AirportMasterExportExcel.class);
}
/**
@@ -44,6 +44,7 @@ import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.excel.PortTerminalExcel;
import org.springblade.system.excel.PortTerminalExportExcel;
import org.springblade.system.excel.PortTerminalImporter;
import org.springblade.system.pojo.entity.PortTerminal;
import org.springblade.system.pojo.vo.PortTerminalVO;
@@ -200,8 +201,8 @@ public class PortTerminalController extends BladeController {
if (Func.isNotEmpty(ids)) {
queryWrapper.lambda().in(PortTerminal::getId, Func.toLongList(ids.toString()));
}
List<PortTerminalExcel> list = portTerminalService.exportPortTerminal(queryWrapper);
ExcelUtil.export(response, "港口码头主数据" + DateUtil.time(), "港口码头主数据表", list, PortTerminalExcel.class);
List<PortTerminalExportExcel> list = portTerminalService.exportPortTerminal(queryWrapper);
ExcelUtil.export(response, "港口码头主数据" + DateUtil.time(), "港口码头主数据表", list, PortTerminalExportExcel.class);
}
/**
@@ -44,6 +44,7 @@ import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.excel.RailwayStationExcel;
import org.springblade.system.excel.RailwayStationExportExcel;
import org.springblade.system.excel.RailwayStationImporter;
import org.springblade.system.pojo.entity.RailwayStation;
import org.springblade.system.pojo.vo.RailwayStationVO;
@@ -185,8 +186,8 @@ public class RailwayStationController extends BladeController {
if (Func.isNotEmpty(ids)) {
queryWrapper.lambda().in(RailwayStation::getId, Func.toLongList(ids.toString()));
}
List<RailwayStationExcel> list = railwayStationService.exportRailwayStation(queryWrapper);
ExcelUtil.export(response, "铁路车站主数据" + DateUtil.time(), "铁路车站主数据表", list, RailwayStationExcel.class);
List<RailwayStationExportExcel> list = railwayStationService.exportRailwayStation(queryWrapper);
ExcelUtil.export(response, "铁路车站主数据" + DateUtil.time(), "铁路车站主数据表", list, RailwayStationExportExcel.class);
}
/**
@@ -53,9 +53,6 @@ public class AirportMasterExcel implements Serializable {
@ExcelIgnore
private Long id;
@ExcelProperty("编码")
private String code;
@ExcelProperty("IATA编码*")
private String iataCode;
@@ -77,7 +74,7 @@ public class AirportMasterExcel implements Serializable {
@ExcelProperty("所属区县*")
private String districtName;
@ExcelProperty("详细地址")
@ExcelProperty("详细地址*")
private String detailAddress;
@ExcelProperty("经度*")
@@ -88,15 +85,6 @@ public class AirportMasterExcel implements Serializable {
@NumberFormat("0.000000")
private BigDecimal latitude;
@ExcelProperty("行政区划编号")
private String regionCode;
@ExcelProperty("数据来源")
private String dataSource;
@ExcelProperty("启停状态")
private String statusName;
@ExcelProperty("备注")
private String remark;
@@ -0,0 +1,105 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.system.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 空港机场主数据导出 Excel
*
* @author Chill
*/
@Data
@ColumnWidth(18)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class AirportMasterExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@ExcelIgnore
private Long id;
@ExcelProperty("编码")
private String code;
@ExcelProperty("IATA编码*")
private String iataCode;
@ExcelProperty("ICAO代码*")
private String icaoCode;
@ExcelProperty("机场标准名称*")
private String name;
@ExcelProperty("机场简称")
private String shortName;
@ExcelProperty("所属省份*")
private String provinceName;
@ExcelProperty("所属城市*")
private String cityName;
@ExcelProperty("所属区县*")
private String districtName;
@ExcelProperty("详细地址")
private String detailAddress;
@ExcelProperty("经度*")
@NumberFormat("0.000000")
private BigDecimal longitude;
@ExcelProperty("纬度*")
@NumberFormat("0.000000")
private BigDecimal latitude;
@ExcelProperty("行政区划编号")
private String regionCode;
@ExcelProperty("数据来源")
private String dataSource;
@ExcelProperty("启停状态")
private String statusName;
@ExcelProperty("备注")
private String remark;
@ExcelIgnore
private String errorMessage;
}
@@ -53,50 +53,44 @@ public class PortTerminalExcel implements Serializable {
@ExcelIgnore
private Long id;
@ExcelProperty("*编码")
private String code;
@ExcelProperty("港口编码*")
private String portCode;
@ExcelProperty("*港口/码头名称")
@ExcelProperty("码头编码(如为港口则不需填写)")
private String terminalCode;
@ExcelProperty("港口/码头名称*")
private String name;
@ExcelProperty("*类型")
@ExcelProperty("类型*")
private String category;
@ExcelProperty("上级港口")
@ExcelProperty("上级港口(如为港口则不需填写)")
private String parentName;
@ExcelProperty("上级港口编码")
@ExcelProperty("上级港口编码(如为港口则不需填写)")
private String parentCode;
@ExcelProperty("*国家")
@ExcelProperty("国家*")
private String country;
@ExcelProperty("*城市")
@ExcelProperty("城市*")
private String city;
@ExcelProperty("*区县")
@ExcelProperty("区县*")
private String districtName;
@ExcelProperty("行政区划编码")
private String regionCode;
@ExcelProperty("详细地址")
@ExcelProperty("详细地址*")
private String detailAddress;
@ExcelProperty("*经度")
@ExcelProperty("经度*")
@NumberFormat("0.000000")
private BigDecimal longitude;
@ExcelProperty("*纬度")
@ExcelProperty("纬度*")
@NumberFormat("0.000000")
private BigDecimal latitude;
@ExcelProperty("数据来源")
private String dataSource;
@ExcelProperty("启停状态")
private String statusName;
@ExcelProperty("备注")
private String remark;
@@ -0,0 +1,80 @@
package org.springblade.system.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.NumberFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 港口码头主数据导出 Excel
*
* @author Chill
*/
@Data
@ColumnWidth(18)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class PortTerminalExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@ExcelIgnore
private Long id;
@ExcelProperty("编码")
private String code;
@ExcelProperty("港口/码头名称")
private String name;
@ExcelProperty("类型")
private String category;
@ExcelProperty("上级港口")
private String parentName;
@ExcelProperty("上级港口编码")
private String parentCode;
@ExcelProperty("国家")
private String country;
@ExcelProperty("城市")
private String city;
@ExcelProperty("区县")
private String districtName;
@ExcelProperty("行政区划编码")
private String regionCode;
@ExcelProperty("详细地址")
private String detailAddress;
@ExcelProperty("经度")
@NumberFormat("0.000000")
private BigDecimal longitude;
@ExcelProperty("纬度")
@NumberFormat("0.000000")
private BigDecimal latitude;
@ExcelProperty("数据来源")
private String dataSource;
@ExcelProperty("启停状态")
private String statusName;
@ExcelProperty("备注")
private String remark;
@ExcelIgnore
private String errorMessage;
}
@@ -51,9 +51,6 @@ public class RailwayStationExcel implements Serializable {
@ExcelIgnore
private Long id;
@ExcelProperty("编码")
private String code;
@ExcelProperty("TMIS国标编码*")
private String tmisCode;
@@ -75,24 +72,15 @@ public class RailwayStationExcel implements Serializable {
@ExcelProperty("所属区县*")
private String districtName;
@ExcelProperty("详细地址")
@ExcelProperty("详细地址*")
private String detailAddress;
@ExcelProperty("经度")
@ExcelProperty("经度*")
private String longitude;
@ExcelProperty("纬度")
@ExcelProperty("纬度*")
private String latitude;
@ExcelProperty("行政区划编号")
private String regionCode;
@ExcelProperty("数据来源")
private String dataSource;
@ExcelProperty("启停状态")
private String statusName;
@ExcelProperty("备注")
private String remark;
@@ -0,0 +1,108 @@
/**
* BladeX Commercial License Agreement
* Copyright (c) 2018-2099, https://bladex.cn. All rights reserved.
* <p>
* Use of this software is governed by the Commercial License Agreement
* obtained after purchasing a license from BladeX.
* <p>
* 1. This software is for development use only under a valid license
* from BladeX.
* <p>
* 2. Redistribution of this software's source code to any third party
* without a commercial license is strictly prohibited.
* <p>
* 3. Licensees may copyright their own code but cannot use segments
* from this software for such purposes. Copyright of this software
* remains with BladeX.
* <p>
* Using this software signifies agreement to this License, and the software
* must not be used for illegal purposes.
* <p>
* THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is
* not liable for any claims arising from secondary or illegal development.
* <p>
* Author: Chill Zhuang (bladejava@qq.com)
*/
package org.springblade.system.excel;
import cn.idev.excel.annotation.ExcelIgnore;
import cn.idev.excel.annotation.ExcelProperty;
import cn.idev.excel.annotation.format.DateTimeFormat;
import cn.idev.excel.annotation.write.style.ColumnWidth;
import cn.idev.excel.annotation.write.style.ContentRowHeight;
import cn.idev.excel.annotation.write.style.HeadRowHeight;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 铁路车站主数据导出 Excel
*
* @author Chill
*/
@Data
@ColumnWidth(18)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class RailwayStationExportExcel implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@ExcelProperty("编码")
private String code;
@ExcelProperty("TMIS国标编码*")
private String tmisCode;
@ExcelProperty("电报码*")
private String telegraphCode;
@ExcelProperty("车站名称*")
private String name;
@ExcelProperty("所属省份*")
private String provinceName;
@ExcelProperty("所属城市*")
private String cityName;
@ExcelProperty("所属区县*")
private String districtName;
@ExcelProperty("详细地址")
private String detailAddress;
@ExcelProperty("经度*")
private String longitude;
@ExcelProperty("纬度*")
private String latitude;
@ExcelProperty("行政区划编号")
private String regionCode;
@ExcelProperty("数据来源")
private String dataSource;
@ExcelProperty("启停状态")
private String statusName;
@ExcelProperty("备注")
private String remark;
@ExcelProperty("更新人")
private String updateUserName;
@ExcelProperty("更新时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private Date updateTime;
@ExcelProperty("创建时间")
@DateTimeFormat("yyyy-MM-dd HH:mm:ss")
private Date createTime;
@ExcelIgnore
private Long id;
}
@@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.system.excel.AirportMasterExcel;
import org.springblade.system.excel.AirportMasterExportExcel;
import org.springblade.system.pojo.entity.AirportMaster;
import org.springblade.system.pojo.vo.AirportMasterVO;
@@ -80,6 +81,6 @@ public interface IAirportMasterService extends BaseService<AirportMaster> {
* @param queryWrapper 查询条件
* @return 导出数据
*/
List<AirportMasterExcel> exportAirportMaster(Wrapper<AirportMaster> queryWrapper);
List<AirportMasterExportExcel> exportAirportMaster(Wrapper<AirportMaster> queryWrapper);
}
@@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.system.excel.PortTerminalExcel;
import org.springblade.system.excel.PortTerminalExportExcel;
import org.springblade.system.pojo.entity.PortTerminal;
import org.springblade.system.pojo.vo.PortTerminalVO;
@@ -87,6 +88,6 @@ public interface IPortTerminalService extends BaseService<PortTerminal> {
* @param queryWrapper 查询条件
* @return 导出数据
*/
List<PortTerminalExcel> exportPortTerminal(Wrapper<PortTerminal> queryWrapper);
List<PortTerminalExportExcel> exportPortTerminal(Wrapper<PortTerminal> queryWrapper);
}
@@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springblade.core.mp.base.BaseService;
import org.springblade.system.excel.RailwayStationExcel;
import org.springblade.system.excel.RailwayStationExportExcel;
import org.springblade.system.pojo.entity.RailwayStation;
import org.springblade.system.pojo.vo.RailwayStationVO;
@@ -80,6 +81,6 @@ public interface IRailwayStationService extends BaseService<RailwayStation> {
* @param queryWrapper 查询条件
* @return 导出数据
*/
List<RailwayStationExcel> exportRailwayStation(Wrapper<RailwayStation> queryWrapper);
List<RailwayStationExportExcel> exportRailwayStation(Wrapper<RailwayStation> queryWrapper);
}
@@ -35,6 +35,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.excel.AirportMasterExcel;
import org.springblade.system.excel.AirportMasterExportExcel;
import org.springblade.system.mapper.AirportMasterMapper;
import org.springblade.system.pojo.entity.AirportMaster;
import org.springblade.system.pojo.entity.Region;
@@ -214,7 +215,9 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
validateImportUnique(AirportMaster::getIataCode, airportMaster.getIataCode(), "该IATA编码已存在", validationErrors);
validateImportUnique(AirportMaster::getCode, airportMaster.getCode(), "该编码已存在", validationErrors);
}
if (Func.isNotEmpty(airportMaster.getIcaoCode())) {
if (Func.isEmpty(airportMaster.getIcaoCode())) {
addValidationError(validationErrors, "ICAO代码不能为空");
} else {
if (!ICAO_CODE_PATTERN.matcher(airportMaster.getIcaoCode()).matches()) {
addValidationError(validationErrors, "ICAO代码为4位大写字母");
}
@@ -308,10 +311,10 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
}
@Override
public List<AirportMasterExcel> exportAirportMaster(Wrapper<AirportMaster> queryWrapper) {
public List<AirportMasterExportExcel> exportAirportMaster(Wrapper<AirportMaster> queryWrapper) {
List<AirportMaster> airportMasterList = list(queryWrapper);
return airportMasterList.stream().map(airportMaster -> {
AirportMasterExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(airportMaster, AirportMasterExcel.class));
AirportMasterExportExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(airportMaster, AirportMasterExportExcel.class));
excel.setLongitude(scaleCoordinate(airportMaster.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE));
excel.setLatitude(scaleCoordinate(airportMaster.getLatitude(), MIN_LATITUDE, MAX_LATITUDE));
excel.setDataSource(normalizeDataSource(airportMaster.getDataSource()));
@@ -363,7 +366,10 @@ public class AirportMasterServiceImpl extends BaseServiceImpl<AirportMasterMappe
if (!IATA_CODE_PATTERN.matcher(airportMaster.getIataCode()).matches()) {
throw new ServiceException("IATA编码为3位大写字母");
}
if (Func.isNotEmpty(airportMaster.getIcaoCode()) && !ICAO_CODE_PATTERN.matcher(airportMaster.getIcaoCode()).matches()) {
if (Func.isEmpty(airportMaster.getIcaoCode())) {
throw new ServiceException("ICAO代码不能为空");
}
if (!ICAO_CODE_PATTERN.matcher(airportMaster.getIcaoCode()).matches()) {
throw new ServiceException("ICAO代码为4位大写字母");
}
if (Func.isEmpty(airportMaster.getName())) {
@@ -156,10 +156,10 @@ public class FeeItemServiceImpl extends BaseServiceImpl<FeeItemMapper, FeeItem>
if (Func.isNotEmpty(feeItem.getRemark()) && feeItem.getRemark().length() > REMARK_MAX_LENGTH) {
throw new ServiceException("备注不能超过200个字");
}
validateUniqueName(feeItem);
validateUnique(feeItem);
}
private void validateUniqueName(FeeItem feeItem) {
private void validateUnique(FeeItem feeItem) {
LambdaQueryWrapper<FeeItem> queryWrapper = Wrappers.<FeeItem>lambdaQuery()
.eq(FeeItem::getName, feeItem.getName())
.eq(FeeItem::getIsDeleted, 0);
@@ -169,6 +169,19 @@ public class FeeItemServiceImpl extends BaseServiceImpl<FeeItemMapper, FeeItem>
if (count(queryWrapper) > 0L) {
throw new ServiceException("该费用项已存在");
}
if (Func.isEmpty(feeItem.getEnglishName())) {
return;
}
LambdaQueryWrapper<FeeItem> codeQueryWrapper = Wrappers.<FeeItem>lambdaQuery()
.eq(FeeItem::getEnglishName, feeItem.getEnglishName())
.eq(FeeItem::getIsDeleted, 0);
if (Func.isNotEmpty(feeItem.getId())) {
codeQueryWrapper.ne(FeeItem::getId, feeItem.getId());
}
if (count(codeQueryWrapper) > 0L) {
throw new ServiceException("该费用项代码已存在");
}
}
private FeeItem buildImportFeeItem(FeeItemExcel excel) {
@@ -35,6 +35,7 @@ import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.excel.PortTerminalExcel;
import org.springblade.system.excel.PortTerminalExportExcel;
import org.springblade.system.mapper.PortTerminalMapper;
import org.springblade.system.pojo.entity.PortTerminal;
import org.springblade.system.pojo.entity.Region;
@@ -53,6 +54,7 @@ import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
import java.util.regex.Pattern;
/**
@@ -138,41 +140,46 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
if (Func.isEmpty(data)) {
throw new ServiceException("导入数据不能为空");
}
List<PortTerminalExcel> errorList = new ArrayList<>();
List<PortTerminal> portTerminalList = new ArrayList<>();
Map<Integer, PortTerminalExcel> errorMap = new TreeMap<>();
Map<String, Integer> codeCountMap = buildImportCodeCountMap(data);
importPortTerminalByCategory(data, codeCountMap, errorMap, true);
importPortTerminalByCategory(data, codeCountMap, errorMap, false);
if (Func.isNotEmpty(errorMap)) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
return new ArrayList<>(errorMap.values());
}
private void importPortTerminalByCategory(List<PortTerminalExcel> data, Map<String, Integer> codeCountMap,
Map<Integer, PortTerminalExcel> errorMap, boolean importPort) {
for (int index = 0; index < data.size(); index++) {
PortTerminalExcel excel = data.get(index);
PortTerminal portTerminal = Objects.requireNonNull(BeanUtil.copyProperties(excel, PortTerminal.class));
boolean isPort = CATEGORY_PORT.equals(trimToEmpty(excel.getCategory()));
if (isPort != importPort) {
continue;
}
PortTerminal portTerminal = buildImportPortTerminal(excel);
portTerminal.setDataSource(SOURCE_BATCH);
portTerminal.setStatus(STATUS_ENABLED);
normalizeImportPortTerminal(portTerminal);
List<String> validationErrors = validateImportPortTerminal(portTerminal, codeCountMap);
List<String> validationErrors = validateImportPortTerminal(excel, portTerminal, codeCountMap);
if (Func.isNotEmpty(validationErrors)) {
excel.setErrorMessage(formatImportErrorMessage(validationErrors));
errorList.add(excel);
errorMap.put(index, excel);
continue;
}
try {
prepare(portTerminal, SOURCE_BATCH);
validate(portTerminal);
portTerminalList.add(portTerminal);
if (!save(portTerminal)) {
throw new ServiceException("港口码头保存失败");
}
} catch (Exception exception) {
String message = exception instanceof ServiceException ? exception.getMessage() : "导入失败";
excel.setErrorMessage(formatImportErrorMessage(List.of(message)));
errorList.add(excel);
errorMap.put(index, excel);
}
}
if (Func.isNotEmpty(errorList)) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
return errorList;
}
for (PortTerminal portTerminal : portTerminalList) {
if (!save(portTerminal)) {
throw new ServiceException("港口码头保存失败");
}
}
return errorList;
}
private String formatImportErrorMessage(List<String> validationErrors) {
@@ -189,7 +196,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
private Map<String, Integer> buildImportCodeCountMap(List<PortTerminalExcel> data) {
Map<String, Integer> codeCountMap = new HashMap<>();
for (PortTerminalExcel excel : data) {
String code = trimToEmpty(excel.getCode()).toUpperCase(Locale.ROOT);
String code = resolveImportCode(excel);
if (Func.isNotEmpty(code)) {
codeCountMap.merge(code, 1, Integer::sum);
}
@@ -197,6 +204,32 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
return codeCountMap;
}
private PortTerminal buildImportPortTerminal(PortTerminalExcel excel) {
PortTerminal portTerminal = new PortTerminal();
portTerminal.setCode(resolveImportCode(excel));
portTerminal.setName(excel.getName());
portTerminal.setCategory(excel.getCategory());
portTerminal.setParentName(excel.getParentName());
portTerminal.setParentCode(CATEGORY_TERMINAL.equals(trimToEmpty(excel.getCategory())) ? excel.getPortCode() : excel.getParentCode());
portTerminal.setCountry(excel.getCountry());
portTerminal.setCity(excel.getCity());
portTerminal.setDistrictName(excel.getDistrictName());
portTerminal.setDetailAddress(excel.getDetailAddress());
portTerminal.setLongitude(excel.getLongitude());
portTerminal.setLatitude(excel.getLatitude());
portTerminal.setRemark(excel.getRemark());
return portTerminal;
}
private String resolveImportCode(PortTerminalExcel excel) {
String portCode = trimToEmpty(excel.getPortCode()).toUpperCase(Locale.ROOT);
String terminalCode = trimToEmpty(excel.getTerminalCode()).toUpperCase(Locale.ROOT);
if (Func.isEmpty(terminalCode)) {
return portCode;
}
return Func.isEmpty(portCode) ? terminalCode : portCode + "-" + terminalCode;
}
private void normalizeImportPortTerminal(PortTerminal portTerminal) {
portTerminal.setCode(trimToEmpty(portTerminal.getCode()).toUpperCase(Locale.ROOT));
portTerminal.setCategory(trimToEmpty(portTerminal.getCategory()));
@@ -218,11 +251,13 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
portTerminal.setRemark(trimToNull(portTerminal.getRemark()));
}
private List<String> validateImportPortTerminal(PortTerminal portTerminal, Map<String, Integer> codeCountMap) {
private List<String> validateImportPortTerminal(PortTerminalExcel excel, PortTerminal portTerminal,
Map<String, Integer> codeCountMap) {
List<String> validationErrors = new ArrayList<>();
if (!CATEGORY_PORT.equals(portTerminal.getCategory()) && !CATEGORY_TERMINAL.equals(portTerminal.getCategory())) {
addValidationError(validationErrors, "类型只能为港口或码头");
}
validateImportCodeColumns(excel, portTerminal, validationErrors);
if (Func.isEmpty(portTerminal.getCode())) {
addValidationError(validationErrors, "编码不能为空");
} else {
@@ -274,6 +309,30 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
return validationErrors;
}
private void validateImportCodeColumns(PortTerminalExcel excel, PortTerminal portTerminal,
List<String> validationErrors) {
String portCode = trimToEmpty(excel.getPortCode()).toUpperCase(Locale.ROOT);
String terminalCode = trimToEmpty(excel.getTerminalCode()).toUpperCase(Locale.ROOT);
String parentCode = trimToEmpty(excel.getParentCode()).toUpperCase(Locale.ROOT);
if (Func.isEmpty(portCode)) {
addValidationError(validationErrors, "港口编码不能为空");
}
if (!CATEGORY_TERMINAL.equals(portTerminal.getCategory())) {
return;
}
if (Func.isEmpty(terminalCode)) {
addValidationError(validationErrors, "码头编码不能为空");
}
if (Func.isEmpty(portTerminal.getParentName())) {
addValidationError(validationErrors, "上级港口不能为空");
}
if (Func.isEmpty(parentCode)) {
addValidationError(validationErrors, "上级港口编码不能为空");
} else if (Func.isNotEmpty(portCode) && !portCode.equals(parentCode) && !portCode.endsWith(parentCode)) {
addValidationError(validationErrors, "港口编码与上级港口编码不匹配");
}
}
private void validateImportPortRegion(PortTerminal portTerminal, List<String> validationErrors) {
if (Func.isEmpty(portTerminal.getCountry())) {
addValidationError(validationErrors, "国家不能为空");
@@ -324,10 +383,10 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
}
@Override
public List<PortTerminalExcel> exportPortTerminal(Wrapper<PortTerminal> queryWrapper) {
public List<PortTerminalExportExcel> exportPortTerminal(Wrapper<PortTerminal> queryWrapper) {
List<PortTerminal> portTerminalList = list(queryWrapper);
return portTerminalList.stream().map(portTerminal -> {
PortTerminalExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(portTerminal, PortTerminalExcel.class));
PortTerminalExportExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(portTerminal, PortTerminalExportExcel.class));
excel.setRegionCode(portTerminal.getDistrictCode());
excel.setLongitude(scaleCoordinate(portTerminal.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE));
excel.setLatitude(scaleCoordinate(portTerminal.getLatitude(), MIN_LATITUDE, MAX_LATITUDE));
@@ -34,7 +34,9 @@ import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.system.cache.UserCache;
import org.springblade.system.excel.RailwayStationExcel;
import org.springblade.system.excel.RailwayStationExportExcel;
import org.springblade.system.mapper.RailwayStationMapper;
import org.springblade.system.pojo.entity.RailwayStation;
import org.springblade.system.pojo.entity.Region;
@@ -195,10 +197,6 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
railwayStation.setCityName(trimToNull(railwayStation.getCityName()));
railwayStation.setDistrictCode(trimToNull(railwayStation.getDistrictCode()));
railwayStation.setDistrictName(trimToNull(railwayStation.getDistrictName()));
railwayStation.setRegionCode(trimToNull(railwayStation.getRegionCode()));
if (Func.isEmpty(railwayStation.getDistrictCode()) && Func.isNotEmpty(railwayStation.getRegionCode())) {
railwayStation.setDistrictCode(railwayStation.getRegionCode());
}
railwayStation.setDetailAddress(trimToNull(railwayStation.getDetailAddress()));
railwayStation.setRemark(trimToNull(railwayStation.getRemark()));
}
@@ -250,7 +248,6 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
validateImportLength(railwayStation.getProvinceName(), REGION_NAME_MAX_LENGTH, "所属省份不能超过128字", validationErrors);
validateImportLength(railwayStation.getCityName(), REGION_NAME_MAX_LENGTH, "所属城市不能超过128字", validationErrors);
validateImportLength(railwayStation.getDistrictName(), REGION_NAME_MAX_LENGTH, "所属区县不能超过128字", validationErrors);
validateImportLength(railwayStation.getRegionCode(), REGION_CODE_MAX_LENGTH, "行政区划编号不能超过32字", validationErrors);
if (Func.isEmpty(railwayStation.getDetailAddress())) {
addValidationError(validationErrors, "详细地址不能为空");
}
@@ -286,7 +283,9 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
}
private void validateImportCoordinate(BigDecimal value, BigDecimal min, BigDecimal max, String name, List<String> validationErrors) {
if (Func.isNotEmpty(value) && !validRange(value, min, max)) {
if (Func.isEmpty(value)) {
addValidationError(validationErrors, name + "不能为空");
} else if (!validRange(value, min, max)) {
addValidationError(validationErrors, name + "范围不正确");
}
}
@@ -324,14 +323,15 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
}
@Override
public List<RailwayStationExcel> exportRailwayStation(Wrapper<RailwayStation> queryWrapper) {
public List<RailwayStationExportExcel> exportRailwayStation(Wrapper<RailwayStation> queryWrapper) {
List<RailwayStation> railwayStationList = list(queryWrapper);
return railwayStationList.stream().map(railwayStation -> {
RailwayStationExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(railwayStation, RailwayStationExcel.class));
RailwayStationExportExcel excel = Objects.requireNonNull(BeanUtil.copyProperties(railwayStation, RailwayStationExportExcel.class));
excel.setLongitude(formatCoordinate(railwayStation.getLongitude(), MIN_LONGITUDE, MAX_LONGITUDE));
excel.setLatitude(formatCoordinate(railwayStation.getLatitude(), MIN_LATITUDE, MAX_LATITUDE));
excel.setDataSource(normalizeDataSource(railwayStation.getDataSource()));
excel.setStatusName(Objects.equals(railwayStation.getStatus(), STATUS_ENABLED) ? "启用" : "停用");
excel.setUpdateUserName(UserCache.getUserRealName(railwayStation.getUpdateUser()));
return excel;
}).toList();
}
@@ -488,7 +488,7 @@ public class RailwayStationServiceImpl extends BaseServiceImpl<RailwayStationMap
private void validateCoordinate(BigDecimal value, BigDecimal min, BigDecimal max, String name) {
if (value == null) {
return;
throw new ServiceException(name + "不能为空");
}
if (value.compareTo(min) < 0 || value.compareTo(max) > 0) {
throw new ServiceException(name + "范围不正确");