diff --git a/blade-auth/src/main/java/org/springblade/auth/config/BladeAuthConfiguration.java b/blade-auth/src/main/java/org/springblade/auth/config/BladeAuthConfiguration.java index 15a2061..f587e7e 100644 --- a/blade-auth/src/main/java/org/springblade/auth/config/BladeAuthConfiguration.java +++ b/blade-auth/src/main/java/org/springblade/auth/config/BladeAuthConfiguration.java @@ -25,6 +25,7 @@ */ package org.springblade.auth.config; +import org.springblade.auth.granter.IamAwareTokenGranterFactory; import org.springblade.auth.handler.BladeAuthorizationHandler; import org.springblade.auth.handler.BladeLockHandler; import org.springblade.auth.handler.BladeLogHandler; @@ -37,6 +38,9 @@ import org.springblade.core.jwt.props.JwtProperties; import org.springblade.core.launch.props.BladeProperties; import org.springblade.core.launch.server.ServerInfo; import org.springblade.core.oauth2.config.OAuth2AutoConfiguration; +import org.springblade.core.oauth2.granter.TokenGranter; +import org.springblade.core.oauth2.granter.TokenGranterEnhancer; +import org.springblade.core.oauth2.granter.TokenGranterFactory; import org.springblade.core.oauth2.handler.AuthorizationHandler; import org.springblade.core.oauth2.handler.PasswordHandler; import org.springblade.core.oauth2.handler.TokenHandler; @@ -51,8 +55,11 @@ import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; +import java.util.List; + /** * BladeAuthConfiguration * @@ -101,4 +108,12 @@ public class BladeAuthConfiguration { return new BladeUserDetailService(userClient); } + @Primary + @Bean("iamAwareTokenGranterFactory") + public TokenGranterFactory tokenGranterFactory(List tokenGranters, + List tokenGranterEnhancers, + OAuth2Properties properties) { + return new IamAwareTokenGranterFactory(tokenGranters, tokenGranterEnhancers, properties); + } + } diff --git a/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java b/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java index b128525..c357d78 100644 --- a/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java +++ b/blade-auth/src/main/java/org/springblade/auth/granter/IamSsoTokenGranter.java @@ -123,7 +123,7 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter { @Override public OAuth2User user(OAuth2Request request) { - if (!isIamRequest(request)) { + if (!isIamRequest(request, true)) { throw new UserInvalidException(OAuth2TokenConstant.TOKEN_NOT_CORRECT); } validateRequest(request); @@ -192,12 +192,16 @@ public class IamSsoTokenGranter extends AuthorizationCodeGranter { return user; } - private boolean isIamRequest(OAuth2Request request) { + public boolean supports(OAuth2Request request) { + return isIamRequest(request, false); + } + + private boolean isIamRequest(OAuth2Request request, boolean logMiss) { String redirectUri = normalizeRedirectUri(request.getRedirectUri()); boolean iamRequest = StringUtil.isNotBlank(properties.getRedirectUri()) && StringUtil.isNotBlank(request.getCode()) && StringUtil.equals(properties.getRedirectUri(), redirectUri); - if (!iamRequest) { + if (!iamRequest && logMiss) { log.info("IAM统一身份认证请求未命中,configRedirectUri={}, requestRedirectUri={}, normalizedRedirectUri={}, code={}", properties.getRedirectUri(), request.getRedirectUri(), redirectUri, request.getCode()); } 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 af77fc6..ce99ccb 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 @@ -74,6 +74,10 @@ import java.util.Map; @Tag(name = "空港机场主数据", description = "空港机场主数据") public class AirportMasterController extends BladeController { + private static final int DEFAULT_CURRENT = 1; + private static final int DEFAULT_SIZE = 10; + private static final int MAX_SIZE = 100; + private final IAirportMasterService airportMasterService; /** @@ -83,7 +87,13 @@ public class AirportMasterController extends BladeController { @ApiOperationSupport(order = 1) @Operation(summary = "详情", description = "传入airportMaster") public R detail(AirportMaster airportMaster) { - AirportMaster detail = airportMasterService.getOne(Condition.getQueryWrapper(airportMaster)); + if (Func.isEmpty(airportMaster.getId())) { + return R.fail("主键不能为空"); + } + AirportMaster detail = airportMasterService.getById(airportMaster.getId()); + if (Func.isEmpty(detail)) { + return R.fail("空港机场不存在"); + } return R.data(AirportMasterWrapper.build().entityVO(detail)); } @@ -94,7 +104,7 @@ public class AirportMasterController extends BladeController { @ApiOperationSupport(order = 2) @Operation(summary = "分页", description = "传入airportMaster") public R> list(AirportMasterVO airportMaster, Query query) { - IPage pages = airportMasterService.selectAirportMasterPage(Condition.getPage(query), airportMaster); + IPage pages = airportMasterService.selectAirportMasterPage(Condition.getPage(normalizeQuery(query)), airportMaster); return R.data(pages); } @@ -115,6 +125,9 @@ public class AirportMasterController extends BladeController { @ApiOperationSupport(order = 4) @Operation(summary = "逻辑删除", description = "传入ids") public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + if (Func.isEmpty(ids)) { + return R.fail("主键不能为空"); + } return R.status(airportMasterService.deleteLogic(Func.toLongList(ids))); } @@ -136,6 +149,13 @@ public class AirportMasterController extends BladeController { @ApiOperationSupport(order = 6) @Operation(summary = "导入空港机场主数据", description = "传入excel") public R importAirportMaster(MultipartFile file) { + if (file == null || file.isEmpty()) { + return R.fail("上传文件不能为空"); + } + String fileName = Func.toStrWithEmpty(file.getOriginalFilename(), "").toLowerCase(); + if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) { + return R.fail("请上传 .xls,.xlsx 标准格式文件"); + } AirportMasterImporter airportMasterImporter = new AirportMasterImporter(airportMasterService); ExcelUtil.save(file, airportMasterImporter, AirportMasterExcel.class); return R.success("操作成功"); @@ -149,6 +169,9 @@ public class AirportMasterController extends BladeController { @Operation(summary = "导出空港机场主数据") public void exportAirportMaster(@Parameter(hidden = true) @RequestParam Map airportMaster, HttpServletResponse response) { Object ids = airportMaster.remove("ids"); + airportMaster.remove("Blade-Auth"); + airportMaster.remove("Authorization"); + airportMaster.remove("access_token"); QueryWrapper queryWrapper = Condition.getQueryWrapper(airportMaster, AirportMaster.class); if (Func.isNotEmpty(ids)) { queryWrapper.lambda().in(AirportMaster::getId, Func.toLongList(ids.toString())); @@ -168,4 +191,20 @@ public class AirportMasterController extends BladeController { ExcelUtil.export(response, "空港机场主数据模板", "空港机场主数据表", list, AirportMasterExcel.class); } + private Query normalizeQuery(Query query) { + if (query == null) { + query = new Query(); + } + if (query.getCurrent() == null || query.getCurrent() < DEFAULT_CURRENT) { + query.setCurrent(DEFAULT_CURRENT); + } + if (query.getSize() == null || query.getSize() <= 0) { + query.setSize(DEFAULT_SIZE); + } + if (query.getSize() > MAX_SIZE) { + query.setSize(MAX_SIZE); + } + return query; + } + } 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 bcf408d..38f1306 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 @@ -74,6 +74,11 @@ import java.util.Map; @Tag(name = "港口码头主数据", description = "港口码头主数据") public class PortTerminalController extends BladeController { + private static final int DEFAULT_CURRENT = 1; + private static final int DEFAULT_SIZE = 10; + private static final int MAX_SIZE = 100; + private static final String SOURCE_INITIAL = "初始化导入"; + private final IPortTerminalService portTerminalService; /** @@ -83,7 +88,13 @@ public class PortTerminalController extends BladeController { @ApiOperationSupport(order = 1) @Operation(summary = "详情", description = "传入portTerminal") public R detail(PortTerminal portTerminal) { - PortTerminal detail = portTerminalService.getOne(Condition.getQueryWrapper(portTerminal)); + if (Func.isEmpty(portTerminal.getId())) { + return R.fail("主键不能为空"); + } + PortTerminal detail = portTerminalService.getById(portTerminal.getId()); + if (Func.isEmpty(detail)) { + return R.fail("港口码头不存在"); + } return R.data(PortTerminalWrapper.build().entityVO(detail)); } @@ -94,7 +105,7 @@ public class PortTerminalController extends BladeController { @ApiOperationSupport(order = 2) @Operation(summary = "分页", description = "传入portTerminal") public R> list(PortTerminalVO portTerminal, Query query) { - IPage pages = portTerminalService.selectPortTerminalPage(Condition.getPage(query), portTerminal); + IPage pages = portTerminalService.selectPortTerminalPage(Condition.getPage(normalizeQuery(query)), portTerminal); return R.data(pages); } @@ -115,6 +126,9 @@ public class PortTerminalController extends BladeController { @ApiOperationSupport(order = 4) @Operation(summary = "逻辑删除", description = "传入ids") public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + if (Func.isEmpty(ids)) { + return R.fail("主键不能为空"); + } return R.status(portTerminalService.deleteLogic(Func.toLongList(ids))); } @@ -146,6 +160,13 @@ public class PortTerminalController extends BladeController { @ApiOperationSupport(order = 7) @Operation(summary = "导入港口码头主数据", description = "传入excel") public R importPortTerminal(MultipartFile file) { + if (file == null || file.isEmpty()) { + return R.fail("上传文件不能为空"); + } + String fileName = Func.toStrWithEmpty(file.getOriginalFilename(), "").toLowerCase(); + if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) { + return R.fail("请上传 .xls,.xlsx 标准格式文件"); + } PortTerminalImporter portTerminalImporter = new PortTerminalImporter(portTerminalService); ExcelUtil.save(file, portTerminalImporter, PortTerminalExcel.class); return R.success("操作成功"); @@ -159,7 +180,12 @@ public class PortTerminalController extends BladeController { @Operation(summary = "导出港口码头主数据") public void exportPortTerminal(@Parameter(hidden = true) @RequestParam Map portTerminal, HttpServletResponse response) { Object ids = portTerminal.remove("ids"); + Object dataSource = portTerminal.remove("dataSource"); + portTerminal.remove("Blade-Auth"); + portTerminal.remove("Authorization"); + portTerminal.remove("access_token"); QueryWrapper queryWrapper = Condition.getQueryWrapper(portTerminal, PortTerminal.class); + applyDataSourceCondition(queryWrapper, dataSource); if (Func.isNotEmpty(ids)) { queryWrapper.lambda().in(PortTerminal::getId, Func.toLongList(ids.toString())); } @@ -178,4 +204,32 @@ public class PortTerminalController extends BladeController { ExcelUtil.export(response, "港口码头主数据模板", "港口码头主数据表", list, PortTerminalExcel.class); } + private Query normalizeQuery(Query query) { + if (query == null) { + query = new Query(); + } + if (query.getCurrent() == null || query.getCurrent() < DEFAULT_CURRENT) { + query.setCurrent(DEFAULT_CURRENT); + } + if (query.getSize() == null || query.getSize() <= 0) { + query.setSize(DEFAULT_SIZE); + } + if (query.getSize() > MAX_SIZE) { + query.setSize(MAX_SIZE); + } + return query; + } + + private void applyDataSourceCondition(QueryWrapper queryWrapper, Object dataSource) { + String value = Func.toStrWithEmpty(dataSource, ""); + if (Func.isEmpty(value)) { + return; + } + if (SOURCE_INITIAL.equals(value)) { + queryWrapper.in("data_source", SOURCE_INITIAL, "初始导入"); + } else { + queryWrapper.eq("data_source", value); + } + } + } 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 9466a1b..5dc056a 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 @@ -74,6 +74,13 @@ import java.util.Map; @Tag(name = "铁路车站主数据", description = "铁路车站主数据") public class RailwayStationController extends BladeController { + private static final int DEFAULT_CURRENT = 1; + private static final int DEFAULT_SIZE = 10; + private static final int MAX_SIZE = 100; + private static final String SOURCE_INITIAL = "初始化导入"; + private static final String SOURCE_BATCH = "批量"; + private static final String SOURCE_MANUAL = "手动"; + private final IRailwayStationService railwayStationService; /** @@ -83,7 +90,13 @@ public class RailwayStationController extends BladeController { @ApiOperationSupport(order = 1) @Operation(summary = "详情", description = "传入railwayStation") public R detail(RailwayStation railwayStation) { - RailwayStation detail = railwayStationService.getOne(Condition.getQueryWrapper(railwayStation)); + if (Func.isEmpty(railwayStation.getId())) { + return R.fail("主键不能为空"); + } + RailwayStation detail = railwayStationService.getById(railwayStation.getId()); + if (Func.isEmpty(detail)) { + return R.fail("铁路车站不存在"); + } return R.data(RailwayStationWrapper.build().entityVO(detail)); } @@ -94,7 +107,7 @@ public class RailwayStationController extends BladeController { @ApiOperationSupport(order = 2) @Operation(summary = "分页", description = "传入railwayStation") public R> list(RailwayStationVO railwayStation, Query query) { - IPage pages = railwayStationService.selectRailwayStationPage(Condition.getPage(query), railwayStation); + IPage pages = railwayStationService.selectRailwayStationPage(Condition.getPage(normalizeQuery(query)), railwayStation); return R.data(pages); } @@ -115,6 +128,9 @@ public class RailwayStationController extends BladeController { @ApiOperationSupport(order = 4) @Operation(summary = "逻辑删除", description = "传入ids") public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + if (Func.isEmpty(ids)) { + return R.fail("主键不能为空"); + } return R.status(railwayStationService.deleteLogic(Func.toLongList(ids))); } @@ -136,6 +152,13 @@ public class RailwayStationController extends BladeController { @ApiOperationSupport(order = 6) @Operation(summary = "导入铁路车站主数据", description = "传入excel") public R importRailwayStation(MultipartFile file) { + if (file == null || file.isEmpty()) { + return R.fail("上传文件不能为空"); + } + String fileName = Func.toStrWithEmpty(file.getOriginalFilename(), "").toLowerCase(); + if (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) { + return R.fail("请上传 .xls,.xlsx 标准格式文件"); + } RailwayStationImporter railwayStationImporter = new RailwayStationImporter(railwayStationService); ExcelUtil.save(file, railwayStationImporter, RailwayStationExcel.class); return R.success("操作成功"); @@ -149,7 +172,12 @@ public class RailwayStationController extends BladeController { @Operation(summary = "导出铁路车站主数据") public void exportRailwayStation(@Parameter(hidden = true) @RequestParam Map railwayStation, HttpServletResponse response) { Object ids = railwayStation.remove("ids"); + Object dataSource = railwayStation.remove("dataSource"); + railwayStation.remove("Blade-Auth"); + railwayStation.remove("Authorization"); + railwayStation.remove("access_token"); QueryWrapper queryWrapper = Condition.getQueryWrapper(railwayStation, RailwayStation.class); + applyDataSourceCondition(queryWrapper, dataSource); if (Func.isNotEmpty(ids)) { queryWrapper.lambda().in(RailwayStation::getId, Func.toLongList(ids.toString())); } @@ -168,4 +196,36 @@ public class RailwayStationController extends BladeController { ExcelUtil.export(response, "铁路车站主数据模板", "铁路车站主数据表", list, RailwayStationExcel.class); } + private Query normalizeQuery(Query query) { + if (query == null) { + query = new Query(); + } + if (query.getCurrent() == null || query.getCurrent() < DEFAULT_CURRENT) { + query.setCurrent(DEFAULT_CURRENT); + } + if (query.getSize() == null || query.getSize() <= 0) { + query.setSize(DEFAULT_SIZE); + } + if (query.getSize() > MAX_SIZE) { + query.setSize(MAX_SIZE); + } + return query; + } + + private void applyDataSourceCondition(QueryWrapper queryWrapper, Object dataSource) { + String value = Func.toStrWithEmpty(dataSource, ""); + if (Func.isEmpty(value)) { + return; + } + if (SOURCE_INITIAL.equals(value)) { + queryWrapper.in("data_source", SOURCE_INITIAL, "初始导入"); + } else if (SOURCE_BATCH.equals(value)) { + queryWrapper.in("data_source", SOURCE_BATCH, "批量导入"); + } else if (SOURCE_MANUAL.equals(value)) { + queryWrapper.in("data_source", SOURCE_MANUAL, "手动录入", "手工导入"); + } else { + queryWrapper.eq("data_source", value); + } + } + } 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 b3e9b81..1986fb0 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 @@ -82,7 +82,7 @@ public class AirportMasterExcel implements Serializable { @ExcelProperty("数据来源") private String dataSource; - @ExcelProperty("状态") + @ExcelProperty("启停状态") private String statusName; @ExcelProperty("备注") 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 bb6d46d..2c7a189 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 @@ -82,7 +82,7 @@ public class PortTerminalExcel implements Serializable { @ExcelProperty("数据来源") private String dataSource; - @ExcelProperty("状态") + @ExcelProperty("启停状态") private String statusName; @ExcelProperty("备注") 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 97b1a45..113672f 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 @@ -82,7 +82,7 @@ public class RailwayStationExcel implements Serializable { @ExcelProperty("数据来源") private String dataSource; - @ExcelProperty("状态") + @ExcelProperty("启停状态") private String statusName; @ExcelProperty("备注") diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AirportMasterMapper.xml b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AirportMasterMapper.xml index 6aa85e5..7af92a1 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AirportMasterMapper.xml +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/AirportMasterMapper.xml @@ -28,7 +28,27 @@ SELECT - * + id, + create_user, + create_dept, + create_time, + update_user, + update_time, + status, + is_deleted, + code, + name, + category, + parent_id, + parent_code, + parent_name, + country, + city, + CASE WHEN longitude BETWEEN -180 AND 180 THEN longitude ELSE NULL END AS longitude, + CASE WHEN latitude BETWEEN -90 AND 90 THEN latitude ELSE NULL END AS latitude, + CASE WHEN data_source = '初始导入' THEN '初始化导入' ELSE data_source END AS data_source, + remark FROM blade_port_terminal WHERE @@ -44,7 +63,14 @@ AND category = #{portTerminal.category} - AND data_source = #{portTerminal.dataSource} + + + AND data_source IN ('初始化导入', '初始导入') + + + AND data_source = #{portTerminal.dataSource} + + AND city = #{portTerminal.city} diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RailwayStationMapper.xml b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RailwayStationMapper.xml index 42cd534..faa946b 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RailwayStationMapper.xml +++ b/blade-service/blade-system/src/main/java/org/springblade/system/mapper/RailwayStationMapper.xml @@ -28,7 +28,32 @@ SELECT - * + id, + tenant_id, + create_user, + create_dept, + create_time, + update_user, + update_time, + status, + is_deleted, + vehicle_type, + vehicle_no, + maintainer, + maintenance_time, + CASE WHEN mileage < 0 THEN 0 ELSE mileage END AS mileage, + mileage_unit, + maintenance_item, + cost, + store_name, + contact_phone, + address, + next_maintenance_time, + CASE WHEN next_maintenance_mileage < 0 THEN 0 ELSE next_maintenance_mileage END AS next_maintenance_mileage, + attachments, + remark FROM blade_vehicle_maintenance_plan WHERE is_deleted = 0 + + AND create_dept = #{maintenancePlan.createDept} + AND vehicle_type = #{maintenancePlan.vehicleType} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.java index 381c7d9..d7f2e3c 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.java @@ -27,6 +27,7 @@ package org.springblade.transport.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import org.apache.ibatis.annotations.Param; import org.springblade.transport.pojo.entity.MaintenanceRecord; import org.springblade.transport.pojo.vo.MaintenanceRecordVO; @@ -46,6 +47,6 @@ public interface MaintenanceRecordMapper extends BaseMapper { * @param maintenanceRecord 查询参数 * @return 维修记录列表 */ - List selectMaintenanceRecordPage(IPage page, MaintenanceRecordVO maintenanceRecord); + List selectMaintenanceRecordPage(IPage page, @Param("maintenanceRecord") MaintenanceRecordVO maintenanceRecord); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.xml b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.xml index 61f27a8..55f03fe 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.xml +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/MaintenanceRecordMapper.xml @@ -31,11 +31,37 @@