From af03d197f0d5ff87fbd368ed87432a461d1050c3 Mon Sep 17 00:00:00 2001 From: plough Date: Tue, 28 Feb 2017 15:59:10 +0800 Subject: [PATCH 01/12] =?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 bfdb396645..aa5a727e8d 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 f3722c4ac2..2494e20a0e 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 58060d91a9..3f016812c0 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 0000000000..52542e14d1 --- /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 7c912ede0b..c19f7f43b5 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); From da8587f2c57f9b9bd1aa8487cb7aeb9c163812b5 Mon Sep 17 00:00:00 2001 From: plough Date: Tue, 7 Mar 2017 17:34:25 +0800 Subject: [PATCH 02/12] =?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=E6=89=80=E6=9C=89?= =?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 --- .../designer/TemplateProcessTracker.aj | 73 +++++++++++++++++++ designer/src/com/fr/grid/Grid.java | 4 + .../designerbase/TemplateProcessTracker.aj | 61 ++++++++++++++++ .../tabledatapane/EmbeddedTableDataPane.java | 1 + .../com/fr/design/mainframe/JTemplate.java | 12 +++ .../templateinfo/TemplateInfoCollector.java | 22 +++++- .../templateinfo/TemplateProcessTracker.aj | 71 ++++++++++++++++++ .../designerchart/TemplateProcessTracker.aj | 56 ++++++++++++++ .../designerform/TemplateProcessTracker.aj | 60 +++++++++++++++ 9 files changed, 358 insertions(+), 2 deletions(-) create mode 100644 designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj create mode 100644 designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj create mode 100644 designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj create mode 100644 designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj create mode 100644 designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj diff --git a/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj new file mode 100644 index 0000000000..a2c3565d9a --- /dev/null +++ b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj @@ -0,0 +1,73 @@ +package com.fr.aspectj.designer; + +/** + * 记录模板过程 + * Created by plough on 2017/3/3. + */ + +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; +import org.aspectj.lang.reflect.SourceLocation; + +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +import java.util.Date; + +public aspect TemplateProcessTracker { + //声明一个pointcut,匹配你需要的方法 + pointcut onMouseClicked(MouseEvent e) : + execution(* mouseClicked(MouseEvent)) && args(e); + pointcut onMousePressed(MouseEvent e) : + execution(* mousePressed(MouseEvent)) && args(e); + pointcut onMouseReleased(MouseEvent e) : + execution(* mouseReleased(MouseEvent)) && args(e); + pointcut onActionPerformed(ActionEvent e) : + execution(* actionPerformed(ActionEvent)) && args(e); + pointcut onSetValueAt(Object v, int r, int c) : + execution(* setValueAt(java.lang.Object, int, int)) && args(v, r, c); + pointcut onSetValue4EditingElement(Object v) : + execution(* setValue4EditingElement(java.lang.Object)) && args(v); + + //before表示之前的意思 + //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 + before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + } + //同上 + before(ActionEvent e) : onActionPerformed(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + // !within(LogHandlerBar) 没用, 手动过滤 + if (e.getSource().toString().contains("javax.swing.Timer")) { + return; + } + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + + } + //同上 + before(Object v, int r, int c) : onSetValueAt(v, r, c) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + // !within(LogHandlerBar) 没用, 手动过滤 +// if (e.getSource().toString().contains("javax.swing.Timer")) { +// return; +// } + + String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + TemplateInfoCollector.appendProcess(log); + + } + //同上 + before(Object v) : onSetValue4EditingElement(v) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + +// String v = "test"; + String log = String.format("%s:\n%s\nset value: %s\n\n", new Date(), sl, v); + TemplateInfoCollector.appendProcess(log); + + } + + +} diff --git a/designer/src/com/fr/grid/Grid.java b/designer/src/com/fr/grid/Grid.java index a259cf63b0..432ea888c1 100644 --- a/designer/src/com/fr/grid/Grid.java +++ b/designer/src/com/fr/grid/Grid.java @@ -10,6 +10,7 @@ import com.fr.design.constants.UIConstants; import com.fr.design.fun.GridUIProcessor; import com.fr.design.gui.itextfield.UITextField; import com.fr.design.mainframe.ElementCasePane; +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.grid.event.CellEditorEvent; @@ -35,6 +36,7 @@ import javax.swing.plaf.ComponentUI; import java.awt.*; import java.awt.event.MouseEvent; import java.awt.geom.Point2D; +import java.util.Date; import java.util.Hashtable; import java.util.Iterator; @@ -1072,6 +1074,8 @@ public class Grid extends BaseGridComponent { * @return true if the value changed */ private boolean setValue4EditingElement(Object newValue) { + String log = String.format("%s:\nGrid.java\nset value: %s at %s\n\n", new Date(), newValue, editingCellElement); + TemplateInfoCollector.appendProcess(log); if (newValue instanceof TemplateCellElement) { TemplateCellElement cellElement = (TemplateCellElement) newValue; editingCellElement.setValue(cellElement.getValue()); diff --git a/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj b/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj new file mode 100644 index 0000000000..04e3fa2e46 --- /dev/null +++ b/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj @@ -0,0 +1,61 @@ +package com.fr.aspectj.designerbase; + +/** + * 记录模板过程 + * Created by plough on 2017/3/3. + */ + +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; +import org.aspectj.lang.reflect.SourceLocation; + +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +import java.util.Date; + +public aspect TemplateProcessTracker { + //声明一个pointcut,匹配你需要的方法 + pointcut onMouseClicked(MouseEvent e) : + execution(* mouseClicked(MouseEvent)) && args(e); + pointcut onMousePressed(MouseEvent e) : + execution(* mousePressed(MouseEvent)) && args(e); + pointcut onMouseReleased(MouseEvent e) : + execution(* mouseReleased(MouseEvent)) && args(e); + pointcut onActionPerformed(ActionEvent e) : + execution(* actionPerformed(ActionEvent)) && args(e); + pointcut onSetValueAt(Object v, int r, int c) : + execution(* setValueAt(java.lang.Object, int, int)) && args(v, r, c); + + //before表示之前的意思 + //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 + before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + } + //同上 + before(ActionEvent e) : onActionPerformed(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + // !within(LogHandlerBar) 没用, 手动过滤 + if (e.getSource().toString().contains("javax.swing.Timer")) { + return; + } + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + + } + //同上 + before(Object v, int r, int c) : onSetValueAt(v, r, c) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + // !within(LogHandlerBar) 没用, 手动过滤 +// if (e.getSource().toString().contains("javax.swing.Timer")) { +// return; +// } + + String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + TemplateInfoCollector.appendProcess(log); + } + + +} diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java b/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java index 3103f6850d..a4ddba1f74 100644 --- a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java +++ b/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java @@ -96,6 +96,7 @@ public class EmbeddedTableDataPane extends AbstractTableDataPane> ex private PreviewProvider previewType; private long openTime = 0L; // 打开模板的时间点(包括新建模板) private TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); + private StringBuilder process = new StringBuilder(""); // 制作模板的过程 public JTemplate(T t, String defaultFileName) { this(t, new MemFILE(newTemplateNameByIndex(defaultFileName)), true); @@ -102,6 +103,7 @@ public abstract class JTemplate> ex // 如果不是新建模板,并且在收集列表中 if (!isNewFile && tic.inList(t)) { openTime = System.currentTimeMillis(); + process.append(tic.loadProcess(t)); } } @@ -131,6 +133,16 @@ public abstract class JTemplate> ex // 获取模板控件数 public abstract int getWidgetCount(); + // 追加过程记录 + public void appendProcess(String s) { + process.append(s); + } + + // 获取过程记录 + public String getProcess() { + return process.toString(); + } + public U getUndoState() { return undoState; } diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 52542e14d1..95ced63309 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -2,6 +2,7 @@ package com.fr.design.mainframe.templateinfo; import com.fr.base.io.IOFile; import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; import com.fr.general.FRLogger; import com.fr.general.GeneralUtils; @@ -49,6 +50,22 @@ public class TemplateInfoCollector implements Serializable { return instance; } + public static void appendProcess(String log) { +// System.out.println(log); + // 获取当前编辑的模板 + JTemplate jt = DesignerContext.getDesignerFrame().getSelectedJTemplate(); + // 追加过程记录 + jt.appendProcess(log); + } + + /** + * 加载已经存储的模板过程 + */ + public String loadProcess(T t) { +// return ""; + return (String)templateInfoList.get(t.getReportletsid()).get("process"); + } + /** * 根据模板ID是否在收集列表中,判断是否需要收集当前模板的信息 */ @@ -106,17 +123,18 @@ public class TemplateInfoCollector implements Serializable { } long timeConsume = saveTime - openTime; - // 如果已存有数据,则加上本次编辑时间 + // 如果已存有数据,则加上之前的累计编辑时间 if (templateInfo.get("time_consume") != null) { timeConsume += (long)templateInfo.get("time_consume"); } -// String process; + String process = jt.getProcess(); int cellCount = jt.getCellCount(); int floatCount = jt.getFloatCount(); int blockCount = jt.getBlockCount(); int widgetCount = jt.getWidgetCount(); templateInfo.put("time_consume", timeConsume); + templateInfo.put("process", process); templateInfo.put("cell_count", cellCount); templateInfo.put("float_count", floatCount); templateInfo.put("block_count", blockCount); diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj new file mode 100644 index 0000000000..d186f82981 --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj @@ -0,0 +1,71 @@ +//package com.fr.design.mainframe.templateinfo; +// +//import org.aspectj.lang.reflect.SourceLocation; +// +//import java.awt.event.ActionEvent; +//import java.awt.event.MouseEvent; +//import java.util.Date; +// +///** +// * 记录模板过程 +// * Created by plough on 2017/2/27. +// */ +//public aspect TemplateProcessTracker { +// //声明一个pointcut,匹配你需要的方法 +// pointcut onMouseClicked(MouseEvent e) : +// execution(* mouseClicked(MouseEvent)) && args(e); +// pointcut onMousePressed(MouseEvent e) : +// execution(* mousePressed(MouseEvent)) && args(e); +// pointcut onMouseReleased(MouseEvent e) : +// execution(* mouseReleased(MouseEvent)) && args(e); +// pointcut onActionPerformed(ActionEvent e) : +// execution(* actionPerformed(ActionEvent)) && args(e); +// pointcut onSetValueAt(Object v, int r, int c) : +// execution(* setValueAt(Object, int, int)) && args(v, r, c); +// pointcut onSetValue4EditingElement(Object v) : +// execution(* setValue4EditingElement(Object)) && args(v); +// +// //before表示之前的意思 +// //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 +// before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { +// SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 +// +// String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); +// TemplateInfoCollector.appendProcess(log); +// } +// //同上 +// before(ActionEvent e) : onActionPerformed(e) { +// SourceLocation sl = thisJoinPoint.getSourceLocation(); +// // !within(LogHandlerBar) 没用, 手动过滤 +// if (e.getSource().toString().contains("javax.swing.Timer")) { +// return; +// } +// +// String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); +// TemplateInfoCollector.appendProcess(log); +// +// } +// //同上 +// before(Object v, int r, int c) : onSetValueAt(v, r, c) { +// SourceLocation sl = thisJoinPoint.getSourceLocation(); +// // !within(LogHandlerBar) 没用, 手动过滤 +//// if (e.getSource().toString().contains("javax.swing.Timer")) { +//// return; +//// } +// +// String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); +// TemplateInfoCollector.appendProcess(log); +// +// } +// //同上 +// before(Object v) : onSetValue4EditingElement(v) { +// SourceLocation sl = thisJoinPoint.getSourceLocation(); +// +//// String v = "test"; +// String log = String.format("%s:\n%s\nset value: %s\n\n", new Date(), sl, v); +// TemplateInfoCollector.appendProcess(log); +// +// } +// +// +//} diff --git a/designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj b/designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj new file mode 100644 index 0000000000..c192a190d0 --- /dev/null +++ b/designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj @@ -0,0 +1,56 @@ +package com.fr.aspectj.designerchart; + +/** + * Created by plough on 2017/3/3. + */ +import com.fr.chart.chartattr.Chart; +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; +import org.aspectj.lang.reflect.SourceLocation; + +import javax.swing.event.ListSelectionEvent; +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +import java.util.Date; + +public aspect TemplateProcessTracker { + //声明一个pointcut,匹配你需要的方法 + pointcut onMouseClicked(MouseEvent e) : + execution(* mouseClicked(MouseEvent)) && args(e); + pointcut onMousePressed(MouseEvent e) : + execution(* mousePressed(MouseEvent)) && args(e); + pointcut onMouseReleased(MouseEvent e) : + execution(* mouseReleased(MouseEvent)) && args(e); + pointcut onActionPerformed(ActionEvent e) : + execution(* actionPerformed(ActionEvent)) && args(e); + pointcut onChartUpdate(Chart c) : + execution(* update(Chart)) && args(c); + + //before表示之前的意思 + //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 + before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + } + //同上 + before(ActionEvent e) : onActionPerformed(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + // !within(LogHandlerBar) 没用, 手动过滤 + if (e.getSource().toString().contains("javax.swing.Timer")) { + return; + } + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + + } + //同上 + before(Chart c) : onChartUpdate(c) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + String log = String.format("%s:\n%s\n插入新图表:%s\n\n", new Date(), sl, c.getChartName()); + TemplateInfoCollector.appendProcess(log); + + } + +} diff --git a/designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj b/designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj new file mode 100644 index 0000000000..885d21ecd3 --- /dev/null +++ b/designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj @@ -0,0 +1,60 @@ +package com.fr.aspectj.designerform; + +/** + * Created by plough on 2017/3/3. + */ +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; +import org.aspectj.lang.reflect.SourceLocation; + +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +import java.util.Date; + +public aspect TemplateProcessTracker { + //声明一个pointcut,匹配你需要的方法 + pointcut onMouseClicked(MouseEvent e) : + execution(* mouseClicked(MouseEvent)) && args(e); + pointcut onMousePressed(MouseEvent e) : + execution(* mousePressed(MouseEvent)) && args(e); + pointcut onMouseReleased(MouseEvent e) : + execution(* mouseReleased(MouseEvent)) && args(e); + pointcut onActionPerformed(ActionEvent e) : + execution(* actionPerformed(ActionEvent)) && args(e); + pointcut onSetValueAt(Object v, int r, int c) : + execution(* setValueAt(java.lang.Object, int, int)) && args(v, r, c); + + //before表示之前的意思 + //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 + before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + } + //同上 + before(ActionEvent e) : onActionPerformed(e) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + // !within(LogHandlerBar) 没用, 手动过滤 + if (e.getSource().toString().contains("javax.swing.Timer")) { + return; + } + + String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + TemplateInfoCollector.appendProcess(log); + + } + //同上 + before(Object v, int r, int c) : onSetValueAt(v, r, c) { + SourceLocation sl = thisJoinPoint.getSourceLocation(); + // !within(LogHandlerBar) 没用, 手动过滤 +// if (e.getSource().toString().contains("javax.swing.Timer")) { +// return; +// } + + String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + TemplateInfoCollector.appendProcess(log); + + } + + +} From f2c3c76e7d60e48a5b4f9d3ab8ddc653c398bcfb Mon Sep 17 00:00:00 2001 From: plough Date: Wed, 8 Mar 2017 16:22:38 +0800 Subject: [PATCH 03/12] =?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=E4=BF=AE=E6=94=B9=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=8D=95=E5=85=83=E6=A0=BC=E7=BC=96=E8=BE=91=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=9A=84=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/aspectj/designer/TemplateProcessTracker.aj | 9 +++++---- designer/src/com/fr/grid/Grid.java | 9 +++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj index a2c3565d9a..24dfc73518 100644 --- a/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj +++ b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj @@ -6,6 +6,7 @@ package com.fr.aspectj.designer; */ import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; +import com.fr.grid.Grid; import org.aspectj.lang.reflect.SourceLocation; import java.awt.event.ActionEvent; @@ -24,8 +25,8 @@ public aspect TemplateProcessTracker { execution(* actionPerformed(ActionEvent)) && args(e); pointcut onSetValueAt(Object v, int r, int c) : execution(* setValueAt(java.lang.Object, int, int)) && args(v, r, c); - pointcut onSetValue4EditingElement(Object v) : - execution(* setValue4EditingElement(java.lang.Object)) && args(v); + pointcut onSetValue4EditingElement(Grid g, Object v) : + call(* setValue4EditingElement(java.lang.Object)) && target(g) && args(v); //before表示之前的意思 //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 @@ -60,11 +61,11 @@ public aspect TemplateProcessTracker { } //同上 - before(Object v) : onSetValue4EditingElement(v) { + before(Grid g, Object v) : onSetValue4EditingElement(g, v) { SourceLocation sl = thisJoinPoint.getSourceLocation(); // String v = "test"; - String log = String.format("%s:\n%s\nset value: %s\n\n", new Date(), sl, v); + String log = String.format("%s:\n%s\nset value: %s at %s\n\n", new Date(), sl, v, g.getEditingCellElement()); TemplateInfoCollector.appendProcess(log); } diff --git a/designer/src/com/fr/grid/Grid.java b/designer/src/com/fr/grid/Grid.java index 432ea888c1..178cd085ed 100644 --- a/designer/src/com/fr/grid/Grid.java +++ b/designer/src/com/fr/grid/Grid.java @@ -1067,6 +1067,13 @@ public class Grid extends BaseGridComponent { } + /** + * @return editingCellElement 的字符串表示 + */ + public String getEditingCellElement() { + return editingCellElement.toString(); + } + /** * 将新值赋给editingCellElement * @@ -1074,8 +1081,6 @@ public class Grid extends BaseGridComponent { * @return true if the value changed */ private boolean setValue4EditingElement(Object newValue) { - String log = String.format("%s:\nGrid.java\nset value: %s at %s\n\n", new Date(), newValue, editingCellElement); - TemplateInfoCollector.appendProcess(log); if (newValue instanceof TemplateCellElement) { TemplateCellElement cellElement = (TemplateCellElement) newValue; editingCellElement.setValue(cellElement.getValue()); From f3f8b4563b5e3c261e23de4af8e50b198df5b80a Mon Sep 17 00:00:00 2001 From: plough Date: Wed, 15 Mar 2017 11:32:20 +0800 Subject: [PATCH 04/12] =?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=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=B0=86process=E5=92=8Cconsuming=E5=88=86=E7=A6=BB?= =?UTF-8?q?=EF=BC=8C=E6=9A=82=E6=97=B6=E4=B8=8D=E8=AE=B0=E5=BD=95=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E8=BF=87=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/TemplateProcessTracker.aj | 13 +- .../designerbase/TemplateProcessTracker.aj | 9 +- .../templateinfo/TemplateInfoCollector.java | 176 +++++++++++++----- .../templateinfo/TemplateProcessTracker.aj | 71 ------- .../designerchart/TemplateProcessTracker.aj | 9 +- .../designerform/TemplateProcessTracker.aj | 13 +- 6 files changed, 159 insertions(+), 132 deletions(-) delete mode 100644 designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj diff --git a/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj index 24dfc73518..0b3ea70835 100644 --- a/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj +++ b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj @@ -33,7 +33,8 @@ public aspect TemplateProcessTracker { before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); +// String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } //同上 @@ -44,7 +45,8 @@ public aspect TemplateProcessTracker { return; } - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } @@ -56,7 +58,8 @@ public aspect TemplateProcessTracker { // return; // } - String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + //String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + String log = ""; TemplateInfoCollector.appendProcess(log); } @@ -65,9 +68,9 @@ public aspect TemplateProcessTracker { SourceLocation sl = thisJoinPoint.getSourceLocation(); // String v = "test"; - String log = String.format("%s:\n%s\nset value: %s at %s\n\n", new Date(), sl, v, g.getEditingCellElement()); + //String log = String.format("%s:\n%s\nset value: %s at %s\n\n", new Date(), sl, v, g.getEditingCellElement()); + String log = ""; TemplateInfoCollector.appendProcess(log); - } diff --git a/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj b/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj index 04e3fa2e46..b07ec9951a 100644 --- a/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj +++ b/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj @@ -30,7 +30,8 @@ public aspect TemplateProcessTracker { before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } //同上 @@ -41,7 +42,8 @@ public aspect TemplateProcessTracker { return; } - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } @@ -53,7 +55,8 @@ public aspect TemplateProcessTracker { // return; // } - String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + //String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + String log = ""; TemplateInfoCollector.appendProcess(log); } diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 95ced63309..7c2ef0eab3 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -1,15 +1,21 @@ package com.fr.design.mainframe.templateinfo; +import com.fr.base.FRContext; import com.fr.base.io.IOFile; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; +import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.GeneralUtils; -import com.fr.stable.ProductConstants; -import com.fr.stable.StableUtils; +import com.fr.general.http.HttpClient; +import com.fr.stable.*; +import org.json.JSONObject; import java.io.*; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; import java.util.Date; import java.util.HashMap; @@ -51,7 +57,6 @@ public class TemplateInfoCollector implements Serializable { } public static void appendProcess(String log) { -// System.out.println(log); // 获取当前编辑的模板 JTemplate jt = DesignerContext.getDesignerFrame().getSelectedJTemplate(); // 追加过程记录 @@ -61,9 +66,10 @@ public class TemplateInfoCollector implements Serializable { /** * 加载已经存储的模板过程 */ + @SuppressWarnings("unchecked") public String loadProcess(T t) { -// return ""; - return (String)templateInfoList.get(t.getReportletsid()).get("process"); + HashMap processMap = (HashMap) templateInfoList.get(t.getReportletsid()).get("processMap"); + return (String)processMap.get("process"); } /** @@ -77,8 +83,8 @@ public class TemplateInfoCollector implements Serializable { private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); - System.out.println("写入:" + instance.templateInfoList); - os.writeObject(instance.templateInfoList); + System.out.println("写入:" + templateInfoList); + os.writeObject(templateInfoList); os.close(); } catch (Exception ex) { ex.printStackTrace(); @@ -99,53 +105,137 @@ public class TemplateInfoCollector implements Serializable { public void collectInfo(T t, JTemplate jt, long openTime, long saveTime) { HashMap templateInfo; - if (inList(t)) { // 已有记录 + long timeConsume = saveTime - openTime; // 制作模板耗时 + String reportletsid = t.getReportletsid(); + + if (inList(t)) { // 已有记录 templateInfo = templateInfoList.get(t.getReportletsid()); - } else { // 新增 + // 更新 conusmingMap + HashMap consumingMap = (HashMap) templateInfo.get("consumingMap"); + timeConsume += (long)consumingMap.get("time_consume"); // 加上之前的累计编辑时间 + consumingMap.put("time_consume", timeConsume); + } + else { // 新增 templateInfo = new HashMap<>(); + templateInfo.put("consumingMap", getNewConsumingMap(reportletsid, openTime, timeConsume)); + } + + // 直接覆盖 processMap + templateInfo.put("processMap", getProcessMap(reportletsid, jt)); + + // TODO: 更新模板是否完成的标记 + + + templateInfoList.put(reportletsid, templateInfo); + + saveInfo(); // 每次更新之后,都同步到暂存文件中 + } + + private HashMap getNewConsumingMap(String reportletsid, long openTime, long timeConsume) { + HashMap consumingMap = new HashMap<>(); + + String username = DesignerEnvManager.getEnvManager().getBBSName(); + String uuid = DesignerEnvManager.getEnvManager().getUUID(); + String activitykey = DesignerEnvManager.getEnvManager().getActivationKey(); +// String createTime = new Date(openTime).toString(); + String createTime = new SimpleDateFormat("yyyy-MM-dd hh:mm").format(Calendar.getInstance().getTime()); + String jarTime = GeneralUtils.readBuildNO(); + String version = ProductConstants.VERSION; + consumingMap.put("username", username); + consumingMap.put("uuid", uuid); + consumingMap.put("activitykey", activitykey); + consumingMap.put("reportletsid", reportletsid); + consumingMap.put("create_time", createTime); + consumingMap.put("time_consume", timeConsume); + consumingMap.put("jar_time", jarTime); + consumingMap.put("version", version); + + return consumingMap; + } + + private HashMap getProcessMap(String reportletsid, JTemplate jt) { + HashMap processMap = 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); + processMap.put("reportletsid", reportletsid); + processMap.put("process", jt.getProcess()); + processMap.put("report_type", jt.getReportType()); + processMap.put("cell_count", jt.getCellCount()); + processMap.put("float_count", jt.getFloatCount()); + processMap.put("block_count", jt.getBlockCount()); + processMap.put("widget_count", jt.getWidgetCount()); + + return processMap; + } + + /** + * 发送本地模板信息到服务器 + */ + public void sendTemplateInfo() { + + String url1 = "http://cloud.fanruan.com/api/monitor/record_of_make_reports/single"; + ArrayList> completeTemplatesInfo = getCompleteTemplatesInfo(); + for (HashMap templateInfo : completeTemplatesInfo) { + String jsonConsumingMap = templateInfo.get("jsonConsumingMap"); + String jsonProcessMap = templateInfo.get("jsonProcessMap"); + if (sendSingleTemplateInfo(url1, jsonConsumingMap) && sendSingleTemplateInfo(url1, jsonProcessMap)) { + // TODO: 清空记录 + System.out.println("success"); + } } +// //服务器返回true, 说明已经获取成功, 清空当前记录的信息 +// if (success) { +// System.out.println("success"); +// } else { +// System.out.println("fail"); +// } + } - long timeConsume = saveTime - openTime; - // 如果已存有数据,则加上之前的累计编辑时间 - if (templateInfo.get("time_consume") != null) { - timeConsume += (long)templateInfo.get("time_consume"); + private boolean sendSingleTemplateInfo(String url, String content) { + HashMap para = new HashMap<>(); + String date = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); + para.put("token", CodeUtils.md5Encode(date, "", "MD5")); + para.put("content", content); +// para.put("content", "{name:3, age:3}"); +// HttpClient httpClient = new HttpClient("http://cloud.fanruan.com/api/monitor/record_of_make_reports/single", para, true); + HttpClient httpClient = new HttpClient(url, para, true); + + //httpClient.setContent(getCompleteTemplatesInfo()); + httpClient.setTimeout(5000); + httpClient.asGet(); + + if (!httpClient.isServerAlive()) { + return false; } - String process = jt.getProcess(); - int cellCount = jt.getCellCount(); - int floatCount = jt.getFloatCount(); - int blockCount = jt.getBlockCount(); - int widgetCount = jt.getWidgetCount(); - templateInfo.put("time_consume", timeConsume); - templateInfo.put("process", process); - 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); + String res = httpClient.getResponseText(); + boolean success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); + return success; + } - saveInfo(); // 每次更新之后,都同步到暂存文件中 + // 返回已完成的模板信息 + @SuppressWarnings("unchecked") + private ArrayList> getCompleteTemplatesInfo() { + ArrayList> completeTemplatesInfo = new ArrayList<>(); + for (String key : templateInfoList.keySet()) { + HashMap templateInfo = new HashMap<>(); + HashMap consumingMap = (HashMap) templateInfoList.get(key).get("consumingMap"); + HashMap processMap = (HashMap) templateInfoList.get(key).get("processMap"); + String jsonConsumingMap = new JSONObject(consumingMap).toString(); + String jsonProcessMap = new JSONObject(processMap).toString(); + templateInfo.put("jsonConsumingMap", jsonConsumingMap); + templateInfo.put("jsonProcessMap", jsonProcessMap); + templateInfo.put("reportletsid", key); + completeTemplatesInfo.add(templateInfo); // TODO 暂未添加筛选条件 + } + return completeTemplatesInfo; } + + public static void main(String[] args) { TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); - tic.getInfoList(); +// tic.getInfoList(); + tic.sendTemplateInfo(); + } } diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj deleted file mode 100644 index d186f82981..0000000000 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessTracker.aj +++ /dev/null @@ -1,71 +0,0 @@ -//package com.fr.design.mainframe.templateinfo; -// -//import org.aspectj.lang.reflect.SourceLocation; -// -//import java.awt.event.ActionEvent; -//import java.awt.event.MouseEvent; -//import java.util.Date; -// -///** -// * 记录模板过程 -// * Created by plough on 2017/2/27. -// */ -//public aspect TemplateProcessTracker { -// //声明一个pointcut,匹配你需要的方法 -// pointcut onMouseClicked(MouseEvent e) : -// execution(* mouseClicked(MouseEvent)) && args(e); -// pointcut onMousePressed(MouseEvent e) : -// execution(* mousePressed(MouseEvent)) && args(e); -// pointcut onMouseReleased(MouseEvent e) : -// execution(* mouseReleased(MouseEvent)) && args(e); -// pointcut onActionPerformed(ActionEvent e) : -// execution(* actionPerformed(ActionEvent)) && args(e); -// pointcut onSetValueAt(Object v, int r, int c) : -// execution(* setValueAt(Object, int, int)) && args(v, r, c); -// pointcut onSetValue4EditingElement(Object v) : -// execution(* setValue4EditingElement(Object)) && args(v); -// -// //before表示之前的意思 -// //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 -// before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { -// SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 -// -// String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); -// TemplateInfoCollector.appendProcess(log); -// } -// //同上 -// before(ActionEvent e) : onActionPerformed(e) { -// SourceLocation sl = thisJoinPoint.getSourceLocation(); -// // !within(LogHandlerBar) 没用, 手动过滤 -// if (e.getSource().toString().contains("javax.swing.Timer")) { -// return; -// } -// -// String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); -// TemplateInfoCollector.appendProcess(log); -// -// } -// //同上 -// before(Object v, int r, int c) : onSetValueAt(v, r, c) { -// SourceLocation sl = thisJoinPoint.getSourceLocation(); -// // !within(LogHandlerBar) 没用, 手动过滤 -//// if (e.getSource().toString().contains("javax.swing.Timer")) { -//// return; -//// } -// -// String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); -// TemplateInfoCollector.appendProcess(log); -// -// } -// //同上 -// before(Object v) : onSetValue4EditingElement(v) { -// SourceLocation sl = thisJoinPoint.getSourceLocation(); -// -//// String v = "test"; -// String log = String.format("%s:\n%s\nset value: %s\n\n", new Date(), sl, v); -// TemplateInfoCollector.appendProcess(log); -// -// } -// -// -//} diff --git a/designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj b/designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj index c192a190d0..51e86fd151 100644 --- a/designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj +++ b/designer_chart/src/com/fr/aspectj/designerchart/TemplateProcessTracker.aj @@ -30,7 +30,8 @@ public aspect TemplateProcessTracker { before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } //同上 @@ -41,14 +42,16 @@ public aspect TemplateProcessTracker { return; } - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } //同上 before(Chart c) : onChartUpdate(c) { SourceLocation sl = thisJoinPoint.getSourceLocation(); - String log = String.format("%s:\n%s\n插入新图表:%s\n\n", new Date(), sl, c.getChartName()); + //String log = String.format("%s:\n%s\n插入新图表:%s\n\n", new Date(), sl, c.getChartName()); + String log = ""; TemplateInfoCollector.appendProcess(log); } diff --git a/designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj b/designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj index 885d21ecd3..0aabeb3620 100644 --- a/designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj +++ b/designer_form/src/com/fr/aspectj/designerform/TemplateProcessTracker.aj @@ -28,7 +28,8 @@ public aspect TemplateProcessTracker { before(MouseEvent e) : onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } //同上 @@ -39,19 +40,17 @@ public aspect TemplateProcessTracker { return; } - String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); + String log = ""; TemplateInfoCollector.appendProcess(log); } //同上 before(Object v, int r, int c) : onSetValueAt(v, r, c) { SourceLocation sl = thisJoinPoint.getSourceLocation(); - // !within(LogHandlerBar) 没用, 手动过滤 -// if (e.getSource().toString().contains("javax.swing.Timer")) { -// return; -// } - String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + //String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); + String log = ""; TemplateInfoCollector.appendProcess(log); } From 66f7e6fbcbc65d058d64aef67739971eb9884aec Mon Sep 17 00:00:00 2001 From: plough Date: Wed, 15 Mar 2017 16:21:02 +0800 Subject: [PATCH 05/12] =?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=E4=B8=8A=E4=BC=A0=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=89=8D=EF=BC=8C=E5=88=A4=E6=96=AD=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E6=98=AF=E5=90=A6=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/InformationCollector.java | 2 + .../templateinfo/TemplateInfoCollector.java | 90 +++++++++++++++---- 2 files changed, 73 insertions(+), 19 deletions(-) diff --git a/designer/src/com/fr/design/mainframe/InformationCollector.java b/designer/src/com/fr/design/mainframe/InformationCollector.java index a4b3fc6ab6..f50cc5dadf 100644 --- a/designer/src/com/fr/design/mainframe/InformationCollector.java +++ b/designer/src/com/fr/design/mainframe/InformationCollector.java @@ -10,6 +10,7 @@ import com.fr.data.core.db.dml.Delete; import com.fr.data.core.db.dml.Select; import com.fr.data.core.db.dml.Table; import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.general.*; import com.fr.general.http.HttpClient; import com.fr.json.JSONArray; @@ -315,6 +316,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { } sendFunctionsInfo(); sendUserInfo(); + TemplateInfoCollector.getInstance().sendTemplateInfo(); } }); sendThread.start(); diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 7c2ef0eab3..83c7c1d63b 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -27,19 +27,38 @@ public class TemplateInfoCollector implements Serializable { private static final String FILE_NAME = "tplInfo.ser"; private static TemplateInfoCollector instance; private HashMap> templateInfoList; + private String designerOpenDate; //设计器最近一次打开日期 @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); - } +// // 先尝试从文件读取 +// try{ +// ObjectInputStream is = new ObjectInputStream(new FileInputStream(getInfoFile())); +//// templateInfoList = (HashMap>) is.readObject(); +// instance = (HashMap>) is.readObject(); +// } catch (FileNotFoundException ex) { +// // 如果之前没有存储过,则创建新对象 +// templateInfoList = new HashMap<>(); +// } catch (Exception ex) { +// FRLogger.getLogger().error(ex.getMessage(), ex); +// } + templateInfoList = new HashMap<>(); + setDesignerOpenDate(); + } + + /** + * 把设计器最近打开日期设定为当前日期 + */ + private void setDesignerOpenDate() { + designerOpenDate = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); + } + + /** + * 判断今天是否第一次打开设计器 + */ + private boolean designerOpenFirstTime() { + String today = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); + return !ComparatorUtils.equals(today, designerOpenDate); } /** @@ -50,8 +69,21 @@ public class TemplateInfoCollector implements Serializable { } public static TemplateInfoCollector getInstance() { +// if (instance == null) { +// instance = new TemplateInfoCollector(); +// } +// return instance; if (instance == null) { - instance = new TemplateInfoCollector(); + // 先尝试从文件读取 + try{ + ObjectInputStream is = new ObjectInputStream(new FileInputStream(getInfoFile())); + instance = (TemplateInfoCollector) is.readObject(); + } catch (FileNotFoundException ex) { + // 如果之前没有存储过,则创建新对象 + instance = new TemplateInfoCollector(); + } catch (Exception ex) { + FRLogger.getLogger().error(ex.getMessage(), ex); + } } return instance; } @@ -83,8 +115,8 @@ public class TemplateInfoCollector implements Serializable { private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); - System.out.println("写入:" + templateInfoList); - os.writeObject(templateInfoList); + System.out.println("写入:" + instance.templateInfoList); + os.writeObject(instance); os.close(); } catch (Exception ex) { ex.printStackTrace(); @@ -98,6 +130,20 @@ public class TemplateInfoCollector implements Serializable { return templateInfoList; } + /** + * 更新 day_count:打开设计器却未编辑模板的连续日子 + */ + private void addDayCount() { + if (designerOpenFirstTime()) { + for (String key : templateInfoList.keySet()) { + HashMap templateInfo = templateInfoList.get(key); + int dayCount = (int)templateInfo.get("day_count") + 1; + templateInfo.put("day_count", dayCount); + } + setDesignerOpenDate(); + } + } + /** * 收集模板信息。如果之前没有记录,则新增;如果已有记录,则更新。 * 同时将最新数据保存到文件中。 @@ -105,7 +151,7 @@ public class TemplateInfoCollector implements Serializable { public void collectInfo(T t, JTemplate jt, long openTime, long saveTime) { HashMap templateInfo; - long timeConsume = saveTime - openTime; // 制作模板耗时 + long timeConsume = ((saveTime - openTime) / 1000); // 制作模板耗时(单位:s) String reportletsid = t.getReportletsid(); if (inList(t)) { // 已有记录 @@ -123,7 +169,8 @@ public class TemplateInfoCollector implements Serializable { // 直接覆盖 processMap templateInfo.put("processMap", getProcessMap(reportletsid, jt)); - // TODO: 更新模板是否完成的标记 + // 保存模板时,让 day_count 归零 + templateInfo.put("day_count", 0); templateInfoList.put(reportletsid, templateInfo); @@ -138,7 +185,7 @@ public class TemplateInfoCollector implements Serializable { String uuid = DesignerEnvManager.getEnvManager().getUUID(); String activitykey = DesignerEnvManager.getEnvManager().getActivationKey(); // String createTime = new Date(openTime).toString(); - String createTime = new SimpleDateFormat("yyyy-MM-dd hh:mm").format(Calendar.getInstance().getTime()); + String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(Calendar.getInstance().getTime()); String jarTime = GeneralUtils.readBuildNO(); String version = ProductConstants.VERSION; consumingMap.put("username", username); @@ -171,17 +218,19 @@ public class TemplateInfoCollector implements Serializable { * 发送本地模板信息到服务器 */ public void sendTemplateInfo() { - + addDayCount(); String url1 = "http://cloud.fanruan.com/api/monitor/record_of_make_reports/single"; ArrayList> completeTemplatesInfo = getCompleteTemplatesInfo(); for (HashMap templateInfo : completeTemplatesInfo) { String jsonConsumingMap = templateInfo.get("jsonConsumingMap"); String jsonProcessMap = templateInfo.get("jsonProcessMap"); if (sendSingleTemplateInfo(url1, jsonConsumingMap) && sendSingleTemplateInfo(url1, jsonProcessMap)) { - // TODO: 清空记录 + // 清空记录 System.out.println("success"); + templateInfoList.remove(templateInfo.get("reportletsid")); } } + saveInfo(); // //服务器返回true, 说明已经获取成功, 清空当前记录的信息 // if (success) { // System.out.println("success"); @@ -217,6 +266,9 @@ public class TemplateInfoCollector implements Serializable { private ArrayList> getCompleteTemplatesInfo() { ArrayList> completeTemplatesInfo = new ArrayList<>(); for (String key : templateInfoList.keySet()) { + if ((int)templateInfoList.get(key).get("day_count") <= 15) { // 未完成模板 + continue; + } HashMap templateInfo = new HashMap<>(); HashMap consumingMap = (HashMap) templateInfoList.get(key).get("consumingMap"); HashMap processMap = (HashMap) templateInfoList.get(key).get("processMap"); @@ -234,7 +286,7 @@ public class TemplateInfoCollector implements Serializable { public static void main(String[] args) { TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); -// tic.getInfoList(); + tic.getInfoList(); tic.sendTemplateInfo(); } From 77e8710f6cea1148f564a1b6bf53a9c7b3beb282 Mon Sep 17 00:00:00 2001 From: plough Date: Thu, 16 Mar 2017 09:47:27 +0800 Subject: [PATCH 06/12] =?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=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templateinfo/TemplateInfoCollector.java | 59 ++++--------------- 1 file changed, 13 insertions(+), 46 deletions(-) diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 83c7c1d63b..891fc5b20c 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -1,6 +1,5 @@ package com.fr.design.mainframe.templateinfo; -import com.fr.base.FRContext; import com.fr.base.io.IOFile; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.DesignerContext; @@ -16,7 +15,6 @@ import java.io.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; -import java.util.Date; import java.util.HashMap; /** @@ -31,17 +29,6 @@ public class TemplateInfoCollector implements Serializable { @SuppressWarnings("unchecked") private TemplateInfoCollector() { -// // 先尝试从文件读取 -// try{ -// ObjectInputStream is = new ObjectInputStream(new FileInputStream(getInfoFile())); -//// templateInfoList = (HashMap>) is.readObject(); -// instance = (HashMap>) is.readObject(); -// } catch (FileNotFoundException ex) { -// // 如果之前没有存储过,则创建新对象 -// templateInfoList = new HashMap<>(); -// } catch (Exception ex) { -// FRLogger.getLogger().error(ex.getMessage(), ex); -// } templateInfoList = new HashMap<>(); setDesignerOpenDate(); } @@ -69,10 +56,6 @@ public class TemplateInfoCollector implements Serializable { } public static TemplateInfoCollector getInstance() { -// if (instance == null) { -// instance = new TemplateInfoCollector(); -// } -// return instance; if (instance == null) { // 先尝试从文件读取 try{ @@ -111,7 +94,9 @@ public class TemplateInfoCollector implements Serializable { return templateInfoList.containsKey(t.getReportletsid()); } - // 将包含所有信息的对象保存到文件 + /** + * 将包含所有信息的对象保存到文件 + */ private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); @@ -123,13 +108,6 @@ public class TemplateInfoCollector implements Serializable { } } - public HashMap getInfoList() { - for (String key : templateInfoList.keySet()) { - System.out.println(templateInfoList.get(key)); - } - return templateInfoList; - } - /** * 更新 day_count:打开设计器却未编辑模板的连续日子 */ @@ -148,6 +126,7 @@ public class TemplateInfoCollector implements Serializable { * 收集模板信息。如果之前没有记录,则新增;如果已有记录,则更新。 * 同时将最新数据保存到文件中。 */ + @SuppressWarnings("unchecked") public void collectInfo(T t, JTemplate jt, long openTime, long saveTime) { HashMap templateInfo; @@ -184,7 +163,6 @@ public class TemplateInfoCollector implements Serializable { String username = DesignerEnvManager.getEnvManager().getBBSName(); String uuid = DesignerEnvManager.getEnvManager().getUUID(); String activitykey = DesignerEnvManager.getEnvManager().getActivationKey(); -// String createTime = new Date(openTime).toString(); String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(Calendar.getInstance().getTime()); String jarTime = GeneralUtils.readBuildNO(); String version = ProductConstants.VERSION; @@ -219,24 +197,19 @@ public class TemplateInfoCollector implements Serializable { */ public void sendTemplateInfo() { addDayCount(); - String url1 = "http://cloud.fanruan.com/api/monitor/record_of_make_reports/single"; + String consumingUrl = "http://cloud.fanruan.com/api/monitor/record_of_reports_consuming/single"; + String processUrl = "http://cloud.fanruan.com/api/monitor/record_of_reports_process/single"; ArrayList> completeTemplatesInfo = getCompleteTemplatesInfo(); for (HashMap templateInfo : completeTemplatesInfo) { String jsonConsumingMap = templateInfo.get("jsonConsumingMap"); String jsonProcessMap = templateInfo.get("jsonProcessMap"); - if (sendSingleTemplateInfo(url1, jsonConsumingMap) && sendSingleTemplateInfo(url1, jsonProcessMap)) { + if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) { // 清空记录 System.out.println("success"); templateInfoList.remove(templateInfo.get("reportletsid")); } } saveInfo(); -// //服务器返回true, 说明已经获取成功, 清空当前记录的信息 -// if (success) { -// System.out.println("success"); -// } else { -// System.out.println("fail"); -// } } private boolean sendSingleTemplateInfo(String url, String content) { @@ -244,11 +217,7 @@ public class TemplateInfoCollector implements Serializable { String date = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); para.put("token", CodeUtils.md5Encode(date, "", "MD5")); para.put("content", content); -// para.put("content", "{name:3, age:3}"); -// HttpClient httpClient = new HttpClient("http://cloud.fanruan.com/api/monitor/record_of_make_reports/single", para, true); HttpClient httpClient = new HttpClient(url, para, true); - - //httpClient.setContent(getCompleteTemplatesInfo()); httpClient.setTimeout(5000); httpClient.asGet(); @@ -261,7 +230,9 @@ public class TemplateInfoCollector implements Serializable { return success; } - // 返回已完成的模板信息 + /** + * 返回已完成的模板信息 + */ @SuppressWarnings("unchecked") private ArrayList> getCompleteTemplatesInfo() { ArrayList> completeTemplatesInfo = new ArrayList<>(); @@ -277,17 +248,13 @@ public class TemplateInfoCollector implements Serializable { templateInfo.put("jsonConsumingMap", jsonConsumingMap); templateInfo.put("jsonProcessMap", jsonProcessMap); templateInfo.put("reportletsid", key); - completeTemplatesInfo.add(templateInfo); // TODO 暂未添加筛选条件 + completeTemplatesInfo.add(templateInfo); } return completeTemplatesInfo; } - - public static void main(String[] args) { - TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); - tic.getInfoList(); - tic.sendTemplateInfo(); - +// TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); +// tic.sendTemplateInfo(); } } From 9a738346ed4273d31686cb2df00ef0732f93079b Mon Sep 17 00:00:00 2001 From: plough Date: Thu, 16 Mar 2017 16:15:58 +0800 Subject: [PATCH 07/12] =?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=E4=B8=8A=E4=BC=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=89=8D=EF=BC=8C=E5=88=A4=E6=96=AD=E6=98=AF=E5=90=A6=E4=B8=BA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templateinfo/TemplateInfoCollector.java | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 891fc5b20c..b9c92b1dab 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -100,7 +100,7 @@ public class TemplateInfoCollector implements Serializable { private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); - System.out.println("写入:" + instance.templateInfoList); +// System.out.println("写入:" + instance.templateInfoList); os.writeObject(instance); os.close(); } catch (Exception ex) { @@ -205,7 +205,7 @@ public class TemplateInfoCollector implements Serializable { String jsonProcessMap = templateInfo.get("jsonProcessMap"); if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) { // 清空记录 - System.out.println("success"); +// System.out.println("success"); templateInfoList.remove(templateInfo.get("reportletsid")); } } @@ -236,23 +236,53 @@ public class TemplateInfoCollector implements Serializable { @SuppressWarnings("unchecked") private ArrayList> getCompleteTemplatesInfo() { ArrayList> completeTemplatesInfo = new ArrayList<>(); + ArrayList testTemplateKeys = new ArrayList<>(); // 保存测试模板的key for (String key : templateInfoList.keySet()) { - if ((int)templateInfoList.get(key).get("day_count") <= 15) { // 未完成模板 + HashMap templateInfo = templateInfoList.get(key); + if ((int)templateInfo.get("day_count") <= 15) { // 未完成模板 continue; } - HashMap templateInfo = new HashMap<>(); - HashMap consumingMap = (HashMap) templateInfoList.get(key).get("consumingMap"); - HashMap processMap = (HashMap) templateInfoList.get(key).get("processMap"); + if (isTestTemplate(templateInfo)) { + testTemplateKeys.add(key); + continue; + } + HashMap consumingMap = (HashMap) templateInfo.get("consumingMap"); + HashMap processMap = (HashMap) templateInfo.get("processMap"); String jsonConsumingMap = new JSONObject(consumingMap).toString(); String jsonProcessMap = new JSONObject(processMap).toString(); - templateInfo.put("jsonConsumingMap", jsonConsumingMap); - templateInfo.put("jsonProcessMap", jsonProcessMap); - templateInfo.put("reportletsid", key); - completeTemplatesInfo.add(templateInfo); + HashMap jsonTemplateInfo = new HashMap<>(); + jsonTemplateInfo.put("jsonConsumingMap", jsonConsumingMap); + jsonTemplateInfo.put("jsonProcessMap", jsonProcessMap); + jsonTemplateInfo.put("reportletsid", key); + completeTemplatesInfo.add(jsonTemplateInfo); + } + // 删除测试模板 + for (String key : testTemplateKeys) { + templateInfoList.remove(key); +// System.out.println(key + " is removed..."); } return completeTemplatesInfo; } + @SuppressWarnings("unchecked") + private boolean isTestTemplate(HashMap templateInfo) { + HashMap processMap = (HashMap) templateInfo.get("processMap"); + int reportType = (int)processMap.get("report_type"); + int cellCount = (int)processMap.get("cell_count"); + int floatCount = (int)processMap.get("float_count"); + int blockCount = (int)processMap.get("block_count"); + int widgetCount = (int)processMap.get("widget_count"); + boolean isTestTemplate = false; + if (reportType == 0) { // 普通报表 + isTestTemplate = cellCount <= 5 && floatCount <= 1 && widgetCount <= 5; + } else if (reportType == 1) { // 聚合报表 + isTestTemplate = blockCount <= 1 && widgetCount <= 5; + } else { // 表单(reportType == 2) + isTestTemplate = widgetCount <= 1; + } + return isTestTemplate; + } + public static void main(String[] args) { // TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); // tic.sendTemplateInfo(); From b2f7c448f98034f8981d2f58afe6e770272831d5 Mon Sep 17 00:00:00 2001 From: plough Date: Fri, 17 Mar 2017 11:38:19 +0800 Subject: [PATCH 08/12] =?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=E6=8A=8A=20reportletsid=20=E6=94=B9?= =?UTF-8?q?=E6=88=90=20templateID?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designer/TemplateProcessTracker.aj | 4 --- .../designerbase/TemplateProcessTracker.aj | 4 --- .../com/fr/design/mainframe/JTemplate.java | 6 ++-- .../templateinfo/TemplateInfoCollector.java | 28 +++++++++---------- 4 files changed, 17 insertions(+), 25 deletions(-) diff --git a/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj index 0b3ea70835..032cd23424 100644 --- a/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj +++ b/designer/src/com/fr/aspectj/designer/TemplateProcessTracker.aj @@ -53,10 +53,6 @@ public aspect TemplateProcessTracker { //同上 before(Object v, int r, int c) : onSetValueAt(v, r, c) { SourceLocation sl = thisJoinPoint.getSourceLocation(); - // !within(LogHandlerBar) 没用, 手动过滤 -// if (e.getSource().toString().contains("javax.swing.Timer")) { -// return; -// } //String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); String log = ""; diff --git a/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj b/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj index b07ec9951a..61a0be5008 100644 --- a/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj +++ b/designer_base/src/com/fr/aspectj/designerbase/TemplateProcessTracker.aj @@ -50,10 +50,6 @@ public aspect TemplateProcessTracker { //同上 before(Object v, int r, int c) : onSetValueAt(v, r, c) { SourceLocation sl = thisJoinPoint.getSourceLocation(); - // !within(LogHandlerBar) 没用, 手动过滤 -// if (e.getSource().toString().contains("javax.swing.Timer")) { -// return; -// } //String log = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); String log = ""; diff --git a/designer_base/src/com/fr/design/mainframe/JTemplate.java b/designer_base/src/com/fr/design/mainframe/JTemplate.java index ccdfb11e1a..aec297ddf9 100644 --- a/designer_base/src/com/fr/design/mainframe/JTemplate.java +++ b/designer_base/src/com/fr/design/mainframe/JTemplate.java @@ -109,8 +109,8 @@ public abstract class JTemplate> ex // 为收集模版信息作准备 private void initForCollect() { - if (template.getReportletsid() == null) { - template.initReportletsid(); // 为新模板设置 reportletsid 属性 + if (template.getTemplateID() == null) { + template.initTemplateID(); // 为新模板设置 templateID 属性 } if (openTime == 0) { openTime = System.currentTimeMillis(); @@ -540,7 +540,7 @@ public abstract class JTemplate> ex boolean result = this.saveFile(); if (result) { DesignerFrameFileDealerPane.getInstance().refresh(); - initForCollect(); // 如果是旧模板另存为新模板,则添加 reportletsid + initForCollect(); // 如果是旧模板另存为新模板,则添加 templateID collectInfo(); } //更换最近打开 diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index b9c92b1dab..6e73c5d0bd 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -83,7 +83,7 @@ public class TemplateInfoCollector implements Serializable { */ @SuppressWarnings("unchecked") public String loadProcess(T t) { - HashMap processMap = (HashMap) templateInfoList.get(t.getReportletsid()).get("processMap"); + HashMap processMap = (HashMap) templateInfoList.get(t.getTemplateID()).get("processMap"); return (String)processMap.get("process"); } @@ -91,7 +91,7 @@ public class TemplateInfoCollector implements Serializable { * 根据模板ID是否在收集列表中,判断是否需要收集当前模板的信息 */ public boolean inList(T t) { - return templateInfoList.containsKey(t.getReportletsid()); + return templateInfoList.containsKey(t.getTemplateID()); } /** @@ -100,7 +100,7 @@ public class TemplateInfoCollector implements Serializable { private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); -// System.out.println("写入:" + instance.templateInfoList); + System.out.println("写入:" + instance.templateInfoList); os.writeObject(instance); os.close(); } catch (Exception ex) { @@ -131,10 +131,10 @@ public class TemplateInfoCollector implements Serializable { HashMap templateInfo; long timeConsume = ((saveTime - openTime) / 1000); // 制作模板耗时(单位:s) - String reportletsid = t.getReportletsid(); + String templateID = t.getTemplateID(); if (inList(t)) { // 已有记录 - templateInfo = templateInfoList.get(t.getReportletsid()); + templateInfo = templateInfoList.get(t.getTemplateID()); // 更新 conusmingMap HashMap consumingMap = (HashMap) templateInfo.get("consumingMap"); timeConsume += (long)consumingMap.get("time_consume"); // 加上之前的累计编辑时间 @@ -142,22 +142,22 @@ public class TemplateInfoCollector implements Serializable { } else { // 新增 templateInfo = new HashMap<>(); - templateInfo.put("consumingMap", getNewConsumingMap(reportletsid, openTime, timeConsume)); + templateInfo.put("consumingMap", getNewConsumingMap(templateID, openTime, timeConsume)); } // 直接覆盖 processMap - templateInfo.put("processMap", getProcessMap(reportletsid, jt)); + templateInfo.put("processMap", getProcessMap(templateID, jt)); // 保存模板时,让 day_count 归零 templateInfo.put("day_count", 0); - templateInfoList.put(reportletsid, templateInfo); + templateInfoList.put(templateID, templateInfo); saveInfo(); // 每次更新之后,都同步到暂存文件中 } - private HashMap getNewConsumingMap(String reportletsid, long openTime, long timeConsume) { + private HashMap getNewConsumingMap(String templateID, long openTime, long timeConsume) { HashMap consumingMap = new HashMap<>(); String username = DesignerEnvManager.getEnvManager().getBBSName(); @@ -169,7 +169,7 @@ public class TemplateInfoCollector implements Serializable { consumingMap.put("username", username); consumingMap.put("uuid", uuid); consumingMap.put("activitykey", activitykey); - consumingMap.put("reportletsid", reportletsid); + consumingMap.put("templateID", templateID); consumingMap.put("create_time", createTime); consumingMap.put("time_consume", timeConsume); consumingMap.put("jar_time", jarTime); @@ -178,10 +178,10 @@ public class TemplateInfoCollector implements Serializable { return consumingMap; } - private HashMap getProcessMap(String reportletsid, JTemplate jt) { + private HashMap getProcessMap(String templateID, JTemplate jt) { HashMap processMap = new HashMap<>(); - processMap.put("reportletsid", reportletsid); + processMap.put("templateID", templateID); processMap.put("process", jt.getProcess()); processMap.put("report_type", jt.getReportType()); processMap.put("cell_count", jt.getCellCount()); @@ -206,7 +206,7 @@ public class TemplateInfoCollector implements Serializable { if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) { // 清空记录 // System.out.println("success"); - templateInfoList.remove(templateInfo.get("reportletsid")); + templateInfoList.remove(templateInfo.get("templateID")); } } saveInfo(); @@ -253,7 +253,7 @@ public class TemplateInfoCollector implements Serializable { HashMap jsonTemplateInfo = new HashMap<>(); jsonTemplateInfo.put("jsonConsumingMap", jsonConsumingMap); jsonTemplateInfo.put("jsonProcessMap", jsonProcessMap); - jsonTemplateInfo.put("reportletsid", key); + jsonTemplateInfo.put("templateID", key); completeTemplatesInfo.add(jsonTemplateInfo); } // 删除测试模板 From 89432288836110ff2271c288fbece4691fcb92ee Mon Sep 17 00:00:00 2001 From: plough Date: Fri, 17 Mar 2017 14:27:50 +0800 Subject: [PATCH 09/12] =?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=E8=8B=A5=E6=9C=AA=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E4=BA=A7=E5=93=81=E6=94=B9=E8=89=AF=E8=AE=A1=E5=88=92=EF=BC=8C?= =?UTF-8?q?=E5=88=99=E4=B8=8D=E6=94=B6=E9=9B=86=E6=9C=AC=E5=9C=B0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../templateinfo/TemplateInfoCollector.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 6e73c5d0bd..df71bdfc87 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -1,5 +1,6 @@ package com.fr.design.mainframe.templateinfo; +import com.fr.base.FRContext; import com.fr.base.io.IOFile; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.DesignerContext; @@ -71,7 +72,14 @@ public class TemplateInfoCollector implements Serializable { return instance; } + private static boolean shouldCollectInfo() { + return DesignerEnvManager.getEnvManager().isJoinProductImprove() && FRContext.isChineseEnv(); + } + public static void appendProcess(String log) { + if (!shouldCollectInfo()) { + return; + } // 获取当前编辑的模板 JTemplate jt = DesignerContext.getDesignerFrame().getSelectedJTemplate(); // 追加过程记录 @@ -100,7 +108,7 @@ public class TemplateInfoCollector implements Serializable { private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); - System.out.println("写入:" + instance.templateInfoList); +// System.out.println("写入:" + instance.templateInfoList); os.writeObject(instance); os.close(); } catch (Exception ex) { @@ -128,6 +136,10 @@ public class TemplateInfoCollector implements Serializable { */ @SuppressWarnings("unchecked") public void collectInfo(T t, JTemplate jt, long openTime, long saveTime) { + if (!shouldCollectInfo()) { + return; + } + HashMap templateInfo; long timeConsume = ((saveTime - openTime) / 1000); // 制作模板耗时(单位:s) From 7049c30a4e1da5122af8ea2649ba28d5ef089af6 Mon Sep 17 00:00:00 2001 From: plough Date: Mon, 20 Mar 2017 10:18:06 +0800 Subject: [PATCH 10/12] =?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=E6=8A=8A=E7=BB=9F=E8=AE=A1=E6=A0=BC?= =?UTF-8?q?=E5=AD=90=E6=95=B0=E9=87=8F=E7=9A=84=E5=8A=9F=E8=83=BD=E5=88=86?= =?UTF-8?q?=E7=A6=BB=E4=B8=BA=E5=8D=95=E7=8B=AC=E7=9A=84=E7=B1=BB=EF=BC=9B?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/JWorkBook.java | 58 ++------------ .../tabledatapane/EmbeddedTableDataPane.java | 1 - .../src/com/fr/design/extra/PluginHelper.java | 2 +- .../com/fr/design/mainframe/JTemplate.java | 13 +--- .../templateinfo/JFormProcessInfo.java | 42 +++++++++++ .../templateinfo/JWorkBookProcessInfo.java | 75 +++++++++++++++++++ .../templateinfo/TemplateInfoCollector.java | 39 ++++++---- .../templateinfo/TemplateProcessInfo.java | 26 +++++++ .../src/com/fr/design/mainframe/JForm.java | 32 ++------ 9 files changed, 182 insertions(+), 106 deletions(-) create mode 100644 designer_base/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java create mode 100644 designer_base/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java create mode 100644 designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java diff --git a/designer/src/com/fr/design/mainframe/JWorkBook.java b/designer/src/com/fr/design/mainframe/JWorkBook.java index 4cb98680a6..fd4cd7b0da 100644 --- a/designer/src/com/fr/design/mainframe/JWorkBook.java +++ b/designer/src/com/fr/design/mainframe/JWorkBook.java @@ -27,6 +27,8 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIModeControlContainer; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.mainframe.cell.QuickEditorRegion; +import com.fr.design.mainframe.templateinfo.JWorkBookProcessInfo; +import com.fr.design.mainframe.templateinfo.TemplateProcessInfo; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.*; import com.fr.design.module.DesignModuleFactory; @@ -130,59 +132,11 @@ 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(); - } + public TemplateProcessInfo getProcessInfo() { + if (processInfo == null) { + processInfo = new JWorkBookProcessInfo(template); } - return blockCount; - } - // 获取模板控件数 - public int getWidgetCount() { - ParameterUI pui = template.getReportParameterAttr().getParameterUI(); - return pui == null ? 0 : (pui.getAllWidgets().length - 1); + return processInfo; } /** diff --git a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java b/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java index a4ddba1f74..3103f6850d 100644 --- a/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java +++ b/designer_base/src/com/fr/design/data/tabledata/tabledatapane/EmbeddedTableDataPane.java @@ -96,7 +96,6 @@ public class EmbeddedTableDataPane extends AbstractTableDataPane> ex protected U undoState; protected U authorityUndoState = null; protected T template; // 当前模板 + protected TemplateProcessInfo processInfo; // 模板过程的相关信息 private static short currentIndex = 0;// 此变量用于多次新建模板时,让名字不重复 private DesignModelAdapter designModel; private PreviewProvider previewType; @@ -122,16 +124,7 @@ public abstract class JTemplate> ex 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 abstract TemplateProcessInfo getProcessInfo(); // 追加过程记录 public void appendProcess(String s) { diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java b/designer_base/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java new file mode 100644 index 0000000000..4fa5169290 --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java @@ -0,0 +1,42 @@ +package com.fr.design.mainframe.templateinfo; + +import com.fr.form.main.Form; +import com.fr.form.ui.container.WFitLayout; + +/** + * Created by plough on 2017/3/17. + */ +public class JFormProcessInfo extends TemplateProcessInfo
{ + public JFormProcessInfo(Form form) { + super(form); + } + + // 获取模板类型 + 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; + } +} diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java b/designer_base/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java new file mode 100644 index 0000000000..44522b8566 --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java @@ -0,0 +1,75 @@ +package com.fr.design.mainframe.templateinfo; + +import com.fr.base.io.IOFile; +import com.fr.base.parameter.ParameterUI; +import com.fr.main.impl.WorkBook; +import com.fr.report.cellcase.CellCase; +import com.fr.report.poly.PolyWorkSheet; +import com.fr.report.worksheet.WorkSheet; + +import java.util.Iterator; + +/** + * Created by plough on 2017/3/17. + */ +public class JWorkBookProcessInfo extends TemplateProcessInfo { + + public JWorkBookProcessInfo(WorkBook wb) { + super(wb); + } + + // 获取模板类型 + 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); + } +} diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index df71bdfc87..8b987dc058 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -8,6 +8,7 @@ import com.fr.design.mainframe.JTemplate; import com.fr.general.ComparatorUtils; import com.fr.general.FRLogger; import com.fr.general.GeneralUtils; +import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; import com.fr.stable.*; import org.json.JSONObject; @@ -27,6 +28,10 @@ public class TemplateInfoCollector implements Serializable { private static TemplateInfoCollector instance; private HashMap> templateInfoList; private String designerOpenDate; //设计器最近一次打开日期 + private static final int VALID_CELL_COUNT = 5; // 有效报表模板的格子数 + private static final int VALID_WIDGET_COUNT = 5; // 有效报表模板的控件数 + private static final int COMPLETE_DAY_COUNT = 15; // 判断模板是否完成的天数 + private static final int ONE_THOUSAND = 1000; @SuppressWarnings("unchecked") private TemplateInfoCollector() { @@ -108,11 +113,11 @@ public class TemplateInfoCollector implements Serializable { private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); -// System.out.println("写入:" + instance.templateInfoList); + System.out.println("写入:" + instance.templateInfoList); os.writeObject(instance); os.close(); } catch (Exception ex) { - ex.printStackTrace(); + FRLogger.getLogger().error(ex.getMessage()); } } @@ -142,7 +147,7 @@ public class TemplateInfoCollector implements Serializable { HashMap templateInfo; - long timeConsume = ((saveTime - openTime) / 1000); // 制作模板耗时(单位:s) + long timeConsume = ((saveTime - openTime) / ONE_THOUSAND); // 制作模板耗时(单位:s) String templateID = t.getTemplateID(); if (inList(t)) { // 已有记录 @@ -195,11 +200,13 @@ public class TemplateInfoCollector implements Serializable { processMap.put("templateID", templateID); processMap.put("process", jt.getProcess()); - processMap.put("report_type", jt.getReportType()); - processMap.put("cell_count", jt.getCellCount()); - processMap.put("float_count", jt.getFloatCount()); - processMap.put("block_count", jt.getBlockCount()); - processMap.put("widget_count", jt.getWidgetCount()); + + TemplateProcessInfo info = jt.getProcessInfo(); + processMap.put("report_type", info.getReportType()); + processMap.put("cell_count", info.getCellCount()); + processMap.put("float_count", info.getFloatCount()); + processMap.put("block_count", info.getBlockCount()); + processMap.put("widget_count", info.getWidgetCount()); return processMap; } @@ -209,15 +216,15 @@ public class TemplateInfoCollector implements Serializable { */ public void sendTemplateInfo() { addDayCount(); - String consumingUrl = "http://cloud.fanruan.com/api/monitor/record_of_reports_consuming/single"; - String processUrl = "http://cloud.fanruan.com/api/monitor/record_of_reports_process/single"; + String consumingUrl = SiteCenter.getInstance().acquireUrlByKind("tempinfo.consuming") + "/single"; + String processUrl = SiteCenter.getInstance().acquireUrlByKind("tempinfo.process") + "/single"; ArrayList> completeTemplatesInfo = getCompleteTemplatesInfo(); for (HashMap templateInfo : completeTemplatesInfo) { String jsonConsumingMap = templateInfo.get("jsonConsumingMap"); String jsonProcessMap = templateInfo.get("jsonProcessMap"); if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) { // 清空记录 -// System.out.println("success"); + FRLogger.getLogger().info("successfully send " + templateInfo.get("templateID")); templateInfoList.remove(templateInfo.get("templateID")); } } @@ -251,7 +258,7 @@ public class TemplateInfoCollector implements Serializable { ArrayList testTemplateKeys = new ArrayList<>(); // 保存测试模板的key for (String key : templateInfoList.keySet()) { HashMap templateInfo = templateInfoList.get(key); - if ((int)templateInfo.get("day_count") <= 15) { // 未完成模板 + if ((int)templateInfo.get("day_count") <= COMPLETE_DAY_COUNT) { // 未完成模板 continue; } if (isTestTemplate(templateInfo)) { @@ -286,9 +293,9 @@ public class TemplateInfoCollector implements Serializable { int widgetCount = (int)processMap.get("widget_count"); boolean isTestTemplate = false; if (reportType == 0) { // 普通报表 - isTestTemplate = cellCount <= 5 && floatCount <= 1 && widgetCount <= 5; + isTestTemplate = cellCount <= VALID_CELL_COUNT && floatCount <= 1 && widgetCount <= VALID_WIDGET_COUNT; } else if (reportType == 1) { // 聚合报表 - isTestTemplate = blockCount <= 1 && widgetCount <= 5; + isTestTemplate = blockCount <= 1 && widgetCount <= VALID_WIDGET_COUNT; } else { // 表单(reportType == 2) isTestTemplate = widgetCount <= 1; } @@ -296,7 +303,7 @@ public class TemplateInfoCollector implements Serializable { } public static void main(String[] args) { -// TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); -// tic.sendTemplateInfo(); + TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); + tic.sendTemplateInfo(); } } diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java new file mode 100644 index 0000000000..d92ca7028a --- /dev/null +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java @@ -0,0 +1,26 @@ +package com.fr.design.mainframe.templateinfo; + +import com.fr.base.io.IOFile; + +/** + * Created by plough on 2017/3/17. + */ +public abstract class TemplateProcessInfo { + + protected T template; + + public TemplateProcessInfo(T template) { + this.template = template; + } + + // 获取模板类型。0 代表普通报表,1 代表聚合报表,2 代表表单 + public abstract int getReportType(); + // 获取模板格子数 + public abstract int getCellCount(); + // 获取模板悬浮元素个数 + public abstract int getFloatCount(); + // 获取模板聚合块个数 + public abstract int getBlockCount(); + // 获取模板控件数 + public abstract int getWidgetCount(); +} diff --git a/designer_form/src/com/fr/design/mainframe/JForm.java b/designer_form/src/com/fr/design/mainframe/JForm.java index c19f7f43b5..b20f44bca4 100644 --- a/designer_form/src/com/fr/design/mainframe/JForm.java +++ b/designer_form/src/com/fr/design/mainframe/JForm.java @@ -23,6 +23,8 @@ import com.fr.design.mainframe.actions.EmbeddedFormExportExportAction; import com.fr.design.mainframe.actions.TemplateParameterAction; import com.fr.design.mainframe.form.FormECCompositeProvider; import com.fr.design.mainframe.form.FormECDesignerProvider; +import com.fr.design.mainframe.templateinfo.JFormProcessInfo; +import com.fr.design.mainframe.templateinfo.TemplateProcessInfo; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.KeySetUtils; @@ -89,33 +91,11 @@ 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(); + public TemplateProcessInfo getProcessInfo() { + if (processInfo == null) { + processInfo = new JFormProcessInfo(template); } - int a = 1; - int b = 2; - return widgetCount; + return processInfo; } @Override From 587f6cf099b4700d09ae00e8d7f2a5fd1367fb6a Mon Sep 17 00:00:00 2001 From: plough Date: Mon, 20 Mar 2017 11:01:24 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer_base/src/com/fr/design/extra/PluginHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/extra/PluginHelper.java b/designer_base/src/com/fr/design/extra/PluginHelper.java index f6bcccc628..ed0d78aa17 100644 --- a/designer_base/src/com/fr/design/extra/PluginHelper.java +++ b/designer_base/src/com/fr/design/extra/PluginHelper.java @@ -320,7 +320,7 @@ public class PluginHelper { return ArrayUtils.EMPTY_STRING_ARRAY; } //卸载前监听 -// plugin.preUninstall(); + plugin.preUninstall(); PluginLoader.getLoader().deletePlugin(plugin); return env.deleteFileFromPluginAndLibFolder(plugin); } From 47fe2434180fab8f939e05a140640bd21d2da0f1 Mon Sep 17 00:00:00 2001 From: plough Date: Thu, 23 Mar 2017 09:27:12 +0800 Subject: [PATCH 12/12] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/templateinfo/TemplateInfoCollector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java index 8b987dc058..4f7069205c 100644 --- a/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ b/designer_base/src/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java @@ -113,7 +113,7 @@ public class TemplateInfoCollector implements Serializable { private void saveInfo() { try { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); - System.out.println("写入:" + instance.templateInfoList); + FRLogger.getLogger().info("writing: " + instance.templateInfoList); os.writeObject(instance); os.close(); } catch (Exception ex) {