Browse Source

Merge branch 'master' of http://116.63.33.55/git/industry-data-platform into master

lhy 1 year ago
parent
commit
ec575ecb19
24 changed files with 57787 additions and 684 deletions
  1. 44 1
      industry-admin/src/api/report/print.js
  2. 17 5
      industry-system/industry-da/src/main/java/com/example/opc_da/controller/ReportDataPolicyController.java
  3. 2 2
      industry-system/industry-da/src/main/java/com/example/opc_da/util/InFluxDBServiceUtil.java
  4. 1 1
      industry-system/industry-da/src/main/resources/mapper/ReportTableDao.xml
  5. 3 0
      industry-system/industry-da/src/main/resources/static/reportSheet/index.html
  6. 22309 0
      industry-system/industry-da/src/main/resources/static/reportSheet/js/Luckysheet-2.1.13/luckyexcel.umd.js
  7. 37 36
      industry-system/industry-da/src/main/resources/static/reportSheet/js/Luckysheet-2.1.13/luckysheet.umd.js
  8. 15 5
      industry-system/industry-da/src/main/resources/static/reportSheet/js/index.js
  9. 25505 0
      industry-system/industry-da/src/main/resources/static/reportSheet/js/lib/exceljs/exceljs.js
  10. 6833 0
      industry-system/industry-da/src/main/resources/static/reportSheet/js/lib/exceljs/polyfill.js
  11. 19 0
      industry-system/industry-da/src/main/resources/static/reportSheet/js/lib/html2canvas.min.js
  12. 6 0
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/api/item-group-api.js
  13. 1 1
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/api/request.js
  14. 92 10
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/chart-right-window.js
  15. 245 13
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/data-setting-window.js
  16. 1761 1
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/excel-util.js
  17. 190 564
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/item-list-table.js
  18. 1 1
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/item-list-window.js
  19. 549 0
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/item-util.js
  20. 19 3
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/right-menu.js
  21. 24 29
      industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/sheet-util.js
  22. 30 3
      industry-system/industry-da/src/main/resources/static/reportSheet/js/util/constants.js
  23. 76 7
      report-client/src/components/HeaderMain/index.vue
  24. 8 2
      report-client/src/views/report_template/index2.vue

+ 44 - 1
industry-admin/src/api/report/print.js

@@ -13,4 +13,47 @@ export function getAllPrintConfig(data) {
         method: 'get',
         params: data
     })
-}
+}
+
+//查询打印机
+export function getPrint() {
+    return request({
+        url: 'http://localhost:8084/api/getPrintName',
+        method: 'get'
+    })
+}
+
+/** 新增打印配置 */
+export function addPrintConfig(data) {
+    return request({
+        url: "/print/addPrintConfig",
+        method: "post",
+        data,
+    });
+}
+
+/** 查询打印配置 */
+export function getPrintConfigById(params) {
+    return request({
+        url: "/print/getPrintConfigById",
+        method: "get",
+        params,
+    });
+}
+
+/** 修改打印配置 */
+export function updatePrintConfigById(data) {
+    return request({
+        url: "/print/updatePrintConfig",
+        method: "post",
+        data,
+    });
+}
+
+/** 删除打印配置 */
+export function delPrintConfigById(id) {
+    return request({
+        url: "/print/delPrintConfigById?id=" + id,
+        method: "post"
+    });
+}

+ 17 - 5
industry-system/industry-da/src/main/java/com/example/opc_da/controller/ReportDataPolicyController.java

@@ -1,10 +1,12 @@
 package com.example.opc_da.controller;
 
+import cn.hutool.core.collection.CollUtil;
 import com.example.opc_common.entity.ReportDataPolicy;
 import com.example.opc_common.enums.ModelEnum;
 import com.example.opc_common.enums.OperationEnum;
 import com.example.opc_common.enums.ResultEnum;
 import com.example.opc_common.enums.ServerEnum;
+import com.example.opc_common.exception.CustomException;
 import com.example.opc_common.util.Blank;
 import com.example.opc_common.util.Result;
 import com.example.opc_da.annotation.WebLog;
@@ -13,7 +15,9 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 报表数据策略
@@ -176,23 +180,31 @@ public class ReportDataPolicyController {
     }
 
     /**
-     * 通过策略数据项itemIdList获取对应的实时数据
+     * 通过策略数据项itemIdList获取对应的历史数据
      *
      * @param id
      * @return
      */
     /**
-     * @param idList
+     * @param idList    报表策略数据项对应的id集合
      * @param valueType 取值类型:0原始值,1计算值
      * @param startTime 开始时间
      * @param endTime   结束时间
      * @param limit     为空则查全部
      * @return
      */
-    @RequestMapping(value = "/getPolicyHistoryDataByItemIdList", method = RequestMethod.GET)
+    @RequestMapping(value = "/getPolicyHistoryDataByItemIdList", method = RequestMethod.POST)
     @WebLog(ServerEnum = ServerEnum.CLIENT, ModelEnum = ModelEnum.REPORTDATAPOLICY, OperationEnum = OperationEnum.SELECT)
-    public Result getPolicyHistoryDataByItemIdList(@RequestParam List<Integer> idList, @RequestParam Integer valueType
+    public Result getPolicyHistoryDataByItemIdList(@RequestParam String idList, @RequestParam Integer valueType
             , @RequestParam String startTime, @RequestParam String endTime, Integer limit) {
-        return reportDataPolicyService.getPolicyHistoryDataByItemIdList(idList, valueType, startTime, endTime, limit);
+        idList = idList.substring(1, idList.length() - 1);
+        // 将字符串分割并转换成整数集合
+        List<Integer> newIdList = Arrays.stream(idList.split(","))
+                .map(Integer::parseInt)
+                .collect(Collectors.toList());
+        if (CollUtil.isEmpty(newIdList)) {
+            throw new CustomException(ResultEnum.REQUEST_WRONGPARAMS.getRespCode(), "报表数据策略数据项不能为空");
+        }
+        return reportDataPolicyService.getPolicyHistoryDataByItemIdList(newIdList, valueType, startTime, endTime, limit);
     }
 }

+ 2 - 2
industry-system/industry-da/src/main/java/com/example/opc_da/util/InFluxDBServiceUtil.java

