package jnpf.onlinedev.util.onlineDevUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import jnpf.base.ActionResult; import jnpf.base.DataInterFaceApi; import jnpf.base.DictionaryDataApi; import jnpf.base.entity.DictionaryDataEntity; import jnpf.base.entity.ProvinceEntity; import jnpf.base.model.ColumnDataModel; import jnpf.base.model.datainterface.DataInterfaceActionVo; import jnpf.base.service.VisualdevService; import jnpf.model.visualJson.FieLdsModel; import jnpf.onlinedev.model.OnlineDevEnum.MultipleControlEnum; import jnpf.onlinedev.model.OnlineDevEnum.OnlineDataTypeEnum; import jnpf.onlinedev.model.OnlineDevListModel.OnlineDevListDataVO; import jnpf.onlinedev.model.OnlineDevListModel.VisualColumnSearchVO; import jnpf.onlinedev.service.VisualDevInfoService; import jnpf.onlinedev.service.VisualdevModelDataService; import jnpf.permission.OrganizeApi; import jnpf.permission.PositionApi; import jnpf.permission.UserApi; import jnpf.util.*; import jnpf.util.visiual.JnpfKeyConsts; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author JNPF开发平台组 * @version V3.1.0 * @copyright 引迈信息技术有限公司(https://www.jnpfsoft.com) * @date 2021/7/28 */ @Slf4j @Component public class OnlineDevListUtils { @Autowired private RedisUtil redisUtil; @Autowired private DictionaryDataApi dictionaryDataApi; @Autowired private DataInterFaceApi dataInterFaceApi; /** * 查询条件 * * @param list * @param searchList * @return */ public static List> getNoSwapList(List> list, List searchList) { List> resultList = new ArrayList<>(); if (searchList == null) { return list; } for (Map dataVo : list) { int i = 0; for (VisualColumnSearchVO vo : searchList) { Object dataModel = dataVo.get(vo.getVModel()); if (dataModel == null || ObjectUtil.isEmpty(dataModel)) { continue; } //多选框默认添加多选属性 if (vo.getConfig().getJnpfKey().equals(JnpfKeyConsts.CHECKBOX) || JnpfKeyConsts.CASCADER.equals(vo.getConfig().getJnpfKey())) { vo.setMultiple(true); } if (vo.getSearchType().equals("1")) { //多选框筛选 if (vo.getMultiple() != null && vo.getMultiple() == true) { List asList; if (String.valueOf(dataModel).contains("[")) { asList = JsonUtil.getJsonToList(String.valueOf(dataModel), String.class); } else { String[] multipleList = String.valueOf(dataModel).split(","); asList = Arrays.asList(multipleList); } boolean b = asList.stream().anyMatch(t -> vo.getValue().toString().contains(t)); if (b) { i++; } } else { if (String.valueOf(vo.getValue()).equals(String.valueOf(dataModel))) { i++; } } } if (vo.getSearchType().equals("2")) { if (String.valueOf(dataModel).contains(String.valueOf(vo.getValue()))) { i++; } } if (vo.getSearchType().equals("3")) { String key = vo.getConfig().getJnpfKey(); switch (key) { case JnpfKeyConsts.MODIFYTIME: case JnpfKeyConsts.CREATETIME: JSONArray timeStampArray = (JSONArray) vo.getValue(); Long o1 = (Long) timeStampArray.get(0); Long o2 = (Long) timeStampArray.get(1); //时间戳转string格式 String startTime = DateUtil.daFormat(o1); String endTime = DateUtil.daFormat(o2); //处理时间查询条件范围 endTime = endTime.substring(0, 10); String firstTimeDate = OnlineDatabaseUtils.getTimeFormat(startTime); String lastTimeDate = OnlineDatabaseUtils.getLastTimeFormat(endTime); String value = String.valueOf(dataModel); if (value.contains(".")) { value = value.substring(0, value.lastIndexOf(".")); } //只判断到日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { boolean b = DateUtil.isEffectiveDate(sdf.parse(value), sdf.parse(firstTimeDate), sdf.parse(lastTimeDate)); if (b) { i++; } } catch (ParseException e) { e.printStackTrace(); } break; case JnpfKeyConsts.NUM_INPUT: case JnpfKeyConsts.CALCULATE: Float firstValue = null; Float secondValue = null; JSONArray objects = (JSONArray) vo.getValue(); for (int k = 0; k < objects.size(); k++) { Object n = objects.get(k); if (ObjectUtil.isNotEmpty(n)) { if (k == 0) { firstValue = Float.parseFloat(String.valueOf(n)); } else { secondValue = Float.parseFloat(String.valueOf(n)); } } } //数据 Float numValue = Float.parseFloat(String.valueOf(dataModel)); //条件1,2组合的情况 if (firstValue != null && secondValue == null) { if (numValue >= firstValue) { i++; } } if (firstValue != null && secondValue != null) { if (numValue >= firstValue && numValue <= secondValue) { i++; } } if (firstValue == null && secondValue != null) { if (numValue <= secondValue) { i++; } } break; case JnpfKeyConsts.DATE: case JnpfKeyConsts.DATE_CALCULATE: String starTimeDates; String endTimeDates; if (dataModel == null) { break; } //时间戳 if (!String.valueOf(vo.getValue()).contains(":") && !String.valueOf(vo.getValue()).contains("-")) { JSONArray DateTimeStampArray = (JSONArray) vo.getValue(); Long d1 = (Long) DateTimeStampArray.get(0); Long d2 = (Long) DateTimeStampArray.get(1); long d1FirstTime = Long.parseLong(String.valueOf(d1)); long d2LastTime = Long.parseLong(String.valueOf(d2)); //时间戳转string格式 starTimeDates = DateUtil.daFormat(d1FirstTime); endTimeDates = DateUtil.daFormat(d2LastTime); } else { //时间字符串 String[] keyArray = String.valueOf(vo.getValue()).split(","); starTimeDates = keyArray[0]; endTimeDates = keyArray[1]; } if (vo.getFormat() == null) { starTimeDates = starTimeDates.substring(0, 10); endTimeDates = endTimeDates.substring(0, 10); } starTimeDates = OnlineDatabaseUtils.getTimeFormat(starTimeDates); endTimeDates = OnlineDatabaseUtils.getLastTimeFormat(endTimeDates); String dateValue = dataModel.toString(); if (!dateValue.contains(":") && !dateValue.contains("-")) { //时间戳 Long timeResult = (Long) dataModel; dateValue = DateUtil.daFormat(timeResult); } if (dateValue.contains(".")) { dateValue = dateValue.substring(0, dateValue.lastIndexOf(".")); } dateValue = OnlineDatabaseUtils.getTimeFormat(dateValue); //只判断到日期 SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Boolean b = DateUtil.isEffectiveDate(sdfDate.parse(dateValue), sdfDate.parse(starTimeDates), sdfDate.parse(endTimeDates)); if (b) { i++; } } catch (ParseException e) { e.printStackTrace(); } break; case JnpfKeyConsts.TIME: JSONArray timeArray = (JSONArray) vo.getValue(); String start = String.valueOf(timeArray.get(0)); String end = String.valueOf(timeArray.get(1)); start = OnlineDatabaseUtils.getTimeFormat(start); end = OnlineDatabaseUtils.getLastTimeFormat(end); String timeValue = OnlineDatabaseUtils.getTimeFormat(String.valueOf(dataModel)); SimpleDateFormat timeSim = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { boolean b = DateUtil.isEffectiveDate(timeSim.parse(timeValue), timeSim.parse(start), timeSim.parse(end)); if (b) { i++; } } catch (ParseException e) { e.printStackTrace(); } break; default: break; } } if (i == searchList.size()) { resultList.add(dataVo); } } } return resultList; } /** * 取出列表所用到的 用户 组织 岗位的id * * @param list 数据 * @param swapDataVoList 控件 */ public static void pageIdList(List list, List swapDataVoList, Map localCache) { Set userList = (Set) localCache.get("__user_list"); Set orgList = (Set) localCache.get("__org_list"); Set posList = (Set) localCache.get("__pos_list"); Set AllOrgList = (Set) localCache.get("__allOrg_list"); Set roleList = (Set) localCache.get("__role_list"); for (FieLdsModel swapDataVo : swapDataVoList) { String jnpfKey = swapDataVo.getConfig().getJnpfKey(); String vModel = swapDataVo.getVModel(); for (OnlineDevListDataVO listVo : list) { Map dataMap = listVo.getData(); if (StringUtil.isEmpty(String.valueOf(dataMap.get(vModel))) || dataMap.get(vModel) == null) { continue; } if (String.valueOf(dataMap.get(vModel)).equals("[]") || String.valueOf(dataMap.get(vModel)).equals("null")) { continue; } else { switch (jnpfKey) { //公司组件 case JnpfKeyConsts.COMSELECT: //部门组件 case JnpfKeyConsts.DEPSELECT: //所属部门 case JnpfKeyConsts.CURRDEPT: //所属公司 case JnpfKeyConsts.CURRORGANIZE: if ("all".equals(swapDataVo.getShowLevel())) { getIdInMethod(AllOrgList, dataMap.get(vModel)); } else { getIdInMethod(orgList, dataMap.get(vModel)); } break; //角色 case JnpfKeyConsts.ROLESELECT: getIdInMethod(roleList, dataMap.get(vModel)); break; //岗位组件 case JnpfKeyConsts.POSSELECT: //所属岗位 case JnpfKeyConsts.CURRPOSITION: getIdInMethod(posList, dataMap.get(vModel)); break; //用户组件 case JnpfKeyConsts.USERSELECT: //创建用户 case JnpfKeyConsts.CREATEUSER: //修改用户 case JnpfKeyConsts.MODIFYUSER: getIdInMethod(userList, dataMap.get(vModel)); break; default: break; } } } } } /** * 存取对应id集合 * * @param idList * @param modelData * @return */ public static Collection getIdInMethod(Collection idList, Object modelData) { if (OnlinePublicUtils.getMultiple(String.valueOf(modelData), MultipleControlEnum.MULTIPLE_JSON_TWO.getMultipleChar())) { String[][] data = JsonUtil.getJsonToBean(String.valueOf(modelData), String[][].class); for (String[] AddressData : data) { for (String s : AddressData) { idList.add(s); } } } else if (OnlinePublicUtils.getMultiple(String.valueOf(modelData), MultipleControlEnum.MULTIPLE_JSON_ONE.getMultipleChar())) { idList.addAll(JsonUtil.getJsonToList(String.valueOf(modelData), String.class)); } else { String[] modelDatas = String.valueOf(modelData).split(","); for (int i = 0; i < modelDatas.length; i++) { idList.add(modelDatas[i]); } } return idList; } /** * 分组页面 * * @param realList * @param columnDataModel * @return */ public static List> groupData(List> realList, ColumnDataModel columnDataModel) { List> columnList = JsonUtil.getJsonToListMap(columnDataModel.getColumnList()); String firstField; String groupField = columnDataModel.getGroupField(); List> collect = columnList.stream().filter(t -> "left".equals(t.get("fixed")) && !String.valueOf(t.get("prop")).equals(columnDataModel.getGroupField())).collect(Collectors.toList()); Map map = null; if(CollectionUtil.isNotEmpty(collect)){ map = collect.stream().filter(t -> !String.valueOf(t.get("prop")).equals(columnDataModel.getGroupField())).findFirst().orElse(null); }else{ map = columnList.stream().filter(t -> !String.valueOf(t.get("prop")).equals(columnDataModel.getGroupField())).findFirst().orElse(null); } if (map == null) { map = columnList.stream().filter(t -> String.valueOf(t.get("prop")).equals(columnDataModel.getGroupField())).findFirst().orElse(null); } firstField = String.valueOf(map.get("prop")); Map>> twoMap = new LinkedHashMap<>(16); for (Map realMap : realList) { String value = String.valueOf(realMap.get(groupField)); if(realMap.get(groupField) instanceof Double){ value = realMap.get(groupField).toString().replaceAll(".0+?$","").replaceAll("[.]$",""); } boolean isKey = twoMap.get(value) != null; if (isKey) { List> maps = twoMap.get(value); maps.add(realMap); twoMap.put(value, maps); } else { List> childrenList = new ArrayList<>(); childrenList.add(realMap); twoMap.put(value, childrenList); } } List> resultList = new ArrayList<>(); for (String key : twoMap.keySet()) { Map thirdMap = new HashMap<>(16); thirdMap.put(firstField, !key.equals("null") ? key : ""); thirdMap.put("top", true); thirdMap.put("id", RandomUtil.uuId()); thirdMap.put("children", twoMap.get(key)); resultList.add(thirdMap); } return resultList; } /** * 递归查询 * * @param label * @param value * @param Children * @param data * @param options */ public static void getOptions(String label, String value, String Children, JSONArray data, List> options) { for (int i = 0; i < data.size(); i++) { JSONObject ob = data.getJSONObject(i); Map tree = new HashMap<>(16); tree.put(value, String.valueOf(ob.get(value))); tree.put(label, String.valueOf(ob.get(label))); options.add(tree); if (ob.get(Children) != null) { JSONArray childrenArray = ob.getJSONArray(Children); getOptions(label, value, Children, childrenArray, options); } } } /** * 树形列表页面 * * @param realList * @param columnDataModel * @return */ public static List> treeListData(List> realList, ColumnDataModel columnDataModel) { String parentField = columnDataModel.getParentField() + "_id"; String childField = columnDataModel.getSubField(); for (int i = 0; i < realList.size(); i++) { Map item = realList.get(i); if ((item.get(parentField) != null && !StringUtil.isNotEmpty(item.get(parentField).toString())) || (item.get(parentField) != null && !"[]".equals(item.get(parentField).toString()))) { if (addChild(item, realList, parentField, childField) && realList.size() > 0) { realList.remove(item); i--; } } } return realList; } /** * 级联递归 * * @param value * @param label * @param children * @param data * @param result */ private static void treeToList(String value, String label, String children, JSONArray data, List> result) { for (int i = 0; i < data.size(); i++) { JSONObject ob = data.getJSONObject(i); Map tree = new HashMap<>(16); tree.put(value, String.valueOf(ob.get(value))); tree.put(label, String.valueOf(ob.get(label))); result.add(tree); if (ob.get(children) != null) { JSONArray childArray = ob.getJSONArray(children); treeToList(value, label, children, childArray, result); } } } //递归 private static boolean addChild(Map node, List> list, String parentField, String childField) { for (int i = 0; i < list.size(); i++) { Map ele = list.get(i); if (ele.get(childField).equals(node.get(parentField))) { if (ele.get("children") == null) { ele.put("children", new ArrayList<>()); } List> children = (List>) ele.get("children"); children.add(node); ele.put("children", children); return true; } if (ele.get("children") != null) { List> children = (List>) ele.get("children"); if (addChild(node, children, parentField, childField)) { return true; } } } return false; } /** * 保存需要转换的数据到redis(系统控件) * * @param swapDataVoList */ public void sysNeedSwapData(List swapDataVoList, String visualDevId, Map localCache) { //公共数据 String dsName = Optional.ofNullable(TenantHolder.getDatasourceId()).orElse(""); String redisKey; try { for (FieLdsModel swapDataVo : swapDataVoList) { String jnpfKey = swapDataVo.getConfig().getJnpfKey(); String dataType = swapDataVo.getConfig().getDataType(); switch (jnpfKey) { //省市区联动 case JnpfKeyConsts.ADDRESS: redisKey = ""; if (!redisUtil.exists("")) { List provinceEntityList = new ArrayList<>(); Map provinceMap = new HashMap<>(16); provinceEntityList.stream().forEach(p -> provinceMap.put(p.getId(), p.getFullName())); redisUtil.insert(redisKey, provinceMap, RedisUtil.CAHCEWEEK); } if (!localCache.containsKey(redisKey)) { localCache.put(redisKey, redisUtil.getMap(redisKey)); } break; default: break; } if (dataType != null) { //数据接口的数据存放 String label= swapDataVo.getProps().getLabel(); String value= swapDataVo.getProps().getValue(); String children = swapDataVo.getProps().getChildren(); List> options = new ArrayList<>(); Map dataInterfaceMap = new HashMap<>(16); //静态数据 if (dataType.equals(OnlineDataTypeEnum.STATIC.getType())) { redisKey = String.format("%s-%s-%s", visualDevId, swapDataVo.getVModel(), OnlineDataTypeEnum.STATIC.getType()); if (!redisUtil.exists(redisKey)) { if (swapDataVo.getOptions() != null) { options = JsonUtil.getJsonToListMap(swapDataVo.getOptions()); String Children = swapDataVo.getProps().getChildren(); JSONArray data = JsonUtil.getListToJsonArray(options); getOptions(label, value, Children, data, options); } else { options = JsonUtil.getJsonToListMap(swapDataVo.getOptions()); } options.stream().forEach(o -> { dataInterfaceMap.put(String.valueOf(o.get(value)), String.valueOf(o.get(label))); }); String staticData = JsonUtil.getObjectToString(dataInterfaceMap); redisUtil.insert(redisKey, staticData, 60 * 5); if (!localCache.containsKey(redisKey)) { localCache.put(redisKey, dataInterfaceMap); } } else { if (!localCache.containsKey(redisKey)) { String staticDataString = redisUtil.getString(redisKey).toString(); localCache.put(redisKey, JsonUtil.stringToMap(staticDataString)); } } } //远端数据 if (dataType.equals(OnlineDataTypeEnum.DYNAMIC.getType())) { redisKey = String.format("%s-%s-%s", dsName, OnlineDataTypeEnum.DYNAMIC.getType(), swapDataVo.getConfig().getPropsUrl()); String redisKey2 = String.format("%s-%s-%s-%s-%s-%s", dsName, OnlineDataTypeEnum.DYNAMIC.getType(), swapDataVo.getConfig().getPropsUrl(), label, value, children); if (!redisUtil.exists(redisKey2)) { ActionResult data = null; if (!redisUtil.exists(redisKey)) { data = dataInterFaceApi.infoToId(swapDataVo.getConfig().getPropsUrl()); //缓存接口全部数据 redisUtil.insert(redisKey, JSONObject.toJSONString(data), 60 * 5); } else { data = JSONObject.parseObject(String.valueOf(redisUtil.getString(redisKey)), ActionResult.class); } if (!localCache.containsKey(redisKey)) { localCache.put(redisKey, data); } if (data != null && data.getData() != null) { List> dataList = new ArrayList<>(); if (data.getData() instanceof DataInterfaceActionVo) { DataInterfaceActionVo actionVo = (DataInterfaceActionVo) data.getData(); if (actionVo.getData() instanceof List) { dataList = (List>) actionVo.getData(); } } else if (data.getData() instanceof List) { dataList = (List>) data.getData(); } JSONArray dataAll = JsonUtil.getListToJsonArray(dataList); treeToList(label, value, children, dataAll, options); options.stream().forEach(o -> { dataInterfaceMap.put(String.valueOf(o.get(value)), String.valueOf(o.get(label))); }); //缓存接口根据特定字段转换后的全部数据 String dynamicData = JsonUtil.getObjectToString(dataInterfaceMap); redisUtil.insert(redisKey2, dynamicData, 60 * 5); localCache.put(redisKey2, dataInterfaceMap); } } else { if (!localCache.containsKey(redisKey)) { localCache.put(redisKey, JSONObject.parseObject(String.valueOf(redisUtil.getString(redisKey)), ActionResult.class)); } if (!localCache.containsKey(redisKey2)) { //转成map格式 String dynamicString = redisUtil.getString(redisKey2).toString(); localCache.put(redisKey2, JsonUtil.stringToMap(dynamicString)); } } } //数据字典 if (dataType.equals(OnlineDataTypeEnum.DICTIONARY.getType())) { redisKey = String.format("%s-%s-%s", dsName, OnlineDataTypeEnum.DICTIONARY.getType(), swapDataVo.getConfig().getDictionaryType()); if (!redisUtil.exists(redisKey)) { List list = dictionaryDataApi.getDicList(swapDataVo.getConfig().getDictionaryType()); options = list.stream().map(dic -> { Map dictionaryMap = new HashMap<>(16); dictionaryMap.put("id", dic.getId()); dictionaryMap.put("enCode", dic.getEnCode()); dictionaryMap.put("fullName", dic.getFullName()); return dictionaryMap; }).collect(Collectors.toList()); String dictionaryData = JsonUtil.getObjectToString(options); redisUtil.insert(redisKey, dictionaryData, 60 * 5); localCache.put(redisKey, options); } else { if (!localCache.containsKey(redisKey)) { String dictionaryStringData = redisUtil.getString(redisKey).toString(); localCache.put(redisKey, JsonUtil.getJsonToListMap(dictionaryStringData)); } } } } } } catch (Exception e) { log.error("在线开发转换数据异常:" + e.getMessage()); e.printStackTrace(); } } }