package com.moral.service.impl; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import javax.annotation.Resource; import javax.validation.constraints.NotNull; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageHelper; import com.moral.common.bean.Constants; import com.moral.common.bean.PageBean; import com.moral.common.util.ExampleUtil; import com.moral.common.util.ParameterUtils; import com.moral.common.util.RedisUtils; import com.moral.common.util.StringUtils; import com.moral.common.util.ValidateUtil; import com.moral.entity.Device; import com.moral.entity.DeviceProperty; import com.moral.entity.MonitorPoint; import com.moral.mapper.DeviceMapper; import com.moral.mapper.DevicePropertyMapper; import com.moral.mapper.DictionaryDataMapper; import com.moral.mapper.MonitorPointMapper; import com.moral.mapper.OrganizationMapper; import com.moral.service.DeviceService; import com.moral.service.HistoryHourlyService; import com.moral.service.MonitorPointService; import com.moral.service.OrganizationService; import com.moral.util.MyLatLng; import com.moral.util.mapUtils; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import tk.mybatis.mapper.entity.Example; import tk.mybatis.mapper.entity.Example.Criteria; @Service public class MonitorPointServiceImpl implements MonitorPointService { @Resource private MonitorPointMapper monitorPointMapper; @Resource private DeviceMapper deviceMapper; @Resource private OrganizationMapper orgMapper; @Resource RedisUtils redisUtils; @Resource DictionaryDataMapper dictionaryDataMapper; @Resource private DeviceService deviceService; @Resource private OrganizationService organizationService; @Resource private HistoryHourlyService historyHourlyService; @Resource DevicePropertyMapper devicePropertyMapper; private static Class ENTITY_CLASS = MonitorPoint.class; @Override public List getMonitorPointsByAreaName(Map parameters) { ValidateUtil.notNull(parameters.get("areaName"), "param.is.null"); return monitorPointMapper.getMonitorPointsByAreaName(parameters); } @Override public List queryWithStateByMap(Map params) { params.put("isDelete", Constants.IS_DELETE_FALSE); Object orgIdObj = params.get("orgId"); List monitorPointList = null; if (orgIdObj != null) { Integer orgId = Integer.parseInt(orgIdObj.toString()); List orgIds = orgMapper.selectLowerOrgIds(orgId); params.put("orgIds", orgIds); monitorPointList = monitorPointMapper.selectByMap(params); // for(MonitorPoint monitorPoint:monitorPointList){ // Integer state = getStateFromRedis(monitorPoint.getId()); // monitorPoint.setState(state); // } } return monitorPointList == null ? new ArrayList<>() : monitorPointList; } private Integer getStateFromRedis(Integer monitorPointId) { StringBuilder key = new StringBuilder(); key.append("state_").append(monitorPointId).append("_*"); List stateList = redisUtils.getList(key.toString(), Map.class); int state = -1; if (stateList != null) { for (Map deviceState : stateList) { int s = Integer.parseInt(deviceState.get("state").toString()); state = s > state && s < 4 ? s : state; } } state = state == -1 ? 4 : state; return state; } @Override public PageBean queryByPageBean(PageBean pageBean) { Example example = ExampleUtil.generateExample(ENTITY_CLASS, pageBean); List criteriaList = example.getOredCriteria(); PageHelper.startPage(pageBean.getPageIndex(), pageBean.getPageSize()); List monitorPointList = monitorPointMapper.selectWithAreaNameByExample(example); return new PageBean(monitorPointList); } @Override public MonitorPoint queryWithRelationById(Integer id) { Example example = new Example(ENTITY_CLASS); example.or().andEqualTo("id", id); List monitorPointList = monitorPointMapper.selectWithAreaNameByExample(example); return monitorPointList != null && monitorPointList.size() > 0 ? monitorPointList.get(0) : null; } @Override public void addOrModify(MonitorPoint monitorPoint) { try { if (monitorPoint.getId() == null) { monitorPoint.setIsDelete(Constants.IS_DELETE_FALSE); monitorPointMapper.insertSelective(monitorPoint); } else { MonitorPoint queryMonitorPoint = new MonitorPoint(); queryMonitorPoint.setId(monitorPoint.getId()); queryMonitorPoint.setOrganizationId(monitorPoint.getOrganizationId()); // num = 1,说明未改变,此查询在更新之前 Integer num = monitorPointMapper.selectCount(queryMonitorPoint); boolean needRefreshCach = (num != 1); monitorPointMapper.updateByPrimaryKeySelective(monitorPoint); if (needRefreshCach) { // 刷新当前监控点下设备 在redis里设备信息 refreshDevicesInRedis(monitorPoint.getId()); } } } catch (Exception ex) { throw ex; } } /* 刷新当前监控点下设备 在redis里设备信息 */ private void refreshDevicesInRedis(int monitorPointId) { Device queryDevice = new Device(); queryDevice.setMonitorPointId(monitorPointId); List deviceList = deviceMapper.select(queryDevice); if (!CollectionUtils.isEmpty(deviceList)) { List orgIds = monitorPointMapper.selectOrganizationIds(monitorPointId); if (!CollectionUtils.isEmpty(orgIds)) { deviceList.stream().forEach(dev -> { if (!StringUtils.isNullOrEmpty(dev.getMac())) { String key = "device_" + dev.getMac(); // // 简化的设备信息 用以缓存redis // Device simpleDevice = new Device(); // simpleDevice.setId(dev.getId()); // simpleDevice.setDeviceVersion(dev.getDeviceVersion()); // simpleDevice.setMac(dev.getMac()); // simpleDevice.setMonitorPointId(dev.getMonitorPointId()); // 设置新组织关系,防止读写分离时数据库同步延迟 dev.setOrganizationIds(orgIds); redisUtils.set(key, dev); } }); } } } @Override public void deleteByIds(Integer... ids) { MonitorPoint monitorPoint = new MonitorPoint(); monitorPoint.setIsDelete(Constants.IS_DELETE_TRUE); if (ids != null && ids.length > 0) { if (ids.length == 1) { monitorPoint.setId(ids[0]); monitorPointMapper.updateByPrimaryKeySelective(monitorPoint); } else { Example example = new Example(ENTITY_CLASS); example.or().andIn("id", Arrays.asList(ids)); monitorPointMapper.updateByExampleSelective(monitorPoint, example); } } } @Override public List getMonitorPointsByName(String name) { Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE).andLike("name", "%" + name + "%"); example.or().andEqualTo("isDelete", Constants.IS_DELETE_FALSE) .andCondition("getPY(" + getReplaceStr("name") + ") like ", "%" + name + "%"); List monitorPoints = monitorPointMapper.selectByExample(example); return monitorPoints; } private String getReplaceStr(String name) { List list = new ArrayList(); list.add(new String[]{"(", ""}); list.add(new String[]{")", ""}); for (String[] string : list) { name = replace(name, string[0], string[1]); } return name; } private String replace(String name, String fromStr, String toStr) { return "REPLACE (" + name + ",'" + fromStr + "','" + toStr + "')"; } /** * @param idList * @return {id:,state:} */ @Override public List> queryMonitroPointsState(List idList) { List> list = idList.stream().map(id -> { Integer state = getStateFromRedis(id); Map stateMap = new HashMap<>(); stateMap.put("id", id.toString()); stateMap.put("state", state.toString()); return stateMap; }).collect(Collectors.toList()); return list; } /** * 获取所属组织的监控点总数 * * @param orgId * @return */ @Override public Integer countOfSubOrgs(@NotNull Integer orgId) { Example example = new Example(ENTITY_CLASS); //过滤超级管理员账号 if (!dictionaryDataMapper.isSupperOrgId(orgId)) { List orgIds = orgMapper.selectLowerOrgIds(orgId); example.or().andIn("organizationId", orgIds); } return monitorPointMapper.selectCountByExample(example); } @Override public List getMonitorPointsByOrganizationId(Integer orgId) { Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE); if (Constants.isNotSpecialOrgId(orgId)) { //criteria.andEqualTo("organizationId", orgId); Set organizationIds = organizationService.getChildOrganizationIds(orgId); criteria.andIn("organizationId", organizationIds); } example.orderBy("name").asc(); return monitorPointMapper.selectByExample(example); } @Override public List getMonitorPointsByOrganizationIds(Set orgIds) { return monitorPointMapper.getMonitorPointsByOrganizationIds(orgIds); } @Override public List getMonitorPointsByRegion(Map parameters) { Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE); criteria.andEqualTo(parameters.get("name").toString(), parameters.get("value")); return monitorPointMapper.selectByExample(example); } @Override public List queryVersionsById(Integer id) { return monitorPointMapper.selectVersionsById(id); } @Override public MonitorPoint queryMonitorPointById(Integer mpointId) { return this.monitorPointMapper.selectByPrimaryKey(mpointId); } /** * @Description: 如果站点中没有设备则不会返回站点 * @Param: [parameters] * @return: java.util.List * @Author: 下雨听风 * @Date: 2020/12/2 */ @Override public List getMonitorPointsAndDevicesByRegion(Map parameters) { //校验参数 Object organizationId = parameters.remove("organizationId"); //判断参数是否为null,如果为null则抛出自定义异常,msgKey为异常信息 ValidateUtil.notNull(organizationId, "param.is.null"); ValidateUtil.notNull(parameters.get("regionCode"), "param.is.null"); //组装查询条件 ParameterUtils.getRegionType4RegionCode(parameters); //查询对应code的站点数据 Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE); //判断是否为本公司开发人员,如果不是则添加orgid限制用户查看权限 if (Constants.isNotSpecialOrgId(Integer.valueOf(organizationId.toString()))) { Set organizationIds = organizationService.getChildOrganizationIds(Integer.valueOf(organizationId.toString())); criteria.andIn("organizationId", organizationIds); } criteria.andEqualTo(parameters.get("regionType") + "Code", parameters.remove("regionCode")); List monitorPoints = monitorPointMapper.selectByExample(example); //查询所有设备信息 Example deviceExample = new Example(Device.class); Criteria deviceCriteria = deviceExample.createCriteria(); deviceCriteria.orEqualTo("isDelete", Constants.IS_DELETE_FALSE); List devicesInfo = deviceMapper.selectByExample(deviceExample); //获取所有站点信息 Example monitorExample = new Example(MonitorPoint.class); Criteria monitorCriteria = monitorExample.createCriteria(); monitorCriteria.orEqualTo("isDelete", Constants.IS_DELETE_FALSE); List monitorPointInfo = monitorPointMapper.selectByExample(monitorExample); //获取所有设备附加属性 List devicePropertyList = devicePropertyMapper.selectAll(); //附加属性全部添加到设备实体中 for (Device d : devicesInfo) { for (DeviceProperty dp : devicePropertyList) { if (dp.getId().equals(d.getId())) { d.setDeviceProperty(dp); } } } //把对应的设备信息添加到站点中 Map> monitorDeviceMap = new HashMap(); for (MonitorPoint m : monitorPointInfo) { List monitorDevices = new ArrayList<>(); for (Device d : devicesInfo) { if (m.getId().equals(d.getMonitorPointId())) { monitorDevices.add(d); } } monitorDeviceMap.put(m.getId(), monitorDevices); } //对应地区Code的迭代器,向站点中添加设备信息 Iterator iterator = monitorPoints.iterator(); while (iterator.hasNext()) { MonitorPoint monitorPoint = iterator.next(); for (Map.Entry> entry : monitorDeviceMap.entrySet()) { if (monitorPoint.getId().equals(entry.getKey())) { if (!CollectionUtils.isEmpty(entry.getValue())) { monitorPoint.setDevices(entry.getValue()); } else { iterator.remove(); } } } } return monitorPoints; } /** * @Description: 如果站点中没有设备也会返回站点 * @Param: [parameters] * @return: java.util.List * @Author: 下雨听风 * @Date: 2020/12/2 */ @Override public List getMonitorPointsAndDevicesByRegionNew(Map parameters) { //校验参数 Object organizationId = parameters.remove("organizationId"); //判断参数是否为null,如果为null则抛出自定义异常,msgKey为异常信息 ValidateUtil.notNull(organizationId, "param.is.null"); ValidateUtil.notNull(parameters.get("regionCode"), "param.is.null"); //组装查询条件 ParameterUtils.getRegionType4RegionCode(parameters); //查询对应code的站点数据 Example example = new Example(MonitorPoint.class); Criteria criteria = example.createCriteria(); criteria.andEqualTo("isDelete", Constants.IS_DELETE_FALSE); //判断是否为本公司开发人员,如果不是则添加orgid限制用户查看权限 if (Constants.isNotSpecialOrgId(Integer.valueOf(organizationId.toString()))) { Set organizationIds = organizationService.getChildOrganizationIds(Integer.valueOf(organizationId.toString())); criteria.andIn("organizationId", organizationIds); } criteria.andEqualTo(parameters.get("regionType") + "Code", parameters.remove("regionCode")); List monitorPoints = monitorPointMapper.selectByExample(example); //查询所有设备信息 Example deviceExample = new Example(Device.class); Criteria deviceCriteria = deviceExample.createCriteria(); deviceCriteria.orEqualTo("isDelete", Constants.IS_DELETE_FALSE); List devicesInfo = deviceMapper.selectByExample(deviceExample); //获取所有站点信息 Example monitorExample = new Example(MonitorPoint.class); Criteria monitorCriteria = monitorExample.createCriteria(); monitorCriteria.orEqualTo("isDelete", Constants.IS_DELETE_FALSE); List monitorPointInfo = monitorPointMapper.selectByExample(monitorExample); //获取所有设备附加属性 List devicePropertyList = devicePropertyMapper.selectAll(); //附加属性全部添加到设备实体中 for (Device d : devicesInfo) { for (DeviceProperty dp : devicePropertyList) { if (dp.getId().equals(d.getId())) { d.setDeviceProperty(dp); } } } //把对应的设备信息添加到站点中 Map> monitorDeviceMap = new HashMap(); for (MonitorPoint m : monitorPointInfo) { List monitorDevices = new ArrayList<>(); for (Device d : devicesInfo) { if (m.getId().equals(d.getMonitorPointId())) { monitorDevices.add(d); } } monitorDeviceMap.put(m.getId(), monitorDevices); } //对应地区Code的迭代器,向站点中添加设备信息 Iterator iterator = monitorPoints.iterator(); while (iterator.hasNext()) { MonitorPoint monitorPoint = iterator.next(); for (Map.Entry> entry : monitorDeviceMap.entrySet()) { if (monitorPoint.getId().equals(entry.getKey())) { if (!CollectionUtils.isEmpty(entry.getValue())) { monitorPoint.setDevices(entry.getValue()); } } } } return monitorPoints; } @SuppressWarnings("unchecked") @Override public Collection getDevicesStateByRegion(Map parameters) { //校验参数 Object organizationId = parameters.remove("organizationId"); ValidateUtil.notNull(organizationId, "param.is.null"); ValidateUtil.notNull(parameters.get("regionCode"), "param.is.null"); //组装查询条件 ParameterUtils.getRegionType4RegionCode(parameters); if (Constants.isNotSpecialOrgId(Integer.valueOf(organizationId.toString()))) { Set organizationIds = organizationService.getChildOrganizationIds(Integer.valueOf(organizationId.toString())); parameters.put("orgIds", organizationIds); } List> monitorPoints = deviceMapper.getDevicesStateByRegion(parameters); Map result = new HashMap(); Map device; List> devices; for (Map map : monitorPoints) { String id = map.get("id").toString(); device = new HashMap(); device.put("id", map.remove("deviceId")); device.put("name", map.remove("deviceName")); device.put("state", map.remove("state")); device.put("mac", map.remove("mac")); if (result.containsKey(id)) { Map monitorPoint = (Map) result.get(id); devices = (List>) monitorPoint.get("devices"); } else { devices = new ArrayList>(); result.put(id, map); } devices.add(device); map.put("devices", devices); result.put(id, map); } return result.values(); } @Override public void isCompensateCalculation(Map parameters) { MonitorPoint monitorPoint = monitorPointMapper.selectByPrimaryKey(Integer.valueOf(parameters.get("monitorPointId").toString())); if (Integer.valueOf(320581).equals(monitorPoint.getAreaCode())) { parameters.put("compensate", true); } } @Override public Map selectAllById(String id) { int id2 = Integer.parseInt(id); Map map = monitorPointMapper.selectAllById(id2); return map; } @Override public List getDeviceList(int id) { return monitorPointMapper.getDeviceList(id); } @Override public JSONObject getMonitorPointById(int id, String Time, int i, String sensor) { JSONObject params = new JSONObject(); MonitorPoint monitorPoint = monitorPointMapper.getMonitorPointById(id); if (i == 1) { Double longitude = monitorPoint.getLongitude(); Double latitude = monitorPoint.getLatitude(); Double workshop = 0.0; Double flue = 0.0; //烟道设备 List device1 = deviceService.getDeviceById1(id); //厂界设备 List device2 = deviceService.getDeviceById2(id); //车间设备 List device3 = deviceService.getDeviceById3(id); String purificationRate = null;//净化率 if (device3.size() == 0) { purificationRate = "公司无车间设备,无法计算净化率"; params.put("device2", device2); params.put("device1", device1); } else { params.put("device1", device1); params.put("device2", device2); params.put("device3", device3); for (Device device33 : device3) { String mac3 = device33.getMac(); String tvoc = historyHourlyService.getTVOCByMac(mac3, Time, sensor); if (tvoc != null) { workshop = Double.parseDouble(tvoc); } else { workshop = 0.0; } } if (device1.size() == 0) { purificationRate = "公司无烟道设备,无法计算净化率"; } else { for (Device device11 : device1) { String mac1 = device11.getMac(); flue = Double.parseDouble(historyHourlyService.getTVOCByMac(mac1, Time, sensor)); if (workshop == 0.0) { purificationRate = "车间设备无数据浓度,无法计算浓度值"; } else { if (flue == 0.0) { purificationRate = "烟道设备无数据浓度,无法计算净化率"; } else { BigDecimal b = new BigDecimal(((workshop - flue) / workshop) * 100); double purity2 = b.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue(); purificationRate = (purity2) + "%"; } } } } } params.put("latitude", latitude); params.put("longitude", longitude); params.put("purificationRate", purificationRate); } if (i == 2) { Double longitude = monitorPoint.getLongitude(); Double latitude = monitorPoint.getLatitude(); //烟道设备 List device1 = deviceService.getDeviceById1(id); //厂界设备 List device2 = deviceService.getDeviceById2(id); //车间设备 List device3 = deviceService.getDeviceById3(id); String collectionRate = null;//收集率 Double pressure = 0.0;//平均压强 List list1 = new ArrayList(); if (device3.size() == 0) { collectionRate = "该公司车间无设备,无法计算收集率"; params.put("device1", device1); params.put("device2", device2); } else { params.put("device3", device3); if (device2.size() == 0) { collectionRate = "该公司厂界无设备,无法计算收集率"; params.put("device1", device1); } else { params.put("device2", device2); params.put("device1", device1); Double sum = 0.0; for (Device device22 : device2) { String mac2 = device22.getMac(); String pressure2 = historyHourlyService.getPressureByMac(mac2, Time); if (pressure2 != null) { pressure = Double.parseDouble(pressure2); list1.add(pressure); } else { collectionRate = "该公司厂界设备无数据浓度,无法计算收集率"; } } for (Double d : list1) { sum = sum + d; } if (list1.size() != 0) { pressure = sum / list1.size(); } else { collectionRate = "该公司厂界设备无数据浓度,无法计算收集率"; } Double pressure33 = 0.0; for (Device device33 : device3) { String mac3 = device33.getMac(); String pressure3 = historyHourlyService.getPressureByMac(mac3, Time); if (pressure3 != null) { pressure33 = Double.parseDouble(pressure3); BigDecimal b = new BigDecimal((pressure - pressure33 + 3.5) * 20);//临时加2.5,有具体设备就不需要加 double collection = b.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue(); collectionRate = collection + "%"; } } } } params.put("latitude", latitude); params.put("longitude", longitude); params.put("collectionRate", collectionRate); } if (i == 3) { Double longitudeCompany = monitorPoint.getLongitude(); Double latitudeCompany = monitorPoint.getLatitude(); Double longitude = 0.0;//每台设备的经纬度 Double latitude = 0.0;//每台设备的经纬度 List deviceList = deviceService.getDeviceById2(id); //List deviceList = monitorPointService.getDeviceList(id); List list = new ArrayList();//存放historyHourly的json数据 String smac = "";//,每台设备的Mac号 List windList = new ArrayList();//存放每台设备的风向和经纬度 Map jsonMap = new HashMap();//每台设备的数据 Map deviceMap = null; if (deviceList.size() > 1) { for (Device device : deviceList) { deviceMap = new HashMap(); smac = device.getMac(); latitude = device.getLatitude(); longitude = device.getLongitude(); jsonMap = historyHourlyService.getDataByMac(smac, Time); deviceMap.put("longitude", longitude); deviceMap.put("latitude", latitude); if (jsonMap != null) { deviceMap.put("jsonMap", jsonMap); } else { deviceMap.put("jsonMap", "该设备该时间点无数据"); } list.add(deviceMap); } Map mapData = new HashMap(); Map mapDevice; JSONArray windDir; for (Map objectMap : list) { mapDevice = new HashMap(); Map map = null; if (!(objectMap.get("jsonMap") instanceof String)) { mapData = (Map) objectMap.get("jsonMap"); map = (Map) JSON.parseObject((String) mapData.get("json")); windDir = (JSONArray) JSONArray.toJSON(map.get("e23")); JSONArray concentration = (JSONArray) JSONArray.toJSON(map.get(sensor)); BigDecimal bigDecimal1 = new BigDecimal(0); BigDecimal bigDecimal = new BigDecimal(0); if (concentration != null) { if (concentration.get(0) instanceof Integer) { bigDecimal1 = new BigDecimal(concentration.get(0).toString()); } else { bigDecimal1 = (BigDecimal) concentration.get(0); } if (windDir != null) { if (windDir.get(0) instanceof Integer) { bigDecimal = new BigDecimal(windDir.get(0).toString()); } else { bigDecimal = (BigDecimal) windDir.get(0); } mapDevice.put("e23", bigDecimal.doubleValue()); mapDevice.put("sensor", bigDecimal1.doubleValue()); mapDevice.put("longitude", objectMap.get("longitude")); mapDevice.put("latitude", objectMap.get("latitude")); } else { mapDevice.put("noSensor", "无风向数据"); mapDevice.put("longitude", objectMap.get("longitude")); mapDevice.put("latitude", objectMap.get("latitude")); } } } else { mapDevice.put("info", objectMap.get("jsonMap")); mapDevice.put("longitude", objectMap.get("longitude")); mapDevice.put("latitude", objectMap.get("latitude")); } windList.add(mapDevice); } // if (windDir!=null){} Double differenceNum = 0.0; Map indexMap; List mapList = new ArrayList<>(); for (int j = 0; j < windList.size(); j++) { for (int k = 0; k < windList.size(); k++) { if (k != j) { indexMap = new HashMap(); if (windList.get(k).containsKey("e23") && windList.get(j).containsKey("e23")) { Double e23Numk = (Double) windList.get(k).get("e23"); Double e23Numj = (Double) windList.get(j).get("e23"); Double diff = e23Numk - e23Numj; BigDecimal b = new BigDecimal(Math.abs(diff)); differenceNum = b.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue(); if (differenceNum > 180) { differenceNum = 360 - differenceNum; } indexMap.put("k", k); indexMap.put("j", j); indexMap.put("diff", differenceNum); } else { indexMap.put("k", k); indexMap.put("j", j); indexMap.put("info", "设备无数据"); } // indexMap.put("longitude",windList.get(k).get("longitude")); // indexMap.put("latitude",windList.get(k).get("latitude")); mapList.add(indexMap); } else { continue; } } } Double min = 0.0; int indexMin = 0; if (mapList.size() > 0) { if (mapList.get(0).containsKey("diff")) { min = (Double) mapList.get(0).get("diff"); for (int q = 1; q < mapList.size(); q++) { if (mapList.get(q).containsKey("diff")) { if (min > (Double) mapList.get(q).get("diff")) { min = (Double) mapList.get(q).get("diff"); indexMin = q; } } else { indexMin = q; } } } } Map twoDeviceMap = mapList.get(indexMin); List list1 = new ArrayList(); //存放风向夹角最小的两台设备的经纬度 list1.add(windList.get((Integer) twoDeviceMap.get("k"))); list1.add(windList.get((Integer) twoDeviceMap.get("j"))); Double wind = 0.0; Double sum = 0.0; if (list1.get(0).containsKey("e23")) { if (Math.abs((Double) list1.get(0).get("e23") - (Double) list1.get(1).get("e23")) > 180) { sum = (Double) list1.get(0).get("e23") + (Double) list1.get(1).get("e23"); wind = sum / 2 + 180; if (wind > 360) { wind = wind - 360; } } else { for (Map map : list1) { sum += (Double) map.get("e23"); } wind = sum / 2; } } else { wind = 0.0; } Map longAndLatiMap; List longAndLatiList = new ArrayList<>();//经纬度夹角集合,存放的是windList中两台设备的下标和两台设备夹角与风向角的差值 List preAngleDeviceList = new ArrayList(); //角度减去风向最小的两台设备 if (wind != 0.0) { for (int f = 0; f < windList.size(); f++) { for (int h = 0; h < windList.size(); h++) { if (f != h) { longAndLatiMap = new HashMap(); longAndLatiMap.put("h", h); longAndLatiMap.put("f", f); Double angle = mapUtils.getAngle( new MyLatLng((Double) windList.get(h).get("longitude"), (Double) windList.get(h).get("latitude")), new MyLatLng((Double) windList.get(f).get("longitude"), (Double) windList.get(f).get("latitude"))); Double angleDiff = Math.abs(angle - wind); longAndLatiMap.put("angle", angleDiff); longAndLatiList.add(longAndLatiMap); } } } Double minAngle = (Double) longAndLatiList.get(0).get("angle"); int indexAngle = 0; for (int j = 0; j < longAndLatiList.size(); j++) { if (minAngle > (Double) longAndLatiList.get(j).get("angle")) { minAngle = (Double) longAndLatiList.get(j).get("angle"); indexAngle = j; } } //windList.get((Integer) longAndLatiList.get(indexAngle).get("f"))获得风向和经纬度 preAngleDeviceList.add(windList.get((Integer) longAndLatiList.get(indexAngle).get("h"))); preAngleDeviceList.add(windList.get((Integer) longAndLatiList.get(indexAngle).get("f"))); Double length = mapUtils.getDistance((Double) preAngleDeviceList.get(0).get("longitude"), (Double) preAngleDeviceList.get(0).get("latitude"), (Double) preAngleDeviceList.get(1).get("longitude"), (Double) preAngleDeviceList.get(1).get("latitude")); Double subLength = length / 5; Double subLength1 = length / 6.1; Double angle = mapUtils.getAngle( new MyLatLng((Double) preAngleDeviceList.get(0).get("longitude"), (Double) preAngleDeviceList.get(0).get("latitude")), new MyLatLng((Double) preAngleDeviceList.get(1).get("longitude"), (Double) preAngleDeviceList.get(1).get("latitude"))); params.put("preAngleDeviceList", preAngleDeviceList); params.put("angle", angle); List locationList = new ArrayList(); String[] firstLocation = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, (Double) preAngleDeviceList.get(0).get("longitude"), (Double) preAngleDeviceList.get(0).get("latitude"), subLength); String[] secondLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(firstLocation[0]), Double.parseDouble(firstLocation[1]), subLength); String[] thirdLocation = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(secondLoction[0]), Double.parseDouble(secondLoction[1]), subLength); String[] fourthLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(thirdLocation[0]), Double.parseDouble(thirdLocation[1]), subLength); String[] fivethLoction = mapUtils.calLocationByDistanceAndLocationAndDirection(angle, Double.parseDouble(fourthLoction[0]), Double.parseDouble(fourthLoction[1]), subLength1); locationList.add(firstLocation); locationList.add(secondLoction); locationList.add(thirdLocation); locationList.add(fourthLoction); locationList.add(fivethLoction); params.put("locationList", locationList); String preAngleDeviceString = JSON.toJSON(preAngleDeviceList).toString(); params.put("preAngleDeviceString", preAngleDeviceString);//两台添加箭头的设备 } else { params.put("preAngleDeviceString", 0); } params.put("wind", wind); //String preAngleDeviceString=preAngleDeviceList. params.put("deviceList", deviceList); } else { if (deviceList.size() != 0) { params.put("deviceList", deviceList.get(0)); } else { params.put("deviceList", ""); } params.put("preAngleDeviceString", 1); params.put("locationList", ""); } params.put("latitudeCompany", latitudeCompany); params.put("longitudeCompany", longitudeCompany); } return params; } @Override public JSONObject getMacList(int monitPointId) { JSONObject params = new JSONObject(); MonitorPoint monitorPoint = monitorPointMapper.getMonitorPointById(monitPointId); //获取厂界所有设备 List deviceList = deviceService.getDeviceById2(monitPointId); params.put("longitudeCompany", monitorPoint.getLongitude()); params.put("latitudeCompany", monitorPoint.getLatitude()); params.put("latitudeCompany", monitorPoint.getLatitude()); params.put("monitPointId", monitPointId); params.put("deviceList", deviceList); return params; } @Override public List getMonitorPointListByAccountId(int id) { return monitorPointMapper.getMonitorPointListByAccountId(id); } @Override public MonitorPoint byIdGetMonitorPoint(int id) { return monitorPointMapper.byIdGetMonitorPoint(id); } @Override public String getOrgIdByMac(String mac) { return monitorPointMapper.getOrgIdByMac(mac); } }