许鹏程
2023-05-24 30d06cd40ab7c59a0bb8641f5d28e219af2c085c
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
package com.product.face.entity;
 
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.product.admin.config.CmnConst;
import com.product.admin.service.DictService;
import com.product.admin.service.SystemFaceService;
import com.product.common.lang.StringUtils;
import com.product.core.cache.DataPoolCacheImpl;
import com.product.core.cache.util.RedisUtil;
import com.product.core.config.CoreConst;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.spring.context.SpringBeanUtil;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.module.sys.entity.SystemUser;
import com.product.util.BaseUtil;
 
import java.io.Serializable;
import java.util.List;
import java.util.Map;
 
/**
 * @Author cheng
 * @Description 列表字段操作类
 * @Date 2021/9/7 14:34
 * @Version 1.0
 */
public class FaceListEntity implements Serializable {
 
    private static final long serialVersionUID = -6777140406080679771L;
    /**
     * 表uuid
     */
    private String tableUuid;
    /**
     * face_uuid
     */
    private String uuid;
    /**
     * 表单名
     */
    private String faceName;
    /**
     * 功能uuid
     */
    @Deprecated
    private String functionUuid;
    /**
     * 字段集合
     */
    private List<FaceField> faceFields;
    /**
     * 表名
     */
    private String tableName;
 
    /**
     * 获取表名
     *
     * @return
     */
    public String getTableName() {
        if (this.tableName == null && this.tableUuid != null) {
            //从缓存中获取
            DataTableEntity cacheData = DataPoolCacheImpl.getInstance().getCacheData("所有表信息(uuid)", new String[]{this.tableUuid});
            if (cacheData != null && cacheData.getRows() > 0) {
                String table_name = cacheData.getString(0, "table_name");
                this.tableName = table_name;
            }
        }
        return tableName;
    }
 
    /**
     * 条件字段
     *
     * @param fieldName      字段名称
     * @param faceUuid       字段uuid
     * @param columnName     列名
     * @param columnWidth    列宽
     * @param sequence       排序
     * @param fieldReference 参照
     */
    public void addField(String fieldName, String faceUuid, String columnName, String columnWidth, Integer sequence, String fieldReference) {
        FaceField faceField = new FaceField();
        faceField.setFieldName(fieldName);
        faceField.setFieldUuid(faceUuid);
        faceField.setColumnName(columnName);
        faceField.setColumnWidth(columnWidth);
        faceField.setSequence(sequence);
        faceField.setFieldReference(fieldReference);
        if (this.faceFields == null) {
            this.faceFields = Lists.newArrayList();
        }
        this.faceFields.add(faceField);
    }
 
    /**
     * 字段排序方法
     */
    public void sortField() {
        if (this.faceFields != null && this.faceFields.size() > 0) {
            this.faceFields.sort((a, b) -> {
                return a.getSequence().compareTo(b.getSequence());
            });
        }
    }
 
    public String getTableUuid() {
        return tableUuid;
    }
 
    public void setTableUuid(String tableUuid) {
        this.tableUuid = tableUuid;
    }
 
    public String getUuid() {
        return uuid;
    }
 
    public void setUuid(String uuid) {
        this.uuid = uuid;
    }
 
    public String getFaceName() {
        return faceName;
    }
 
    public void setFaceName(String faceName) {
        this.faceName = faceName;
    }
 
    public String getFunctionUuid() {
        return functionUuid;
    }
 
    public void setFunctionUuid(String functionUuid) {
        this.functionUuid = functionUuid;
    }
 
    public List<FaceField> getFaceFields() {
        return faceFields;
    }
 
    public void setFaceFields(List<FaceField> faceFields) {
        this.faceFields = faceFields;
    }
 
    /**
     * 获取参照条件
     *
     * @param fieldName
     * @param dictName
     * @return
     */
    private String getDictFilter(String fieldName, String dictName) {
        StringBuilder filter = new StringBuilder();
        DictService bean = SpringBeanUtil.getBean(DictService.class);
        String manager_type = null;
        SystemUser currentUser = SpringMVCContextHolder.getCurrentUser();
        if (currentUser != null && currentUser.getCurrentManager() != null) {
            manager_type = currentUser.getCurrentManager().getString(CmnConst.MANAGER_TYPE);
        } else {
            manager_type = null;
        }
        //拼装普通参照查询所需参数
        FieldSetEntity fse = new FieldSetEntity();
        fse.setTableName(CmnConst.PRODUCT_SYS_DICT);
        fse.setValue(CmnConst.DICT_NAME, dictName);
        fse.setValue(CoreConst.SYSTEM_CLIENT_TYPE_, currentUser.getClientType());
        //获取参照集合
        DataTableEntity dataTableEntity = bean.listDictByname(fse, manager_type);
        if (!BaseUtil.dataTableIsEmpty(dataTableEntity)) {
            //组成条件
            Object[] uuids = dataTableEntity.getUuids();
            filter.append(fieldName);
            filter.append(" in  (SELECT  dict_value FROM product_sys_dict where ");
            filter.append(BaseUtil.buildQuestionMarkFilter("uuid", uuids, true));
            filter.append(" and dict_label like concat('%','~val~','%') ) ");
        }
        return filter.toString();
    }
 
