刘光辉
4 小时以前 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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package jnpf.elnService.formula.impl;
 
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jnpf.elnEntity.field.ElnFieldVersionEntity;
import jnpf.elnEntity.formula.ElnFormulaDefEntity;
import jnpf.elnEntity.formula.ElnFormulaParameterSlotEntity;
import jnpf.elnEntity.formula.ElnFormulaVersionEntity;
import jnpf.elnEntity.formula.ElnTemplateFormulaBindingEntity;
import jnpf.elnEntity.template.ElnTemplateBindingEntity;
import jnpf.elnEntity.template.ElnTemplateVos;
import jnpf.elnMapper.ElnFieldVersionMapper;
import jnpf.elnMapper.ElnFormulaDefMapper;
import jnpf.elnMapper.ElnFormulaParameterSlotMapper;
import jnpf.elnMapper.ElnFormulaVersionMapper;
import jnpf.elnMapper.ElnTemplateBindingMapper;
import jnpf.elnMapper.ElnTemplateFormulaBindingMapper;
import jnpf.elnService.template.ElnTemplateBindingDependencyValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
@Service
public class FormulaFieldBindingDependencyValidator
        implements ElnTemplateBindingDependencyValidator {
    private final Store store;
 
    @Autowired
    public FormulaFieldBindingDependencyValidator(ElnTemplateFormulaBindingMapper formulas,
            ElnTemplateBindingMapper fields, ElnFieldVersionMapper fieldVersions,
            ElnFormulaVersionMapper formulaVersions, ElnFormulaDefMapper definitions,
            ElnFormulaParameterSlotMapper slots) {
        this(new MyBatisStore(formulas, fields, fieldVersions, formulaVersions, definitions, slots));
    }
 
    public FormulaFieldBindingDependencyValidator(Store store) { this.store = store; }
 
    @Override
    public List<ElnTemplateVos.Diagnostic> validateUpgrade(String tenantId, String templateId,
            Set<String> bindingIds, String targetFieldVersionId) {
        ElnFieldVersionEntity target = store.findFieldVersion(tenantId, targetFieldVersionId);
        if (target == null) return Collections.singletonList(diagnostic(
                "FORMULA_FIELD_TYPE_MISMATCH", "目标字段版本不存在", null));
        List<ElnTemplateVos.Diagnostic> result = new ArrayList<>();
        for (ElnTemplateFormulaBindingEntity formula : live(tenantId, templateId)) {
            ElnFormulaVersionEntity version = store.findFormulaVersion(
                    tenantId, formula.getGongshiBanbenId());
            if (version == null) continue;
            if (bindingIds.contains(formula.getJieguoBangdingId())
                    && !compatible(version.getJieguoLeixing(), target.getShujuLeixing()))
                result.add(diagnostic("FORMULA_FIELD_TYPE_MISMATCH",
                        "字段升级后与公式结果类型不兼容", formula.getJieguoBangdingId()));
            Map<String, String> mapped = formula.getCanshuYingshe();
            for (ElnFormulaParameterSlotEntity slot
                    : store.listSlots(tenantId, version.getId())) {
                String fieldBindingId = mapped.get(slot.getCanshuBianma());
                if (bindingIds.contains(fieldBindingId)
                        && !compatible(slot.getShujuLeixing(), target.getShujuLeixing()))
                    result.add(diagnostic("FORMULA_FIELD_TYPE_MISMATCH",
                            "字段升级后与公式参数类型不兼容", fieldBindingId));
            }
        }
        return result;
    }
 
    @Override
    public List<ElnTemplateVos.Diagnostic> validateRemoval(String tenantId, String templateId,
            Set<String> bindingIds) {
        List<ElnTemplateVos.Diagnostic> result = new ArrayList<>();
        for (ElnTemplateFormulaBindingEntity formula : live(tenantId, templateId)) {
            for (String id : bindingIds) {
                if (id.equals(formula.getJieguoBangdingId())
                        || formula.getCanshuYingshe().containsValue(id))
                    result.add(diagnostic("FORMULA_FIELD_IN_USE",
                            "字段仍被活动或待确认公式映射引用", id));
            }
        }
        return result;
    }
 
    @Override
    public List<ElnTemplateVos.Diagnostic> validatePromotion(String tenantId, String templateId,
            String primaryBindingId, String referenceBindingId) {
        return validateRemoval(tenantId, templateId, Collections.singleton(primaryBindingId));
    }
 
    @Override
    public List<ElnTemplateVos.Diagnostic> validateCheckboxGroup(
            String tenantId, String templateId, String bindingId) {
        for (ElnTemplateFormulaBindingEntity formula : live(tenantId, templateId)) {
            if (bindingId != null && bindingId.equals(formula.getJieguoBangdingId())) {
                return Collections.singletonList(diagnostic(
                        "CHECKBOX_GROUP_FORMULA_RESULT_READ_ONLY",
                        "公式结果字段不能加入选择组", bindingId));
            }
        }
        return Collections.emptyList();
    }
 
    private List<ElnTemplateFormulaBindingEntity> live(String tenantId, String templateId) {
        List<ElnTemplateFormulaBindingEntity> result = new ArrayList<>();
        for (ElnTemplateFormulaBindingEntity item : store.listFormulaBindings(tenantId, templateId))
            if ("ACTIVE".equals(item.getBangdingZhuangtai())
                    || "PENDING".equals(item.getBangdingZhuangtai())) result.add(item);
        return result;
    }
 
    static boolean compatible(String formulaType, String fieldType) {
        return "DECIMAL".equals(formulaType) && "DECIMAL".equals(fieldType)
                || "TEXT".equals(formulaType) && ("TEXT".equals(fieldType)
                    || "TEXTAREA".equals(fieldType) || "SELECT".equals(fieldType))
                || "BOOLEAN".equals(formulaType) && "CHECKBOX".equals(fieldType);
    }
 
    private static ElnTemplateVos.Diagnostic diagnostic(String code, String message, String id) {
        ElnTemplateVos.Diagnostic result = new ElnTemplateVos.Diagnostic();
        result.setSeverity("ERROR"); result.setCode(code); result.setMessage(message);
        result.setBindingId(id); return result;
    }
 
    public interface Store {
        List<ElnTemplateFormulaBindingEntity> listFormulaBindings(String tenantId, String templateId);
        ElnTemplateBindingEntity findFieldBinding(String tenantId, String id);
        List<ElnTemplateBindingEntity> listFieldBindings(String tenantId, String templateId);
        ElnFieldVersionEntity findFieldVersion(String tenantId, String id);
        ElnFormulaVersionEntity findFormulaVersion(String tenantId, String id);
        ElnFormulaDefEntity findFormulaDefinition(String tenantId, String id);
        List<ElnFormulaParameterSlotEntity> listSlots(String tenantId, String versionId);
    }
 
    static class MyBatisStore implements Store {
        final ElnTemplateFormulaBindingMapper formulas; final ElnTemplateBindingMapper fields;
        final ElnFieldVersionMapper fieldVersions; final ElnFormulaVersionMapper formulaVersions;
        final ElnFormulaDefMapper definitions; final ElnFormulaParameterSlotMapper slots;
        MyBatisStore(ElnTemplateFormulaBindingMapper formulas, ElnTemplateBindingMapper fields,
                ElnFieldVersionMapper fieldVersions, ElnFormulaVersionMapper formulaVersions,
                ElnFormulaDefMapper definitions, ElnFormulaParameterSlotMapper slots) {
            this.formulas=formulas;this.fields=fields;this.fieldVersions=fieldVersions;
            this.formulaVersions=formulaVersions;this.definitions=definitions;this.slots=slots;
        }
        @Override public List<ElnTemplateFormulaBindingEntity> listFormulaBindings(String t,String m){return formulas.selectList(Wrappers.<ElnTemplateFormulaBindingEntity>lambdaQuery().eq(ElnTemplateFormulaBindingEntity::getFTenantId,t).eq(ElnTemplateFormulaBindingEntity::getMubanId,m).and(q->q.isNull(ElnTemplateFormulaBindingEntity::getFDeleteMark).or().eq(ElnTemplateFormulaBindingEntity::getFDeleteMark,0)));}
        @Override public ElnTemplateBindingEntity findFieldBinding(String t,String id){return fields.selectOne(Wrappers.<ElnTemplateBindingEntity>lambdaQuery().eq(ElnTemplateBindingEntity::getFTenantId,t).eq(ElnTemplateBindingEntity::getId,id).and(q->q.isNull(ElnTemplateBindingEntity::getFDeleteMark).or().eq(ElnTemplateBindingEntity::getFDeleteMark,0)));}
        @Override public List<ElnTemplateBindingEntity> listFieldBindings(String t,String m){return fields.selectList(Wrappers.<ElnTemplateBindingEntity>lambdaQuery().eq(ElnTemplateBindingEntity::getFTenantId,t).eq(ElnTemplateBindingEntity::getMubanId,m).and(q->q.isNull(ElnTemplateBindingEntity::getFDeleteMark).or().eq(ElnTemplateBindingEntity::getFDeleteMark,0)));}
        @Override public ElnFieldVersionEntity findFieldVersion(String t,String id){return fieldVersions.selectOne(Wrappers.<ElnFieldVersionEntity>lambdaQuery().eq(ElnFieldVersionEntity::getFTenantId,t).eq(ElnFieldVersionEntity::getId,id).and(q->q.isNull(ElnFieldVersionEntity::getFDeleteMark).or().eq(ElnFieldVersionEntity::getFDeleteMark,0)));}
        @Override public ElnFormulaVersionEntity findFormulaVersion(String t,String id){return formulaVersions.selectOne(Wrappers.<ElnFormulaVersionEntity>lambdaQuery().eq(ElnFormulaVersionEntity::getFTenantId,t).eq(ElnFormulaVersionEntity::getId,id).and(q->q.isNull(ElnFormulaVersionEntity::getFDeleteMark).or().eq(ElnFormulaVersionEntity::getFDeleteMark,0)));}
        @Override public ElnFormulaDefEntity findFormulaDefinition(String t,String id){return definitions.selectOne(Wrappers.<ElnFormulaDefEntity>lambdaQuery().eq(ElnFormulaDefEntity::getFTenantId,t).eq(ElnFormulaDefEntity::getId,id).and(q->q.isNull(ElnFormulaDefEntity::getFDeleteMark).or().eq(ElnFormulaDefEntity::getFDeleteMark,0)));}
        @Override public List<ElnFormulaParameterSlotEntity> listSlots(String t,String id){return slots.selectList(Wrappers.<ElnFormulaParameterSlotEntity>lambdaQuery().eq(ElnFormulaParameterSlotEntity::getFTenantId,t).eq(ElnFormulaParameterSlotEntity::getGongshiBanbenId,id).and(q->q.isNull(ElnFormulaParameterSlotEntity::getFDeleteMark).or().eq(ElnFormulaParameterSlotEntity::getFDeleteMark,0)));}
    }
}