From af03d197f0d5ff87fbd368ed87432a461d1050c3 Mon Sep 17 00:00:00 2001 From: plough Date: Tue, 28 Feb 2017 15:59:10 +0800 Subject: [PATCH] =?UTF-8?q?REPORT-1916=20=E5=81=9A=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E7=9A=84=E8=BF=87=E7=A8=8B=E5=92=8C=E8=80=97=E6=97=B6=E6=94=B6?= =?UTF-8?q?=E9=9B=86=3D=E3=80=8B=E5=AE=8C=E6=88=90=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=9A=84=E6=9C=AC=E5=9C=B0=E5=AD=98=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/JPolyWorkBook.java | 1 - .../com/fr/design/mainframe/JWorkBook.java | 64 ++++++++- .../com/fr/design/mainframe/JTemplate.java | 45 +++++- .../templateinfo/TemplateInfoCollector.java | 133 ++++++++++++++++++ .../src/com/fr/design/mainframe/JForm.java | 30 ++++ 5 files changed, 267 insertions(+), 6 deletions(-) create mode 100644 designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java diff --git a/designer/src/com/fr/design/mainframe/JPolyWorkBook.java b/designer/src/com/fr/design/mainframe/JPolyWorkBook.java index bfdb39664..aa5a727e8 100644 --- a/designer/src/com/fr/design/mainframe/JPolyWorkBook.java +++ b/designer/src/com/fr/design/mainframe/JPolyWorkBook.java @@ -24,7 +24,6 @@ public class JPolyWorkBook extends JWorkBook { super(new WorkBook(new PolyWorkSheet()), DEFAULT_NAME); populateReportParameterAttr(); } - /** * 创建sheet名称tab面板 diff --git a/designer/src/com/fr/design/mainframe/JWorkBook.java b/designer/src/com/fr/design/mainframe/JWorkBook.java index f3722c4ac..2494e20a0 100644 --- a/designer/src/com/fr/design/mainframe/JWorkBook.java +++ b/designer/src/com/fr/design/mainframe/JWorkBook.java @@ -3,6 +3,7 @@ package com.fr.design.mainframe; import com.fr.base.BaseUtils; import com.fr.base.FRContext; import com.fr.base.Parameter; +import com.fr.base.parameter.ParameterUI; import com.fr.design.DesignModelAdapter; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.AllowAuthorityEditAction; @@ -54,7 +55,10 @@ import com.fr.main.impl.WorkBook; import com.fr.main.parameter.ReportParameterAttr; import com.fr.poly.PolyDesigner; import com.fr.privilege.finegrain.WorkSheetPrivilegeControl; +import com.fr.report.cellcase.CellCase; import com.fr.report.elementcase.TemplateElementCase; +import com.fr.report.poly.PolyWorkSheet; +import com.fr.report.report.Report; import com.fr.report.worksheet.WorkSheet; import com.fr.stable.ArrayUtils; import com.fr.stable.StableUtils; @@ -66,10 +70,7 @@ import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.FileOutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * JWorkBook used to edit WorkBook. @@ -129,6 +130,61 @@ public class JWorkBook extends JTemplate { return centerPane; } + // 获取模板类型 + public int getReportType() { + return template.isElementCaseBook() ? 0 : 1; + } + + // 获取模板格子数 + public int getCellCount() { + int cellCount = 0; + if (template.isElementCaseBook()) { // 如果是普通报表 + for (int i = 0; i < template.getReportCount(); i++) { + WorkSheet r = (WorkSheet) template.getReport(i); + CellCase cc = r.getBlock().getCellCase(); + for (int j = 0; j < cc.getRowCount(); j++) { + Iterator iter = cc.getRow(j); + while (iter.hasNext()) { + cellCount ++; + iter.next(); + } + } + } + } + return cellCount; + } + // 获取模板悬浮元素个数 + public int getFloatCount() { + int chartCount = 0; + if (template.isElementCaseBook()) { // 如果是普通报表 + for (int i = 0; i < template.getReportCount(); i++) { + WorkSheet r = (WorkSheet) template.getReport(i); + Iterator fiter = r.getBlock().floatIterator(); + while (fiter.hasNext()) { + chartCount ++; + fiter.next(); + } + } + } + return chartCount; + } + // 获取模板聚合块个数 + public int getBlockCount() { + int blockCount = 0; + if (!template.isElementCaseBook()) { // 如果是聚合报表 + for (int i = 0; i < template.getReportCount(); i++) { + PolyWorkSheet r = (PolyWorkSheet) template.getReport(i); + blockCount += r.getBlockCount(); + } + } + return blockCount; + } + // 获取模板控件数 + public int getWidgetCount() { + ParameterUI pui = template.getReportParameterAttr().getParameterUI(); + return pui == null ? 0 : (pui.getAllWidgets().length - 1); + } + /** * 判断sheet权限 * diff --git a/designer_base/src/com/fr/design/mainframe/JTemplate.java b/designer_base/src/com/fr/design/mainframe/JTemplate.java index 58060d91a..3f016812c 100644 --- a/designer_base/src/com/fr/design/mainframe/JTemplate.java +++ b/designer_base/src/com/fr/design/mainframe/JTemplate.java @@ -27,6 +27,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.layout.FRGUIPaneFactory; +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.MenuDef; import com.fr.design.menu.NameSeparator; @@ -72,16 +73,25 @@ public abstract class JTemplate> ex private UndoManager authorityUndoManager; protected U undoState; protected U authorityUndoState = null; + protected T template; // 当前模板 private static short currentIndex = 0;// 此变量用于多次新建模板时,让名字不重复 private DesignModelAdapter designModel; private PreviewProvider previewType; + private long openTime = 0L; // 打开模板的时间点(包括新建模板) + private TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); public JTemplate(T t, String defaultFileName) { - this(t, new MemFILE(newTemplateNameByIndex(defaultFileName))); + this(t, new MemFILE(newTemplateNameByIndex(defaultFileName)), true); + initForCollect(); } public JTemplate(T t, FILE file) { + this(t, file, false); + } + + public JTemplate(T t, FILE file, boolean isNewFile) { super(t); + this.template = t; this.previewType = parserPreviewProvider(t.getPreviewType()); this.editingFILE = file; this.setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -89,8 +99,38 @@ public abstract class JTemplate> ex this.add(createCenterPane(), BorderLayout.CENTER); this.undoState = createUndoState(); designModel = createDesignModel(); + // 如果不是新建模板,并且在收集列表中 + if (!isNewFile && tic.inList(t)) { + openTime = System.currentTimeMillis(); + } } + // 为收集模版信息作准备 + private void initForCollect() { + if (template.getReportletsid() == null) { + template.initReportletsid(); // 为新模板设置 reportletsid 属性 + } + if (openTime == 0) { + openTime = System.currentTimeMillis(); + } + } + private void collectInfo() { // 执行收集操作 + long saveTime = System.currentTimeMillis(); // 保存模板的时间点 + tic.collectInfo(template, this, openTime, saveTime); + openTime = saveTime; // 更新 openTime,准备下一次计算 + } + + // 获取模板类型。0 代表普通报表,1 代表聚合报表,2 代表表单 + public abstract int getReportType(); + // 获取模板格子数 + public abstract int getCellCount(); + // 获取模板悬浮元素个数 + public abstract int getFloatCount(); + // 获取模板聚合块个数 + public abstract int getBlockCount(); + // 获取模板控件数 + public abstract int getWidgetCount(); + public U getUndoState() { return undoState; } @@ -439,6 +479,7 @@ public abstract class JTemplate> ex JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Inter.getLocText("FR-Designer_No-Privilege") + "!", Inter.getLocText("FR-Designer_Message"), JOptionPane.WARNING_MESSAGE); return false; } + collectInfo(); return this.saveFile(); } @@ -487,6 +528,8 @@ public abstract class JTemplate> ex boolean result = this.saveFile(); if (result) { DesignerFrameFileDealerPane.getInstance().refresh(); + initForCollect(); // 如果是旧模板另存为新模板,则添加 reportletsid + collectInfo(); } //更换最近打开 DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(oldName, this.getFullPathName()); diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java new file mode 100644 index 000000000..52542e14d --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -0,0 +1,133 @@ +package com.fr.design.mainframe.templateinfo; + +import com.fr.base.io.IOFile; +import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.JTemplate; +import com.fr.general.FRLogger; +import com.fr.general.GeneralUtils; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; + +import java.io.*; +import java.util.Date; +import java.util.HashMap; + +/** + * 做模板的过程和耗时收集,辅助类 + * Created by plough on 2017/2/21. + */ +public class TemplateInfoCollector implements Serializable { + private static final String FILE_NAME = "tplInfo.ser"; + private static TemplateInfoCollector instance; + private HashMap> templateInfoList; + + @SuppressWarnings("unchecked") + private TemplateInfoCollector() { + // 先尝试从文件读取 + try{ + ObjectInputStream is = new ObjectInputStream(new FileInputStream(getInfoFile())); + templateInfoList = (HashMap>) is.readObject(); + } catch (FileNotFoundException ex) { + // 如果之前没有存储过,则创建新对象 + templateInfoList = new HashMap<>(); + } catch (Exception ex) { + FRLogger.getLogger().error(ex.getMessage(), ex); + } + } + + /** + * 获取缓存文件存放路径 + */ + private static File getInfoFile() { + return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); + } + + public static TemplateInfoCollector getInstance() { + if (instance == null) { + instance = new TemplateInfoCollector(); + } + return instance; + } + + /** + * 根据模板ID是否在收集列表中,判断是否需要收集当前模板的信息 + */ + public boolean inList(T t) { + return templateInfoList.containsKey(t.getReportletsid()); + } + + // 将包含所有信息的对象保存到文件 + private void saveInfo() { + try { + ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); + System.out.println("写入:" + instance.templateInfoList); + os.writeObject(instance.templateInfoList); + os.close(); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + + public HashMap getInfoList() { + for (String key : templateInfoList.keySet()) { + System.out.println(templateInfoList.get(key)); + } + return templateInfoList; + } + + /** + * 收集模板信息。如果之前没有记录,则新增;如果已有记录,则更新。 + * 同时将最新数据保存到文件中。 + */ + public void collectInfo(T t, JTemplate jt, long openTime, long saveTime) { + HashMap templateInfo; + + if (inList(t)) { // 已有记录 + templateInfo = templateInfoList.get(t.getReportletsid()); + } else { // 新增 + templateInfo = new HashMap<>(); + + String username = DesignerEnvManager.getEnvManager().getBBSName(); + String uuid = DesignerEnvManager.getEnvManager().getUUID(); + String activitykey = DesignerEnvManager.getEnvManager().getActivationKey(); + String reportletsid = t.getReportletsid(); + String createTime = new Date(openTime).toString(); + int reportType = jt.getReportType(); + String jarTime = GeneralUtils.readBuildNO(); + String version = ProductConstants.VERSION; + templateInfo.put("username", username); + templateInfo.put("uuid", uuid); + templateInfo.put("activitykey", activitykey); + templateInfo.put("reportletsid", reportletsid); + templateInfo.put("create_time", createTime); + templateInfo.put("report_type", reportType); + templateInfo.put("jar_time", jarTime); + templateInfo.put("version", version); + } + + long timeConsume = saveTime - openTime; + // 如果已存有数据,则加上本次编辑时间 + if (templateInfo.get("time_consume") != null) { + timeConsume += (long)templateInfo.get("time_consume"); + } + +// String process; + int cellCount = jt.getCellCount(); + int floatCount = jt.getFloatCount(); + int blockCount = jt.getBlockCount(); + int widgetCount = jt.getWidgetCount(); + templateInfo.put("time_consume", timeConsume); + templateInfo.put("cell_count", cellCount); + templateInfo.put("float_count", floatCount); + templateInfo.put("block_count", blockCount); + templateInfo.put("widget_count", widgetCount); + templateInfoList.put(t.getReportletsid(), templateInfo); + + saveInfo(); // 每次更新之后,都同步到暂存文件中 + } + + public static void main(String[] args) { + TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); + tic.getInfoList(); + } +} diff --git a/designer_form/src/com/fr/design/mainframe/JForm.java b/designer_form/src/com/fr/design/mainframe/JForm.java index 7c912ede0..c19f7f43b 100644 --- a/designer_form/src/com/fr/design/mainframe/JForm.java +++ b/designer_form/src/com/fr/design/mainframe/JForm.java @@ -38,6 +38,7 @@ import com.fr.form.FormElementCaseProvider; import com.fr.form.main.Form; import com.fr.form.ui.Widget; import com.fr.form.ui.container.WBorderLayout; +import com.fr.form.ui.container.WFitLayout; import com.fr.form.ui.container.WLayout; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; @@ -88,6 +89,35 @@ public class JForm extends JTemplate implements BaseJForm { return DesignState.JFORM; } + // 获取模板类型 + public int getReportType() { + return 2; + } + + // 获取模板格子数 + public int getCellCount() { + return 0; + } + // 获取模板悬浮元素个数 + public int getFloatCount() { + return 0; + } + // 获取模板聚合块个数 + public int getBlockCount() { + return 0; + } + // 获取模板控件数 + public int getWidgetCount() { + int widgetCount = 0; + for (int i = 0; i < template.getContainer().getWidgetCount(); i++) { + WFitLayout wf = (WFitLayout) template.getContainer().getWidget(i); + widgetCount += wf.getWidgetCount(); + } + int a = 1; + int b = 2; + return widgetCount; + } + @Override protected boolean accept(Object o) { return !(o instanceof FloatElementsProvider);