Newer
Older
pgdsc / src / com / szpg / plc / message / response / read / ReadDSStatusCommandResponse.java
TAN YUE on 31 Jul 2020 5 KB 20200731 正常数据自动消警
package com.szpg.plc.message.response.read;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.szpg.db.data.PgDevice;
import com.szpg.util.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.szpg.db.dao.PgAlarmDao;
import com.szpg.db.dao.PgDeviceDao;
import com.szpg.db.dao.PgHjsbblDao;
import com.szpg.db.dao.impl.PgAlarmDaoImpl;
import com.szpg.db.dao.impl.PgDeviceDaoImpl;
import com.szpg.db.dao.impl.PgHjsbblDaoImpl;
import com.szpg.db.data.PgAlarm;
import com.szpg.db.data.PgHjsbbl;
import com.szpg.plc.message.response.ReadMemoryCommandResponse;
import com.szpg.plc.util.ByteUtil;

public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = -2692039091478584257L;

	private final Logger logger = Logger.getLogger(this.getClass().getName());
	
	private List<Boolean> dsbj; // 对射报警状态
	private String[] zcList; //红外对射监测的资产列表,从配置文件中获取

	public ReadDSStatusCommandResponse() {
		dsbj = new ArrayList<Boolean>();
	}

	public List<Boolean> getDsbj() {
		return dsbj;
	}

	public void setDsbj(List<Boolean> dsbj) {
		this.dsbj = dsbj;
	}
	
	public String[] getZcList() {
		return zcList;
	}

	public void setZcList(String[] zcList) {
		this.zcList = zcList;
	}

	@Override
	public void afterAction() {
		// 1将对射报警数据存入数据库
		PgDeviceDao deviceDao = new PgDeviceDaoImpl();
		PgAlarmDao alarmDao = new PgAlarmDaoImpl();
		
		// 遍历资产列表,将红外对射报警状态存入数据库
		for (int i = 0; i < zcList.length; i++) {
			String zcbh = zcList[i];
			
			int deviceId = deviceDao.findDeviceIdByCode(zcbh);
			if (deviceId > 0) {
				if (dsbj.get(i) == true) {
					PgAlarm alarm = new PgAlarm();
					alarm.setActive(1);
					alarm.setAlarm_date(this.getTime().getTime());
					alarm.setAlarmdevid(deviceId);
					alarm.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGSAF);
					alarm.setDescription("舱段入侵报警");
					alarm.setUserid(null);
					// 对射报警定义为二级报警
					alarm.setAlarm_grade("二级报警");
					
					alarmDao.insertAlarmRecord(alarm);
					deviceDao.updateDeviceStatus(deviceId, "舱段入侵报警");

					// 自动打开当前舱段的照明,手动关闭照明
					// 首先找到当前舱段的排风机资产编号
					if (Boolean.valueOf(Configure.getProperty("sys", "DS_ON_ZM", "false")) == true) {
						String acucode = zcbh.substring(0, zcbh.indexOf(".", 6));
						String cabin = zcbh.substring(zcbh.lastIndexOf(".") + 1, zcbh.lastIndexOf(".") + 2);
						List<PgDevice> zms = deviceDao.findDeviceByPositionAndType(acucode, "Z", cabin);
						if (null != zms && zms.isEmpty() == false) {
							String baseURL = Configure.getProperty("sys", "PGDSC_API_URL");
							for (PgDevice fj : zms) {
								String zmzcbh = fj.getAssetcode();

								// 调用远程接口启动照明
								HttpRequest.sendGet(baseURL + "remote/turnOnZm.action", "zcbh=" + zmzcbh);
							}
						}
					}
					
					// 将报警日志推送至市级平台
					String date = TimeFormat.formatDate(getTime().getTime());
					int count = alarmDao.findAlarmCountByDate(date);
					String bjbh = "THXC." + date + "." + NumberFormat.format(count+1, "0000");
					String bjms = alarm.getDescription();
					String bjsj = date.replace("-", "");
					String dsbjResp = DataPushInterface.addDSAlarmData(bjbh, zcbh, bjms, bjsj);
					logger.info("同步舱段入侵报警记录日志结果:" + dsbjResp);
				} else {
					alarmDao.autoClearAlarm(deviceId);
					deviceDao.updateDeviceStatus(deviceId, "正常");
				}
			}
		}
	}

	@Override
	public void parseData() {
		// 获取目标ACU的代码
		String acucode = this.getAcucode();
		byte[] messageData = this.getResponseData();
		
		logger.info("开始解析[读取舱段对射报警状态][" + acucode + "]指令响应");
		
		// 判断数据的长度是否满足要求
		if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".DSALM.WORDCOUNT")) * 2) {
			logger.error("返回的数据长度与读取的不一致!");
			this.setValid(false);
			return;
		}
		
		// 将数据转换为字符串
		// 按照高字在前,低字在后;高字节在前,低字节在后的顺序
		String dataStr = "";
		for (int c = 0; c < messageData.length; c = c + 2) {
			dataStr = ByteUtil.binToBinString(new byte[] {messageData[c], messageData[c + 1]}) + dataStr;
		}
		
		PgHjsbblDao blDao = new PgHjsbblDaoImpl();
		
		// 获取目标ACU红外对射报警状态内存区域的起始字地址
		int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".DSALM.START"));
		
		// 获取目标ACU红外对射相关的资产列表,即红外对射设备列表
		String zcListStr = Configure.getProperty("acubl", acucode + ".DS.ZC.LIST");
		if (StringUtils.isEmpty(zcListStr) == true) {
			this.setValid(false);
			return;
		}
		zcList = zcListStr.split(";");

		// 初始化结果集合
		dsbj = Arrays.asList(new Boolean[zcList.length]);
		
		// 解析红外对射报警状态
		for (int i = 0; i < zcList.length; i++) {
			String zcbh = zcList[i];
			
			// 解析红外对射报警状态
			PgHjsbbl almBlObj = blDao.findBlByBh(zcbh + ".Alm");
			if (null == almBlObj) {
				continue;
			}
			
			int akszdz = almBlObj.getKszdz(); //开始字地址
			int aoffset = akszdz - start; //与开始字的偏移量
			int abit = almBlObj.getSzw(); //所在位

			int index = dataStr.length() - 1 - aoffset * 16 - abit;
			if (index >= 0) {
				char bjBt = dataStr.charAt(index); // 红外对射报警状态标志位
				getDsbj().set(i, bjBt == '1' ? true : false);

				logger.info("[" + zcbh + "][舱段对射报警" + bjBt + "]");
			}
		}
		
		logger.info("解析[读取舱段对射报警状态]响应指令结束");
	}

}