From 9717a73e1a5d257cb1369362406769a81650078d Mon Sep 17 00:00:00 2001 From: "shengzu.xue" Date: Fri, 1 Nov 2024 14:40:22 +0800 Subject: [PATCH 01/50] =?UTF-8?q?REPORT-135434=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=A7=92=E8=89=B2id=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/formula/FormulaConstants.java | 1 + .../main/java/com/fr/design/formula/VariableResolverAdapter.java | 1 + 2 files changed, 2 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/formula/FormulaConstants.java b/designer-base/src/main/java/com/fr/design/formula/FormulaConstants.java index 4dfcb4bb47..a020924816 100644 --- a/designer-base/src/main/java/com/fr/design/formula/FormulaConstants.java +++ b/designer-base/src/main/java/com/fr/design/formula/FormulaConstants.java @@ -13,6 +13,7 @@ public enum FormulaConstants { TOTAL_PAGE_NUMBER("$$totalPage_number", "Total_Page_Number"), FINE_USERNAME("$fine_username", "Fine_Username"), FINE_ROLE("$fine_role", "Fine_Role"), + FINE_ROLE_ID("$fine_role_id", "Fine_Role_Id"), FINE_POSITION("$fine_position", "Fine_Position"), NULL("NULL", "Null"), NOFILTER("NOFILTER", "No_Filter"), diff --git a/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java b/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java index 5fd384be8e..13e69d7f4b 100644 --- a/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java +++ b/designer-base/src/main/java/com/fr/design/formula/VariableResolverAdapter.java @@ -31,6 +31,7 @@ public abstract class VariableResolverAdapter implements VariableResolver { // 下面是权限相关的参数 ScriptConstants.DETAIL_TAG + ParameterConstants.FINE_USERNAME, ScriptConstants.DETAIL_TAG + ParameterConstants.FINE_ROLE, + ScriptConstants.DETAIL_TAG + ParameterConstants.FINE_ROLE_ID, ScriptConstants.DETAIL_TAG + ParameterConstants.FINE_POSITION, // 空值参数 "NULL", "NOFILTER", From 1750d2473f4f2cfad73382b1ea273307861c12fa Mon Sep 17 00:00:00 2001 From: lidongy <1879087903@qq.com> Date: Mon, 4 Nov 2024 15:39:33 +0800 Subject: [PATCH 02/50] =?UTF-8?q?REPORT-136606=E3=80=90=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E3=80=91=E6=8C=89=E9=92=AE=E5=A4=8D=E5=88=B6=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=88=B0=E5=8F=A6=E4=B8=80=E4=B8=AA=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=90=8E=E5=8F=91=E7=94=9F=E6=8E=A7=E4=BB=B6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=90=8D=E7=A7=B0=E8=A6=86=E7=9B=96=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/CellWidgetPropertyPane.java | 77 +++++++++---------- 1 file changed, 37 insertions(+), 40 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java index f0ff751f17..f9ac0a67e6 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java @@ -24,9 +24,11 @@ import java.awt.BorderLayout; public class CellWidgetPropertyPane extends BasicPane { private static CellWidgetPropertyPane singleton; - + //当前控件板对应的单元格 private TemplateCellElement cellElement; + //右侧控件板 private WidgetPane cellEditorDefPane; + //左侧单元格板 private ElementCasePane ePane; public static CellWidgetPropertyPane getInstance() { @@ -101,14 +103,43 @@ public class CellWidgetPropertyPane extends BasicPane { editingSelection.populateWidgetPropertyPane(ePane); } + /** + * 将控件板中的内容更新到当前选择的单元格项中 + */ public void update() { + if (ePane == null) { + return; + } + //当前单元格板选中的单元格 + CellSelection finalCS = (CellSelection) ePane.getSelection(); if (cellElement == null || !cellEditorDefPane.isShouldFireSelectedEvent()) { return; } - final CellSelection finalCS = (CellSelection) ePane.getSelection(); + doUpdate(finalCS); + } + + /** + * 将控件板中的内容更新到指定单元格项中 + * (js事件的提交入库事件选择单元格时,ePane.getSelection()是左侧选择的单元格,不是右侧控件板对应的单元格。这时候假如走无参的方法就有问题) + * + * @param selection 当前选中项 + */ + public void update(Selection selection) { + if (cellElement == null || !cellEditorDefPane.isShouldFireSelectedEvent()) { + return; + } + CellSelection finalCS = (CellSelection) selection; + //假如指定单元格项和当前控件板对应的单元格不同,则跳过 + if (finalCS.getColumn() != cellElement.getColumn() || finalCS.getRow() != cellElement.getRow()) { + return; + } + doUpdate(finalCS); + } + + private void doUpdate(CellSelection finalCS) { final TemplateElementCase tplEC = ePane.getEditingElementCase(); final Widget cellWidget = cellEditorDefPane.update(); - if(cellWidget == null){ + if (cellWidget == null) { return; } if (finalCS.isSelectedOneCell(ePane)) { @@ -134,47 +165,13 @@ public class CellWidgetPropertyPane extends BasicPane { } }); } - if (DesignerContext.getDesignerFrame().getSelectedJTemplate() != null) { - DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); - } - } - public void update(Selection selection) { - if (cellElement == null || !cellEditorDefPane.isShouldFireSelectedEvent()) { - return; - } - final CellSelection finalCS = (CellSelection) selection; - final TemplateElementCase tplEC = ePane.getEditingElementCase(); - final Widget cellWidget = cellEditorDefPane.update(); - if(cellWidget == null){ - return; - } - if(finalCS.isSelectedOneCell(ePane)){ - if(tplEC.getTemplateCellElement(cellElement.getColumn(), cellElement.getRow())== null){//cellElement未加入到report中时要添加进去 - tplEC.addCellElement(cellElement); - } else { - cellElement = tplEC.getTemplateCellElement(finalCS.getColumn(), finalCS.getRow()); - } - setCellWidget(cellWidget, cellElement); - }else{ - ReportActionUtils.actionIterateWithCellSelection(finalCS, tplEC, new ReportActionUtils.IterAction() { - public void dealWith(CellElement editCellElement) { - // p:最后把这个cellEditorDef设置到CellGUIAttr. - TemplateCellElement templateCellElement = (TemplateCellElement) editCellElement; - try { - setCellWidget((Widget)cellWidget.clone(), templateCellElement); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("InternalError: " + e.getMessage()); - } - } - }); - } - if(DesignerContext.getDesignerFrame().getSelectedJTemplate() != null){ + if (DesignerContext.getDesignerFrame().getSelectedJTemplate() != null) { DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); } } - private void setCellWidget(Widget cellWidget, TemplateCellElement cellElement){ + private void setCellWidget(Widget cellWidget, TemplateCellElement cellElement) { if (cellWidget instanceof NoneWidget) { cellElement.setWidget(null); } else { @@ -185,7 +182,7 @@ public class CellWidgetPropertyPane extends BasicPane { } } - public void reInitAllListener(){ + public void reInitAllListener() { cellEditorDefPane.registerListener(); } From 0c23385e08e182fd39bbf40aa6167f5f45a86001 Mon Sep 17 00:00:00 2001 From: lidongy <1879087903@qq.com> Date: Mon, 4 Nov 2024 15:43:36 +0800 Subject: [PATCH 03/50] =?UTF-8?q?REPORT-136606=E3=80=90=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E3=80=91=E6=8C=89=E9=92=AE=E5=A4=8D=E5=88=B6=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=88=B0=E5=8F=A6=E4=B8=80=E4=B8=AA=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=90=8E=E5=8F=91=E7=94=9F=E6=8E=A7=E4=BB=B6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=90=8D=E7=A7=B0=E8=A6=86=E7=9B=96=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/mainframe/CellWidgetPropertyPane.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java index f9ac0a67e6..ec44756d40 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java @@ -81,6 +81,11 @@ public class CellWidgetPropertyPane extends BasicPane { } + /** + * 重初始化。选中单元格会走到这 + * + * @param ePane 单元格板 + */ public void reInit(ElementCasePane ePane) { this.ePane = ePane; cellEditorDefPane = new WidgetPane(ePane); @@ -182,6 +187,9 @@ public class CellWidgetPropertyPane extends BasicPane { } } + /** + * 刷新所有监听器 + */ public void reInitAllListener() { cellEditorDefPane.registerListener(); } From e3fc26523120f7cc0c255bf82ba1eb22cbe0c993 Mon Sep 17 00:00:00 2001 From: lidongy <1879087903@qq.com> Date: Mon, 4 Nov 2024 15:55:00 +0800 Subject: [PATCH 04/50] =?UTF-8?q?REPORT-136606=E3=80=90=E6=8E=A7=E4=BB=B6?= =?UTF-8?q?=E3=80=91=E6=8C=89=E9=92=AE=E5=A4=8D=E5=88=B6=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=88=B0=E5=8F=A6=E4=B8=80=E4=B8=AA=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=90=8E=E5=8F=91=E7=94=9F=E6=8E=A7=E4=BB=B6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E5=90=8D=E7=A7=B0=E8=A6=86=E7=9B=96=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/CellWidgetPropertyPane.java | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java index ec44756d40..e4b0cb1c5d 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/CellWidgetPropertyPane.java @@ -158,19 +158,16 @@ public class CellWidgetPropertyPane extends BasicPane { } setCellWidget(cellWidget, cellElement); } else { - ReportActionUtils.actionIterateWithCellSelection(finalCS, tplEC, new ReportActionUtils.IterAction() { - public void dealWith(CellElement editCellElement) { - // p:最后把这个cellEditorDef设置到CellGUIAttr. - TemplateCellElement templateCellElement = (TemplateCellElement) editCellElement; - try { - setCellWidget((Widget) cellWidget.clone(), templateCellElement); - } catch (CloneNotSupportedException e) { - FineLoggerFactory.getLogger().error("InternalError: " + e.getMessage()); - } + ReportActionUtils.actionIterateWithCellSelection(finalCS, tplEC, editCellElement -> { + // p:最后把这个cellEditorDef设置到CellGUIAttr. + TemplateCellElement templateCellElement = (TemplateCellElement) editCellElement; + try { + setCellWidget((Widget) cellWidget.clone(), templateCellElement); + } catch (CloneNotSupportedException e) { + FineLoggerFactory.getLogger().error("InternalError: " + e.getMessage()); } }); } - if (DesignerContext.getDesignerFrame().getSelectedJTemplate() != null) { DesignerContext.getDesignerFrame().getSelectedJTemplate().fireTargetModified(); } From 1f20cb47bbb587741493ed14ae9a6bba5a2f9e8c Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 5 Nov 2024 19:50:55 +0800 Subject: [PATCH 05/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...actTableDataTreeToolBarActionProvider.java | 25 ++ .../data/datapane/TableDataTreePane.java | 60 +++++ .../TableDataTreeToolBarActionProvider.java | 25 ++ .../action/content/cell/SearchCellAction.java | 5 +- .../formula/cell/SearchCellFormulaAction.java | 50 ++-- .../content/tabledata/FormulaUtils.java | 223 ++++++++++++++++ .../tabledata/TableDataFormulaType.java | 75 ++++++ .../content/widget/SearchWidgetAction.java | 28 +- .../actions/replace/info/FormulaInfo.java | 9 + .../replace/ui/ITReplaceMainDialog.java | 5 + .../actions/replace/utils/ReplaceUtils.java | 240 ++++++++++++++++++ .../content/tabledata/FormulaUtilsTest.java | 110 ++++++++ 12 files changed, 823 insertions(+), 32 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java create mode 100644 designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java create mode 100644 designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtils.java create mode 100644 designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java create mode 100644 designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java create mode 100644 designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtilsTest.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java b/designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java new file mode 100644 index 0000000000..8d54b21d93 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java @@ -0,0 +1,25 @@ +package com.fr.design.data.datapane; + +import com.fr.stable.fun.mark.API; + +/** + * 数据集Tree工具栏面板注入接口 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/11/1 + */ +@API(level = TableDataTreeToolBarActionProvider.CURRENT_LEVEL) +public abstract class AbstractTableDataTreeToolBarActionProvider implements TableDataTreeToolBarActionProvider { + + + @Override + public int currentAPILevel() { + return CURRENT_LEVEL; + } + + @Override + public String mark4Provider() { + return getClass().getName(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 149fa87dc2..2f2a1a8f67 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -47,6 +47,7 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.LineSeparator; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; +import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.core.strategy.config.StrategyConfig; @@ -92,9 +93,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutionException; public class TableDataTreePane extends BasicTableDataTreePane { @@ -145,6 +148,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { private EsdOffAction esdOffAction; private SwitchAction switchAction; private PreviewTableDataAction previewTableDataAction; + private Set extraActions = new HashSet<>(); private JPanel serverDatasetAuthTipJPanel = new JPanel(); private TableDataSearchRemindPane remindPane; @@ -246,6 +250,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction, SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction, esdAction, esdOffAction, switchAction); + initExtraAction(); UIToolbar toolBar = ToolBarDef.createJToolBar(); toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR)); toolBar.setBorderPainted(true); @@ -257,6 +262,18 @@ public class TableDataTreePane extends BasicTableDataTreePane { return searchLayerdPane; } + private void initExtraAction() { + Set toolBarActionProviders = ExtraDesignClassManager.getInstance().getArray(TableDataTreeToolBarActionProvider.XML_TAG); + for (TableDataTreeToolBarActionProvider handler : toolBarActionProviders) { + try { + extraActions.add(handler.createAction()); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + toolbarDef.addShortCut(extraActions.toArray(new ShortCut[0])); + } + /** * 数据集树面板 * @@ -706,6 +723,13 @@ public class TableDataTreePane extends BasicTableDataTreePane { } removeAction.setEnabled(true); copyAction.setEnabled(true); + checkExtraActionEnable(op.getDataMode(), selectioncount, getDataTree().hasSelectedIndependentColumns()); + } + + private void checkExtraActionEnable(int dataMode, int selectioncount, boolean hasSelectedIndependentColumns) { + for (ExtraAction action : extraActions) { + action.setEnabled(action.checkEnable(dataMode, selectioncount, hasSelectedIndependentColumns)); + } } @@ -1215,6 +1239,42 @@ public class TableDataTreePane extends BasicTableDataTreePane { } } + public abstract class ExtraAction extends UpdateAction { + + public ExtraAction() { + init(); + } + + /** + * 初始化逻辑 + *

一般用于设置名称、快捷键、icon

+ */ + protected abstract void init(); + + @Override + public void actionPerformed(ActionEvent e) { + doActionPerformed(e, tableDataTree.getSelectedTableDataNameObjects()); + } + + /** + * 点击事件 + * + * @param e actionEvent + * @param selectedTableDataNameObjects 数据集tree选中的对象 + */ + protected abstract void doActionPerformed(ActionEvent e, NameObject[] selectedTableDataNameObjects); + + /** + * 是否可以启用 + * + * @param dataMode 模板数据集还是服务器数据集 + * @param selectioncount 选中的数据集个数 + * @param hasSelectedIndependentColumns 是否存在单独选了数据列节点,但没选其对应数据集的情况 + * @return 返回启用与否 + */ + protected abstract boolean checkEnable(int dataMode, int selectioncount, boolean hasSelectedIndependentColumns); + } + public String getNoRepeatedDsName4Paste(String oldName) { while (isDsNameRepeaded(oldName)) { oldName = oldName + Toolkit.i18nText("Fine-Design_Table_Data_Copy_Of_Table_Data"); diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java new file mode 100644 index 0000000000..cebc00685c --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java @@ -0,0 +1,25 @@ +package com.fr.design.data.datapane; + +import com.fr.stable.fun.mark.Mutable; + + +/** + * 数据集Tree工具栏面板注入接口 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/11/1 + */ +public interface TableDataTreeToolBarActionProvider extends Mutable { + + String XML_TAG = "TableDataTreeToolBarActionProvider"; + + int CURRENT_LEVEL = 1; + + /** + * 创建Action对象,用于提供针对数据集的额外操作 + * + * @return 创建出来的Action对象 + */ + TableDataTreePane.ExtraAction createAction(); +} diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/cell/SearchCellAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/cell/SearchCellAction.java index 2711069847..a717ec9805 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/cell/SearchCellAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/cell/SearchCellAction.java @@ -152,7 +152,10 @@ public class SearchCellAction implements SearchAction { } - private void getCellInfoFromElementCase(ElementCase elementCase, List result, ITContent content) { + /** + * 从ElementCase获取单元格 + */ + public void getCellInfoFromElementCase(ElementCase elementCase, List result, ITContent content) { Iterator cellIterator = elementCase.cellIterator(); while (cellIterator.hasNext()) { ITContent newContent = ITContent.copy(content); diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchCellFormulaAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchCellFormulaAction.java index 45a85d697a..b065842445 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchCellFormulaAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchCellFormulaAction.java @@ -63,30 +63,38 @@ public class SearchCellFormulaAction implements SearchCellFormula { SearchCellAction searchCellAction = SearchCellAction.getInstance(); searchCellAction.search4Infos(jTemplate); if (searchCellAction.isCellInfosExist()) { - for (CellInfo cellInfo : searchCellAction.getCellInfos()) { - //根据单元格类型的不同来进行不同的操作 - searchFormulaFromCellInfo(cellInfo, formulaInfos); - - if (cellInfo.getContent().getReplaceObject() instanceof TemplateCellElement) { - //单元格属性-排序 - searchCellSortAttr4Formula(cellInfo, formulaInfos); - //单元格属性-形态 - searchCellPresent4Formula(cellInfo, formulaInfos); - //单元格属性-其他-内容提示-自定义 - searchCellToolTip4Formula(cellInfo, formulaInfos); - //单元格属性-其他-插入策略 - searchCellInsertPolicy4Formula(cellInfo, formulaInfos); - //单元格条件属性-参数-公式 - searchCellConditionPara4Formula(cellInfo, formulaInfos); - //单元格条件属性-属性-参数 - searchCellHighlightPara4Formula(cellInfo, formulaInfos); - //单元格超链 - searchCellHyperLink4Formula(cellInfo, formulaInfos); - } + searchFormulaFromCellInfos(searchCellAction.getCellInfos(), formulaInfos); + } + + } + + /** + * 从单元格获取公式 + */ + public void searchFormulaFromCellInfos(List cellInfos, List formulaInfos) { + for (CellInfo cellInfo : cellInfos) { + //根据单元格类型的不同来进行不同的操作 + searchFormulaFromCellInfo(cellInfo, formulaInfos); + + if (cellInfo.getContent().getReplaceObject() instanceof TemplateCellElement) { + //单元格属性-排序 + searchCellSortAttr4Formula(cellInfo, formulaInfos); + //单元格属性-形态 + searchCellPresent4Formula(cellInfo, formulaInfos); + //单元格属性-其他-内容提示-自定义 + searchCellToolTip4Formula(cellInfo, formulaInfos); + //单元格属性-其他-插入策略 + searchCellInsertPolicy4Formula(cellInfo, formulaInfos); + //单元格条件属性-参数-公式 + searchCellConditionPara4Formula(cellInfo, formulaInfos); + //单元格条件属性-属性-参数 + searchCellHighlightPara4Formula(cellInfo, formulaInfos); + //单元格超链 + searchCellHyperLink4Formula(cellInfo, formulaInfos); } - } + } } private void searchCellToolTip4Formula(CellInfo cellInfo, List formulaInfos) { diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtils.java new file mode 100644 index 0000000000..22e500c299 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtils.java @@ -0,0 +1,223 @@ +package com.fr.design.actions.replace.action.content.tabledata; + +import com.fr.data.TableReplacementEntity; +import com.fr.invoke.Reflect; +import com.fr.log.FineLoggerFactory; +import com.fr.parser.BinaryExpression; +import com.fr.parser.FunctionCall; +import com.fr.parser.StringLiteral; +import com.fr.script.Calculator; +import com.fr.stable.StringUtils; +import com.fr.stable.script.Expression; +import com.fr.stable.script.Node; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 公式工具 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/11/5 + */ +public class FormulaUtils { + + + private static final String LEFT_BRACKET = "${"; + private static final String RIGHT_BRACKET = "}"; + private static final String FORMULA_MARK = "="; + private static final String STATEMENT = "statement"; + + /** + * 从公式中寻找数据集名称 + */ + public static Set search(String formula) { + Set result = new HashSet<>(); + for (TableDataFormulaType tableDataFormulaType : TableDataFormulaType.values()) { + result.addAll(FormulaUtils.fetchArgument(formula, tableDataFormulaType.name(), tableDataFormulaType.getArgumentIndex())); + } + return result; + } + + /** + * 获取替换后的公式全文 + */ + public static String replace(String formula, List entities) { + try { + Expression expression = Calculator.createCalculator().parse(formula); + FormulaUtils.replace0(expression, entities); + String ans = expression.toString(); + if (formula.startsWith(FORMULA_MARK) && !ans.startsWith(FORMULA_MARK)) { + return FORMULA_MARK + ans; + } else { + if (ans.startsWith(FORMULA_MARK)) { + return ans.substring(1); + } + } + return ans; + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + return formula; + } + } + + private static void replace0(Expression expression, List entities) { + if (expression != null) { + Node node = expression.getConditionalExpression(); + if (node instanceof BinaryExpression) { + BinaryExpression binaryExpression = (BinaryExpression) node; + Node[] nodes = binaryExpression.getNodes(); + if (nodes != null) { + for (Node subNode : nodes) { + if (subNode instanceof FunctionCall) { + FunctionCall functionCall = (FunctionCall) subNode; + FormulaUtils.replaceArgument(functionCall, entities); + } + } + } + } else if (node instanceof FunctionCall) { + FunctionCall functionCall = (FunctionCall) node; + FormulaUtils.replaceArgument(functionCall, entities); + } + } + } + + + /** + * 从公式(可能存在嵌套)中解析出某类型函数的第几个参数 + * + * @param formula 公式 + * @param functionName 函数名 + * @param argumentIndex 参数位置 + * @return 对应参数位置的值 + */ + public static List fetchArgument(String formula, String functionName, int argumentIndex) { + List result = new ArrayList<>(); + try { + Expression expression = Calculator.createCalculator().parse(formula); + if (expression != null) { + Node node = expression.getConditionalExpression(); + if (node instanceof BinaryExpression) { + BinaryExpression binaryExpression = (BinaryExpression) node; + Node[] nodes = binaryExpression.getNodes(); + if (nodes != null) { + for (Node subNode : nodes) { + if (subNode instanceof FunctionCall) { + FunctionCall functionCall = (FunctionCall) subNode; + result.addAll(FormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); + } + } + } + } else if (node instanceof FunctionCall) { + FunctionCall functionCall = (FunctionCall) node; + result.addAll(FormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); + } + } + + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e, e.getMessage()); + } + return result; + } + + private static void replaceArgument(FunctionCall functionCall, List entities) { + Node[] subNodes = functionCall.getArguments(); + if (subNodes != null) { + StringBuilder parent = new StringBuilder(StringUtils.EMPTY); + for (int i = 0; i < subNodes.length; i++) { + Node subNode = subNodes[i]; + if (subNode instanceof FunctionCall) { + replaceArgument((FunctionCall) subNode, entities); + } + if (subNode instanceof StringLiteral) { + StringLiteral stringLiteral = (StringLiteral) subNode; + replaceArgument0(i, stringLiteral, functionCall, entities, parent); + + } + } + } + } + + private static void replaceArgument0(int i, StringLiteral stringLiteral, FunctionCall functionCall, List entities, StringBuilder parent) { + try { + TableDataFormulaType type = TableDataFormulaType.get(functionCall.getName()); + if (type != null) { + String name = stringLiteral.eval(Calculator.createCalculator()).toString(); + for (TableReplacementEntity entity : entities) { + // 数据集名 + if (i == type.getArgumentIndex()) { + if (StringUtils.equals(name, entity.getOldName())) { + // 替换数据集名 + parent.append(name); + Reflect.on(stringLiteral).set(STATEMENT, entity.getNewName()); + break; + } + } else { + String field = entity.getTargetField(name); + // 如果是需要匹配的字段 + // 要走到字段匹配,就必须先经过数据集名匹配,目前所有公式都是数据集在前,字段在后 + if (StringUtils.isNotEmpty(field) && StringUtils.equals(parent.toString(), name)) { + // 替换成匹配后的字段 + Reflect.on(stringLiteral).set(STATEMENT, field); + break; + } + } + } + } + } catch (Exception e) { + FineLoggerFactory.getLogger().debug(e, e.getMessage()); + } + } + + + /** + * 从公式(可能存在嵌套)中解析出某类型函数的第几个参数 + * + * @param functionCall 公式 + * @param functionName 函数名 + * @param argumentIndex 参数位置 + * @return 对应参数位置的值 + */ + public static List fetchArgument(FunctionCall functionCall, String functionName, int argumentIndex) { + List result = new ArrayList<>(); + Node[] subNodes = functionCall.getArguments(); + if (subNodes != null) { + // 遍历子公式 + for (int i = 0; i < subNodes.length; i++) { + Object subNode = subNodes[i]; + if (i == argumentIndex && subNode instanceof StringLiteral && StringUtils.equalsIgnoreCase(functionCall.getName(), functionName)) { + StringLiteral stringLiteral = (StringLiteral) subNode; + try { + result.add(stringLiteral.eval(Calculator.createCalculator()).toString()); + } catch (Exception e) { + FineLoggerFactory.getLogger().debug(e, e.getMessage()); + } + continue; + } + if (subNode instanceof FunctionCall) { + for (TableDataFormulaType tableDataFormulaType : TableDataFormulaType.values()) { + result.addAll(FormulaUtils.fetchArgument((FunctionCall) subNode, tableDataFormulaType.name(), tableDataFormulaType.getArgumentIndex())); + } + } + } + } + return result; + } + + /** + * 通过${content}格式获取公式内容 + * + * @param formula 原公式值 + * @return 最终公式值 + */ + public static String getFormulaPureContent(String formula) { + if (formula.startsWith(LEFT_BRACKET) && formula.endsWith(RIGHT_BRACKET)) { + return formula.substring(LEFT_BRACKET.length() + 1, formula.length() - 1); + } else { + return formula; + } + } +} diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java new file mode 100644 index 0000000000..9f78a1e403 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java @@ -0,0 +1,75 @@ +package com.fr.design.actions.replace.action.content.tabledata; + +import com.fr.stable.StringUtils; + +/** + * 涉及数据集的公式类型枚举 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/11/5 + */ +public enum TableDataFormulaType { + /** + * COLCOUNT公式 + */ + COLCOUNT("COLCOUNT", 0), + /** + * CLONAME公式 + */ + COLNAME("COLNAME", 0), + /** + * MAP公式 + */ + MAP("MAP", 1), + /** + * ROWCOUNT公式 + */ + ROWCOUNT("ROWCOUNT", 0), + /** + * TABLEDATAFILEDS公式 + */ + TABLEDATAFIELDS("TABLEDATAFIELDS", 0), + /** + * VALUE公式 + */ + VALUE("VALUE", 0); + + private int argumentIndex; + private String name; + + TableDataFormulaType(String name, int argumentIndex) { + this.argumentIndex = argumentIndex; + this.name = name; + } + + public int getArgumentIndex() { + return argumentIndex; + } + + /** + * 公式content是否需要替换处理 + */ + public static boolean needReplace(String value) { + for (TableDataFormulaType type : TableDataFormulaType.values()) { + if (value.contains(type.name())) { + return true; + } + } + return false; + } + + + /** + * 获取对应的公式类型 + */ + public static TableDataFormulaType get(String functionName) { + for (TableDataFormulaType type : TableDataFormulaType.values()) { + if (StringUtils.equalsIgnoreCase(functionName, type.name())) { + return type; + } + } + return null; + } +} + diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/widget/SearchWidgetAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/widget/SearchWidgetAction.java index 63b5df9d8f..afa6c4e4fb 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/widget/SearchWidgetAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/widget/SearchWidgetAction.java @@ -68,21 +68,29 @@ public class SearchWidgetAction implements SearchAction { } - private void addCellWidget2Array(ArrayList widgetInfos, JTemplate jTemplate) { + private void addCellWidget2Array(List widgetInfos, JTemplate jTemplate) { SearchCellAction searchCellAction = SearchCellAction.getInstance(); searchCellAction.search4Infos(jTemplate); if (searchCellAction.getCellInfos().size() > 0) { - for (CellInfo cellInfo : searchCellAction.getCellInfos()) { - //单元格本身的控件 - addWidget2ArrayFromCell(widgetInfos, cellInfo); - //单元格条件属性中超链内的控件 - addWidget2ArrayFromCellHighlight(widgetInfos, cellInfo); - } + searchCellWidget(widgetInfos, searchCellAction.getCellInfos()); + } + + } + + /** + * 搜索单元格中的控件 + */ + public void searchCellWidget(List widgetInfos, List cellInfos) { + for (CellInfo cellInfo : cellInfos) { + //单元格本身的控件 + addWidget2ArrayFromCell(widgetInfos, cellInfo); + //单元格条件属性中超链内的控件 + addWidget2ArrayFromCellHighlight(widgetInfos, cellInfo); } } - private void addWidget2ArrayFromCellHighlight(ArrayList widgetInfos, CellInfo cellInfo) { + private void addWidget2ArrayFromCellHighlight(List widgetInfos, CellInfo cellInfo) { if (cellInfo.getContent().getReplaceObject() instanceof TemplateCellElement) { TemplateCellElement cell = (TemplateCellElement) cellInfo.getContent().getReplaceObject(); if (cell.getHighlightGroup() != null) { @@ -92,7 +100,7 @@ public class SearchWidgetAction implements SearchAction { } } - private void dealWithHighlightGroup4Widget(HighlightGroup highlightGroup, ArrayList widgetInfos, CellInfo cellInfo) { + private void dealWithHighlightGroup4Widget(HighlightGroup highlightGroup, List widgetInfos, CellInfo cellInfo) { for (int i = 0; i < highlightGroup.size(); i++) { for (int j = 0; j < ((DefaultHighlight) highlightGroup.getHighlight(i)).actionCount(); j++) { HighlightAction highlightAction = ((DefaultHighlight) highlightGroup.getHighlight(i)).getHighlightAction(j); @@ -115,7 +123,7 @@ public class SearchWidgetAction implements SearchAction { return highlightAction instanceof WidgetHighlightAction && ((WidgetHighlightAction) highlightAction).getWidget() != null; } - private void addWidget2ArrayFromCell(ArrayList widgetInfos, CellInfo cellInfo) { + private void addWidget2ArrayFromCell(List widgetInfos, CellInfo cellInfo) { if (cellInfo.getContent().getReplaceObject() instanceof TemplateCellElement && ((TemplateCellElement) cellInfo.getContent().getReplaceObject()).getWidget() != null) { // 单元格内有控件 diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/info/FormulaInfo.java b/designer-realize/src/main/java/com/fr/design/actions/replace/info/FormulaInfo.java index ce2ecd36c6..e0f86fc084 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/info/FormulaInfo.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/info/FormulaInfo.java @@ -20,6 +20,8 @@ import java.util.Map; * created by Destiny.Lin on 2022-08-17 */ public class FormulaInfo implements Info { + + public static final String CONTENT = "content"; private ITContent content; private static final String DISPLAY = Toolkit.i18nText("Fine-Design_Basic_DS_Dictionary") + "-" + Toolkit.i18nText("Fine-Design_Chart_Formula") + "-" + Toolkit.i18nText("Fine-Design_Basic_Display_Value"); private static final String ACTUAL = Toolkit.i18nText("Fine-Design_Basic_DS_Dictionary") + "-" + Toolkit.i18nText("Fine-Design_Chart_Formula") + "-" + Toolkit.i18nText("Fine-Design_Basic_Actual_Value"); @@ -76,4 +78,11 @@ public class FormulaInfo implements Info { return map; } + /** + * 获取公式值 + */ + public String getPureValue() { + return getCommonValue().get(CONTENT); + } + } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java index cf9a5ca165..35d82e47b8 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java @@ -1,12 +1,14 @@ package com.fr.design.actions.replace.ui; +import com.fr.data.TableReplacementEntity; import com.fr.design.actions.replace.action.ITChecker; import com.fr.design.actions.replace.action.ShowSearchResultAction; import com.fr.design.actions.replace.action.setting.SettingController; import com.fr.design.actions.replace.info.Info; +import com.fr.design.actions.replace.utils.ReplaceUtils; import com.fr.design.actions.replace.utils.ShowValueUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.UIDialog; @@ -35,6 +37,7 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; @@ -126,6 +129,8 @@ public class ITReplaceMainDialog extends UIDialog { setLocation(new Point(point.x, point.y + jTemplate.getHeight() / 2 + jTemplate.getHeight() / 2 - 385)); northPane.fitScreen(0, 0, width); + + //ReplaceUtils.replaceCpt(jTemplate, new TableReplacementEntity().setOldName("test-测试").setNewName("test-测试的副本").setFields(new HashMap<>())); } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java new file mode 100644 index 0000000000..c1a89cac86 --- /dev/null +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -0,0 +1,240 @@ +package com.fr.design.actions.replace.utils; + +import com.fr.base.Formula; +import com.fr.chart.chartattr.ChartCollection; +import com.fr.data.TableReplacementEntity; +import com.fr.design.actions.replace.action.content.cell.SearchCellAction; +import com.fr.design.actions.replace.action.content.formula.SearchFormulaManager; +import com.fr.design.actions.replace.action.content.formula.cell.SearchCellFormulaAction; +import com.fr.design.actions.replace.action.content.formula.chart.SearchChartCollectionFormulaAction; +import com.fr.design.actions.replace.action.content.formula.widget.SearchWidgetFormulaAction; +import com.fr.design.actions.replace.action.content.tabledata.FormulaUtils; +import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaType; +import com.fr.design.actions.replace.action.content.widget.SearchWidgetAction; +import com.fr.design.actions.replace.info.CellInfo; +import com.fr.design.actions.replace.info.FormulaInfo; +import com.fr.design.actions.replace.info.WidgetInfo; +import com.fr.design.actions.replace.info.base.ITContent; +import com.fr.design.mainframe.JTemplate; +import com.fr.form.FormElementCaseProvider; +import com.fr.form.ui.ElementCaseEditor; +import com.fr.main.impl.WorkBook; +import com.fr.report.elementcase.ElementCase; +import com.fr.report.utils.ElementCaseHelper; +import java.util.ArrayList; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +/** + * 数据集查找替换工具 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/11/4 + */ +public class ReplaceUtils { + /** + * ----------------------------------------------查找部分-------------------------------------------------- + */ + + /** + * 获取公式里使用的数据集 + * + * @param formula 公式内容 + * @return 返回公式中使用的数据集名称 + */ + public static Set getFormulaDependenceTables(String formula) { + return FormulaUtils.search(formula); + } + + + /** + * 获取图表块里使用的数据集(不包含公式里的) + * + * @param chartCollection 图表对象 + * @return 使用的数据集名称 + */ + public static Set getChartDependenceTables(ChartCollection chartCollection) { + return chartCollection.getDataSetNames(); + } + + /** + * 获取图表里使用的公式 + * + * @param chartCollection 图表对象 + * @return 图表公式集合 + */ + public static Set getChartDependenceFormulas(ChartCollection chartCollection) { + List formulaInfos = new ArrayList<>(); + SearchChartCollectionFormulaAction.getInstance().searchChartCollectionFormula(formulaInfos, new ITContent(), chartCollection); + Set ans = new HashSet<>(); + for (FormulaInfo formulaInfo : formulaInfos) { + ans.add(formulaInfo.getContent().getReplaceObject().toString()); + } + return ans; + } + + /** + * 获取报表块里使用的数据集(不包含公式里的) + * + * @param elementCaseEditor 报表块 + * @return 报表块使用的数据集 + */ + public static Set getElementCaseDependenceTables(ElementCaseEditor elementCaseEditor) { + FormElementCaseProvider elementCase = elementCaseEditor.getElementCase(); + return elementCase.getCellTableDataSet(); + } + + /** + * 获取报表块里使用的公式 + * + * @param elementCase 报表块 + * @return 公式集合 + */ + public static Set getElementCaseDependenceFormulas(ElementCase elementCase) { + List formulaInfos = getElementCaseFormulas(elementCase); + Set ans = new HashSet<>(); + for (FormulaInfo formulaInfo : formulaInfos) { + ans.add(formulaInfo.getContent().getReplaceObject().toString()); + } + return ans; + } + + /** + * 获取CPT里使用的数据集(不包含公式里的) + * + * @param template 模板 + * @return 数据集名字集合 + */ + public static Set getCptDependenceTables(JTemplate template) { + Set ans = new HashSet<>(); + if (template.getTarget() instanceof WorkBook) { + WorkBook workBook = (WorkBook) template.getTarget(); + Iterator iterator = workBook.getTableDataNameIterator(); + while (iterator.hasNext()) { + String tableName = iterator.next(); + ans.add(tableName); + } + } + return ans; + } + + /** + * 获取CPT里使用的公式 + * + * @param template 包含workbook的Jtemplate + * @return 公式集合 + */ + public static Set getCptDependenceFormulas(JTemplate template) { + SearchFormulaManager.getInstance().search4Infos(template); + List formulaInfos = SearchFormulaManager.getInstance().getFormulaInfos(); + Set ans = new HashSet<>(); + for (FormulaInfo formulaInfo : formulaInfos) { + ans.add(formulaInfo.getContent().getReplaceObject().toString()); + } + return ans; + } + + + /** + * ----------------------------------------------替换部分-------------------------------------------------- + */ + + /** + * 替换公式里的数据集 + * + * @param formula 公式 + * @param entity 替换信息 + * @return 替换后的公式内容 + */ + public static String replaceFormula(String formula, List entity) { + return FormulaUtils.replace(formula, entity); + } + + /** + * 替换公式里的数据集 + * + * @param formula 公式 + * @param entity 替换信息 + */ + public static void replaceFormula(Formula formula, List entity) { + String content = formula.getContent(); + formula.setContent(FormulaUtils.replace(content, entity)); + } + + /** + * 替换图表里使用的数据集(包含公式里的) + * + * @param chartCollection 图表对象 + * @param entities 替换信息 + */ + public static void replaceChart(ChartCollection chartCollection, List entities) { + // 非公式部分 + chartCollection.replaceTableData(entities); + // 公式部分 + List formulaInfos = new ArrayList<>(); + SearchChartCollectionFormulaAction.getInstance().searchChartCollectionFormula(formulaInfos, new ITContent(), chartCollection); + replaceFormulaInfos(formulaInfos, entities); + } + + /** + * 替换报表块里使用的数据集(包含公式里的) + * + * @param elementCase 报表块控件 + * @param entities 替换信息 + */ + public static void replaceElementCase(ElementCase elementCase, List entities) { + // 非公式部分 + ElementCaseHelper.replaceTableDataWithOutFormula(elementCase, entities); + // 公式部分——理论上就只有单元格和控件(超链那些都包含) + List formulaInfos = getElementCaseFormulas(elementCase); + replaceFormulaInfos(formulaInfos, entities); + + } + + /** + * 替换CPT使用的数据集(包含公式里的) + * + * @param template cpt对应的JTemplate + * @param entity 替换信息 + */ + public static void replaceCpt(JTemplate template, List entity) { + if (template.getTarget() instanceof WorkBook) { + WorkBook workBook = (WorkBook) template.getTarget(); + + // 非公式部分替换 + workBook.replaceTableData(entity); + // 公式部分 + SearchFormulaManager.getInstance().search4Infos(template); + List formulaInfos = SearchFormulaManager.getInstance().getFormulaInfos(); + replaceFormulaInfos(formulaInfos, entity); + } + } + + private static void replaceFormulaInfos(List formulaInfos, List entity) { + for (FormulaInfo formulaInfo : formulaInfos) { + if (TableDataFormulaType.needReplace(formulaInfo.getPureValue())) { + formulaInfo.setValue(formulaInfo, + formulaInfo.getPureValue(), + FormulaUtils.replace(formulaInfo.getPureValue(), entity), + new ArrayList<>()); + } + } + } + + private static List getElementCaseFormulas(ElementCase elementCase) { + List cellInfos = new ArrayList<>(); + List formulaInfos = new ArrayList<>(); + List widgetInfos = new ArrayList<>(); + SearchCellAction.getInstance().getCellInfoFromElementCase(elementCase, cellInfos, new ITContent()); + SearchCellFormulaAction.getInstance().searchFormulaFromCellInfos(cellInfos, formulaInfos); + SearchWidgetAction.getInstance().searchCellWidget(widgetInfos, cellInfos); + for (WidgetInfo widgetInfo : widgetInfos) { + SearchWidgetFormulaAction.getInstance().searchFormulaFromWidgetInfos(widgetInfo, formulaInfos); + } + return formulaInfos; + } +} diff --git a/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtilsTest.java b/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtilsTest.java new file mode 100644 index 0000000000..b563010713 --- /dev/null +++ b/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtilsTest.java @@ -0,0 +1,110 @@ +package com.fr.design.actions.replace.action.content.tabledata; + +import com.fr.data.TableReplacementEntity; +import junit.framework.TestCase; +import org.junit.Assert; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 公式工具类的单测 + * + * @author Destiny.Lin + * @since 11.0 + * Created on 2024/11/5 + */ +public class FormulaUtilsTest extends TestCase { + + public void testSearch() { + String rowcount = "=ROWCOUNT(\"123\")"; + Set strings = new HashSet<>(); + strings.add("123"); + Assert.assertEquals(FormulaUtils.search(rowcount), strings); + Set errorSet = new HashSet<>(); + errorSet.add("1223"); + Assert.assertNotEquals(FormulaUtils.search(rowcount), errorSet); + String str = "=COLNAME(\"test-测试\",COLCOUNT(\"列数嵌套123\"))"; + Set qiantao = new HashSet<>(); + qiantao.add("test-测试"); + qiantao.add("列数嵌套123"); + Assert.assertEquals(FormulaUtils.search(str), qiantao); + String str2 = "=sum(len(MAP(value(\"test-测试1\",COLNAME(\"test-测试2\",2),COLCOUNT(\"test-测试3\")),\"test-测试4\",COLNAME(\"test-测试5\",2),COLNAME(\"test-测试6\",4))),ROWCOUNT(\"test-测试7\"),len(TABLEDATAFIELDS(\"test-测试8\")))"; + Set qiantao2 = FormulaUtils.search(str2); + Assert.assertTrue(qiantao2.contains("test-测试1")); + Assert.assertTrue(qiantao2.contains("test-测试2")); + Assert.assertTrue(qiantao2.contains("test-测试3")); + Assert.assertTrue(qiantao2.contains("test-测试4")); + Assert.assertTrue(qiantao2.contains("test-测试5")); + Assert.assertTrue(qiantao2.contains("test-测试6")); + Assert.assertTrue(qiantao2.contains("test-测试7")); + Assert.assertTrue(qiantao2.contains("test-测试8")); + + } + + public void testReplace() { + String rowcount = "=ROWCOUNT(\"123\")"; + TableReplacementEntity entity = new TableReplacementEntity(); + entity.setOldName("123"); + entity.setNewName("222"); + List entities = new ArrayList<>(); + entities.add(entity); + Assert.assertEquals(FormulaUtils.replace(rowcount, entities), "=ROWCOUNT(\"222\")"); + + String colcount = "=COLCOUNT(\"test测试\")"; + TableReplacementEntity entity1 = new TableReplacementEntity(); + entity1.setOldName("test测试"); + entity1.setNewName("替换"); + List entities1 = new ArrayList<>(); + entities1.add(entity1); + Assert.assertEquals(FormulaUtils.replace(colcount, entities1), "=COLCOUNT(\"替换\")"); + + String colname = "=COLNAME(\"test测试\")"; + TableReplacementEntity entity2 = new TableReplacementEntity(); + entity2.setOldName("test测试"); + entity2.setNewName("替换123"); + List entities2 = new ArrayList<>(); + entities2.add(entity2); + Assert.assertEquals(FormulaUtils.replace(colname, entities2), "=COLNAME(\"替换123\")"); + + String TABLEDATAFIELDS = "=TABLEDATAFIELDS(\"test测试\")"; + TableReplacementEntity entity3 = new TableReplacementEntity(); + entity3.setOldName("test测试"); + entity3.setNewName("替换111"); + List entities3 = new ArrayList<>(); + entities3.add(entity3); + Assert.assertEquals(FormulaUtils.replace(TABLEDATAFIELDS, entities3), "=TABLEDATAFIELDS(\"替换111\")"); + + String test = "=sum(len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",2),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4))),ROWCOUNT(\"test-测试\"),len(TABLEDATAFIELDS(\"test-测试\")))"; + TableReplacementEntity entity4 = new TableReplacementEntity(); + entity4.setOldName("test-测试"); + entity4.setNewName("test-测试的副本"); + List entities4 = new ArrayList<>(); + entities4.add(entity4); + Assert.assertEquals(FormulaUtils.replace(test, entities4), "=sum(len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4))),ROWCOUNT(\"test-测试的副本\"),len(TABLEDATAFIELDS(\"test-测试的副本\")))"); + + + String testCircle = "=sum(len(MAP(value(\"test-测试1\",COLNAME(\"test-测试2\",len(MAP(value(\"test-测试3\",COLNAME(\"test-测试4\",len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",2),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4))),ROWCOUNT(\"test-测试\"),len(TABLEDATAFIELDS(\"test-测试\")))"; + TableReplacementEntity entity5 = new TableReplacementEntity(); + entity5.setOldName("test-测试"); + entity5.setNewName("test-测试的副本"); + TableReplacementEntity entity6 = new TableReplacementEntity(); + entity6.setOldName("test-测试1"); + entity6.setNewName("test-测试2"); + TableReplacementEntity entity7 = new TableReplacementEntity(); + entity7.setOldName("test-测试2"); + entity7.setNewName("test-测试3"); + TableReplacementEntity entity8 = new TableReplacementEntity(); + entity8.setOldName("test-测试3"); + entity8.setNewName("test-测试4"); + List entities5 = new ArrayList<>(); + entities5.add(entity5); + entities5.add(entity6); + entities5.add(entity7); + entities5.add(entity8); + Assert.assertEquals(FormulaUtils.replace(testCircle, entities5), "=sum(len(MAP(value(\"test-测试2\",COLNAME(\"test-测试3\",len(MAP(value(\"test-测试4\",COLNAME(\"test-测试4\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4))),ROWCOUNT(\"test-测试的副本\"),len(TABLEDATAFIELDS(\"test-测试的副本\")))"); + + } +} \ No newline at end of file From 3d49bf6c11ca9f2163d813e54b560b08d0c87399 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 5 Nov 2024 19:59:20 +0800 Subject: [PATCH 06/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=A7=84=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/data/datapane/TableDataTreePane.java | 11 +++++++---- .../datapane/TableDataTreeToolBarActionProvider.java | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 2f2a1a8f67..b396d475f2 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -148,7 +148,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { private EsdOffAction esdOffAction; private SwitchAction switchAction; private PreviewTableDataAction previewTableDataAction; - private Set extraActions = new HashSet<>(); + private Set extraActions = new HashSet<>(); private JPanel serverDatasetAuthTipJPanel = new JPanel(); private TableDataSearchRemindPane remindPane; @@ -727,7 +727,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { } private void checkExtraActionEnable(int dataMode, int selectioncount, boolean hasSelectedIndependentColumns) { - for (ExtraAction action : extraActions) { + for (AbstractExtraAction action : extraActions) { action.setEnabled(action.checkEnable(dataMode, selectioncount, hasSelectedIndependentColumns)); } } @@ -1239,9 +1239,12 @@ public class TableDataTreePane extends BasicTableDataTreePane { } } - public abstract class ExtraAction extends UpdateAction { + /** + * TableDataTree工具栏的扩展接口Action + */ + public abstract class AbstractExtraAction extends UpdateAction { - public ExtraAction() { + public AbstractExtraAction() { init(); } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java index cebc00685c..5746f9d136 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java @@ -21,5 +21,5 @@ public interface TableDataTreeToolBarActionProvider extends Mutable { * * @return 创建出来的Action对象 */ - TableDataTreePane.ExtraAction createAction(); + TableDataTreePane.AbstractExtraAction createAction(); } From 794b29bd1937c4a111bf31c9d5eff080478cdcfc Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 6 Nov 2024 10:25:18 +0800 Subject: [PATCH 07/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9static?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/datapane/TableDataTreePane.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index b396d475f2..e566004679 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -1242,7 +1242,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { /** * TableDataTree工具栏的扩展接口Action */ - public abstract class AbstractExtraAction extends UpdateAction { + public static abstract class AbstractExtraAction extends UpdateAction { public AbstractExtraAction() { init(); @@ -1256,7 +1256,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { @Override public void actionPerformed(ActionEvent e) { - doActionPerformed(e, tableDataTree.getSelectedTableDataNameObjects()); + doActionPerformed(e, singleton.tableDataTree.getSelectedTableDataNameObjects()); } /** From 8095139ec8ab378c3dfd10ddd945ae12618775fa Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 6 Nov 2024 12:08:02 +0800 Subject: [PATCH 08/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=8F=92=E4=BB=B6=E7=9B=91=E5=90=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataTreePane.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index e566004679..22c49df240 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -237,7 +237,17 @@ public class TableDataTreePane extends BasicTableDataTreePane { createAddMenuDef(); // 创建插件监听 createPluginListener(); + createToolbarDef(); + UIToolbar toolBar = ToolBarDef.createJToolBar(); + toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR)); + toolBar.setBorderPainted(true); + toolbarDef.updateToolBar(toolBar); + TreeSearchToolbarPane searchLayerdPane = new TreeSearchToolbarPane(toolBar); + searchLayerdPane.setPreferredSize(new Dimension(this.getWidth(), 23)); + return searchLayerdPane; + } + private void createToolbarDef() { editAction = new EditAction(); copyAction = new CopyAction(); pasteAction = new PasteAction(); @@ -249,20 +259,15 @@ public class TableDataTreePane extends BasicTableDataTreePane { switchAction = new SwitchAction(); toolbarDef = new ToolBarDef(); - toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction, SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction, esdAction, esdOffAction, switchAction); - initExtraAction(); - UIToolbar toolBar = ToolBarDef.createJToolBar(); - toolBar.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, UIConstants.TOOLBAR_BORDER_COLOR)); - toolBar.setBorderPainted(true); - toolbarDef.updateToolBar(toolBar); - - TreeSearchToolbarPane searchLayerdPane = new TreeSearchToolbarPane(toolBar); - searchLayerdPane.setPreferredSize(new Dimension(this.getWidth(), 23)); - - return searchLayerdPane; + toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction); + ShortCut[] extraShortCut = initExtraAction(); + for (ShortCut shortCut: extraShortCut) { + toolbarDef.addShortCut(shortCut); + } + toolbarDef.addShortCut(SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction, esdAction, esdOffAction, switchAction); } - private void initExtraAction() { + private ShortCut[] initExtraAction() { Set toolBarActionProviders = ExtraDesignClassManager.getInstance().getArray(TableDataTreeToolBarActionProvider.XML_TAG); for (TableDataTreeToolBarActionProvider handler : toolBarActionProviders) { try { @@ -271,7 +276,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - toolbarDef.addShortCut(extraActions.toArray(new ShortCut[0])); + return extraActions.toArray(new ShortCut[0]); } /** @@ -348,7 +353,9 @@ public class TableDataTreePane extends BasicTableDataTreePane { public void on(PluginEvent event) { addMenuDef.clearShortCuts(); + toolbarDef.clearShortCuts(); createAddMenuDef(); + createToolbarDef(); } }, new PluginFilter() { From 5483f6027cc606a6421efda5d7c91d8c788b8c8f Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 6 Nov 2024 12:10:11 +0800 Subject: [PATCH 09/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/datapane/TableDataTreePane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 22c49df240..fd421ad322 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -257,7 +257,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { esdAction = new EsdOnAction(); esdOffAction = new EsdOffAction(); switchAction = new SwitchAction(); - + extraActions = new HashSet<>(); toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction); ShortCut[] extraShortCut = initExtraAction(); From 8549d668511f4dbaa89ff696876ac1b960dad679 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 6 Nov 2024 15:19:16 +0800 Subject: [PATCH 10/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E6=8F=92=E4=BB=B6=E5=88=B7=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/data/datapane/TableDataTreePane.java | 2 ++ .../management/search/pane/TreeSearchToolbarPane.java | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index fd421ad322..084eb1cc2d 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -356,6 +356,8 @@ public class TableDataTreePane extends BasicTableDataTreePane { toolbarDef.clearShortCuts(); createAddMenuDef(); createToolbarDef(); + toolbarDef.updateToolBar(toolbarPane.getToolbar()); + checkEnable(); } }, new PluginFilter() { diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java index f5266c9b6d..5dc751c29e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/management/search/pane/TreeSearchToolbarPane.java @@ -189,6 +189,10 @@ public class TreeSearchToolbarPane extends JPanel implements TreeSearchStatusCha this.searchTextField.setPlaceholder(placeHolder); } + public UIToolbar getToolbar() { + return toolbar; + } + /** * 根据搜索状态变化,来调整自身面板的显示 * From 15f48275328fae43e013f871e93187ff20a05252 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 6 Nov 2024 15:43:21 +0800 Subject: [PATCH 11/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...aUtils.java => TableDataFormulaUtils.java} | 30 ++++++++++++------- .../actions/replace/utils/ReplaceUtils.java | 10 +++---- ...st.java => TableDataFormulaUtilsTest.java} | 22 +++++++------- 3 files changed, 35 insertions(+), 27 deletions(-) rename designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/{FormulaUtils.java => TableDataFormulaUtils.java} (86%) rename designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/{FormulaUtilsTest.java => TableDataFormulaUtilsTest.java} (67%) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java similarity index 86% rename from designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtils.java rename to designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java index 22e500c299..f788bc0c73 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java @@ -23,7 +23,7 @@ import java.util.Set; * @since 11.0 * Created on 2024/11/5 */ -public class FormulaUtils { +public class TableDataFormulaUtils { private static final String LEFT_BRACKET = "${"; @@ -33,22 +33,30 @@ public class FormulaUtils { /** * 从公式中寻找数据集名称 + * + * @param formula 公式的content + * @return 返回数据集名称集合 */ - public static Set search(String formula) { + public static Set search4TableData(String formula) { Set result = new HashSet<>(); for (TableDataFormulaType tableDataFormulaType : TableDataFormulaType.values()) { - result.addAll(FormulaUtils.fetchArgument(formula, tableDataFormulaType.name(), tableDataFormulaType.getArgumentIndex())); + result.addAll(TableDataFormulaUtils.fetchArgument(formula, tableDataFormulaType.name(), tableDataFormulaType.getArgumentIndex())); } return result; } + /** - * 获取替换后的公式全文 + * 获取替换指定数据集后的公式全文 + * + * @param formula 公式content + * @param entities 替换信息 + * @return 替换后的全文 */ - public static String replace(String formula, List entities) { + public static String replace4TableData(String formula, List entities) { try { Expression expression = Calculator.createCalculator().parse(formula); - FormulaUtils.replace0(expression, entities); + TableDataFormulaUtils.replace0(expression, entities); String ans = expression.toString(); if (formula.startsWith(FORMULA_MARK) && !ans.startsWith(FORMULA_MARK)) { return FORMULA_MARK + ans; @@ -74,13 +82,13 @@ public class FormulaUtils { for (Node subNode : nodes) { if (subNode instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) subNode; - FormulaUtils.replaceArgument(functionCall, entities); + TableDataFormulaUtils.replaceArgument(functionCall, entities); } } } } else if (node instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) node; - FormulaUtils.replaceArgument(functionCall, entities); + TableDataFormulaUtils.replaceArgument(functionCall, entities); } } } @@ -107,13 +115,13 @@ public class FormulaUtils { for (Node subNode : nodes) { if (subNode instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) subNode; - result.addAll(FormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); + result.addAll(TableDataFormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); } } } } else if (node instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) node; - result.addAll(FormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); + result.addAll(TableDataFormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); } } @@ -199,7 +207,7 @@ public class FormulaUtils { } if (subNode instanceof FunctionCall) { for (TableDataFormulaType tableDataFormulaType : TableDataFormulaType.values()) { - result.addAll(FormulaUtils.fetchArgument((FunctionCall) subNode, tableDataFormulaType.name(), tableDataFormulaType.getArgumentIndex())); + result.addAll(TableDataFormulaUtils.fetchArgument((FunctionCall) subNode, tableDataFormulaType.name(), tableDataFormulaType.getArgumentIndex())); } } } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index c1a89cac86..15c5896c6a 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -8,7 +8,7 @@ import com.fr.design.actions.replace.action.content.formula.SearchFormulaManager import com.fr.design.actions.replace.action.content.formula.cell.SearchCellFormulaAction; import com.fr.design.actions.replace.action.content.formula.chart.SearchChartCollectionFormulaAction; import com.fr.design.actions.replace.action.content.formula.widget.SearchWidgetFormulaAction; -import com.fr.design.actions.replace.action.content.tabledata.FormulaUtils; +import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaUtils; import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaType; import com.fr.design.actions.replace.action.content.widget.SearchWidgetAction; import com.fr.design.actions.replace.info.CellInfo; @@ -47,7 +47,7 @@ public class ReplaceUtils { * @return 返回公式中使用的数据集名称 */ public static Set getFormulaDependenceTables(String formula) { - return FormulaUtils.search(formula); + return TableDataFormulaUtils.search4TableData(formula); } @@ -151,7 +151,7 @@ public class ReplaceUtils { * @return 替换后的公式内容 */ public static String replaceFormula(String formula, List entity) { - return FormulaUtils.replace(formula, entity); + return TableDataFormulaUtils.replace4TableData(formula, entity); } /** @@ -162,7 +162,7 @@ public class ReplaceUtils { */ public static void replaceFormula(Formula formula, List entity) { String content = formula.getContent(); - formula.setContent(FormulaUtils.replace(content, entity)); + formula.setContent(TableDataFormulaUtils.replace4TableData(content, entity)); } /** @@ -219,7 +219,7 @@ public class ReplaceUtils { if (TableDataFormulaType.needReplace(formulaInfo.getPureValue())) { formulaInfo.setValue(formulaInfo, formulaInfo.getPureValue(), - FormulaUtils.replace(formulaInfo.getPureValue(), entity), + TableDataFormulaUtils.replace4TableData(formulaInfo.getPureValue(), entity), new ArrayList<>()); } } diff --git a/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtilsTest.java b/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtilsTest.java similarity index 67% rename from designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtilsTest.java rename to designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtilsTest.java index b563010713..ca4fc6dd45 100644 --- a/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/FormulaUtilsTest.java +++ b/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtilsTest.java @@ -16,23 +16,23 @@ import java.util.Set; * @since 11.0 * Created on 2024/11/5 */ -public class FormulaUtilsTest extends TestCase { +public class TableDataFormulaUtilsTest extends TestCase { public void testSearch() { String rowcount = "=ROWCOUNT(\"123\")"; Set strings = new HashSet<>(); strings.add("123"); - Assert.assertEquals(FormulaUtils.search(rowcount), strings); + Assert.assertEquals(TableDataFormulaUtils.search4TableData(rowcount), strings); Set errorSet = new HashSet<>(); errorSet.add("1223"); - Assert.assertNotEquals(FormulaUtils.search(rowcount), errorSet); + Assert.assertNotEquals(TableDataFormulaUtils.search4TableData(rowcount), errorSet); String str = "=COLNAME(\"test-测试\",COLCOUNT(\"列数嵌套123\"))"; Set qiantao = new HashSet<>(); qiantao.add("test-测试"); qiantao.add("列数嵌套123"); - Assert.assertEquals(FormulaUtils.search(str), qiantao); + Assert.assertEquals(TableDataFormulaUtils.search4TableData(str), qiantao); String str2 = "=sum(len(MAP(value(\"test-测试1\",COLNAME(\"test-测试2\",2),COLCOUNT(\"test-测试3\")),\"test-测试4\",COLNAME(\"test-测试5\",2),COLNAME(\"test-测试6\",4))),ROWCOUNT(\"test-测试7\"),len(TABLEDATAFIELDS(\"test-测试8\")))"; - Set qiantao2 = FormulaUtils.search(str2); + Set qiantao2 = TableDataFormulaUtils.search4TableData(str2); Assert.assertTrue(qiantao2.contains("test-测试1")); Assert.assertTrue(qiantao2.contains("test-测试2")); Assert.assertTrue(qiantao2.contains("test-测试3")); @@ -51,7 +51,7 @@ public class FormulaUtilsTest extends TestCase { entity.setNewName("222"); List entities = new ArrayList<>(); entities.add(entity); - Assert.assertEquals(FormulaUtils.replace(rowcount, entities), "=ROWCOUNT(\"222\")"); + Assert.assertEquals(TableDataFormulaUtils.replace4TableData(rowcount, entities), "=ROWCOUNT(\"222\")"); String colcount = "=COLCOUNT(\"test测试\")"; TableReplacementEntity entity1 = new TableReplacementEntity(); @@ -59,7 +59,7 @@ public class FormulaUtilsTest extends TestCase { entity1.setNewName("替换"); List entities1 = new ArrayList<>(); entities1.add(entity1); - Assert.assertEquals(FormulaUtils.replace(colcount, entities1), "=COLCOUNT(\"替换\")"); + Assert.assertEquals(TableDataFormulaUtils.replace4TableData(colcount, entities1), "=COLCOUNT(\"替换\")"); String colname = "=COLNAME(\"test测试\")"; TableReplacementEntity entity2 = new TableReplacementEntity(); @@ -67,7 +67,7 @@ public class FormulaUtilsTest extends TestCase { entity2.setNewName("替换123"); List entities2 = new ArrayList<>(); entities2.add(entity2); - Assert.assertEquals(FormulaUtils.replace(colname, entities2), "=COLNAME(\"替换123\")"); + Assert.assertEquals(TableDataFormulaUtils.replace4TableData(colname, entities2), "=COLNAME(\"替换123\")"); String TABLEDATAFIELDS = "=TABLEDATAFIELDS(\"test测试\")"; TableReplacementEntity entity3 = new TableReplacementEntity(); @@ -75,7 +75,7 @@ public class FormulaUtilsTest extends TestCase { entity3.setNewName("替换111"); List entities3 = new ArrayList<>(); entities3.add(entity3); - Assert.assertEquals(FormulaUtils.replace(TABLEDATAFIELDS, entities3), "=TABLEDATAFIELDS(\"替换111\")"); + Assert.assertEquals(TableDataFormulaUtils.replace4TableData(TABLEDATAFIELDS, entities3), "=TABLEDATAFIELDS(\"替换111\")"); String test = "=sum(len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",2),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4))),ROWCOUNT(\"test-测试\"),len(TABLEDATAFIELDS(\"test-测试\")))"; TableReplacementEntity entity4 = new TableReplacementEntity(); @@ -83,7 +83,7 @@ public class FormulaUtilsTest extends TestCase { entity4.setNewName("test-测试的副本"); List entities4 = new ArrayList<>(); entities4.add(entity4); - Assert.assertEquals(FormulaUtils.replace(test, entities4), "=sum(len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4))),ROWCOUNT(\"test-测试的副本\"),len(TABLEDATAFIELDS(\"test-测试的副本\")))"); + Assert.assertEquals(TableDataFormulaUtils.replace4TableData(test, entities4), "=sum(len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4))),ROWCOUNT(\"test-测试的副本\"),len(TABLEDATAFIELDS(\"test-测试的副本\")))"); String testCircle = "=sum(len(MAP(value(\"test-测试1\",COLNAME(\"test-测试2\",len(MAP(value(\"test-测试3\",COLNAME(\"test-测试4\",len(MAP(value(\"test-测试\",COLNAME(\"test-测试\",2),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4)))),COLCOUNT(\"test-测试\")),\"test-测试\",COLNAME(\"test-测试\",2),COLNAME(\"test-测试\",4))),ROWCOUNT(\"test-测试\"),len(TABLEDATAFIELDS(\"test-测试\")))"; @@ -104,7 +104,7 @@ public class FormulaUtilsTest extends TestCase { entities5.add(entity6); entities5.add(entity7); entities5.add(entity8); - Assert.assertEquals(FormulaUtils.replace(testCircle, entities5), "=sum(len(MAP(value(\"test-测试2\",COLNAME(\"test-测试3\",len(MAP(value(\"test-测试4\",COLNAME(\"test-测试4\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4))),ROWCOUNT(\"test-测试的副本\"),len(TABLEDATAFIELDS(\"test-测试的副本\")))"); + Assert.assertEquals(TableDataFormulaUtils.replace4TableData(testCircle, entities5), "=sum(len(MAP(value(\"test-测试2\",COLNAME(\"test-测试3\",len(MAP(value(\"test-测试4\",COLNAME(\"test-测试4\",len(MAP(value(\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4)))),COLCOUNT(\"test-测试的副本\")),\"test-测试的副本\",COLNAME(\"test-测试的副本\",2),COLNAME(\"test-测试的副本\",4))),ROWCOUNT(\"test-测试的副本\"),len(TABLEDATAFIELDS(\"test-测试的副本\")))"); } } \ No newline at end of file From e4a36956f7f8d6e804cf3a1b1b9b68d9bb363888 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 7 Nov 2024 10:26:17 +0800 Subject: [PATCH 12/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E6=B3=A8=E5=85=A5=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...actTableDataTreeToolBarActionProvider.java | 25 ------------- .../data/datapane/TableDataTreePane.java | 35 ++++++++++++------- .../TableDataTreeToolBarActionProvider.java | 25 ------------- 3 files changed, 23 insertions(+), 62 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java delete mode 100644 designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java b/designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java deleted file mode 100644 index 8d54b21d93..0000000000 --- a/designer-base/src/main/java/com/fr/design/data/datapane/AbstractTableDataTreeToolBarActionProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fr.design.data.datapane; - -import com.fr.stable.fun.mark.API; - -/** - * 数据集Tree工具栏面板注入接口 - * - * @author Destiny.Lin - * @since 11.0 - * Created on 2024/11/1 - */ -@API(level = TableDataTreeToolBarActionProvider.CURRENT_LEVEL) -public abstract class AbstractTableDataTreeToolBarActionProvider implements TableDataTreeToolBarActionProvider { - - - @Override - public int currentAPILevel() { - return CURRENT_LEVEL; - } - - @Override - public String mark4Provider() { - return getClass().getName(); - } -} diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 084eb1cc2d..c55524f247 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -47,7 +47,6 @@ import com.fr.design.mainframe.DesignerContext; import com.fr.design.menu.LineSeparator; import com.fr.design.menu.MenuDef; import com.fr.design.menu.SeparatorDef; -import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.esd.core.strategy.config.StrategyConfig; @@ -148,7 +147,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { private EsdOffAction esdOffAction; private SwitchAction switchAction; private PreviewTableDataAction previewTableDataAction; - private Set extraActions = new HashSet<>(); + private static Set extraActions = new HashSet<>(); private JPanel serverDatasetAuthTipJPanel = new JPanel(); private TableDataSearchRemindPane remindPane; @@ -257,26 +256,38 @@ public class TableDataTreePane extends BasicTableDataTreePane { esdAction = new EsdOnAction(); esdOffAction = new EsdOffAction(); switchAction = new SwitchAction(); - extraActions = new HashSet<>(); toolbarDef = new ToolBarDef(); toolbarDef.addShortCut(addMenuDef, SeparatorDef.DEFAULT, editAction, removeAction); - ShortCut[] extraShortCut = initExtraAction(); - for (ShortCut shortCut: extraShortCut) { - toolbarDef.addShortCut(shortCut); - } + initExtraAction(); toolbarDef.addShortCut(SeparatorDef.DEFAULT, previewTableDataAction, connectionTableAction, esdAction, esdOffAction, switchAction); } - private ShortCut[] initExtraAction() { - Set toolBarActionProviders = ExtraDesignClassManager.getInstance().getArray(TableDataTreeToolBarActionProvider.XML_TAG); - for (TableDataTreeToolBarActionProvider handler : toolBarActionProviders) { + private void initExtraAction() { + for (AbstractExtraAction action: extraActions) { try { - extraActions.add(handler.createAction()); + toolbarDef.addShortCut(action); } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage(), e); } } - return extraActions.toArray(new ShortCut[0]); + } + + /** + * 注册ExtraAction + * + * @param extraAction TableDataTree工具栏的扩展接口Action + */ + public static void registerExtraAction(AbstractExtraAction extraAction) { + extraActions.add(extraAction); + } + + /** + * 移除ExtraAction + * + * @param extraAction TableDataTree工具栏的扩展接口Action + */ + public static void removeExtraAction(AbstractExtraAction extraAction) { + extraActions.remove(extraAction); } /** diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java deleted file mode 100644 index 5746f9d136..0000000000 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreeToolBarActionProvider.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.fr.design.data.datapane; - -import com.fr.stable.fun.mark.Mutable; - - -/** - * 数据集Tree工具栏面板注入接口 - * - * @author Destiny.Lin - * @since 11.0 - * Created on 2024/11/1 - */ -public interface TableDataTreeToolBarActionProvider extends Mutable { - - String XML_TAG = "TableDataTreeToolBarActionProvider"; - - int CURRENT_LEVEL = 1; - - /** - * 创建Action对象,用于提供针对数据集的额外操作 - * - * @return 创建出来的Action对象 - */ - TableDataTreePane.AbstractExtraAction createAction(); -} From 62f74da6f1c31b65ea8cac9cccb8cd6b2bfad449 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 7 Nov 2024 10:46:05 +0800 Subject: [PATCH 13/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E6=8F=90?= =?UTF-8?q?=E5=87=BA=E9=A2=84=E8=A7=88=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/BasicTableDataTreePane.java | 113 ++++++++++-------- .../data/datapane/TableDataTreePane.java | 2 +- 2 files changed, 62 insertions(+), 53 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java index af9850172b..4fe69e08eb 100644 --- a/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/BasicTableDataTreePane.java @@ -442,64 +442,73 @@ public abstract class BasicTableDataTreePane extends DockingView implements Resp if (selectedNO != null) { data = selectedNO.getObject(); } - try { - if (((TableDataWrapper) Objects.requireNonNull(data)).getTableData() instanceof MultiResultTableData) { - ((MultiResultTableData) (((TableDataWrapper) data).getTableData())).resetDataModelList(); - if (data instanceof MultiResultTableDataWrapper) { - MultiResultTableDataWrapper oldSdw = ((MultiResultTableDataWrapper) data); - MultiResultTableDataWrapper newSdw = new MultiResultTableDataWrapper((MultiResultTableData) oldSdw.getTableData(), oldSdw.getMultiResultTableDataName(), oldSdw.getTableDataName()); - newSdw.previewData(MultiResultTableDataWrapper.PREVIEW_ONE); - } else { - MultiResultTableData tableData = (MultiResultTableData) ((TableDataWrapper) data).getTableData(); - MultiResultTableDataWrapper storeProcedureDataWrapper = new MultiResultTableDataWrapper(tableData, StringUtils.EMPTY, StringUtils.EMPTY); - storeProcedureDataWrapper.previewData(MultiResultTableDataWrapper.PREVIEW_ALL); - } - } else { - TableDataWrapper wrapper = ((TableDataWrapper) data); - if (TableDataAuthHelper.needCheckAuthWhenEdit(wrapper.getTableData())) { - // 先打开一个Loading面板 - TableDataLoadingPane loadingPane = new TableDataLoadingPane(); - BasicDialog loadingDialog = loadingPane.showLargeWindow(SwingUtilities.getWindowAncestor(BasicTableDataTreePane.this), null); - // 查询权限 - new SwingWorker() { - @Override - protected Boolean doInBackground() throws Exception { - // 获取无权限连接名称集合 - Collection noAuthConnections = TableDataAuthHelper.getNoAuthConnections(); - // 获取当前数据集对应的数据连接名称 - String connectionName = TableDataAuthHelper.getConnectionNameByDBTableData((DBTableData) wrapper.getTableData()); - return !noAuthConnections.contains(connectionName); - } + preview((TableDataWrapper) data, BasicTableDataTreePane.this); + } + } - @Override - protected void done() { - try { - Boolean hasAuth = get(); - if (hasAuth) { - // 有权限时,关闭Loading面板,打开编辑面板 - loadingDialog.setVisible(false); - wrapper.previewData(); - } else { - // 无权限时,给出无权限提示 - loadingPane.switchTo(TableDataLoadingPane.NO_AUTH_PANE_NAME); - } - } catch (Exception e) { - FineLoggerFactory.getLogger().error("loading connection error in remote design", e.getMessage()); - // 查询权限失败时,给出报错提示 - loadingPane.switchTo(TableDataLoadingPane.ERROR_NAME); + /** + * 预览数据集 + * + * @param data TableDataWrapper + * @param c 底层面板 + */ + public static void preview(TableDataWrapper data, Component c) { + try { + if (((TableDataWrapper) Objects.requireNonNull(data)).getTableData() instanceof MultiResultTableData) { + ((MultiResultTableData) (((TableDataWrapper) data).getTableData())).resetDataModelList(); + if (data instanceof MultiResultTableDataWrapper) { + MultiResultTableDataWrapper oldSdw = ((MultiResultTableDataWrapper) data); + MultiResultTableDataWrapper newSdw = new MultiResultTableDataWrapper((MultiResultTableData) oldSdw.getTableData(), oldSdw.getMultiResultTableDataName(), oldSdw.getTableDataName()); + newSdw.previewData(MultiResultTableDataWrapper.PREVIEW_ONE); + } else { + MultiResultTableData tableData = (MultiResultTableData) ((TableDataWrapper) data).getTableData(); + MultiResultTableDataWrapper storeProcedureDataWrapper = new MultiResultTableDataWrapper(tableData, StringUtils.EMPTY, StringUtils.EMPTY); + storeProcedureDataWrapper.previewData(MultiResultTableDataWrapper.PREVIEW_ALL); + } + } else { + TableDataWrapper wrapper = ((TableDataWrapper) data); + if (TableDataAuthHelper.needCheckAuthWhenEdit(wrapper.getTableData())) { + // 先打开一个Loading面板 + TableDataLoadingPane loadingPane = new TableDataLoadingPane(); + BasicDialog loadingDialog = loadingPane.showLargeWindow(SwingUtilities.getWindowAncestor(c), null); + // 查询权限 + new SwingWorker() { + @Override + protected Boolean doInBackground() throws Exception { + // 获取无权限连接名称集合 + Collection noAuthConnections = TableDataAuthHelper.getNoAuthConnections(); + // 获取当前数据集对应的数据连接名称 + String connectionName = TableDataAuthHelper.getConnectionNameByDBTableData((DBTableData) wrapper.getTableData()); + return !noAuthConnections.contains(connectionName); + } + + @Override + protected void done() { + try { + Boolean hasAuth = get(); + if (hasAuth) { + // 有权限时,关闭Loading面板,打开编辑面板 + loadingDialog.setVisible(false); + wrapper.previewData(); + } else { + // 无权限时,给出无权限提示 + loadingPane.switchTo(TableDataLoadingPane.NO_AUTH_PANE_NAME); } + } catch (Exception e) { + FineLoggerFactory.getLogger().error("loading connection error in remote design", e.getMessage()); + // 查询权限失败时,给出报错提示 + loadingPane.switchTo(TableDataLoadingPane.ERROR_NAME); } - }.execute(); - loadingDialog.setVisible(true); - } else { - wrapper.previewData(); - } + } + }.execute(); + loadingDialog.setVisible(true); + } else { + wrapper.previewData(); } - - } catch (Exception ex) { - FineLoggerFactory.getLogger().error(ex.getMessage(), ex); } + } catch (Exception ex) { + FineLoggerFactory.getLogger().error(ex.getMessage(), ex); } } diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index c55524f247..4bf7cb6fdb 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -100,6 +100,7 @@ import java.util.Set; import java.util.concurrent.ExecutionException; public class TableDataTreePane extends BasicTableDataTreePane { + private static Set extraActions = new HashSet<>(); private static final TableDataTreePane singleton = new TableDataTreePane(); public static final int PLUGIN_LISTENER_PRIORITY = 1; @@ -147,7 +148,6 @@ public class TableDataTreePane extends BasicTableDataTreePane { private EsdOffAction esdOffAction; private SwitchAction switchAction; private PreviewTableDataAction previewTableDataAction; - private static Set extraActions = new HashSet<>(); private JPanel serverDatasetAuthTipJPanel = new JPanel(); private TableDataSearchRemindPane remindPane; From 84b4e34cf19a99ed4d7f70a49c68588d9bbaaf59 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 7 Nov 2024 11:30:00 +0800 Subject: [PATCH 14/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E8=A1=A5?= =?UTF-8?q?=E5=85=85=E5=8F=B3=E9=94=AE=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataTreePane.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 4bf7cb6fdb..6626905c1f 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -179,14 +179,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { ToolTipManager.sharedInstance().setDismissDelay(3000); ToolTipManager.sharedInstance().setInitialDelay(0); // 右键菜单 - popupMenu = new UIPopupMenu(); - popupMenu.add(editAction.createMenuItem()); - popupMenu.add(previewTableDataAction.createMenuItem()); - popupMenu.addSeparator(); - popupMenu.add(copyAction.createMenuItem()); - popupMenu.add(pasteAction.createMenuItem()); - popupMenu.add(removeAction.createMenuItem()); - popupMenu.addSeparator(); + initPopupMenu(); // 监听 tableDataTree.addMouseListener(new MouseAdapter() { @Override @@ -224,6 +217,25 @@ public class TableDataTreePane extends BasicTableDataTreePane { new TableDataTreeDragSource(tableDataTree, DnDConstants.ACTION_COPY); } + private void initPopupMenu() { + popupMenu = new UIPopupMenu(); + popupMenu.add(editAction.createMenuItem()); + popupMenu.add(previewTableDataAction.createMenuItem()); + popupMenu.addSeparator(); + popupMenu.add(copyAction.createMenuItem()); + popupMenu.add(pasteAction.createMenuItem()); + popupMenu.add(removeAction.createMenuItem()); + popupMenu.addSeparator(); + for (AbstractExtraAction action : extraActions) { + try { + popupMenu.add(action.createMenuItem()); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + } + } + /** * 工具栏面板 * @@ -368,6 +380,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { createAddMenuDef(); createToolbarDef(); toolbarDef.updateToolBar(toolbarPane.getToolbar()); + initPopupMenu(); checkEnable(); } }, new PluginFilter() { From 518f5a78b1b8b7ab5f851cc3eec5aaf1b36d2a08 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 7 Nov 2024 16:29:36 +0800 Subject: [PATCH 15/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=8A=BD=E8=B1=A1=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../replace/ui/ITReplaceMainDialog.java | 3 +- .../actions/replace/utils/ReplaceUtils.java | 39 ++++++++++++++++++- 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java index 35d82e47b8..a9ee070155 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java @@ -130,8 +130,7 @@ public class ITReplaceMainDialog extends UIDialog { northPane.fitScreen(0, 0, width); - //ReplaceUtils.replaceCpt(jTemplate, new TableReplacementEntity().setOldName("test-测试").setNewName("test-测试的副本").setFields(new HashMap<>())); - } + } /** diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 15c5896c6a..4275a7c6f4 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -1,7 +1,11 @@ package com.fr.design.actions.replace.utils; import com.fr.base.Formula; +import com.fr.base.chart.chartdata.TopDefinitionProvider; +import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; +import com.fr.chart.chartdata.TableDataDefinition; +import com.fr.chartx.attr.ChartProvider; import com.fr.data.TableReplacementEntity; import com.fr.design.actions.replace.action.content.cell.SearchCellAction; import com.fr.design.actions.replace.action.content.formula.SearchFormulaManager; @@ -16,11 +20,15 @@ import com.fr.design.actions.replace.info.FormulaInfo; import com.fr.design.actions.replace.info.WidgetInfo; import com.fr.design.actions.replace.info.base.ITContent; import com.fr.design.mainframe.JTemplate; +import com.fr.extended.chart.ChartTableDataDefinitionReplacer; import com.fr.form.FormElementCaseProvider; import com.fr.form.ui.ElementCaseEditor; import com.fr.main.impl.WorkBook; import com.fr.report.elementcase.ElementCase; +import com.fr.report.report.Report; import com.fr.report.utils.ElementCaseHelper; +import com.fr.stable.StringUtils; + import java.util.ArrayList; import java.util.HashSet; @@ -206,7 +214,7 @@ public class ReplaceUtils { WorkBook workBook = (WorkBook) template.getTarget(); // 非公式部分替换 - workBook.replaceTableData(entity); + replaceWorkBook(workBook, entity); // 公式部分 SearchFormulaManager.getInstance().search4Infos(template); List formulaInfos = SearchFormulaManager.getInstance().getFormulaInfos(); @@ -214,6 +222,35 @@ public class ReplaceUtils { } } + private static void replaceWorkBook(WorkBook workBook, List entity) { + if (acceptTableReplacement(entity)) { + for (int i = 0; i < workBook.getReportCount(); i++) { + Report report = workBook.getReport(i); + if (report != null) { + Iterator it = report.iteratorOfElementCase(); + while (it.hasNext()) { + ElementCase elementCase = (ElementCase) it.next(); + ElementCaseHelper.replaceTableDataWithOutFormula(elementCase, entity); + } + } + } + } + } + + private static boolean acceptTableReplacement(List entities) { + for (TableReplacementEntity entity : entities) { + if (entity == null) { + return false; + } + String newName = entity.getNewName(); + String oldName = entity.getOldName(); + if (StringUtils.isEmpty(newName) || StringUtils.isEmpty(oldName)) { + return false; + } + } + return true; + } + private static void replaceFormulaInfos(List formulaInfos, List entity) { for (FormulaInfo formulaInfo : formulaInfos) { if (TableDataFormulaType.needReplace(formulaInfo.getPureValue())) { From 0bc51bebb2240b7b3ff3fcd21a7343ded426bf34 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 7 Nov 2024 17:53:22 +0800 Subject: [PATCH 16/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/actions/replace/ui/ITReplaceMainDialog.java | 4 ---- .../fr/design/actions/replace/utils/ReplaceUtils.java | 10 ++-------- 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java index a9ee070155..07f25920ea 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java @@ -1,14 +1,12 @@ package com.fr.design.actions.replace.ui; -import com.fr.data.TableReplacementEntity; import com.fr.design.actions.replace.action.ITChecker; import com.fr.design.actions.replace.action.ShowSearchResultAction; import com.fr.design.actions.replace.action.setting.SettingController; import com.fr.design.actions.replace.info.Info; -import com.fr.design.actions.replace.utils.ReplaceUtils; import com.fr.design.actions.replace.utils.ShowValueUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.UIDialog; @@ -37,11 +35,9 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.regex.Pattern; -import static com.fr.design.actions.replace.ui.ITTableEditorPane.editTable; import static com.fr.design.actions.replace.ui.ITTableEditorPane.getEditTable; /** diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 4275a7c6f4..70ef0998f5 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -1,26 +1,21 @@ package com.fr.design.actions.replace.utils; import com.fr.base.Formula; -import com.fr.base.chart.chartdata.TopDefinitionProvider; -import com.fr.chart.chartattr.Chart; import com.fr.chart.chartattr.ChartCollection; -import com.fr.chart.chartdata.TableDataDefinition; -import com.fr.chartx.attr.ChartProvider; import com.fr.data.TableReplacementEntity; import com.fr.design.actions.replace.action.content.cell.SearchCellAction; import com.fr.design.actions.replace.action.content.formula.SearchFormulaManager; import com.fr.design.actions.replace.action.content.formula.cell.SearchCellFormulaAction; import com.fr.design.actions.replace.action.content.formula.chart.SearchChartCollectionFormulaAction; import com.fr.design.actions.replace.action.content.formula.widget.SearchWidgetFormulaAction; -import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaUtils; import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaType; +import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaUtils; import com.fr.design.actions.replace.action.content.widget.SearchWidgetAction; import com.fr.design.actions.replace.info.CellInfo; import com.fr.design.actions.replace.info.FormulaInfo; import com.fr.design.actions.replace.info.WidgetInfo; import com.fr.design.actions.replace.info.base.ITContent; import com.fr.design.mainframe.JTemplate; -import com.fr.extended.chart.ChartTableDataDefinitionReplacer; import com.fr.form.FormElementCaseProvider; import com.fr.form.ui.ElementCaseEditor; import com.fr.main.impl.WorkBook; @@ -30,7 +25,6 @@ import com.fr.report.utils.ElementCaseHelper; import com.fr.stable.StringUtils; import java.util.ArrayList; - import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -181,7 +175,7 @@ public class ReplaceUtils { */ public static void replaceChart(ChartCollection chartCollection, List entities) { // 非公式部分 - chartCollection.replaceTableData(entities); + chartCollection.replace(entities); // 公式部分 List formulaInfos = new ArrayList<>(); SearchChartCollectionFormulaAction.getInstance().searchChartCollectionFormula(formulaInfos, new ITContent(), chartCollection); From e6c2d302af288d5d8f681f3cdc72167f7ec33384 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Sun, 10 Nov 2024 19:14:21 +0800 Subject: [PATCH 17/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E9=80=82?= =?UTF-8?q?=E9=85=8DFVS=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/ui/ITReplaceMainDialog.java | 13 ++----------- .../design/actions/replace/utils/ReplaceUtils.java | 2 +- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java index 07f25920ea..41674024a1 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java @@ -3,10 +3,8 @@ package com.fr.design.actions.replace.ui; import com.fr.design.actions.replace.action.ITChecker; import com.fr.design.actions.replace.action.ShowSearchResultAction; - import com.fr.design.actions.replace.action.setting.SettingController; import com.fr.design.actions.replace.info.Info; - import com.fr.design.actions.replace.utils.ShowValueUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.UIDialog; @@ -16,25 +14,18 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; - import com.fr.design.mainframe.toast.DesignerToastMsgUtil; import com.fr.design.mainframe.toast.ToastMsgDialog; import com.fr.general.GeneralUtils; - import com.fr.stable.StringUtils; - -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.Point; +import javax.swing.*; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; - import java.util.List; import java.util.regex.Pattern; diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 70ef0998f5..89b90a2d15 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -175,7 +175,7 @@ public class ReplaceUtils { */ public static void replaceChart(ChartCollection chartCollection, List entities) { // 非公式部分 - chartCollection.replace(entities); + chartCollection.replaceTableData(entities); // 公式部分 List formulaInfos = new ArrayList<>(); SearchChartCollectionFormulaAction.getInstance().searchChartCollectionFormula(formulaInfos, new ITContent(), chartCollection); From 6f29a0c33f1b9700083f7fe60291bde622e3a6d7 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Sun, 10 Nov 2024 19:22:08 +0800 Subject: [PATCH 18/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=8C=89=E9=92=AE=E7=A6=81=E7=94=A8=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=8E=BB=E9=99=A4=E5=A4=9A=E4=BD=99=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/datapane/TableDataTreePane.java | 8 +++++++- .../actions/replace/ui/ITReplaceMainDialog.java | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 6626905c1f..543886bfa9 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -729,10 +729,16 @@ public class TableDataTreePane extends BasicTableDataTreePane { pasteAction.setEnabled(false); removeAction.setEnabled(false); previewTableDataAction.setEnabled(false); + for (AbstractExtraAction action : extraActions) { + action.setEnabled(false); + } if (op == null || op.interceptButtonEnabled()) { // 保持false状态 return; } + if(getDataTree() != null) { + checkExtraActionEnable(op.getDataMode(), getDataTree().getSelectedTableDataCounts(), getDataTree().hasSelectedIndependentColumns()); + } // 获取选中的数据集数量 int selectioncount = getDataTree().getSelectedTableDataCounts(); if (op.getDataMode() == SERVER_TABLE_DATA) { @@ -756,7 +762,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { } removeAction.setEnabled(true); copyAction.setEnabled(true); - checkExtraActionEnable(op.getDataMode(), selectioncount, getDataTree().hasSelectedIndependentColumns()); + } private void checkExtraActionEnable(int dataMode, int selectioncount, boolean hasSelectedIndependentColumns) { diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java index 41674024a1..41d24534af 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/ui/ITReplaceMainDialog.java @@ -3,8 +3,10 @@ package com.fr.design.actions.replace.ui; import com.fr.design.actions.replace.action.ITChecker; import com.fr.design.actions.replace.action.ShowSearchResultAction; + import com.fr.design.actions.replace.action.setting.SettingController; import com.fr.design.actions.replace.info.Info; + import com.fr.design.actions.replace.utils.ShowValueUtils; import com.fr.design.dialog.FineJOptionPane; import com.fr.design.dialog.UIDialog; @@ -14,18 +16,25 @@ import com.fr.design.gui.itextfield.UITextField; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.JTemplate; + import com.fr.design.mainframe.toast.DesignerToastMsgUtil; import com.fr.design.mainframe.toast.ToastMsgDialog; import com.fr.general.GeneralUtils; + import com.fr.stable.StringUtils; -import javax.swing.*; -import java.awt.*; + +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; + import java.util.List; import java.util.regex.Pattern; @@ -117,7 +126,7 @@ public class ITReplaceMainDialog extends UIDialog { northPane.fitScreen(0, 0, width); - } + } /** @@ -557,7 +566,7 @@ public class ITReplaceMainDialog extends UIDialog { } } } - + private boolean isSupportReplace(Info info) { return info.getContent().isSelected() && !info.getContent().isReplaced(); } From 5c910a40d97b3564a228a6100ee7b534eac77dc6 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 11 Nov 2024 15:19:30 +0800 Subject: [PATCH 19/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E6=89=A9?= =?UTF-8?q?=E5=B1=95select=E3=80=81group=E3=80=81value=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tabledata/TableDataFormulaType.java | 14 +++- .../tabledata/TableDataFormulaUtils.java | 66 +++++++++++++++++-- .../actions/replace/utils/ReplaceUtils.java | 2 + 3 files changed, 73 insertions(+), 9 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java index 9f78a1e403..283d4df8a2 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java @@ -31,9 +31,17 @@ public enum TableDataFormulaType { */ TABLEDATAFIELDS("TABLEDATAFIELDS", 0), /** - * VALUE公式 + * VALUE公式或者是ds1.value(xxx)两种情况 */ - VALUE("VALUE", 0); + VALUE("VALUE", 0), + /** + * ds1.select(xxx) + */ + SELECT("SELECT", 0), + /** + * ds1.group(xxx) + */ + GROUP("GROUP", 0); private int argumentIndex; private String name; @@ -52,7 +60,7 @@ public enum TableDataFormulaType { */ public static boolean needReplace(String value) { for (TableDataFormulaType type : TableDataFormulaType.values()) { - if (value.contains(type.name())) { + if (value.toUpperCase().contains(type.name().toUpperCase())) { return true; } } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java index f788bc0c73..335c9f7470 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java @@ -4,6 +4,7 @@ import com.fr.data.TableReplacementEntity; import com.fr.invoke.Reflect; import com.fr.log.FineLoggerFactory; import com.fr.parser.BinaryExpression; +import com.fr.parser.DatasetFunctionCall; import com.fr.parser.FunctionCall; import com.fr.parser.StringLiteral; import com.fr.script.Calculator; @@ -30,6 +31,7 @@ public class TableDataFormulaUtils { private static final String RIGHT_BRACKET = "}"; private static final String FORMULA_MARK = "="; private static final String STATEMENT = "statement"; + private static final String SOURCE_NAME = "sourceName"; /** * 从公式中寻找数据集名称 @@ -82,17 +84,69 @@ public class TableDataFormulaUtils { for (Node subNode : nodes) { if (subNode instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) subNode; - TableDataFormulaUtils.replaceArgument(functionCall, entities); + TableDataFormulaUtils.replaceArgument4FunctionCall(functionCall, entities); } } } } else if (node instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) node; - TableDataFormulaUtils.replaceArgument(functionCall, entities); + TableDataFormulaUtils.replaceArgument4FunctionCall(functionCall, entities); + } else if (node instanceof DatasetFunctionCall) { + DatasetFunctionCall datasetFunctionCall = (DatasetFunctionCall) node; + TableDataFormulaUtils.replaceArgument4DatasetFunctionCall(datasetFunctionCall, entities); } } } + private static void replaceArgument4DatasetFunctionCall(DatasetFunctionCall datasetFunctionCall, List entities) { + Node[] subNodes = datasetFunctionCall.getArguments(); + if (subNodes != null) { + // 数据集名称 + StringBuilder parent = new StringBuilder(datasetFunctionCall.getSourceName()); + for (Node subNode : subNodes) { + // 嵌套普通公式 + if (subNode instanceof FunctionCall) { + replaceArgument4FunctionCall((FunctionCall) subNode, entities); + } else if (subNode instanceof StringLiteral) { + // 无嵌套,可以根据传进来的datasetFunctionCall进行替换 + StringLiteral stringLiteral = (StringLiteral) subNode; + replaceDatasetFunctionCall0(stringLiteral, datasetFunctionCall, entities, parent); + } else if (subNode instanceof DatasetFunctionCall) { + // 嵌套datasetFunctionCall,递归回来该方法继续往下 + DatasetFunctionCall datasetFunctionCall1 = (DatasetFunctionCall) subNode; + replaceArgument4DatasetFunctionCall(datasetFunctionCall1, entities); + } + } + for (TableReplacementEntity entity : entities) { + if (StringUtils.equals(parent.toString(), entity.getOldName())) { + // 子节点都替换完了才换最前面的数据集名称 + Reflect.on(datasetFunctionCall).set(SOURCE_NAME, entity.getNewName()); + break; + } + } + } + } + + private static void replaceDatasetFunctionCall0(StringLiteral stringLiteral, DatasetFunctionCall datasetFunctionCall, List entities, StringBuilder parent) { + try { + TableDataFormulaType type = TableDataFormulaType.get(datasetFunctionCall.getFnName()); + if (type != null) { + String name = stringLiteral.eval(Calculator.createCalculator()).toString(); + for (TableReplacementEntity entity : entities) { + if (StringUtils.equals(parent.toString(), entity.getOldName())) { + // 如果是要替换的数据集 + String field = entity.getTargetField(name); + // 替换成匹配后的字段 + Reflect.on(stringLiteral).set(STATEMENT, field); + break; + } + } + } + } catch (Exception e) { + FineLoggerFactory.getLogger().debug(e, e.getMessage()); + } + } + /** * 从公式(可能存在嵌套)中解析出某类型函数的第几个参数 @@ -131,25 +185,25 @@ public class TableDataFormulaUtils { return result; } - private static void replaceArgument(FunctionCall functionCall, List entities) { + private static void replaceArgument4FunctionCall(FunctionCall functionCall, List entities) { Node[] subNodes = functionCall.getArguments(); if (subNodes != null) { StringBuilder parent = new StringBuilder(StringUtils.EMPTY); for (int i = 0; i < subNodes.length; i++) { Node subNode = subNodes[i]; if (subNode instanceof FunctionCall) { - replaceArgument((FunctionCall) subNode, entities); + replaceArgument4FunctionCall((FunctionCall) subNode, entities); } if (subNode instanceof StringLiteral) { StringLiteral stringLiteral = (StringLiteral) subNode; - replaceArgument0(i, stringLiteral, functionCall, entities, parent); + replaceFunctionCall0(i, stringLiteral, functionCall, entities, parent); } } } } - private static void replaceArgument0(int i, StringLiteral stringLiteral, FunctionCall functionCall, List entities, StringBuilder parent) { + private static void replaceFunctionCall0(int i, StringLiteral stringLiteral, FunctionCall functionCall, List entities, StringBuilder parent) { try { TableDataFormulaType type = TableDataFormulaType.get(functionCall.getName()); if (type != null) { diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 89b90a2d15..4571dc1ad1 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -213,6 +213,8 @@ public class ReplaceUtils { SearchFormulaManager.getInstance().search4Infos(template); List formulaInfos = SearchFormulaManager.getInstance().getFormulaInfos(); replaceFormulaInfos(formulaInfos, entity); + // 触发响应 + template.fireTargetModified(); } } From 3a1c9df873b53a48f3a6b23ebfbc43ad79b62ce8 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 11 Nov 2024 15:22:40 +0800 Subject: [PATCH 20/50] =?UTF-8?q?REPORT-138249=20cpt=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=20=E6=89=A9?= =?UTF-8?q?=E5=B1=95select=E3=80=81group=E3=80=81value=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/content/tabledata/TableDataFormulaUtils.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java index 335c9f7470..d51dc60064 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java @@ -85,6 +85,9 @@ public class TableDataFormulaUtils { if (subNode instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) subNode; TableDataFormulaUtils.replaceArgument4FunctionCall(functionCall, entities); + } else if (subNode instanceof DatasetFunctionCall) { + DatasetFunctionCall datasetFunctionCall = (DatasetFunctionCall) subNode; + TableDataFormulaUtils.replaceArgument4DatasetFunctionCall(datasetFunctionCall, entities); } } } From e62ebf1c4cce6eb9b09cd3da51928e4a19efdb40 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 11 Nov 2024 18:08:54 +0800 Subject: [PATCH 21/50] =?UTF-8?q?REPORT-140237=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E6=9B=BF=E6=8D=A2=E5=90=8E=EF=BC=8C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=97=E7=9A=84=E5=88=97=E7=9A=84=E6=9B=BF=E6=8D=A2=E6=B2=A1?= =?UTF-8?q?=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../replace/action/content/tabledata/TableDataFormulaUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java index d51dc60064..85c5b54980 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java @@ -224,7 +224,7 @@ public class TableDataFormulaUtils { String field = entity.getTargetField(name); // 如果是需要匹配的字段 // 要走到字段匹配,就必须先经过数据集名匹配,目前所有公式都是数据集在前,字段在后 - if (StringUtils.isNotEmpty(field) && StringUtils.equals(parent.toString(), name)) { + if (StringUtils.isNotEmpty(field) && StringUtils.isNotEmpty(parent.toString())) { // 替换成匹配后的字段 Reflect.on(stringLiteral).set(STATEMENT, field); break; From 5a4f3b837aaa2f8ac82f4096246d6f38cb7df9ce Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 11 Nov 2024 18:19:37 +0800 Subject: [PATCH 22/50] =?UTF-8?q?REPORT-140231=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E6=8E=A7=E4=BB=B6-=E4=BA=8B=E4=BB=B6-?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0-?= =?UTF-8?q?=E5=9B=9E=E8=B0=83=E5=87=BD=E6=95=B0-=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E7=9A=84=E5=8F=82=E6=95=B0=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E6=9C=AA=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/content/tabledata/TableDataFormulaType.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java index 283d4df8a2..af1ba2a661 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaType.java @@ -41,7 +41,11 @@ public enum TableDataFormulaType { /** * ds1.group(xxx) */ - GROUP("GROUP", 0); + GROUP("GROUP", 0), + /** + * ds1.find(xxx) + */ + FIND("FIND", 0); private int argumentIndex; private String name; From 75121cc86dd92a0179ae30e0f065d6034b0e7024 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 12 Nov 2024 15:19:19 +0800 Subject: [PATCH 23/50] =?UTF-8?q?REPORT-140338=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E5=A1=AB=E6=8A=A5=E5=B1=9E=E6=80=A7-=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C-=E4=B8=8D=E6=BB=A1=E8=B6=B3=E5=85=AC?= =?UTF-8?q?=E5=BC=8F=E6=8F=90=E7=A4=BA=E4=B8=AD=EF=BC=8C=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../formula/template/SearchTemplateFormulaAction.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java index 0dab4a7e4b..dea8f4255f 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java @@ -2,7 +2,6 @@ package com.fr.design.actions.replace.action.content.formula.template; import com.fr.base.Formula; import com.fr.base.Parameter; -import com.fr.base.ParameterConfig; import com.fr.base.io.AttrMark; import com.fr.base.iofile.attr.WatermarkAttr; import com.fr.data.Verifier; @@ -11,12 +10,8 @@ import com.fr.design.actions.replace.action.content.formula.highlight.javascript import com.fr.design.actions.replace.info.FormulaInfo; import com.fr.design.actions.replace.info.base.ITContent; import com.fr.design.actions.replace.info.base.SearchTag; -import com.fr.design.file.HistoryTemplateListCache; -import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; -import com.fr.design.mainframe.ReportComponentComposite; -import com.fr.design.mainframe.SheetNameTabPane; import com.fr.main.impl.WorkBook; import com.fr.report.core.ReportUtils; import com.fr.report.report.Report; @@ -27,7 +22,6 @@ import com.fr.report.write.SubmitVisitor; import com.fr.report.write.ValueVerifier; import com.fr.stable.CommonUtils; - import java.util.List; /** @@ -133,6 +127,7 @@ public class SearchTemplateFormulaAction implements SearchTemplateFormula { ITContent messageContent = ITContent.copy(verifyContent); messageContent.setReplaceObject(item.getMessage()); messageContent.setHoldObject(item); + messageContent.setTag(SearchTag.WRITE_ATTR_MESSAGE); formulaInfos.add(new FormulaInfo(messageContent)); } } From 946dd37475e47dd3b7ad72f16ad120b08a45d6ec Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 12 Nov 2024 15:31:46 +0800 Subject: [PATCH 24/50] =?UTF-8?q?REPORT-140337=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E6=8A=A5=E8=A1=A8?= =?UTF-8?q?=E5=A1=AB=E6=8A=A5=E5=B1=9E=E6=80=A7-=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=8F=90=E4=BA=A4=E7=9A=84=E5=B1=9E=E6=80=A7=E4=B8=AD?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/SearchTemplateFormulaAction.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java index dea8f4255f..e7603de567 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java @@ -4,6 +4,7 @@ import com.fr.base.Formula; import com.fr.base.Parameter; import com.fr.base.io.AttrMark; import com.fr.base.iofile.attr.WatermarkAttr; +import com.fr.data.ClassSubmitJob; import com.fr.data.Verifier; import com.fr.data.VerifyItem; import com.fr.design.actions.replace.action.content.formula.highlight.javascript.SearchCommit2DBJSFormulaAction; @@ -20,7 +21,9 @@ import com.fr.report.write.BuiltInSQLSubmiter; import com.fr.report.write.ReportWriteAttr; import com.fr.report.write.SubmitVisitor; import com.fr.report.write.ValueVerifier; +import com.fr.report.write.WClassSubmiter; import com.fr.stable.CommonUtils; +import com.fr.stable.ListMap; import java.util.List; @@ -139,6 +142,25 @@ public class SearchTemplateFormulaAction implements SearchTemplateFormula { ITContent content = ITContent.copy(submitContent); content.addOtherPos(submiter.getName()); SearchCommit2DBJSFormulaAction.getInstance().dealWithDBManipulation(formulaInfos, content, submiter.getDBManipulation()); + } else if (visitor instanceof WClassSubmiter) { + WClassSubmiter submiter = (WClassSubmiter) visitor; + ITContent content = ITContent.copy(submitContent); + content.addOtherPos(submiter.getName()); + if (submiter.getSubmitJob() instanceof ClassSubmitJob) { + ClassSubmitJob job = (ClassSubmitJob) submiter.getSubmitJob(); + dealClassSubmitJob(formulaInfos, job, content); + } + } + } + + private void dealClassSubmitJob(List formulaInfos, ClassSubmitJob job, ITContent content) { + ListMap map = job.getPropertyMap(); + for (Object value : map.values()) { + if (value instanceof Formula) { + ITContent formulaContent = ITContent.copy(content); + formulaContent.setReplaceObject(value); + formulaInfos.add(new FormulaInfo(formulaContent)); + } } } From 1bf8891fa89b295f6c708ea38577146a37152ad7 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 13 Nov 2024 15:30:02 +0800 Subject: [PATCH 25/50] =?UTF-8?q?REPORT-140290=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=8D=B8=E8=BD=BD?= =?UTF-8?q?=E5=86=8D=E5=AE=89=E8=A3=85FVS=E6=8F=92=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E7=9C=8B=E6=9D=BF=E5=92=8C=E6=96=B0=E5=BB=BA?= =?UTF-8?q?=E7=9C=8B=E6=9D=BF=EF=BC=8C=E6=9B=BF=E6=8D=A2=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E6=8C=89=E9=92=AE=E7=81=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/datapane/TableDataTreePane.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 543886bfa9..6a02671d3e 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -92,15 +92,13 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.ExecutionException; public class TableDataTreePane extends BasicTableDataTreePane { - private static Set extraActions = new HashSet<>(); + private static Map extraActions = new HashMap<>(); private static final TableDataTreePane singleton = new TableDataTreePane(); public static final int PLUGIN_LISTENER_PRIORITY = 1; @@ -226,7 +224,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { popupMenu.add(pasteAction.createMenuItem()); popupMenu.add(removeAction.createMenuItem()); popupMenu.addSeparator(); - for (AbstractExtraAction action : extraActions) { + for (AbstractExtraAction action : extraActions.values()) { try { popupMenu.add(action.createMenuItem()); } catch (Exception e) { @@ -275,7 +273,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { } private void initExtraAction() { - for (AbstractExtraAction action: extraActions) { + for (AbstractExtraAction action: extraActions.values()) { try { toolbarDef.addShortCut(action); } catch (Exception e) { @@ -287,19 +285,20 @@ public class TableDataTreePane extends BasicTableDataTreePane { /** * 注册ExtraAction * + * @param key 标识符 * @param extraAction TableDataTree工具栏的扩展接口Action */ - public static void registerExtraAction(AbstractExtraAction extraAction) { - extraActions.add(extraAction); + public static void registerExtraAction(String key, AbstractExtraAction extraAction) { + extraActions.put(key, extraAction); } /** * 移除ExtraAction * - * @param extraAction TableDataTree工具栏的扩展接口Action + * @param key 标识符 */ - public static void removeExtraAction(AbstractExtraAction extraAction) { - extraActions.remove(extraAction); + public static void removeExtraAction(String key) { + extraActions.remove(key); } /** @@ -729,7 +728,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { pasteAction.setEnabled(false); removeAction.setEnabled(false); previewTableDataAction.setEnabled(false); - for (AbstractExtraAction action : extraActions) { + for (AbstractExtraAction action : extraActions.values()) { action.setEnabled(false); } if (op == null || op.interceptButtonEnabled()) { @@ -766,7 +765,7 @@ public class TableDataTreePane extends BasicTableDataTreePane { } private void checkExtraActionEnable(int dataMode, int selectioncount, boolean hasSelectedIndependentColumns) { - for (AbstractExtraAction action : extraActions) { + for (AbstractExtraAction action : extraActions.values()) { action.setEnabled(action.checkEnable(dataMode, selectioncount, hasSelectedIndependentColumns)); } } From 425c6b72a9e8a3874faa7248e3a2265e31852298 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 13 Nov 2024 15:33:58 +0800 Subject: [PATCH 26/50] =?UTF-8?q?REPORT-140290=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=8D=B8=E8=BD=BD?= =?UTF-8?q?=E5=86=8D=E5=AE=89=E8=A3=85FVS=E6=8F=92=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E7=9C=8B=E6=9D=BF=E5=92=8C=E6=96=B0=E5=BB=BA?= =?UTF-8?q?=E7=9C=8B=E6=9D=BF=EF=BC=8C=E6=9B=BF=E6=8D=A2=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E6=8C=89=E9=92=AE=E7=81=B0=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/data/datapane/TableDataTreePane.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java index 6a02671d3e..06e9a969d1 100644 --- a/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java +++ b/designer-base/src/main/java/com/fr/design/data/datapane/TableDataTreePane.java @@ -285,20 +285,19 @@ public class TableDataTreePane extends BasicTableDataTreePane { /** * 注册ExtraAction * - * @param key 标识符 * @param extraAction TableDataTree工具栏的扩展接口Action */ - public static void registerExtraAction(String key, AbstractExtraAction extraAction) { - extraActions.put(key, extraAction); + public static void registerExtraAction(AbstractExtraAction extraAction) { + extraActions.put(extraAction.getClass().getSimpleName(), extraAction); } /** * 移除ExtraAction * - * @param key 标识符 + * @param extraAction TableDataTree工具栏的扩展接口Action */ - public static void removeExtraAction(String key) { - extraActions.remove(key); + public static void removeExtraAction(AbstractExtraAction extraAction) { + extraActions.remove(extraAction.getClass().getSimpleName()); } /** From ad5d78ff92d1d220728713a62a77249caed23f7c Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 14 Nov 2024 10:19:27 +0800 Subject: [PATCH 27/50] =?UTF-8?q?REPORT-140361=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=9B=BE=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E7=89=B9=E6=95=88-=E5=9B=BE=E8=A1=A8=E8=B6=85?= =?UTF-8?q?=E9=93=BE=E6=82=AC=E6=B5=AE=E5=9B=BE=E8=A1=A8=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE-=E6=95=B0=E6=8D=AE=E9=9B=86=EF=BC=8C=E6=B2=A1?= =?UTF-8?q?=E6=9C=89=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/content/js/SearchCellJSAction.java | 13 + .../content/js/SearchChartJSAction.java | 2 - .../content/js/SearchFloatJSAction.java | 12 + .../replace/action/content/js/SearchJS.java | 12 + .../action/content/js/SearchJSManager.java | 16 ++ .../actions/replace/utils/ReplaceUtils.java | 239 +++++++++++++++++- .../actions/replace/utils/SearchJSUtils.java | 57 ++++- 7 files changed, 345 insertions(+), 6 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchCellJSAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchCellJSAction.java index cff74e9e0a..997000d06b 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchCellJSAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchCellJSAction.java @@ -9,6 +9,7 @@ import com.fr.design.actions.replace.info.base.ITContent; import com.fr.design.actions.replace.utils.SearchJSUtils; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.JTemplate; +import com.fr.js.JavaScript; import com.fr.js.JavaScriptImpl; import com.fr.js.NameJavaScriptGroup; @@ -42,6 +43,18 @@ public class SearchCellJSAction implements SearchJS { jsInfos.addAll(CellJSInfos); } + @Override + public List getTemplateJSDependenceTables(JTemplate jTemplate) { + List scripts = new ArrayList<>(); + SearchCellAction searchCellAction = SearchCellAction.getInstance(); + searchCellAction.search4Infos(jTemplate); + for (CellInfo cellInfo : searchCellAction.getCellInfos()) { + CellElement cell = (CellElement) cellInfo.getContent().getReplaceObject(); + scripts.addAll(SearchJSUtils.getJSDependenceTables(cell)); + } + return scripts; + } + private void addJSInfos2ListFromCell(JTemplate jTemplate, List jsInfos) { SearchCellAction searchCellAction = SearchCellAction.getInstance(); searchCellAction.search4Infos(jTemplate); diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchChartJSAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchChartJSAction.java index 1d04ac2ccf..ca550066ac 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchChartJSAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchChartJSAction.java @@ -9,7 +9,6 @@ import com.fr.design.actions.replace.utils.SearchJSUtils; import com.fr.design.i18n.Toolkit; import com.fr.js.JavaScriptImpl; import com.fr.js.NameJavaScript; - import com.fr.js.NameJavaScriptGroup; import com.fr.plugin.chart.attr.axis.VanChartAxis; import com.fr.plugin.chart.attr.plot.VanChartPlot; @@ -21,7 +20,6 @@ import com.fr.plugin.chart.custom.VanChartCustomPlot; import com.fr.plugin.chart.vanchart.VanChart; import com.fr.stable.collections.combination.Pair; -import java.util.ArrayList; import java.util.List; /** diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchFloatJSAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchFloatJSAction.java index 4270d5bbca..96f589d791 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchFloatJSAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchFloatJSAction.java @@ -11,6 +11,7 @@ import com.fr.design.actions.replace.utils.SearchJSUtils; import com.fr.design.mainframe.JTemplate; +import com.fr.js.JavaScript; import com.fr.report.cell.FloatElement; @@ -37,6 +38,17 @@ public class SearchFloatJSAction implements SearchJS { jsInfos.addAll(floatJSInfos); } + @Override + public List getTemplateJSDependenceTables(JTemplate jTemplate) { + List scripts = new ArrayList<>(); + SearchFloatAction searchFloatAction = SearchFloatAction.getInstance(); + searchFloatAction.search4Infos(jTemplate); + for (FloatInfo floatInfo : searchFloatAction.getFloatInfos()) { + FloatElement floatElement = (FloatElement) floatInfo.getContent().getReplaceObject(); + scripts.addAll(SearchJSUtils.getJSDependenceTables(floatElement)); + } + return scripts; + } private void addJSInfos2ListFromFloat(JTemplate jTemplate, List jsInfos) { SearchFloatAction searchFloatAction = SearchFloatAction.getInstance(); diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJS.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJS.java index d543a4c2ea..64d65abfc9 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJS.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJS.java @@ -3,7 +3,9 @@ package com.fr.design.actions.replace.action.content.js; import com.fr.design.actions.replace.action.SearchAction; import com.fr.design.actions.replace.info.JSInfo; import com.fr.design.mainframe.JTemplate; +import com.fr.js.JavaScript; +import java.util.ArrayList; import java.util.List; /** @@ -23,4 +25,14 @@ public interface SearchJS extends SearchAction { */ default void searchJSFromObject(JTemplate jTemplate, List jsInfos) { } + + /** + * 获取模板中的涉及数据集的所有超链 + * + * @param jTemplate 模板 + * @return 超链集合 + */ + default List getTemplateJSDependenceTables(JTemplate jTemplate) { + return new ArrayList<>(); + } } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJSManager.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJSManager.java index 9bd972a1f1..f2a1cc38af 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJSManager.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/js/SearchJSManager.java @@ -5,6 +5,7 @@ import com.fr.design.actions.replace.action.SearchManager; import com.fr.design.actions.replace.info.JSInfo; import com.fr.design.mainframe.JTemplate; +import com.fr.js.JavaScript; import java.util.ArrayList; import java.util.HashSet; @@ -45,6 +46,21 @@ public class SearchJSManager implements SearchAction, SearchManager { setJsInfos(jsInfos); } + + /** + * 查找超链 + * + * @param jTemplate 模板 + * @return 超链集合 + */ + public List getTemplateJSDependenceTables(JTemplate jTemplate) { + List javaScripts = new ArrayList<>(); + for (SearchJS searchJS : searchJSSet) { + javaScripts.addAll(searchJS.getTemplateJSDependenceTables(jTemplate)); + } + return javaScripts; + } + public List getJsInfos() { return jsInfos; } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 4571dc1ad1..56a38c4f6d 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -2,12 +2,21 @@ package com.fr.design.actions.replace.utils; import com.fr.base.Formula; import com.fr.chart.chartattr.ChartCollection; +import com.fr.chart.web.ChartHyperPoplink; +import com.fr.data.SimpleDSColumn; import com.fr.data.TableReplacementEntity; +import com.fr.data.condition.CommonCondition; +import com.fr.data.condition.JoinCondition; +import com.fr.data.condition.ListCondition; +import com.fr.data.core.Compare; +import com.fr.data.impl.NameTableData; +import com.fr.data.impl.TableDataDictionary; import com.fr.design.actions.replace.action.content.cell.SearchCellAction; import com.fr.design.actions.replace.action.content.formula.SearchFormulaManager; import com.fr.design.actions.replace.action.content.formula.cell.SearchCellFormulaAction; import com.fr.design.actions.replace.action.content.formula.chart.SearchChartCollectionFormulaAction; import com.fr.design.actions.replace.action.content.formula.widget.SearchWidgetFormulaAction; +import com.fr.design.actions.replace.action.content.js.SearchJSManager; import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaType; import com.fr.design.actions.replace.action.content.tabledata.TableDataFormulaUtils; import com.fr.design.actions.replace.action.content.widget.SearchWidgetAction; @@ -17,8 +26,18 @@ import com.fr.design.actions.replace.info.WidgetInfo; import com.fr.design.actions.replace.info.base.ITContent; import com.fr.design.mainframe.JTemplate; import com.fr.form.FormElementCaseProvider; +import com.fr.form.ui.DictionaryContainer; import com.fr.form.ui.ElementCaseEditor; +import com.fr.general.ComparatorUtils; +import com.fr.general.data.Condition; +import com.fr.general.data.TableDataColumn; +import com.fr.js.JavaScript; +import com.fr.js.NameJavaScript; import com.fr.main.impl.WorkBook; +import com.fr.report.cell.CellElement; +import com.fr.report.cell.FloatElement; +import com.fr.report.cell.TemplateCellElement; +import com.fr.report.cell.cellattr.core.group.DSColumn; import com.fr.report.elementcase.ElementCase; import com.fr.report.report.Report; import com.fr.report.utils.ElementCaseHelper; @@ -180,6 +199,8 @@ public class ReplaceUtils { List formulaInfos = new ArrayList<>(); SearchChartCollectionFormulaAction.getInstance().searchChartCollectionFormula(formulaInfos, new ITContent(), chartCollection); replaceFormulaInfos(formulaInfos, entities); + // 超链部分 + replaceChartJs(chartCollection, entities); } /** @@ -190,13 +211,16 @@ public class ReplaceUtils { */ public static void replaceElementCase(ElementCase elementCase, List entities) { // 非公式部分 - ElementCaseHelper.replaceTableDataWithOutFormula(elementCase, entities); + replaceTableDataWithOutFormula(elementCase, entities); // 公式部分——理论上就只有单元格和控件(超链那些都包含) List formulaInfos = getElementCaseFormulas(elementCase); replaceFormulaInfos(formulaInfos, entities); + // 超链部分 + replaceElementCasJs(elementCase, entities); } + /** * 替换CPT使用的数据集(包含公式里的) * @@ -206,18 +230,73 @@ public class ReplaceUtils { public static void replaceCpt(JTemplate template, List entity) { if (template.getTarget() instanceof WorkBook) { WorkBook workBook = (WorkBook) template.getTarget(); - // 非公式部分替换 replaceWorkBook(workBook, entity); // 公式部分 SearchFormulaManager.getInstance().search4Infos(template); List formulaInfos = SearchFormulaManager.getInstance().getFormulaInfos(); replaceFormulaInfos(formulaInfos, entity); + // 超链部分 + replaceTemplateJs(template, entity); // 触发响应 template.fireTargetModified(); } } + /** + * ----------------------------------------------private-------------------------------------------------- + */ + + + private static void replaceTemplateJs(JTemplate template, List entity) { + List javaScripts = SearchJSManager.getInstance().getTemplateJSDependenceTables(template); + replaceJs(javaScripts, entity); + } + + private static void replaceChartJs(ChartCollection chartCollection, List entities) { + List scripts = new ArrayList<>(); + List nameJavaScripts = SearchJSUtils.getChartJavaScript(chartCollection); + for(NameJavaScript javaScript : nameJavaScripts) { + if (javaScript.getJavaScript() instanceof ChartHyperPoplink) { + scripts.add(javaScript.getJavaScript()); + } + } + replaceJs(scripts, entities); + } + + private static void replaceElementCasJs(ElementCase elementCase, List entities) { + if (elementCase == null) { + return; + } + List javaScripts = new ArrayList<>(); + // 替换悬浮元素 + Iterator floatIterator = elementCase.floatIterator(); + while (floatIterator.hasNext()) { + FloatElement floatCell = (FloatElement) floatIterator.next(); + javaScripts.addAll(SearchJSUtils.getJSDependenceTables(floatCell)); + } + // 替换通用元素 + Iterator cellIterator = elementCase.cellIterator(); + while (cellIterator.hasNext()) { + CellElement cell = (CellElement) cellIterator.next(); + javaScripts.addAll(SearchJSUtils.getJSDependenceTables(cell)); + } + replaceJs(javaScripts, entities); + } + + + private static void replaceJs(List javaScripts, List entity) { + for (JavaScript javaScript : javaScripts) { + if (javaScript instanceof ChartHyperPoplink) { + ChartHyperPoplink chartHyperPoplink = (ChartHyperPoplink) javaScript; + if (chartHyperPoplink.getChartCollection() instanceof ChartCollection) { + replaceChart((ChartCollection) chartHyperPoplink.getChartCollection(), entity); + } + } + } + } + + private static void replaceWorkBook(WorkBook workBook, List entity) { if (acceptTableReplacement(entity)) { for (int i = 0; i < workBook.getReportCount(); i++) { @@ -226,7 +305,7 @@ public class ReplaceUtils { Iterator it = report.iteratorOfElementCase(); while (it.hasNext()) { ElementCase elementCase = (ElementCase) it.next(); - ElementCaseHelper.replaceTableDataWithOutFormula(elementCase, entity); + replaceTableDataWithOutFormula(elementCase, entity); } } } @@ -270,4 +349,158 @@ public class ReplaceUtils { } return formulaInfos; } + + + /** + * 替换数据集 + * + * @param elementCase 可以是报表块、组件、WorkBook... + * @param entity 数据集替换信息 + */ + private static void replaceTableDataWithOutFormula(ElementCase elementCase, List entity) { + if (elementCase == null) { + return; + } + + // -------非公式部分------- + // 替换悬浮元素 + replaceFloatCell(elementCase, entity); + // 替换通用元素 + replaceNormalCell(elementCase, entity); + } + + + /** + * 替换通用元素,主要是单元格的各个地方 + * + *
  • 单元格形态
  • + *
  • 单元格控件
  • + *
  • 单元格数据字典
  • + *
  • 单元格值
  • + * + * @param elementCase + * @param entity + */ + private static void replaceNormalCell(ElementCase elementCase, List entity) { + Iterator cellIterator = elementCase.cellIterator(); + + while (cellIterator.hasNext()) { + CellElement cell = (CellElement) cellIterator.next(); + // 处理【形态、控件、数据字典】 + replacePresentAndDictionary(cell, entity); + // 处理【单元格值】 + replaceCellValue(cell, entity); + } + } + + private static void replaceCellValue(CellElement cell, List entity) { + Object value = cell.getValue(); + if (value instanceof DSColumn) { + // 替换【数据列】 + replaceDSColumn( (DSColumn) value, entity); + // 替换【条件属性】 + replaceCondition(((DSColumn) value).getCondition(), entity); + } else if (value instanceof ChartCollection) { + ((ChartCollection) value).replaceTableData(entity); + replaceChartJs((ChartCollection) value, entity); + } + } + + private static void replaceCondition(Condition condition, List entity) { + if (condition != null) { + //公式条件不需要修改,里面不会涉及到,有问题再加 + //普通条件 + //1条条件 + if (condition instanceof CommonCondition) { + dealWithTableDataNameChange((CommonCondition) condition, entity); + } + //N条条件 + if (condition instanceof ListCondition) { + for (int k = 0; k < ((ListCondition) condition).getJoinConditionCount(); k++) { + JoinCondition joinCondition = ((ListCondition) condition).getJoinCondition(k); + Condition obCondition = joinCondition.getCondition(); + if (obCondition != null) { + if (obCondition instanceof CommonCondition) { + dealWithTableDataNameChange((CommonCondition) obCondition, entity); + } + } + } + } + } + } + + private static void dealWithTableDataNameChange(CommonCondition condition, List entities) { + Compare compare = condition.getCompare(); + Object ob = compare.getValue(); + if (ob instanceof SimpleDSColumn) { + for (TableReplacementEntity entity : entities) { + if (ComparatorUtils.equals(((SimpleDSColumn) ob).getDsName(), entity.getOldName())) { + ((SimpleDSColumn) ob).setDsName(entity.getNewName()); + ((SimpleDSColumn) ob).setColumn(TableDataColumn.createColumn(entity.getTargetField(TableDataColumn.getColumnName(((SimpleDSColumn) ob).getColumn())))); + } + } + + } + } + + private static void replaceDSColumn(DSColumn dsColumn, List entities) { + for (TableReplacementEntity entity : entities) { + if (ComparatorUtils.equals(dsColumn.getDSName(), entity.getOldName())) { + // 数据集替换 + dsColumn.setDSName(entity.getNewName()); + // 数据集字段替换 + dsColumn.setColumn(TableDataColumn.createColumn(entity.getTargetField(dsColumn.getColumnName()))); + } + } + } + + private static void replacePresentAndDictionary(CellElement cell, List entities) { + TemplateCellElement cellElement = (TemplateCellElement) cell; + // 处理单元格的控件 + replaceCellWidget(cellElement, entities); + // 处理形态 + ElementCaseHelper.replacePresent(cellElement.getPresent(), entities); + } + + + /** + * 处理单元格控件 + * + * @param cellElement 单元格 + * @param entities 替换信息 + */ + private static void replaceCellWidget(TemplateCellElement cellElement, List entities) { + if (cellElement.getWidget() instanceof DictionaryContainer) { + DictionaryContainer db = (DictionaryContainer) (cellElement.getWidget()); + if (db != null) { + if (db.getDictionary() instanceof TableDataDictionary) { + TableDataDictionary tdd = (TableDataDictionary) db.getDictionary(); + NameTableData ndd = (NameTableData) tdd.getTableData(); + // 控件持有的数据字典也得处理 + ElementCaseHelper.replaceTableDataDictionary(tdd, ndd, entities); + } + } + } + } + + /** + * 替换悬浮元素中的数据集 + * + * @param elementCase 组件 + * @param entities 替换信息 + */ + private static void replaceFloatCell(ElementCase elementCase, List entities) { + Iterator floatIterator = elementCase.floatIterator(); + while (floatIterator.hasNext()) { + FloatElement floatCell = (FloatElement) floatIterator.next(); + Object value = floatCell.getValue(); + if (value instanceof ChartCollection) { + ((ChartCollection) value).replaceTableData(entities); + replaceChartJs((ChartCollection) value, entities); + } + } + } + + + } diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java index 2a1a4ef188..8a2d245b54 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java @@ -36,7 +36,6 @@ import com.fr.report.cell.Elem; import com.fr.stable.StringUtils; import com.fr.stable.collections.combination.Pair; - import java.util.ArrayList; import java.util.List; @@ -379,6 +378,27 @@ public class SearchJSUtils { } + /** + * 获取图表-特效-交互属性中的JS + */ + public static List getChartJavaScript(ChartCollection chartCollection) { + ArrayList nameJavaScriptArrayList = new ArrayList<>(); + for (int i = 0; i < chartCollection.getChartCount(); i++) { + if (chartCollection.getChart(i) instanceof VanChart) { + VanChart chart = ((VanChart) chartCollection.getChart(i)); + if (chart.getPlot() != null) { + NameJavaScriptGroup nameJavaScriptGroup = chart.getPlot().getHotHyperLink(); + if (isNameJavaScriptGroupExist(nameJavaScriptGroup)) { + for (int j = 0; j < nameJavaScriptGroup.size(); j++) { + nameJavaScriptArrayList.add(nameJavaScriptGroup.getNameHyperlink(j)); + } + } + } + } + } + return nameJavaScriptArrayList; + } + /** * 处理图表的交互属性(可能存在多种地图) * @param content 存储信息的数据结构 @@ -493,6 +513,41 @@ public class SearchJSUtils { } } + + /** + * 获取涉及数据集的超链 + * + * @param elem 单元对象 + * @return 超链集合 + */ + public static List getJSDependenceTables(Elem elem) { + List scripts = new ArrayList<>(); + if (elem.getNameHyperlinkGroup() != null) { + for (int j = 0; j < elem.getNameHyperlinkGroup().size(); j++) { + NameJavaScript nameJavaScript = elem.getNameHyperlinkGroup().getNameHyperlink(j); + JavaScript javaScript = nameJavaScript.getJavaScript(); + if (isChartHyperPopLinkValid(javaScript)) { + ChartHyperPoplink chartHyperPoplink = (ChartHyperPoplink) javaScript; + scripts.add(javaScript); + dealWithChartHyperPoplink(chartHyperPoplink, scripts); + } + } + } + return scripts; + } + + private static void dealWithChartHyperPoplink(ChartHyperPoplink chartHyperPoplink, List scripts) { + if (chartHyperPoplink.getChartCollection() instanceof ChartCollection) { + List nameJavaScripts = getNameJavaScript((ChartCollection) chartHyperPoplink.getChartCollection(), new ITContent(), new ArrayList<>()); + for(NameJavaScript javaScript : nameJavaScripts) { + if (javaScript.getJavaScript() instanceof ChartHyperPoplink) { + scripts.add(javaScript.getJavaScript()); + } + } + } + } + + /** * 是否图表悬浮超链且内部图表是否可用 * From 70084fb9e44a3a3c821ffc75fea338e7f2fbff99 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 14 Nov 2024 10:26:27 +0800 Subject: [PATCH 28/50] =?UTF-8?q?REPORT-140564=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E6=89=80=E6=9C=89=E6=8E=A7=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E5=85=B8=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=EF=BC=8C=E9=83=BD=E6=B2=A1=E6=9C=89=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 39 ++++++++++++------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 56a38c4f6d..f5445542d8 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -28,12 +28,14 @@ import com.fr.design.mainframe.JTemplate; import com.fr.form.FormElementCaseProvider; import com.fr.form.ui.DictionaryContainer; import com.fr.form.ui.ElementCaseEditor; +import com.fr.form.ui.Widget; import com.fr.general.ComparatorUtils; import com.fr.general.data.Condition; import com.fr.general.data.TableDataColumn; import com.fr.js.JavaScript; import com.fr.js.NameJavaScript; import com.fr.main.impl.WorkBook; +import com.fr.main.parameter.ReportParameterAttr; import com.fr.report.cell.CellElement; import com.fr.report.cell.FloatElement; import com.fr.report.cell.TemplateCellElement; @@ -230,7 +232,9 @@ public class ReplaceUtils { public static void replaceCpt(JTemplate template, List entity) { if (template.getTarget() instanceof WorkBook) { WorkBook workBook = (WorkBook) template.getTarget(); - // 非公式部分替换 + // 参数面板 + replaceWorkBookPara(workBook, entity); + // 主体非公式部分替换 replaceWorkBook(workBook, entity); // 公式部分 SearchFormulaManager.getInstance().search4Infos(template); @@ -246,7 +250,16 @@ public class ReplaceUtils { /** * ----------------------------------------------private-------------------------------------------------- */ + private static void replaceWorkBookPara(WorkBook workBook, List entity) { + ReportParameterAttr attr = workBook.getReportParameterAttr(); + if (attr != null && attr.getParameterUI() != null) { + Widget[] widgets = attr.getParameterUI().getAllWidgets(); + for (Widget widget : widgets) { + replaceWidget(widget, entity); + } + } + } private static void replaceTemplateJs(JTemplate template, List entity) { List javaScripts = SearchJSManager.getInstance().getTemplateJSDependenceTables(template); @@ -457,28 +470,26 @@ public class ReplaceUtils { private static void replacePresentAndDictionary(CellElement cell, List entities) { TemplateCellElement cellElement = (TemplateCellElement) cell; // 处理单元格的控件 - replaceCellWidget(cellElement, entities); + replaceWidget(cellElement.getWidget(), entities); // 处理形态 ElementCaseHelper.replacePresent(cellElement.getPresent(), entities); } /** - * 处理单元格控件 + * 处理控件 * - * @param cellElement 单元格 + * @param widget 控件 * @param entities 替换信息 */ - private static void replaceCellWidget(TemplateCellElement cellElement, List entities) { - if (cellElement.getWidget() instanceof DictionaryContainer) { - DictionaryContainer db = (DictionaryContainer) (cellElement.getWidget()); - if (db != null) { - if (db.getDictionary() instanceof TableDataDictionary) { - TableDataDictionary tdd = (TableDataDictionary) db.getDictionary(); - NameTableData ndd = (NameTableData) tdd.getTableData(); - // 控件持有的数据字典也得处理 - ElementCaseHelper.replaceTableDataDictionary(tdd, ndd, entities); - } + private static void replaceWidget(Widget widget, List entities) { + if (widget instanceof DictionaryContainer) { + DictionaryContainer db = (DictionaryContainer) widget; + if (db.getDictionary() instanceof TableDataDictionary) { + TableDataDictionary tdd = (TableDataDictionary) db.getDictionary(); + NameTableData ndd = (NameTableData) tdd.getTableData(); + // 控件持有的数据字典也得处理 + ElementCaseHelper.replaceTableDataDictionary(tdd, ndd, entities); } } } From 7442d6c989c3c3fe9fc7eab1aef1fc901f9ebf07 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 14 Nov 2024 10:50:22 +0800 Subject: [PATCH 29/50] =?UTF-8?q?REPORT-140563=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E6=89=80=E6=9C=89=E6=8E=A7=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E6=8E=A7=E4=BB=B6=E5=80=BC=E5=AD=97=E6=AE=B5=EF=BC=8C=E9=83=BD?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index f5445542d8..db768e5be6 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -26,9 +26,12 @@ import com.fr.design.actions.replace.info.WidgetInfo; import com.fr.design.actions.replace.info.base.ITContent; import com.fr.design.mainframe.JTemplate; import com.fr.form.FormElementCaseProvider; +import com.fr.form.data.DataBinding; +import com.fr.form.ui.DataControl; import com.fr.form.ui.DictionaryContainer; import com.fr.form.ui.ElementCaseEditor; import com.fr.form.ui.Widget; +import com.fr.form.ui.concept.data.ValueInitializer; import com.fr.general.ComparatorUtils; import com.fr.general.data.Condition; import com.fr.general.data.TableDataColumn; @@ -492,6 +495,18 @@ public class ReplaceUtils { ElementCaseHelper.replaceTableDataDictionary(tdd, ndd, entities); } } + if (widget instanceof DataControl) { + ValueInitializer value = ((DataControl) widget).getWidgetValue(); + if (value.getValue() instanceof DataBinding) { + DataBinding binding = (DataBinding) value.getValue(); + for (TableReplacementEntity entity : entities) { + if (StringUtils.equals(entity.getOldName(), binding.getDataSourceName())) { + value.setValue(new DataBinding(entity.getNewName(), entity.getTargetField(binding.getDataBindingKey()))); + break; + } + } + } + } } /** From c62d253b99f0c20e8cdc15c82ab05eb53aa635c1 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 14 Nov 2024 14:44:32 +0800 Subject: [PATCH 30/50] =?UTF-8?q?REPORT-140371=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E7=9A=84=E5=BD=A2=E6=80=81-=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AD=97=E5=85=B8=E7=9A=84=E6=95=B0=E6=8D=AE=E9=9B=86?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index db768e5be6..2d51125f5b 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -37,12 +37,19 @@ import com.fr.general.data.Condition; import com.fr.general.data.TableDataColumn; import com.fr.js.JavaScript; import com.fr.js.NameJavaScript; +import com.fr.js.NameJavaScriptGroup; import com.fr.main.impl.WorkBook; import com.fr.main.parameter.ReportParameterAttr; import com.fr.report.cell.CellElement; import com.fr.report.cell.FloatElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.core.group.DSColumn; +import com.fr.report.cell.cellattr.highlight.DefaultHighlight; +import com.fr.report.cell.cellattr.highlight.Highlight; +import com.fr.report.cell.cellattr.highlight.HighlightGroup; +import com.fr.report.cell.cellattr.highlight.HyperlinkHighlightAction; +import com.fr.report.cell.cellattr.highlight.PresentHighlightAction; +import com.fr.report.cell.cellattr.highlight.WidgetHighlightAction; import com.fr.report.elementcase.ElementCase; import com.fr.report.report.Report; import com.fr.report.utils.ElementCaseHelper; @@ -300,6 +307,51 @@ public class ReplaceUtils { replaceJs(javaScripts, entities); } + private static void replaceCellHighlight(CellElement cell, List entities) { + if (cell instanceof TemplateCellElement) { + HighlightGroup group = ((TemplateCellElement) cell).getHighlightGroup(); + if (group != null) { + for (int i = 0 ; i < group.size(); i++) { + Highlight highlight = group.getHighlight(i); + replaceHighlight(highlight, entities); + } + } + } + } + + private static void replaceHighlight(Highlight highlight, List entities) { + if (highlight instanceof DefaultHighlight) { + DefaultHighlight defaultHighlight = (DefaultHighlight) highlight; + for (int i = 0 ; i < defaultHighlight.actionCount() ; i++) { + if (defaultHighlight.getHighlightAction(i) instanceof PresentHighlightAction) { + PresentHighlightAction action = (PresentHighlightAction) defaultHighlight.getHighlightAction(i); + ElementCaseHelper.replacePresent(action.getPresent(), entities); + } else if (defaultHighlight.getHighlightAction(i) instanceof WidgetHighlightAction) { + WidgetHighlightAction action = (WidgetHighlightAction) defaultHighlight.getHighlightAction(i); + replaceWidget(action.getWidget(), entities); + } else if (defaultHighlight.getHighlightAction(i) instanceof HyperlinkHighlightAction) { + HyperlinkHighlightAction action = (HyperlinkHighlightAction) defaultHighlight.getHighlightAction(i); + NameJavaScriptGroup group = action.getHperlink(); + dealNameJavaScriptGroup(group, entities); + } + } + } + } + + private static void dealNameJavaScriptGroup(NameJavaScriptGroup group, List entities) { + if (group != null) { + for (int i = 0 ; i < group.size(); i++) { + NameJavaScript javaScript = group.getNameHyperlink(i); + if (javaScript.getJavaScript() instanceof ChartHyperPoplink) { + if (((ChartHyperPoplink) javaScript.getJavaScript()).getChartCollection() instanceof ChartCollection) { + replaceChart((ChartCollection) ((ChartHyperPoplink) javaScript.getJavaScript()).getChartCollection(), entities); + } + + } + } + } + } + private static void replaceJs(List javaScripts, List entity) { for (JavaScript javaScript : javaScripts) { @@ -406,6 +458,8 @@ public class ReplaceUtils { replacePresentAndDictionary(cell, entity); // 处理【单元格值】 replaceCellValue(cell, entity); + // 处理【条件属性】 + replaceCellHighlight(cell, entity); } } From 129ee8ceb506568baef4c2fded1dd7779205f1d1 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 14 Nov 2024 14:54:39 +0800 Subject: [PATCH 31/50] =?UTF-8?q?REPORT-140299=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=97-=E9=AB=98=E7=BA=A7-=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=AD=EF=BC=8C=E6=B2=A1=E6=9C=89=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/formula/cell/SearchDSColumnFormulaAction.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchDSColumnFormulaAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchDSColumnFormulaAction.java index 5bced089a6..89ccad3b1a 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchDSColumnFormulaAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/cell/SearchDSColumnFormulaAction.java @@ -58,8 +58,7 @@ public class SearchDSColumnFormulaAction implements SearchCellFormula { } private void addFormulaInfos2ArrayFromResult(ITContent content, DSColumn dsColumn, List formulaInfos) { - char formulaLabel = '='; - if (dsColumn.getResult() != null && dsColumn.getResult().length() > 0 && dsColumn.getResult().charAt(0) == formulaLabel) { + if (dsColumn.getResult() != null && dsColumn.getResult().length() > 0) { ITContent newContent = ITContent.copy(content); newContent.setReplaceObject(dsColumn); //高级-显示值 From 713c9f02db38a209fa33519b1d15aeef7b7b1368 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 14 Nov 2024 15:02:25 +0800 Subject: [PATCH 32/50] =?UTF-8?q?REPORT-140453=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E6=A0=A1=E9=AA=8C=E7=9A=84=E5=B1=9E=E6=80=A7=E5=85=AC?= =?UTF-8?q?=E5=BC=8F=E6=B2=A1=E6=9C=89=E6=9B=BF=E6=8D=A2=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../template/SearchTemplateFormulaAction.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java index e7603de567..b95a6f6be6 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/template/SearchTemplateFormulaAction.java @@ -22,6 +22,7 @@ import com.fr.report.write.ReportWriteAttr; import com.fr.report.write.SubmitVisitor; import com.fr.report.write.ValueVerifier; import com.fr.report.write.WClassSubmiter; +import com.fr.report.write.WClassVerifier; import com.fr.stable.CommonUtils; import com.fr.stable.ListMap; @@ -106,16 +107,31 @@ public class SearchTemplateFormulaAction implements SearchTemplateFormula { //数据校验 for (int i = 0, len = attr.getVerifierCount(); i < len; i++) { Verifier verifier = attr.getVerifier(i); + ITContent content = ITContent.copy(sheetContent); + content.addOtherPos(Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify")); if (verifier instanceof ValueVerifier) { - ITContent content = ITContent.copy(sheetContent); - content.addOtherPos(Toolkit.i18nText("Fine-Design_Report_Verify_Data_Verify")); dealValueVerifier4Formula(formulaInfos, content, (ValueVerifier) verifier); + } else if (verifier instanceof WClassVerifier) { + dealWClassVerifier(formulaInfos, content, (WClassVerifier)verifier); } } } } + private void dealWClassVerifier(List formulaInfos, ITContent content, WClassVerifier verifier) { + if (verifier.getClassVerifyJob() != null) { + ListMap map = verifier.getClassVerifyJob().getPropertyMap(); + for (Object value : map.values()) { + if (value instanceof Formula) { + ITContent formulaContent = ITContent.copy(content); + formulaContent.setReplaceObject(value); + formulaInfos.add(new FormulaInfo(formulaContent)); + } + } + } + } + private void dealValueVerifier4Formula(List formulaInfos, ITContent content, ValueVerifier verifier) { ITContent verifyContent = ITContent.copy(content); verifyContent.addOtherPos(verifier.getName()); From 8cc71df412c5bbd1c14cf7cb6c7c8875cb9e60c1 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 14 Nov 2024 15:25:37 +0800 Subject: [PATCH 33/50] =?UTF-8?q?REPORT-140634=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A0=91=E5=92=8C=E8=A7=86=E5=9B=BE=E6=A0=91=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E9=83=BD=E4=B8=8D=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 2d51125f5b..66791c34b2 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -11,6 +11,8 @@ import com.fr.data.condition.ListCondition; import com.fr.data.core.Compare; import com.fr.data.impl.NameTableData; import com.fr.data.impl.TableDataDictionary; +import com.fr.data.impl.TreeNodeAttr; +import com.fr.data.impl.TreeNodeWrapper; import com.fr.design.actions.replace.action.content.cell.SearchCellAction; import com.fr.design.actions.replace.action.content.formula.SearchFormulaManager; import com.fr.design.actions.replace.action.content.formula.cell.SearchCellFormulaAction; @@ -30,8 +32,10 @@ import com.fr.form.data.DataBinding; import com.fr.form.ui.DataControl; import com.fr.form.ui.DictionaryContainer; import com.fr.form.ui.ElementCaseEditor; +import com.fr.form.ui.TreeEditor; import com.fr.form.ui.Widget; import com.fr.form.ui.concept.data.ValueInitializer; +import com.fr.form.ui.tree.LayerConfig; import com.fr.general.ComparatorUtils; import com.fr.general.data.Condition; import com.fr.general.data.TableDataColumn; @@ -542,6 +546,10 @@ public class ReplaceUtils { private static void replaceWidget(Widget widget, List entities) { if (widget instanceof DictionaryContainer) { DictionaryContainer db = (DictionaryContainer) widget; + if (widget instanceof TreeEditor) { + Object config = ((TreeEditor) widget).getBuildModelConfig(); + replaceTreeConfig(config, entities); + } if (db.getDictionary() instanceof TableDataDictionary) { TableDataDictionary tdd = (TableDataDictionary) db.getDictionary(); NameTableData ndd = (NameTableData) tdd.getTableData(); @@ -563,6 +571,41 @@ public class ReplaceUtils { } } + private static void replaceTreeConfig(Object config, List entities) { + if (config instanceof LayerConfig[]) { + LayerConfig[] layerConfigs = (LayerConfig[]) config; + dealWithLayerConfigs(layerConfigs, entities); + } else if (config instanceof TreeNodeWrapper) { + TreeNodeWrapper wrapper = (TreeNodeWrapper) config; + dealWithTreeNodeWrapper(wrapper, entities); + } else if (config instanceof TableDataDictionary) { + TableDataDictionary tableDataDictionary = (TableDataDictionary) config; + ElementCaseHelper.replaceTableDataDictionary(tableDataDictionary, (NameTableData) tableDataDictionary.getTableData(), entities); + } + } + + private static void dealWithTreeNodeWrapper(TreeNodeWrapper wrapper, List entities) { + for (TreeNodeAttr attr : wrapper.getTreeNodeAttrs()) { + if (attr.getDictionary() instanceof TableDataDictionary) { + TableDataDictionary tableDataDictionary = (TableDataDictionary) attr.getDictionary(); + ElementCaseHelper.replaceTableDataDictionary(tableDataDictionary, (NameTableData) tableDataDictionary.getTableData(), entities); + } + } + } + + private static void dealWithLayerConfigs(LayerConfig[] layerConfigs, List entities) { + for (LayerConfig layerConfig : layerConfigs) { + if (layerConfig.getDictionary() != null ) { + for (TableReplacementEntity entity : entities) { + if (layerConfig.getTableData() instanceof NameTableData && StringUtils.equals(layerConfig.getTableData().getName(), entity.getOldName())) { + layerConfig.setTableData(new NameTableData(entity.getNewName())); + } + } + ElementCaseHelper.replaceTableDataDictionary(layerConfig.getDictionary(), (NameTableData) layerConfig.getDictionary().getTableData(), entities); + } + } + } + /** * 替换悬浮元素中的数据集 * From 5c2b2bb2e21d22a16fc71128a1a7628b3595e913 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Fri, 15 Nov 2024 15:41:26 +0800 Subject: [PATCH 34/50] =?UTF-8?q?REPORT-140743=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A0=91=E5=92=8C=E8=A7=86=E5=9B=BE=E6=A0=91=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E5=90=8E=EF=BC=8C=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E5=B9=B6=E6=9C=AA=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/replace/utils/ReplaceUtils.java | 1 + 1 file changed, 1 insertion(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 66791c34b2..161e8d190a 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -549,6 +549,7 @@ public class ReplaceUtils { if (widget instanceof TreeEditor) { Object config = ((TreeEditor) widget).getBuildModelConfig(); replaceTreeConfig(config, entities); + ((TreeEditor) widget).setBuildModelConfig(config); } if (db.getDictionary() instanceof TableDataDictionary) { TableDataDictionary tdd = (TableDataDictionary) db.getDictionary(); From e9238fc38ad5b176b623310d8bf202e11ed42583 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 18 Nov 2024 10:34:40 +0800 Subject: [PATCH 35/50] =?UTF-8?q?REPORT-140524=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91x3.0.0.1=E5=81=9A?= =?UTF-8?q?=E7=9A=84=E7=9C=8B=E6=9D=BF=EF=BC=8C=E5=9B=BE=E8=A1=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=92=8C=E6=A0=87=E9=A2=98=E4=BD=BF=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=92=8C=E6=95=B0=E6=8D=AE=E9=9B=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E9=83=BD=E8=A2=AB=E8=AF=86=E5=88=AB=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchChartCollectionFormulaAction.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java index 69b763248c..8924cae01b 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java @@ -370,14 +370,16 @@ public class SearchChartCollectionFormulaAction { } private void searchChartPatternFormulaFromTitle(List formulaInfos, ITContent chartContent, Chart chart) { - //样式-标题 - ITContent titleContent = ITContent.copy(chartContent); - titleContent.addOtherPos( - chart.getChartName(), - Toolkit.i18nText("Fine-Design_Chart_Pattern") + if (chart != null) { + //样式-标题 + ITContent titleContent = ITContent.copy(chartContent); + titleContent.addOtherPos( + chart.getChartName(), + Toolkit.i18nText("Fine-Design_Chart_Pattern") - ); - dealTitle(formulaInfos, titleContent, chart.getTitle()); + ); + dealTitle(formulaInfos, titleContent, chart.getTitle()); + } } private void dealTitle(List formulaInfos, ITContent chartContent, Title title) { From eb6901b462e19dfff942fbf897d1ee7a5a501ab4 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 18 Nov 2024 10:37:45 +0800 Subject: [PATCH 36/50] =?UTF-8?q?REPORT-140524=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91x3.0.0.1=E5=81=9A?= =?UTF-8?q?=E7=9A=84=E7=9C=8B=E6=9D=BF=EF=BC=8C=E5=9B=BE=E8=A1=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=92=8C=E6=A0=87=E9=A2=98=E4=BD=BF=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E6=A8=A1=E6=9D=BF=E5=92=8C=E6=95=B0=E6=8D=AE=E9=9B=86=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=EF=BC=8C=E9=83=BD=E8=A2=AB=E8=AF=86=E5=88=AB=E6=9C=AA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SearchChartCollectionFormulaAction.java | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java index 8924cae01b..d26bf69767 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/formula/chart/SearchChartCollectionFormulaAction.java @@ -63,29 +63,33 @@ public class SearchChartCollectionFormulaAction { public void searchChartCollectionFormula(List formulaInfos, ITContent content, ChartCollection chartCollection) { for (int i = 0; i < chartCollection.getChartCount(); i++) { ITContent chartContent = ITContent.copy(content); - searchChartPatternFormula(formulaInfos, chartContent, chartCollection.getChart(i)); + Chart chart = chartCollection.getChart(i); + if (chart == null) { + continue; + } + searchChartPatternFormula(formulaInfos, chartContent, chart); if (isChangeConfigAttrValid(chartCollection.getChangeConfigAttr())) { //图表切换属性 - dealChangeConfig(formulaInfos, chartContent, chartCollection.getChart(i)); + dealChangeConfig(formulaInfos, chartContent, chart); } //图表-交互属性-超级链接 - dealChartHyperLink(formulaInfos, chartContent, chartCollection.getChart(i)); + dealChartHyperLink(formulaInfos, chartContent, chart); //数据-单元格数据-分类名&系列名&值 SearchChartDataFormulaManager searchChartDataFormulaManager = SearchChartDataFormulaManager.getInstance(); Map type = searchChartDataFormulaManager.getChartDataType(); - if (isDefinitionValid(chartCollection.getChart(i).getFilterDefinition())) { - String name = chartCollection.getChart(i).getFilterDefinition().getClass().getSimpleName(); + if (isDefinitionValid(chart.getFilterDefinition())) { + String name = chart.getFilterDefinition().getClass().getSimpleName(); SearchChartDataFormula searchChartDataFormula = type.get(name); - TopDefinitionProvider provider = chartCollection.getChart(i).getFilterDefinition(); + TopDefinitionProvider provider = chart.getFilterDefinition(); ITContent dataContent = ITContent.copy(content); - dataContent.addOtherPos(chartCollection.getChart(i).getChartName(), Toolkit.i18nText("Fine-Design_Basic_Data")); + dataContent.addOtherPos(chart.getChartName(), Toolkit.i18nText("Fine-Design_Basic_Data")); searchChartDataFormula.searchChartDataFormula(formulaInfos, dataContent, provider); } //数据-形态 - if (chartCollection.getChart(i).getFilterDefinition() != null) { + if (chart.getFilterDefinition() != null) { ITContent presentContent = ITContent.copy(content); - presentContent.addOtherPos(chartCollection.getChart(i).getChartName(), Toolkit.i18nText("Fine-Design_Basic_Data")); - searchFormulaFromChartPresent(formulaInfos, presentContent, chartCollection.getChart(i).getFilterDefinition()); + presentContent.addOtherPos(chart.getChartName(), Toolkit.i18nText("Fine-Design_Basic_Data")); + searchFormulaFromChartPresent(formulaInfos, presentContent, chart.getFilterDefinition()); } } } @@ -370,16 +374,14 @@ public class SearchChartCollectionFormulaAction { } private void searchChartPatternFormulaFromTitle(List formulaInfos, ITContent chartContent, Chart chart) { - if (chart != null) { - //样式-标题 - ITContent titleContent = ITContent.copy(chartContent); - titleContent.addOtherPos( - chart.getChartName(), - Toolkit.i18nText("Fine-Design_Chart_Pattern") + //样式-标题 + ITContent titleContent = ITContent.copy(chartContent); + titleContent.addOtherPos( + chart.getChartName(), + Toolkit.i18nText("Fine-Design_Chart_Pattern") - ); - dealTitle(formulaInfos, titleContent, chart.getTitle()); - } + ); + dealTitle(formulaInfos, titleContent, chart.getTitle()); } private void dealTitle(List formulaInfos, ITContent chartContent, Title title) { From 3a37ce9c57c1581c6f8d225da568b019803ce915 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 18 Nov 2024 10:55:29 +0800 Subject: [PATCH 37/50] =?UTF-8?q?REPORT-140678=20=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E4=BD=BF=E7=94=A8ds.select=EF=BC=8C=E5=AF=B9ds=E6=9B=BF?= =?UTF-8?q?=E6=8D=A2=E6=95=B0=E6=8D=AE=E9=9B=86=E5=90=8E=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tabledata/TableDataFormulaUtils.java | 28 +++++++++++++++++++ .../tabledata/TableDataFormulaUtilsTest.java | 4 +++ 2 files changed, 32 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java index 85c5b54980..ffeabb95a2 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java @@ -173,12 +173,18 @@ public class TableDataFormulaUtils { if (subNode instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) subNode; result.addAll(TableDataFormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); + } else if (subNode instanceof DatasetFunctionCall) { + DatasetFunctionCall datasetFunctionCall = (DatasetFunctionCall) subNode; + result.addAll(TableDataFormulaUtils.fetchArgument(datasetFunctionCall, functionName)); } } } } else if (node instanceof FunctionCall) { FunctionCall functionCall = (FunctionCall) node; result.addAll(TableDataFormulaUtils.fetchArgument(functionCall, functionName, argumentIndex)); + } else if (node instanceof DatasetFunctionCall) { + DatasetFunctionCall datasetFunctionCall = (DatasetFunctionCall) node; + result.addAll(TableDataFormulaUtils.fetchArgument(datasetFunctionCall, functionName)); } } @@ -188,6 +194,28 @@ public class TableDataFormulaUtils { return result; } + private static List fetchArgument(DatasetFunctionCall datasetFunctionCall, String functionName) { + List result = new ArrayList<>(); + Node[] subNodes = datasetFunctionCall.getArguments(); + String sourceName = datasetFunctionCall.getSourceName(); + if (StringUtils.isNotEmpty(functionName)) { + result.add(sourceName); + } + if (subNodes != null) { + // 遍历子公式 + for (Object subNode : subNodes) { + if (subNode instanceof FunctionCall) { + for (TableDataFormulaType tableDataFormulaType : TableDataFormulaType.values()) { + result.addAll(TableDataFormulaUtils.fetchArgument((FunctionCall) subNode, tableDataFormulaType.name(), tableDataFormulaType.getArgumentIndex())); + } + } else if (subNode instanceof DatasetFunctionCall) { + result.addAll(fetchArgument((DatasetFunctionCall) subNode, functionName)); + } + } + } + return result; + } + private static void replaceArgument4FunctionCall(FunctionCall functionCall, List entities) { Node[] subNodes = functionCall.getArguments(); if (subNodes != null) { diff --git a/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtilsTest.java b/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtilsTest.java index ca4fc6dd45..bf9dca188b 100644 --- a/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtilsTest.java +++ b/designer-realize/src/test/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtilsTest.java @@ -42,6 +42,10 @@ public class TableDataFormulaUtilsTest extends TestCase { Assert.assertTrue(qiantao2.contains("test-测试7")); Assert.assertTrue(qiantao2.contains("test-测试8")); + String str3 = "TEST_TABLE.select(INNER.select(glbName,\"6\"),\"6\")"; + Set result = TableDataFormulaUtils.search4TableData(str3); + Assert.assertTrue(result.contains("TEST_TABLE")); + Assert.assertTrue(result.contains("INNER")); } public void testReplace() { From 1c4e4b67de13cde2c70f98198643fd73fee10312 Mon Sep 17 00:00:00 2001 From: obo Date: Wed, 20 Nov 2024 10:36:18 +0800 Subject: [PATCH 38/50] =?UTF-8?q?REPORT-129009=20fix:FR=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/gui/frpane/CommitTabbedPane.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java b/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java index 66b057d0ca..55877a6892 100644 --- a/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java +++ b/designer-base/src/main/java/com/fr/design/gui/frpane/CommitTabbedPane.java @@ -409,7 +409,7 @@ public class CommitTabbedPane extends JComponent implements MouseListener, Mous selectedIndex = dbManipulationPaneList.size()-1; commit2DBJavaScriptPane.updateCardPane(); } else if (isOverCloseIcon(x)){ - int re = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_CommitTab_Sure_To_Delete")+ "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_CommitTab_Remove") + int re = FineJOptionPane.showConfirmDialog(SwingUtilities.getWindowAncestor(this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_CommitTab_Sure_To_Delete")+ "?", com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips") , JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (re == JOptionPane.OK_OPTION) { dbManipulationPaneList.remove(getTabIndex(x)); From 1a3fcb92a77dcf231c9453f9ff09f6e00534ba46 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 20 Nov 2024 16:26:42 +0800 Subject: [PATCH 39/50] =?UTF-8?q?REPORT-140743=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A0=91=E5=92=8C=E8=A7=86=E5=9B=BE=E6=A0=91=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E5=90=8E=EF=BC=8C=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E5=B9=B6=E6=9C=AA=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/actions/replace/utils/ReplaceUtils.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 161e8d190a..effb64cf38 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -572,7 +572,14 @@ public class ReplaceUtils { } } - private static void replaceTreeConfig(Object config, List entities) { + + /** + * 处理树结构的config + * + * @param config 树结构配置 + * @param entities 替换信息 + */ + public static void replaceTreeConfig(Object config, List entities) { if (config instanceof LayerConfig[]) { LayerConfig[] layerConfigs = (LayerConfig[]) config; dealWithLayerConfigs(layerConfigs, entities); @@ -600,6 +607,8 @@ public class ReplaceUtils { for (TableReplacementEntity entity : entities) { if (layerConfig.getTableData() instanceof NameTableData && StringUtils.equals(layerConfig.getTableData().getName(), entity.getOldName())) { layerConfig.setTableData(new NameTableData(entity.getNewName())); + layerConfig.setViewColumn(entity.getTargetIndex(layerConfig.getViewColumn())); + layerConfig.setModelColumn(entity.getTargetIndex(layerConfig.getModelColumn())); } } ElementCaseHelper.replaceTableDataDictionary(layerConfig.getDictionary(), (NameTableData) layerConfig.getDictionary().getTableData(), entities); From a0fa7a079d320e54c6ebbf4e7a36d09370032356 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 20 Nov 2024 16:51:17 +0800 Subject: [PATCH 40/50] =?UTF-8?q?REPORT-140743=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A0=91=E5=92=8C=E8=A7=86=E5=9B=BE=E6=A0=91=E7=9A=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E5=90=8E=EF=BC=8C=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E5=B9=B6=E6=9C=AA=E7=94=9F=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/actions/replace/utils/ReplaceUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index effb64cf38..f7c4946eb6 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -560,7 +560,7 @@ public class ReplaceUtils { } if (widget instanceof DataControl) { ValueInitializer value = ((DataControl) widget).getWidgetValue(); - if (value.getValue() instanceof DataBinding) { + if (value != null && value.getValue() instanceof DataBinding) { DataBinding binding = (DataBinding) value.getValue(); for (TableReplacementEntity entity : entities) { if (StringUtils.equals(entity.getOldName(), binding.getDataSourceName())) { From c6e07423f9e3529790cf58be1f81841a2b83a07f Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 21 Nov 2024 16:45:47 +0800 Subject: [PATCH 41/50] =?UTF-8?q?REPORT-141247=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=85=AC=E5=BC=8F?= =?UTF-8?q?ds1.select=E3=80=81group=E3=80=81find=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D=E4=B8=8D=E4=BC=9A=E8=A2=AB=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tabledata/TableDataFormulaUtils.java | 42 ++++++++++++------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java index ffeabb95a2..955a44005e 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java @@ -3,9 +3,11 @@ package com.fr.design.actions.replace.action.content.tabledata; import com.fr.data.TableReplacementEntity; import com.fr.invoke.Reflect; import com.fr.log.FineLoggerFactory; +import com.fr.parser.Ambiguity; import com.fr.parser.BinaryExpression; import com.fr.parser.DatasetFunctionCall; import com.fr.parser.FunctionCall; +import com.fr.parser.RelationExpression; import com.fr.parser.StringLiteral; import com.fr.script.Calculator; import com.fr.stable.StringUtils; @@ -107,18 +109,7 @@ public class TableDataFormulaUtils { // 数据集名称 StringBuilder parent = new StringBuilder(datasetFunctionCall.getSourceName()); for (Node subNode : subNodes) { - // 嵌套普通公式 - if (subNode instanceof FunctionCall) { - replaceArgument4FunctionCall((FunctionCall) subNode, entities); - } else if (subNode instanceof StringLiteral) { - // 无嵌套,可以根据传进来的datasetFunctionCall进行替换 - StringLiteral stringLiteral = (StringLiteral) subNode; - replaceDatasetFunctionCall0(stringLiteral, datasetFunctionCall, entities, parent); - } else if (subNode instanceof DatasetFunctionCall) { - // 嵌套datasetFunctionCall,递归回来该方法继续往下 - DatasetFunctionCall datasetFunctionCall1 = (DatasetFunctionCall) subNode; - replaceArgument4DatasetFunctionCall(datasetFunctionCall1, entities); - } + replaceNode4DatasetFunctionCall(subNode, datasetFunctionCall, entities, parent); } for (TableReplacementEntity entity : entities) { if (StringUtils.equals(parent.toString(), entity.getOldName())) { @@ -130,17 +121,38 @@ public class TableDataFormulaUtils { } } - private static void replaceDatasetFunctionCall0(StringLiteral stringLiteral, DatasetFunctionCall datasetFunctionCall, List entities, StringBuilder parent) { + private static void replaceNode4DatasetFunctionCall(Node subNode, DatasetFunctionCall datasetFunctionCall, List entities, StringBuilder parent) { + // 嵌套普通公式 + if (subNode instanceof FunctionCall) { + replaceArgument4FunctionCall((FunctionCall) subNode, entities); + } else if (subNode instanceof Ambiguity) { + // 无嵌套,可以根据传进来的datasetFunctionCall进行替换 + // 这边产品确认只能替换无双引号的字段,因此是ambiguity而不是StringLiteral + Ambiguity ambiguity = (Ambiguity) subNode; + replaceDatasetFunctionCall0(ambiguity, datasetFunctionCall, entities, parent); + } else if (subNode instanceof DatasetFunctionCall) { + // 嵌套datasetFunctionCall,递归回来该方法继续往下 + DatasetFunctionCall datasetFunctionCall1 = (DatasetFunctionCall) subNode; + replaceArgument4DatasetFunctionCall(datasetFunctionCall1, entities); + } else if (subNode instanceof RelationExpression) { + Node left = ((RelationExpression) subNode).getLeft(); + Node right = ((RelationExpression) subNode).getRight(); + replaceNode4DatasetFunctionCall(left, datasetFunctionCall, entities, parent); + replaceNode4DatasetFunctionCall(right, datasetFunctionCall, entities, parent); + } + } + + private static void replaceDatasetFunctionCall0(Ambiguity ambiguity, DatasetFunctionCall datasetFunctionCall, List entities, StringBuilder parent) { try { TableDataFormulaType type = TableDataFormulaType.get(datasetFunctionCall.getFnName()); if (type != null) { - String name = stringLiteral.eval(Calculator.createCalculator()).toString(); + String name = ambiguity.toString(); for (TableReplacementEntity entity : entities) { if (StringUtils.equals(parent.toString(), entity.getOldName())) { // 如果是要替换的数据集 String field = entity.getTargetField(name); // 替换成匹配后的字段 - Reflect.on(stringLiteral).set(STATEMENT, field); + Reflect.on(ambiguity).set(STATEMENT, field); break; } } From b8e38a8ef4fe2eb046180bd28971ed367ee6907a Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 21 Nov 2024 17:27:24 +0800 Subject: [PATCH 42/50] =?UTF-8?q?REPORT-141350=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?-=E5=8D=95=E5=85=83=E6=A0=BC-=E6=9D=A1=E4=BB=B6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7-=E6=9D=A1=E4=BB=B6=E6=98=AF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=97=EF=BC=8C=E6=97=A0=E6=B3=95=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 219 +++++++++++++++++- 1 file changed, 217 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index f7c4946eb6..786ca7c083 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -1,6 +1,8 @@ package com.fr.design.actions.replace.utils; import com.fr.base.Formula; +import com.fr.base.present.DictPresent; +import com.fr.base.present.Present; import com.fr.chart.chartattr.ChartCollection; import com.fr.chart.web.ChartHyperPoplink; import com.fr.data.SimpleDSColumn; @@ -121,8 +123,18 @@ public class ReplaceUtils { * @return 报表块使用的数据集 */ public static Set getElementCaseDependenceTables(ElementCaseEditor elementCaseEditor) { - FormElementCaseProvider elementCase = elementCaseEditor.getElementCase(); - return elementCase.getCellTableDataSet(); + Set ans = new HashSet<>(); + FormElementCaseProvider provider = elementCaseEditor.getElementCase(); + if (provider instanceof ElementCase) { + // 非公式部分 + ans.addAll(searchTableDataWithOutFormula((ElementCase)provider)); + // 公式部分——理论上就只有单元格和控件(超链那些都包含) + List formulaInfos = getElementCaseFormulas((ElementCase) provider); + ans.addAll(searchFormulaInfos(formulaInfos)); + // 超链部分 + ans.addAll(searchElementCasJs((ElementCase)provider)); + } + return ans; } /** @@ -635,5 +647,208 @@ public class ReplaceUtils { } + /** + * ------------------------private search----------------------------------- + */ + + + private static Set searchElementCasJs(ElementCase elementCase) { + Set ans = new HashSet<>(); + List javaScripts = new ArrayList<>(); + // 替换通用元素 + Iterator cellIterator = elementCase.cellIterator(); + while (cellIterator.hasNext()) { + CellElement cell = (CellElement) cellIterator.next(); + javaScripts.addAll(SearchJSUtils.getJSDependenceTables(cell)); + } + ans.addAll(searchJs(javaScripts)); + return ans; + } + + private static Set searchJs(List javaScripts) { + Set ans = new HashSet<>(); + for (JavaScript javaScript : javaScripts) { + if (javaScript instanceof ChartHyperPoplink) { + ChartHyperPoplink chartHyperPoplink = (ChartHyperPoplink) javaScript; + if (chartHyperPoplink.getChartCollection() instanceof ChartCollection) { + ans.addAll((chartHyperPoplink.getChartCollection().getDataSetNames())); + } + } + } + return ans; + } + + private static Set searchFormulaInfos(List formulaInfos) { + Set ans = new HashSet<>(); + for (FormulaInfo formulaInfo : formulaInfos) { + ans.addAll(TableDataFormulaUtils.search4TableData(formulaInfo.getPureValue())); + } + return ans; + } + + private static Set searchTableDataWithOutFormula(ElementCase elementCase) { + Set ans = new HashSet<>(); + Iterator cellIterator = elementCase.cellIterator(); + while (cellIterator.hasNext()) { + CellElement cell = (CellElement) cellIterator.next(); + // 处理【形态、控件、数据字典】 + ans.addAll(searchPresentAndDictionary(cell)); + // 处理【单元格值】 + ans.addAll(searchCellValue(cell)); + // 处理【条件属性】 + ans.addAll(searchCellHighlight(cell)); + } + return ans; + } + + private static Set searchCellHighlight(CellElement cell) { + Set ans = new HashSet<>(); + if (cell instanceof TemplateCellElement) { + HighlightGroup group = ((TemplateCellElement) cell).getHighlightGroup(); + if (group != null) { + for (int i = 0 ; i < group.size(); i++) { + Highlight highlight = group.getHighlight(i); + ans.addAll(searchHighlight(highlight)); + } + } + } + return ans; + } + + private static Set searchHighlight(Highlight highlight) { + Set ans = new HashSet<>(); + if (highlight instanceof DefaultHighlight) { + DefaultHighlight defaultHighlight = (DefaultHighlight) highlight; + for (int i = 0 ; i < defaultHighlight.actionCount() ; i++) { + if (defaultHighlight.getHighlightAction(i) instanceof PresentHighlightAction) { + PresentHighlightAction action = (PresentHighlightAction) defaultHighlight.getHighlightAction(i); + ans.addAll(searchPresent(action.getPresent())); + } else if (defaultHighlight.getHighlightAction(i) instanceof WidgetHighlightAction) { + WidgetHighlightAction action = (WidgetHighlightAction) defaultHighlight.getHighlightAction(i); + ans.addAll(searchWidget(action.getWidget())); + } else if (defaultHighlight.getHighlightAction(i) instanceof HyperlinkHighlightAction) { + HyperlinkHighlightAction action = (HyperlinkHighlightAction) defaultHighlight.getHighlightAction(i); + NameJavaScriptGroup group = action.getHperlink(); + ans.addAll(searchNameJavaScriptGroup(group)); + } + } + } + return ans; + } + + private static Set searchNameJavaScriptGroup(NameJavaScriptGroup group) { + Set ans = new HashSet<>(); + if (group != null) { + for (int i = 0 ; i < group.size(); i++) { + NameJavaScript javaScript = group.getNameHyperlink(i); + if (javaScript.getJavaScript() instanceof ChartHyperPoplink) { + if (((ChartHyperPoplink) javaScript.getJavaScript()).getChartCollection() instanceof ChartCollection) { + ans.addAll((((ChartHyperPoplink) javaScript.getJavaScript()).getChartCollection().getDataSetNames())); + } + } + } + } + return ans; + } + + private static Set searchCellValue(CellElement cell) { + Set ans = new HashSet<>(); + Object value = cell.getValue(); + if (value instanceof DSColumn) { + // 查找【数据列】 + ans.add(((DSColumn) value).getDSName()); + // 查找【条件属性】 + ans.addAll(searchCondition(((DSColumn) value).getCondition())); + } else if (value instanceof ChartCollection) { + ans.addAll(((ChartCollection) value).getDataSetNames()); + } + return ans; + } + + private static Set searchCondition(Condition condition) { + Set ans = new HashSet<>(); + if (condition != null) { + //普通条件 + //1条条件 + if (condition instanceof CommonCondition) { + ans.addAll(searchCondition0((CommonCondition) condition)); + } + //N条条件 + if (condition instanceof ListCondition) { + for (int k = 0; k < ((ListCondition) condition).getJoinConditionCount(); k++) { + JoinCondition joinCondition = ((ListCondition) condition).getJoinCondition(k); + Condition obCondition = joinCondition.getCondition(); + if (obCondition != null) { + if (obCondition instanceof CommonCondition) { + ans.addAll(searchCondition0((CommonCondition) obCondition)); + } + } + } + } + } + return ans; + } + + private static Set searchCondition0(CommonCondition condition) { + Set ans = new HashSet<>(); + Compare compare = condition.getCompare(); + Object ob = compare.getValue(); + if (ob instanceof SimpleDSColumn) { + ans.add(((SimpleDSColumn) ob).getDsName()); + } + return ans; + } + + + private static Set searchPresentAndDictionary(CellElement cell) { + Set ans = new HashSet<>(); + TemplateCellElement cellElement = (TemplateCellElement) cell; + // 处理单元格的控件 + ans.addAll(searchWidget(cellElement.getWidget())); + // 处理形态 + ans.addAll(searchPresent(cellElement.getPresent())); + return ans; + } + + private static Set searchPresent(Present p) { + Set ans = new HashSet<>(); + if (!(p instanceof DictPresent)) { + return ans; + } + DictPresent dp = (DictPresent) p; + if (!(dp.getDictionary() instanceof TableDataDictionary)) { + return ans; + } + TableDataDictionary td = (TableDataDictionary) dp.getDictionary(); + if (!(td.getTableData() instanceof NameTableData)) { + return ans; + } + NameTableData nd = (NameTableData) td.getTableData(); + ans.add(nd.getName()); + return ans; + } + + private static Set searchWidget(Widget widget) { + Set ans = new HashSet<>(); + if (widget instanceof DictionaryContainer) { + DictionaryContainer db = (DictionaryContainer) widget; + if (db.getDictionary() instanceof TableDataDictionary) { + TableDataDictionary tdd = (TableDataDictionary) db.getDictionary(); + NameTableData ndd = (NameTableData) tdd.getTableData(); + if (ndd != null) { + ans.add(ndd.getName()); + } + } + } + if (widget instanceof DataControl) { + ValueInitializer value = ((DataControl) widget).getWidgetValue(); + if (value != null && value.getValue() instanceof DataBinding) { + DataBinding binding = (DataBinding) value.getValue(); + ans.add(binding.getDataSourceName()); + } + } + return ans; + } + } From a193674162c5f9642e3f63888e74c5f45a61d1d4 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 21 Nov 2024 17:38:19 +0800 Subject: [PATCH 43/50] =?UTF-8?q?REPORT-141350=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?-=E5=8D=95=E5=85=83=E6=A0=BC-=E6=9D=A1=E4=BB=B6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7-=E6=9D=A1=E4=BB=B6=E6=98=AF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=97=EF=BC=8C=E6=97=A0=E6=B3=95=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/actions/replace/utils/ReplaceUtils.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 786ca7c083..a9ad21fd2e 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -778,10 +778,8 @@ public class ReplaceUtils { for (int k = 0; k < ((ListCondition) condition).getJoinConditionCount(); k++) { JoinCondition joinCondition = ((ListCondition) condition).getJoinCondition(k); Condition obCondition = joinCondition.getCondition(); - if (obCondition != null) { - if (obCondition instanceof CommonCondition) { - ans.addAll(searchCondition0((CommonCondition) obCondition)); - } + if (obCondition instanceof CommonCondition) { + ans.addAll(searchCondition0((CommonCondition) obCondition)); } } } From 52728bf6ca1e1eb31a6587e183f1b1c5d1ab11c0 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 21 Nov 2024 22:10:32 +0800 Subject: [PATCH 44/50] =?UTF-8?q?REPORT-141247=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=85=AC=E5=BC=8F?= =?UTF-8?q?ds1.select=E3=80=81group=E3=80=81find=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=90=8D=E4=B8=8D=E4=BC=9A=E8=A2=AB=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/content/tabledata/TableDataFormulaUtils.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java index 955a44005e..bf02fe15e9 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/action/content/tabledata/TableDataFormulaUtils.java @@ -151,8 +151,10 @@ public class TableDataFormulaUtils { if (StringUtils.equals(parent.toString(), entity.getOldName())) { // 如果是要替换的数据集 String field = entity.getTargetField(name); - // 替换成匹配后的字段 - Reflect.on(ambiguity).set(STATEMENT, field); + if (StringUtils.isNotEmpty(field)) { + // 替换成匹配后的字段 + Reflect.on(ambiguity).set(STATEMENT, field); + } break; } } From 365450b387f31fca49946788d4d8725a0821d4c7 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 21 Nov 2024 22:33:39 +0800 Subject: [PATCH 45/50] =?UTF-8?q?REPORT-141671=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E7=BB=84=E5=90=88?= =?UTF-8?q?=E5=9B=BE=E7=9A=84=E6=95=B0=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E6=95=B0=E6=8D=AE=E5=88=97=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E6=9B=BF=E6=8D=A2=E6=88=90=E5=8A=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/SearchJSUtils.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java index 8a2d245b54..cc444ba91e 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/SearchJSUtils.java @@ -387,11 +387,14 @@ public class SearchJSUtils { if (chartCollection.getChart(i) instanceof VanChart) { VanChart chart = ((VanChart) chartCollection.getChart(i)); if (chart.getPlot() != null) { - NameJavaScriptGroup nameJavaScriptGroup = chart.getPlot().getHotHyperLink(); - if (isNameJavaScriptGroupExist(nameJavaScriptGroup)) { - for (int j = 0; j < nameJavaScriptGroup.size(); j++) { - nameJavaScriptArrayList.add(nameJavaScriptGroup.getNameHyperlink(j)); + if (chart.getPlot() instanceof VanChartCustomPlot) { + VanChartCustomPlot plot = chart.getPlot(); + for (Plot customPlot : plot.getCustomPlotList()) { + getChartJavaScriptFromGroup(customPlot.getHotHyperLink(), nameJavaScriptArrayList); } + } else { + NameJavaScriptGroup nameJavaScriptGroup = chart.getPlot().getHotHyperLink(); + getChartJavaScriptFromGroup(nameJavaScriptGroup, nameJavaScriptArrayList); } } } @@ -399,6 +402,14 @@ public class SearchJSUtils { return nameJavaScriptArrayList; } + private static void getChartJavaScriptFromGroup(NameJavaScriptGroup nameJavaScriptGroup, ArrayList nameJavaScriptArrayList) { + if (isNameJavaScriptGroupExist(nameJavaScriptGroup)) { + for (int j = 0; j < nameJavaScriptGroup.size(); j++) { + nameJavaScriptArrayList.add(nameJavaScriptGroup.getNameHyperlink(j)); + } + } + } + /** * 处理图表的交互属性(可能存在多种地图) * @param content 存储信息的数据结构 From 66bb13ad46dc56450189e5b6bfb57027bb4d3eda Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Thu, 21 Nov 2024 22:47:30 +0800 Subject: [PATCH 46/50] =?UTF-8?q?REPORT-141350=20=E3=80=90FVS=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?-=E5=8D=95=E5=85=83=E6=A0=BC-=E6=9D=A1=E4=BB=B6=E5=B1=9E?= =?UTF-8?q?=E6=80=A7-=E6=9D=A1=E4=BB=B6=E6=98=AF=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=97=EF=BC=8C=E6=97=A0=E6=B3=95=E8=AF=86=E5=88=AB=EF=BC=8C?= =?UTF-8?q?=E7=9C=8B=E4=B8=8B=E8=BF=99=E9=87=8C=E8=A6=81=E4=B8=8D=E8=A6=81?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index a9ad21fd2e..1230433459 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -10,6 +10,7 @@ import com.fr.data.TableReplacementEntity; import com.fr.data.condition.CommonCondition; import com.fr.data.condition.JoinCondition; import com.fr.data.condition.ListCondition; +import com.fr.data.condition.ObjectCondition; import com.fr.data.core.Compare; import com.fr.data.impl.NameTableData; import com.fr.data.impl.TableDataDictionary; @@ -338,6 +339,7 @@ public class ReplaceUtils { private static void replaceHighlight(Highlight highlight, List entities) { if (highlight instanceof DefaultHighlight) { DefaultHighlight defaultHighlight = (DefaultHighlight) highlight; + replaceCondition(defaultHighlight.getCondition(), entities); for (int i = 0 ; i < defaultHighlight.actionCount() ; i++) { if (defaultHighlight.getHighlightAction(i) instanceof PresentHighlightAction) { PresentHighlightAction action = (PresentHighlightAction) defaultHighlight.getHighlightAction(i); @@ -497,35 +499,45 @@ public class ReplaceUtils { //公式条件不需要修改,里面不会涉及到,有问题再加 //普通条件 //1条条件 - if (condition instanceof CommonCondition) { - dealWithTableDataNameChange((CommonCondition) condition, entity); - } + replaceSingleCondition(condition, entity); //N条条件 if (condition instanceof ListCondition) { for (int k = 0; k < ((ListCondition) condition).getJoinConditionCount(); k++) { JoinCondition joinCondition = ((ListCondition) condition).getJoinCondition(k); Condition obCondition = joinCondition.getCondition(); if (obCondition != null) { - if (obCondition instanceof CommonCondition) { - dealWithTableDataNameChange((CommonCondition) obCondition, entity); - } + replaceSingleCondition(obCondition, entity); } } } } } + private static void replaceSingleCondition(Condition condition, List entity) { + if (condition instanceof CommonCondition) { + dealWithTableDataNameChange((CommonCondition) condition, entity); + } + if (condition instanceof ObjectCondition) { + dealWithCompare(((ObjectCondition) condition).getCompare(), entity); + } + } + private static void dealWithTableDataNameChange(CommonCondition condition, List entities) { Compare compare = condition.getCompare(); - Object ob = compare.getValue(); - if (ob instanceof SimpleDSColumn) { - for (TableReplacementEntity entity : entities) { - if (ComparatorUtils.equals(((SimpleDSColumn) ob).getDsName(), entity.getOldName())) { - ((SimpleDSColumn) ob).setDsName(entity.getNewName()); - ((SimpleDSColumn) ob).setColumn(TableDataColumn.createColumn(entity.getTargetField(TableDataColumn.getColumnName(((SimpleDSColumn) ob).getColumn())))); + dealWithCompare(compare, entities); + } + + private static void dealWithCompare(Compare compare, List entities) { + if (compare != null) { + Object ob = compare.getValue(); + if (ob instanceof SimpleDSColumn) { + for (TableReplacementEntity entity : entities) { + if (ComparatorUtils.equals(((SimpleDSColumn) ob).getDsName(), entity.getOldName())) { + ((SimpleDSColumn) ob).setDsName(entity.getNewName()); + ((SimpleDSColumn) ob).setColumn(TableDataColumn.createColumn(entity.getTargetField(TableDataColumn.getColumnName(((SimpleDSColumn) ob).getColumn())))); + } } } - } } From b951fe136282302620a55864afe8146f6de8969f Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Mon, 25 Nov 2024 17:52:57 +0800 Subject: [PATCH 47/50] =?UTF-8?q?REPORT-141452=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=AD=98=E5=82=A8?= =?UTF-8?q?=E8=BF=87=E7=A8=8B=E7=9A=84=E6=95=B0=E6=8D=AE=E9=9B=86=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 1230433459..6d03f648cb 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -63,6 +63,7 @@ import com.fr.report.utils.ElementCaseHelper; import com.fr.stable.StringUtils; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -127,13 +128,7 @@ public class ReplaceUtils { Set ans = new HashSet<>(); FormElementCaseProvider provider = elementCaseEditor.getElementCase(); if (provider instanceof ElementCase) { - // 非公式部分 - ans.addAll(searchTableDataWithOutFormula((ElementCase)provider)); - // 公式部分——理论上就只有单元格和控件(超链那些都包含) - List formulaInfos = getElementCaseFormulas((ElementCase) provider); - ans.addAll(searchFormulaInfos(formulaInfos)); - // 超链部分 - ans.addAll(searchElementCasJs((ElementCase)provider)); + ans.addAll(searchElementCaseDependenceTables((ElementCase) provider)); } return ans; } @@ -168,10 +163,10 @@ public class ReplaceUtils { String tableName = iterator.next(); ans.add(tableName); } + ans.addAll(searchReport(workBook)); } return ans; } - /** * 获取CPT里使用的公式 * @@ -860,5 +855,32 @@ public class ReplaceUtils { return ans; } + private static Set searchReport(WorkBook workBook) { + Set ans = new HashSet<>(); + for (int i = 0; i < workBook.getReportCount(); i++) { + Report report = workBook.getReport(i); + if (report != null) { + Iterator it = report.iteratorOfElementCase(); + while (it.hasNext()) { + ElementCase elementCase = (ElementCase) it.next(); + ans.addAll(searchElementCaseDependenceTables(elementCase)); + } + } + } + return ans; + } + + + private static Collection searchElementCaseDependenceTables(ElementCase provider) { + Set ans = new HashSet<>(); + // 非公式部分 + ans.addAll(searchTableDataWithOutFormula(provider)); + // 公式部分——理论上就只有单元格和控件(超链那些都包含) + List formulaInfos = getElementCaseFormulas( provider); + ans.addAll(searchFormulaInfos(formulaInfos)); + // 超链部分 + ans.addAll(searchElementCasJs(provider)); + return ans; + } } From 9f9441e031f0c9b9f9cd6203537e904c32b69aa7 Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Tue, 26 Nov 2024 11:52:11 +0800 Subject: [PATCH 48/50] =?UTF-8?q?REPORT-142004=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E5=BD=93=E6=82=AC?= =?UTF-8?q?=E6=B5=AE=E5=9B=BE=E8=A1=A8=E7=94=A8=E5=88=B0=E4=BA=86=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E8=BF=87=E7=A8=8B=E6=95=B0=E6=8D=AE=E9=9B=86=EF=BC=8C?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/replace/utils/ReplaceUtils.java | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 6d03f648cb..8d62f3c18d 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -48,6 +48,7 @@ import com.fr.js.NameJavaScriptGroup; import com.fr.main.impl.WorkBook; import com.fr.main.parameter.ReportParameterAttr; import com.fr.report.cell.CellElement; +import com.fr.report.cell.Elem; import com.fr.report.cell.FloatElement; import com.fr.report.cell.TemplateCellElement; import com.fr.report.cell.cellattr.core.group.DSColumn; @@ -701,7 +702,7 @@ public class ReplaceUtils { // 处理【形态、控件、数据字典】 ans.addAll(searchPresentAndDictionary(cell)); // 处理【单元格值】 - ans.addAll(searchCellValue(cell)); + ans.addAll(searchElemValue(cell)); // 处理【条件属性】 ans.addAll(searchCellHighlight(cell)); } @@ -758,7 +759,7 @@ public class ReplaceUtils { return ans; } - private static Set searchCellValue(CellElement cell) { + private static Set searchElemValue(Elem cell) { Set ans = new HashSet<>(); Object value = cell.getValue(); if (value instanceof DSColumn) { @@ -880,7 +881,27 @@ public class ReplaceUtils { ans.addAll(searchFormulaInfos(formulaInfos)); // 超链部分 ans.addAll(searchElementCasJs(provider)); + // 悬浮元素 + ans.addAll(searchFloat(provider)); return ans; } + private static Set searchFloat(ElementCase provider) { + Set ans = new HashSet<>(); + Iterator flotIt = provider.floatIterator(); + while (flotIt.hasNext()) { + FloatElement flotEl = (FloatElement) flotIt.next(); + // 值 + ans.addAll(searchElemValue(flotEl)); + // 超链 + ans.addAll(searchFloatJs(flotEl)); + } + return ans; + } + + private static Set searchFloatJs(FloatElement flotEl) { + List javaScripts = new ArrayList<>(SearchJSUtils.getJSDependenceTables(flotEl)); + return new HashSet<>(searchJs(javaScripts)); + } + } From 4fe2c97f1c79e74cd63cf5d85c0e7cfe528facdd Mon Sep 17 00:00:00 2001 From: "Destiny.Lin" Date: Wed, 27 Nov 2024 14:09:19 +0800 Subject: [PATCH 49/50] =?UTF-8?q?REPORT-142093=20=E3=80=90=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E9=9B=86=E6=9B=BF=E6=8D=A2=E3=80=91=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E6=A0=91=E4=B8=AD=EF=BC=8C=E5=A6=82=E6=9E=9C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=9B=86=E5=AD=98=E5=9C=A8=E4=BE=9D=E8=B5=96=E5=B1=82=E7=BA=A7?= =?UTF-8?q?=EF=BC=8C=E5=AD=97=E6=AE=B5=E6=B2=A1=E6=9C=89=E6=9B=BF=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/actions/replace/utils/ReplaceUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java index 8d62f3c18d..b99f7ae363 100644 --- a/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java +++ b/designer-realize/src/main/java/com/fr/design/actions/replace/utils/ReplaceUtils.java @@ -39,6 +39,7 @@ import com.fr.form.ui.TreeEditor; import com.fr.form.ui.Widget; import com.fr.form.ui.concept.data.ValueInitializer; import com.fr.form.ui.tree.LayerConfig; +import com.fr.form.ui.tree.LayerDependence; import com.fr.general.ComparatorUtils; import com.fr.general.data.Condition; import com.fr.general.data.TableDataColumn; @@ -629,6 +630,9 @@ public class ReplaceUtils { layerConfig.setTableData(new NameTableData(entity.getNewName())); layerConfig.setViewColumn(entity.getTargetIndex(layerConfig.getViewColumn())); layerConfig.setModelColumn(entity.getTargetIndex(layerConfig.getModelColumn())); + for (LayerDependence dependence : layerConfig.getDependenceList()) { + dependence.setThisColumnIndex(entity.getTargetIndex(dependence.getThisColumnIndex())); + } } } ElementCaseHelper.replaceTableDataDictionary(layerConfig.getDictionary(), (NameTableData) layerConfig.getDictionary().getTableData(), entities); From cc8a358bee5fb680e88b1fb1e78712151670540b Mon Sep 17 00:00:00 2001 From: obo Date: Thu, 28 Nov 2024 17:37:45 +0800 Subject: [PATCH 50/50] =?UTF-8?q?REPORT-142226=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E6=94=AF=E6=8C=81=E8=B6=8A=E5=8D=97=E8=AF=AD=E5=92=8C?= =?UTF-8?q?=E5=8D=B0=E5=B0=BC=E8=AF=AD=E6=9B=B4=E6=96=B0=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E6=8F=90final?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/locale/impl/SupportLocaleImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java b/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java index 0373dad033..afb14633b5 100644 --- a/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java +++ b/designer-base/src/main/java/com/fr/design/locale/impl/SupportLocaleImpl.java @@ -1,5 +1,6 @@ package com.fr.design.locale.impl; +import com.fr.general.locale.LocaleConstants; import com.fr.general.locale.SupportLocale; import java.util.HashSet; @@ -169,6 +170,8 @@ public enum SupportLocaleImpl implements SupportLocale { set.add(Locale.KOREA); set.add(Locale.CHINA); set.add(Locale.TAIWAN); + set.add(LocaleConstants.IN_ID); + set.add(LocaleConstants.VI); return set; } }