diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java index 108260e..5995086 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/AirportMasterController.java @@ -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 list = airportMasterService.exportAirportMaster(queryWrapper); - ExcelUtil.export(response, "空港机场主数据" + DateUtil.time(), "空港机场主数据表", list, AirportMasterExcel.class); + List list = airportMasterService.exportAirportMaster(queryWrapper); + ExcelUtil.export(response, "空港机场主数据" + DateUtil.time(), "空港机场主数据表", list, AirportMasterExportExcel.class); } /** diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/PortTerminalController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/PortTerminalController.java index 6e53caa..3979b3c 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/PortTerminalController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/PortTerminalController.java @@ -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 list = portTerminalService.exportPortTerminal(queryWrapper); - ExcelUtil.export(response, "港口码头主数据" + DateUtil.time(), "港口码头主数据表", list, PortTerminalExcel.class); + List list = portTerminalService.exportPortTerminal(queryWrapper); + ExcelUtil.export(response, "港口码头主数据" + DateUtil.time(), "港口码头主数据表", list, PortTerminalExportExcel.class); } /** diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java index 67012f5..7bc1f8c 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/controller/RailwayStationController.java @@ -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 list = railwayStationService.exportRailwayStation(queryWrapper); - ExcelUtil.export(response, "铁路车站主数据" + DateUtil.time(), "铁路车站主数据表", list, RailwayStationExcel.class); + List list = railwayStationService.exportRailwayStation(queryWrapper); + ExcelUtil.export(response, "铁路车站主数据" + DateUtil.time(), "铁路车站主数据表", list, RailwayStationExportExcel.class); } /** diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java index 4c2c095..1efcd54 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExcel.java @@ -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; diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExportExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExportExcel.java new file mode 100644 index 0000000..aa56df5 --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/AirportMasterExportExcel.java @@ -0,0 +1,105 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * 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; +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/PortTerminalExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/PortTerminalExcel.java index 9558a23..5044906 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/excel/PortTerminalExcel.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/PortTerminalExcel.java @@ -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; diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/PortTerminalExportExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/PortTerminalExportExcel.java new file mode 100644 index 0000000..f933bc8 --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/PortTerminalExportExcel.java @@ -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; +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java index 0e1cd27..8702324 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExcel.java @@ -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; diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExportExcel.java b/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExportExcel.java new file mode 100644 index 0000000..b74401e --- /dev/null +++ b/blade-service/blade-system/src/main/java/org/springblade/system/excel/RailwayStationExportExcel.java @@ -0,0 +1,108 @@ +/** + * BladeX Commercial License Agreement + * Copyright (c) 2018-2099, https://bladex.cn. All rights reserved. + *

+ * Use of this software is governed by the Commercial License Agreement + * obtained after purchasing a license from BladeX. + *

+ * 1. This software is for development use only under a valid license + * from BladeX. + *

+ * 2. Redistribution of this software's source code to any third party + * without a commercial license is strictly prohibited. + *

+ * 3. Licensees may copyright their own code but cannot use segments + * from this software for such purposes. Copyright of this software + * remains with BladeX. + *

+ * Using this software signifies agreement to this License, and the software + * must not be used for illegal purposes. + *

+ * THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY. The author is + * not liable for any claims arising from secondary or illegal development. + *

+ * 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; +} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IAirportMasterService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IAirportMasterService.java index ee4bc29..f50c8b2 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IAirportMasterService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IAirportMasterService.java @@ -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 { * @param queryWrapper 查询条件 * @return 导出数据 */ - List exportAirportMaster(Wrapper queryWrapper); + List exportAirportMaster(Wrapper queryWrapper); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IPortTerminalService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IPortTerminalService.java index ffbfb20..c7a0ff6 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IPortTerminalService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IPortTerminalService.java @@ -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 { * @param queryWrapper 查询条件 * @return 导出数据 */ - List exportPortTerminal(Wrapper queryWrapper); + List exportPortTerminal(Wrapper queryWrapper); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/IRailwayStationService.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/IRailwayStationService.java index 03133ad..8048415 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/IRailwayStationService.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/IRailwayStationService.java @@ -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 { * @param queryWrapper 查询条件 * @return 导出数据 */ - List exportRailwayStation(Wrapper queryWrapper); + List exportRailwayStation(Wrapper queryWrapper); } diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java index 2e5d62e..656b2f0 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/AirportMasterServiceImpl.java @@ -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 exportAirportMaster(Wrapper queryWrapper) { + public List exportAirportMaster(Wrapper queryWrapper) { List 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 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 queryWrapper = Wrappers.lambdaQuery() .eq(FeeItem::getName, feeItem.getName()) .eq(FeeItem::getIsDeleted, 0); @@ -169,6 +169,19 @@ public class FeeItemServiceImpl extends BaseServiceImpl if (count(queryWrapper) > 0L) { throw new ServiceException("该费用项已存在"); } + + if (Func.isEmpty(feeItem.getEnglishName())) { + return; + } + LambdaQueryWrapper codeQueryWrapper = Wrappers.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) { diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/PortTerminalServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/PortTerminalServiceImpl.java index c3723ac..4057b9e 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/PortTerminalServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/PortTerminalServiceImpl.java @@ -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 errorList = new ArrayList<>(); - List portTerminalList = new ArrayList<>(); + Map errorMap = new TreeMap<>(); Map 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 data, Map codeCountMap, + Map 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 validationErrors = validateImportPortTerminal(portTerminal, codeCountMap); + List 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 validationErrors) { @@ -189,7 +196,7 @@ public class PortTerminalServiceImpl extends BaseServiceImpl buildImportCodeCountMap(List data) { Map 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 validateImportPortTerminal(PortTerminal portTerminal, Map codeCountMap) { + private List validateImportPortTerminal(PortTerminalExcel excel, PortTerminal portTerminal, + Map codeCountMap) { List 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 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 validationErrors) { if (Func.isEmpty(portTerminal.getCountry())) { addValidationError(validationErrors, "国家不能为空"); @@ -324,10 +383,10 @@ public class PortTerminalServiceImpl extends BaseServiceImpl exportPortTerminal(Wrapper queryWrapper) { + public List exportPortTerminal(Wrapper queryWrapper) { List 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)); diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RailwayStationServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RailwayStationServiceImpl.java index af63c0b..5d7b183 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RailwayStationServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/RailwayStationServiceImpl.java @@ -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 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 exportRailwayStation(Wrapper queryWrapper) { + public List exportRailwayStation(Wrapper queryWrapper) { List 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 0) { throw new ServiceException(name + "范围不正确"); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java index c9666a5..50fb6f5 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java @@ -462,6 +462,11 @@ public class FormalSettlementServiceImpl extends BaseServiceImpllambdaQuery() + .eq(FormalSettlementPayment::getFormalSettlementId, settlement.getId()) + .eq(FormalSettlementPayment::getIsDeleted, 0) + .notIn(FormalSettlementPayment::getBillStatus, RETURNED, VOIDED)); + if (activePaymentCount > 0) throw new ServiceException("该结算单正在申请结算尾款,不允许再次提交申请付款"); BigDecimal amount = positive(appliedAmount, "申请付款金额"); BigDecimal available = money(settlement.getSettlementAmount()).subtract(money(settlement.getAppliedPaymentAmount())); if (amount.compareTo(available) > 0) throw new ServiceException("申请付款金额不能超过剩余可申请金额" + available); @@ -701,9 +706,10 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl formalSettlementIds = new java.util.ArrayList<>(); + if (entity.getSettlementId() != null) formalSettlementIds.add(entity.getSettlementId()); + formalSettlementIds.addAll(settlementRelationMapper.selectList(Wrappers.lambdaQuery() + .select(PaymentApplicationSettlement::getFormalSettlementId) + .eq(PaymentApplicationSettlement::getPaymentApplicationId, entity.getId()) + .eq(PaymentApplicationSettlement::getIsDeleted, 0)) + .stream().map(PaymentApplicationSettlement::getFormalSettlementId).filter(Objects::nonNull).toList()); + formalSettlementIds = formalSettlementIds.stream().distinct().toList(); + if (formalSettlementIds.isEmpty()) return; + long activeTailPaymentCount = formalSettlementPaymentMapper.selectCount(Wrappers.lambdaQuery() + .eq(FormalSettlementPayment::getIsDeleted, 0) + .in(FormalSettlementPayment::getFormalSettlementId, formalSettlementIds) + .notIn(FormalSettlementPayment::getBillStatus, RETURNED, VOIDED)); + if (activeTailPaymentCount > 0) { + throw new ServiceException("该结算单正在申请结算尾款,不允许再次提交申请付款"); + } + } private PaymentApplication existing(Long id) { PaymentApplication entity = getById(id); if (entity == null || Objects.equals(entity.getIsDeleted(), 1)) throw new ServiceException("付款申请不存在"); return entity; } private PaymentApplication editable(Long id) { PaymentApplication entity = existing(id); if (!List.of(DRAFT, RETURNED).contains(entity.getApprovalStatus())) throw new ServiceException("当前状态不可编辑"); return entity; } private String nextNo() { String prefix = "FKD" + LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE); return prefix + String.format("%05d", count(Wrappers.lambdaQuery().likeRight(PaymentApplication::getPaymentNo, prefix)) + 1); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java index c46c0b2..ff45ce7 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java @@ -961,9 +961,10 @@ public class PreSettlementServiceImpl extends BaseServiceImpl FEE_SOURCE_MANUAL_LEGACY = Set.of("手工录入", "手动添加"); @@ -258,13 +259,16 @@ public class ReceivablePayableDetailServiceImpl if (!"pending".equals(detail.getSettlementStatus())) { continue; } - BigDecimal before = money(detail.getTotalAmount()); + List beforeRows = activeCargoFees(detail.getId()); rebuildDetailFee(detail, request.getBillingPlanId()); if (request.getAdjustAmount() != null && request.getAdjustAmount().compareTo(BigDecimal.ZERO) != 0) { applyManualAdjustment(detail, request.getAdjustAmount(), request.getAdjustFeeItem(), request.getAdjustReason()); } - saveChangeRecord(detail, "【费用合计】从[" + formatMoney(before) + "]调整为[" + formatMoney(detail.getTotalAmount()) + "]", - request.getAdjustReason()); + List afterRows = activeCargoFees(detail.getId()); + List changes = reconcileUpdatedFeeAmounts(beforeRows, afterRows); + for (int index = 0; index < changes.size(); index++) { + saveChangeRecord(detail, changes.get(index), request.getAdjustReason(), String.format("%04d", index + 1)); + } } } @@ -605,6 +609,7 @@ public class ReceivablePayableDetailServiceImpl continue; } ReceivablePayableDetail detail = buildDetail(waybill, contract, request.getBillingPlanId(), settlementType(request.getSettlementType())); + detail.setSourceType(SOURCE_MANUAL_GENERATION); save(detail); calculatedFees(waybill, contract, request.getBillingPlanId()).forEach(fee -> { fee.setDetailId(detail.getId()); @@ -1969,6 +1974,101 @@ public class ReceivablePayableDetailServiceImpl updateById(detail); } + private List activeCargoFees(Long detailId) { + return cargoFeeMapper.selectList(Wrappers.lambdaQuery() + .eq(ReceivablePayableCargoFee::getDetailId, detailId) + .eq(ReceivablePayableCargoFee::getIsDeleted, 0) + .orderByAsc(ReceivablePayableCargoFee::getLineNo)); + } + + private List reconcileUpdatedFeeAmounts(List beforeRows, + List afterRows) { + Map beforeByKey = beforeRows.stream() + .collect(Collectors.toMap(this::feeRowKey, row -> row, (left, right) -> left, LinkedHashMap::new)); + Set matchedKeys = new LinkedHashSet<>(); + List changes = new ArrayList<>(); + for (ReceivablePayableCargoFee after : afterRows) { + String key = feeRowKey(after); + ReceivablePayableCargoFee before = beforeByKey.get(key); + if (before != null) matchedKeys.add(key); + BigDecimal beforeAmount = before == null ? BigDecimal.ZERO : money(before.getAfterAmount()); + BigDecimal afterAmount = money(after.getAfterAmount()); + boolean changed = before == null || feeChanged(before, after); + if (changed) { + after.setOriginalAmount(beforeAmount); + after.setAdjustAmount(afterAmount.subtract(beforeAmount)); + } else { + after.setOriginalAmount(before.getOriginalAmount()); + after.setAdjustAmount(before.getAdjustAmount()); + } + after.setAfterAmount(afterAmount); + cargoFeeMapper.updateById(after); + if (changed) { + changes.add(updatedFeeChangeContent(before, after)); + } + } + for (ReceivablePayableCargoFee before : beforeRows) { + if (!matchedKeys.contains(feeRowKey(before))) { + changes.add(updatedFeeChangeContent(before, null)); + } + } + return changes; + } + + private String updatedFeeChangeContent(ReceivablePayableCargoFee before, + ReceivablePayableCargoFee after) { + List changes = new ArrayList<>(); + BigDecimal beforeFreight = before == null ? BigDecimal.ZERO : money(before.getFreightAmount()); + BigDecimal afterFreight = after == null ? BigDecimal.ZERO : money(after.getFreightAmount()); + if (beforeFreight.compareTo(afterFreight) != 0) { + changes.add("【运输费】从[" + formatMoney(beforeFreight) + "]调整为[" + + formatMoney(afterFreight) + "]"); + } + Map beforeItems = parseMap(before == null ? null : before.getFeeItemsJson()); + Map afterItems = parseMap(after == null ? null : after.getFeeItemsJson()); + Set names = new LinkedHashSet<>(beforeItems.keySet()); + names.addAll(afterItems.keySet()); + for (String name : names) { + if (isFreightFeeItem(name)) continue; + BigDecimal beforeAmount = decimal(beforeItems.get(name)); + BigDecimal afterAmount = decimal(afterItems.get(name)); + if (beforeAmount.compareTo(afterAmount) != 0) { + changes.add("【" + name + "】从[" + formatMoney(beforeAmount) + "]调整为[" + + formatMoney(afterAmount) + "]"); + } + } + if (changes.isEmpty()) { + BigDecimal beforeAmount = before == null ? BigDecimal.ZERO : money(before.getAfterAmount()); + BigDecimal afterAmount = after == null ? BigDecimal.ZERO : money(after.getAfterAmount()); + changes.add("【费用合计】从[" + formatMoney(beforeAmount) + "]调整为[" + + formatMoney(afterAmount) + "]"); + } + ReceivablePayableCargoFee cargoFee = after == null ? before : after; + return String.join(";", changes) + "(" + Objects.toString(cargoFee.getCargoName(), "") + ")"; + } + + private String feeRowKey(ReceivablePayableCargoFee fee) { + if (Func.isNotEmpty(fee.getLineNo())) return fee.getLineNo(); + return String.join("|", Objects.toString(fee.getCargoName(), ""), + Objects.toString(fee.getCargoType(), ""), Objects.toString(fee.getSpecification(), ""), + Objects.toString(fee.getModel(), "")); + } + + private boolean feeChanged(ReceivablePayableCargoFee before, ReceivablePayableCargoFee after) { + return money(before.getAfterAmount()).compareTo(money(after.getAfterAmount())) != 0 + || money(before.getFreightAmount()).compareTo(money(after.getFreightAmount())) != 0 + || feeItemsChanged(before.getFeeItemsJson(), after.getFeeItemsJson()); + } + + private boolean feeItemsChanged(String beforeJson, String afterJson) { + Map beforeItems = parseMap(beforeJson); + Map afterItems = parseMap(afterJson); + Set names = new LinkedHashSet<>(beforeItems.keySet()); + names.addAll(afterItems.keySet()); + return names.stream().anyMatch(name -> + decimal(beforeItems.get(name)).compareTo(decimal(afterItems.get(name))) != 0); + } + private String aggregateFeeItemsJson(List fees) { Map feeItems = new LinkedHashMap<>(); fees.forEach(fee -> parseMap(fee.getFeeItemsJson()).forEach((name, value) -> diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/SettlementAdjustmentServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/SettlementAdjustmentServiceImpl.java index d45f106..4908981 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/SettlementAdjustmentServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/SettlementAdjustmentServiceImpl.java @@ -13,7 +13,10 @@ import org.springblade.transport.mapper.FormalSettlementDetailFeeMapper; import org.springblade.transport.mapper.FormalSettlementDetailMapper; import org.springblade.transport.mapper.FormalSettlementChangeRecordMapper; import org.springblade.transport.mapper.FormalSettlementMapper; +import org.springblade.transport.mapper.FormalSettlementPaymentMapper; import org.springblade.transport.mapper.FormalSettlementSummaryFeeMapper; +import org.springblade.transport.mapper.PaymentApplicationMapper; +import org.springblade.transport.mapper.PaymentApplicationSettlementMapper; import org.springblade.transport.mapper.SettlementAdjustmentDetailMapper; import org.springblade.transport.mapper.SettlementAdjustmentMapper; import org.springblade.transport.pojo.dto.SettlementAdjustmentSaveRequest; @@ -22,7 +25,10 @@ import org.springblade.transport.pojo.entity.FormalSettlement; import org.springblade.transport.pojo.entity.FormalSettlementChangeRecord; import org.springblade.transport.pojo.entity.FormalSettlementDetail; import org.springblade.transport.pojo.entity.FormalSettlementDetailFee; +import org.springblade.transport.pojo.entity.FormalSettlementPayment; import org.springblade.transport.pojo.entity.FormalSettlementSummaryFee; +import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springblade.transport.pojo.entity.PaymentApplicationSettlement; import org.springblade.transport.pojo.entity.SettlementAdjustment; import org.springblade.transport.pojo.entity.SettlementAdjustmentDetail; import org.springblade.transport.pojo.vo.SettlementAdjustmentVO; @@ -36,9 +42,11 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; @Service @RequiredArgsConstructor @@ -48,6 +56,7 @@ public class SettlementAdjustmentServiceImpl extends BaseServiceImpl selectPage(IPage page, SettlementAdjustmentVO query) { @@ -94,6 +106,11 @@ public class SettlementAdjustmentServiceImpl extends BaseServiceImpl tailPaymentSettlementIds = tailPaymentSettlementIds(rows.stream() + .map(FormalSettlement::getId).filter(Objects::nonNull).toList()); + rows = rows.stream().filter(row -> !isSettlementCompleted(row) + && !isTailSettlement(row) + && !tailPaymentSettlementIds.contains(row.getId())).toList(); List> result = new ArrayList<>(); for (FormalSettlement row : rows) { Map item = new HashMap<>(); @@ -133,7 +150,7 @@ public class SettlementAdjustmentServiceImpl extends BaseServiceImpl 0 + && money(formal.getPaidAmount()).compareTo(money(formal.getSettlementAmount())) >= 0); + } + private boolean isTailSettlement(FormalSettlement formal) { + return formal != null && "预结算合并".equals(formal.getSourceType()); + } + private boolean hasTailPayment(Long formalSettlementId) { + return formalSettlementId != null && tailPaymentSettlementIds(List.of(formalSettlementId)) + .contains(formalSettlementId); + } + private Set tailPaymentSettlementIds(List formalSettlementIds) { + if (formalSettlementIds == null || formalSettlementIds.isEmpty()) return Set.of(); + Set result = new HashSet<>(formalPaymentMapper.selectList( + Wrappers.lambdaQuery() + .eq(FormalSettlementPayment::getIsDeleted, 0) + .in(FormalSettlementPayment::getFormalSettlementId, formalSettlementIds) + .notIn(FormalSettlementPayment::getBillStatus, RETURNED, VOIDED)).stream() + .map(FormalSettlementPayment::getFormalSettlementId) + .filter(Objects::nonNull).toList()); + result.addAll(paymentApplicationMapper.selectList(Wrappers.lambdaQuery() + .select(PaymentApplication::getSettlementId) + .in(PaymentApplication::getSettlementId, formalSettlementIds) + .eq(PaymentApplication::getPaymentType, "settlement_payment") + .eq(PaymentApplication::getIsDeleted, 0) + .notIn(PaymentApplication::getApprovalStatus, RETURNED, VOIDED)).stream() + .map(PaymentApplication::getSettlementId).filter(Objects::nonNull).toList()); + List relations = paymentApplicationSettlementMapper.selectList( + Wrappers.lambdaQuery() + .select(PaymentApplicationSettlement::getPaymentApplicationId, + PaymentApplicationSettlement::getFormalSettlementId) + .in(PaymentApplicationSettlement::getFormalSettlementId, formalSettlementIds) + .eq(PaymentApplicationSettlement::getIsDeleted, 0)); + List applicationIds = relations.stream() + .map(PaymentApplicationSettlement::getPaymentApplicationId) + .filter(Objects::nonNull).distinct().toList(); + if (applicationIds.isEmpty()) return result; + Set activeApplicationIds = new HashSet<>(paymentApplicationMapper.selectList( + Wrappers.lambdaQuery() + .select(PaymentApplication::getId) + .in(PaymentApplication::getId, applicationIds) + .eq(PaymentApplication::getPaymentType, "settlement_payment") + .eq(PaymentApplication::getIsDeleted, 0) + .notIn(PaymentApplication::getApprovalStatus, RETURNED, VOIDED)).stream() + .map(PaymentApplication::getId).filter(Objects::nonNull).toList()); + relations.stream().filter(relation -> activeApplicationIds.contains(relation.getPaymentApplicationId())) + .map(PaymentApplicationSettlement::getFormalSettlementId).filter(Objects::nonNull) + .forEach(result::add); + return result; + } private boolean isManualFee(SettlementAdjustmentSaveRequest.Detail row) { return row.getFormalSettlementDetailId() == null && row.getFormalSettlementDetailFeeId() == null; } private boolean isManualFee(SettlementAdjustmentDetail row) { return row.getFormalSettlementDetailId() == null && row.getFormalSettlementDetailFeeId() == null; } private FormalSettlementDetailFee validateFee(Long formalId, Long detailId, Long feeId) { FormalSettlementDetail detail = formalDetailMapper.selectById(detailId); FormalSettlementDetailFee fee = formalFeeMapper.selectById(feeId); if (detail == null || fee == null || !Objects.equals(detail.getFormalSettlementId(), formalId) || !Objects.equals(fee.getFormalSettlementDetailId(), detailId)) throw new ServiceException("费用明细不存在或不属于关联正式结算单"); return fee; }