From 171887811cf86e5e592817bfd1e4524e87f2b193 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Thu, 27 Aug 2026 12:54:10 +0800 Subject: [PATCH] fix bug --- .../transport/pojo/entity/MileageRecord.java | 4 +- .../system/excel/PortTerminalExcel.java | 16 ++-- .../service/impl/PortTerminalServiceImpl.java | 18 +++- .../controller/MileageRecordController.java | 7 +- .../transport/excel/EtcRecordExcel.java | 7 +- .../MaintenancePlanDateTimeConverter.java | 94 +++++++++++++++++++ .../transport/excel/MaintenancePlanExcel.java | 7 +- .../excel/MaintenanceRecordExcel.java | 8 +- .../transport/excel/MileageRecordExcel.java | 5 +- .../excel/MileageRecordExportExcel.java | 5 +- .../excel/OilElectricRecordExcel.java | 4 +- .../TireReplacementDateStringConverter.java | 75 +++++++++++++++ .../excel/TireReplacementRecordExcel.java | 5 +- .../excel/ViolationRecordImportExcel.java | 2 +- .../transport/excel/WaybillExcel.java | 7 +- .../AnnualInspectionRecordServiceImpl.java | 6 ++ .../impl/EquipmentLedgerServiceImpl.java | 85 ++++++++++++++++- .../impl/MaintenancePlanServiceImpl.java | 17 ++++ .../impl/MileageRecordServiceImpl.java | 68 +++++--------- .../TireReplacementRecordServiceImpl.java | 25 ++++- doc/sql/transport/blade_equipment_ledger.sql | 2 +- ...pment_ledger_attachments_text_20260827.sql | 2 + doc/sql/transport/transport.sql | 2 +- 23 files changed, 377 insertions(+), 94 deletions(-) create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanDateTimeConverter.java create mode 100644 blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementDateStringConverter.java create mode 100644 doc/sql/transport/blade_equipment_ledger_attachments_text_20260827.sql diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/MileageRecord.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/MileageRecord.java index 2fbbdfe..1962d53 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/MileageRecord.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/entity/MileageRecord.java @@ -48,10 +48,10 @@ public class MileageRecord extends TenantEntity { @Serial private static final long serialVersionUID = 1L; - @Schema(description = "车船类型") + @Schema(description = "车辆类型") private String vehicleType; - @Schema(description = "车牌号/船号") + @Schema(description = "车牌号") private String vehicleNo; @Schema(description = "上月统计里程") 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 c98be0c..9558a23 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,13 +53,13 @@ public class PortTerminalExcel implements Serializable { @ExcelIgnore private Long id; - @ExcelProperty("编码") + @ExcelProperty("*编码") private String code; - @ExcelProperty("港口/码头名称") + @ExcelProperty("*港口/码头名称") private String name; - @ExcelProperty("类型") + @ExcelProperty("*类型") private String category; @ExcelProperty("上级港口") @@ -68,13 +68,13 @@ public class PortTerminalExcel implements Serializable { @ExcelProperty("上级港口编码") private String parentCode; - @ExcelProperty("国家") + @ExcelProperty("*国家") private String country; - @ExcelProperty("城市") + @ExcelProperty("*城市") private String city; - @ExcelProperty("区县") + @ExcelProperty("*区县") private String districtName; @ExcelProperty("行政区划编码") @@ -83,11 +83,11 @@ public class PortTerminalExcel implements Serializable { @ExcelProperty("详细地址") private String detailAddress; - @ExcelProperty("经度") + @ExcelProperty("*经度") @NumberFormat("0.000000") private BigDecimal longitude; - @ExcelProperty("纬度") + @ExcelProperty("*纬度") @NumberFormat("0.000000") private BigDecimal latitude; 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 14bdfbc..c3723ac 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 @@ -392,11 +392,14 @@ public class PortTerminalServiceImpl extends BaseServiceImpl detail(MileageRecord mileageRecord) { + mileageRecord.setVehicleType(VEHICLE_TYPE); MileageRecord detail = mileageRecordService.getOne(Condition.getQueryWrapper(mileageRecord)); return R.data(MileageRecordWrapper.build().entityVO(detail)); } @@ -91,6 +93,7 @@ public class MileageRecordController extends BladeController { @ApiOperationSupport(order = 2) @Operation(summary = "分页", description = "传入mileageRecord") public R> list(MileageRecordVO mileageRecord, Query query) { + mileageRecord.setVehicleType(VEHICLE_TYPE); IPage pages = mileageRecordService.selectMileageRecordPage(Condition.getPage(normalizeQuery(query)), mileageRecord); return R.data(pages); } @@ -158,6 +161,7 @@ public class MileageRecordController extends BladeController { private LambdaQueryWrapper buildExportQuery(MileageRecordVO mileageRecord, String ids) { LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() .eq(MileageRecord::getIsDeleted, 0) + .eq(MileageRecord::getVehicleType, VEHICLE_TYPE) .orderByDesc(MileageRecord::getCreateTime); if (Func.isNotEmpty(ids)) { queryWrapper.in(MileageRecord::getId, Func.toLongList(ids)); @@ -165,9 +169,6 @@ public class MileageRecordController extends BladeController { if (Func.isNotEmpty(mileageRecord.getCreateDept())) { queryWrapper.eq(MileageRecord::getCreateDept, mileageRecord.getCreateDept()); } - if (Func.isNotEmpty(mileageRecord.getVehicleType())) { - queryWrapper.eq(MileageRecord::getVehicleType, mileageRecord.getVehicleType()); - } if (Func.isNotEmpty(mileageRecord.getVehicleNo())) { queryWrapper.like(MileageRecord::getVehicleNo, mileageRecord.getVehicleNo()); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/EtcRecordExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/EtcRecordExcel.java index 89e1cf0..ecaa4a1 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/EtcRecordExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/EtcRecordExcel.java @@ -8,6 +8,7 @@ package org.springblade.transport.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; @@ -37,13 +38,15 @@ public class EtcRecordExcel implements Serializable { @ExcelProperty("*车牌号") private String vehicleNo; - @ExcelProperty("入口时间") + @ExcelProperty(value = "入口时间", converter = MaintenancePlanDateTimeConverter.class) + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime entryTime; @ExcelProperty("*ETC卡号") private String etcCardNo; - @ExcelProperty("*出口时间") + @ExcelProperty(value = "*出口时间", converter = MaintenancePlanDateTimeConverter.class) + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime exitTime; @ExcelProperty("入口站") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanDateTimeConverter.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanDateTimeConverter.java new file mode 100644 index 0000000..f3f1cab --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanDateTimeConverter.java @@ -0,0 +1,94 @@ +/** + * 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.transport.excel; + +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; +import cn.idev.excel.util.DateUtils; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; + +/** + * 保养记录日期转换器,兼容日期文本、日期时间文本和 Excel 数值日期。 + * + * @author Chill + */ +public class MaintenancePlanDateTimeConverter implements Converter { + + private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; + private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + private static final DateTimeFormatter DATE_TIME_MINUTE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT); + + @Override + public Class supportJavaTypeKey() { + return LocalDateTime.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public LocalDateTime convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + if (cellData.getType() == CellDataTypeEnum.NUMBER) { + return DateUtils.getLocalDateTime(cellData.getNumberValue().doubleValue(), + globalConfiguration.getUse1904windowing()); + } + String value = cellData.getStringValue(); + if (value == null || value.trim().isEmpty()) { + return null; + } + String normalizedValue = value.trim(); + try { + return LocalDateTime.parse(normalizedValue, DATE_TIME_FORMATTER); + } catch (DateTimeParseException ignored) { + try { + return LocalDateTime.parse(normalizedValue, DATE_TIME_MINUTE_FORMATTER); + } catch (DateTimeParseException ignoredMinute) { + return LocalDate.parse(normalizedValue, DATE_FORMATTER).atStartOfDay(); + } + } + } + + @Override + public WriteCellData convertToExcelData(LocalDateTime value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + String format = contentProperty != null && contentProperty.getDateTimeFormatProperty() != null + ? contentProperty.getDateTimeFormatProperty().getFormat() : DEFAULT_DATE_FORMAT; + return new WriteCellData<>(DateUtils.format(value, format, globalConfiguration.getLocale())); + } + +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanExcel.java index b0f0fd6..5823b7e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenancePlanExcel.java @@ -27,6 +27,7 @@ package org.springblade.transport.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.format.NumberFormat; import cn.idev.excel.annotation.write.style.ColumnWidth; import cn.idev.excel.annotation.write.style.ContentRowHeight; @@ -63,7 +64,8 @@ public class MaintenancePlanExcel implements Serializable { @ExcelProperty("保养人") private String maintainer; - @ExcelProperty("*保养时间") + @ExcelProperty(value = "*保养时间", converter = MaintenancePlanDateTimeConverter.class) + @DateTimeFormat("yyyy-MM-dd") private LocalDateTime maintenanceTime; @ExcelProperty("里程/航程数") @@ -88,7 +90,8 @@ public class MaintenancePlanExcel implements Serializable { @ExcelProperty("地址") private String address; - @ExcelProperty("下次保养时间") + @ExcelProperty(value = "下次保养时间", converter = MaintenancePlanDateTimeConverter.class) + @DateTimeFormat("yyyy-MM-dd") private LocalDateTime nextMaintenanceTime; @ExcelProperty("下次保养里程/航程") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenanceRecordExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenanceRecordExcel.java index 6361d71..5b3160e 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenanceRecordExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MaintenanceRecordExcel.java @@ -64,7 +64,7 @@ public class MaintenanceRecordExcel implements Serializable { @ExcelProperty("维修人") private String maintainer; - @ExcelProperty("*维修时间") + @ExcelProperty(value = "*维修时间", converter = MaintenancePlanDateTimeConverter.class) @DateTimeFormat("yyyy-MM-dd") private LocalDateTime maintenanceTime; @@ -87,7 +87,7 @@ public class MaintenanceRecordExcel implements Serializable { @ExcelProperty("地址") private String address; - @ExcelProperty("出厂时间") + @ExcelProperty(value = "出厂时间", converter = MaintenancePlanDateTimeConverter.class) @DateTimeFormat("yyyy-MM-dd") private LocalDateTime factoryTime; @@ -95,14 +95,14 @@ public class MaintenanceRecordExcel implements Serializable { @NumberFormat("0.00") private BigDecimal mileage; - @ExcelProperty("创建时间") + @ExcelProperty(value = "创建时间", converter = MaintenancePlanDateTimeConverter.class) @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; @ExcelProperty("更新人") private String updateUserName; - @ExcelProperty("更新时间") + @ExcelProperty(value = "更新时间", converter = MaintenancePlanDateTimeConverter.class) @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExcel.java index dc0fcc0..462dfde 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExcel.java @@ -53,10 +53,7 @@ public class MileageRecordExcel implements Serializable { @ExcelIgnore private Long id; - @ExcelProperty("*车船类型") - private String vehicleType; - - @ExcelProperty("*车牌号/船号") + @ExcelProperty("*车牌号") private String vehicleNo; @ExcelProperty("上月统计里程数") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExportExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExportExcel.java index be5b248..15760b5 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExportExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/MileageRecordExportExcel.java @@ -51,10 +51,7 @@ public class MileageRecordExportExcel implements Serializable { @Serial private static final long serialVersionUID = 1L; - @ExcelProperty("车船类型") - private String vehicleType; - - @ExcelProperty("车牌号/船号") + @ExcelProperty("车牌号") private String vehicleNo; @ExcelProperty("上月统计里程数") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/OilElectricRecordExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/OilElectricRecordExcel.java index b3d88fc..d5bf021 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/OilElectricRecordExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/OilElectricRecordExcel.java @@ -11,6 +11,7 @@ package org.springblade.transport.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; @@ -40,7 +41,8 @@ public class OilElectricRecordExcel implements Serializable { @ExcelProperty("卡号") private String cardNo; - @ExcelProperty("*交易时间") + @ExcelProperty(value = "*交易时间", converter = MaintenancePlanDateTimeConverter.class) + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime transactionTime; @ExcelProperty("*车船类型") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementDateStringConverter.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementDateStringConverter.java new file mode 100644 index 0000000..89f8498 --- /dev/null +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementDateStringConverter.java @@ -0,0 +1,75 @@ +/** + * 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.transport.excel; + +import cn.idev.excel.converters.Converter; +import cn.idev.excel.enums.CellDataTypeEnum; +import cn.idev.excel.metadata.GlobalConfiguration; +import cn.idev.excel.metadata.data.ReadCellData; +import cn.idev.excel.metadata.data.WriteCellData; +import cn.idev.excel.metadata.property.ExcelContentProperty; +import cn.idev.excel.util.DateUtils; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * 换胎日期文本转换器,保留非法日期原值并兼容 Excel 数值日期。 + * + * @author Chill + */ +public class TireReplacementDateStringConverter implements Converter { + + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE; + + @Override + public Class supportJavaTypeKey() { + return String.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + @Override + public String convertToJavaData(ReadCellData cellData, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + if (cellData.getType() == CellDataTypeEnum.NUMBER) { + LocalDate date = DateUtils.getLocalDateTime(cellData.getNumberValue().doubleValue(), + globalConfiguration.getUse1904windowing()).toLocalDate(); + return date.format(DATE_FORMATTER); + } + return cellData.getStringValue(); + } + + @Override + public WriteCellData convertToExcelData(String value, ExcelContentProperty contentProperty, + GlobalConfiguration globalConfiguration) { + return new WriteCellData<>(value); + } + +} diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementRecordExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementRecordExcel.java index eb13fcd..7e6ac14 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementRecordExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/TireReplacementRecordExcel.java @@ -36,7 +36,6 @@ import lombok.Data; import java.io.Serial; import java.io.Serializable; import java.math.BigDecimal; -import java.time.LocalDate; /** * 换胎记录 Excel @@ -60,8 +59,8 @@ public class TireReplacementRecordExcel implements Serializable { @ExcelProperty("处理人") private String handler; - @ExcelProperty("*换胎时间") - private LocalDate replacementTime; + @ExcelProperty(value = "*换胎时间", converter = TireReplacementDateStringConverter.class) + private String replacementTime; @ExcelProperty("轮胎品牌") private String tireBrand; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ViolationRecordImportExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ViolationRecordImportExcel.java index f3e7f6b..2053424 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ViolationRecordImportExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/ViolationRecordImportExcel.java @@ -63,7 +63,7 @@ public class ViolationRecordImportExcel implements Serializable { @ExcelProperty("*类型/事项") private String violationTypeOrItem; - @ExcelProperty("*时间") + @ExcelProperty(value = "*时间", converter = MaintenancePlanDateTimeConverter.class) @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime violationTime; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/WaybillExcel.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/WaybillExcel.java index 3a68f3e..41bd797 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/WaybillExcel.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/excel/WaybillExcel.java @@ -24,6 +24,7 @@ package org.springblade.transport.excel; import cn.idev.excel.annotation.ExcelProperty; import cn.idev.excel.annotation.ExcelIgnore; +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; @@ -150,9 +151,11 @@ public class WaybillExcel implements Serializable { private String createUserName; @ExcelProperty("更新人") private String updateUserName; - @ExcelProperty("创建时间") + @ExcelProperty(value = "创建时间", converter = MaintenancePlanDateTimeConverter.class) + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime createTime; - @ExcelProperty("更新时间") + @ExcelProperty(value = "更新时间", converter = MaintenancePlanDateTimeConverter.class) + @DateTimeFormat("yyyy-MM-dd HH:mm:ss") private LocalDateTime updateTime; @ExcelIgnore diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/AnnualInspectionRecordServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/AnnualInspectionRecordServiceImpl.java index c2907b7..d760205 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/AnnualInspectionRecordServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/AnnualInspectionRecordServiceImpl.java @@ -46,6 +46,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Set; /** * 年检记录 服务实现类 @@ -64,6 +65,7 @@ public class AnnualInspectionRecordServiceImpl extends BaseServiceImpl PASSENGER_TYPE_LEVELS = Set.of("一级", "二级", "其他"); @Override public IPage selectAnnualInspectionRecordPage(IPage page, AnnualInspectionRecordVO annualInspectionRecord) { @@ -127,6 +129,7 @@ public class AnnualInspectionRecordServiceImpl extends BaseServiceImpl implements IEquipmentLedgerService { private static final String VEHICLE = "车辆"; private static final String SHIP = "船舶"; + private static final String EQUIPMENT_TYPE_DICT_CODE = "equip_type"; private static final int VEHICLE_NO_MAX_LENGTH = 30; private static final int EQUIPMENT_CODE_MAX_LENGTH = 12; private static final int EQUIPMENT_NAME_MAX_LENGTH = 100; @@ -42,7 +52,9 @@ public class EquipmentLedgerServiceImpl extends BaseServiceImpl selectEquipmentLedgerPage(IPage page, EquipmentLedgerVO equipmentLedger) { @@ -72,6 +84,9 @@ public class EquipmentLedgerServiceImpl extends BaseServiceImpl errorList = new ArrayList<>(); List equipmentLedgerList = new ArrayList<>(); Set importEquipmentCodes = new HashSet<>(); + Set existingVehicleNos = loadExistingVehicleNos(data); + Set existingShipNos = loadExistingShipNos(data); + Set equipmentTypeValues = loadEquipmentTypeValues(); for (int index = 0; index < data.size(); index++) { EquipmentLedgerExcel excel = data.get(index); try { @@ -80,7 +95,8 @@ public class EquipmentLedgerServiceImpl extends BaseServiceImpl validationErrors = validateImportEquipmentLedger(equipmentLedger); + List validationErrors = validateImportEquipmentLedger(equipmentLedger, + existingVehicleNos, existingShipNos, equipmentTypeValues); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, !importEquipmentCodes.add(equipmentLedger.getEquipmentCode()), "设备编号在本次导入中重复"); if (Func.isNotEmpty(validationErrors)) { @@ -108,12 +124,19 @@ public class EquipmentLedgerServiceImpl extends BaseServiceImpl validateImportEquipmentLedger(EquipmentLedger equipmentLedger) { + private List validateImportEquipmentLedger(EquipmentLedger equipmentLedger, + Set existingVehicleNos, Set existingShipNos, Set equipmentTypeValues) { List validationErrors = new ArrayList<>(); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, !VEHICLE.equals(equipmentLedger.getVehicleType()) && !SHIP.equals(equipmentLedger.getVehicleType()), "车船类型不正确"); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(equipmentLedger.getVehicleNo()), "车牌号/船号不能为空"); + org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, + VEHICLE.equals(equipmentLedger.getVehicleType()) && Func.isNotEmpty(equipmentLedger.getVehicleNo()) && !existingVehicleNos.contains(equipmentLedger.getVehicleNo()), "车牌号/船号对应的车辆不存在"); + org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, + SHIP.equals(equipmentLedger.getVehicleType()) && Func.isNotEmpty(equipmentLedger.getVehicleNo()) && !existingShipNos.contains(equipmentLedger.getVehicleNo()), "车牌号/船号对应的船舶不存在"); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(equipmentLedger.getEquipmentCode()), "设备编号不能为空"); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(equipmentLedger.getEquipmentName()), "设备名称不能为空"); + org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, + Func.isNotEmpty(equipmentLedger.getEquipmentType()) && !equipmentTypeValues.contains(equipmentLedger.getEquipmentType()), "设备类型不合法"); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, equipmentLedger.getOnlineStatus() != 0 && equipmentLedger.getOnlineStatus() != 1, "是否在线不正确"); org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, equipmentLedger.getVehicleNo(), VEHICLE_NO_MAX_LENGTH, "车牌号/船号不能超过30字"); org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, equipmentLedger.getEquipmentCode(), EQUIPMENT_CODE_MAX_LENGTH, "设备编号格式不正确"); @@ -123,10 +146,62 @@ public class EquipmentLedgerServiceImpl extends BaseServiceImpl loadExistingVehicleNos(List data) { + Set vehicleNos = data.stream() + .filter(Objects::nonNull) + .filter(item -> VEHICLE.equals(trimToEmpty(item.getVehicleType()))) + .map(item -> trimToEmpty(item.getVehicleNo()).toUpperCase()) + .filter(Func::isNotEmpty) + .collect(Collectors.toSet()); + if (Func.isEmpty(vehicleNos)) { + return Set.of(); + } + return transportVehicleService.list(new LambdaQueryWrapper() + .select(TransportVehicle::getPlateNo) + .in(TransportVehicle::getPlateNo, vehicleNos)).stream() + .map(TransportVehicle::getPlateNo) + .filter(Objects::nonNull) + .map(String::trim) + .map(String::toUpperCase) + .collect(Collectors.toSet()); + } + + private Set loadExistingShipNos(List data) { + Set shipNos = data.stream() + .filter(Objects::nonNull) + .filter(item -> SHIP.equals(trimToEmpty(item.getVehicleType()))) + .map(item -> trimToEmpty(item.getVehicleNo())) + .filter(Func::isNotEmpty) + .collect(Collectors.toSet()); + if (Func.isEmpty(shipNos)) { + return Set.of(); + } + return transportShipService.list(new LambdaQueryWrapper() + .select(TransportShip::getShipIdentifierNo) + .in(TransportShip::getShipIdentifierNo, shipNos)).stream() + .map(TransportShip::getShipIdentifierNo) + .filter(Objects::nonNull) + .map(String::trim) + .collect(Collectors.toSet()); + } + + private Set loadEquipmentTypeValues() { + List equipmentTypes = DictBizCache.getList(EQUIPMENT_TYPE_DICT_CODE); + if (Func.isEmpty(equipmentTypes)) { + return Set.of(); + } + return equipmentTypes.stream() + .map(DictBiz::getDictValue) + .filter(Objects::nonNull) + .map(String::trim) + .filter(Func::isNotEmpty) + .collect(Collectors.toSet()); + } + @Override public List exportEquipmentLedger(Wrapper queryWrapper) { return list(queryWrapper).stream() @@ -193,7 +268,7 @@ public class EquipmentLedgerServiceImpl extends BaseServiceImpl selectMileageRecordPage(IPage page, MileageRecordVO mileageRecord) { @@ -118,20 +118,18 @@ public class MileageRecordServiceImpl extends BaseServiceImpl validateImportMileageRecord(MileageRecord mileageRecord) { List validationErrors = new ArrayList<>(); - boolean isShip = VEHICLE_TYPE_SHIP.equals(mileageRecord.getVehicleType()); - org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, !VEHICLE_TYPE_VEHICLE.equals(mileageRecord.getVehicleType()) && !isShip, "车船类型不正确"); - org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(mileageRecord.getVehicleNo()), isShip ? "船号不能为空" : "车牌号不能为空"); - org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, mileageRecord.getVehicleNo(), VEHICLE_NO_MAX_LENGTH, isShip ? "船号不能超过30字" : "车牌号不能超过30字"); + org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(mileageRecord.getVehicleNo()), "车牌号不能为空"); + org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, mileageRecord.getVehicleNo(), VEHICLE_NO_MAX_LENGTH, "车牌号不能超过30字"); org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, mileageRecord.getRemark(), REMARK_MAX_LENGTH, "备注不能超过200字"); org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, mileageRecord.getAttachments(), ATTACHMENTS_MAX_LENGTH, "附件不能超过1000字"); - addImportMileageErrors(validationErrors, mileageRecord.getPreviousMonthMileage(), isShip ? "上月统计航程数" : "上月统计里程数"); - addImportMileageErrors(validationErrors, mileageRecord.getCurrentMonthMileage(), isShip ? "本月统计航程数" : "本月统计里程数"); - addImportMileageErrors(validationErrors, mileageRecord.getMonthlyMileage(), isShip ? "本月航行航程数" : "本月行驶里程数"); - addImportMileageErrors(validationErrors, mileageRecord.getTotalMileage(), isShip ? "累计航程数" : "累计行驶里程数"); + addImportMileageErrors(validationErrors, mileageRecord.getPreviousMonthMileage(), "上月统计里程数"); + addImportMileageErrors(validationErrors, mileageRecord.getCurrentMonthMileage(), "本月统计里程数"); + addImportMileageErrors(validationErrors, mileageRecord.getMonthlyMileage(), "本月行驶里程数"); + addImportMileageErrors(validationErrors, mileageRecord.getTotalMileage(), "累计行驶里程数"); if (mileageRecord.getPreviousMonthMileage() != null && mileageRecord.getCurrentMonthMileage() != null && mileageRecord.getMonthlyMileage() != null) { - org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, mileageRecord.getCurrentMonthMileage().subtract(mileageRecord.getPreviousMonthMileage()).compareTo(mileageRecord.getMonthlyMileage()) != 0, isShip ? "本月航行航程数应等于本月统计航程数减去上月统计航程数" : "本月行驶里程数应等于本月统计里程数减去上月统计里程数"); + org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, mileageRecord.getCurrentMonthMileage().subtract(mileageRecord.getPreviousMonthMileage()).compareTo(mileageRecord.getMonthlyMileage()) != 0, "本月行驶里程数应等于本月统计里程数减去上月统计里程数"); } - org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, mileageRecord.getTotalMileage() != null && mileageRecord.getCurrentMonthMileage() != null && mileageRecord.getTotalMileage().compareTo(mileageRecord.getCurrentMonthMileage()) < 0, isShip ? "累计航程数应大于等于本月统计航程数" : "累计行驶里程数应大于等于本月统计里程数"); + org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, mileageRecord.getTotalMileage() != null && mileageRecord.getCurrentMonthMileage() != null && mileageRecord.getTotalMileage().compareTo(mileageRecord.getCurrentMonthMileage()) < 0, "累计行驶里程数应大于等于本月统计里程数"); return validationErrors; } @@ -156,14 +154,9 @@ public class MileageRecordServiceImpl extends BaseServiceImpl selectTireReplacementRecordPage(IPage page, TireReplacementRecordVO tireReplacementRecord) { @@ -89,8 +93,10 @@ public class TireReplacementRecordServiceImpl extends BaseServiceImpl validationErrors = new ArrayList<>(); + tireReplacementRecord.setReplacementTime(parseImportReplacementTime(excel.getReplacementTime(), validationErrors)); prepare(tireReplacementRecord); - List validationErrors = validateImportTireReplacementRecord(tireReplacementRecord); + validationErrors.addAll(validateImportTireReplacementRecord(tireReplacementRecord, excel.getReplacementTime())); if (Func.isNotEmpty(validationErrors)) { excel.setErrorMessage(org.springblade.common.excel.ImportFailureExcelUtil.formatErrorMessage(validationErrors)); errorList.add(excel); @@ -115,10 +121,10 @@ public class TireReplacementRecordServiceImpl extends BaseServiceImpl validateImportTireReplacementRecord(TireReplacementRecord tireReplacementRecord) { + private List validateImportTireReplacementRecord(TireReplacementRecord tireReplacementRecord, String replacementTimeText) { List validationErrors = new ArrayList<>(); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(tireReplacementRecord.getVehicleNo()), "车牌号不能为空"); - org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(tireReplacementRecord.getReplacementTime()), "换胎时间不能为空"); + org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, trimToNull(replacementTimeText) == null, "换胎时间不能为空"); org.springblade.common.excel.ImportFailureExcelUtil.addValidationError(validationErrors, Func.isEmpty(tireReplacementRecord.getReplacementCost()), "换胎费用不能为空"); org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, tireReplacementRecord.getVehicleNo(), VEHICLE_NO_MAX_LENGTH, "车牌号不能超过30字"); org.springblade.common.excel.ImportFailureExcelUtil.addLengthValidationError(validationErrors, tireReplacementRecord.getHandler(), HANDLER_MAX_LENGTH, "处理人不能超过20字"); @@ -132,6 +138,19 @@ public class TireReplacementRecordServiceImpl extends BaseServiceImpl validationErrors) { + String normalizedValue = trimToNull(value); + if (normalizedValue == null) { + return null; + } + try { + return LocalDate.parse(normalizedValue, DATE_FORMATTER); + } catch (DateTimeParseException exception) { + validationErrors.add("换胎时间格式不正确,请使用yyyy-MM-dd格式并填写有效日期"); + return null; + } + } + @Override public List exportTireReplacementRecord(Wrapper queryWrapper) { return list(queryWrapper).stream().map(tireReplacementRecord -> { diff --git a/doc/sql/transport/blade_equipment_ledger.sql b/doc/sql/transport/blade_equipment_ledger.sql index f61472c..7a7158d 100644 --- a/doc/sql/transport/blade_equipment_ledger.sql +++ b/doc/sql/transport/blade_equipment_ledger.sql @@ -13,7 +13,7 @@ CREATE TABLE `blade_equipment_ledger` ( `specification_model` varchar(100) DEFAULT NULL COMMENT '规格型号', `original_equipment_no` varchar(100) DEFAULT NULL COMMENT '原厂设备号', `remark` varchar(200) DEFAULT NULL COMMENT '备注', - `attachments` varchar(1000) DEFAULT NULL COMMENT '附件', + `attachments` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附件JSON', `online_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否在线:0否,1是', `create_user` bigint(20) DEFAULT NULL COMMENT '创建人', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门', diff --git a/doc/sql/transport/blade_equipment_ledger_attachments_text_20260827.sql b/doc/sql/transport/blade_equipment_ledger_attachments_text_20260827.sql new file mode 100644 index 0000000..ed6f17f --- /dev/null +++ b/doc/sql/transport/blade_equipment_ledger_attachments_text_20260827.sql @@ -0,0 +1,2 @@ +ALTER TABLE `blade_equipment_ledger` + MODIFY COLUMN `attachments` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附件JSON'; diff --git a/doc/sql/transport/transport.sql b/doc/sql/transport/transport.sql index 9026108..2218256 100644 --- a/doc/sql/transport/transport.sql +++ b/doc/sql/transport/transport.sql @@ -6088,7 +6088,7 @@ CREATE TABLE `blade_equipment_ledger` ( `specification_model` varchar(100) DEFAULT NULL COMMENT '规格型号', `original_equipment_no` varchar(100) DEFAULT NULL COMMENT '原厂设备号', `remark` varchar(200) DEFAULT NULL COMMENT '备注', - `attachments` varchar(1000) DEFAULT NULL COMMENT '附件', + `attachments` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '附件JSON', `online_status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否在线:0否,1是', `create_user` bigint(20) DEFAULT NULL COMMENT '创建人', `create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',