|
@@ -6,10 +6,7 @@ import com.example.opc_common.entity.*;
|
|
|
import com.example.opc_common.enums.ResultEnum;
|
|
|
import com.example.opc_common.exception.CustomException;
|
|
|
import com.example.opc_common.util.*;
|
|
|
-import com.example.opc_da.dao.ItemGroupDao;
|
|
|
-import com.example.opc_da.dao.MessageNoticeDao;
|
|
|
-import com.example.opc_da.dao.RawDataDao;
|
|
|
-import com.example.opc_da.dao.ReportTableDao;
|
|
|
+import com.example.opc_da.dao.*;
|
|
|
import com.example.opc_da.util.CronUtil;
|
|
|
import com.example.opc_da.util.OpcDaUtil;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
@@ -17,8 +14,12 @@ import org.openscada.opc.dcom.da.OPCSERVERSTATE;
|
|
|
import org.openscada.opc.lib.da.Group;
|
|
|
import org.openscada.opc.lib.da.ItemState;
|
|
|
import org.openscada.opc.lib.da.Server;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.http.HttpEntity;
|
|
|
+import org.springframework.http.HttpHeaders;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.web.client.RestTemplate;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
@@ -37,6 +38,18 @@ public class ReportTableTask {
|
|
|
@Resource
|
|
|
private RawDataDao rawDataDao;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private DataSourceDao dataSourceDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private DataModelDao dataModelDao;
|
|
|
+
|
|
|
+ @Value("${opc_ua_server.address}")
|
|
|
+ private String opcUaUrl;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private RestTemplate restTemplate;
|
|
|
+
|
|
|
@Resource
|
|
|
private MessageNoticeDao messageNoticeDao;
|
|
|
|
|
@@ -44,50 +57,279 @@ public class ReportTableTask {
|
|
|
private String timeFormat;
|
|
|
|
|
|
/**
|
|
|
- * 手动报表生成数据
|
|
|
+ * 手动报表模板新增,保存相应的数据项信息,生成相应的报表
|
|
|
*
|
|
|
- * @param id
|
|
|
- * @param tableTemplateItemList
|
|
|
+ * @param tableTemplate
|
|
|
*/
|
|
|
- public void manualReport(Integer id, List<TableTemplateTableItem> tableTemplateItemList, List<TableTemplateChart> tableTemplateChartList) {
|
|
|
+ public void manualReport(TableTemplate tableTemplate) {
|
|
|
+ Integer tableTemplateId = tableTemplate.getId();
|
|
|
+ List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
|
|
|
+ List<TableTemplateChart> tableTemplateChartList = tableTemplate.getTableTemplateChartList();
|
|
|
+
|
|
|
+ //根据模板生成相应的报表
|
|
|
+ ReportTable reportTable = new ReportTable(
|
|
|
+ tableTemplate.getTemplateType(), tableTemplateId, tableTemplate.getUserId(), tableTemplate.getTemplateName(),
|
|
|
+ tableTemplate.getTemplateData(), ConstantStr.DEFAULT_VERSION, tableTemplate.getCreateTime()
|
|
|
+ );
|
|
|
+ if (reportTableDao.addReportTable(reportTable) <= 0) {
|
|
|
+ throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "生成数据报表失败");
|
|
|
+ }
|
|
|
+ Integer reportTableId = reportTable.getId();
|
|
|
+
|
|
|
+ //保存模板表格相关的数据项信息,以及报表表格相关的信息
|
|
|
if (Blank.isNotEmpty(tableTemplateItemList)) {
|
|
|
List<ReportTableItem> reportTableItemList = new ArrayList<>();
|
|
|
for (TableTemplateTableItem t : tableTemplateItemList) {
|
|
|
- Integer itemGroupId = t.getItemGroupId();
|
|
|
- if (Blank.isEmpty(itemGroupId)) {
|
|
|
+ if (Blank.isEmpty(t.getItemId(), t.getPlaceHolder(), t.getXaxis(), t.getYaxis())) {
|
|
|
+ throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据项、占位符、横、纵坐标都不能为空");
|
|
|
+ }
|
|
|
+ t.setTableTemplateId(tableTemplateId);
|
|
|
+ if (Blank.isEmpty(t.getItemGroupId())) {
|
|
|
continue;
|
|
|
}
|
|
|
- Integer itemId = t.getItemId();
|
|
|
- Integer xaxis = t.getXaxis();
|
|
|
- Integer yaxis = t.getYaxis();
|
|
|
- String standby = t.getStandby();
|
|
|
+ //根据模板的数据项信息,生成报表数据项信息
|
|
|
reportTableItemList.add(new ReportTableItem(
|
|
|
- id, itemId, xaxis, yaxis, standby, null, null, null
|
|
|
+ reportTableId, t.getItemId(), t.getValueType(), t.getXaxis(), t.getYaxis(), t.getStandby(), null, null, null
|
|
|
));
|
|
|
}
|
|
|
+ //添加报表数据项信息
|
|
|
if (Blank.isNotEmpty(reportTableItemList)) {
|
|
|
reportTableDao.addReportTableItemList(reportTableItemList);
|
|
|
}
|
|
|
+ //添加模板数据项信息
|
|
|
+ reportTableDao.addTableTemplateItem(tableTemplateItemList);
|
|
|
}
|
|
|
+ //保存模板统计图相关的数据项信息,以及报表统计图相关的信息
|
|
|
if (Blank.isNotEmpty(tableTemplateChartList)) {
|
|
|
+ //遍历模板中的所有统计图
|
|
|
for (TableTemplateChart ttc : tableTemplateChartList) {
|
|
|
- ReportChart reportChart = new ReportChart(id, ttc.getChartType(), ttc.getChartName(), ttc.getStandby());
|
|
|
+ if (Blank.isEmpty(ttc.getChartType(), ttc.getChartName(), ttc.getValueTakingMode(),
|
|
|
+ ttc.getBucketType(), ttc.getBucketValue())) {
|
|
|
+ throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "统计图类型、名称、取值模式、时段类型、时段值不能为空");
|
|
|
+ }
|
|
|
+ ttc.setTableTemplateId(tableTemplateId);
|
|
|
+ //添加模板中的统计图
|
|
|
+ reportTableDao.addTableTemplateChart(ttc);
|
|
|
+ //根据模板中的统计图生成相应的报表统计图,并添加
|
|
|
+ ReportChart reportChart = new ReportChart(
|
|
|
+ reportTableId, ttc.getChartType(), ttc.getChartName(), ttc.getValueType(), ttc.getStandby()
|
|
|
+ );
|
|
|
reportTableDao.addReportChart(reportChart);
|
|
|
Integer reportChartId = reportChart.getId();
|
|
|
- List<TableTemplateChartItem> tableTemplateChartItemList = ttc.getTableTemplateChartItemList();
|
|
|
- List<ReportChartItem> reportChartItemList = new ArrayList<>();
|
|
|
- for (int i = 0; i < tableTemplateChartItemList.size(); i++) {
|
|
|
- TableTemplateChartItem tableTemplateChartItem = tableTemplateChartItemList.get(i);
|
|
|
- reportChartItemList.add(new ReportChartItem(
|
|
|
- reportChartId, tableTemplateChartItem.getItemId(), null, null, null
|
|
|
- ));
|
|
|
+ //获取模板统计图中的数据项信息
|
|
|
+ List<TableTemplateChartItem> ttciList = ttc.getTableTemplateChartItemList();
|
|
|
+ if (Blank.isNotEmpty(ttciList)) {
|
|
|
+ List<ReportChartItem> reportChartItemList = new ArrayList<>();
|
|
|
+ for (int i = 0; i < ttciList.size(); i++) {
|
|
|
+ TableTemplateChartItem ttci = ttciList.get(i);
|
|
|
+ //根据模板中的统计图中的数据项生成相应的报表统计图数据项
|
|
|
+ ReportChartItem reportChartItem = new ReportChartItem(
|
|
|
+ reportChartId, ttci.getItemId(), null, null, null
|
|
|
+ );
|
|
|
+ reportChartItemList.add(reportChartItem);
|
|
|
+ }
|
|
|
+ //添加报表统计图相关的数据项
|
|
|
+ if (Blank.isNotEmpty(reportChartItemList)) {
|
|
|
+ reportTableDao.addReportChartItem(reportChartItemList);
|
|
|
+ }
|
|
|
+ //添加模板统计图相关的数据项
|
|
|
+ reportTableDao.addTableTemplateChartItem(ttc.getId(), ttciList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自动报表模板新增,保存相应的数据项信息,生成相应的报表
|
|
|
+ *
|
|
|
+ * @param tableTemplate
|
|
|
+ */
|
|
|
+ public void autoReport(TableTemplate tableTemplate) {
|
|
|
+ Integer tableTemplateId = tableTemplate.getId();
|
|
|
+ List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
|
|
|
+ List<TableTemplateChart> tableTemplateChartList = tableTemplate.getTableTemplateChartList();
|
|
|
+
|
|
|
+ //根据模板生成相应的报表
|
|
|
+ ReportTable reportTable = new ReportTable(
|
|
|
+ tableTemplate.getTemplateType(), tableTemplateId, tableTemplate.getUserId(), tableTemplate.getTemplateName(),
|
|
|
+ tableTemplate.getTemplateData(), ConstantStr.DEFAULT_VERSION, tableTemplate.getCreateTime()
|
|
|
+ );
|
|
|
+ if (reportTableDao.addReportTable(reportTable) <= 0) {
|
|
|
+ throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "生成数据报表失败");
|
|
|
+ }
|
|
|
+ Integer reportTableId = reportTable.getId();
|
|
|
+
|
|
|
+ if (Blank.isNotEmpty(tableTemplateItemList)) {
|
|
|
+ for (TableTemplateTableItem t : tableTemplateItemList) {
|
|
|
+ t.setTableTemplateId(tableTemplateId);
|
|
|
+ if (Blank.isEmpty(t.getItemId(), t.getPlaceHolder(), t.getXaxis(), t.getYaxis(), t.getValueTakingMode(), t.getBucketType(), t.getBucketValue())) {
|
|
|
+ throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据项、占位符、横、纵坐标、取值模式、时段类型、值都不能为空");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //自动报表只需要添加模板的数据项信息,定时器执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
|
|
|
+ reportTableDao.addTableTemplateItem(tableTemplateItemList);
|
|
|
+ if (Blank.isNotEmpty(tableTemplateChartList)) {
|
|
|
+ for (TableTemplateChart ttc : tableTemplateChartList) {
|
|
|
+ if (Blank.isEmpty(ttc.getChartType(), ttc.getChartName(), ttc.getValueTakingMode(),
|
|
|
+ ttc.getBucketType(), ttc.getBucketValue())) {
|
|
|
+ throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "统计图类型、名称、取值模式、时段类型、时段值不能为空");
|
|
|
+ }
|
|
|
+ ttc.setTableTemplateId(tableTemplateId);
|
|
|
+ //添加模板中的统计图
|
|
|
+ reportTableDao.addTableTemplateChart(ttc);
|
|
|
+ //根据模板中的统计图生成相应的报表统计图,并添加
|
|
|
+ ReportChart reportChart = new ReportChart(
|
|
|
+ reportTableId, ttc.getChartType(), ttc.getChartName(), ttc.getValueType(), ttc.getStandby()
|
|
|
+ );
|
|
|
+ reportTableDao.addReportChart(reportChart);
|
|
|
+ //获取模板统计图中的数据项信息
|
|
|
+ List<TableTemplateChartItem> ttciList = ttc.getTableTemplateChartItemList();
|
|
|
+ if (Blank.isNotEmpty(ttciList)) {
|
|
|
+ reportTableDao.addTableTemplateChartItem(ttc.getId(), ttciList);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 事件驱动报表模板新增,保存相应的数据项信息,生成相应的报表(事件驱动报表不存在统计图)
|
|
|
+ *
|
|
|
+ * @param tableTemplate
|
|
|
+ */
|
|
|
+ public void eventReport(TableTemplate tableTemplate) {
|
|
|
+ Integer tableTemplateId = tableTemplate.getId();
|
|
|
+ List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
|
|
|
+ Integer eventNum = tableTemplate.getEventNum();
|
|
|
+ if (Blank.isEmpty(eventNum)) {
|
|
|
+ throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动显示数量设置不能为空");
|
|
|
+ }
|
|
|
+
|
|
|
+ //根据模板生成相应的报表
|
|
|
+ ReportTable reportTable = new ReportTable(
|
|
|
+ tableTemplate.getTemplateType(), tableTemplateId, tableTemplate.getUserId(), tableTemplate.getTemplateName(),
|
|
|
+ tableTemplate.getTemplateData(), eventNum, ConstantStr.DEFAULT_VERSION, tableTemplate.getCreateTime()
|
|
|
+ );
|
|
|
+ if (reportTableDao.addReportTable(reportTable) <= 0) {
|
|
|
+ throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "生成数据报表失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (Blank.isNotEmpty(tableTemplateItemList)) {
|
|
|
+ for (TableTemplateTableItem t : tableTemplateItemList) {
|
|
|
+ t.setTableTemplateId(tableTemplateId);
|
|
|
+ if (Blank.isEmpty(t.getItemId(), t.getPlaceHolder(), t.getXaxis(), t.getYaxis())) {
|
|
|
+ throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "数据项、占位符、横、纵坐标都不能为空");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
|
|
|
+ reportTableDao.addTableTemplateItem(tableTemplateItemList);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据报表获取手动报表相关的实时数据
|
|
|
+ *
|
|
|
+ * @param reportTable
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Result manualReportReal(ReportTable reportTable) {
|
|
|
+ Integer reportTableId = reportTable.getId();
|
|
|
+ //获取手动报表相关的表格数据项信息
|
|
|
+ List<ReportTableItem> reportTableItemList = reportTableDao.getTableItemListById(reportTableId);
|
|
|
+ //获取手动报表相关的统计图以及统计图数据项信息
|
|
|
+ List<ReportChart> reportChartList = reportTableDao.getReportChartList(reportTableId);
|
|
|
+ //获取手动报表所有表格数据项和统计图的数据源信息
|
|
|
+ List<DataSource> tableDataSourceList = reportTableDao.getReportDataSource(reportTableId);
|
|
|
+ if (Blank.isNotEmpty(tableDataSourceList)) {
|
|
|
+ for (DataSource dataSource : tableDataSourceList) {
|
|
|
+ if (Blank.isEmpty(dataSource.getIpPassword())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ dataSource = DataSource.convertPassword(dataSource);
|
|
|
+ //查看手动报表中的数据项,哪些是属于这个数据源的
|
|
|
+ DataSourceType dataSourceType = dataSourceDao.getDataSourceTypeById(dataSource.getTypeId());
|
|
|
+ //如果数据源是OpcUa则转接到OpcUa读取数据,并通过json返回
|
|
|
+ if (OpcUtil.isOpcUa(dataSourceType.getDataSourceTypeKey())) {
|
|
|
+ JSONObject[] jsonObjects = restTemplate.postForObject(opcUaUrl + "/reportTable/getReportTableById/" + reportTableId, new HttpEntity<>(dataSource, new HttpHeaders()), JSONObject[].class);
|
|
|
+ if (jsonObjects != null) {
|
|
|
+ for (JSONObject jsonObject : jsonObjects) {
|
|
|
+ Integer itemId = jsonObject.getInteger("itemId");
|
|
|
+ for (int i = 0; i < reportTableItemList.size(); i++) {
|
|
|
+ ReportTableItem reportTableItem = reportTableItemList.get(i);
|
|
|
+ if (itemId.equals(reportTableItem.getItemId())) {
|
|
|
+ reportTableItemList.get(i).setValueList(
|
|
|
+ jsonObject.getString(reportTableItem.getValueType().equals(ConstantStr.CALCULATED_VALUE) ? "dataValue" : "dataOrgValue")
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (OpcUtil.isOpcDa(dataSourceType.getDataSourceTypeKey())) {
|
|
|
+ //获取这个数据源下,报表和统计图的所有数据项
|
|
|
+ List<Item> itemList = reportTableDao.getItemListByDataSource(reportTableId, dataSource);
|
|
|
+ List<String> itemReadNameList = new ArrayList<>();
|
|
|
+ for (Item item : itemList) {
|
|
|
+ itemReadNameList.add(item.getItemReadName());
|
|
|
+ }
|
|
|
+ String[] items = itemReadNameList.toArray(new String[]{});
|
|
|
+ List<DataModel> dataModelList = dataModelDao.getDmListByItemList(itemList);
|
|
|
+ Map<String, DataModel> map = DataModel.genMap(itemList, dataModelList);
|
|
|
+ //读取同一个opcDa数据源下,所有项的实时数据
|
|
|
+ List<JSONObject> jsonObjects = manualReportReadReal(dataSource, items, map);
|
|
|
+ for (JSONObject jsonObject : jsonObjects) {
|
|
|
+ String itemReadName = jsonObject.getString("itemReadName");
|
|
|
+ for (int i = 0; i < itemList.size(); i++) {
|
|
|
+ Item item = itemList.get(i);
|
|
|
+ if (itemReadName.equals(item.getItemReadName())) {
|
|
|
+ Integer itemId = item.getId();
|
|
|
+ if (Blank.isNotEmpty(reportTableItemList)) {
|
|
|
+ for (int j = 0; j < reportTableItemList.size(); j++) {
|
|
|
+ ReportTableItem reportTableItem = reportTableItemList.get(j);
|
|
|
+ if (itemId.equals(reportTableItem.getItemId())) {
|
|
|
+ reportTableItemList.get(j).setValueList(
|
|
|
+ jsonObject.getString(reportTableItem.getValueType().equals(ConstantStr.CALCULATED_VALUE) ? "dataValue" : "dataOrgValue")
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (Blank.isNotEmpty(reportChartList)) {
|
|
|
+ for (int j = 0; j < reportChartList.size(); j++) {
|
|
|
+ ReportChart reportChart = reportChartList.get(j);
|
|
|
+ boolean flage = (reportChart.getValueType()).equals(ConstantStr.CALCULATED_VALUE);
|
|
|
+ List<ReportChartItem> reportChartItemList = reportChart.getReportChartItemList();
|
|
|
+ if (Blank.isNotEmpty(reportChartItemList)) {
|
|
|
+ for (int k = 0; k < reportChartItemList.size(); k++) {
|
|
|
+ ReportChartItem reportChartItem = reportChartItemList.get(k);
|
|
|
+ if (itemId.equals(reportChartItem.getItemId())) {
|
|
|
+ reportChartItemList.get(k).setValueList(
|
|
|
+ jsonObject.getString(flage ? "dataValue" : "dataOrgValue")
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- reportTableDao.addReportChartItem(reportChartItemList);
|
|
|
}
|
|
|
}
|
|
|
+ reportTable.setReportTableItemList(reportTableItemList);
|
|
|
+ reportTable.setReportChartList(reportChartList);
|
|
|
+ return Result.ok(reportTable);
|
|
|
}
|
|
|
|
|
|
- public static List<JSONObject> manualReportReal(DataSource dataSource, String[] items, Map<String, DataModel> dmMap) {
|
|
|
+ /**
|
|
|
+ * 读取同一个opcDa数据源下,所有项的实时数据
|
|
|
+ *
|
|
|
+ * @param dataSource
|
|
|
+ * @param items
|
|
|
+ * @param dmMap
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static List<JSONObject> manualReportReadReal(DataSource dataSource, String[] items, Map<String, DataModel> dmMap) {
|
|
|
Server server = null;
|
|
|
try {
|
|
|
server = OpcDaUtil.createServer(dataSource);
|
|
@@ -155,6 +397,7 @@ public class ReportTableTask {
|
|
|
}
|
|
|
List<TableTemplateTableItem> tableTemplateItemList = reportTableDao.getTtiDataByTemplateId(tableTemplateId);
|
|
|
Date date = new Date();
|
|
|
+ //生成一张新的子报表,并添加相应的日志,以及用户组授权
|
|
|
ReportTable reportTable1 = new ReportTable(
|
|
|
ConstantStr.AUTOMATIC_GENERATE_REPORT, tableTemplateId, reportTable.getUserId(),
|
|
|
reportTable.getReportTableName() + "_" + DateUtil.dateChangeStr(date, "yyyyMMddHHmmss"),
|
|
@@ -167,11 +410,12 @@ public class ReportTableTask {
|
|
|
if (Blank.isNotEmpty(reportTable.getUserGroupList())) {
|
|
|
reportTableDao.addTableUserGroup(reportTable1.getId(), reportTable.getUserGroupList());
|
|
|
}
|
|
|
- //加载相应的数据
|
|
|
+ //根据报表的cron和开始、结束时间,生成此次执行报表抓取数据的开始时间和结束时间
|
|
|
String cron = reportTable.getCron();
|
|
|
Date startTime = CronUtil.mappingTime(cron, reportTable.getStartTime());
|
|
|
Date endTime = CronUtil.mappingTime(cron, reportTable.getEndTime());
|
|
|
Integer id = reportTable1.getId();
|
|
|
+ //根据模板的取值条件获取相应的数据
|
|
|
if (Blank.isNotEmpty(tableTemplateItemList)) {
|
|
|
for (TableTemplateTableItem t : tableTemplateItemList) {
|
|
|
Integer itemGroupId = t.getItemGroupId();
|