@@ -74,7 +74,7 @@ public class InFluxDBServiceUtil {
             //将数据项信息组装为后面map的形式Map<policyId,List<policyItemId>>
             Map<String, List<String>> policyData = tList.stream().collect(Collectors.groupingBy(
                     p -> p.getReportDataPolicyId().toString()
-                    , Collectors.mapping(p -> p.getItemReadName(), Collectors.toList())
+                    , Collectors.mapping(p -> p.getId().toString(), Collectors.toList())
             ));
 
             //根据分组信息,查询对应的数据项值,并转换为相应的map格式
@@ -89,7 +89,7 @@ public class InFluxDBServiceUtil {
             //将返回的值赋值给对应的数据项中
             for (int i = 0; i < tList.size(); i++) {
                 ReportDataPolicyItem policyItem = tList.get(i);
-                List<Item> items = mapData.get(policyItem.getReportDataPolicyId().toString()).get(policyItem.getItemReadName());
+                List<Item> items = mapData.get(policyItem.getReportDataPolicyId().toString()).get(policyItem.getId().toString());
                 policyItemHistroyVlaue(policyItem, items);
             }
         }

+ 1 - 1
industry-system/industry-da/src/main/resources/mapper/ReportTableDao.xml

@@ -117,7 +117,7 @@
                                    is_run_print, print_ip, print_config_id, cron_id,cron,
                                    create_time, is_delete) VALUE
             (#{id},#{reportTableType},#{tableTemplateId}, #{userId}, #{reportTableName}, #{reportTableData}, #{startTime},
-            #{currentNum}, #{isGenCountTime}, #{version}, #{isRunPrint}, #{printIp}, #{printConfigId}
+            #{currentNum}, #{isGenCountTime}, #{version}, #{isRunPrint}, #{printIp}, #{printConfigId},
             #{cronId}, #{cron}, #{createTime}, #{isDelete})
     </insert>
 

+ 3 - 0
industry-system/industry-da/src/main/resources/static/reportSheet/index.html

@@ -34,6 +34,9 @@
 		<script type="text/javascript" src="js/layui-v2.9.3/layui.js"></script>
 		<script type="text/javascript" src="js/Luckysheet-2.1.13/plugins/js/plugin.js"></script>
 		<script type="text/javascript" src="js/Luckysheet-2.1.13/luckysheet.umd.js"></script>
+		<script type="text/javascript" src="js/lib/html2canvas.min.js"></script>
+		<script type="text/javascript" src="js/lib/exceljs/polyfill.js"></script>
+		<script type="text/javascript" src="js/lib/exceljs/exceljs.js"></script>
 		<script type="text/javascript" src="js/lib/uuidv4.min.js"></script>
 		<script type="text/javascript" src="js/util/constants.js"></script>
 		<script type="text/javascript" src="js/index.js"></script>

File diff suppressed because it is too large
+ 22309 - 0
industry-system/industry-da/src/main/resources/static/reportSheet/js/Luckysheet-2.1.13/luckyexcel.umd.js


+ 37 - 36
industry-system/industry-da/src/main/resources/static/reportSheet/js/Luckysheet-2.1.13/luckysheet.umd.js

@@ -50660,40 +50660,41 @@
 			},
 			getSliderHtml: function() {
 				var e = mi().imageText;
-				return '<div id="luckysheet-modal-dialog-slider-imageCtrl" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-imageCtrl" style="display:block;">\n                    <div class="luckysheet-modal-dialog-slider-title">\n                        <span>'
-					.concat(e.imageSetting,
-						'</span>\n                        <span class="luckysheet-model-close-btn" title="')
-					.concat(e.close,
-						'">\n                            <i class="fa fa-times" aria-hidden="true"></i>\n                        </span>\n                    </div>\n                    <div class="luckysheet-modal-dialog-slider-content">\n                        <div class="slider-box">\n                            <div class="slider-box-title">'
-						).concat(e.conventional,
-						'</div>\n                            <div class="slider-box-radios">\n                                <div class="radio-item">\n                                    <input type="radio" id="imgItemType1" name="imgItemType" value="1">\n                                    <label for="imgItemType1">'
-						).concat(e.moveCell1,
-						'</label>\n                                </div>\n                                <div class="radio-item">\n                                    <input type="radio" id="imgItemType2" name="imgItemType" value="2">\n                                    <label for="imgItemType2">'
-						).concat(e.moveCell2,
-						'</label>\n                                </div>\n                                <div class="radio-item">\n                                    <input type="radio" id="imgItemType3" name="imgItemType" value="3">\n                                    <label for="imgItemType3">'
-						).concat(e.moveCell3,
-						'</label>\n                                </div>\n                            </div>\n                            <div class="slider-box-checkbox">\n                                <input type="checkbox" id="imgItemIsFixedPos">\n                                <label for="imgItemIsFixedPos">'
-						).concat(e.fixedPos,
-						'</label>\n                            </div>\n                        </div>\n                        <div class="slider-box">\n                            <div class="slider-box-title">'
-						).concat(e.border,
-						'</div>\n                            <div class="slider-box-borderConfig">\n                                <div class="border-item">\n                                    <label>'
-						).concat(e.width,
-						'</label>\n                                    <input type="number" id="imgItemBorderWidth" min="0">\n                                </div>\n                                <div class="border-item">\n                                    <label>'
-						).concat(e.radius,
-						'</label>\n                                    <input type="number" id="imgItemBorderRadius" min="0">\n                                </div>\n                                <div class="border-item">\n                                    <label>'
-						).concat(e.style,
-						'</label>\n                                    <select id="imgItemBorderStyle">\n                                        <option value="solid">'
-						).concat(e.solid,
-						'</option>\n                                        <option value="dashed">')
-					.concat(e.dashed,
-						'</option>\n                                        <option value="dotted">')
-					.concat(e.dotted,
-						'</option>\n                                        <option value="double">')
-					.concat(e.double,
-						'</option>\n                                    </select>\n                                </div>\n                                <div class="border-item">\n                                    <label>'
-						).concat(e.color,
-						'</label>\n                                    <div id="imgItemBorderColor" class="imgItemBorderColor">\n                                        <span></span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>'
-						)
+				return ''
+				// return '<div id="luckysheet-modal-dialog-slider-imageCtrl" class="luckysheet-modal-dialog-slider luckysheet-modal-dialog-slider-imageCtrl" style="display:block;">\n                    <div class="luckysheet-modal-dialog-slider-title">\n                        <span>'
+				// 	.concat(e.imageSetting,
+				// 		'</span>\n                        <span class="luckysheet-model-close-btn" title="')
+				// 	.concat(e.close,
+				// 		'">\n                            <i class="fa fa-times" aria-hidden="true"></i>\n                        </span>\n                    </div>\n                    <div class="luckysheet-modal-dialog-slider-content">\n                        <div class="slider-box">\n                            <div class="slider-box-title">'
+				// 		).concat(e.conventional,
+				// 		'</div>\n                            <div class="slider-box-radios">\n                                <div class="radio-item">\n                                    <input type="radio" id="imgItemType1" name="imgItemType" value="1">\n                                    <label for="imgItemType1">'
+				// 		).concat(e.moveCell1,
+				// 		'</label>\n                                </div>\n                                <div class="radio-item">\n                                    <input type="radio" id="imgItemType2" name="imgItemType" value="2">\n                                    <label for="imgItemType2">'
+				// 		).concat(e.moveCell2,
+				// 		'</label>\n                                </div>\n                                <div class="radio-item">\n                                    <input type="radio" id="imgItemType3" name="imgItemType" value="3">\n                                    <label for="imgItemType3">'
+				// 		).concat(e.moveCell3,
+				// 		'</label>\n                                </div>\n                            </div>\n                            <div class="slider-box-checkbox">\n                                <input type="checkbox" id="imgItemIsFixedPos">\n                                <label for="imgItemIsFixedPos">'
+				// 		).concat(e.fixedPos,
+				// 		'</label>\n                            </div>\n                        </div>\n                        <div class="slider-box">\n                            <div class="slider-box-title">'
+				// 		).concat(e.border,
+				// 		'</div>\n                            <div class="slider-box-borderConfig">\n                                <div class="border-item">\n                                    <label>'
+				// 		).concat(e.width,
+				// 		'</label>\n                                    <input type="number" id="imgItemBorderWidth" min="0">\n                                </div>\n                                <div class="border-item">\n                                    <label>'
+				// 		).concat(e.radius,
+				// 		'</label>\n                                    <input type="number" id="imgItemBorderRadius" min="0">\n                                </div>\n                                <div class="border-item">\n                                    <label>'
+				// 		).concat(e.style,
+				// 		'</label>\n                                    <select id="imgItemBorderStyle">\n                                        <option value="solid">'
+				// 		).concat(e.solid,
+				// 		'</option>\n                                        <option value="dashed">')
+				// 	.concat(e.dashed,
+				// 		'</option>\n                                        <option value="dotted">')
+				// 	.concat(e.dotted,
+				// 		'</option>\n                                        <option value="double">')
+				// 	.concat(e.double,
+				// 		'</option>\n                                    </select>\n                                </div>\n                                <div class="border-item">\n                                    <label>'
+				// 		).concat(e.color,
+				// 		'</label>\n                                    <div id="imgItemBorderColor" class="imgItemBorderColor">\n                                        <span></span>\n                                    </div>\n                                </div>\n                            </div>\n                        </div>\n                    </div>\n                </div>'
+				// 		)
 			},
 			sliderHtmlShow: function() {
 				$("#luckysheet-modal-dialog-slider-imageCtrl").remove();
@@ -50830,7 +50831,7 @@
 					})), $("#luckysheet-image-showBoxs").off("mousedown.active").on("mousedown.active",
 					".luckysheet-modal-dialog-image", (function(t) {
 						if (Ph(Zr.currentSheetIndex, "editObjects", !1)) {
-							$(this).hide();
+							// $(this).hide();
 							var a = $(this).attr("id");
 							null != e.currentImgId && e.currentImgId != a && e
 							.cancelActiveImgItem(), e.currentImgId = a;
@@ -62136,7 +62137,7 @@
 							var h = o - 1 == -1 ? 0 : Zr.visibledatacolumn[o - 1];
 							s && (d = s.row[1], s.row[0], s.column[1], h = s.column[0]);
 							var m =
-								'<div id="luckysheet-hyperlink-overshow" style="background:#fff;padding:5px 10px;border:1px solid #000;box-shadow:2px 2px #999;position:absolute;left:'
+								'<div id="luckysheet-hyperlink-overshow" style="color: #333;background:#fff;padding:5px 10px;border:1px solid #000;box-shadow:2px 2px #999;position:absolute;left:'
 								.concat(h, "px;top:").concat(d + 5,
 									'px;z-index:100;">\n                        <div>').concat(u,
 									"</div>\n                        <div>单击鼠标可以追踪</div>\n                    </div>"

+ 15 - 5
industry-system/industry-da/src/main/resources/static/reportSheet/js/index.js

@@ -1,5 +1,4 @@
 layui.use(use.index, function() {
-
 })
 
 window.onload = function() {
@@ -24,6 +23,12 @@ window.onbeforeunload = function() {
 
 const indexFn = {
 	initPage: (data) => {
+		layer.closeAll()
+		console.log(data)
+		if (data.type && data.type == 'import') {
+			layui.excelUtil.importExcel(data.files)
+			return
+		}
 		if (data.reportId && data.reportId > 0) {
 			luckysheet.destroy()
 			layui.api.getTableTemplateById(data.reportId).then(json => {
@@ -35,17 +40,22 @@ const indexFn = {
 				layui.sheetTypew.templateEventReportNum = json.data.eventNum
 				$('#template-name').val(json.data.templateName)
 				layui.rightMenu.init('rightMenuList')
-				layui.sheetUtil.init(templateData.sheet, 'edit')
+				let s_data = $.extend(true, {}, templateData.sheet)
+				delete s_data.chart
+				data.data = [s_data]
+				layui.sheetUtil.init(templateData.sheet.data, 'edit', data)
 			})
 		} else {
 			$('#template-name').val('')
 			layui.sheetTypew.templateReportId = 0
 			layui.sheetTypew.templateReportVersion = 0
-			layui.rightMenu.data.chart = {}
+			if (layui.rightMenu) {
+				layui.rightMenu.data.chart = {}
+			}
 			layui.sheetTypew.open(function() {
 				layui.rightMenu.init('rightMenuList')
-				layui.sheetUtil.init()
+				layui.sheetUtil.init(null, null, data)
 			})
 		}
-	}
+	},
 }

File diff suppressed because it is too large
+ 25505 - 0
industry-system/industry-da/src/main/resources/static/reportSheet/js/lib/exceljs/exceljs.js


File diff suppressed because it is too large
+ 6833 - 0
industry-system/industry-da/src/main/resources/static/reportSheet/js/lib/exceljs/polyfill.js


File diff suppressed because it is too large
+ 19 - 0
industry-system/industry-da/src/main/resources/static/reportSheet/js/lib/html2canvas.min.js


+ 6 - 0
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/api/item-group-api.js

@@ -35,6 +35,12 @@ layui.define(['_$'], function(exports) {
 					id
 				}
 			})
+		},
+		getPolicyHistoryDataByItemIdList: function(data) {
+			return _$.post({
+				url: '/reportDataPolicy/getPolicyHistoryDataByItemIdList',
+				data
+			})
 		}
 	}
 	

+ 1 - 1
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/api/request.js

@@ -43,7 +43,7 @@ layui.define(['jquery', 'layer'], function(exports) {
 				params.data = JSON.stringify(params.data)
 			}
 			return request(params)
-		}
+		},
 	}
 	
 	exports('_$', fn);

+ 92 - 10
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/chart-right-window.js

@@ -11,19 +11,19 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 	
 	util.on({
 		optItem: function() {
-			const itemGroupId = $('select[name="chart-item-group"]').val()
-			if (!itemGroupId) {
+			const policyId = $('select[name="chart-item-group"]').val()
+			if (!policyId) {
 				layer.msg('请选择数据组', {icon: 2})
 				return
 			}
 			layui.itemListw.open({
-				itemGroupId,
+				policyId,
 				success: function(data, index) {
 					if (data.length > 1 && fn.data.chartType == 'pie') {
 						layer.msg('饼图只支持单个数据项!', {icon: 2})
 						return
 					}
-					fn.checkItemNumber(itemGroupId, data)
+					fn.checkItemNumber(policyId, data)
 					layer.close(index)
 				}
 			})
@@ -129,6 +129,7 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 					data: nameData
 				}
 			})
+			custFn.manualReportHistory()
 		}
 	}
 	
@@ -146,6 +147,46 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 			}
 			$('#itemNameChangeList').append(html)
 			form.render()
+		},
+		manualReportHistory: function() {
+			if (layui.sheetTypew.templateReportType != 0) {
+				return
+			}
+			const chart = layui.rightMenu.data.chart[fn.data.chartId]
+			if (chart.dataForm.isChartDataType != 2 || !chart.items || !chart.items.length) {
+				return
+			}
+			const ids = chart.items.map(item => item.value)
+			let params = {
+				idList: JSON.stringify(ids),
+				valueType: parseInt(chart.dataForm.valueType),
+				startTime: chart.dataForm.startDate,
+				endTime: chart.dataForm.endDate
+			}
+			if (chart.dataForm.isChartDataNumber == 2) {
+				params.limit = chart.dataForm.isChartDataNumberVal
+			}
+			layui.api.getPolicyHistoryDataByItemIdList(params).then(json => {
+				if (!json.data || !json.data.length) {
+					return
+				} 
+				let obj = {}
+				json.data.forEach(data => {
+					const name = data.describe || data.modbusConfig == 0 ? data.itemReadName : data.itemName
+					obj[name] = data.dataValueList
+				})
+				const elem = chartUtil.getElem(fn.data.chartId)
+				let option = elem.getOption()
+				for (let i = 0; i < option.series.length; i++) {
+					option.series[i].data = obj[option.series[i].name]
+				}
+				elem.setOption({
+					xAxis: [{
+						data: json.data[0].dataTimeList
+					}],
+					series: option.series
+				})
+			})
 		}
 	}
 	const event = {
@@ -195,6 +236,7 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 				
 				layui.laydate.render({
 					elem: '#chart-hand-elem-date',
+					btns: ['confirm'],
 					range: ['#chart-hand-start-date', '#chart-hand-end-date'],
 					rangeLinked: true,
 					type: 'datetime',
@@ -204,9 +246,9 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 							layer.msg('请选择时间范围!', {icon: 2})
 							return
 						}
-						let dates = value.split('-')
-						layui.rightMenu.data.chart[fn.data.chartId].dataForm.startDate = dates[0].trim()
-						layui.rightMenu.data.chart[fn.data.chartId].dataForm.endDate = dates[1].trim()
+						layui.rightMenu.data.chart[fn.data.chartId].dataForm.startDate = $('#chart-hand-start-date').val()
+						layui.rightMenu.data.chart[fn.data.chartId].dataForm.endDate = $('#chart-hand-end-date').val()
+						custFn.manualReportHistory()
 					}
 				});
 			}
@@ -214,6 +256,7 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 		dataEvent: function() {
 			form.on('radio(value-type)', function(data) {
 				layui.rightMenu.data.chart[fn.data.chartId].dataForm.valueType = data.elem.value
+				custFn.manualReportHistory()
 			})
 			form.on('radio(value-taking-mode)', function(data) {
 				layui.rightMenu.data.chart[fn.data.chartId].dataForm.valueTakingMode = data.elem.value
@@ -247,6 +290,7 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 						$('input[name="isChartDataNumberVal"]').parent().removeClass('layui-hide')
 						$('input[name="isChartDataNumberVal"]').parent().prev().removeClass('layui-hide')
 					}
+					custFn.manualReportHistory()
 				})
 				form.on('radio(isChartDataNumber)', function(data) {
 					layui.rightMenu.data.chart[fn.data.chartId].dataForm.isChartDataNumber = data.elem.value
@@ -255,12 +299,14 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 					} else {
 						$('input[name="isChartDataNumberVal"]').removeClass('layui-hide')
 					}
+					custFn.manualReportHistory()
 				})
 				$(document).on('blur', '.isChartDataNumberVal', function() {
 					if (!$(this).val()) {
 						return
 					}
 					layui.rightMenu.data.chart[fn.data.chartId].dataForm.isChartDataNumberVal = $(this).val()
+					custFn.manualReportHistory()
 				})
 			}
 		},
@@ -536,6 +582,8 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 				'cchart-x-font-size': xForm.fontSize,
 				'chart-x-font-color-input': xForm.fontColor,
 				'chart-x-line-color-input': xForm.axisColor,
+				'x-label-style': xForm.interval || 0,
+				'x-label-time-fmt': xForm.formatter || 'yyyy-MM-dd HH:mm:ss.SSS',
 			})
 		},
 		xEvent: function() {
@@ -543,6 +591,16 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 				chartUtil.setXaxis(fn.data.chartId, 'show', this.checked)
 				layui.rightMenu.data.chart[fn.data.chartId].xForm.show = this.checked
 			})
