刘光辉
7 小时以前 06f314545ac3514d7ce28939920866ae8188d31c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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<String, FieldRule> form;
    private Map<String, FieldRule> 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<String, FieldRule> 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<String, FieldRule> decode(String encoded, String[] fields) {
        if (encoded.length() != fields.length) throw new IllegalArgumentException("用户字段配置长度无效");
        Map<String, FieldRule> 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;
    }
}