✨ 批量导入日期宽容解析:兼容 2026-08-02 与 2026-8-2 等书写变体
- blade-common 新增 LenientDateParser(宽容解析:- / . 分隔符、补零与否、 时间可省略秒/分;拒绝两位年份、日在前、无分隔符) - 新增 LenientDateStringConverter / LenientDateTimeStringConverter: Excel 数值日期转文本透传,文本解析留待服务层以进入失败明细流程 - 8 个裸走 fastexcel 内置转换的导入 DTO(保险/年检/事故/其他费用/运单/ 币种/用户生日/设备台账)日期字段改为 String 承载,服务层统一经 LenientDateParser 解析,失败报「<列名> 日期格式无法识别:<原值>」 - MaintenancePlanDateTimeConverter / TireReplacementDateStringConverter 内部委托公共解析器,6 个 DTO 注解零改动 - 运输计划、运单批量、运输对账、换胎 4 处手动解析点收敛至同一工具类 - UserMapper 导出 SQL 的生日改 DATE_FORMAT 输出,保持导出格式不变 口径见根工作区 docs/import-spec.md(weicw/tms-erp#1)。 回归:port-terminal 45 断言、violation-record 40 断言(含新增不补零 用例 09)、waybill-import 48 断言、insurance-record 新增用例 6 断言, 全部通过。
This commit is contained in:
+4
-5
@@ -35,7 +35,6 @@ import lombok.Data;
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* 币种汇率 Excel
|
||||
@@ -62,8 +61,8 @@ public class CurrencyExcel implements Serializable {
|
||||
@ExcelProperty("汇率")
|
||||
private BigDecimal exchangeRate;
|
||||
|
||||
@ExcelProperty("生效日期")
|
||||
private LocalDate effectiveDate;
|
||||
@ExcelProperty(value = "生效日期", converter = org.springblade.common.excel.LenientDateStringConverter.class)
|
||||
private String effectiveDate;
|
||||
|
||||
@ExcelProperty("状态")
|
||||
private String statusName;
|
||||
@@ -71,8 +70,8 @@ public class CurrencyExcel implements Serializable {
|
||||
@ExcelProperty("来源")
|
||||
private String dataSource;
|
||||
|
||||
@ExcelProperty("失效日期")
|
||||
private LocalDate expiryDate;
|
||||
@ExcelProperty(value = "失效日期", converter = org.springblade.common.excel.LenientDateStringConverter.class)
|
||||
private String expiryDate;
|
||||
|
||||
@ExcelProperty("备注")
|
||||
private String remark;
|
||||
|
||||
+2
-3
@@ -34,7 +34,6 @@ import lombok.Data;
|
||||
|
||||
import java.io.Serial;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
|
||||
/**
|
||||
* UserExcel
|
||||
@@ -102,7 +101,7 @@ public class UserExcel implements Serializable {
|
||||
private String postName;
|
||||
|
||||
@ColumnWidth(20)
|
||||
@ExcelProperty("生日")
|
||||
private Date birthday;
|
||||
@ExcelProperty(value = "生日", converter = org.springblade.common.excel.LenientDateStringConverter.class)
|
||||
private String birthday;
|
||||
|
||||
}
|
||||
|
||||
+1
-1
@@ -95,7 +95,7 @@
|
||||
</select>
|
||||
|
||||
<select id="exportUser" resultType="org.springblade.system.excel.UserExcel">
|
||||
SELECT id, tenant_id, user_type, account, name, real_name, email, phone, birthday, role_id, dept_id, post_id FROM blade_user ${ew.customSqlSegment}
|
||||
SELECT id, tenant_id, user_type, account, name, real_name, email, phone, DATE_FORMAT(birthday, '%Y-%m-%d') AS birthday, role_id, dept_id, post_id FROM blade_user ${ew.customSqlSegment}
|
||||
</select>
|
||||
|
||||
<select id="selectCustomerOptions" resultType="java.util.HashMap">
|
||||
|
||||
+2
@@ -125,6 +125,8 @@ public class CurrencyServiceImpl extends BaseServiceImpl<CurrencyMapper, Currenc
|
||||
CurrencyExcel excel = data.get(index);
|
||||
try {
|
||||
Currency currency = Objects.requireNonNull(BeanUtil.copyProperties(excel, Currency.class));
|
||||
currency.setEffectiveDate(org.springblade.common.excel.LenientDateParser.parseDate(excel.getEffectiveDate(), "生效日期"));
|
||||
currency.setExpiryDate(org.springblade.common.excel.LenientDateParser.parseDate(excel.getExpiryDate(), "失效日期"));
|
||||
currency.setDataSource(SOURCE_BATCH);
|
||||
currency.setStatus(STATUS_ENABLED);
|
||||
prepare(currency, SOURCE_BATCH);
|
||||
|
||||
+3
@@ -689,6 +689,9 @@ public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implement
|
||||
*/
|
||||
private User buildImportUser(UserExcel userExcel, String tenantId) {
|
||||
User user = Objects.requireNonNull(BeanUtil.copyProperties(userExcel, User.class));
|
||||
// 宽容解析生日文本(2026-8-2 等写法),User.birthday 为 java.util.Date 需转换
|
||||
java.time.LocalDate birthday = org.springblade.common.excel.LenientDateParser.parseDate(userExcel.getBirthday(), "生日");
|
||||
user.setBirthday(birthday == null ? null : java.sql.Date.valueOf(birthday));
|
||||
user.setTenantId(tenantId);
|
||||
user.setUserType(Func.toInt(DictCache.getKey(DictEnum.USER_TYPE, userExcel.getUserTypeName()), 1));
|
||||
user.setDeptId(Func.toStrWithEmpty(SysCache.getDeptIds(tenantId, userExcel.getDeptName()), StringPool.EMPTY));
|
||||
|
||||
Reference in New Issue
Block a user