diff --git a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java index cd15307..810f2ec 100644 --- a/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java +++ b/backend-java/src/main/java/com/competition/modules/biz/contest/service/impl/ContestServiceImpl.java @@ -37,27 +37,55 @@ public class ContestServiceImpl extends ServiceImpl i private final ContestRegistrationMapper contestRegistrationMapper; private final ContestWorkMapper contestWorkMapper; - private static final DateTimeFormatter DT_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + // 支持两种日期格式:ISO 格式 (T 分隔) 和空格分隔格式 + private static final DateTimeFormatter ISO_FORMATTER = DateTimeFormatter.ISO_LOCAL_DATE_TIME; + private static final DateTimeFormatter SPACE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + /** + * 解析日期时间字符串,兼容 ISO 格式和空格分隔格式 + */ + private LocalDateTime parseDateTime(String dateTime) { + if (!StringUtils.hasText(dateTime)) { + return null; + } + // 尝试 ISO 格式 (yyyy-MM-ddTHH:mm:ss) + try { + return LocalDateTime.parse(dateTime, ISO_FORMATTER); + } catch (Exception e) { + // 尝试空格分隔格式 (yyyy-MM-dd HH:mm:ss) + try { + return LocalDateTime.parse(dateTime, SPACE_FORMATTER); + } catch (Exception ex) { + log.warn("日期格式解析失败:{}", dateTime, ex); + return null; + } + } + } @Override public BizContest createContest(CreateContestDto dto, Long creatorId) { log.info("开始创建赛事,名称:{}", dto.getContestName()); - BizContest entity = new BizContest(); - mapDtoToEntity(dto, entity); + try { + BizContest entity = new BizContest(); + mapDtoToEntity(dto, entity); - // 默认状态 - entity.setContestState("unpublished"); - entity.setStatus("ongoing"); - entity.setResultState("unpublished"); - if (!StringUtils.hasText(entity.getSubmitRule())) { - entity.setSubmitRule("once"); + // 默认状态 + entity.setContestState("unpublished"); + entity.setStatus("ongoing"); + entity.setResultState("unpublished"); + if (!StringUtils.hasText(entity.getSubmitRule())) { + entity.setSubmitRule("once"); + } + entity.setCreator(creatorId != null ? creatorId.intValue() : null); + + save(entity); + log.info("赛事创建成功,ID:{}, 名称:{}", entity.getId(), entity.getContestName()); + return entity; + } catch (Exception e) { + log.error("创建赛事失败,名称:{}", dto.getContestName(), e); + throw new BusinessException(ErrorCode.INTERNAL_ERROR, "创建赛事失败:" + e.getMessage()); } - entity.setCreator(creatorId != null ? creatorId.intValue() : null); - - save(entity); - log.info("赛事创建成功,ID:{}", entity.getId()); - return entity; } @Override @@ -323,10 +351,10 @@ public class ContestServiceImpl extends ServiceImpl i entity.setAgeMax(dto.getAgeMax()); } if (StringUtils.hasText(dto.getStartTime())) { - entity.setStartTime(LocalDateTime.parse(dto.getStartTime(), DT_FORMATTER)); + entity.setStartTime(parseDateTime(dto.getStartTime())); } if (StringUtils.hasText(dto.getEndTime())) { - entity.setEndTime(LocalDateTime.parse(dto.getEndTime(), DT_FORMATTER)); + entity.setEndTime(parseDateTime(dto.getEndTime())); } if (StringUtils.hasText(dto.getAddress())) { entity.setAddress(dto.getAddress()); @@ -362,10 +390,10 @@ public class ContestServiceImpl extends ServiceImpl i entity.setSponsors(dto.getSponsors()); } if (StringUtils.hasText(dto.getRegisterStartTime())) { - entity.setRegisterStartTime(LocalDateTime.parse(dto.getRegisterStartTime(), DT_FORMATTER)); + entity.setRegisterStartTime(parseDateTime(dto.getRegisterStartTime())); } if (StringUtils.hasText(dto.getRegisterEndTime())) { - entity.setRegisterEndTime(LocalDateTime.parse(dto.getRegisterEndTime(), DT_FORMATTER)); + entity.setRegisterEndTime(parseDateTime(dto.getRegisterEndTime())); } if (StringUtils.hasText(dto.getRegisterState())) { entity.setRegisterState(dto.getRegisterState()); @@ -389,10 +417,10 @@ public class ContestServiceImpl extends ServiceImpl i entity.setSubmitRule(dto.getSubmitRule()); } if (StringUtils.hasText(dto.getSubmitStartTime())) { - entity.setSubmitStartTime(LocalDateTime.parse(dto.getSubmitStartTime(), DT_FORMATTER)); + entity.setSubmitStartTime(parseDateTime(dto.getSubmitStartTime())); } if (StringUtils.hasText(dto.getSubmitEndTime())) { - entity.setSubmitEndTime(LocalDateTime.parse(dto.getSubmitEndTime(), DT_FORMATTER)); + entity.setSubmitEndTime(parseDateTime(dto.getSubmitEndTime())); } if (StringUtils.hasText(dto.getWorkType())) { entity.setWorkType(dto.getWorkType()); @@ -404,13 +432,13 @@ public class ContestServiceImpl extends ServiceImpl i entity.setReviewRuleId(dto.getReviewRuleId()); } if (StringUtils.hasText(dto.getReviewStartTime())) { - entity.setReviewStartTime(LocalDateTime.parse(dto.getReviewStartTime(), DT_FORMATTER)); + entity.setReviewStartTime(parseDateTime(dto.getReviewStartTime())); } if (StringUtils.hasText(dto.getReviewEndTime())) { - entity.setReviewEndTime(LocalDateTime.parse(dto.getReviewEndTime(), DT_FORMATTER)); + entity.setReviewEndTime(parseDateTime(dto.getReviewEndTime())); } if (StringUtils.hasText(dto.getResultPublishTime())) { - entity.setResultPublishTime(LocalDateTime.parse(dto.getResultPublishTime(), DT_FORMATTER)); + entity.setResultPublishTime(parseDateTime(dto.getResultPublishTime())); } } diff --git a/frontend/src/views/contests/Create.vue b/frontend/src/views/contests/Create.vue index d212b79..07ad33b 100644 --- a/frontend/src/views/contests/Create.vue +++ b/frontend/src/views/contests/Create.vue @@ -431,7 +431,7 @@ const handleSubmit = async () => { } message.success("创建成功") } - router.push(`/${tenantCode}/contests`) + router.push(`/${tenantCode}/contests/list`) } catch (e: any) { if (e?.errorFields) return message.error(e?.response?.data?.message || (isEdit.value ? "保存失败" : "创建失败"))