Bladeren bron

邀请有礼

skyline 1 maand geleden
bovenliggende
commit
46cc5fd5a5

+ 13 - 0
haha-admin-web/src/views/marketing/activity/utils/hook.tsx

@@ -893,7 +893,9 @@ export function useActivity() {
       fullscreen: deviceDetection(),
       contentRenderer: () => renderForm(formData),
       beforeSure: async (done) => {
+        if (submitting.value) return;
         if (!validateForm(formData)) return;
+        submitting.value = true;
         try {
           const { code } = await updateActivity(formData.id!, toRaw(formData));
           if (code === 200) {
@@ -903,6 +905,8 @@ export function useActivity() {
           }
         } catch (error) {
           message("编辑失败", { type: "error" });
+        } finally {
+          submitting.value = false;
         }
       }
     });
@@ -936,6 +940,10 @@ export function useActivity() {
     inviteCodePrefix: "INV"
   };
 
+  // 当前选中的活动类型(用于新增时预选)- 已移除,弹窗内选择
+  // 防重复提交标志
+  const submitting = ref(false);
+
   function handleAdd() {
     const formData = reactive<FormItemProps>({
       ...defaultFormData,
@@ -953,7 +961,9 @@ export function useActivity() {
       fullscreen: deviceDetection(),
       contentRenderer: () => renderForm(formData),
       beforeSure: async (done) => {
+        if (submitting.value) return;
         if (!validateForm(formData)) return;
+        submitting.value = true;
         try {
           const { code } = await createActivity(toRaw(formData));
           if (code === 200) {
@@ -963,6 +973,8 @@ export function useActivity() {
           }
         } catch (error) {
           message("新增失败", { type: "error" });
+        } finally {
+          submitting.value = false;
         }
       }
     });
@@ -992,6 +1004,7 @@ export function useActivity() {
     deviceScopeMap,
     productScopeMap,
     couponTemplateList,
+    submitting,
     onSearch,
     resetForm,
     handleAdd,

+ 44 - 19
haha-admin/src/main/java/com/haha/admin/config/JacksonConfig.java

@@ -1,11 +1,11 @@
 package com.haha.admin.config;
 
 import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
-import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
 import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
@@ -14,6 +14,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Primary;
 
+import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -22,30 +23,31 @@ import java.time.format.DateTimeFormatter;
 @Configuration
 public class JacksonConfig {
 
-    private static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
-    private static final String DATE_FORMAT = "yyyy-MM-dd";
-    private static final String TIME_FORMAT = "HH:mm:ss";
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    private static final DateTimeFormatter DATE_TIME_LENIENT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm[:ss]");
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
 
     @Bean
     @Primary
     public ObjectMapper objectMapper() {
         ObjectMapper mapper = new ObjectMapper();
-        
+
         JavaTimeModule javaTimeModule = new JavaTimeModule();
-        javaTimeModule.addSerializer(LocalDateTime.class, 
-            new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
-        javaTimeModule.addDeserializer(LocalDateTime.class, 
-            new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DATE_TIME_FORMAT)));
-        
-        javaTimeModule.addSerializer(LocalDate.class, 
-            new LocalDateSerializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
-        javaTimeModule.addDeserializer(LocalDate.class, 
-            new LocalDateDeserializer(DateTimeFormatter.ofPattern(DATE_FORMAT)));
-        
-        javaTimeModule.addSerializer(LocalTime.class, 
-            new LocalTimeSerializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
-        javaTimeModule.addDeserializer(LocalTime.class, 
-            new LocalTimeDeserializer(DateTimeFormatter.ofPattern(TIME_FORMAT)));
+        javaTimeModule.addSerializer(LocalDateTime.class,
+            new LocalDateTimeSerializer(DATE_TIME_FORMATTER));
+        javaTimeModule.addDeserializer(LocalDateTime.class,
+            new LenientLocalDateTimeDeserializer());
+
+        javaTimeModule.addSerializer(LocalDate.class,
+            new LocalDateSerializer(DATE_FORMATTER));
+        javaTimeModule.addDeserializer(LocalDate.class,
+            new LocalDateDeserializer(DATE_FORMATTER));
+
+        javaTimeModule.addSerializer(LocalTime.class,
+            new LocalTimeSerializer(TIME_FORMATTER));
+        javaTimeModule.addDeserializer(LocalTime.class,
+            new LocalTimeDeserializer(TIME_FORMATTER));
 
         mapper.registerModule(javaTimeModule);
         mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
@@ -53,4 +55,27 @@ public class JacksonConfig {
 
         return mapper;
     }
+
+    public static class LenientLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
+        @Override
+        public LocalDateTime deserialize(com.fasterxml.jackson.core.JsonParser p,
+                                        com.fasterxml.jackson.databind.DeserializationContext ctxt) throws IOException {
+            String text = p.getValueAsString();
+            if (text == null || text.isBlank()) {
+                return null;
+            }
+            text = text.trim();
+            try {
+                return LocalDateTime.parse(text, DATE_TIME_FORMATTER);
+            } catch (Exception e) {
+                try {
+                    String padded = text.length() == 16 ? text + ":00" : text;
+                    return LocalDateTime.parse(padded, DATE_TIME_FORMATTER);
+                } catch (Exception ex) {
+                    throw new IOException(
+                        "无法解析日期时间: " + text + ", 支持格式: yyyy-MM-dd HH:mm:ss", ex);
+                }
+            }
+        }
+    }
 }

+ 3 - 0
haha-entity/src/main/java/com/haha/entity/dto/ActivityCreateDTO.java

@@ -3,6 +3,7 @@ package com.haha.entity.dto;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -17,8 +18,10 @@ public class ActivityCreateDTO extends PageQueryDTO {
 
     private String activityDesc;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime startTime;
 
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
 
     private BigDecimal discountValue;

+ 4 - 0
haha-entity/src/main/java/com/haha/entity/dto/UnifiedActivityCreateDTO.java

@@ -4,6 +4,8 @@ import lombok.Data;
 
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -38,12 +40,14 @@ public class UnifiedActivityCreateDTO {
      * 开始时间
      */
     @NotNull(message = "开始时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime startTime;
 
     /**
      * 结束时间
      */
     @NotNull(message = "结束时间不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
 
     // ===== 适用范围字段 =====

+ 3 - 0
haha-entity/src/main/java/com/haha/entity/dto/UnifiedActivityUpdateDTO.java

@@ -3,6 +3,7 @@ package com.haha.entity.dto;
 import lombok.Data;
 
 import jakarta.validation.constraints.NotNull;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
@@ -38,11 +39,13 @@ public class UnifiedActivityUpdateDTO {
     /**
      * 开始时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime startTime;
 
     /**
      * 结束时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime endTime;
 
     // ===== 适用范围字段 - 可选更新 =====