shichongfu
2023-04-25 ce0b49552668d3331055e2b1a1447a743dc54939
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
package com.product.admin.service;
 
import com.product.admin.config.CmnConst;
import com.product.admin.service.idel.IPublicService;
import com.product.common.lang.StringUtils;
import com.product.core.cache.DataPoolCacheImpl;
import com.product.core.dao.BaseDao;
import com.product.core.entity.DataTableEntity;
import com.product.core.entity.FieldSetEntity;
import com.product.core.exception.BaseException;
import com.product.core.permission.PermissionService;
import com.product.core.service.support.AbstractBaseService;
import com.product.core.service.support.QueryFilterService;
import com.product.core.spring.context.SpringMVCContextHolder;
import com.product.core.transfer.Transactional;
import com.product.module.sys.entity.SystemUser;
import com.product.util.BaseUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
 
/**
 * @Author cheng
 * @Description
 * @Date 2021/6/2 14:41
 * @Version 1.0
 */
@Service("publicService")
public class PublicService extends AbstractBaseService implements IPublicService {
 
    @Autowired
    QueryFilterService queryFilterService;
 
    @Autowired
    PermissionService permissionService;
 
    @Autowired
    CodeService codeService;
 
    @Autowired
    BaseDao baseDao;
 
    public FieldSetEntity getTableByUuid(String uuid) throws BaseException {
        if (StringUtils.isEmpty(uuid)) {
            return null;
        }
        DataPoolCacheImpl dataPoolCache = DataPoolCacheImpl.getInstance();
        if (dataPoolCache != null) {
            DataTableEntity cacheData = dataPoolCache.getCacheData("所有表信息(uuid)", new String[]{uuid});
            if (!BaseUtil.dataTableIsEmpty(cacheData)) {
                return cacheData.getFieldSetEntity(0);
            }
        }
        return null;
    }
 
    public FieldSetEntity getTableByTableName(String tableName) throws BaseException {
        if (StringUtils.isEmpty(tableName)) {
            return null;
        }
        DataPoolCacheImpl dataPoolCache = DataPoolCacheImpl.getInstance();
        if (dataPoolCache != null) {
            DataTableEntity cacheData = dataPoolCache.getCacheData("所有表信息", new String[]{tableName});
            if (!BaseUtil.dataTableIsEmpty(cacheData)) {
                return cacheData.getFieldSetEntity(0);
            }
        }
        return null;
    }
 
    /**
     * 获取临时编码
     *
     * @param table      表名
     * @param field      字段名
     * @param parentCode 上级编码,如果没有上级编码,则为"",不能为null
     * @return
     * @throws BaseException
     */
    public void createdCode(FieldSetEntity fse, String table, String field, String parentCode) throws BaseException {
        codeService.createCode(fse, table, field, parentCode);
    }
 
    public String getTableByFunction(String function_uuid) {
        FieldSetEntity fseFunctionInfo = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_FUNCTIONS, function_uuid, false);
        if (fseFunctionInfo != null) {
            return fseFunctionInfo.getString(CmnConst.TABLE_UUID);
        }
        return null;
    }
 
    /**
     * @param table_name     表名
     * @param relevanceTable 是否关联表(外键关联必须在field表中配置field_relation_table)
     * @return
     * @throws BaseException
     */
    public String getFields(String table_name, boolean relevanceTable) throws BaseException {
        DataPoolCacheImpl instance = DataPoolCacheImpl.getInstance();
        DataTableEntity table = instance.getCacheData("所有表信息", new String[]{table_name});
        Map<String, String> tableDdesc = new LinkedHashMap<>();
        DataTableEntity data = null;
        Map<String, Object> m = new HashMap<>();
        if (!BaseUtil.dataTableIsEmpty(table) && table.getFieldSetEntity(0) != null) {
            FieldSetEntity fs = table.getFieldSetEntity(0);
            tableDdesc.put(table_name, fs.getString(CmnConst.TABLE_DESCRIPTION));
            data = instance.getCacheData("所有字段信息并按表分组", new String[]{fs.getUUID()});
            m.put(table_name, BaseUtil.dataTableEntityToJson(data));
        }
 
        if (relevanceTable) {
            //找出关联表字段
            Object[][] subTableName =baseDao.getSubTableName(table_name);
            if (subTableName != null && subTableName[0] != null) {
                for (int i = 0; i < subTableName[0].length; i++) {
                    m.put((String) subTableName[1][i], BaseUtil.dataTableEntityToJson(instance.getCacheData("所有字段信息并按表分组", new String[]{(String) subTableName[0][i]})));
                    DataTableEntity d = instance.getCacheData("所有表信息", new String[]{(String) subTableName[1][i]});
                    if (d != null && d.getRows() > 0) {
                        tableDdesc.put(d.getString(0, CmnConst.TABLE_NAME), d.getString(0, CmnConst.TABLE_DESCRIPTION));
                    }
                }
            }
        }
        m.put("~table_desc~", tableDdesc);
        return BaseUtil.success(data, m);
    }
 
    /**
     * 通用列表查询
     * 可传入 filter 参数可用 key: ~select_params~ 多个用逗号分割
     * 可传入 orderby
     * fse 中必须要表名 分页参数
     * 默认加载参照
     *
     * @param fse
     * @return
     * @throws BaseException
     */
    public DataTableEntity listTable(FieldSetEntity fse) throws BaseException {
        //高级搜索过滤
        String queryFilter = queryFilterService.getQueryFilter(fse);
        if (!StringUtils.isEmpty(fse.getString("filter"))) {
            String filter = fse.getString("filter");
            if (!StringUtils.isEmpty(queryFilter)) {
                queryFilter += " and ";
            }
            queryFilter += " (" + filter + " ) ";
        }
        return getDataTableEntity(fse, true, queryFilter);
    }
 
    /**
     * 通用列表查询
     * 可传入 filter
     * 动态参数可用 key: ~select_params~ 多个用逗号分割
     * 可传入 orderby
     * fse 中必须要表名 如果没有分页参数 则查询第一页 最大条数 Integer.MAX_VALUE
     *
     * @param fse
     * @param isLoadPromptData  是否加载参照
     * @param permissionType    数据权限类型 1 公司 2 人员 3公司&&人员   可为空(不过滤)
     * @param permissionCompany 公司过滤字段 可为空 默认 org_level_uuid 只有填入 permissionType 生效
     * @param permissionStaff   人员过滤字段 可为空 为空时则不过滤 只有填入 permissionType 生效
     * @return
     * @throws BaseException
     */
    public DataTableEntity listTable(FieldSetEntity fse, boolean isLoadPromptData, Integer permissionType, String permissionCompany, String permissionStaff) throws BaseException {
        return getDataTableEntity(fse, isLoadPromptData, getListFilter(fse, permissionType, permissionCompany, permissionStaff));
    }
 
    /**
     * 列表过滤
     *
     * @param fse
     * @param permissionType  数据权限类型 1 公司 2 人员 3公司&&人员
     * @param permissionField 数据权限过滤字段  permissionType
     * @return
     * @throws BaseException
     */
    public String getListFilter(FieldSetEntity fse, Integer permissionType, String... permissionField) throws BaseException {
        //高级搜索过滤
        String queryFilter = queryFilterService.getQueryFilter(fse);
        if (!StringUtils.isEmpty(fse.getString("filter"))) {
            String filter = fse.getString("filter");
            if (!StringUtils.isEmpty(queryFilter)) {
                queryFilter += " and ";
            }
            queryFilter += " (" + filter + " ) ";
        }
        if (permissionField.length <= 0 || permissionField[0] == null) {
            if (permissionField.length <= 0) permissionField = new String[2];
            permissionField[0] = CmnConst.ORG_LEVEL_UUID;
        }
        String dataFilter = "";
        if (permissionType != null) {
            if (1 == permissionType) {
                //公司过滤
                dataFilter = permissionService.getDataFilter(permissionField.length == 0 ? null : permissionField[0]);
                //lx
            } else if (2 == permissionType && permissionField.length > 1 && permissionField[1] != null) {
                //人员过滤
                dataFilter = permissionService.getDataFilter(fse.getTableName(), permissionField[1]);
            } else if (3 == permissionType && permissionField.length > 1) {
                //公司人员过滤
                dataFilter = permissionService.getDataFilter(fse.getTableName(), permissionField[1], permissionField[0]);
            } else {
                return queryFilter;
            }
        }
        if (StringUtils.isEmpty(queryFilter)) {
            queryFilter = dataFilter;
        } else {
            queryFilter += "and ( " + dataFilter + ") ";
        }
        return queryFilter;
    }
 
    private DataTableEntity getDataTableEntity(FieldSetEntity fse, boolean isLoadPromptData, String queryFilter) {
        Object[] param = !StringUtils.isEmpty(fse.getString("~select_params~")) ? fse.getString("~select_params~").split(",") : new Object[]{};
        Object[] fields = !StringUtils.isEmpty(fse.getString("~select_fields~")) ? fse.getString("~select_fields~").split(",") : null;
        Integer pageSize = fse.getInteger(CmnConst.PAGESIZE);
        if (pageSize == null) {
            pageSize = Integer.MAX_VALUE;
        }
        Integer cpage = fse.getInteger(CmnConst.CPAGE);
        if (cpage == null) {
            cpage = 1;
        }
        DataTableEntity dt = baseDao.listTable(fse.getTableName(), queryFilter, param, fields, fse.getString("orderby"), pageSize, cpage);
        if (!DataTableEntity.isEmpty(dt) && isLoadPromptData) {
            baseDao.loadPromptData(dt);
        }
        return dt;
    }
 
    /**
     * 通用列表查询
     * 可传入 filter 参数可用 key: ~select_params~ 多个用逗号分割
     * 可传入 orderby
     * fse 中必须要表名 分页参数
     *
     * @param fse
     * @param isLoadPromptData 是否加载参照
     * @return
     * @throws BaseException
     */
    public DataTableEntity listTable(FieldSetEntity fse, boolean isLoadPromptData) throws BaseException {
        //高级搜索过滤
        String queryFilter = queryFilterService.getQueryFilter(fse);
        if (!StringUtils.isEmpty(fse.getString("filter"))) {
            String filter = fse.getString("filter");
            if (!StringUtils.isEmpty(queryFilter)) {
                queryFilter += " and ";
            }
            queryFilter += " (" + filter + " ) ";
        }
        Object[] param = !StringUtils.isEmpty(fse.getString("~select_params~")) ? fse.getString("~select_params~").split(",") : new Object[]{};
        Integer pageSize = fse.getInteger(CmnConst.PAGESIZE);
        if (pageSize == null) {
            pageSize = Integer.MAX_VALUE;
        }
        Integer cpage = fse.getInteger(CmnConst.CPAGE);
        if (cpage == null) {
            cpage = 1;
        }
        DataTableEntity dt = baseDao.listTable(fse.getTableName(), queryFilter, param, null, fse.getString("orderby"), pageSize, cpage);
        if (isLoadPromptData) {
            baseDao.loadPromptData(dt);
        }
        return dt;
    }
 
    /**
     * 通用数据查询
     * fse 中必须要表名 & uuid
     *
     * @param fse
     * @param isMoreSubData 是否查询子表
     * @return
     * @throws BaseException
     */
    public FieldSetEntity getFieldSetEntity(FieldSetEntity fse, boolean isMoreSubData) throws BaseException {
        return baseDao.getFieldSetEntity(fse.getTableName(), fse.getUUID(), isMoreSubData);
    }
 
    /**
     * 通用数据保存
     *
     * @param fse
     * @return
     * @throws BaseException
     */
    @Transactional
    @Override
    public String saveFieldSetEntity(FieldSetEntity fse) throws BaseException {
        BaseUtil.createCreatorAndCreationTime(fse);
        baseDao.saveFieldSetEntity(fse);
        return fse.getUUID();
    }
 
    /**
     * 通用数据删除
     * fse 必传表名 && uuid(多个用逗号分割)
     *
     * @param fse
     * @return
     * @throws BaseException
     */
    @Transactional
    @Override
    public boolean delete(FieldSetEntity fse) throws BaseException {
        return baseDao.delete(fse.getTableName(), fse.getUUID().split(","));
    }
 
}