刘光辉
15 小时以前 34981c30a78e8bbd7791131059a9210f9928b62c
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
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
package jnpf.limsService.support;
 
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import jnpf.limsMapper.LimsHaocaiRukuYanshouMapper;
import jnpf.limsMapper.LimsHaocaiRukuZixiangMapper;
import jnpf.limsMapper.LimsHaocaiXiaohuiShenqingMapper;
import jnpf.limsMapper.LimsHaocaiXiaohuiShenqingZixiangMapper;
import jnpf.limsMapper.LimsHuanjingJianceBaogaoMapper;
import jnpf.limsMapper.LimsHuanjingJianceJihuaMapper;
import jnpf.limsMapper.LimsHuanjingJianceJihuaZhongzhiMapper;
import jnpf.limsMapper.LimsLiuyangJihuaBiangengShenqingMapper;
import jnpf.limsMapper.LimsQingyandanYichangShenqingMapper;
import jnpf.limsMapper.LimsShebeiYiqiJiaozhunNeibuMapper;
import jnpf.limsMapper.LimsShebeiYiqiJiaozhunWaibuMapper;
import jnpf.limsMapper.LimsShebeiYiqiJiliangMapper;
import jnpf.limsMapper.LimsShebeiYiqiPeijianGenghuanZixiangMapper;
import jnpf.limsMapper.LimsShebeiYiqiQijuBaofeiMapper;
import jnpf.limsMapper.LimsShebeiYiqiYanzhengMapper;
import jnpf.limsMapper.LimsShebeiYiqiWeibaoZixiangMapper;
import jnpf.limsMapper.LimsWendingxingChurukuMapper;
import jnpf.limsMapper.LimsWendingxingChurukuZixiangMapper;
import jnpf.limsMapper.LimsWendingxingKaocaJihuaBiangengMapper;
import jnpf.limsMapper.LimsWendingxingKaocaJihuaBiangengZhouqiMapper;
import jnpf.limsMapper.LimsWendingxingXiaohuiShenqingMapper;
import jnpf.util.context.SpringContext;
 
import java.util.List;
import java.util.Map;
 
/** 为 @AuditLog 的 SpEL 在业务执行前解析关联表真实主键。 */
public final class LimsAuditTargetIds {
 
    private LimsAuditTargetIds() {
    }
 
    public static String liuyangJihuaByChangeFlow(String flowId, String taskId) {
        return lookup(LimsLiuyangJihuaBiangengShenqingMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "liuyang_jihua_id");
    }
 
    public static String huanjingJihuaByFlow(String flowId, String taskId) {
        return lookup(LimsHuanjingJianceJihuaMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "f_id");
    }
 
    public static String huanjingJihuaByTerminateFlow(String flowId, String taskId) {
        return lookup(LimsHuanjingJianceJihuaZhongzhiMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "jihua_id");
    }
 
    public static String huanjingBaogaoByFlow(String flowId, String taskId) {
        return lookup(LimsHuanjingJianceBaogaoMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "f_id");
    }
 
    public static String qingyandanByExceptionFlow(String flowId, String taskId) {
        return lookup(LimsQingyandanYichangShenqingMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "qingyandan_id");
    }
 
    public static String qijuByExternalCalibration(String calibrationId) {
        return lookupById(LimsShebeiYiqiJiaozhunWaibuMapper.class, calibrationId, "qiju_id");
    }
 
    public static String qijuByInternalCalibrationFlow(String flowId, String taskId) {
        return lookup(LimsShebeiYiqiJiaozhunNeibuMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "qiju_id");
    }
 
    public static String qijuByScrapFlow(String flowId, String taskId) {
        return lookup(LimsShebeiYiqiQijuBaofeiMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "qiju_id");
    }
 
    public static String yiqiByVerification(String verificationId) {
        return lookupById(LimsShebeiYiqiYanzhengMapper.class, verificationId, "yiqi_id");
    }
 
    public static String yiqiByMeasurement(String measurementId) {
        return lookupById(LimsShebeiYiqiJiliangMapper.class, measurementId, "yiqi_id");
    }
 
    public static String wendingxingDestroyByFlow(String flowId, String taskId) {
        return lookup(LimsWendingxingXiaohuiShenqingMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "f_id");
    }
 
    public static String haocaiAcceptanceByFlow(String flowId, String taskId) {
        return lookup(LimsHaocaiRukuYanshouMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "f_id");
    }
 
    public static String haocaiAcceptanceRequestByFlow(String flowId, String taskId) {
        return lookup(LimsHaocaiRukuYanshouMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "shenqing_id");
    }
 
    public static String firstPartReplacementItem(String replacementId) {
        return lookupFirst(LimsShebeiYiqiPeijianGenghuanZixiangMapper.class,
                "f_foreign_id", replacementId, "f_id");
    }
 
    public static String firstMaintenanceItem(String maintenanceId) {
        return lookupFirst(LimsShebeiYiqiWeibaoZixiangMapper.class,
                "f_foreign_id", maintenanceId, "f_id");
    }
 
