Bläddra i källkod

Merge branch 'master' of http://116.63.33.55/git/read_opc into master

lhy 1 år sedan
förälder
incheckning
957369bc70

+ 5 - 4
chuanyi_client2/src/components/CustomDialog/DataSourceItem.vue

@@ -514,11 +514,11 @@ export default {
     /** 懒加载数据组数据项查询 */
     loadGroupDataItemNode(node, resolve) {
       if (node.level === 0) {
-          setTimeout(() => {
-              this.getDataItemByDataSource()
-          }, 200)
+          // setTimeout(() => {
+          //     this.getDataItemByDataSource()
+          // }, 200)
 
-        //   return resolve(this.itemDataListByTree)
+          // return resolve(this.itemDataListByTree)
       }
       let itemNames = []
       extractDataItemValues(node, itemNames)
@@ -528,6 +528,7 @@ export default {
       if (node.childNodes && node.childNodes.length > 0) {
           return;
       }
+	  
       getNextAllItem(dataSourceId, itemName).then(res => {
         if (!res.data) {
           resolve([])

+ 24 - 8
chuanyi_client2/src/utils/luckysheettool.js

@@ -43,7 +43,8 @@ export function insertLuckysheetEChart({
         y = 0,
         g = [],
         h = [];
-    if (a.mc) {
+		console.log(a)
+    if (a && a.mc) {
         if (!String(a.mc.cs) || !String(a.mc.rs)) {
             if (_self) {
                 _self.$message({
@@ -74,6 +75,7 @@ export function insertLuckysheetEChart({
     n('.'+u).mousedown(function(){return false});
     let S = r.init(document.getElementsByClassName(u)[0]);
     f.animation = false;
+	// 图例为空时,从数据组series中获取名称
 	if (!f.legend.data || f.legend.data.length == 0 || !f.legend.data[0]) {
 		let arr = []
 		 for (let nn = 0; nn < f.series.length; nn++) {
@@ -81,6 +83,7 @@ export function insertLuckysheetEChart({
 		 }
 		 f.legend.data = arr
 	}
+	// 动态获取图例所占高度
 	const height = getLegendHeight(j, f.legend.data)
 	console.log(height)
 	f.grid.bottom = height + 80
@@ -249,7 +252,7 @@ function initArrays(tableItemList, type, isGenCountTime, sheData) {
     }
     let aIndex = isGenCountTime == 1 ? 1: 0;
     let array = []
-    console.log(sheData)
+    let index = -1, st = -1, et = -1;
     for (var i = 0; i < sheData.length; i++) {
         let row = sheData[i]
         for (var j = 0; j < row.length; j++) {
@@ -265,18 +268,31 @@ function initArrays(tableItemList, type, isGenCountTime, sheData) {
                     }
                 } else if (type == 5 || type == 6) {
                     if (i >= yAdd) {
-                       if (j == xAdd - 3 - aIndex) {
+						if (index == -1) {
+							if (row[j] + '' == '${index}' || row[j].v == '${index}') {
+								index = j;
+							}
+						} else if (st == -1) {
+							if (row[j] + '' == '${startTime}' || row[j].v == '${startTime}') {
+								st = j;
+							}
+						} else if (et == -1) {
+							if (row[j] + '' == '${stopTime}' || row[j].v == '${stopTime}') {
+								et = j;
+							}
+						} 
+                       if (j == index) {
                            // 序号列
                            row[j] = (i - yAdd < startTimes.length ? i - yAdd + 1 : "")
-                       } else if (j == xAdd - 2 - aIndex) {
+                       } else if (j == st) {
                            // 开始时间
                            row[j] = (i - yAdd < startTimes.length ? startTimes[i - yAdd] : "")
-                       } else if (j == xAdd - 1 - aIndex) {
-                           // 开始时间
+                       } else if (j == et) {
+                           // 停止时间
                            row[j] = (i - yAdd < endTimes.length ? endTimes[i - yAdd] : "")
-                       } else if(isGenCountTime == 1 && j == xAdd - 1 && row[j - 2] && row[j - 1]) {
+                       } else if(isGenCountTime == 1 && j == et + 1 && row[st] && row[et]) {
                            // 计算时间
-                          const time = calculateMinutes(row[j - 2], row[j - 1]);
+                          const time = calculateMinutes(row[st], row[et]);
                            row[j] = (time)
                        } else {
                            row[j] = changeValStr(row[j])

+ 118 - 16
chuanyi_client2/src/views/report_template/index.vue

@@ -62,6 +62,10 @@
           <svg-icon icon-class="report_data" style="width: 35px;"/>
           <span>数据项</span>
         </div>
+		<div class="cy-chart-div" @click="updateDataEvent()" v-if="templateReportType != 5">
+		  <svg-icon icon-class="report_data" style="width: 35px;"/>
+		  <span>修改策略</span>
+		</div>
         <div class="cy-chart-div" @click="barEvent('bar')" v-if="templateReportType != 2 && templateReportType != 5">
           <svg-icon icon-class="bar_chart"/>
           <span>柱状图</span>
@@ -412,8 +416,9 @@
         :append-to-body="true">
       <div style="height: 60vh; overflow: auto;">
         <div>
-          <label>数据组:</label>
+          <label v-if="templateReportType != 2 || (!isUpdateShow && templateReportType == 2)">数据组:</label>
           <el-select filterable
+		  v-if="templateReportType != 2 || (!isUpdateShow && templateReportType == 2)"
                      v-model="chooseDataGroup"
                      @change="getGroupById"
                      placeholder="请选择数据组"
@@ -437,7 +442,7 @@
 <!--                :value="dict.value"-->
 <!--            ></el-option>-->
 <!--          </el-select>-->
-          <el-button size="mini" @click="addDataItem" style="width: 100px;margin-top: 4px; margin-left: 10px;">
+          <el-button v-if="templateReportType != 2 || (!isUpdateShow && templateReportType == 2)" size="mini" @click="addDataItem" style="width: 100px;margin-top: 4px; margin-left: 10px;">
             选择数据项
           </el-button>
           <template v-if="!hasBelongDataFlag">
@@ -820,6 +825,7 @@ export default {
   },
   data() {
     return {
+		isUpdateShow: false,
       newItemId: 0,
       ctrlxstatus: false,
       sheetAxis: [],
@@ -1246,7 +1252,7 @@ export default {
               })
             } else {
               _this.selectionDataItems.forEach((item) => {
-                if (item.checked) {
+                if (item.checked || item.isFlag == 'update') {
                   _this.chooseGroupItemList.forEach((data) => {
                     if (data.id === item.id) {
                       _this.setDataCondition(data)
@@ -1791,6 +1797,8 @@ export default {
       //   chooseList.push(checkedNode)
       // }
       // this.chooseItemData = chooseList
+	  console.log(this.chooseItemData)
+	  console.log(_temp)
       this.chooseItemData = _temp
       this.dialogDataItemVisible = false
       if (this.dialogGroupItemVisible) {
@@ -1834,9 +1842,11 @@ export default {
           break
         }
       }
-      this.chooseGroupItemList = this.chooseGroupItemList.filter(function (item, index) {
-        return item.itemGroupId != group.id;
-      })
+	  if (!this.isUpdateShow) {
+		  this.chooseGroupItemList = this.chooseGroupItemList.filter(function (item, index) {
+			return item.itemGroupId != group.id;
+		  })
+	  }
 
       for (let j = 0; j < this.chooseItemData.length; j++) {
         this.chooseItemData[j].groupName = group.groupName
@@ -2024,6 +2034,7 @@ export default {
     },
     /** 数据项 */
     dataEvent(type) {
+		this.isUpdateShow = false
       let rangeWithFlatten = luckysheet.getRangeWithFlatten()
       if (!rangeWithFlatten || rangeWithFlatten.length != 1) {
         showAlertMsgWin(this, null, '请选择一项单元格!')
@@ -2179,9 +2190,14 @@ export default {
               // name = name.substring(name.lastIndexOf('.') + 1)
               let v = '${' + groupId + '.' + name + '}'
 			  if (item.itemReadName) {
-				  v = '${' + groupId + '.' + item.itemReadName + '}'
+				  v = '${' + item.dataSourceName + '.' + item.itemReadName + '}'
+          // v = item.dataSourceName + "." + item.itemReadName
+			  }
+			  if (!item.placeHolder) {
+				item.placeHolder = v
+			  } else {
+				  v = item.placeHolder
 			  }
-              item.placeHolder = v
               item.standby = JSON.stringify({
                   'index': n,
                   'fieldType': this.itemShowParams.fieldType
@@ -2288,6 +2304,7 @@ export default {
     },
     /** 向数据表格增加数据(重复判断) */
     pushToItemTable(item) {
+		console.log(item)
       let itemInfo = {
         'itemId': item.id,
         'isDriverItem': item.isDriverItem,
@@ -2298,8 +2315,21 @@ export default {
         'bucketType': item.bucketType,
         'valueType': item.valueType,
         'bucketValue': item.bucketValue,
-        'standby': item.standby
-      }
+        'standby': item.standby,
+		'itemName': item.itemName,
+		'itemReadName': item.itemReadName,
+		'dataSourceName': item.dataSourceName,
+		'itemGroupId': item.itemGroupId,
+		'itemType': item.itemType,
+		'checked': item.checked
+      }
+	  if (item.dataSourceId) {
+		  itemInfo.dataSourceId = item.dataSourceId
+	  }
+	  if (item.itemId) {
+		  itemInfo.itemId = item.itemId
+	  }
+	  
       itemInfo.startTime = null
       itemInfo.endTime = null
       // 当前是手动报表
@@ -2329,9 +2359,19 @@ export default {
         // let v = luckysheet.getCellValue(info.xaxis, info.yaxis)
           let v = sheetData[info.xaxis][info.yaxis]
         console.log(v, info.placeHolder)
-        if (v != info.placeHolder) {
-          this.toolItemTable.splice(i, 1)
-        }
+		if (v) {
+			if ((v + "") != info.placeHolder) {
+				if (v.v) {
+					if (v.v != info.placeHolder) {
+						this.toolItemTable.splice(i, 1)
+					}
+				} else {
+					this.toolItemTable.splice(i, 1)
+				}
+			}
+		} else {
+			this.toolItemTable.splice(i, 1)
+		}
       }
     },
     uniqueFunc(arr, uniId) {
@@ -2409,7 +2449,7 @@ export default {
           left: 'center'
         },
 		grid: {
-			
+
 		},
         tooltip: {
 			top: 0
@@ -2843,7 +2883,69 @@ export default {
     closeMenu() {
       this.visibleChartMenu = false
     },
-
+	updateDataEvent() {
+      let rangeWithFlatten = luckysheet.getRangeWithFlatten()
+      if (!rangeWithFlatten) {
+        showAlertMsgWin(this, null, '请选择要修改的数据项!')
+        return
+      }
+	  const sheetData = luckysheet.getSheet(0).data
+	  let flattenObj = {}
+	  let status = false;
+	  for (let i = 0; i < rangeWithFlatten.length; i++) {
+		const val = sheetData[rangeWithFlatten[i].r][rangeWithFlatten[i].c]
+		if (!status) {
+			if (val) {
+				status = true;
+			}
+		}
+		
+	  	flattenObj[rangeWithFlatten[i].c + "_" + rangeWithFlatten[i].r] = val
+	  }
+	  console.log(flattenObj)
+	  if (!status) {
+		  showAlertMsgWin(this, null, '选择区域未包含有效数据项!')
+		  return
+	  }
+	  const items = this.toolItemTable;
+	  let arr = []
+	  for (let i = 0; i < items.length; i++) {
+	  	const key = items[i].yaxis + "_" + items[i].xaxis
+		if (flattenObj[key]) {
+			items[i].isFlag = 'update'
+			arr.push(items[i])
+		}
+	  }
+	  if (!arr.length) {
+		  showAlertMsgWin(this, null, '选择区域未包含有效数据项!')
+		  return
+	  }
+	  console.log(arr)
+	  this.chooseGroupItemList = arr
+	  this.isUpdateShow = true
+	  // 初始化数据显示方式
+	  this.itemShowParams = {
+	    fieldType: '1',
+	    valType: '2',
+	    valLine: 1,
+	    dataId: new Date().getTime()
+	  }
+	  this.deviceReportCondition = {
+	    type: null,
+	    variableType: '1',
+	    isGenCountTime: '0',
+	    startItemId: null,
+	    startItemName: null,
+	    startValue: '',
+	    endItemId: null,
+	    endItemName: null,
+	    endValue: ''
+	  }
+	  this.getDataGroupList()
+	  this.hasBelongDataFlag = false
+	  // this.chooseDataGroup = null
+	  this.dialogGroupItemVisible = true
+    },
   }
 }
 </script>
@@ -2873,7 +2975,7 @@ export default {
 }
 
 .cy-div2 {
-  width: 60px;
+  width: 70px;
   height: 100%;
   z-index: 1;
   background: #2c3e50;

+ 6 - 6
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/controller/ReportTableController.java

@@ -80,12 +80,12 @@ public class ReportTableController {
     @PostMapping("/updateTableTemplate")
 //    @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.TABLETEMPLATE, OperationEnum = OperationEnum.UPDATE)
     public Result updateTableTemplate(@RequestBody TableTemplate tableTemplate) {
-        return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "报表模板目前不支持修改");
-//        if (Blank.isEmpty(tableTemplate, tableTemplate.getId(), tableTemplate.getTemplateName(),
-//                tableTemplate.getTemplateData(), tableTemplate.getVersion())) {
-//            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "模板id、名称、取值类型、数据、版本不能为空");
-//        }
-//        return reportTableService.updateTableTemplate(tableTemplate);
+//        return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "报表模板目前不支持修改");
+        if (Blank.isEmpty(tableTemplate, tableTemplate.getId(), tableTemplate.getTemplateName(),
+                tableTemplate.getTemplateData(), tableTemplate.getVersion())) {
+            return Result.no(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "模板id、名称、取值类型、数据、版本不能为空");
+        }
+        return reportTableService.updateTableTemplate(tableTemplate);
     }
 
     /**

+ 11 - 1
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/dao/ReportTableDao.java

@@ -43,6 +43,9 @@ public interface ReportTableDao {
     //修改报表
     Integer updateReportTable(ReportTable reportTable);
 
+    //通过报表id修改报表的data数据
+    Integer updateReportTableDataById(String tableId, String reportTableData);
+
     //获取所有报表
     List<ReportTable> getAllReportTable(Long startNum, Long limitNum, String userId, Integer isAutoReport);
 
@@ -118,7 +121,8 @@ public interface ReportTableDao {
     //通过子报表id删除相应的日志记录
     Integer delAutoChLog(String autoChTableId);
 
-    Integer addTableTemplateItem(List<TableTemplateTableItem> tableTemplateTableItemList);
+    //添加模板的表格数据项信息
+    Integer addTableTemplateTableItem(List<TableTemplateTableItem> tableTemplateTableItemList);
 
     //根据报表模板id,获取报表模板表格数据项的详细信息
     List<TableTemplateTableItem> getTttiByTemplateId(Integer tableTemplateId);
@@ -132,9 +136,15 @@ public interface ReportTableDao {
 
     List<String> getTableByItemId(List<Item> itemList, Integer reportTableType);
 
+    //获取同版本的最早创建的一条子报表id
+    String getChTableIdByVersion(String tableId,Integer version);
+
     //查询主表最新一条子表
     String getEventChTableId(String tableId);
 
+    //查询主表第二新的子表
+    String getSecondChTableId(String tableId);
+
     Integer updateReportTableNum(String id, Integer currentNum);
 
     ReportTableItem getReportTableItem(String tableId, Integer itemId, Integer timeItemType);

+ 56 - 9
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/service/impl/ReportTableServiceImpl.java

@@ -131,6 +131,14 @@ public class ReportTableServiceImpl implements ReportTableService {
         if (reportTableDao.updateTableTemplate(tableTemplate) <= 0) {
             return Result.no(ResultEnum.SERVER_ERROR.getRespCode(), "修改报表模板失败");
         }
+        if (Blank.isNotEmpty(reportTable)) {
+            Integer runState = reportTable.getRunState();
+            if (Blank.isNotEmpty(runState)) {
+                if (runState != ConstantStr.STOP_IT) {
+                    throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "报表处于运行中,报表模板不允许被修改,请先停止运行报表");
+                }
+            }
+        }
         if (templateType.equals(ConstantStr.MANUAL_REPORT)) {
             reportTableTask.updateManualReport(tableTemplate, reportTable);
         } else if (templateType.equals(ConstantStr.AUTOMATIC_REPORT)) {
@@ -303,9 +311,17 @@ public class ReportTableServiceImpl implements ReportTableService {
             return Result.ok(reportTableTask.getAutoReport(reportTable));
             //如果是自动报表子表
         } else if (reportTableType.equals(ConstantStr.AUTOMATIC_GENERATE_REPORT)) {
-            //获取到主报表的数据,子报表使用主报表的reportTableData
+            //获取到主报表的数据
             ReportTable mainReportTable = reportTableDao.getMainTableBychTableId(id);
-            reportTable.setReportTableData(mainReportTable.getReportTableData());
+            //如果版本和主报表版本一致,则直接获取主报表的reportTableData
+            //如果不一致,则获取版本号一样的子报表最早的一条数据
+            if (reportTable.getVersion() == mainReportTable.getVersion()) {
+                reportTable.setReportTableData(mainReportTable.getReportTableData());
+            } else {
+                String chOrgTableId = reportTableDao.getChTableIdByVersion(mainReportTable.getId(), reportTable.getVersion());
+                ReportTable chOrgReportTable = reportTableDao.getReportTableById(chOrgTableId);
+                reportTable.setReportTableData(chOrgReportTable.getReportTableData());
+            }
             reportTable.setReportTableItemList(reportTableDao.getTableItemListById(id));
             reportTable.setReportChartList(reportTableDao.getReportChartList(id));
             reportTable.setUserGroupList(reportTableDao.getTableUserGroup(id));
@@ -327,9 +343,17 @@ public class ReportTableServiceImpl implements ReportTableService {
             reportTable.setReportTableItemList(reportTableItemList);
             //如果是事件驱动报表子表
         } else if (reportTableType.equals(ConstantStr.EVENT_GENERATE_REPORT)) {
-            //获取到主报表的数据,子报表使用主报表的reportTableData
+            //获取到主报表的数据
             ReportTable mainReportTable = reportTableDao.getMainTableBychTableId(id);
-            reportTable.setReportTableData(mainReportTable.getReportTableData());
+            //如果版本和主报表版本一致,则直接获取主报表的reportTableData
+            //如果不一致,则获取版本号一样的子报表最早的一条数据
+            if (reportTable.getVersion() == mainReportTable.getVersion()) {
+                reportTable.setReportTableData(mainReportTable.getReportTableData());
+            } else {
+                String chOrgTableId = reportTableDao.getChTableIdByVersion(mainReportTable.getId(), reportTable.getVersion());
+                ReportTable chOrgReportTable = reportTableDao.getReportTableById(chOrgTableId);
+                reportTable.setReportTableData(chOrgReportTable.getReportTableData());
+            }
             reportTable.setReportTableItemList(reportTableDao.getTableItemListById(id));
             reportTable.setUserGroupList(reportTableDao.getTableUserGroup(id));
             return Result.ok(reportTable);
@@ -365,13 +389,23 @@ public class ReportTableServiceImpl implements ReportTableService {
             }
             String chTableId = reportTableDao.getEventChTableId(id);
             reportTable.setReportTableItemList(reportTableDao.getTableItemListById(chTableId));
+            reportTable.setUserGroupList(reportTableDao.getTableUserGroup(id));
             ///如果是设备报表子表
         } else if (reportTableType.equals(ConstantStr.DEVICE_GENERATE_REPORT)) {
-            //获取到主报表的数据,子报表使用主报表的reportTableData
+            ///获取到主报表的数据
             ReportTable mainReportTable = reportTableDao.getMainTableBychTableId(id);
-            reportTable.setReportTableData(mainReportTable.getReportTableData());
+            //如果版本和主报表版本一致,则直接获取主报表的reportTableData
+            //如果不一致,则获取版本号一样的子报表最早的一条数据
+            if (reportTable.getVersion() == mainReportTable.getVersion()) {
+                reportTable.setReportTableData(mainReportTable.getReportTableData());
+            } else {
+                String chOrgTableId = reportTableDao.getChTableIdByVersion(mainReportTable.getId(), reportTable.getVersion());
+                ReportTable chOrgReportTable = reportTableDao.getReportTableById(chOrgTableId);
+                reportTable.setReportTableData(chOrgReportTable.getReportTableData());
+            }
             List<ReportTableItem> reportTableItemList1 = reportTableDao.getTableItemListById(id);
             reportTable.setReportTableItemList(reportTableItemList1);
+            reportTable.setUserGroupList(reportTableDao.getTableUserGroup(id));
             return Result.ok(reportTable);
         } else {
             reportTable.setReportTableItemList(reportTableDao.getTableItemListById(id));
@@ -398,9 +432,8 @@ public class ReportTableServiceImpl implements ReportTableService {
         }
         if (reportTableType.equals(ConstantStr.MANUAL_REPORT)) {
             return Result.ok(reportTableTask.getManualReport(reportTable));
-        } else if (reportTableType.equals(ConstantStr.AUTOMATIC_REPORT) ||
-                reportTableType.equals(ConstantStr.EVENT_DRIVEN_REPORT) ||
-                reportTableType.equals(ConstantStr.DEVICE_REPORT)) {
+            //自动报表打印最新的一条子报表
+        } else if (reportTableType.equals(ConstantStr.AUTOMATIC_REPORT)) {
             //查询主报表最新的一条子报表
             String chTableId = reportTableDao.getEventChTableId(id);
             if (Blank.isNotEmpty(chTableId)) {
@@ -413,6 +446,20 @@ public class ReportTableServiceImpl implements ReportTableService {
             reportTable.setReportTableItemList(reportTableDao.getTableItemListById(id));
             reportTable.setUserGroupList(reportTableDao.getTableUserGroup(id));
             return Result.ok(reportTable);
+            //事件驱动报表和设备报表打印,查询主报表第二新的一条子报表
+        } else if (reportTableType.equals(ConstantStr.EVENT_DRIVEN_REPORT) ||
+                reportTableType.equals(ConstantStr.DEVICE_REPORT)) {
+            String chTableId = reportTableDao.getSecondChTableId(id);
+            if (Blank.isNotEmpty(chTableId)) {
+                ReportTable chReportTable = reportTableDao.getReportTableById(chTableId);
+                chReportTable.setReportTableData(reportTable.getReportTableData());
+                chReportTable.setReportTableItemList(reportTableDao.getTableItemListById(chTableId));
+                chReportTable.setUserGroupList(reportTableDao.getTableUserGroup(chTableId));
+                return Result.ok(chReportTable);
+            }
+            reportTable.setReportTableItemList(reportTableDao.getTableItemListById(id));
+            reportTable.setUserGroupList(reportTableDao.getTableUserGroup(id));
+            return Result.ok(reportTable);
         }
         throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "报表类型不存在");
     }

+ 12 - 0
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/AsyncAsyncTask.java

@@ -59,6 +59,18 @@ public class AsyncAsyncTask {
     }
 
     /**
+     * 修改报表当前数据
+     *
+     * @param reportTableId
+     * @param num
+     */
+    public void updateReportNum(String reportTableId, Integer num) {
+        if (Blank.isNotEmpty(reportTableId) && Blank.isNotEmpty(num)) {
+            reportTableDao.updateReportTableNum(reportTableId, num);
+        }
+    }
+
+    /**
      * 如果数据库有此数据项信息,则更新,否则新增
      *
      * @param reportTableItem

+ 8 - 2
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/OpcAsyncTask.java

@@ -179,7 +179,8 @@ public class OpcAsyncTask {
                 if (Blank.isEmpty(currentNum)) {
                     //生成新的子报表
                     String id = IdUtil.createSnowflake(1, 1).nextId() + "";
-                    asyncAsyncTask.addHaveKeyChReport(reportTable, id, ConstantStr.EVENT_GENERATE_REPORT, 0);
+                    asyncAsyncTask.addHaveKeyChReport(reportTable, id, ConstantStr.EVENT_GENERATE_REPORT, 1);
+                    redisUtil.set(ConstantStr.TABLE_ID + tableTemplateId, id);
                     redisUtil.set(ConstantStr.CURRENT_NUM + tableTemplateId, 1);
                     //获取事件驱动报表中所有的数据项信息
                     List<TableTemplateTableItem> tttItemList = tableTemplate.getTableTemplateItemList();
@@ -190,6 +191,7 @@ public class OpcAsyncTask {
                 } else {
                     //如果两者相等,将上一次的数据异步存入到数据库,并生成新的子报表
                     if (eventNum == (int) currentNum) {
+                        asyncAsyncTask.updateReportNum(redisUtil.get(ConstantStr.TABLE_ID + tableTemplateId).toString(), eventNum);
                         //从redis中取出数据
                         List<TableTemplateTableItem> tttItemList = tableTemplate.getTableTemplateItemList();
                         if (Blank.isNotEmpty(tttItemList)) {
@@ -204,7 +206,7 @@ public class OpcAsyncTask {
                         }
                         //生成新的子报表
                         String id = IdUtil.createSnowflake(1, 1).nextId() + "";
-                        asyncAsyncTask.addHaveKeyChReport(reportTable, id, ConstantStr.EVENT_GENERATE_REPORT, 0);
+                        asyncAsyncTask.addHaveKeyChReport(reportTable, id, ConstantStr.EVENT_GENERATE_REPORT, 1);
                         redisUtil.set(ConstantStr.CURRENT_NUM + tableTemplateId, 1);
                         //获取事件驱动报表中所有的数据项信息
                         if (Blank.isNotEmpty(tttItemList)) {
@@ -413,6 +415,8 @@ public class OpcAsyncTask {
                             //获取子报表中的报表主键
                             String id = redisUtil.get(ConstantStr.TABLE_ID + tableTemplateId).toString();
                             redisUtil.set(ConstantStr.END_NUM + tableTemplateId, endNum + 1);
+                            //修改报表当前数量
+                            asyncAsyncTask.updateReportNum(redisUtil.get(ConstantStr.TABLE_ID + tableTemplateId).toString(), endNum + 1);
                             List<TableTemplateTableItem> tttItemList = tableTemplate.getTableTemplateItemList();
                             for (TableTemplateTableItem tttItem : tttItemList) {
                                 Integer timeItemType = tttItem.getTimeItemType();
@@ -440,6 +444,8 @@ public class OpcAsyncTask {
                             }
                         } else {
                             redisUtil.set(ConstantStr.END_NUM + tableTemplateId, endNum + 1);
+                            //修改报表当前数量
+                            asyncAsyncTask.updateReportNum(redisUtil.get(ConstantStr.TABLE_ID + tableTemplateId).toString(), endNum + 1);
                             //如果此时插入的结束时间为最后一个数据
                             if ((endNum + 1) == eventNum) {
                                 List<TableTemplateTableItem> tttItemList = tableTemplate.getTableTemplateItemList();

+ 1 - 0
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/OpcDaChangeTask.java

@@ -268,6 +268,7 @@ public class OpcDaChangeTask extends TimerTask {
                                     //组装相应的原始数据
                                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                     sqlCurrentYmdh = currentYmdh;
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
                                 }
                             }
                             if (!javaType.toLowerCase().equals("boolean")) {

+ 4 - 0
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/OpcDaFrequencyTask.java

@@ -266,6 +266,9 @@ public class OpcDaFrequencyTask extends TimerTask {
                         break;
                     }
                     try {
+                        System.out.println("--------------server" + server);
+                        System.out.println("--------------serverState" + server.getServerState());
+                        System.out.println("--------------group" + group);
                         Map<org.openscada.opc.lib.da.Item, ItemState> resultMap = group.read(true, itemArr);
                         index++;
                         List<CursorRawData> cursorRawDataList = new ArrayList<>();
@@ -302,6 +305,7 @@ public class OpcDaFrequencyTask extends TimerTask {
                                     //组装相应的原始数据
                                     opcAsyncTask.packageRawDataList(itemList, dataSourceId, sqlCurrentYmdh);
                                     sqlCurrentYmdh = currentYmdh;
+                                    redisUtil.set(ConstantStr.VALUE_BELONG_TIME + id, currentYmdh, ConstantStr.TWO_HOUR);
                                 }
                             }
                             if (Blank.isNotEmpty(dm) && dm.getModelType().equals(ConstantStr.VALUE_REPLACE)) {

+ 105 - 41
cqcy-ei/cqcy-ei-da/src/main/java/com/example/opc_da/task/ReportTableTask.java

@@ -111,7 +111,7 @@ public class ReportTableTask {
                 reportTableDao.addReportTableItemList(reportTableItemList);
             }
             //添加模板数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
         }
         //保存模板统计图相关的数据项信息,以及报表统计图相关的信息
         if (Blank.isNotEmpty(tableTemplateChartList)) {
@@ -164,7 +164,7 @@ public class ReportTableTask {
         List<TableTemplateChart> tableTemplateChartList = tableTemplate.getTableTemplateChartList();
 
         //根据模板修改相应的报表
-//        reportTable.setReportTableName(tableTemplate.getTemplateName());
+        reportTable.setReportTableName(tableTemplate.getTemplateName());
         reportTable.setReportTableData(tableTemplate.getTemplateData());
         reportTable.setVersion(tableTemplate.getVersion());
         String reportTableId = reportTable.getId();
@@ -199,7 +199,7 @@ public class ReportTableTask {
                 reportTableDao.addReportTableItemList(reportTableItemList);
             }
             //添加模板数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
         }
 
         List<TableTemplateChart> tableTemplateCharts = reportTableDao.getTtcByTemplateId(tableTemplateId);
@@ -296,7 +296,7 @@ public class ReportTableTask {
                 }
             }
             //自动报表只需要添加模板的数据项信息,定时器执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
         }
         if (Blank.isNotEmpty(tableTemplateChartList)) {
             for (TableTemplateChart ttc : tableTemplateChartList) {
@@ -330,9 +330,15 @@ public class ReportTableTask {
         Integer tableTemplateId = tableTemplate.getId();
         List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
         List<TableTemplateChart> tableTemplateChartList = tableTemplate.getTableTemplateChartList();
-
+        //修改相应报表之前,将原来的报表data数据,赋值给子报表中最早创建的一条
+        String chOrgTableId = reportTableDao.getChTableIdByVersion(reportTable.getId(), reportTable.getVersion());
+        if (Blank.isNotEmpty(chOrgTableId)) {
+            if (reportTableDao.updateReportTableDataById(chOrgTableId, reportTable.getReportTableData()) <= 0) {
+                throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "报表传递数据失败");
+            }
+        }
         //根据模板修改相应的报表
-//        reportTable.setReportTableName(tableTemplate.getTemplateName());
+        reportTable.setReportTableName(tableTemplate.getTemplateName());
         reportTable.setReportTableData(tableTemplate.getTemplateData());
         reportTable.setVersion(tableTemplate.getVersion());
         if (reportTableDao.updateReportTable(reportTable) <= 0) {
@@ -352,7 +358,7 @@ public class ReportTableTask {
                 }
             }
             //自动报表只需要添加模板的数据项信息,定时器执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
         }
 
         List<TableTemplateChart> tableTemplateCharts = reportTableDao.getTtcByTemplateId(tableTemplateId);
@@ -434,7 +440,7 @@ public class ReportTableTask {
                 }
             }
             //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
         } else {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动报表中,不能没有数据项");
         }
@@ -452,20 +458,26 @@ public class ReportTableTask {
         if (Blank.isEmpty(eventNum)) {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动显示数量设置不能为空");
         }
+        //修改相应报表之前,将原来的报表data数据,赋值给子报表中最早创建的一条
+        String chOrgTableId = reportTableDao.getChTableIdByVersion(reportTable.getId(), reportTable.getVersion());
+        if (Blank.isNotEmpty(chOrgTableId)) {
+            if (reportTableDao.updateReportTableDataById(chOrgTableId, reportTable.getReportTableData()) <= 0) {
+                throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "报表传递数据失败");
+            }
+        }
 
         //根据模板修改相应的报表
-//        reportTable.setReportTableName(tableTemplate.getTemplateName());
+        reportTable.setReportTableName(tableTemplate.getTemplateName());
         reportTable.setReportTableData(tableTemplate.getTemplateData());
         reportTable.setVersion(tableTemplate.getVersion());
         if (reportTableDao.updateReportTable(reportTable) <= 0) {
             throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "修改数据报表失败");
         }
-        String reportTableId = reportTable.getId();
 
+        //获取上个版本模板表格的数据项信息
+        List<TableTemplateTableItem> tttiByTemplate = reportTableDao.getTttiByTemplateId(tableTemplateId);
         //删除模板表格数据相关的数据项信息
         reportTableDao.delTtiByTtId(tableTemplateId);
-        //删除报表表格数据相关的数据项信息
-        reportTableDao.delRtiByRtId(reportTableId);
         if (Blank.isNotEmpty(tableTemplateItemList)) {
             for (TableTemplateTableItem t : tableTemplateItemList) {
                 t.setTableTemplateId(tableTemplateId);
@@ -474,7 +486,17 @@ public class ReportTableTask {
                 }
             }
             //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
+            //删除事件驱动报表模板上个版本的配置信息
+            redisUtil.del(ConstantStr.CURRENT_NUM + tableTemplateId);
+            redisUtil.del(ConstantStr.TABLE_ID + tableTemplateId);
+            List<String> itemIdKeyList = new ArrayList<>();
+            tttiByTemplate.forEach(t -> {
+                itemIdKeyList.add(tableTemplateId + ConstantStr.REPORT_TABLE_ITEM + t.getItemReadName());
+            });
+            if (Blank.isNotEmpty(itemIdKeyList)) {
+                redisUtil.del(itemIdKeyList.stream().toArray(String[]::new));
+            }
         } else {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动报表中,不能没有数据项");
         }
@@ -490,6 +512,7 @@ public class ReportTableTask {
         List<TableTemplateTableItem> tableTemplateItemList = tableTemplate.getTableTemplateItemList();
         Integer eventNum = tableTemplate.getEventNum();
         Integer isGenCountTime = tableTemplate.getIsGenCountTime();
+        //判断设备报表传入的参数是否符合条件
         if (Blank.isEmpty(eventNum, isGenCountTime)) {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "显示数量,是否生成计算时间不能为空");
         }
@@ -531,6 +554,7 @@ public class ReportTableTask {
             throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "生成数据报表失败");
         }
 
+        //检验、保存设备报表模板的数据信息配置
         if (Blank.isNotEmpty(tableTemplateItemList)) {
             int startCount = 0;
             int endCount = 0;
@@ -556,7 +580,7 @@ public class ReportTableTask {
                 throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "结束时间项只能有一个");
             }
             //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
         } else {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "事件驱动报表中,不能没有数据项");
         }
@@ -594,7 +618,16 @@ public class ReportTableTask {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "变量类型只能为单变量或者双变量");
         }
 
+        //修改相应报表之前,将原来的报表data数据,赋值给子报表中最早创建的一条
+        String chOrgTableId = reportTableDao.getChTableIdByVersion(reportTable.getId(), reportTable.getVersion());
+        if (Blank.isNotEmpty(chOrgTableId)) {
+            if (reportTableDao.updateReportTableDataById(chOrgTableId, reportTable.getReportTableData()) <= 0) {
+                throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "报表传递数据失败");
+            }
+        }
+
         //根据模板生成相应的报表
+        reportTable.setReportTableName(tableTemplate.getTemplateName());
         reportTable.setReportTableData(tableTemplate.getTemplateData());
         reportTable.setIsGenCountTime(tableTemplate.getIsGenCountTime());
         reportTable.setVersion(tableTemplate.getVersion());
@@ -602,6 +635,10 @@ public class ReportTableTask {
             throw new CustomException(ResultEnum.SERVER_ERROR.getRespCode(), "生成数据报表失败");
         }
 
+        //获取上个版本模板表格的数据项信息
+        List<TableTemplateTableItem> tttiByTemplate = reportTableDao.getTttiByTemplateId(tableTemplateId);
+        //删除模板表格数据相关的数据项信息
+        reportTableDao.delTtiByTtId(tableTemplateId);
         if (Blank.isNotEmpty(tableTemplateItemList)) {
             int startCount = 0;
             int endCount = 0;
@@ -627,7 +664,23 @@ public class ReportTableTask {
                 throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "结束时间项只能有一个");
             }
             //事件驱动报表只需要添加模板的数据项信息,驱动执行的时候,会根据模板的数据项信息,自动生成报表的数据项信息
-            reportTableDao.addTableTemplateItem(tableTemplateItemList);
+            reportTableDao.addTableTemplateTableItem(tableTemplateItemList);
+            //删除事件驱动报表模板上个版本的配置信息
+            redisUtil.del(ConstantStr.START_NUM + tableTemplateId);
+            redisUtil.del(ConstantStr.END_NUM + tableTemplateId);
+            redisUtil.del(ConstantStr.TABLE_ID + tableTemplateId);
+            List<String> itemIdKeyList = new ArrayList<>();
+            tttiByTemplate.forEach(t -> {
+                if (Blank.isNotEmpty(t.getTimeItemType())) {
+                    itemIdKeyList.add(tableTemplateId + ConstantStr.REPORT_TABLE_ITEM + t.getItemReadName() + ConstantStr.REPORT_TABLE_ITEM + t.getTimeItemType());
+                } else {
+                    itemIdKeyList.add(tableTemplateId + ConstantStr.REPORT_TABLE_ITEM + t.getItemReadName());
+
+                }
+            });
+            if (Blank.isNotEmpty(itemIdKeyList)) {
+                redisUtil.del(itemIdKeyList.stream().toArray(String[]::new));
+            }
         } else {
             throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "设备报表不能没有数据项");
         }
@@ -872,6 +925,8 @@ public class ReportTableTask {
                                 map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                             }
                         }
+                    } else {
+                        map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                     }
                     Integer valueType = t.getValueType();
                     boolean flage = valueType.equals(ConstantStr.CALCULATED_VALUE);
@@ -988,6 +1043,8 @@ public class ReportTableTask {
                                         map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                                     }
                                 }
+                            } else {
+                                map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                             }
                             String valueList = map.get(flage ? "valueList" : "orgValueList");
                             String valueTimeList = map.get("valueTimeList");
@@ -1184,6 +1241,8 @@ public class ReportTableTask {
                                 map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                             }
                         }
+                    } else {
+                        map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                     }
                     Integer valueType = t.getValueType();
                     boolean flage = valueType.equals(ConstantStr.CALCULATED_VALUE);
@@ -1298,6 +1357,8 @@ public class ReportTableTask {
                                         map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                                     }
                                 }
+                            } else {
+                                map = ReportTask.genString(currentCursorRawDataList, startTime, endTime, bucketType, bucketValue);
                             }
                             String valueList = map.get(flage ? "valueList" : "orgValueList");
                             String valueTimeList = map.get("valueTimeList");
@@ -1333,37 +1394,40 @@ public class ReportTableTask {
                 ReportTable reportTable = reportTableDao.getReportTableByTemplate(tableTemplate);
                 String chTableId = reportTableDao.getEventChTableId(reportTable.getId());
                 if (Blank.isNotEmpty(chTableId)) {
-                    List<ReportTableItem> chReportTableItemList = reportTableDao.getTableItemListById(chTableId);
-                    if (Blank.isNotEmpty(chReportTableItemList)) {
-                        for (ReportTableItem reportTableItem : chReportTableItemList) {
-                            Integer timeItemType = reportTableItem.getTimeItemType();
-                            String itemReadName = reportTableItem.getItemReadName();
-                            if (Blank.isNotEmpty(timeItemType)) {
-                                if (timeItemType.equals(ConstantStr.END_TIME_ITEM)) {
-                                    String valueIndexList = reportTableItem.getValueIndexList();
-                                    int length = valueIndexList.split(",").length;
-                                    if (eventNum == length) {
-                                        redisUtil.set(ConstantStr.START_NUM + tableTemplateId, 0);
-                                    } else {
-                                        redisUtil.set(ConstantStr.END_NUM + tableTemplateId, length);
-                                        redisUtil.set(ConstantStr.TABLE_ID + tableTemplateId, chTableId);
+                    ReportTable chReportTable = reportTableDao.getReportTableById(chTableId);
+                    if (reportTable.getVersion() == chReportTable.getVersion()) {
+                        List<ReportTableItem> chReportTableItemList = reportTableDao.getTableItemListById(chTableId);
+                        if (Blank.isNotEmpty(chReportTableItemList)) {
+                            for (ReportTableItem reportTableItem : chReportTableItemList) {
+                                Integer timeItemType = reportTableItem.getTimeItemType();
+                                String itemReadName = reportTableItem.getItemReadName();
+                                if (Blank.isNotEmpty(timeItemType)) {
+                                    if (timeItemType.equals(ConstantStr.END_TIME_ITEM)) {
+                                        String valueIndexList = reportTableItem.getValueIndexList();
+                                        int length = valueIndexList.split(",").length;
+                                        if (eventNum == length) {
+                                            redisUtil.set(ConstantStr.START_NUM + tableTemplateId, 0);
+                                        } else {
+                                            redisUtil.set(ConstantStr.END_NUM + tableTemplateId, length);
+                                            redisUtil.set(ConstantStr.TABLE_ID + tableTemplateId, chTableId);
+                                        }
                                     }
-                                }
-                                if (timeItemType.equals(ConstantStr.START_TIME_ITEM)) {
-                                    String valueIndexList = reportTableItem.getValueIndexList();
-                                    int length = valueIndexList.split(",").length;
-                                    if (eventNum == length) {
-                                        Object start0 = redisUtil.get(ConstantStr.START_NUM + tableTemplateId);
-                                        if (Blank.isEmpty(start0)) {
+                                    if (timeItemType.equals(ConstantStr.START_TIME_ITEM)) {
+                                        String valueIndexList = reportTableItem.getValueIndexList();
+                                        int length = valueIndexList.split(",").length;
+                                        if (eventNum == length) {
+                                            Object start0 = redisUtil.get(ConstantStr.START_NUM + tableTemplateId);
+                                            if (Blank.isEmpty(start0)) {
+                                                redisUtil.set(ConstantStr.START_NUM + tableTemplateId, length);
+                                            }
+                                        } else {
                                             redisUtil.set(ConstantStr.START_NUM + tableTemplateId, length);
                                         }
-                                    } else {
-                                        redisUtil.set(ConstantStr.START_NUM + tableTemplateId, length);
                                     }
+                                    redisUtil.set(tableTemplateId + ConstantStr.REPORT_TABLE_ITEM + itemReadName + ConstantStr.REPORT_TABLE_ITEM + timeItemType, reportTableItem);
+                                } else {
+                                    redisUtil.set(tableTemplateId + ConstantStr.REPORT_TABLE_ITEM + itemReadName, reportTableItem);
                                 }
-                                redisUtil.set(tableTemplateId + ConstantStr.REPORT_TABLE_ITEM + itemReadName + ConstantStr.REPORT_TABLE_ITEM + timeItemType, reportTableItem);
-                            } else {
-                                redisUtil.set(tableTemplateId + ConstantStr.REPORT_TABLE_ITEM + itemReadName, reportTableItem);
                             }
                         }
                     }

+ 2 - 0
cqcy-ei/cqcy-ei-da/src/main/resources/mapper/ItemGroupDao.xml

@@ -187,11 +187,13 @@
         ti.data_model_id,
         ti.is_driver_item,
         tdm.operation_rule,
+        tds.data_source_name,
         tard.org_data_value,
         tard.data_value
         FROM
         t_item ti
         LEFT JOIN t_item_group tig ON ti.item_group_id = tig.id
+        LEFT JOIN t_data_source tds ON tig.data_source_id=tds.id
         LEFT JOIN t_data_model tdm ON ti.data_model_id = tdm.id
         LEFT JOIN t_attach_raw_data tard ON ti.item_group_id = tard.item_group_id
         AND tig.data_source_id = tard.data_source_id

+ 29 - 2
cqcy-ei/cqcy-ei-da/src/main/resources/mapper/ReportTableDao.xml

@@ -139,7 +139,7 @@
             value (#{autoTableId},#{autoChTableId})
     </insert>
 
-    <insert id="addTableTemplateItem">
+    <insert id="addTableTemplateTableItem">
         <if test="tableTemplateTableItemList!= null and tableTemplateTableItemList.size() >0">
             insert into t_table_template_table_item (table_template_id, item_id, time_item_type, place_holder, xaxis,
             yaxis,
@@ -231,6 +231,12 @@
         where id = #{id}
     </update>
 
+    <update id="updateReportTableDataById">
+        update t_report_table
+        set report_table_data=#{reportTableData}
+        where id = #{id}
+    </update>
+
     <update id="updateTableNameById">
         update t_report_table
         set report_table_name=#{reportTableName}
@@ -828,6 +834,27 @@
         order by id desc limit 1
     </select>
 
+    <select id="getSecondChTableId" resultType="java.lang.String">
+        select id
+        from t_report_table
+        where id in
+              (select auto_ch_table_id
+               from t_table_auto_log
+               where auto_table_id = #{tableId})
+        order by id desc limit 1,1
+    </select>
+
+    <select id="getChTableIdByVersion" resultType="java.lang.String">
+        select id
+        from t_report_table
+        where id in
+              (select auto_ch_table_id
+               from t_table_auto_log
+               where auto_table_id = #{tableId})
+          and version = #{version}
+        order by id limit 1
+    </select>
+
     <select id="getReportTableItem" resultType="com.example.opc_common.entity.ReportTableItem">
         select
         <include refid="reportTableItem"/>
@@ -1014,7 +1041,7 @@
 
     <select id="getReportTableByTemplate" resultType="com.example.opc_common.entity.ReportTable">
         select
-        <include refid="reportTableCronNoData"/>
+        <include refid="reportTableCron"/>
         from t_report_table
         where report_table_type = #{templateType}
         and table_template_id=#{id}