|
|
@@ -4,7 +4,6 @@ import cn.hutool.json.JSONArray;
|
|
|
import cn.hutool.json.JSONObject;
|
|
|
import com.ruoyi.biz.domain.TwinCalc2hr;
|
|
|
import com.ruoyi.biz.domain.TwinDevice;
|
|
|
-import com.ruoyi.biz.domain.TwinRecordAlarms;
|
|
|
import com.ruoyi.biz.mapper.TwinCalc2hrMapper;
|
|
|
import com.ruoyi.biz.service.IIotService;
|
|
|
import com.ruoyi.biz.service.ITwinCalc2hrService;
|
|
|
@@ -41,310 +40,6 @@ public class TwinCalc2hrServiceImpl implements ITwinCalc2hrService {
|
|
|
private JdbcTemplate jdbcTemplate;
|
|
|
|
|
|
/**
|
|
|
- * 数据统计
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void calc() {
|
|
|
- LocalDateTime ldt = LocalDateTime.now().withMinute(0).withSecond(0).withNano(0);
|
|
|
- //当前时间之前的偶数时间段
|
|
|
- ldt = ldt.minusHours(2).minusHours(ldt.getHour() % 2);
|
|
|
- //开始时间需要向前取一秒
|
|
|
- LocalDateTime start = ldt.minusSeconds(1);
|
|
|
- //获取时段范围 时间 1=0-2点 2=2-4
|
|
|
- int period = ldt.getHour() / 2 + 1;
|
|
|
- LocalDateTime end = ldt.plusHours(2);
|
|
|
- Long startTime = start.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
- Long endTime = end.toInstant(ZoneOffset.of("+8")).toEpochMilli();
|
|
|
- Date date = Date.from(ldt.toLocalDate().atStartOfDay(ZoneOffset.of("+8")).toInstant());
|
|
|
- calc4device(date, startTime, endTime, period + "");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 统计昨日数据
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void calcYesterday() {
|
|
|
- LocalDate localDate = LocalDate.now().minusDays(1);
|
|
|
- calc(localDate);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 统计指定日期数据
|
|
|
- *
|
|
|
- * @param date 指定日期 yyyy-mm-dd
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void calc(String date) {
|
|
|
- LocalDate localDate = LocalDate.parse(date);
|
|
|
- calc(localDate);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 统计指定日期数据
|
|
|
- *
|
|
|
- * @param date 指定日期
|
|
|
- */
|
|
|
- @Override
|
|
|
- public void calc(LocalDate date) {
|
|
|
- Tools.timePeriod(date).forEach(map -> {
|
|
|
- long start = (long) map.get("start");
|
|
|
- long end = (long) map.get("end");
|
|
|
- String period = (String) map.get("period");
|
|
|
- Date d = Date.from(date.atStartOfDay(ZoneOffset.of("+8")).toInstant());
|
|
|
- calc4device(d, start, end, period);
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 按设备循环计算
|
|
|
- *
|
|
|
- * @param date 日期
|
|
|
- * @param startTime 开始时间戳
|
|
|
- * @param endTime 结束时间戳
|
|
|
- * @param period 时段
|
|
|
- */
|
|
|
- private void calc4device(Date date, long startTime, long endTime, String period) {
|
|
|
- List<Object[]> calc2hrList = new ArrayList<>();
|
|
|
- List<Object[]> recordAlarmsList = new ArrayList<>();
|
|
|
- deviceService.selectTwinDeviceList(new TwinDevice()).forEach(twinDevice -> {
|
|
|
- String table = twinDevice.getDevicePath();
|
|
|
- TwinCalc2hr calc2hr = new TwinCalc2hr();
|
|
|
- calc2hr.setDeviceId(twinDevice.getID());
|
|
|
- calc2hr.setDataDate(date);
|
|
|
- calc2hr.setTimePeriod(period);
|
|
|
- Map<String, Object> map = calc(table, startTime, endTime);
|
|
|
- //0.已织造米数 1.A班组总开机时间 2.A班组总停机时间 3.A班总产量 4.B班组总开机时间 5.B班组总停机时间 6.B班总产量 7.A班总重量 8.B班总重量
|
|
|
- float[] total = (float[]) map.get("total");
|
|
|
- calc2hr.setLengthA(BigDecimal.valueOf(total[3]));
|
|
|
- calc2hr.setLengthB(BigDecimal.valueOf(total[6]));
|
|
|
- calc2hr.setWeightA(BigDecimal.valueOf(total[7]));
|
|
|
- calc2hr.setWeightB(BigDecimal.valueOf(total[8]));
|
|
|
- calc2hr.setOpenTimeA(BigDecimal.valueOf(total[1]));
|
|
|
- calc2hr.setOpenTimeB(BigDecimal.valueOf(total[4]));
|
|
|
- calc2hr.setCloseTimeA(BigDecimal.valueOf(total[2]));
|
|
|
- calc2hr.setCloseTimeB(BigDecimal.valueOf(total[5]));
|
|
|
-
|
|
|
- Map<String, Long> stop = (Map<String, Long>) map.get("stop");
|
|
|
- calc2hr.setStop1A(stop.get("stop1_A"));
|
|
|
- calc2hr.setStop1B(stop.get("stop1_B"));
|
|
|
- calc2hr.setStop2A(stop.get("stop2_A"));
|
|
|
- calc2hr.setStop2B(stop.get("stop2_B"));
|
|
|
- calc2hr.setStop3A(stop.get("stop3_A"));
|
|
|
- calc2hr.setStop3B(stop.get("stop3_B"));
|
|
|
-
|
|
|
- int[] alarms = (int[]) map.get("alarms");
|
|
|
- int alarmsTimes = 0;
|
|
|
- for (int i = 0; i < alarms.length; i++) {
|
|
|
- alarmsTimes += alarms[i];
|
|
|
- }
|
|
|
- calc2hr.setAlarm((long) alarmsTimes);
|
|
|
- calc2hr.setRemark(Arrays.toString(alarms));
|
|
|
-
|
|
|
-// insertTwinCalc2hr(calc2hr);
|
|
|
- calc2hrList.add(calc2hr.toArray());
|
|
|
- List<Pair<Integer, Long>> stopRecord = (List<Pair<Integer, Long>>) map.get("stopRecord");
|
|
|
- stopRecord.forEach(pair -> {
|
|
|
- TwinRecordAlarms recordAlarms = new TwinRecordAlarms();
|
|
|
- recordAlarms.setDeviceId(twinDevice.getID());
|
|
|
- recordAlarms.setAlarmType(pair.getKey() + "");
|
|
|
- recordAlarms.setDataTime(new Date(pair.getValue()));
|
|
|
- recordAlarmsList.add(recordAlarms.toArray());
|
|
|
-// recordAlarmsService.insertTwinRecordAlarms(recordAlarms);
|
|
|
- });
|
|
|
- });
|
|
|
- String sql = "INSERT INTO TWIN_CALC_2HR (DATA_DATE, TIME_PERIOD, DEVICE_ID, LENGTH_A, OPEN_TIME_A, CLOSE_TIME_A, LENGTH_B, CLOSE_TIME_B, OPEN_TIME_B, WEIGHT, WEIGHT_A, WEIGHT_B, ALARM, STOP1_A, STOP2_A, STOP3_A, STOP1_B, STOP2_B, STOP3_B)" +
|
|
|
- " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
|
|
|
- jdbcTemplate.batchUpdate(sql, calc2hrList);
|
|
|
-
|
|
|
- sql = "INSERT INTO TWIN_RECORD_ALARMS (DEVICE_ID, ALARM_TYPE,DATA_TIME) VALUES (?,?,?)";
|
|
|
- jdbcTemplate.batchUpdate(sql, recordAlarmsList);
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- /**
|
|
|
- * // 0 Capacity_data_2 已织造米数
|
|
|
- * // 1 Capacity_data_37 A班组开机时间
|
|
|
- * // 2 Capacity_data_38 A班组停机时间
|
|
|
- * // 3 Capacity_data_39 A班当前产量
|
|
|
- * // 4 Capacity_data_42 B班组开机时间
|
|
|
- * // 5 Capacity_data_43 B班组停机时间
|
|
|
- * // 6 Capacity_data_44 B班当前产量
|
|
|
- * // 7 Capacity_data_48 停机状态
|
|
|
- * // 8 Formula_data_3 米克重
|
|
|
- * // 9 Formula_data_13 卷曲幅宽
|
|
|
- */
|
|
|
- @Override
|
|
|
- public Map<String, Object> calc(String table, long startTime, long endTime) {
|
|
|
- String sql = "select Capacity_data_2,Capacity_data_37,Capacity_data_38,Capacity_data_39,Capacity_data_42,Capacity_data_43,Capacity_data_44,Capacity_data_48,Formula_data_3,Formula_data_13,Capacity_data_36,Capacity_data_41," + "Alarm_unit_1,Alarm_unit_2,Alarm_unit_3,Alarm_unit_4,Alarm_unit_5,Alarm_unit_6,Alarm_unit_7,Alarm_unit_8,Alarm_unit_9,Alarm_unit_10,Alarm_unit_11,Alarm_unit_12,Alarm_unit_13,Alarm_unit_14,Alarm_unit_15,Alarm_unit_16,Alarm_unit_17,Alarm_unit_18,Alarm_unit_19,Alarm_unit_20,Alarm_unit_21,Alarm_unit_22,Alarm_unit_23,Alarm_unit_24,Alarm_unit_25,Alarm_unit_26,Alarm_unit_27" + " from %s where time>%s and time <=%s";
|
|
|
- sql = String.format(sql, table, startTime, endTime);
|
|
|
- JSONObject jsonObject = iotService.query(sql);
|
|
|
-
|
|
|
- JSONObject data = jsonObject.getJSONObject("data");
|
|
|
- JSONArray values = data.getJSONArray("values");
|
|
|
- JSONArray timestamps = data.getJSONArray("timestamps");
|
|
|
- //初始时间点数据
|
|
|
- //0-data2,1-data37,2-data38,3-data39,4-data42,5-data-43,6data-44
|
|
|
- float[] first = new float[7];
|
|
|
- //上一个时间点数据
|
|
|
- float[] last = new float[7];
|
|
|
- //统计数据,后面2个分别代表A班重量,B班重量
|
|
|
- float[] total = new float[9];
|
|
|
- //告警数据统计
|
|
|
- boolean[] lastAlarms = new boolean[26];
|
|
|
- int[] alarmsTimes = new int[26];
|
|
|
- //米克重
|
|
|
- int lastMkz = 0;
|
|
|
- //卷曲幅宽
|
|
|
- float lastFk = 0f;
|
|
|
- int last48 = 0;
|
|
|
- //状态计数
|
|
|
- Map<String, Long> stopMap = new HashMap<>(16);
|
|
|
- for (int i = 1; i <= 7; i++) {
|
|
|
- stopMap.put("stop" + i + "_A", 0L);
|
|
|
- stopMap.put("stop" + i + "_B", 0L);
|
|
|
- }
|
|
|
- //停机时间记录
|
|
|
- List<Pair<Integer, Long>> stopRecord = new ArrayList<>();
|
|
|
-
|
|
|
- for (int i = 0; i < timestamps.size(); i++) {
|
|
|
- JSONArray da = values.getJSONArray(i);
|
|
|
- //0-data2,1-data37,2-data38,3-data39,4-data42,5-data-43,6data-44
|
|
|
- //当前时间数据
|
|
|
- float[] curr = {da.getFloat(0), da.getFloat(1), da.getFloat(2), da.getFloat(3), da.getFloat(4), da.getFloat(5), da.getFloat(6)};
|
|
|
- int curr48 = da.getInt(7);
|
|
|
-
|
|
|
- if (i == 0) {
|
|
|
- //第一次数据是上次最后一条,只做记录用,不做处理
|
|
|
- first = curr.clone();
|
|
|
- last = curr.clone();
|
|
|
- lastMkz = da.getInt(8);
|
|
|
- lastFk = da.getFloat(9);
|
|
|
- last48 = curr48;
|
|
|
- for (int j = 0; j < lastAlarms.length; j++) {
|
|
|
- lastAlarms[j] = da.getBool(12 + j);
|
|
|
- }
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- for (int j = 0; j < first.length; j++) {
|
|
|
- //如果当前值为小于上一个,且上一个值不为0,则计算
|
|
|
- //因为会出现数据波动,停机再启动之后的第一个点不为0,为0.00几几几的
|
|
|
- if (curr[j] < last[j] && last[j] != 0f) {
|
|
|
- calcTotal(j, last, first, total, lastMkz, lastFk);
|
|
|
- first[j] = curr[j];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for (int j = 0; j < lastAlarms.length; j++) {
|
|
|
- boolean currV = da.getBool(j + 12);
|
|
|
- if (currV && !lastAlarms[j]) {
|
|
|
- //如果当前值为true,上一条为false 则记录一次告警
|
|
|
- int endNum = timestamps.size();
|
|
|
- if (i + 9 < timestamps.size()) {
|
|
|
- endNum = i + 9;
|
|
|
- }
|
|
|
- boolean numFlag = true;
|
|
|
- for (int k = i + 1; k < endNum; k++) {
|
|
|
- JSONArray nextData = values.getJSONArray(k);
|
|
|
- boolean nextV = nextData.getBool(j + 12);
|
|
|
- if (!nextV) {
|
|
|
- numFlag = false;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- if (numFlag) {
|
|
|
- alarmsTimes[j] += 1;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (curr48 != 0 && curr48 != last48) {
|
|
|
- //不等于0,并且超过连续10次或者时间超过10秒
|
|
|
- //取出后面9次的数据,跟当前值是否一样,如果后面数据不足9次,则取至末尾
|
|
|
- int endNum = timestamps.size();
|
|
|
- if (i + 9 < timestamps.size()) {
|
|
|
- endNum = i + 9;
|
|
|
- }
|
|
|
- boolean numFlag = calcAlarms(i, endNum, values, curr48);
|
|
|
- if (numFlag) {
|
|
|
- //记录停机时间
|
|
|
- stopRecord.add(new Pair<>(curr48, timestamps.getLong(i)));
|
|
|
- //10 A班登入 11B班登入
|
|
|
- String key = "stop" + curr48;
|
|
|
- if (da.getBool(10)) {
|
|
|
- key += "_A";
|
|
|
- }
|
|
|
- if (da.getBool(11)) {
|
|
|
- key += "_B";
|
|
|
- }
|
|
|
- if (stopMap.get(key) != null) {
|
|
|
- Long times = stopMap.get(key) + 1;
|
|
|
- stopMap.put(key, times);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- //复制数组,设置last值为当前值
|
|
|
- last = curr.clone();
|
|
|
- lastMkz = da.getInt(8);
|
|
|
- lastFk = da.getFloat(9);
|
|
|
- for (int j = 0; j < lastAlarms.length; j++) {
|
|
|
- lastAlarms[j] = da.getBool(12 + j);
|
|
|
- }
|
|
|
- last48 = curr48;
|
|
|
- }
|
|
|
- //最后再补一次计算
|
|
|
- for (int j = 0; j < first.length; j++) {
|
|
|
- calcTotal(j, last, first, total, lastMkz, lastFk);
|
|
|
- }
|
|
|
-
|
|
|
- Map<String, Object> result = new HashMap<>(16);
|
|
|
- result.put("total", total);
|
|
|
- result.put("stop", stopMap);
|
|
|
- result.put("alarms", alarmsTimes);
|
|
|
- result.put("stopRecord", stopRecord);
|
|
|
- return result;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 告警次数计算
|
|
|
- */
|
|
|
- private boolean calcAlarms(int startNum, int endNum, JSONArray values, int curr) {
|
|
|
- boolean numFlag = true;
|
|
|
- for (int j = startNum + 1; j < endNum; j++) {
|
|
|
- JSONArray nextData = values.getJSONArray(j);
|
|
|
- int next48 = nextData.getInt(7);
|
|
|
- if (curr != next48) {
|
|
|
- numFlag = false;
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return numFlag;
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 计算 提取公共方法
|
|
|
- */
|
|
|
- private void calcTotal(int j, float[] last, float[] first, float[] total, int lastMkz, float lastFk) {
|
|
|
- float v = last[j] - first[j];
|
|
|
- total[j] += v;
|
|
|
- if (j == 3 || j == 6) {
|
|
|
- float weight = BigDecimal.valueOf(v * lastMkz * lastFk / 1000 / 1000).setScale(2, RoundingMode.HALF_UP).floatValue();
|
|
|
- if (j == 3) {
|
|
|
- //如果是A班产量,则计算A班重量
|
|
|
- total[7] = total[7] + weight;
|
|
|
- }
|
|
|
- if (j == 6) {
|
|
|
- //如果是B班产量,则计算B班重量
|
|
|
- total[8] = total[8] + weight;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
* 查询2小时统计数据
|
|
|
*
|
|
|
* @param id 2小时统计数据主键
|