+			form.on('select(x-label-time-fmt)', function(data) {
+				chartUtil.setXaxisLabelStyle(fn.data.chartId, 'formatter', function(value) {
+					return new Date(value).format(data.value)
+				})
+				layui.rightMenu.data.chart[fn.data.chartId].xForm.formatter = data.value
+			})
+			form.on('select(x-label-style)', function(data) {
+				chartUtil.setXaxisLabelStyle(fn.data.chartId, 'interval', data.value)
+				layui.rightMenu.data.chart[fn.data.chartId].xForm.interval = data.value
+			})
 			$(document).on('blur', '.chart-x-txt', function() {
 				chartUtil.setXaxis(fn.data.chartId, 'name', $(this).val())
 				layui.rightMenu.data.chart[fn.data.chartId].xForm.name = $(this).val()
@@ -822,9 +880,9 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 					</div>
 					<div class="cr-form-label layui-hide">数据范围:</div>
 					<div class="layui-form-item layui-hide" style="display: flex;">
-						<input type="radio" name="isChartDataNumber" value="1" title="全部" lay-filter="isChartDataNumber" checked>
-						<input type="radio" name="isChartDataNumber" value="2" title="自定义" lay-filter="isChartDataNumber"> 
-						<input type="text" name="isChartDataNumberVal" autocomplete="off" class="layui-input layui-hide isChartDataNumberVal" placeholder="数据量" style="width: 150px;" oninput="value=value.replace(/[^\\d]/g,'')">
+						<input type="radio" name="isChartDataNumber" value="1" title="全部" lay-filter="isChartDataNumber">
+						<input type="radio" name="isChartDataNumber" value="2" title="自定义" lay-filter="isChartDataNumber" checked> 
+						<input type="text" name="isChartDataNumberVal" autocomplete="off" value="10" class="layui-input isChartDataNumberVal" placeholder="数据量" style="width: 150px;" oninput="value=value.replace(/[^\\d]/g,'')">
 					</div>
 				`
 			} else {
@@ -1184,6 +1242,30 @@ layui.define(['layer', 'form', 'jquery', 'element', 'laydate', 'colorpicker', 's
 							</div>
 						</div>
 					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">标签显示:</label>
+						<div class="layui-input-block">
+							<select lay-filter="x-label-style" name="x-label-style">
+								<option value="0">全部</option>
+								<option value="auto">自动间隔</option>
+							</select>
+						</div>
+					</div>
+					<div class="layui-form-item">
+						<label class="layui-form-label">标签格式:</label>
+						<div class="layui-input-block">
+							<select lay-filter="x-label-time-fmt" name="x-label-time-fmt">
+								<option value="yyyy-MM-dd HH:mm:ss.SSS">yyyy-MM-dd HH:mm:ss.SSS</option>
+								<option value="yyyy-MM-dd">yyyy-MM-dd</option>
+								<option value="yyyy-MM-dd HH">yyyy-MM-dd HH</option>
+								<option value="yyyy-MM-dd HH:mm">yyyy-MM-dd HH:mm</option>
+								<option value="yyyy-MM-dd HH:mm:ss">yyyy-MM-dd HH:mm:ss</option>
+								<option value="HH:mm">HH:mm</option>
+								<option value="HH:mm:ss">HH:mm:ss</option>
+								<option value="HH:mm:ss.SSS">HH:mm:ss.SSS</option>
+							</select>
+						</div>
+					</div>
 				</form>`
 		},
 		YStyleView: function() {

+ 245 - 13
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/data-setting-window.js

@@ -2,11 +2,107 @@ layui.define(['layer', 'form'], function(exports) {
 	const layer = layui.layer
 	const form = layui.form
 	
+	form.on('radio(data-setting-data-type)', function(data) {
+		if (data.elem.value == 0) {
+			$('.setting-bucket-value').removeClass('layui-hide')
+		} else {
+			$('.setting-bucket-value').addClass('layui-hide')
+		}
+	})
+	
+	form.on('radio(data-setting-bucket-type)', function(data) {
+		if (data.elem.value == 0 || data.elem.value == 1) {
+			$('.data-setting-data-time').addClass('layui-hide')
+			$('.data-setting-data-day').removeClass('layui-hide')
+			event.renderTimeSelect(data.elem.value)
+		} else {
+			$('.data-setting-data-time').removeClass('layui-hide')
+			$('.data-setting-data-day').addClass('layui-hide')
+		}
+	})
+	
+	form.on('select(setting-time-type)', function(data) {
+		const formData = form.val('dataSettingForm')
+		if (formData.bucketType == 1) {
+			let date = new Date()
+			let day = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()
+			if (data.value == 2) {
+				date.setMonth(date.getMonth() - 1)
+				day = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()
+			}
+			let monthHtml = ''
+			for (let i = 1; i <= day; i++) {
+				monthHtml += `<option value="${i}">${i}号</option>`
+			}
+			$(data.elem).parent().next().find('select').empty().append(monthHtml)
+			form.render()
+		}
+	})
+	
+	const event = {
+		renderTimeSelect: function(type) {
+			let html = ''
+			let monthHtml = ''
+			if (type == 0) {
+				for (let i = 1; i < 13; i++) {
+					monthHtml += `<option value="${i}">${i}月</option>`
+				}
+				html = `
+					<option value="1">当年</option>
+					<option value="2">明年</option>
+				`
+			} else {
+				html = `
+					<option value="1">当月</option>
+					<option value="2">次月</option>
+				`
+				let date = new Date()
+				let day = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate()
+				for (let i = 1; i <= day; i++) {
+					monthHtml += `<option value="${i}">${i}号</option>`
+				}
+			}
+			$('select[lay-filter="setting-time-type"]').empty().append(html)
+			$('select[name="timeValue1"]').empty().append(monthHtml)
+			$('select[name="timeValue2"]').empty().append(monthHtml)
+			form.render()
+		},
+		countCycle: function(data) {
+			let count = 0
+			if (data.bucketType > 1) {
+				let date = new Date()
+				let date1 = new Date(`${date.getFullYear()}-${layui.util.digit(date.getMonth() + 1, 2)}-${layui.util.digit(date.getDate())} ${$('#data-setting-data-1').val()}`)
+				let date2 = new Date(`${date.getFullYear()}-${layui.util.digit(date.getMonth() + 1, 2)}-${layui.util.digit(date.getDate())} ${$('#data-setting-data-2').val()}`)
+				if (data.timeType1 != data.timeType2) {
+					date2.setDate(date2.getDate() + 1)
+				}
+				count = date2.getTime() - date1.getTime()
+				if (data.bucketType == 2) {
+					count = count / 3600000
+				} else if (data.bucketType == 3) {
+					count = count / 60000
+				} else {
+					count = count / 1000
+				}
+			} else {
+				if (data.timeType1 == data.timeType2) {
+					count = parseInt(data.timeValue2) - parseInt(data.timeValue1) + 1
+				} else {
+					const elem = $('select[name="timeValue1"] option')
+					count = parseInt(elem.eq(elem.length - 1).attr('value')) - parseInt(data.timeValue1) + parseInt(data.timeValue2) + 1
+				}
+			}
+			return count
+		}
+	}
+	
+	
 	const view = {
 		content: function() {
 			return `
 				<div class="layui-margin-3">
 					<form class="layui-form" action="" lay-filter="dataSettingForm">
+						${this.autoHeader()}
 						<div class="layui-form-item">
 							<label class="layui-form-label form-required-label">取值类型:</label>
 							<div class="layui-input-block">
@@ -19,6 +115,20 @@ layui.define(['layer', 'form'], function(exports) {
 				</div>
 			`
 		},
+		autoHeader: function() {
+			if (layui.sheetTypew.templateReportType != 1) {
+				return ''
+			}
+			return `
+				<div class="layui-form-item ${layui.itemListTable.data.type == 'edit' ? 'layui-hide' : ''}">
+					<label class="layui-form-label form-required-label">数据类型:</label>
+					<div class="layui-input-block">
+						<input type="radio" name="dataValueType" value="0" title="数据集" lay-filter="data-setting-data-type" checked>
+						<input type="radio" name="dataValueType" value="1" title="单值" lay-filter="data-setting-data-type"> 
+					</div>
+				</div>
+			`
+		},
 		autoContent: function() {
 			if (layui.sheetTypew.templateReportType != 1) {
 				return ''
@@ -31,26 +141,88 @@ layui.define(['layer', 'form'], function(exports) {
 						<input type="radio" name="valueTakingMode" value="2" title="最大值"> 
 						<input type="radio" name="valueTakingMode" value="3" title="最小值">
 						<input type="radio" name="valueTakingMode" value="4" title="瞬时值">
+						<input type="radio" name="valueTakingMode" value="5" title="求和">
+						<input type="radio" name="valueTakingMode" value="6" title="计数">
 					</div>
 				</div>
-				<fieldset class="layui-elem-field">
+				<fieldset class="layui-elem-field ${layui.itemListTable.data.type == 'edit' ? 'layui-hide' : ''}">
 					<legend>取值周期设置</legend>
 					<div class="layui-field-box">
 						<div class="layui-form-item">
 							<label class="layui-form-label form-required-label">时间单位:</label>
 							<div class="layui-input-block">
-								<input type="radio" name="bucketType" value="1" title="天">
-								<input type="radio" name="bucketType" value="2" title="时" checked> 
-								<input type="radio" name="bucketType" value="3" title="分">
-								<input type="radio" name="bucketType" value="4" title="秒"> 
+								<input type="radio" name="bucketType" value="0" title="月" lay-filter="data-setting-bucket-type">
+								<input type="radio" name="bucketType" value="1" title="天" lay-filter="data-setting-bucket-type">
+								<input type="radio" name="bucketType" value="2" title="时" checked lay-filter="data-setting-bucket-type"> 
+								<input type="radio" name="bucketType" value="3" title="分" lay-filter="data-setting-bucket-type">
+								<input type="radio" name="bucketType" value="4" title="秒" lay-filter="data-setting-bucket-type"> 
 							</div>
 						</div>
-						<div class="layui-form-item">
+						<div class="layui-form-item setting-bucket-value">
 							<label class="layui-form-label form-required-label">切换周期:</label>
 							<div class="layui-input-block">
 								<input name="bucketValue" type="number" lay-affix="number" value="1" placeholder="数据切换周期" step="1" min="1" class="layui-input">
 							</div>
 						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label form-required-label">数据区域时间范围:</label>
+							<div class="layui-input-block data-setting-data-time">
+								<div class="layui-input-inline" style="width: 30px;">
+									<span class="layui-form-label" style="width: 20px;">从:</span>
+								</div>
+								<div class="layui-input-inline" style="width: 72px;">
+									<select name="dateTimeType1">
+										<option value="1">当日</option>
+										<option value="2">次日</option>
+									</select>
+								</div>
+								<div class="layui-input-inline" style="width: 100px;">
+									<input id="data-setting-data-1" type="text" class="layui-input" readonly />
+								</div>
+								<div class="layui-input-inline" style="width: 30px;">
+									<span class="layui-form-label" style="width: 20px;">至:</span>
+								</div>
+								<div class="layui-input-inline" style="width: 72px;">
+									<select name="dateTimeType2">
+										<option value="1">当日</option>
+										<option value="2">次日</option>
+									</select>
+								</div>
+								<div class="layui-input-inline" style="width: 100px;">
+									<input id="data-setting-data-2" type="text" class="layui-input" readonly />
+								</div>
+							</div>
+							
+							<div class="layui-input-block data-setting-data-day layui-hide">
+								<div class="layui-input-inline" style="width: 30px;">
+									<span class="layui-form-label" style="width: 20px;">从:</span>
+								</div>
+								<div class="layui-input-inline" style="width: 72px;">
+									<select name="timeType1" lay-filter="setting-time-type">
+										
+									</select>
+								</div>
+								<div class="layui-input-inline" style="width: 100px;">
+									<select name="timeValue1">
+										
+									</select>
+								</div>
+								<div class="layui-input-inline" style="width: 30px;">
+									<span class="layui-form-label" style="width: 20px;">至:</span>
+								</div>
+								<div class="layui-input-inline" style="width: 72px;">
+									<select name="timeType2" lay-filter="setting-time-type">
+										
+									</select>
+								</div>
+								<div class="layui-input-inline" style="width: 100px;">
+									<select name="timeValue2">
+										
+									</select>
+								</div>
+							</div>
+							
+						</div>
 					</div>
 				</fieldset>
 			`
@@ -63,7 +235,7 @@ layui.define(['layer', 'form'], function(exports) {
 			layer.open({
 				type: 1,
 				title: ['设置数据条件', 'text-align: center;padding-left: 81px;'],
-				area: ['600px', type == 1 ? '450px' : '200px'],
+				area: [type == 1 ? '800px' : '600px', type == 1 ? '600px' : '200px'],
 				btn: ['确定', '取消'],
 				content: view.content(),
 				success: function() {
@@ -79,21 +251,81 @@ layui.define(['layer', 'form'], function(exports) {
 						}
 						form.val('dataSettingForm', data)
 					}
+					if (type == 1) {
+						layui.laydate.render({
+							elem: '#data-setting-data-1',
+							type: 'time',
+						});
+						layui.laydate.render({
+							elem: '#data-setting-data-2',
+							type: 'time',
+						});
+					}
 				},
 				yes: function(index) {
-					const data = form.val('dataSettingForm')
-					if (type == 1) {
-						if (!data.bucketValue || parseInt(data.bucketValue) < 1) {
-							layer.msg('请设置正确的数据切换周期!', {icon: 2})
-							return
+					let data = form.val('dataSettingForm')
+					if (layui.itemListTable.data.type != 'edit') {
+					
+						if (type == 1) {
+							if (data.dataValueType == 0 && (!data.bucketValue || parseInt(data.bucketValue) < 1)) {
+								layer.msg('请设置正确的数据切换周期!', {icon: 2})
+								return
+							}
+							if (data.dateTimeType1 == 2 && data.dateTimeType2 == 1) {
+								layer.msg('数据区域时间范围设置错误!', {icon: 2})
+								return
+							}
+							if (data.bucketType > 1) {
+								if (!$('#data-setting-data-1').val() || !$('#data-setting-data-2').val()) {
+									layer.msg('请设置数据区域时间范围!', {icon: 2})
+									return
+								}
+								let date = new Date()
+								let date1 = new Date(`${date.getFullYear()}-${layui.util.digit(date.getMonth() + 1, 2)}-${layui.util.digit(date.getDate())} ${$('#data-setting-data-1').val()}`)
+								let date2 = new Date(`${date.getFullYear()}-${layui.util.digit(date.getMonth() + 1, 2)}-${layui.util.digit(date.getDate())} ${$('#data-setting-data-2').val()}`)
+								if (data.dateTimeType1 == data.dateTimeType2) {
+									if (date1.getTime() >= date2.getTime()) {
+										layer.msg('数据区域时间范围设置错误!', {icon: 2})
+										return
+									}
+								}
+								if (data.bucketType == 2) {
+									if (date1.getMinutes() > 0 || date1.getSeconds() > 0 || date2.getMinutes() > 0 || date2.getSeconds() > 0) {
+										layer.msg('当前时间单位为时,数据区域时间范围请精确到时!', {icon: 2})
+										return
+									}
+								}
+								if (data.bucketType == 3) {
+									if (date1.getSeconds() > 0 || date2.getSeconds() > 0) {
+										layer.msg('当前时间单位为分,数据区域时间范围请精确到分!', {icon: 2})
+										return
+									}
+								}
+							} else {
+								if (data.timeType1 == data.timeType2) {
+									if (data.timeValue1 >= data.timeValue2) {
+										layer.msg('数据区域时间范围设置错误!', {icon: 2})
+										return
+									}
+								}
+							}
+							if (data.dataValueType == 0) {
+								const count = parseInt(event.countCycle(data) / parseInt(data.bucketValue))
+								if (count <= 0) {
+									layer.msg('可显示值数量不足一条,请重新设置切换周期或数据区域时间范围!', {icon: 2})
+									return
+								}
+								data.count = count
+							}
 						}
 					}
 					if (params.success) {
+						data.startTime = $('#data-setting-data-1').val()
+						data.endTime = $('#data-setting-data-2').val()
 						params.success(data, index)
 					} else {
 						layer.close(index)
 					}
-					
 				}
 			});
 		}

File diff suppressed because it is too large
+ 1761 - 1
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/excel-util.js


+ 190 - 564
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/item-list-table.js

@@ -1,29 +1,39 @@
-layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'itemVarW', 'laydate'], function(exports) {
+layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'itemVarW', 'laydate', 'itemUtil'], function(exports) {
 	const layer = layui.layer
 	const form = layui.form
 	const table = layui.table
 	const util = layui.util
 	const sheetUtil = layui.sheetUtil
 	
+	$(document).on('blur', '.item-val-line', function() {
+		if (!$(this).val()) {
+			return
+		}
+		if (layui.sheetTypew.templateReportType == 1) {
+			if (parseInt($(this).val()) > fn.data.dataSetting.count) {
+				$(this).val(fn.data.dataSetting.count)
+			}
+		}
+	})
 	util.on({
 		'data-item-switch-btn': function() {
-			const itemGroupId = $('select[name="data-item-group"]').val()
-			if (!itemGroupId) {
-				layer.msg('请选择数据组', {icon: 2})
+			const policyId = $('select[name="data-item-group"]').val()
+			if (!policyId) {
+				layer.msg('请选择策略组', {icon: 2})
 				return
 			}
-			const itemGroupName = $('select[name="data-item-group"] option[value="'+ itemGroupId +'"]').text()
+			const policyName = $(`select[name="data-item-group"] option[value="${policyId}"]`).text()
 			layui.itemListw.open({
-				itemGroupId,
+				policyId,
 				success: function(data, index) {
 					let itemList = data.map((item) => {
-						const width = sheetUtil.getTextWidth('^.' + item.title + '.' + itemGroupName)
+						const width = sheetUtil.getTextWidth('^.' + item.title)
 						return {
 							uid: uuidv4(),
 							itemId: item.value,
 							itemName: item.title,
-							itemGroupId,
-							itemGroupName,
+							policyId,
+							policyName,
 							width,
 							tableId: fn.data.tableId
 						}
@@ -32,10 +42,6 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 					table.reloadData('item-list-table', {
 						data: fn.data.itemList
 					})
-					table.setRowChecked('item-list-table', {
-						index: 'all',
-						checked: true
-					})
 					layer.close(index)
 				}
 			})
@@ -46,6 +52,12 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 				return
 			}
 			val = parseInt(val) + 1
+			if (layui.sheetTypew.templateReportType == 1) {
+				if (val > fn.data.dataSetting.count) {
+					$(this).prev().val(fn.data.dataSetting.count)
+					return
+				}
+			}
 			$(this).prev().val(val)
 		},
 		'item-table-num-cut': function() {
@@ -72,43 +84,25 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 			})
 		},
 		'data-item-setting-btn': function() {
-			const checkData = table.checkStatus('item-list-table')
-			if (!checkData.data.length) {
+			if (!fn.data.itemList.length) {
 				layer.msg('请选择数据项!', {icon: 2})
 				return
 			}
 			layui.dataSettingw.open({
 				success: function(data, index) {
 					const type = layui.sheetTypew.templateReportType
-					let arr = []
-					if (!checkData.isAll) {
-						arr = checkData.data.map(item => item.uid)
-					}
-					fn.data.itemList = fn.data.itemList.map((item) => {
-						if (checkData.isAll || arr.includes(item.uid)) {
-							let obj = {
-								uid: item.uid,
-								itemId: item.itemId,
-								itemName: item.itemName,
-								itemGroupId: item.itemGroupId,
-								itemGroupName: item.itemGroupName,
-								valueType: data.valueType,
-								width: item.width,
-								tableId: item.tableId
-							}
-							if (type == 1) {
-								obj.valueTakingMode = data.valueTakingMode
-								obj.bucketType = data.bucketType
-								obj.bucketValue = data.bucketValue
-							}
-							return obj
-						}
-						return item
-					})
+					fn.data.dataSetting = data
+					
 					table.reloadData('item-list-table', {
 						data: fn.data.itemList
 					})
 					layer.msg('设置数据条件成功!', {icon: 1})
+					$('.item-val-line').val('1')
+					if (data.dataValueType == 0) {
+						$('.hand-valline').removeClass('layui-hide')
+					} else {
+						$('.hand-valline').addClass('layui-hide')
+					}
 					layer.close(index)
 				}
 			})
@@ -176,40 +170,7 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 	})
 	
 	table.on('tool(item-list-table)', function(obj) {
-		if (obj.event == 'edit') {
-			layui.dataSettingw.open({
-				data: obj.data,
-				success: function(data, index) {
-					const type = layui.sheetTypew.templateReportType
-					fn.data.itemList = fn.data.itemList.map((item) => {
-						if (item.uid == obj.data.uid) {
-							let obj = {
-								uid: item.uid,
-								itemId: item.itemId,
-								itemName: item.itemName,
-								itemGroupId: item.itemGroupId,
-								itemGroupName: item.itemGroupName,
-								valueType: data.valueType,
-								width: item.width,
-								tableId: item.tableId
-							}
-							if (type == 1) {
-								obj.valueTakingMode = data.valueTakingMode
-								obj.bucketType = data.bucketType
-								obj.bucketValue = data.bucketValue
-							}
-							return obj
-						}
-						return item
-					})
-					table.reloadData('item-list-table', {
-						data: fn.data.itemList
-					})
-					layer.msg('编辑数据条件成功!', {icon: 1})
-					layer.close(index)
-				}
-			})
-		} else if (obj.event == 'del') {
+		if (obj.event == 'del') {
 			layer.confirm('是否确认删除该数据项?', {
 				btn: ['确定', '取消']
 			}, function() {
@@ -222,23 +183,13 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 			});
 		}
 	})
-	
-	form.on('select(data-item-group)', function(data) {
-		const type = layui.sheetTypew.templateReportType
-		if (type == 2) {
-			if ($('#condition-txt').data('itemgroupid') != data.value) {
-				layui.api.getTableItemGroupById(data.value).then(json => {
-					const itemJson = json.itemList.filter(item => {
-						return item.isDriverItem == 1
-					})
-					$('#condition-txt').html((itemJson[0].describe || itemJson[0].itemReadName) + '&nbsp;' + conditionTableItems[json.data.eventMode] 
-					+ '&nbsp;' + json.data.modeValue)
-					$('#condition-txt').parent().removeClass('layui-hide')
-				})
-			}
+	form.on('radio(dataValType)', function(data) {
+		if (data.elem.value == 1) {
+			$('.data-valLine').addClass('layui-hide')
+		} else {
+			$('.data-valLine').removeClass('layui-hide')
 		}
 	})
-	
 	form.on('radio(variableType)', function(data) {
 		if (data.elem.value == 1) {
 			$('button[lay-on="itemvar-event-2"]').addClass('layui-hide')
@@ -286,7 +237,7 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 						</div>
 						<div class="layui-form-item">
 							<div class="layui-inline ${fn.data.type == 'edit'? 'layui-hide' : ''}">
-								<label class="layui-form-label" style="width: 60px;padding-left: 0;">数据组:</label>
+								<label class="layui-form-label" style="width: 60px;padding-left: 0;">策略组:</label>
 								<div class="layui-input-inline">
 									<select name="data-item-group" lay-filter="data-item-group">
 										<option value=""></option>
@@ -300,7 +251,6 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 							</div>
 						</div>
 					</form>
-					${this.conditionView()}
 					<div id="item-list-table" lay-filter="item-list-table"></div>
 					<form lay-filter="item-list-form" class="layui-form ${fn.data.type == 'edit'? 'layui-hide' : ''}" action="" style="margin-top: 30px;">
 						${this.bottomContent()}
@@ -308,19 +258,6 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 				</div>
 			`
 		},
-		conditionView: function() {
-			const type = layui.sheetTypew.templateReportType
-			if (type == 2) {
-				return `
-					<div class="layui-hide" style="padding-bottom: 15px;">
-						<span>条件:</span>
-						<span id="condition-txt" style="color: #a5a5a5;"></span>
-					</div>
-				`
-			} else {
-				return ''
-			}
-		},
 		bottomContent: function() {
 			const type = layui.sheetTypew.templateReportType
 			if (type == 0 || type == 1) {
@@ -377,11 +314,11 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 						<label class="layui-form-label" style="width: 130px;">时间范围:</label>
 						 <div class="layui-inline" id="hand-elem-date">
 							<div class="layui-input-inline">
-								<input readonly type="text" autocomplete="off" id="hand-start-date" class="layui-input" placeholder="开始时间">
+								<input readonly type="text" autocomplete="off" id="hand-start-date" name="startDate" class="layui-input" placeholder="开始时间">
 							</div>
 							<div class="layui-form-mid">-</div>
 							<div class="layui-input-inline">
-								<input readonly type="text" autocomplete="off" id="hand-end-date" class="layui-input" placeholder="结束时间">
+								<input readonly type="text" autocomplete="off" id="hand-end-date" name="endDate" class="layui-input" placeholder="结束时间">
 							</div>
 						</div> 
 					</div>
@@ -402,6 +339,11 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 							<input type="radio" name="valType" value="1" title="横向" checked>
 							<input type="radio" name="valType" value="2" title="纵向"> 
 						</div>
+						<div class="layui-form-item">
+							<label class="layui-form-label" style="width: 130px;">是否显示标题:</label>
+							<input type="radio" name="isTitleShow" value="0" title="显示">
+							<input type="radio" name="isTitleShow" value="1" title="不显示" checked> 
+						</div>
 						<div class="layui-form-item ${layui.sheetTypew.templateReportType == 1 ? '' : 'layui-hide'}">
 							<label class="layui-form-label" style="width: 130px;">是否显示数据时间:</label>
 							<input type="radio" name="isShowDataTime" value="0" title="显示" checked>
@@ -413,14 +355,16 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 			`
 			if (layui.sheetTypew.templateReportType == 1) {
 				html += `
-					<fieldset class="hand-valline layui-elem-field">
+					<fieldset class="hand-valline layui-elem-field layui-hide">
 						<legend>值显示数量</legend>
-						<div class="layui-field-box">
-							<div class="layui-input-group">
+						<div class="layui-field-box" style="display:flex;">
+							<input type="radio" name="dataValType" value="1" title="全部" lay-filter="dataValType" checked>
+							<input type="radio" name="dataValType" value="2" title="指定" lay-filter="dataValType" > 
+							<div class="layui-input-group data-valLine layui-hide">
 								<div lay-on="item-table-num-cut" class="layui-input-split layui-input-prefix" style="cursor: pointer;">
 									<i class="layui-icon layui-icon-subtraction"></i>
 								</div>
-								<input type="text" name="valLine" placeholder="数量" class="layui-input" value="1" oninput="value=value.replace(/[^\\d]/g,'')">
+								<input type="text" name="valLine" placeholder="数量" class="layui-input item-val-line" value="1" oninput="value=value.replace(/[^\\d]/g,'')">
 								<div lay-on="item-table-num-add" class="layui-input-split layui-input-suffix" style="cursor: pointer;">
 									<i class="layui-icon layui-icon-addition"></i>
 								</div>
@@ -462,73 +406,84 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 			})
 		},
 		renderItemHandTable: function() {
-			table.render({
-				elem: '#item-list-table',
-				height: 350,
-				cols: [[
+			let cols = [
 					{type: 'checkbox'},
 					{type: 'numbers', title: '序号', align: 'center'},
-					{field: 'itemGroupName', title: '数据组名称', align: 'center'},
+					{field: 'policyName', title: '策略组名称', align: 'center'},
 					{field: 'itemName', title: '数据项名称', align: 'center'},
 					{field: 'valueType', title: '取值类型', align: 'center', templet: function(d) {
-						return d.valueType ? (d.valueType == 1 ? '原始值' : '计算值') : ''
+						return fn.data.dataSetting.valueType ? (fn.data.dataSetting.valueType == 1 ? '计算值' : '原始值') : ''
 					}},
-					{title: '操作', width: 130, templet: function(d) {
-						return `
-							<span lay-event="edit" class="layui-font-blue" style="cursor: pointer;"><i class="layui-icon layui-icon-edit"></i>编辑</span>
-							<span lay-event="del" class="layui-font-red ${fn.data.type == 'edit'? 'layui-hide' : ''}" style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除</span>
-						`
-					}},
-				]],
+				]
+			if (fn.data.type != 'edit') {
+				cols.push({title: '操作', width: 130, templet: function(d) {
+					return `
+						<span lay-event="del" class="layui-font-red " style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除</span>
+					`
+				}})
+			}
+			table.render({
+				elem: '#item-list-table',
+				height: 350,
+				cols: [cols],
 				data: fn.data.itemList
 			})
 		},
 		renderItemAutoTable: function() {
+			let cols = [
+				{type: 'checkbox'},
+				{type: 'numbers', title: '序号', align: 'center'},
+				{field: 'policyName', title: '策略组名称', align: 'center'},
+				{field: 'itemName', title: '数据项名称', align: 'center'},
+				{field: 'valueType', title: '取值类型', align: 'center', templet: function(d) {
+					return fn.data.dataSetting.valueType ? (fn.data.dataSetting.valueType == 1 ? '计算值' : '原始值') : ''
+				}},
+				{field: 'valueTakingMode', title: '取值模式', align: 'center', templet: function(d) {
+					const valueTakingMode = fn.data.dataSetting.valueTakingMode
+					if (valueTakingMode == 1) {
+						return '平均值'
+					} else if (valueTakingMode == 2) {
+						return '最大值'
+					} else if (valueTakingMode == 3) {
+						return '最小值'
+					} else if (valueTakingMode == 4) {
+						return '瞬时值'
+					} else if (valueTakingMode == 5) {
+						return '求和'
+					} else if (valueTakingMode == 6) {
+						return '计数'
+					} else {
+						return ''
+					}
+				}},
+				{field: 'bucketType', title: '取值时间单位', align: 'center', templet: function(d) {
+					const bucketType = fn.data.dataSetting.bucketType
+					if (bucketType == 0) {
+						return '月'
+					} else if (bucketType == 1) {
+						return '天'
+					} else if (bucketType == 2) {
+						return '时'
+					} else if (bucketType == 3) {
+						return '分'
+					} else if (bucketType == 4) {
+						return '秒'
+					} else {
+						return ''
+					}
+				}},
+			]
+			if (fn.data.type != 'edit') {
+				cols.push({title: '操作', width: 130, templet: function(d) {
+					return `
+						<span lay-event="del" class="layui-font-red" style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除</span>
+					`
+				}})
+			}
 			table.render({
 				elem: '#item-list-table',
 				height: 350,
-				cols: [[
-					{type: 'checkbox'},
-					{type: 'numbers', title: '序号', align: 'center'},
-					{field: 'itemGroupName', title: '数据组名称', align: 'center'},
-					{field: 'itemName', title: '数据项名称', align: 'center'},
-					{field: 'valueType', title: '取值类型', align: 'center', templet: function(d) {
-						return d.valueType ? (d.valueType == 1 ? '原始值' : '计算值') : ''
-					}},
-					{field: 'valueTakingMode', title: '取值模式', align: 'center', templet: function(d) {
-						if (d.valueTakingMode == 1) {
-							return '平均值'
-						} else if (d.valueTakingMode == 2) {
-							return '最大值'
-						} else if (d.valueTakingMode == 3) {
-							return '最小值'
-						} else if (d.valueTakingMode == 4) {
-							return '瞬时值'
-						} else {
-							return ''
-						}
-					}},
-					{field: 'bucketType', title: '取值时间单位', align: 'center', templet: function(d) {
-						if (d.bucketType == 1) {
-							return '天'
-						} else if (d.bucketType == 2) {
-							return '时'
-						} else if (d.bucketType == 3) {
-							return '分'
-						} else if (d.bucketType == 4) {
-							return '秒'
-						} else {
-							return ''
-						}
-					}},
-					{field: 'bucketValue', title: '数据切换周期', align: 'center'},
-					{title: '操作', width: 130, templet: function(d) {
-						return `
-							<span lay-event="edit" class="layui-font-blue" style="cursor: pointer;"><i class="layui-icon layui-icon-edit"></i>编辑</span>
-							<span lay-event="del" class="layui-font-red ${fn.data.type == 'edit'? 'layui-hide' : ''}" style="cursor: pointer;"><i class="layui-icon layui-icon-delete"></i>删除</span>
-						`
-					}},
-				]],
+				cols: [cols],
 				data: fn.data.itemList
 			})
 		}
@@ -537,12 +492,14 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 	const fn = {
 		data: {
 			itemList: [],
+			dataSetting: {},
 			tableId: ''
 		},
 		open: function(params) {
 			const _this = this
 			_this.data.type = params.type
 			_this.data.itemList = params.type == 'edit' ? params.data : []
+			_this.data.dataSetting = params.type == 'edit' ? params.dataSetting : {}
 			layer.open({
 				type: 1,
 				title: ['数据项配置', 'text-align: center;padding-left: 81px;'],
@@ -563,10 +520,7 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 						layer.msg('请选择数据项!', {icon: 2})
 						return
 					}
-					const arr = _this.data.itemList.filter(item => {
-						return !item.valueType
-					})
-					if (arr.length) {
+					if (_this.data.dataSetting.valueType == null) {
 						layer.msg('请设置数据条件!', {icon: 2})
 						return
 					}
@@ -574,21 +528,72 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 						event.updateCell(_this.data.itemList, index)
 					} else {
 						const type = layui.sheetTypew.templateReportType
-						if (type == 5) {
-							if (!$('#itemvar-name-1').attr('data-itemid') || !$('#itemvar-name-2').attr('data-itemid') 
+						const itemForm = form.val('item-list-form')
+						if (type == 0) {
+							let dataSetting = _this.data.dataSetting
+							if (itemForm.isDataType == 2) {
+								if (!itemForm.startDate || !itemForm.endDate) {
+									layer.msg('请选择时间范围!', {icon: 2})
+									return
+								}
+								const ids = _this.data.itemList.map(item => item.itemId)
+								let params = {
+									idList: JSON.stringify(ids),
+									valueType: parseInt(dataSetting.valueType),
+									startTime: itemForm.startDate,
+									endTime: itemForm.endDate
+								}
+								if (itemForm.isDataNumber == 2) {
+									params.limit = itemForm.isDataNumberVal
+								}
+								layui.api.getPolicyHistoryDataByItemIdList(params).then(json => {
+									layui.itemUtil.manualReport(_this.data.itemList, json.data, itemForm, function() {
+										layer.close(index)
+									})
+								})
+							} else {
+								itemForm.isShowDataTime = 1
+								dataSetting.dataValueType = 1
+								layui.itemUtil.periodicReport(_this.data.itemList, itemForm, dataSetting, _this.data.tableId, function() {
+									layer.close(index)
+								})
+							}
+						} else if (type == 1) {
+							layui.itemUtil.periodicReport(_this.data.itemList, itemForm, _this.data.dataSetting, _this.data.tableId, function() {
+								layer.close(index)
+							})
+						} else if (type == 2) {
+							layui.itemUtil.periodicReport(_this.data.itemList, {
+								dataValType: 0,
+								valLine: layui.sheetTypew.templateEventReportNum,
+								isShowDataTime: 0,
+								isTitleShow: 0,
+								valType: 1
+							}, {
+								dataValueType: 0,
+								valueType: _this.data.dataSetting.valueType
+							}, _this.data.tableId, function() {
+								layer.close(index)
+							})
+						} else if (type == 5) {
+							if (!$('#itemvar-name-1').attr('data-itemid') || !$('#itemvar-name-2').attr('data-itemid')
 								|| sheetUtil.isBlank($('#itemvar-input-1').val()) || sheetUtil.isBlank($('#itemvar-input-2').val())) {
 								layer.msg('请设置设备报表条件!', {icon: 2})
 								return
 							}
-						}
-						const itemForm = form.val('item-list-form')
-						if (type == 0 && itemForm.isDataType == 2) {
-							if (!itemForm.startDate || !itemForm.endDate) {
-								layer.msg('请选择时间范围!', {icon: 2})
-								return
-							}
-						} else {
-							event.insertCell(_this.data.itemList, index)
+							layui.itemUtil.deviceReport(_this.data.itemList, {
+								valLine: layui.sheetTypew.templateEventReportNum,
+								isGenCountTime: $('input[type="radio"][name="isGenCountTime"]:checked').val(),
+							}, {
+								var1: $('#itemvar-name-1').attr('data-itemid'),
+								var2: $('#itemvar-name-2').attr('data-itemid'),
+								ipt1: $('#itemvar-input-1').val(),
+								ipt2: $('#itemvar-input-2').val(),
+								isGenCountTime: $('input[type="radio"][name="isGenCountTime"]:checked').val(),
+								valueType: _this.data.dataSetting.valueType
+							}, _this.data.tableId, function() {
+								layer.close(index)
+							})
 						}
 					}
 				}
@@ -597,282 +602,18 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 	}
 	
 	const event = {
-		insertCell: function(data, index) {
-			const _this = this
-			verify.cycle(data, {
-				suc: function(json) {
-					_this.insertData(data, {
-						sr: json.sr,
-						sc: json.sc,
-						tr: json.tr,
-						tc: json.tc
-					})
-					layer.close(index)
-				},
-				err: function(params) {
-					layer.confirm('检测到新增区域含有有值单元格,请选择以下操作', {
-						btn: ['覆盖新增', '不覆盖新增', '取消']
-					}, function(idx) {
-						_this.insertData(data, {
-							sr: params.position.sr,
-							sc: params.position.sc,
-							tr: params.position.tr,
-							tc: params.position.tc
-						})
-						layer.close(idx)
-						layer.close(index)
-					}, function(idx) {
-						if (params.row) {
-							luckysheet.insertRow(params.row.row - 1, {
-								number: params.row.er - params.row.row + 1
-							})
-						}
-						if (params.column) {
-							luckysheet.insertColumn(params.column.column - 1, {
-								number: params.column.ec - params.column.column + 1
-							})
-						}
-						_this.insertData(data, {
-							sr: params.position.sr,
-							sc: params.position.sc,
-							tr: params.position.tr,
-							tc: params.position.tc
-						})
-						layer.close(idx)
-						layer.close(index)
-					});
-				}
-			})
-		},
-		insertData: function(data, params) {
-			const type = layui.sheetTypew.templateReportType
-			if (type == 0) {
-				let itemForm = form.val('item-list-form')
-				itemForm.valLine = 1
-				this.insertCellData(data, params, itemForm, type)
-			} else if (type == 1) {
-				let itemForm = form.val('item-list-form')
-				if (itemForm.isShowDataTime != 1 && itemForm.valType == 1) {
-					itemForm.valLine = parseInt(itemForm.valLine) + 1
-				}
-				this.insertCellData(data, params, itemForm, type)
-			} else if (type == 2 || type == 5) {
-				const num = parseInt(layui.sheetTypew.templateEventReportNum)
-				this.insertCellData(data, params, {valType: 1, valLine: num + 1}, type)
-			}
-		},
-		insertCellData: function(data, params, itemForm, type) {
-			let itemVarObj = {}
-			if (type == 5) {
-				itemVarObj = {
-					var1: $('#itemvar-name-1').attr('data-itemid'),
-					var2: $('#itemvar-name-2').attr('data-itemid'),
-					ipt1: $('#itemvar-input-1').val(),
-					ipt2: $('#itemvar-input-2').val(),
-					isGenCountTime: $('input[type="radio"][name="isGenCountTime"]:checked').val(),
-					tableId: fn.data.tableId,
-					type: 'index'
-				}
-			}
-			const valLine = parseInt(itemForm.valLine)
-			let arr = []
-			let widthArr = {}
-			if (itemForm.valType == 1) {
-				// 横向
-				for (let i = 0; i < valLine; i++) {
-					let row = []
-					if ((type == 1 && itemForm.isShowDataTime != 1) || type == 2) {
-						row.push({
-							m: i == 0 ? '数据时间' : '^.datatime',
-							v: i == 0 ? '数据时间' : JSON.stringify({
-								tableId: fn.data.tableId,
-								type: 'datatime'
-							}),
-							ff: 1,
-							ht: 0
-						})
-					} else if (type == 5) {
-						row.push({
-							m: i == 0 ? '序号' : '^.index',
-							v: i == 0 ? '序号' : JSON.stringify(itemVarObj),
-							ff: 1,
-							ht: 0
-						})
-						row.push({
-							m: i == 0 ? '开始时间' : '^.starttime',
-							v: i == 0 ? '开始时间' : JSON.stringify({
-								tableId: fn.data.tableId,
-								type: 'starttime'
-							}),
-							ff: 1,
-							ht: 0
-						})
-						row.push({
-							m: i == 0 ? '停止时间' : '^.stoptime',
-							v: i == 0 ? '停止时间' : JSON.stringify({
-								tableId: fn.data.tableId,
-								type: 'stoptime'
-							}),
-							ff: 1,
-							ht: 0
-						})
-						if ($('input[type="radio"][name="isGenCountTime"]:checked').val() == 1) {
-							row.push({
-								m: i == 0 ? '运行时间(分钟)' : '^.runtime',
-								v: i == 0 ? '运行时间(分钟)' : JSON.stringify({
-								tableId: fn.data.tableId,
-								type: 'runtime'
-							}),
-								ff: 1,
-								ht: 0
-							})
-						}
-					}
-					for (let j = 0; j < data.length; j++) {
-						if ((type == 1 && itemForm.isShowDataTime != 1) || type == 2 || type == 5) {
-							row.push({
-								m: (i == 0 ? '@' : '^.') + data[j].itemGroupName + '.' + data[j].itemName,
-								v: i == 0 ? ('@' + data[j].itemGroupName + '.' + data[j].itemName) : JSON.stringify(data[j]),
-								ff: 1,
-								ht: 0
-							})
-						} else {
-							row.push({
-								m: '^.' + data[j].itemGroupName + '.' + data[j].itemName,
-								v: JSON.stringify(data[j]),
-								ff: 1,
-								ht: 0
-							})
-						}
-						if (i == 0) {
-							let num = 0
-							if ((type == 1 && itemForm.isShowDataTime != 1) || type == 2) {
-								num = 1
-							} else {
-								if (type == 5) {
-									num = $('input[type="radio"][name="isGenCountTime"]:checked').val() == 1 ? 4 : 3
-								}
-							}
-							widthArr[params.sc + j + num] = data[j].width
-						}
-					}
-					arr.push(row)
-				}
-				luckysheet.setColumnWidth(widthArr)
-			} else {
-				let width = 0
-				let headerRow = []
-				for (let i = 0; i < data.length; i++) {
-					if (data[i].width > width) {
-						width = data[i].width
-					}
-					let row = []
-					if (type == 1 && itemForm.isShowDataTime != 1) {
-						if (i == 0) {
-							headerRow.push({
-								m: '数据时间',
-								v: '数据时间',
-								ff: 1,
-								ht: 0
-							})
-						}
-						row.push({
-							m: '@' + data[i].itemGroupName + '.' + data[i].itemName,
-							v: '@' + data[i].itemGroupName + '.' + data[i].itemName,
-							ff: 1,
-							ht: 0
-						})
-						
-					}
-					for (let j = 0; j < valLine; j++) {
-						if (i == 0 && type == 1 && itemForm.isShowDataTime != 1) {
-							headerRow.push({
-								m: '^.datatime',
-								v: JSON.stringify({
-									tableId: fn.data.tableId,
-									type: 'datatime'
-								}),
-								ff: 1,
-								ht: 0
-							})
-						}
-						row.push({
-							m: '^.' + data[i].itemGroupName + '.' + data[i].itemName,
-							v: JSON.stringify(data[i]),
-							ff: 1,
-							ht: 0
-						})
-					}
-					if (type == 1 && itemForm.isShowDataTime != 1 && i == 0) {
-						arr.push(headerRow)
-					}
-					arr.push(row)
-				}
-				for (let j = 0; j < valLine; j++) {
-					widthArr[params.sc + j] = width
-				}
-				if (type == 1 && itemForm.isShowDataTime != 1) {
-					widthArr[params.sc + valLine] = width
-				}
-			}
-			let er = params.sr + (itemForm.valType == 1 ? valLine : data.length)
-			let ec = params.sc + (itemForm.valType == 1 ? data.length : valLine)
-			if (type == 1) {
-				const num = itemForm.isShowDataTime == 1 ? 0 : 1
-				ec += num
-				if (itemForm.valType != 1) {
-					er += num
-				}
-			}else if (type == 2) {
-				ec += 1
-			} else if (type == 5) {
-				ec += $('input[type="radio"][name="isGenCountTime"]:checked').val() == 1 ? 4 : 3
-			}
-			if (er > params.tr) {
-				let num = er - params.tr + 20
-				while(num > 100) {
-					luckysheet.insertRow(params.sr, {
-						number: 100
-					})
-					num = num - 100
-				}
-				luckysheet.insertRow(params.sr, {
-					number: num
-				})
-			}
-			if (ec > params.tc) {
-				let num = ec - params.tc + 20
-				while(num > 100) {
-					luckysheet.insertColumn(params.sc, {
-						number: 100
-					})
-					num = num - 100
-				}
-				luckysheet.insertColumn(params.sc, {
-					number: num
-				})
-			}
-			setTimeout(() => {
-				luckysheet.setColumnWidth(widthArr)
-				luckysheet.setRangeValue(arr, {range: {
-					row: [params.sr, er - 1],
-					column: [params.sc, ec - 1],
-				}})
-			}, 100)
-		},
+		
 		updateCell: function(data, index) {
-			let obj = {}
-			for (let i = 0; i < data.length; i++) {
-				obj[data[i].uid] = data[i]
-			}
 			const sheetData = luckysheet.getSheetData(0)
 			const nData = sheetData.map(arr => {
 				return arr.map(item => {
 					if (item && item.v) {
 						try {
 							const cell = JSON.parse(item.v) || {}
-							if (cell && cell.uid && obj[cell.uid]) {
-								item.v = JSON.stringify(obj[cell.uid])
+							if (cell && cell.type == 'data') {
+								cell.setting.valueTakingMode = fn.data.dataSetting.valueTakingMode
+								cell.setting.valueType = fn.data.dataSetting.valueType
+								item.v = JSON.stringify(cell)
 							}
 						} catch(e) {
 						}
@@ -896,121 +637,6 @@ layui.define(['layer', 'form', 'table', 'util', 'dataSettingw', 'sheetUtil', 'it
 		}
 	}
 	
-	const verify = {
-		cycle: function(data, params) {
-			const type = layui.sheetTypew.templateReportType
-			const range = luckysheet.getRange()
-			if (type == 0) {
-				const itemForm = form.val('item-list-form')
-				const endRow = parseInt(itemForm.valType == 1 ? 1 : data.length) + (range[0].row)[0] - 1 
-				const endColumn = parseInt(itemForm.valType == 1 ? data.length : 1) + (range[0].column)[0] - 1
-				this.cycleSheet(data, params, endRow, endColumn)
-			} else if (type == 1) {
-				const itemForm = form.val('item-list-form')
-				const num = itemForm.isShowDataTime == 1 ? 0 : 1
-				const endRow = parseInt(itemForm.valType == 1 ? itemForm.valLine : data.length) + (range[0].row)[0] - 1 + num
-				const endColumn = parseInt(itemForm.valType == 1 ? data.length : itemForm.valLine) + (range[0].column)[0] - 1 + num
-				this.cycleSheet(data, params, endRow, endColumn)
-			} else if (type == 2) {
-				this.cycleSheet(data, params, parseInt(layui.sheetTypew.templateEventReportNum) + (range[0].row)[0], data.length + (range[0].column)[0])
-			} else if (type == 5) {
-				const num = $('input[type="radio"][name="isGenCountTime"]:checked').val() == 1 ? 3 : 2
-				this.cycleSheet(data, params, parseInt(layui.sheetTypew.templateEventReportNum) + (range[0].row)[0], data.length + (range[0].column)[0] + num)
-			}
-		},
-		cycleSheet: function(data, params, endRow, endColumn) {
-			// 验证周期报表
-			const range = luckysheet.getRange()
-			
-			const arr = luckysheet.getSheetData(0)
-			for (let i = (range[0].row)[0]; i < arr.length; i++) {
-				if (i > endRow || i == arr.length - 1) {
-					params.suc({
-						sr: (range[0].row)[0],
-						sc: (range[0].column)[0],
-						tr: arr.length,
-						tc: arr[0].length
-					})
-					break
-				}
-				for (let j = (range[0].column)[0]; j < arr[i].length; j++) {
-					if (j > endColumn) {
-						break
-					}
-					if (!arr[i][j]) {
-						continue
-					}
-					if (arr[i][j].v && arr[i][j].m) {
-						this.cycleSheetRow(arr, {
-							row: i,
-							column: j,
-							er: endRow,
-							ec: endColumn,
-							sr: (range[0].row)[0],
-							sc: (range[0].column)[0],
-							tr: arr.length,
-							tc: arr[0].length,
-							callback: params.err
-						})
-						return
-					}
-				}
-			}
-		},
-		cycleSheetRow: function(arr, params) {
-			for (let i = params.row + 1; i < arr.length; i++) {
-				if (i > params.er) {
-					// 插入列
-					params.callback({
-						column: {
-							row: params.row,
-							column: params.column,
-							er: params.er,
-							ec: params.ec
-						},
-						position: {
-							sr: params.sr,
-							sc: params.sc,
-							tr: params.tr,
-							tc: params.tc
-						}
-					})
-					break
-				}
-				for (let j = params.sc; j < arr[i].length; j++) {
-					if (j > params.column) {
-						break
-					}
-					if (!arr[i][j]) {
-						continue
-					}
-					if (arr[i][j].v && arr[i][j].m) {
-						params.callback({
-							column: {
-								row: params.row,
-								column: params.column,
-								er: params.er,
-								ec: params.ec
-							},
-							row: {
-								row: i,
-								column: j,
-								er: params.er,
-								ec: params.ec
-							},
-							position: {
-								sr: params.sr,
-								sc: params.sc,
-								tr: params.tr,
-								tc: params.tc
-							}
-						})
-						return
-					}
-				}
-			}
-		}
-	}
 	
 	exports('itemListTable', fn);
 });

+ 1 - 1
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/item-list-window.js

@@ -52,7 +52,7 @@ layui.define(['layer', 'form', 'transfer'], function(exports) {
 				content: view.itemList(),
 				success: function() {
 					form.render()
-					view.render(params.itemGroupId)
+					view.render(params.policyId)
 				},
 				yes: function(index) {
 					const arr = transfer.getData('item-list-transfer')

+ 549 - 0
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/item-util.js

@@ -0,0 +1,549 @@
+layui.define(function(exports) {
+	
+	const util = {
+		cell: function(m, v) {
+			return {
+				m,
+				v: v || m,
+				ff: 1,
+				ht: 0,
+				tb: 0
+			}
+		},
+		mcCell: function(mc) {
+			return {
+				mc
+			}
+		}
+	}
+	
+	const fn = {
+		periodicReport: function(data, itemForm, setting, tableId, callback) {
+			// 周期报表
+			let vertical = 0, horizontal = 0
+			horizontal = data.length
+			if (itemForm.isShowDataTime == 0) {
+				horizontal = horizontal + 1
+			}
+			if (itemForm.isTitleShow == 0) {
+				vertical = vertical + 1
+			}
+			if (setting.dataValueType == 0) {
+				if (itemForm.dataValType == 1) {
+					vertical = vertical + setting.count
+				} else {
+					vertical = vertical + parseInt(itemForm.valLine)
+				}
+			} else {
+				vertical = vertical + 1
+			}
+			const column = itemForm.valType == 1 ? horizontal : vertical
+			const row = itemForm.valType == 1 ? vertical : horizontal
+			const _this = this
+			_this.checkReport({
+				row,
+				column,
+				success: json => {
+					const rs = json.rs || 0
+					const cs = json.cs || 0
+					let cellsData = _this.plugCell(json)
+					let cdata = {}
+					console.log(json)
+					for (let i = 0; i < row; i++) {
+						let ri = rs > 0 ? (i == 0 ? 0 : i * rs) : i
+						for (let j = 0; j < column; j++) {
+							if (itemForm.valType == 1) {
+								cdata = data[j - (itemForm.isShowDataTime == 0 ? 1 : 0)]
+							} else {
+								cdata = data[i - (itemForm.isShowDataTime == 0 ? 1 : 0)]
+							}
+							let ci = cs > 0 ? (j == 0 ? 0 : j * cs) : j
+							if (i == 0) {
+								if (itemForm.valType == 1) {
+									if (itemForm.isTitleShow == 0) {
+										if (j == 0 && itemForm.isShowDataTime == 0) {
+											cellsData[ri][ci] = util.cell('数据时间')
+										} else {
+											cellsData[ri][ci] =
+												util.cell('@' + cdata.itemName)
+										}
+									} else {
+										if (j == 0 && itemForm.isShowDataTime == 0) {
+											cellsData[ri][ci] = util.cell('^.datatime',
+												JSON.stringify({
+													tableId,
+													type: 'datatime'
+												})
+											)
+										} else {
+											cellsData[ri][ci] =
+												util.cell('^.' + cdata.itemName,
+													JSON.stringify({
+														type: 'data',
+														data: cdata,
+														setting,
+														itemForm,
+														tableId
+													})
+												)
+										}
+									}
+								} else {
+									if (itemForm.isShowDataTime == 0) {
+										if (j == 0 && itemForm.isTitleShow == 0) {
+											cellsData[ri][ci] = util.cell('数据时间')
+										} else {
+											cellsData[ri][ci] = util.cell('^.datatime',
+												JSON.stringify({
+													tableId,
+													type: 'datatime'
+												})
+											)
+										}
+									} else {
+										if (j == 0 && itemForm.isTitleShow == 0) {
+											cellsData[ri][ci] =
+												util.cell('@' + cdata.itemName)
+										} else {
+											cellsData[ri][ci] =
+												util.cell('^.' + cdata.itemName,
+													JSON.stringify({
+														type: 'data',
+														data: cdata,
+														setting,
+														itemForm,
+														tableId
+													})
+												)
+										}
+									}
+								}
+							} else {
+								if (itemForm.valType == 1) {
+									if (j == 0 && itemForm.isShowDataTime == 0) {
+										cellsData[ri][ci] = util.cell('^.datatime',
+											JSON.stringify({
+												tableId,
+												type: 'datatime'
+											})
+										)
+									} else {
+										cellsData[ri][ci] =
+											util.cell('^.' + cdata.itemName,
+												JSON.stringify({
+													type: 'data',
+													data: cdata,
+													setting,
+													itemForm,
+													tableId
+												})
+											)
+									}
+								} else {
+									if (j == 0 && itemForm.isTitleShow == 0) {
+										cellsData[ri][ci] =
+											util.cell('@' + cdata.itemName)
+									} else {
+										cellsData[ri][ci] =
+											util.cell('^.' + cdata.itemName,
+												JSON.stringify({
+													type: 'data',
+													data: cdata,
+													setting,
+													itemForm,
+													tableId
+												})
+											)
+									}
+								}
+							}
+								
+							if ((cs > 0 || rs > 0) && cellsData[ri][ci]) {
+								let sri = ri
+								while(sri < ri + rs) {
+									let sci = ci
+									while (sci < ci + cs) {
+										if (cellsData[sri][sci] && cellsData[sri][sci].m) {
+											cellsData[sri][sci].mc = {
+												c: ci + json.c,
+												r: ri + json.r,
+												cs,
+												rs
+											}
+										} else {
+											cellsData[sri][sci] = util.mcCell({
+												r: ri + json.r,
+												c: ci + json.c
+											})
+										}
+										sci += 1
+									}
+									sri += 1
+								}
+							}
+							
+							
+						}
+					}
+					console.log(cellsData)
+					luckysheet.setRangeValue(cellsData, {range: {
+						row: [json.r, json.r + cellsData.length - 1],
+						column: [json.c, json.c + cellsData[0].length - 1],
+					}})
+					callback()
+				}
+			})
+		},
+		manualReport: function(itemList, data, itemForm, callback) {
+			// 手动报表
+			let dataJson = {}
+			let timeJson = data[0].dataTimeList
+			for (let i = 0; i < data.length; i++) {
+				dataJson[data[i].id] = data[i].dataValueList
+			}
+			let vertical = 0, horizontal = 0
+			horizontal = itemList.length
+			if (itemForm.isShowDataTime == 0) {
+				horizontal = horizontal + 1
+			}
+			if (itemForm.isTitleShow == 0) {
+				vertical = vertical + 1
+			}
+			if (itemForm.isDataNumber == 1) {
+				vertical = vertical + timeJson.length
+			} else {
+				vertical = vertical + parseInt(itemForm.isDataNumberVal)
+			}
+			const column = itemForm.valType == 1 ? horizontal : vertical
+			const row = itemForm.valType == 1 ? vertical : horizontal
+			const _this = this
+			_this.checkReport({
+				row,
+				column,
+				success: json => {
+					const rs = json.rs || 0
+					const cs = json.cs || 0
+					let cellsData = _this.plugCell(json)
+					let cdata = {}
+					console.log(json)
+					for (let i = 0; i < row; i++) {
+						let ri = rs > 0 ? (i == 0 ? 0 : i * rs) : i
+						for (let j = 0; j < column; j++) {
+							if (itemForm.valType == 1) {
+								cdata = itemList[j - (itemForm.isShowDataTime == 0 ? 1 : 0)]
+							} else {
+								cdata = itemList[i - (itemForm.isShowDataTime == 0 ? 1 : 0)]
+							}
+							let ci = cs > 0 ? (j == 0 ? 0 : j * cs) : j
+							if (i == 0) {
+								if (itemForm.valType == 1) {
+									if (itemForm.isTitleShow == 0) {
+										if (j == 0 && itemForm.isShowDataTime == 0) {
+											cellsData[ri][ci] = util.cell('数据时间')
+										} else {
+											cellsData[ri][ci] =
+												util.cell('@' + cdata.itemName)
+										}
+									} else {
+										if (j == 0 && itemForm.isShowDataTime == 0) {
+											cellsData[ri][ci] = util.cell(timeJson ? timeJson[0] : '')
+											if (timeJson) {
+												timeJson.splice(0, 1)
+											}
+										} else {
+											cellsData[ri][ci] = util.cell(dataJson[cdata.itemId] ? dataJson[cdata.itemId][0] : '')
+											if (dataJson[cdata.itemId]) {
+												dataJson[cdata.itemId].splice(0, 1)
+											}
+										}
+									}
+								} else {
+									if (itemForm.isShowDataTime == 0) {
+										if (j == 0 && itemForm.isTitleShow == 0) {
+											cellsData[ri][ci] = util.cell('数据时间')
+										} else {
+											cellsData[ri][ci] = util.cell(timeJson ? timeJson[0] : '')
+											if (timeJson) {
+												timeJson.splice(0, 1)
+											}
+										}
+									} else {
+										if (j == 0 && itemForm.isTitleShow == 0) {
+											cellsData[ri][ci] =
+												util.cell('@' + cdata.itemName)
+										} else {
+											cellsData[ri][ci] = util.cell(dataJson[cdata.itemId] ? dataJson[cdata.itemId][0] : '')
+											if (dataJson[cdata.itemId]) {
+												dataJson[cdata.itemId].splice(0, 1)
+											}
+										}
+									}
+								}
+							} else {
+								if (itemForm.valType == 1) {
+									if (j == 0 && itemForm.isShowDataTime == 0) {
+										cellsData[ri][ci] = util.cell(timeJson ? timeJson[0] : '')
+										if (timeJson) {
+											timeJson.splice(0, 1)
+										}
+									} else {
+										cellsData[ri][ci] = util.cell(dataJson[cdata.itemId] ? dataJson[cdata.itemId][0] : '')
+										if (dataJson[cdata.itemId]) {
+											dataJson[cdata.itemId].splice(0, 1)
+										}
+									}
+								} else {
+									if (j == 0 && itemForm.isTitleShow == 0) {
+										cellsData[ri][ci] =
+											util.cell('@' + cdata.itemName)
+									} else {
+										cellsData[ri][ci] = util.cell(dataJson[cdata.itemId] ? dataJson[cdata.itemId][0] : '')
+										if (dataJson[cdata.itemId]) {
+											dataJson[cdata.itemId].splice(0, 1)
+										}
+									}
+								}
+							}
+								
+							if ((cs > 0 || rs > 0) && cellsData[ri][ci]) {
+								let sri = ri
+								while(sri < ri + rs) {
+									let sci = ci
+									while (sci < ci + cs) {
+										if (cellsData[sri][sci] && cellsData[sri][sci].m) {
+											cellsData[sri][sci].mc = {
+												c: ci + json.c,
+												r: ri + json.r,
+												cs,
+												rs
+											}
+										} else {
+											cellsData[sri][sci] = util.mcCell({
+												r: ri + json.r,
+												c: ci + json.c
+											})
+										}
+										sci += 1
+									}
+									sri += 1
+								}
+							}
+							
+							
+						}
+					}
+					console.log(cellsData)
+					luckysheet.setRangeValue(cellsData, {range: {
+						row: [json.r, json.r + cellsData.length - 1],
+						column: [json.c, json.c + cellsData[0].length - 1],
+					}})
+					callback()
+				}
+			})
+			
+		},
+		deviceReport: function(data, itemForm, setting, tableId, callback) {
+			// 设备报表
+			let row = 1 + parseInt(itemForm.valLine), column = 3 + data.length
+			if (itemForm.isGenCountTime == 1) {
+				column = column + 1
+			}
+			const _this = this
+			_this.checkReport({
+				row,
+				column,
+				success: json => {
+					const rs = json.rs || 0
+					const cs = json.cs || 0
+					let cellsData = _this.plugCell(json)
+					let cdata = {}
+					console.log(json)
+					for (let i = 0; i < row; i++) {
+						let ri = rs > 0 ? (i == 0 ? 0 : i * rs) : i
+						for (let j = 0; j < column; j++) {
+							cdata = data[j - (itemForm.isGenCountTime == 1 ? 4 : 3)]
+							let ci = cs > 0 ? (j == 0 ? 0 : j * cs) : j
+							if (i == 0) {
+								if (j == 0) {
+									cellsData[ri][ci] = util.cell('序号')
+								} else if (j == 1) {
+									cellsData[ri][ci] = util.cell('开始时间')
+								} else if (j == 2) {
+									cellsData[ri][ci] = util.cell('停止时间')
+								} else if (j == 3 && itemForm.isGenCountTime == 1) {
+									cellsData[ri][ci] = util.cell('运行时间(分钟)')
+								} else {
+									cellsData[ri][ci] = util.cell('@' + cdata.itemName)
+								}
+							} else {
+								if (j == 0) {
+									cellsData[ri][ci] = util.cell('^.index', JSON.stringify({
+										tableId,
+										type: 'index',
+										setting
+									}))
+								} else if (j == 1) {
+									cellsData[ri][ci] = util.cell('^.starttime', JSON.stringify({
+										tableId,
+										type: 'starttime'
+									}))
+								} else if (j == 2) {
+									cellsData[ri][ci] = util.cell('^.stoptime', JSON.stringify({
+										tableId,
+										type: 'stoptime'
+									}))
+								} else if (j == 3 && itemForm.isGenCountTime == 1) {
+									cellsData[ri][ci] = util.cell('^.runtime', JSON.stringify({
+										tableId,
+										type: 'runtime'
+									}))
+								} else {
+									cellsData[ri][ci] =
+										util.cell('^.' + cdata.itemName,
+											JSON.stringify({
+												type: 'data',
+												data: cdata,
+												tableId
+											})
+										)
+								}
+								
+							}
+								
+							if ((cs > 0 || rs > 0) && cellsData[ri][ci]) {
+								let sri = ri
+								while(sri < ri + rs) {
+									let sci = ci
+									while (sci < ci + cs) {
+										if (cellsData[sri][sci].m) {
+											cellsData[sri][sci].mc = {
+												c: ci,
+												r: ri,
+												cs,
+												rs
+											}
+										} else {
+											cellsData[sri][sci] = util.mcCell({
+												r: ri,
+												c: ci
+											})
+										}
+										sci += 1
+									}
+									sri += 1
+								}
+							}
+							
+							
+						}
+					}
+					console.log(cellsData)
+					luckysheet.setRangeValue(cellsData, {range: {
+						row: [json.r, json.r + cellsData.length - 1],
+						column: [json.c, json.c + cellsData[0].length - 1],
+					}})
+					callback()
+				}
+			})
+		},
+		checkReport: function(params) {
+			// 校验报表
+			let data = {}
+			// 初始坐标
+			const position = luckysheet.getRangeWithFlatten()[0]
+			// 单元格数据
+			const sheetData = luckysheet.getSheetData(0)
+			// 结束坐标
+			let endRow = position.r + params.row
+			let endColumn = position.c + params.column
+			// 判断起始坐标是否为合并单元格
+			const initialData = sheetData[position.r][position.c]
+			if (initialData && initialData.mc) {
+				const {rs, cs} = initialData.mc
+				endRow = position.r + params.row * rs
+				endColumn = position.c + params.column * cs
+				data.rs = rs
+				data.cs = cs
+			}
+			data.r = position.r
+			data.c = position.c
+			data.er = endRow
+			data.ec = endColumn
+			let type = 0
+			r: for (let i = position.r; i < sheetData.length; i++) {
+				if (i > endRow) {
+					break
+				}
+				for (let j = position.c; j < sheetData[i].length; j++) {
+					if (j > endColumn) {
+						break
+					}
+					if (sheetData[i][j] && sheetData[i][j].m) {
+						type = endRow - i < endColumn - j ? 1 : 2
+						break r
+					}
+				}
+			}
+			// 补足差的行数
+			let rowNum = 0
+			// 补足差的列数
+			let columnNum = 0
+			if (type > 0) {
+				if (type == 1) {
+					rowNum = endRow - position.r
+				} else {
+					columnNum = endColumn - position.c
+				}
+			} else {
+				if (endRow > sheetData.length - 1) {
+					rowNum = endRow - (sheetData.length - 1) + 20
+				}
+				if (endColumn > sheetData[0].length - 1) {
+					columnNum = endColumn - (sheetData[0].length - 1) + 20
+				}
+			}
+			if (rowNum > 0) {
+				while(rowNum > 100) {
+					luckysheet.insertRow(position.r, {
+						number: 100
+					})
+					rowNum = rowNum - 100
+				}
+				luckysheet.insertRow(position.r, {
+					number: rowNum
+				})
+			}
+			if (columnNum > 0) {
+				// 补足差的列数
+				while(columnNum > 100) {
+					luckysheet.insertColumn(position.c, {
+						number: 100
+					})
+					columnNum = columnNum - 100
+				}
+				luckysheet.insertColumn(position.c, {
+					number: columnNum
+				})
+			}
+			params.success(data)
+		},
+		plugCell: function(json) {
+			const arr = luckysheet.getSheetData(0)
+			let rowData = []
+			for (let i = json.r; i < json.er; i++) {
+				let columnData = []
+				for (let j = json.c; j < json.ec; j++) {
+					columnData.push({})
+				}
+				rowData.push(columnData)
+			}
+			luckysheet.setRangeValue(rowData, {range: {
+				row: [json.r, json.r + rowData.length - 1],
+				column: [json.c, json.c + rowData[0].length - 1],
+			}})
+			return rowData
+		}
+	}
+	
+	exports('itemUtil', fn);
+});

+ 19 - 3
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/right-menu.js

@@ -23,7 +23,7 @@ layui.define(['layer', 'util', 'jquery', 'form', 'sheetTypew', 'chartRightw', 'i
 				templateType: sheetTypew.templateReportType,
 				eventNum: sheetTypew.templateEventReportNum,
 				templateData: JSON.stringify({
-					sheet: luckysheet.getSheetData(0),
+					sheet: luckysheet.getAllSheets()[0],
 					chart: layui.excelUtil.getChartData()
 				}),
 			}
@@ -88,8 +88,24 @@ layui.define(['layer', 'util', 'jquery', 'form', 'sheetTypew', 'chartRightw', 'i
 		data: function() {
 			const rangeWithFlatten = luckysheet.getRangeWithFlatten()
 			if (!rangeWithFlatten || rangeWithFlatten.length != 1) {
-				layer.msg('请选择一项单元格!', {icon: 2})
-				return
+				const ranges = luckysheet.getRange()
+				if (ranges.length > 1) {
+					layer.msg('请选择一项单元格或单个合并区域!', {icon: 2})
+					return
+				}
+				const range = ranges[0]
+				if (range.column[0] != range.column[1] || range.row[0] != range.row[1]) {
+					const data = luckysheet.getSheetData(0)[range.row[0]][range.column[0]]
+					if (data && data.mc) {
+						if (!(range.column[0] + data.mc.cs - 1 == range.column[1] && range.row[0] + data.mc.rs - 1 == range.row[1])) {
+							layer.msg('请选择一项单元格或单个合并区域!', {icon: 2})
+							return
+						}
+					} else {
+						layer.msg('请选择一项单元格或单个合并区域!', {icon: 2})
+						return
+					}
+				}
 			}
 			const cell = luckysheet.getCellValue(rangeWithFlatten[0].r, rangeWithFlatten[0].c, {type: 'm'})
 			if (cell) {

+ 24 - 29
industry-system/industry-da/src/main/resources/static/reportSheet/js/src/model/sheet-util.js

@@ -18,28 +18,32 @@ layui.define(function(exports) {
 			let metrics = context.measureText(text);
 			return parseInt(metrics.width) + 1;
 		},
-		getItemData: function(tableId) {
+		getItemData: function(tableId, callback) {
 			const arr = luckysheet.getSheetData(0)
 			const data = []
 			const idArr = []
+			let dataSetting = null
 			for (let i = 0; i < arr.length; i++) {
 				
 				for (let j = 0; j < arr[i].length; j++) {
 					if (arr[i][j] && arr[i][j].v) {
 						try {
 							const obj = JSON.parse(arr[i][j].v) || {}
-							if (obj && obj.tableId && obj.tableId == tableId && obj.uid && !idArr.includes(obj.uid)) {
-								idArr.push(obj.uid)
-								data.push(obj)
+							if (obj && obj.type == 'data' && obj.tableId == tableId && !idArr.includes(obj.data.uid)) {
+								idArr.push(obj.data.uid)
+								data.push(obj.data)
+								if (!dataSetting) {
+									dataSetting = obj.setting
+								}
 							}
 						} catch(e) {
 						}
 					}
 				}
 			}
-			return data
+			callback(data, dataSetting)
 		},
-		init: function(sheetData, edit) {
+		init: function(sheetData, edit, sheetConfig) {
 			const _this = this
 			let moveJson = {
 				move: false,
@@ -52,36 +56,22 @@ layui.define(function(exports) {
 			if ((templateReportType == 2 || templateReportType == 5) && !edit) {
 				option.row = parseInt(layui.sheetTypew.templateEventReportNum) + 50
 			}
-			
+			if (sheetConfig && sheetConfig.data) {
+				option.data = sheetConfig.data
+			}
 			option.hook = {
-				cellMousedownBefore: function(cell, position, sheet) {
-					// if (cell && cell.v) {
-					// 	try {
-					// 		const data = JSON.parse(cell.v) || {}
-					// 		if (data && data.tableId) {
-					// 			const itemList = layui.sheetUtil.getItemData(data.tableId)
-					// 			layui.itemListTable.open({
-					// 				data: itemList,
-					// 				type: 'edit'
-					// 			})
-					// 			return false
-					// 		}
-					// 	} catch(e) {
-					// 		console.log(e)
-					// 	}
-					// }
-					return true
-				},
 				cellEditBefore: function(range) {
 					const cell = luckysheet.getCellValue((range[0].row)[0], (range[0].column)[0], {type: 'v'})
 					if (cell) {
 						try {
 							const data = JSON.parse(cell) || {}
 							if (data && data.tableId) {
-								const itemList = layui.sheetUtil.getItemData(data.tableId)
-								layui.itemListTable.open({
-									data: itemList,
-									type: 'edit'
+								layui.sheetUtil.getItemData(data.tableId, function(json, dataSetting) {
+									layui.itemListTable.open({
+										data: json,
+										dataSetting,
+										type: 'edit'
+									})
 								})
 							}
 						} catch(e) {
@@ -235,6 +225,11 @@ layui.define(function(exports) {
 							}
 						})
 					}
+					if (sheetConfig && sheetConfig.type == 'export') {
+						setTimeout(() => {
+							layui.excelUtil.downloadExcel($('#template-name').val())
+						}, 300)
+					}
 					
 				}
 			}

+ 30 - 3
industry-system/industry-da/src/main/resources/static/reportSheet/js/util/constants.js

@@ -17,6 +17,7 @@ var layui = layui.config({
 	chartUtil: 'model/echart-util',
 	sheetUtil: 'model/sheet-util',
 	excelUtil: 'model/excel-util',
+	itemUtil: 'model/item-util',
 	ajaxCascader: 'ajaxCascader/ajaxCascader'
 })
 
@@ -24,6 +25,28 @@ const use = {
 	index: ['layer', 'form', 'sheetTypew', 'rightMenu', 'chartRightw', 'ruler', 'api']
 }
 
+Date.prototype.format = function(fmt) {
+	var o = {
+		"M+": this.getMonth() + 1, //月份
+		"d+": this.getDate(), //日
+		"H+": this.getHours(), //小时
+		"h+": this.getHours(), //小时
+		"m+": this.getMinutes(), //分
+		"s+": this.getSeconds(), //秒
+		"q+": Math.floor((this.getMonth() + 3) / 3), //季度
+		"S": this.getMilliseconds() //毫秒
+	};
+	if(/(y+)/.test(fmt)) {
+		fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+	}
+	for(var k in o) {
+		if(new RegExp("(" + k + ")").test(fmt)) {
+			fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+		}
+	}
+	return fmt;
+};
+
 
 const chartOption = {
 	bar: {
@@ -170,7 +193,7 @@ const chartDefaultFrom = {
 		isChartDataType: 1,
 		startDate: '',
 		endDate: '',
-		isChartDataNumber: 1,
+		isChartDataNumber: 2,
 		isChartDataNumberVal: 10
 	},
 	titleForm: {
@@ -278,7 +301,11 @@ const sheetOption = {
 		horizontalAlignMode: true, // 水平对齐方式
 		verticalAlignMode: true, // 垂直对齐方式
 		function: true, // 公式
-		print: false
+		print: false,
+		image: true,
+		link: true,
+		textRotateMode: true,
+		sortAndFilter: true
 	},
 	showsheetbar: false, // 是否显示底部 sheet 页按钮
 	sheetFormulaBar: false, // 是否显示公式
@@ -294,7 +321,7 @@ const sheetOption = {
 		insertColumn: true, // 插入列
 		deleteRow: true, // 删除选中行
 		deleteColumn: true, // 删除选中列
-		deleteCell: false, // 删除单元格
+		deleteCell: true, // 删除单元格
 		hideRow: false, // 隐藏选中行和显示选中行
 		hideColumn: false, // 隐藏选中列和显示选中列
 		rowHeight: true, // 行高

+ 76 - 7
report-client/src/components/HeaderMain/index.vue

@@ -25,7 +25,7 @@
               <el-button type="text" size="mini" style="color: #ffffff" title="新建报表" @click="addReportEvent"
                 icon="el-icon-document-add"></el-button>
               <el-button type="text" size="mini" style="color: #ffffff; margin-left: 5px" title="导入报表"
-                @click="importReportEvent" icon="el-icon-upload2"></el-button>
+                @click="importReportEvent" icon="el-icon-upload2" id="import-xlsx-btn"></el-button>
             </span>
           </span>
         </el-tree>
@@ -39,6 +39,9 @@
       <!-- 报表数据策略列表 -->
       <DataPolicyList></DataPolicyList>
     </el-tab-pane>
+	
+	<input ref="importFileNode" class="import-file-node" type="file" @change="loadExcel" accept=".xlsx"
+	       style="display: none;"></input>
 
     <!-- 报表模版配置列表右键操作 -->
     <ul v-show="visibleReportMenu" :style="{ left: menuLeft + 'px', top: menuTop + 'px' }"
@@ -240,6 +243,8 @@ import { mapGetters } from "vuex";
 import { v4 as uuidv4 } from "uuid";
 import PVirtualCheck from "@/components/PVirtualCheck";
 import DataPolicyList from "./dataPolicyList.vue"
+import LuckyExcel from 'luckyexcel'
+import ExcelJS from 'exceljs';
 
 export default {
   name: "HeaderMain",
@@ -956,12 +961,76 @@ export default {
     },
     /** 导入报表模板 */
     importReportEvent() {
-      localStorage.setItem("IMPORT_FILE_FLAG", "true");
-      goPage(this, "/reportTemplate2", {
-        id: -999,
-        type: "import",
-      });
-    },
+		this.$refs.importFileNode.dispatchEvent(new MouseEvent('click'))
+      // localStorage.setItem("IMPORT_FILE_FLAG", "true");
+      // goPage(this, "/reportTemplate2", {
+      //   id: -999,
+      //   type: "import",
+      // });
+    },
+	loadExcel(evt) {
+		let _this = this
+		const files = evt.target.files
+		if (files == null || files.length == 0) {
+			return
+		}
+		if (!files[0].name.endsWith('.xlsx')) {
+			showAlertMsgWin(_this, null, '只能导入xlsx格式文件!')
+			return
+		}
+		const loading = showLoading(this, '文件导入中,请稍候···')
+		let status = true
+		const reader = new FileReader();
+		reader.onload = function(event) {
+			const data = new Uint8Array(event.target.result);
+			const workbook = new ExcelJS.Workbook();
+			workbook.xlsx.load(data).then(function(workbook) {
+				workbook.eachSheet(function(worksheet, sheetId) {
+					if (status) {
+						status = false
+						let hyperlink = {}
+						worksheet.eachRow(function(row, rowNumber) {
+							row.eachCell(function(cell, colNumber) {
+								 if (cell.type === ExcelJS.ValueType.Hyperlink) {
+									hyperlink[(parseInt(rowNumber) - 1) + '_' + (parseInt(colNumber) - 1)] = {
+										linkAddress: cell.value.hyperlink,
+										linkTooltip: cell.value.text,
+										linkType: 'external'
+									}
+								 } else if (cell.type === ExcelJS.ValueType.String) {
+									 if (/![A-Z]+\d+/g.test(cell.value) && cell.value.startsWith(worksheet.name + '!')) {
+										hyperlink[(parseInt(rowNumber) - 1) + '_' + (parseInt(colNumber) - 1)] = {
+											linkAddress: cell.value,
+											linkTooltip: cell.value,
+											linkType: 'internal'
+										}
+									 }
+								 }
+							});
+						});
+						LuckyExcel.transformExcelToLucky(files[0], function (exportJson, luckysheetfile) {
+							loading.close()
+						  localStorage.setItem('IMPORT_FILE_CONTENT', JSON.stringify({
+							  luckysheetfile,
+							  hyperlink
+						  }))
+						  goPage(_this, "/reportTemplate2", {
+						    id: -999,
+						    type: "import",
+						  });
+						  document.getElementsByClassName('import-file-node')[0].value = ''
+						})
+					}
+				});
+			});
+		};
+		reader.onerror = function(event) {
+		  document.getElementsByClassName('import-file-node')[0].value = ''
+		  showAlertMsgWin(_this, null, '读取文件失败,请稍后再试!')
+		  return
+		};
+		reader.readAsArrayBuffer(files[0]);
+	},
     /** 刷新报表列表 */
     refreshReportData() {
       if (this.chooseReportParentNode) {

+ 8 - 2
report-client/src/views/report_template/index2.vue

@@ -21,9 +21,12 @@ export default {
 				this.sendMsg({
 					cmd: 'show',
 					data: {
-						reportId: this.$route.query.id
+						reportId: this.$route.query.id,
+						type: this.$route.query.type,
+						files: localStorage.getItem('IMPORT_FILE_CONTENT'),
 					}
 				})
+				
 			}
 		},
 	},
@@ -35,7 +38,9 @@ export default {
                 data: {
                     token: localStorage.getItem('C_TOKEN'),
                     url: localStorage.getItem('SYS_HOST'),
-					reportId: _this.$route.query.id
+					reportId: _this.$route.query.id,
+					type: this.$route.query.type,
+					files: localStorage.getItem('IMPORT_FILE_CONTENT'),
                 }
             })
             window.addEventListener('message', function (event) {
@@ -47,6 +52,7 @@ export default {
         },
 		sendMsg(msg) {
 			document.getElementById('myIframe').contentWindow.postMessage(msg, '*')
+			localStorage.setItem("IMPORT_FILE_CONTENT", '');
 		}
 
     },

Some files were not shown because too many files changed in this diff