package jnpf.base.model.systemconfig; import lombok.Data; import java.util.LinkedHashMap; import java.util.Map; @Data public class UserFieldConfig { private static final String[] FORM_FIELDS = {"account", "realName", "jobNumber", "positionId", "gender", "email", "mobilePhone", "ranks", "sortCode", "enabledMark", "description", "headIcon", "nation", "nativePlace", "certificatesType", "entryDate", "certificatesNumber", "education", "birthday", "telePhone", "landline", "urgentContacts", "urgentTelePhone", "postalAddress", "roleId"}; private static final String[] LIST_FIELDS = {"account", "realName", "jobNumber", "gender", "mobilePhone", "position", "creatorTime", "lastModifyTime", "sortCode", "enabledMark", "disableTime"}; private Map form; private Map list; public String toCompactString() { return encode(form, FORM_FIELDS) + ":" + encode(list, LIST_FIELDS); } public static UserFieldConfig fromCompactString(String value) { UserFieldConfig config = new UserFieldConfig(); if (value == null || value.isEmpty()) return config; String[] parts = value.split(":", -1); if (parts.length != 2 && parts.length != 3) throw new IllegalArgumentException("用户字段配置格式无效"); String formPart = parts[0]; if (formPart.length() == FORM_FIELDS.length - 1) formPart += '1'; config.setForm(decode(formPart, FORM_FIELDS)); String listPart = parts[parts.length - 1]; if (listPart.length() == LIST_FIELDS.length - 1) listPart += '1'; config.setList(decode(listPart, LIST_FIELDS)); return config; } private static String encode(Map rules, String[] fields) { StringBuilder encoded = new StringBuilder(fields.length); for (String field : fields) { FieldRule rule = rules.get(field); encoded.append(!rule.isVisible() ? '0' : rule.isRequired() ? '2' : '1'); } return encoded.toString(); } private static Map decode(String encoded, String[] fields) { if (encoded.length() != fields.length) throw new IllegalArgumentException("用户字段配置长度无效"); Map rules = new LinkedHashMap<>(); for (int i = 0; i < fields.length; i++) { char code = encoded.charAt(i); if (code != '0' && code != '1' && code != '2') throw new IllegalArgumentException("用户字段配置内容无效"); FieldRule rule = new FieldRule(); rule.setVisible(code != '0'); rule.setRequired(code == '2'); rules.put(fields[i], rule); } return rules; } @Data public static class FieldRule { private boolean visible; private boolean required; } }