Browse Source
Merge in DESIGN/design from ~LUCIAN.CHEN/design:feature/x to feature/x * commit '3237ffbb37022d462715174389cf4f959d215327': REPORT-68277 日期控件专项优化feature/x
Lucian.Chen
3 years ago
7 changed files with 243 additions and 16 deletions
@ -0,0 +1,26 @@ |
|||||||
|
package com.fr.design.widget.ui.designer.date; |
||||||
|
|
||||||
|
/** |
||||||
|
* 日期控件格式检测接口 |
||||||
|
* |
||||||
|
* @author Lucian.Chen |
||||||
|
* @version 11.0 |
||||||
|
* Created by Lucian.Chen on 2022/4/8 |
||||||
|
*/ |
||||||
|
public interface DateFormatCheck { |
||||||
|
|
||||||
|
/** |
||||||
|
* 校验日期格式 |
||||||
|
* @param date 日期 |
||||||
|
* @param format 格式 |
||||||
|
* @return 是否通过 |
||||||
|
*/ |
||||||
|
boolean accept(String date, String format); |
||||||
|
|
||||||
|
/** |
||||||
|
* 校验结果 |
||||||
|
* @param sample 提示 |
||||||
|
* @return 校验结果 |
||||||
|
*/ |
||||||
|
DateFormatCheckResult result(String sample); |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
package com.fr.design.widget.ui.designer.date; |
||||||
|
|
||||||
|
import com.fr.design.widget.ui.designer.date.check.DateFormatCustomCheck; |
||||||
|
import com.fr.design.widget.ui.designer.date.check.DateFormatFrontCheck; |
||||||
|
import org.jetbrains.annotations.NotNull; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Lucian.Chen |
||||||
|
* @version 11.0 |
||||||
|
* Created by Lucian.Chen on 2022/4/8 |
||||||
|
*/ |
||||||
|
public class DateFormatCheckManager { |
||||||
|
|
||||||
|
private static final List<DateFormatCheck> CHECKS = new ArrayList<>(); |
||||||
|
|
||||||
|
static { |
||||||
|
// 顺序执行
|
||||||
|
CHECKS.add(DateFormatFrontCheck.KEY); |
||||||
|
CHECKS.add(DateFormatCustomCheck.KEY); |
||||||
|
} |
||||||
|
|
||||||
|
@NotNull |
||||||
|
public static DateFormatCheckResult check(String date, String format) { |
||||||
|
for (DateFormatCheck check : CHECKS) { |
||||||
|
if (!check.accept(date, format)) { |
||||||
|
return check.result(date); |
||||||
|
} |
||||||
|
} |
||||||
|
return DateFormatCheckResult.create(date); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
package com.fr.design.widget.ui.designer.date; |
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author Lucian.Chen |
||||||
|
* @version 11.0 |
||||||
|
* Created by Lucian.Chen on 2022/4/8 |
||||||
|
*/ |
||||||
|
public class DateFormatCheckResult { |
||||||
|
|
||||||
|
private String sample; |
||||||
|
private Color color; |
||||||
|
|
||||||
|
public static DateFormatCheckResult create(String sample) { |
||||||
|
return create(sample, Color.BLACK); |
||||||
|
} |
||||||
|
|
||||||
|
public static DateFormatCheckResult create(String sample, Color color) { |
||||||
|
return new DateFormatCheckResult(sample, color); |
||||||
|
} |
||||||
|
|
||||||
|
DateFormatCheckResult(String sample, Color color) { |
||||||
|
this.sample = sample; |
||||||
|
this.color = color; |
||||||
|
} |
||||||
|
|
||||||
|
public String getSample() { |
||||||
|
return sample; |
||||||
|
} |
||||||
|
|
||||||
|
public void setSample(String sample) { |
||||||
|
this.sample = sample; |
||||||
|
} |
||||||
|
|
||||||
|
public Color getColor() { |
||||||
|
return color; |
||||||
|
} |
||||||
|
|
||||||
|
public void setColor(Color color) { |
||||||
|
this.color = color; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
package com.fr.design.widget.ui.designer.date.check; |
||||||
|
|
||||||
|
import com.fr.data.core.FormatField; |
||||||
|
import com.fr.design.i18n.Toolkit; |
||||||
|
import com.fr.design.widget.ui.designer.date.DateFormatCheck; |
||||||
|
import com.fr.design.widget.ui.designer.date.DateFormatCheckResult; |
||||||
|
import com.fr.stable.ArrayUtils; |
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
|
||||||
|
/** |
||||||
|
* 自定义格式校验 |
||||||
|
* @author Lucian.Chen |
||||||
|
* @version 11.0 |
||||||
|
* Created by Lucian.Chen on 2022/4/8 |
||||||
|
*/ |
||||||
|
public class DateFormatCustomCheck implements DateFormatCheck { |
||||||
|
|
||||||
|
public static final DateFormatCustomCheck KEY = new DateFormatCustomCheck(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 不是自定义格式 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public boolean accept(String date, String format) { |
||||||
|
return ArrayUtils.contains(FormatField.getInstance().getDateFormatArray(), format); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public DateFormatCheckResult result(String sample) { |
||||||
|
sample += " " + Toolkit.i18nText("Fine-Design_Basic_DateFormat_Custom_Warning"); |
||||||
|
return DateFormatCheckResult.create(sample, Color.red); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
package com.fr.design.widget.ui.designer.date.check; |
||||||
|
|
||||||
|
import com.fr.design.i18n.Toolkit; |
||||||
|
import com.fr.design.widget.ui.designer.date.DateFormatCheck; |
||||||
|
import com.fr.design.widget.ui.designer.date.DateFormatCheckResult; |
||||||
|
import com.fr.stable.AssistUtils; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
import java.util.regex.Matcher; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
|
||||||
|
/** |
||||||
|
* 前端的解析方案检测 |
||||||
|
* FR.str2Date |
||||||
|
* @author Lucian.Chen |
||||||
|
* @version 11.0 |
||||||
|
* Created by Lucian.Chen on 2022/4/7 |
||||||
|
*/ |
||||||
|
public class DateFormatFrontCheck implements DateFormatCheck { |
||||||
|
|
||||||
|
private static final Pattern YEAR_PATTERN_1 = Pattern.compile("y{4,}"); //yyyy
|
||||||
|
private static final Pattern YEAR_PATTERN_2 = Pattern.compile("y{2,}"); //yy
|
||||||
|
private static final Pattern MONTH_PATTERN_1 = Pattern.compile("M{4,}"); //MMMM
|
||||||
|
private static final Pattern MONTH_PATTERN_2 = Pattern.compile("M{3}"); //MMM
|
||||||
|
private static final Pattern MONTH_PATTERN_3 = Pattern.compile("M{2}"); //MM
|
||||||
|
private static final Pattern MONTH_PATTERN_4 = Pattern.compile("M"); //M
|
||||||
|
private static final Pattern MONTH_PATTERN_5 = Pattern.compile("a"); |
||||||
|
private static final Pattern DAY_PATTERN_1 = Pattern.compile("d{2,}"); //dd
|
||||||
|
private static final Pattern DAY_PATTERN_2 = Pattern.compile("d"); //d
|
||||||
|
private static final Pattern HOUR_PATTERN_1 = Pattern.compile("h+"); //hh、h
|
||||||
|
private static final Pattern HOUR_PATTERN_2 = Pattern.compile("H+"); //HH、H
|
||||||
|
private static final Pattern MINUTE_PATTERN = Pattern.compile("m{2,}"); //mm
|
||||||
|
private static final Pattern SECOND_PATTERN = Pattern.compile("s{2,}"); //ss
|
||||||
|
private static final Pattern FMT_PATTERN = Pattern.compile("%."); |
||||||
|
|
||||||
|
public static final DateFormatFrontCheck KEY = new DateFormatFrontCheck(); |
||||||
|
|
||||||
|
/** |
||||||
|
* 前端支持的格式 |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public boolean accept(String date, String format) { |
||||||
|
if (StringUtils.isBlank(date) || StringUtils.isBlank(format)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
String fmt = parseFmt(format); |
||||||
|
int fmtCount = 0; |
||||||
|
Matcher matcher = FMT_PATTERN.matcher(fmt); |
||||||
|
while (matcher.find()) { |
||||||
|
fmtCount ++; |
||||||
|
} |
||||||
|
String[] dates = date.split("\\W+"); |
||||||
|
|
||||||
|
return dates.length == fmtCount || isSpecialFmt(fmt); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public DateFormatCheckResult result(String sample) { |
||||||
|
return DateFormatCheckResult.create(Toolkit.i18nText("Fine-Design_Basic_DateFormat_Not_Support"), Color.red); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean isSpecialFmt(String fmt) { |
||||||
|
String lowerFmt = fmt.toLowerCase(); |
||||||
|
return AssistUtils.equals(lowerFmt, "%y%x") || AssistUtils.equals(lowerFmt, "%y%x%d"); |
||||||
|
} |
||||||
|
|
||||||
|
private String parseFmt(String fmt) { |
||||||
|
//年
|
||||||
|
fmt = YEAR_PATTERN_1.matcher(fmt).replaceAll("%Y"); |
||||||
|
fmt = YEAR_PATTERN_2.matcher(fmt).replaceAll("%y"); |
||||||
|
//月
|
||||||
|
fmt = MONTH_PATTERN_1.matcher(fmt).replaceAll("%b"); |
||||||
|
fmt = MONTH_PATTERN_2.matcher(fmt).replaceAll("%B"); |
||||||
|
fmt = MONTH_PATTERN_3.matcher(fmt).replaceAll("%X"); |
||||||
|
fmt = MONTH_PATTERN_4.matcher(fmt).replaceAll("%x"); |
||||||
|
fmt = MONTH_PATTERN_5.matcher(fmt).replaceAll("%p"); |
||||||
|
//天
|
||||||
|
Matcher dayMatcher = DAY_PATTERN_1.matcher(fmt); |
||||||
|
if (dayMatcher.find()) { |
||||||
|
fmt = dayMatcher.replaceAll("%d"); |
||||||
|
} else { |
||||||
|
fmt = DAY_PATTERN_2.matcher(fmt).replaceAll("%e"); |
||||||
|
} |
||||||
|
//时
|
||||||
|
fmt = HOUR_PATTERN_1.matcher(fmt).replaceAll("%I"); |
||||||
|
fmt = HOUR_PATTERN_2.matcher(fmt).replaceAll("%H"); |
||||||
|
//分
|
||||||
|
fmt = MINUTE_PATTERN.matcher(fmt).replaceAll("%M"); |
||||||
|
//秒
|
||||||
|
fmt = SECOND_PATTERN.matcher(fmt).replaceAll("%S"); |
||||||
|
return fmt; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue