DataSetSwapUtil.java 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452
  1. package jnpf.base.util.dataSet;
  2. import cn.hutool.core.date.LocalDateTimeUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import jnpf.base.entity.ProvinceEntity;
  5. import jnpf.base.model.dataset.DataSetConfig;
  6. import jnpf.base.model.dataset.DataSetSwapModel;
  7. import jnpf.base.service.ProvinceService;
  8. import jnpf.util.*;
  9. import jnpf.util.visiual.DataTypeConst;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.apache.commons.collections4.CollectionUtils;
  12. import org.apache.commons.collections4.MapUtils;
  13. import org.springframework.beans.factory.annotation.Autowired;
  14. import org.springframework.stereotype.Component;
  15. import java.math.BigDecimal;
  16. import java.sql.Timestamp;
  17. import java.text.DecimalFormat;
  18. import java.time.LocalDateTime;
  19. import java.util.*;
  20. import java.util.concurrent.ConcurrentHashMap;
  21. import java.util.stream.Collectors;
  22. /**
  23. * 数据集转换工具
  24. *
  25. * @author JNPF开发平台组
  26. * @version v5.0.0
  27. * @copyright 引迈信息技术有限公司
  28. * @date 2024/7/15 11:08:03
  29. */
  30. @Slf4j
  31. @Component
  32. public class DataSetSwapUtil {
  33. @Autowired
  34. private DataSetExecutor dataSetExecutor;
  35. @Autowired
  36. private ProvinceService provinceService;
  37. //缓存系统权限数据, 组织、部门、岗位、分组、角色、用户
  38. public final static boolean NEEDCACHE_SYS = true;
  39. /**
  40. * 数据转换
  41. *
  42. * @param printId
  43. * @param convertConfig
  44. * @param map
  45. */
  46. public void swapData(String printId, String convertConfig, Map<String, Object> map) {
  47. List<DataSetSwapModel> modelList = JsonUtil.getJsonToList(convertConfig, DataSetSwapModel.class);
  48. modelList = CollectionUtils.isEmpty(modelList) ? new ArrayList<>() : modelList;
  49. Map<String, Object> localCache = new ConcurrentHashMap<>();
  50. //初始化缓存
  51. dataSetExecutor.executorRedis(localCache, printId, modelList, map);
  52. swapData(localCache, printId, modelList, map);
  53. }
  54. private void swapData(Map<String, Object> localCache, String printId, List<DataSetSwapModel> swapList, Map<String, Object> map) {
  55. Map<String, Object> orgMap = (Map<String, Object>) localCache.get(CacheKeyUtil.SYS_ORG_Tree);
  56. Map<String, Object> depMap = (Map<String, Object>) localCache.get(CacheKeyUtil.SYS_DEP);
  57. Map<String, Object> posMap = (Map<String, Object>) localCache.get(CacheKeyUtil.SYS_POS);
  58. Map<String, Object> userMap = (Map<String, Object>) localCache.get(CacheKeyUtil.SYS_USER);
  59. Map<String, Object> roleMap = (Map<String, Object>) localCache.get(CacheKeyUtil.SYS_ROLE);
  60. Map<String, Object> groupMap = (Map<String, Object>) localCache.get(CacheKeyUtil.SYS_GROUP);
  61. String tenantId = Optional.ofNullable(TenantHolder.getDatasourceId()).orElse("");
  62. if (MapUtils.isNotEmpty(map)) {
  63. for (String key : map.keySet()) {
  64. if (Objects.isNull(map.get(key))) continue;
  65. List<Map<String, Object>> list = (List<Map<String, Object>>) map.get(key);
  66. DataClob.swapClob(list);
  67. for (Map<String, Object> item : list) {
  68. for (DataSetSwapModel model : swapList) {
  69. String field = model.getField();
  70. String type = model.getType();
  71. if(StringUtil.isEmpty(field) || StringUtil.isEmpty(type)) continue;
  72. DataSetConfig config = model.getConfig();
  73. String[] fields = field.split("\\.");
  74. if (fields.length != 2) continue;
  75. String dataSetName = fields[0];
  76. String filedKey = fields[1];
  77. Object value = item.get(filedKey);
  78. if (!key.equals(dataSetName) || value == null || "".equals(value.toString().trim())) continue;
  79. String resultStr = "";
  80. String redisKey;
  81. switch (type) {
  82. case DataSetConstant.KEY_ORG:
  83. item.put(filedKey, getListDataSwap(orgMap, value, true));
  84. break;
  85. case DataSetConstant.KEY_DEP:
  86. item.put(filedKey, getListDataSwap(depMap, value, false));
  87. break;
  88. case DataSetConstant.KEY_POS:
  89. item.put(filedKey, getListDataSwap(posMap, value, false));
  90. break;
  91. case DataSetConstant.KEY_USER:
  92. item.put(filedKey, getListDataSwap(userMap, value, false));
  93. break;
  94. case DataSetConstant.KEY_ROLE:
  95. item.put(filedKey, getListDataSwap(roleMap, value, false));
  96. break;
  97. case DataSetConstant.KEY_GROUP:
  98. item.put(filedKey, getListDataSwap(groupMap, value, false));
  99. break;
  100. case DataSetConstant.KEY_DATE:
  101. item.put(filedKey, getDateOrTime(value,config,false));
  102. break;
  103. case DataSetConstant.KEY_TIME:
  104. item.put(filedKey, getDateOrTime(value,config,true));
  105. break;
  106. case DataSetConstant.KEY_SELECT:
  107. if (DataTypeConst.STATIC.equals(config.getDataType())) {
  108. redisKey = String.format("%s-%s-%s", printId, field, DataTypeConst.STATIC);
  109. if (localCache.containsKey(redisKey)) {
  110. Map<String, Object> selectMap = (Map<String, Object>) localCache.get(redisKey);
  111. resultStr = getListDataSwap(selectMap, value, false);
  112. item.put(filedKey, resultStr);
  113. }
  114. }
  115. if (DataTypeConst.DICTIONARY.equals(config.getDataType())) {
  116. redisKey = String.format("%s-%s-%s", tenantId, DataTypeConst.DICTIONARY, model.getConfig().getDictionaryType());
  117. if (localCache.containsKey(redisKey)) {
  118. List<Map<String, Object>> options = (List<Map<String, Object>>) localCache.get(redisKey);
  119. String propsValue = config.getPropsValue();
  120. Map<String, Object> selectMap = new HashMap<>();
  121. options.stream().forEach(o -> selectMap.put(String.valueOf(o.get(propsValue)), o.get("fullName")));
  122. resultStr = getListDataSwap(selectMap, value, false);
  123. item.put(filedKey, resultStr);
  124. }
  125. }
  126. if (DataTypeConst.DYNAMIC.equals(config.getDataType())) {
  127. redisKey = String.format("%s-%s-%s", tenantId, DataTypeConst.DYNAMIC, model.getConfig().getPropsUrl());
  128. if (localCache.containsKey(redisKey)) {
  129. List<Map<String, Object>> options = (List<Map<String, Object>>) localCache.get(redisKey);
  130. String propsValue = config.getPropsValue();
  131. String propsLabel = config.getPropsLabel();
  132. Map<String, Object> selectMap = new HashMap<>();
  133. options.stream().forEach(o -> selectMap.put(String.valueOf(o.get(propsValue)), o.get(propsLabel)));
  134. resultStr = getListDataSwap(selectMap, value, false);
  135. item.put(filedKey, resultStr);
  136. }
  137. }
  138. break;
  139. case DataSetConstant.KEY_NUMBER:
  140. item.put(filedKey,getNumber(value,config));
  141. break;
  142. case DataSetConstant.KEY_ADDRESS:
  143. item.put(filedKey, getAddressStr(value));
  144. break;
  145. case DataSetConstant.KEY_USERS:
  146. try {
  147. List<String> dataNoSwapInMethod = getDataNoSwapInMethod(value);
  148. StringJoiner valueJoin = new StringJoiner(",");
  149. for (String data : dataNoSwapInMethod) {
  150. String id = data.contains("--") ? data.substring(0, data.lastIndexOf("--")) : data;
  151. String selecttype = data.contains("--") ? data.substring(data.lastIndexOf("--") + 2) : "";
  152. Map<String, Object> cacheMap;
  153. switch (selecttype) {
  154. case "role":
  155. cacheMap = roleMap;
  156. break;
  157. case "position":
  158. cacheMap = posMap;
  159. break;
  160. case "company":
  161. case "department":
  162. cacheMap = depMap;
  163. break;
  164. case "group":
  165. cacheMap = groupMap;
  166. break;
  167. case "user":
  168. default:
  169. cacheMap = userMap;
  170. break;
  171. }
  172. valueJoin.add(Optional.ofNullable(cacheMap.get(id)).orElse("").toString());
  173. }
  174. item.put(filedKey, valueJoin.toString());
  175. } catch (Exception e) {
  176. }
  177. break;
  178. case DataSetConstant.KEY_LOCATION:
  179. try {
  180. Map omap = JsonUtil.stringToMap(String.valueOf(value));
  181. resultStr = omap.get("fullAddress") != null ? omap.get("fullAddress").toString() : "";
  182. item.put(filedKey, resultStr);
  183. } catch (Exception e) {
  184. }
  185. break;
  186. default:
  187. break;
  188. }
  189. }
  190. }
  191. }
  192. }
  193. }
  194. /**
  195. * 多级控件转换
  196. *
  197. * @param redis
  198. * @param value
  199. * @param isOrg 是否组织
  200. * @return
  201. */
  202. public static String getListDataSwap(Map<String, Object> redis, Object value, Boolean isOrg) {
  203. if (MapUtils.isEmpty(redis)) {
  204. return String.valueOf(value);
  205. }
  206. Object dataValue;
  207. try {
  208. List<List> list = JsonUtil.getJsonToList(String.valueOf(value), List.class);
  209. StringJoiner joiner = new StringJoiner(",");
  210. for (List listChild : list) {
  211. if (isOrg) {
  212. String join = StringUtil.join(listChild, ",");
  213. String value1 = redis.get(String.valueOf(join)) != null ? String.valueOf(redis.get(String.valueOf(join))) : "";
  214. joiner.add(value1);
  215. } else {
  216. StringJoiner aa = new StringJoiner("/");
  217. for (Object object : listChild) {
  218. String value1 = redis.get(String.valueOf(object)) != null ? String.valueOf(redis.get(String.valueOf(object))) : "";
  219. if (StringUtil.isNotEmpty(value1)) {
  220. aa.add(value1);
  221. }
  222. }
  223. joiner.add(aa.toString());
  224. }
  225. }
  226. dataValue = joiner.toString();
  227. } catch (Exception e) {
  228. try {
  229. List<String> list = JsonUtil.getJsonToList(String.valueOf(value), String.class);
  230. String separator = ",";
  231. StringJoiner joiner = new StringJoiner(separator);
  232. if (isOrg) {
  233. if (CollectionUtils.isNotEmpty(list)) {
  234. for (String string : list) {
  235. String value1 = redis.get(String.valueOf(string)) != null ? String.valueOf(redis.get(String.valueOf(string))) : "";
  236. joiner.add(value1);
  237. }
  238. }
  239. } else {
  240. for (Object listChild : list) {
  241. String value1 = redis.get(String.valueOf(listChild)) != null ? String.valueOf(redis.get(String.valueOf(listChild))) : "";
  242. if (StringUtil.isNotEmpty(value1)) {
  243. joiner.add(value1);
  244. }
  245. }
  246. }
  247. dataValue = joiner.toString();
  248. } catch (Exception e1) {
  249. dataValue = redis.get(String.valueOf(value)) != null ? String.valueOf(redis.get(String.valueOf(value))) : "";
  250. if (isOrg && StringUtil.isEmpty(dataValue.toString())) {
  251. for (String k : redis.keySet()) {
  252. if (k.endsWith(String.valueOf(value))) {
  253. dataValue = String.valueOf(redis.get(k));
  254. }
  255. }
  256. }
  257. }
  258. }
  259. return StringUtil.isNotEmpty(dataValue.toString()) ? dataValue.toString() : value.toString();
  260. }
  261. /**
  262. * 日期和时间控件转换
  263. *
  264. * @param value
  265. * @return
  266. */
  267. public static String getDateOrTime(Object value, DataSetConfig config, Boolean isTime) {
  268. List<Object> list = new ArrayList<>();
  269. if (value instanceof List) {
  270. list.addAll((List<Object>) value);
  271. } else {
  272. list.add(value);
  273. }
  274. StringJoiner joiner = new StringJoiner("~");
  275. for (Object object : list) {
  276. if (isTime) {
  277. joiner.add(object + "");
  278. } else {
  279. Long time = getDateObjToLong(object);
  280. joiner.add(DateUtil.dateToString(new Date(time), config.getFormat()));
  281. }
  282. }
  283. return joiner.toString();
  284. }
  285. /**
  286. * 日期和时间控件转换
  287. *
  288. * @param value
  289. * @return
  290. */
  291. public static String getNumber(Object value, DataSetConfig config) {
  292. List<Object> list = new ArrayList<>();
  293. if (value instanceof List) {
  294. list.addAll((List<Object>) value);
  295. } else {
  296. list.add(value);
  297. }
  298. StringJoiner joiner = new StringJoiner("~");
  299. for (Object object : list) {
  300. String resultStr = "";
  301. try {
  302. BigDecimal bd = new BigDecimal(String.valueOf(object));
  303. resultStr = bd.toPlainString();
  304. Integer precision = config.getPrecision();
  305. if (precision == 0 && resultStr.contains(".")) {
  306. resultStr = resultStr.split("\\.")[0];
  307. } else if (precision > 0) {
  308. String formatZ = "000000000000000";
  309. String format = formatZ.substring(0, precision);
  310. DecimalFormat decimalFormat = new DecimalFormat("0." + format);
  311. resultStr = decimalFormat.format(bd);
  312. }
  313. if (config.isThousands()) {
  314. resultStr = thousandsFormat(resultStr);
  315. }
  316. joiner.add(resultStr);
  317. } catch (Exception e) {
  318. log.error(e.getMessage());
  319. }
  320. }
  321. return joiner.toString();
  322. }
  323. /**
  324. * 时间转换兼容
  325. *
  326. * @param dateObj
  327. * @return
  328. */
  329. public static Long getDateObjToLong(Object dateObj) {
  330. LocalDateTime dateTime = null;
  331. if (ObjectUtil.isNotEmpty(dateObj)) {
  332. if (dateObj instanceof LocalDateTime) {
  333. dateTime = (LocalDateTime) dateObj;
  334. } else if (dateObj instanceof Timestamp) {
  335. dateTime = ((Timestamp) dateObj).toLocalDateTime();
  336. } else if (dateObj instanceof Long) {
  337. dateTime = LocalDateTimeUtil.of(new Date(Long.parseLong(dateObj.toString())));
  338. } else {
  339. dateTime = LocalDateTimeUtil.of(cn.hutool.core.date.DateUtil.parse(dateObj.toString()));
  340. }
  341. }
  342. return dateTime != null ? DateUtil.localDateTime2Millis(dateTime) : null;
  343. }
  344. /**
  345. * 获取地址名称
  346. *
  347. * @param value
  348. * @return
  349. */
  350. private String getAddressStr(Object value) {
  351. String addressStr = String.valueOf(value);
  352. try {
  353. List<List> list = JsonUtil.getJsonToList(String.valueOf(value), List.class);
  354. StringJoiner joiner1 = new StringJoiner(",");
  355. List<String> proDataS = new ArrayList<>();
  356. list.forEach(proDataS::addAll);
  357. Map<String, String> provinceNames = provinceService.getProList(proDataS).stream().collect(Collectors.toMap(ProvinceEntity::getId, ProvinceEntity::getFullName
  358. , (k1, k2) -> k2
  359. , () -> new LinkedHashMap<>(proDataS.size(), 1.0F)));
  360. for (List<String> addressList : list) {
  361. StringJoiner joiner2 = new StringJoiner("/");
  362. for (String addressId : addressList) {
  363. String name = provinceNames.getOrDefault(addressId, "");
  364. joiner2.add(name);
  365. }
  366. joiner1.add(joiner2.toString());
  367. }
  368. addressStr = joiner1.toString();
  369. } catch (Exception e) {
  370. try {
  371. List<String> addressList = JsonUtil.getJsonToList(String.valueOf(value), String.class);
  372. Map<String, String> provinceNames = provinceService.getProList(addressList).stream().collect(Collectors.toMap(ProvinceEntity::getId, ProvinceEntity::getFullName
  373. , (k1, k2) -> k2
  374. , () -> new LinkedHashMap<>(addressList.size(), 1.0F)));
  375. StringJoiner joiner2 = new StringJoiner("/");
  376. for (String addressId : addressList) {
  377. String name = provinceNames.getOrDefault(addressId, "");
  378. joiner2.add(name);
  379. }
  380. addressStr = joiner2.toString();
  381. } catch (Exception e1) {
  382. List<String> addressList = new ArrayList<>();
  383. addressList.add(String.valueOf(value));
  384. Map<String, String> provinceNames = provinceService.getProList(addressList).stream().collect(Collectors.toMap(ProvinceEntity::getId, ProvinceEntity::getFullName
  385. , (k1, k2) -> k2
  386. , () -> new LinkedHashMap<>(addressList.size(), 1.0F)));
  387. if (MapUtils.isNotEmpty(provinceNames)) {
  388. addressStr = provinceNames.get(String.valueOf(value));
  389. }
  390. }
  391. }
  392. return addressStr;
  393. }
  394. /**
  395. * 千位符展示
  396. *
  397. * @param str
  398. * @return
  399. */
  400. public static String thousandsFormat(String str) {
  401. String regex = "(\\d)(?=(\\d{3})+$)";
  402. String replacement = "$1,";
  403. if (str.contains(".")) {
  404. String[] arr = str.split("\\.");
  405. arr[0] = arr[0].replaceAll(regex, replacement);
  406. return String.join(".", arr);
  407. }
  408. return str.replaceAll(regex, replacement);
  409. }
  410. /**
  411. * 用户组件-获取数据
  412. *
  413. * @param modelData
  414. * @return
  415. */
  416. public static List<String> getDataNoSwapInMethod(Object modelData) {
  417. List<String> dataValueList = new ArrayList<>();
  418. if (String.valueOf(modelData).startsWith("[")) {
  419. dataValueList = JsonUtil.getJsonToList(String.valueOf(modelData), String.class);
  420. } else {
  421. String[] modelDatas = String.valueOf(modelData).split(",");
  422. dataValueList.addAll(Arrays.asList(modelDatas));
  423. }
  424. return dataValueList;
  425. }
  426. }