对接小萨塔吊
This commit is contained in:
parent
2e475dcf9f
commit
65338aecc9
@ -266,13 +266,13 @@ public class Tower implements Serializable {
|
|||||||
*/
|
*/
|
||||||
@Excel(name = "纬度", width = 15)
|
@Excel(name = "纬度", width = 15)
|
||||||
@ApiModelProperty(value = "纬度")
|
@ApiModelProperty(value = "纬度")
|
||||||
private java.lang.Integer latitude;
|
private java.lang.String latitude;
|
||||||
/**
|
/**
|
||||||
* 经度
|
* 经度
|
||||||
*/
|
*/
|
||||||
@Excel(name = "经度", width = 15)
|
@Excel(name = "经度", width = 15)
|
||||||
@ApiModelProperty(value = "经度")
|
@ApiModelProperty(value = "经度")
|
||||||
private java.lang.Integer longtitude;
|
private java.lang.String longtitude;
|
||||||
/**
|
/**
|
||||||
* 设备标识码
|
* 设备标识码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -105,10 +105,10 @@ public class TowerCurrentData implements Serializable {
|
|||||||
@ApiModelProperty(value = "幅度 必传参数")
|
@ApiModelProperty(value = "幅度 必传参数")
|
||||||
private java.lang.String ranger;
|
private java.lang.String ranger;
|
||||||
/**
|
/**
|
||||||
* 高度 必传参数
|
* 吊钩运行高度 必传参数
|
||||||
*/
|
*/
|
||||||
@Excel(name = "高度 必传参数", width = 15)
|
@Excel(name = "吊钩运行高度 必传参数", width = 15)
|
||||||
@ApiModelProperty(value = "高度 必传参数")
|
@ApiModelProperty(value = "吊钩运行高度 必传参数")
|
||||||
private java.lang.String height;
|
private java.lang.String height;
|
||||||
/**
|
/**
|
||||||
* 风速(m/s)
|
* 风速(m/s)
|
||||||
|
|||||||
@ -283,6 +283,8 @@ public class TowerWorkCycle implements Serializable {
|
|||||||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
@ApiModelProperty(value = "模拟生成时间")
|
@ApiModelProperty(value = "模拟生成时间")
|
||||||
private java.util.Date mockTime;
|
private java.util.Date mockTime;
|
||||||
|
@ApiModelProperty(value = "小萨id")
|
||||||
|
private java.lang.String xiaoSaId;
|
||||||
/**
|
/**
|
||||||
* 工作循环吊程
|
* 工作循环吊程
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -338,7 +338,14 @@ public class Project implements Serializable {
|
|||||||
private Integer enableWorkerSafeWatch;
|
private Integer enableWorkerSafeWatch;
|
||||||
@ApiModelProperty(value = "安全履职报警推送时间")
|
@ApiModelProperty(value = "安全履职报警推送时间")
|
||||||
private String workerSafeWatchTime;
|
private String workerSafeWatchTime;
|
||||||
|
@ApiModelProperty(value = "1开启小萨(塔吊)")
|
||||||
|
private Integer enableXiaosa;
|
||||||
|
@ApiModelProperty(value = "小萨项目id")
|
||||||
|
private String xiaosaProjectId;
|
||||||
|
@ApiModelProperty(value = "小萨appSecret")
|
||||||
|
private String xiaosaAppKey;
|
||||||
|
@ApiModelProperty(value = "小萨appSecret")
|
||||||
|
private String xiaosaAppSecret;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* runde平台token
|
* runde平台token
|
||||||
|
|||||||
@ -5,6 +5,10 @@ import cn.hutool.core.collection.CollUtil;
|
|||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
import cn.hutool.core.date.DateUnit;
|
import cn.hutool.core.date.DateUnit;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
|
import cn.hutool.core.util.NumberUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.http.HttpException;
|
||||||
|
import cn.hutool.http.HttpRequest;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
@ -28,13 +32,14 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Component
|
@Component
|
||||||
@ -331,5 +336,397 @@ public class TowerTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取塔吊数据(小萨) 每5分钟触发任务
|
||||||
|
*/
|
||||||
|
@SchedulerLock(name = "getXiaosaTowerData", lockAtMostFor = 1000 * 60 * 5, lockAtLeastFor = 1000 * 60 * 3)
|
||||||
|
@Scheduled(cron = "0 0/5 * * * ?")
|
||||||
|
@RequestMapping("getXiaosaTowerData")
|
||||||
|
public void getXiaosaTowerData() {
|
||||||
|
try {
|
||||||
|
log.info("获取塔吊数据(小萨)开始任务");
|
||||||
|
List<Project> projects = projectMapper.selectList(new LambdaQueryWrapper<Project>()
|
||||||
|
.eq(Project::getEnableXiaosa, 1)
|
||||||
|
);
|
||||||
|
for (Project project : projects) {
|
||||||
|
// 获取设备列表
|
||||||
|
List<Tower> devList = towerMapper.selectList(new LambdaQueryWrapper<Tower>()
|
||||||
|
.eq(Tower::getProjectSn, project.getProjectSn()));
|
||||||
|
Map<String, Tower> devMap = devList.stream().collect(Collectors.toMap(Tower::getDevSn, Function.identity(), (o1, o2) -> o1));
|
||||||
|
if (CollUtil.isEmpty(devList)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
JSONObject body = new JSONObject();
|
||||||
|
body.put("appKey", project.getXiaosaAppKey());
|
||||||
|
body.put("appSecret", project.getXiaosaAppSecret());
|
||||||
|
String url = "https://api.open.ixiaosa.com/auth/app_access_token";
|
||||||
|
log.info("获取塔吊数据(小萨)的token的url:{},body:{}", url, JSON.toJSONString(body));
|
||||||
|
String result = HttpRequest.post(url)
|
||||||
|
.body(JSON.toJSONString(body))
|
||||||
|
.timeout(2000)
|
||||||
|
.execute()
|
||||||
|
.body();
|
||||||
|
log.info("获取塔吊数据(小萨)的token的result:{}", result);
|
||||||
|
if (StrUtil.isBlank(result)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
com.gexin.fastjson.JSONObject rootJo = JSON.parseObject(result);
|
||||||
|
if (!Objects.equals(rootJo.getBoolean("success"), true)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
String tokenHeader = "Bearer " + rootJo.getJSONObject("data").getString("appAccessToken");
|
||||||
|
String xiaosaProjectId = project.getXiaosaProjectId();
|
||||||
|
url = "https://api.device.open.ixiaosa.com/data/list_crane_param_data/" + xiaosaProjectId;
|
||||||
|
log.info("萨达 查询项目下塔机参数数据url:{}", url);
|
||||||
|
result = HttpRequest.get(url)
|
||||||
|
.header("Authorization", tokenHeader)
|
||||||
|
.execute().body();
|
||||||
|
log.info("萨达 查询项目下塔机参数数据result:{}", result);
|
||||||
|
Map<String, String> projectCraneId2DevSnMap = new HashMap<>();
|
||||||
|
rootJo = JSON.parseObject(result);
|
||||||
|
if (!Objects.equals(rootJo.getBoolean("success"), true)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
com.gexin.fastjson.JSONArray jsonArray = rootJo.getJSONArray("data");
|
||||||
|
for (int i = 0; i < jsonArray.size(); i++) {
|
||||||
|
com.gexin.fastjson.JSONObject jsonObject = jsonArray.getJSONObject(i);
|
||||||
|
Tower tower = devMap.get(jsonObject.getString("deviceSn"));
|
||||||
|
if (tower == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
projectCraneId2DevSnMap.put(jsonObject.getString("projectCraneId"), tower.getDevSn());
|
||||||
|
//修改塔吊设备信息
|
||||||
|
//projectId 项目 ID String
|
||||||
|
//projectCraneId 项目塔机 ID String
|
||||||
|
//projectCraneNum 塔机名称/编号 String
|
||||||
|
//craneType 塔机类型 String FlatArm:平臂,SwingArm:动臂,Tower:塔头
|
||||||
|
//jibArmLength 起重臂长 Float m
|
||||||
|
//balanceArmLength 平衡臂长 Float m
|
||||||
|
//craneHeight 塔机高度 Float m
|
||||||
|
//craneCapHeight 塔机塔帽高 Float m
|
||||||
|
//longitude 经度 Double °
|
||||||
|
//latitude 纬度 Double °
|
||||||
|
// x 相对坐标 X Float
|
||||||
|
// y 相对坐标 Y Float
|
||||||
|
//standardArmLength 标准臂长 Float m
|
||||||
|
//maxRadiusLoad 最大幅度起重量 Float t
|
||||||
|
//ratedLoad 额定吊重 Float t
|
||||||
|
tower.setForearmLength(jsonObject.getDouble("jibArmLength"));
|
||||||
|
tower.setPosteriorArmLength(jsonObject.getDouble("balanceArmLength"));
|
||||||
|
tower.setLongtitude(jsonObject.getString("longitude"));
|
||||||
|
tower.setLatitude(jsonObject.getString("latitude"));
|
||||||
|
tower.setRelatedX(jsonObject.getString("x"));
|
||||||
|
tower.setRelatedY(jsonObject.getString("y"));
|
||||||
|
towerMapper.updateById(tower);
|
||||||
|
}
|
||||||
|
if (CollUtil.isEmpty(projectCraneId2DevSnMap)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//保存塔吊实时数据
|
||||||
|
saveTowerCurrentDataForXiaoSa(tokenHeader, xiaosaProjectId, devMap, projectCraneId2DevSnMap);
|
||||||
|
|
||||||
|
//保存塔吊循环数据
|
||||||
|
saveTowerWorkCycleForXiaoSa(tokenHeader, xiaosaProjectId, project.getProjectSn(),devMap, projectCraneId2DevSnMap);
|
||||||
|
|
||||||
|
}
|
||||||
|
} catch (HttpException e) {
|
||||||
|
log.error("获取塔吊数据(小萨)开始任务err"+e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存塔吊循环数据(小萨)
|
||||||
|
*
|
||||||
|
* @param tokenHeader
|
||||||
|
* @param xiaosaProjectId
|
||||||
|
* @param projectSn
|
||||||
|
* @param projectCraneId2DevSnMap
|
||||||
|
*/
|
||||||
|
private void saveTowerWorkCycleForXiaoSa(String tokenHeader, String xiaosaProjectId, String projectSn, Map<String, Tower> devMap, Map<String, String> projectCraneId2DevSnMap) {
|
||||||
|
String url = "https://api.device.open.ixiaosa.com/data/list_crane_work_data/" + xiaosaProjectId;
|
||||||
|
log.info("萨达 查询项目下塔机实时吊装循环数据url:{}", url);
|
||||||
|
String result = HttpRequest.get(url)
|
||||||
|
.header("Authorization", tokenHeader)
|
||||||
|
.execute().body();
|
||||||
|
log.info("萨达 查询项目下塔机实时吊装循环数据result:{}", result);
|
||||||
|
com.gexin.fastjson.JSONObject rootJo = JSON.parseObject(result);
|
||||||
|
if (!Objects.equals(rootJo.getBoolean("success"), true)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
com.gexin.fastjson.JSONArray jsonArray1 = rootJo.getJSONArray("data");
|
||||||
|
List<TowerWorkCycle> datas = new ArrayList<>();
|
||||||
|
if (CollUtil.isNotEmpty(jsonArray1)) {
|
||||||
|
for (int i = 0; i < jsonArray1.size(); i++) {
|
||||||
|
com.gexin.fastjson.JSONObject json = jsonArray1.getJSONObject(i);
|
||||||
|
String xiansaId = json.getString("id");
|
||||||
|
int count = towerWorkCycleService.count(new LambdaQueryWrapper<TowerWorkCycle>()
|
||||||
|
.eq(TowerWorkCycle::getXiaoSaId, xiansaId));
|
||||||
|
if (count > 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
TowerWorkCycle data = new TowerWorkCycle();
|
||||||
|
|
||||||
|
// 1. projectCraneId → devSn(设备识别码)
|
||||||
|
data.setDevSn(projectCraneId2DevSnMap.get(json.getString("projectCraneId")));
|
||||||
|
Tower tower = devMap.get(data.getDevSn());
|
||||||
|
data.setDevName(tower.getDevName());
|
||||||
|
// 2. projectCraneNum(项目塔机编号/名称,无直接对应字段,可存储到额外字段或忽略)
|
||||||
|
// 如果 towerWorkCycle 有类似 craneName 的字段,可以设置:
|
||||||
|
// t.setCraneName(json.getString("projectCraneNum"));
|
||||||
|
|
||||||
|
// 3. workLoadingType(吊装类型,2:有吊重,无直接对应字段,可用于判断是否设置吊重)
|
||||||
|
// int workLoadingType = json.getInt("workLoadingType");
|
||||||
|
// if (workLoadingType == 2) {
|
||||||
|
// 有吊重时,设置相关参数
|
||||||
|
// }
|
||||||
|
data.setLoading(String.valueOf(Double.parseDouble(json.getString("maxLoadWeight")) * 1000)); // t → kg
|
||||||
|
|
||||||
|
// 4. upTime → startTime(起吊时间)
|
||||||
|
data.setStartTime(DateUtil.parseDateTime(json.getString("upTime")));
|
||||||
|
|
||||||
|
// 5. upAngle → slingStartRotation(起吊回转角度)
|
||||||
|
data.setSlingStartRotation(json.getString("upAngle"));
|
||||||
|
|
||||||
|
// 6. upRadius → slingStartRange(起吊幅度)
|
||||||
|
data.setSlingStartRange(json.getString("upRadius"));
|
||||||
|
|
||||||
|
// 7. upHookHeight → slingStartHeight(起吊吊钩高度)
|
||||||
|
data.setSlingStartHeight(json.getString("upHookHeight"));
|
||||||
|
|
||||||
|
// 8. upLoadWeight(起吊吊重,无直接对应字段,可结合 maxLoadWeight 使用)
|
||||||
|
|
||||||
|
// 9. upSafeLoad(起吊安全吊重,无直接对应字段)
|
||||||
|
|
||||||
|
// 10. upTorquePercent(起吊力矩百分比,无直接对应字段)
|
||||||
|
|
||||||
|
// 11. upFalls → workMultiple(起吊吊绳倍率)
|
||||||
|
data.setWorkMultiple(json.getInteger("upFalls"));
|
||||||
|
|
||||||
|
// 12. upElevationAngle(起吊俯仰角度,无直接对应字段)
|
||||||
|
|
||||||
|
// 13. upWindSpeed(起吊风速,用于 maxWindSpeed 计算)
|
||||||
|
double upWindSpeed = json.containsKey("upWindSpeed") ? json.getDouble("upWindSpeed") : 0;
|
||||||
|
|
||||||
|
// 14. maxTime(力矩最大点记录时间,无直接对应字段)
|
||||||
|
|
||||||
|
// 15. maxAngle(用于计算 maxAngle/minAngle)
|
||||||
|
double maxAngle = json.getDouble("maxAngle");
|
||||||
|
|
||||||
|
// 16. maxRadius(用于计算 maxRange/minRange)
|
||||||
|
double maxRadius = json.getDouble("maxRadius");
|
||||||
|
|
||||||
|
// 17. maxHookHeight(用于计算 maxHeight/minHeight)
|
||||||
|
double maxHookHeight = json.getDouble("maxHookHeight");
|
||||||
|
|
||||||
|
// 19. maxSafeLoad(最大安全吊重,无直接对应字段)
|
||||||
|
|
||||||
|
// 20. maxTorquePercent → peakLoad(最大力矩百分比)
|
||||||
|
data.setPeakLoad(json.getString("maxTorquePercent"));
|
||||||
|
|
||||||
|
// 21. maxFalls(最大吊绳倍率,无直接对应字段)
|
||||||
|
|
||||||
|
// 22. maxElevationAngle(最大俯仰角度,无直接对应字段)
|
||||||
|
|
||||||
|
// 23. maxWindSpeed(用于计算 maxWindSpeed)
|
||||||
|
double maxWindSpeed = json.containsKey("maxWindSpeed") ? json.getDouble("maxWindSpeed") : 0;
|
||||||
|
|
||||||
|
// 24. downTime → endTime(落吊时间)
|
||||||
|
data.setEndTime(DateUtil.parseDateTime(json.getString("downTime")));
|
||||||
|
|
||||||
|
// 25. downAngle → slingEndRotation(落吊回转角度)
|
||||||
|
data.setSlingEndRotation(json.getString("downAngle"));
|
||||||
|
|
||||||
|
// 26. downRadius → slingEndRange(落吊幅度)
|
||||||
|
data.setSlingEndRange(json.getString("downRadius"));
|
||||||
|
|
||||||
|
// 27. downHookHeight → slingEndHeight(落吊吊钩高度)
|
||||||
|
data.setSlingEndHeight(json.getString("downHookHeight"));
|
||||||
|
|
||||||
|
// 28. downLoadWeight(落吊吊重,无直接对应字段)
|
||||||
|
|
||||||
|
// 29. downSafeLoad(落吊安全吊重,无直接对应字段)
|
||||||
|
|
||||||
|
// 30. downTorquePercent(落吊力矩百分比,无直接对应字段)
|
||||||
|
|
||||||
|
// 31. downFalls(落吊吊绳倍率,无直接对应字段)
|
||||||
|
|
||||||
|
// 32. downElevationAngle(落吊俯仰角度,无直接对应字段)
|
||||||
|
|
||||||
|
// 33. downWindSpeed(用于计算 maxWindSpeed)
|
||||||
|
double downWindSpeed = json.containsKey("downWindSpeed") ? json.getDouble("downWindSpeed") : 0;
|
||||||
|
|
||||||
|
// 34. loadTime → workTime(起吊时长,单位 s)
|
||||||
|
data.setWorkTime(String.valueOf(DateUtil.between(data.getStartTime(), data.getEndTime(), DateUnit.SECOND)));
|
||||||
|
|
||||||
|
// 35. realLoadWeight(实际吊重,无直接对应字段)
|
||||||
|
|
||||||
|
// 计算最大/最小角度、幅度、高度
|
||||||
|
double upAngle = json.getDouble("upAngle");
|
||||||
|
double downAngle = json.getDouble("downAngle");
|
||||||
|
data.setMaxAngle(String.valueOf(Math.max(upAngle, Math.max(maxAngle, downAngle))));
|
||||||
|
data.setMinAngle(String.valueOf(Math.min(upAngle, Math.min(maxAngle, downAngle))));
|
||||||
|
|
||||||
|
double upRadius = json.getDouble("upRadius");
|
||||||
|
double downRadius = json.getDouble("downRadius");
|
||||||
|
data.setMaxRange(String.valueOf(Math.max(upRadius, Math.max(maxRadius, downRadius))));
|
||||||
|
data.setMinRange(String.valueOf(Math.min(upRadius, Math.min(maxRadius, downRadius))));
|
||||||
|
|
||||||
|
double upHookHeight = json.getDouble("upHookHeight");
|
||||||
|
double downHookHeight = json.getDouble("downHookHeight");
|
||||||
|
data.setMaxHeight(String.valueOf(Math.max(upHookHeight, Math.max(maxHookHeight, downHookHeight))));
|
||||||
|
data.setMinHeight(String.valueOf(Math.min(upHookHeight, Math.min(maxHookHeight, downHookHeight))));
|
||||||
|
|
||||||
|
// 计算最大风速
|
||||||
|
data.setMaxWindSpeed(String.valueOf(Math.max(upWindSpeed, Math.max(maxWindSpeed, downWindSpeed))));
|
||||||
|
data.setProjectSn(projectSn);
|
||||||
|
data.setAddTime(new Date());
|
||||||
|
data.setXiaoSaId(xiansaId);
|
||||||
|
datas.add(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(datas)) {
|
||||||
|
towerWorkCycleService.saveBatch(datas);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存塔吊实时数据(小萨)
|
||||||
|
*
|
||||||
|
* @param tokenHeader
|
||||||
|
* @param xiaosaProjectId
|
||||||
|
* @param devMap
|
||||||
|
* @param projectCraneId2DevSnMap
|
||||||
|
*/
|
||||||
|
private void saveTowerCurrentDataForXiaoSa(String tokenHeader, String xiaosaProjectId, Map<String, Tower> devMap, Map<String, String> projectCraneId2DevSnMap) {
|
||||||
|
String url = "https://api.device.open.ixiaosa.com/data/list_crane_real_time_data/" + xiaosaProjectId;
|
||||||
|
log.info("萨达 查询项目下塔机实时数据url:{}", url);
|
||||||
|
String result = HttpRequest.get(url)
|
||||||
|
.header("Authorization", tokenHeader)
|
||||||
|
.execute().body();
|
||||||
|
log.info("萨达 查询项目下塔机实时数据result:{}", result);
|
||||||
|
com.gexin.fastjson.JSONObject rootJo = JSON.parseObject(result);
|
||||||
|
if (!Objects.equals(rootJo.getBoolean("success"), true)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
com.gexin.fastjson.JSONArray jsonArray1 = rootJo.getJSONArray("data");
|
||||||
|
List<TowerCurrentData> datas = new ArrayList<>();
|
||||||
|
if (CollUtil.isNotEmpty(jsonArray1)) {
|
||||||
|
for (int i = 0; i < jsonArray1.size(); i++) {
|
||||||
|
//实时数据
|
||||||
|
// "time": "2025-06-27 17:56:52",
|
||||||
|
// "projectCraneId": "1928738212753227778",
|
||||||
|
// "currentCraneHeight": 0.0,
|
||||||
|
// "radius": 23.94,
|
||||||
|
// "hookHeight": 37.64,
|
||||||
|
// "angle": 307.46,
|
||||||
|
// "loadWeight": 0.67,
|
||||||
|
// "safeLoad": 6.0,
|
||||||
|
// "torque": 16.0398,
|
||||||
|
// "torquePercent": 11.24,
|
||||||
|
// "falls": 2,
|
||||||
|
// "elevationAngle": 0.0,
|
||||||
|
// "windSpeed": 0.0,
|
||||||
|
// "infractionTypeList": "",
|
||||||
|
// "craneDriverName": "",
|
||||||
|
// "craneDriverIdCard": "",
|
||||||
|
// "projectCraneNum": "1#"
|
||||||
|
com.gexin.fastjson.JSONObject json = jsonArray1.getJSONObject(i);
|
||||||
|
TowerCurrentData data = new TowerCurrentData();
|
||||||
|
data.setReciveTime(DateUtil.parseDateTime(json.getString("time")));
|
||||||
|
data.setStartTime(data.getReciveTime());
|
||||||
|
data.setDevSn(projectCraneId2DevSnMap.get(json.getString("projectCraneId")));
|
||||||
|
Tower tower = devMap.get(data.getDevSn());
|
||||||
|
data.setDevName(tower.getDevName());
|
||||||
|
data.setHeight(json.getString("hookHeight"));
|
||||||
|
data.setRanger(json.getString("radius"));
|
||||||
|
data.setAngle(json.getString("angle"));
|
||||||
|
data.setLoading(Optional.ofNullable(json.getDouble("loadWeight")).map(m -> m * 1000 + "").orElse(null));
|
||||||
|
if (json.getDouble("loadWeight") != null && json.getDouble("safeLoad") != null && json.getDouble("safeLoad").compareTo(0D) != 0) {
|
||||||
|
data.setLoadRatio(NumberUtil.roundStr(json.getDouble("loadWeight") / json.getDouble("safeLoad"), 4));
|
||||||
|
}
|
||||||
|
data.setTorque(json.getString("torque"));
|
||||||
|
data.setTorqueRatio(json.getString("torquePercent"));
|
||||||
|
data.setRate(json.getString("falls"));
|
||||||
|
data.setObliguity(json.getString("elevationAngle"));
|
||||||
|
data.setWindspeed(json.getString("windSpeed"));
|
||||||
|
data.setDriverName(json.getString("craneDriverName"));
|
||||||
|
data.setDriverIdCard(json.getString("craneDriverIdCard"));
|
||||||
|
data.setRealFlag("1");
|
||||||
|
data.setNoError(1);
|
||||||
|
String infractionTypeList = json.getString("infractionTypeList");
|
||||||
|
Integer noAlarm = 1;
|
||||||
|
if (StrUtil.isNotBlank(infractionTypeList)) {
|
||||||
|
for (String alarmKey : StrUtil.split(infractionTypeList, ",")) {
|
||||||
|
switch (alarmKey) {
|
||||||
|
case "Collision_LeftRotationAlert":
|
||||||
|
data.setMultiNegAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Collision_RightRotationAlert":
|
||||||
|
data.setMultiPosAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Collision_RadiusForthAlert":
|
||||||
|
data.setMultiOutAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Collision_RadiusBackAlert":
|
||||||
|
data.setMultiBackAlarm(1);
|
||||||
|
break;
|
||||||
|
case "RestrictedArea_LeftRotationAlert":
|
||||||
|
data.setForbidEntryNegAlarm(1);
|
||||||
|
break;
|
||||||
|
case "RestrictedArea_RightRotationAlert":
|
||||||
|
data.setForbidEntryPosAlarm(1);
|
||||||
|
break;
|
||||||
|
case "RestrictedArea_RadiusForthAlert":
|
||||||
|
data.setForbidSuspend4OutAlarm(1);
|
||||||
|
break;
|
||||||
|
case "RestrictedArea_RadiusBackAlert":
|
||||||
|
data.setForbidSuspend4BackAlarm(1);
|
||||||
|
break;
|
||||||
|
case "AngleRestrictedArea_LeftRotationAlert":
|
||||||
|
data.setForbidSuspend2NegAlarm(1);
|
||||||
|
break;
|
||||||
|
case "AngleRestrictedArea_RightRotationAlert":
|
||||||
|
data.setForbidSuspend2PosAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_LeftRotationAlert":
|
||||||
|
data.setNegAngleAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_RightRotationAlert":
|
||||||
|
data.setPosAngleAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_RadiusForthAlert":
|
||||||
|
data.setMaxRangeAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_RadiusBackAlert":
|
||||||
|
data.setMinRangeAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_OfHeightTopAlert":
|
||||||
|
data.setHeightAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_HeightBottomAlert":
|
||||||
|
data.setHeightLowerAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_LoadAlert":
|
||||||
|
data.setMomentAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_TorqueAlert":
|
||||||
|
data.setMomentAlarm(1);
|
||||||
|
break;
|
||||||
|
case "Limit_WindSpeedAlert":
|
||||||
|
data.setWindSpeedAlarm(1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
noAlarm = 0;
|
||||||
|
}
|
||||||
|
data.setNoAlarm(noAlarm);
|
||||||
|
data.setProjectSn(tower.getProjectSn());
|
||||||
|
datas.add(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(datas)) {
|
||||||
|
towerCurrentDataService.saveBatch(datas);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user