    /**
     * 获取条件
     *
     * @param tableAlias 表别名
     * @param aliasField 字段别名
     * @return
     */
    public Map<String, List<String>> getFilters(String tableAlias, Map<String, List<String>> aliasField) {
        DataPoolCacheImpl poolCache = null;
        //所有字段集合
        List<FaceField> faceFields = this.getFaceFields();
        //普通模糊查询字段集合
        List<String> fieldNames = Lists.newArrayList();
        //参照模糊查询条件集合
        List<String> filters = Lists.newArrayList();
        //返回的结果集
        Map<String, List<String>> maps = Maps.newHashMap();
        maps.put("fields", fieldNames);
        maps.put("filter", filters);
        for (int i = 0; i < faceFields.size(); i++) {
            FaceField faceField = faceFields.get(i);
            if (StringUtils.isEmpty(faceField.getFieldName()) || StringUtils.isEmpty(faceField.getFieldReference())) {
                if (poolCache == null) {
                    poolCache = DataPoolCacheImpl.getInstance();
                }
                DataTableEntity dt = poolCache.getCacheData("表字段信息", new String[]{getTableUuid(), faceField.getFieldName()});
                if (BaseUtil.dataTableIsEmpty(dt)) {
                } else {
                    FieldSetEntity f = dt.getFieldSetEntity(0);
                    faceField.setFieldName(f.getString(CmnConst.FIELD_NAME));
                    faceField.setFieldReference(f.getString("field_reference"));
                }
            }
            //字段名称
            String fieldName = faceField.getFieldName();
            if (aliasField != null && !StringUtils.isEmpty(fieldName)) {
                List<String> fieldAlias = aliasField.get(getTableName() + "." + fieldName);
                if (fieldAlias != null && fieldAlias.size() > 0) {
                    String alias = fieldAlias.get(0);
                    if (!StringUtils.isEmpty(alias)) {
                        fieldName = alias;
                    }
                }
            }
            //参照处理
            String field_reference = faceField.getFieldReference();
            if (!StringUtils.isEmpty(field_reference)) {
                if (field_reference.indexOf("《") == 0 && field_reference.indexOf("》") > 0) {
                    //普通参照
                    filters.add(getDictFilter(getFieldName(tableAlias, fieldName), field_reference.replace("《", "").replace("》", "")));
                    continue;
                } else {
                    if (poolCache == null) {
                        poolCache = DataPoolCacheImpl.getInstance();
                    }
                    //高级参照
                    DataTableEntity prompt = poolCache.getCacheData("高级参照配置信息", new String[]{field_reference});
                    if (BaseUtil.dataTableIsEmpty(prompt)) {
                        continue;
                    }
                    FieldSetEntity ff = prompt.getFieldSetEntity(0);
                    StringBuilder p = new StringBuilder();
                    p.append(getFieldName(tableAlias, fieldName)).append("` in ").append(" ( SELECT `").append(ff.getString("value_field")).append("` FROM ").append(ff.getString("source_table"));
                    p.append(" WHERE ").append(ff.getString("view_fields")).append(" like concat('%','~val~','%') )");
                    filters.add(p.toString());
                    continue;
                }
            }
 
            if (!StringUtils.isEmpty(faceField.getFieldName())) {
                fieldNames.add(getFieldName(tableAlias, fieldName));
            }
        }
        //获取redis 起始key
        String faceListKey = SystemFaceService.FACE_LIST_KEY;
        //重新放入redis
        RedisUtil.set(faceListKey + getUuid(), this);
        return maps;
    }
 
    private String getFieldName(String tableAlias, String fieldName) {
        fieldName = "`" + fieldName + "`";
        if (!StringUtils.isEmpty(tableAlias)) {
            return "`" + tableAlias + "`." + fieldName;
        }
        return fieldName;
    }
 
    /**
     * 字段实体类
     */
    public class FaceField implements Serializable {
 
        private static final long serialVersionUID = 3154509166818911568L;
        /**
         * 字段名称
         */
        private String fieldName;
        /**
         * 字段uuid
         */
        private String fieldUuid;
        /**
         * 列名
         */
        private String columnName;
        /**
         * 列宽
         */
        private String columnWidth;
        /**
         * 排序
         */
        private Integer sequence;
        /**
         * 字段参照
         */
        private String fieldReference;
 
        public String getFieldReference() {
            return fieldReference;
        }
 
        public void setFieldReference(String fieldReference) {
            this.fieldReference = fieldReference;
        }
 
        public String getFieldName() {
            return fieldName;
        }
 
        public void setFieldName(String fieldName) {
            this.fieldName = fieldName;
        }
 
        public String getFieldUuid() {
            return fieldUuid;
        }
 
        public void setFieldUuid(String fieldUuid) {
            this.fieldUuid = fieldUuid;
        }
 
        public String getColumnName() {
            return columnName;
        }
 
        public void setColumnName(String columnName) {
            this.columnName = columnName;
        }
 
        public String getColumnWidth() {
            return columnWidth;
        }
 
        public void setColumnWidth(String columnWidth) {
            this.columnWidth = columnWidth;
        }
 
        public Integer getSequence() {
            return sequence;
        }
 
        public void setSequence(Integer sequence) {
            this.sequence = sequence;
        }
 
    }
 
}