    public static String firstHaocaiRukuItem(List<String> rukuIds) {
        return lookupFirstIn(LimsHaocaiRukuZixiangMapper.class,
                "f_foreign_id", rukuIds, "f_id");
    }
 
    public static String firstHaocaiDestroyItem(String destroyNumber) {
        String requestId = lookupFirst(LimsHaocaiXiaohuiShenqingMapper.class,
                "xiaohui_danhao", destroyNumber, "f_id");
        return firstHaocaiDestroyItemByRequest(requestId);
    }
 
    public static String firstHaocaiDestroyItemByFlow(String flowId, String taskId) {
        String requestId = lookup(LimsHaocaiXiaohuiShenqingMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "f_id");
        return firstHaocaiDestroyItemByRequest(requestId);
    }
 
    public static String firstWendingxingChurukuItemByFlow(String flowId, String taskId) {
        String churukuId = lookup(LimsWendingxingChurukuMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "f_id");
        return lookupFirst(LimsWendingxingChurukuZixiangMapper.class,
                "f_foreign_id", churukuId, "f_id");
    }
 
    public static String firstWendingxingChangedPeriod(String flowId, String taskId) {
        String changeId = lookup(LimsWendingxingKaocaJihuaBiangengMapper.class,
                "f_flow_id", flowId, "f_flow_task_id", taskId, "f_id");
        return lookupFirstNotBlank(LimsWendingxingKaocaJihuaBiangengZhouqiMapper.class,
                "biangeng_id", changeId, "yuanjihua_zhouqi_id");
    }
 
    private static String firstHaocaiDestroyItemByRequest(String requestId) {
        String barcode = lookupFirstNotBlank(LimsHaocaiXiaohuiShenqingZixiangMapper.class,
                "f_foreign_id", requestId, "tiaoma_bianma");
        return lookupFirst(LimsHaocaiRukuZixiangMapper.class,
                "tiaoma_bianma", barcode, "f_id");
    }
 
    private static String lookupById(Class<? extends BaseMapper<?>> mapperType,
                                     String id, String selectedColumn) {
        return lookup(mapperType, "f_id", id, null, null, selectedColumn);
    }
 
    private static String lookupFirst(Class<? extends BaseMapper<?>> mapperType,
                                      String conditionColumn, String conditionValue,
                                      String selectedColumn) {
        if (isBlank(conditionValue)) {
            return null;
        }
        return selectFirst(mapperType, new QueryWrapper<>().eq(conditionColumn, conditionValue),
                selectedColumn, false);
    }
 
    private static String lookupFirstNotBlank(Class<? extends BaseMapper<?>> mapperType,
                                              String conditionColumn, String conditionValue,
                                              String selectedColumn) {
        if (isBlank(conditionValue)) {
            return null;
        }
        QueryWrapper<Object> query = new QueryWrapper<>();
        query.eq(conditionColumn, conditionValue).isNotNull(selectedColumn).ne(selectedColumn, "");
        return selectFirst(mapperType, query, selectedColumn, false);
    }
 
    private static String lookupFirstIn(Class<? extends BaseMapper<?>> mapperType,
                                        String conditionColumn, List<String> conditionValues,
                                        String selectedColumn) {
        if (conditionValues == null || conditionValues.isEmpty()) {
            return null;
        }
        return selectFirst(mapperType, new QueryWrapper<>().in(conditionColumn, conditionValues),
                selectedColumn, false);
    }
 
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static String selectFirst(Class<? extends BaseMapper<?>> mapperType,
                                      QueryWrapper<?> conditions, String selectedColumn,
                                      boolean requireUnique) {
        BaseMapper mapper = SpringContext.getBean(mapperType);
        QueryWrapper query = conditions.select(selectedColumn).orderByAsc("f_id");
        List<Map<String, Object>> rows = mapper.selectMaps(query);
        if (rows == null || rows.isEmpty() || (requireUnique && rows.size() != 1)) {
            return null;
        }
        return mapValue(rows.get(0), selectedColumn);
    }
 
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static String lookup(Class<? extends BaseMapper<?>> mapperType,
                                 String firstColumn, String firstValue,
                                 String secondColumn, String secondValue,
                                 String selectedColumn) {
        if (isBlank(firstValue) || (secondColumn != null && isBlank(secondValue))) {
            return null;
        }
        BaseMapper mapper = SpringContext.getBean(mapperType);
        QueryWrapper<Object> query = new QueryWrapper<>();
        query.select(selectedColumn).eq(firstColumn, firstValue);
        if (secondColumn != null) {
            query.eq(secondColumn, secondValue);
        }
        List<Map<String, Object>> rows = mapper.selectMaps(query);
        if (rows == null || rows.size() != 1) {
            return null;
        }
        return mapValue(rows.get(0), selectedColumn);
    }
 
    private static String mapValue(Map<String, Object> row, String column) {
        Object value = row.get(column);
        if (value == null) {
            value = row.get(column.toUpperCase());
        }
        return value == null ? null : String.valueOf(value);
    }
 
    private static boolean isBlank(String value) {
        return value == null || value.trim().isEmpty();
    }
}