From ed4b3ee816760f13a2ef0a264db34836870f9ed9 Mon Sep 17 00:00:00 2001 From: "LAPTOP-SB56SG4Q\\86185" Date: Fri, 10 Sep 2021 11:10:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BC=80=E6=BA=90=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=9D=90=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JSD-8210 -需求确认书V1.1.docx | Bin 0 -> 61240 bytes README.md | 5 +- plugin.xml | 26 ++++ .../java/com/fr/plugin/xxx/report/Alias.java | 19 +++ .../com/fr/plugin/xxx/report/CSSImporter.java | 17 +++ .../java/com/fr/plugin/xxx/report/Init.java | 23 +++ .../com/fr/plugin/xxx/report/JSImporter.java | 22 +++ .../java/com/fr/plugin/xxx/report/Server.java | 71 +++++++++ .../fr/plugin/xxx/report/ServerBridge.java | 18 +++ .../xxx/report/SheetControlActorBridge.java | 17 +++ .../report/SpReportSessionHelpProvider.java | 40 +++++ .../xxx/report/actor/SheetControlActor.java | 83 ++++++++++ .../xxx/report/core/BuilderProvider.java | 21 +++ .../fr/plugin/xxx/report/core/DsUtils.java | 93 ++++++++++++ .../xxx/report/core/RelationBuilder.java | 48 ++++++ .../xxx/report/core/SPTemplateReportlet.java | 36 +++++ .../xxx/report/core/SheetNameBuilder.java | 38 +++++ .../xxx/report/core/ViewSheetBuilder.java | 53 +++++++ .../xxx/report/core/ViewWidgetBuilder.java | 55 +++++++ .../report/creator/SPReportletCreator.java | 37 +++++ .../xxx/report/link/ReportletCreator.java | 90 +++++++++++ .../com/fr/plugin/xxx/report/main.css | 0 .../com/fr/plugin/xxx/report/main.js | 143 ++++++++++++++++++ 23 files changed, 954 insertions(+), 1 deletion(-) create mode 100644 JSD-8210 -需求确认书V1.1.docx create mode 100644 plugin.xml create mode 100644 src/main/java/com/fr/plugin/xxx/report/Alias.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/CSSImporter.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/Init.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/JSImporter.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/Server.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/ServerBridge.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/SheetControlActorBridge.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/SpReportSessionHelpProvider.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/actor/SheetControlActor.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/core/BuilderProvider.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/core/DsUtils.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/core/RelationBuilder.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/core/SPTemplateReportlet.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/core/SheetNameBuilder.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/core/ViewSheetBuilder.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/core/ViewWidgetBuilder.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/creator/SPReportletCreator.java create mode 100644 src/main/java/com/fr/plugin/xxx/report/link/ReportletCreator.java create mode 100644 src/main/resources/com/fr/plugin/xxx/report/main.css create mode 100644 src/main/resources/com/fr/plugin/xxx/report/main.js diff --git a/JSD-8210 -需求确认书V1.1.docx b/JSD-8210 -需求确认书V1.1.docx new file mode 100644 index 0000000000000000000000000000000000000000..56060e3629dd7b7fd0ff3d1338fda8aeaf1e7775 GIT binary patch literal 61240 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 U4gdfzGJp>fC?KGR?Wgbl53e{pl>h($ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 57fa753..f2914a1 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # open-JSD-8210 -JSD-8210开源任务材料 \ No newline at end of file +JSD-8210 开源任务材料\ +免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ +仅作为开发者学习参考使用!禁止用于任何商业用途!\ +为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 \ No newline at end of file diff --git a/plugin.xml b/plugin.xml new file mode 100644 index 0000000..a135ecd --- /dev/null +++ b/plugin.xml @@ -0,0 +1,26 @@ + + com.fr.plugin.xxx.report + + yes + 1.3.4 + 10.0~10.0 + fr.open + 2018-04-01 + + + com.fr.plugin.xxx.report + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/fr/plugin/xxx/report/Alias.java b/src/main/java/com/fr/plugin/xxx/report/Alias.java new file mode 100644 index 0000000..6c6cadb --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/Alias.java @@ -0,0 +1,19 @@ +package com.fr.plugin.xxx.report; + +import com.fr.decision.fun.impl.AbstractURLAliasProvider; +import com.fr.decision.webservice.url.alias.URLAlias; +import com.fr.decision.webservice.url.alias.URLAliasFactory; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-17 + **/ +public class Alias extends AbstractURLAliasProvider { + @Override + public URLAlias[] registerAlias() { + return new URLAlias[]{ + URLAliasFactory.createPluginAlias( Server.URI, Server.URI, true), + }; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/CSSImporter.java b/src/main/java/com/fr/plugin/xxx/report/CSSImporter.java new file mode 100644 index 0000000..9534327 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/CSSImporter.java @@ -0,0 +1,17 @@ +package com.fr.plugin.xxx.report; + +import com.fr.stable.fun.impl.AbstractCssFileHandler; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-03 + **/ +public class CSSImporter extends AbstractCssFileHandler { + @Override + public String[] pathsForFiles() { + return new String[]{ + "/com/fr/plugin/deqing/report/main.css" + }; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/Init.java b/src/main/java/com/fr/plugin/xxx/report/Init.java new file mode 100644 index 0000000..eccc7cf --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/Init.java @@ -0,0 +1,23 @@ +package com.fr.plugin.xxx.report; + +import com.fr.plugin.context.PluginContext; +import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +public class Init extends AbstractPluginLifecycleMonitor { + + public Init(){ + } + + @Override + public void afterRun(PluginContext pluginContext) { + } + + @Override + public void beforeStop(PluginContext pluginContext) { + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/JSImporter.java b/src/main/java/com/fr/plugin/xxx/report/JSImporter.java new file mode 100644 index 0000000..f451139 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/JSImporter.java @@ -0,0 +1,22 @@ +package com.fr.plugin.xxx.report; + +import com.fr.plugin.transform.ExecuteFunctionRecord; +import com.fr.plugin.transform.FunctionRecorder; +import com.fr.stable.fun.impl.AbstractJavaScriptFileHandler; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +@FunctionRecorder +public class JSImporter extends AbstractJavaScriptFileHandler { + + @Override + @ExecuteFunctionRecord + public String[] pathsForFiles() { + return new String[]{ + "/com/fr/plugin/xxx/report/main.js" + }; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/Server.java b/src/main/java/com/fr/plugin/xxx/report/Server.java new file mode 100644 index 0000000..7654c7a --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/Server.java @@ -0,0 +1,71 @@ +package com.fr.plugin.xxx.report; + +import com.fr.decision.fun.impl.BaseHttpHandler; +import com.fr.json.JSONArray; +import com.fr.json.JSONObject; +import com.fr.log.FineLoggerFactory; +import com.fr.main.TemplateWorkBook; +import com.fr.plugin.xxx.report.core.DsUtils; +import com.fr.script.Calculator; +import com.fr.third.springframework.web.bind.annotation.RequestMethod; +import com.fr.web.core.ReportSessionIDInfor; +import com.fr.web.core.SessionPoolManager; +import com.fr.web.utils.WebUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-17 + **/ +public class Server extends BaseHttpHandler { + + public final static String URI = "/sheet/info"; + + @Override + public RequestMethod getMethod() { + return RequestMethod.GET; + } + + @Override + public String getPath() { + return URI; + } + + @Override + public boolean isPublic() { + return true; + } + + @Override + public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { + FineLoggerFactory.getLogger().info("##### /sheet/info start..."); + String sid = WebUtils.getHTTPRequestParameter(req,"sessionId"); + FineLoggerFactory.getLogger().info("##### sid={}",sid); + ReportSessionIDInfor info = SessionPoolManager.getSessionIDInfor(sid, ReportSessionIDInfor.class); + Calculator cal = info.createSessionCalculator(req,res); + TemplateWorkBook book = info.getWorkBookDefine(); + FineLoggerFactory.getLogger().info("##### book={}",book.toString()); + Map relation = DsUtils.getRelation("CONF_SHEET","id","name", book,cal); + JSONArray result = JSONArray.create(); + FineLoggerFactory.getLogger().info("##### book.length={}",book.getReportCount()); + for( int i=0,len=book.getReportCount();i relation = DsUtils.getRelation("CONF_SHEET_GROUP", "id", "group", book, request); + String groupId = (String) request.getParameter("__sheet_group__"); + String [] group = split( relation.get(groupId), ","); + if( 0 == group.length ){ + return array; + } + JSONArray result = JSONArray.create(); + for (int i = 0; i < array.size(); i++) { + JSONObject obj = array.getJSONObject(i); + if(!obj.has("title")){ + continue; + } + if(ArrayUtils.contains(group,obj.getString("title")) ){ + result.add(obj); + } + } + return result; + } + + protected String[] split( String record , String sep ){ + if( StringUtils.isEmpty( record ) ){ + return new String[0]; + } + String [] group = new String[]{record}; + if( record.contains(sep) ){ + group = record.split(sep); + } + return group; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/core/BuilderProvider.java b/src/main/java/com/fr/plugin/xxx/report/core/BuilderProvider.java new file mode 100644 index 0000000..366e44b --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/core/BuilderProvider.java @@ -0,0 +1,21 @@ +package com.fr.plugin.xxx.report.core; + +import com.fr.main.TemplateWorkBook; +import com.fr.web.request.ReportletRequest; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +public abstract class BuilderProvider { + + /** + * 通过这个方法对模板的不同部分进行调整 + * @param book + * @param request + */ + public abstract void build(TemplateWorkBook book, ReportletRequest request )throws Exception; + + +} diff --git a/src/main/java/com/fr/plugin/xxx/report/core/DsUtils.java b/src/main/java/com/fr/plugin/xxx/report/core/DsUtils.java new file mode 100644 index 0000000..b558673 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/core/DsUtils.java @@ -0,0 +1,93 @@ +package com.fr.plugin.xxx.report.core; + +import com.fr.base.ParameterMapNameSpace; +import com.fr.base.SynchronizedLiveDataModelUtils; +import com.fr.base.TableData; +import com.fr.data.TableDataSource; +import com.fr.data.api.TableDataAssist; +import com.fr.general.data.DataModel; +import com.fr.main.TemplateWorkBook; +import com.fr.script.Calculator; +import com.fr.stable.ParameterProvider; +import com.fr.web.request.ReportletRequest; + +import java.util.HashMap; +import java.util.Map; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +public final class DsUtils { + private DsUtils(){} + + private final static Calculator initCalculator(TemplateWorkBook book){ + Calculator calculator = Calculator.createCalculator(); + calculator.setAttribute(TableDataSource.KEY,book); + return calculator; + } + + private final static void initParameter(Calculator calculator,TableData ds,ReportletRequest request){ + Map parameters = new HashMap(); + ParameterProvider[] ps = ds.getParameters(calculator); + for( ParameterProvider p : ps ){ + String pname = p.getName(); + Object v = request.getParameter(pname); + if( null != v ){ + parameters.put(pname, v); + } + } + ParameterMapNameSpace space = ParameterMapNameSpace.create(parameters); + calculator.pushNameSpace(space); + } + + public static DataModel getDataModel(TemplateWorkBook book, ReportletRequest request, String dsName ){ + Calculator calculator = initCalculator(book); + TableData ds = TableDataAssist.getTableData(calculator, dsName); + initParameter(calculator,ds,request); + DataModel dm = SynchronizedLiveDataModelUtils.getSELiveDataModel4Share(calculator, dsName); + if ( null == dm ) { + dm = ds == null ? null : ds.createDataModel(calculator); + } + return dm; + } + + public static DataModel getDataModel(TemplateWorkBook book, Calculator calculator, String dsName ){ + TableData ds = TableDataAssist.getTableData(calculator, dsName); + DataModel dm = SynchronizedLiveDataModelUtils.getSELiveDataModel4Share(calculator, dsName); + if ( null == dm ) { + dm = ds == null ? null : ds.createDataModel(calculator); + } + return dm; + } + + public static Map getRelation(String dsName, String keyCol, String valueCol, TemplateWorkBook book, Calculator cal){ + Map rt = new HashMap(); + try{ + DataModel dm = getDataModel(book,cal,dsName); + int vIdx = dm.getColumnIndex(valueCol); + int kIdx = dm.getColumnIndex(keyCol); + for( int i=0,len=dm.getRowCount();i getRelation(String dsName, String keyCol, String valueCol, TemplateWorkBook book, ReportletRequest request){ + Map rt = new HashMap(); + try{ + DataModel dm = getDataModel(book,request,dsName); + int vIdx = dm.getColumnIndex(valueCol); + int kIdx = dm.getColumnIndex(keyCol); + for( int i=0,len=dm.getRowCount();i relation)throws Exception; + + @Override + public void build(TemplateWorkBook book, ReportletRequest request )throws Exception{ + if( !accept(book,request) ){ + return; + } + Map relation = DsUtils.getRelation(dsName, colKey, colValue, book, request); + build(book,request,relation); + } + + protected String[] split( String record , String sep ){ + if( StringUtils.isEmpty( record ) ){ + return new String[0]; + } + String [] group = new String[]{record}; + if( record.contains(sep) ){ + group = record.split(sep); + } + return group; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/core/SPTemplateReportlet.java b/src/main/java/com/fr/plugin/xxx/report/core/SPTemplateReportlet.java new file mode 100644 index 0000000..06dc3a9 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/core/SPTemplateReportlet.java @@ -0,0 +1,36 @@ +package com.fr.plugin.xxx.report.core; + +import com.fr.main.TemplateWorkBook; +import com.fr.web.WebletException; +import com.fr.web.reportlet.TemplateReportlet; +import com.fr.web.request.ReportletRequest; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +public class SPTemplateReportlet extends TemplateReportlet { + + public SPTemplateReportlet(String path) { + super(path); + } + + private final static BuilderProvider[] builders = new BuilderProvider[]{ + new ViewSheetBuilder("CONF_SHEET_GROUP","id","group"), + new ViewWidgetBuilder("CONF_WIDGET","id","group")//, + //new SheetNameBuilder("CONF_SHEET","id","name") + }; + + @Override + public TemplateWorkBook createReport( ReportletRequest request ) throws WebletException{ + TemplateWorkBook book = super.createReport(request); + for( BuilderProvider builder : builders ){ + try{ + builder.build(book,request); + }catch(Exception e){ + } + } + return book; + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/core/SheetNameBuilder.java b/src/main/java/com/fr/plugin/xxx/report/core/SheetNameBuilder.java new file mode 100644 index 0000000..9ee7044 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/core/SheetNameBuilder.java @@ -0,0 +1,38 @@ +package com.fr.plugin.xxx.report.core; + +import com.fr.main.TemplateWorkBook; +import com.fr.web.request.ReportletRequest; + +import java.util.Map; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + * 设置每个sheet的名称的构建适配器 + **/ +public class SheetNameBuilder extends RelationBuilder { + + public SheetNameBuilder(String dsName, String colKey, String colValue) { + super(dsName, colKey, colValue); + } + + @Override + protected boolean accept(TemplateWorkBook book, ReportletRequest request) throws Exception { + return true; + } + + @Override + protected void build(TemplateWorkBook book, ReportletRequest request, Map relation) throws Exception { + if( relation.isEmpty() ){ + return; + } + for(int i=0,len=book.getReportCount();i relation) throws Exception { + String groupId = (String)request.getParameter("__SHEET_GROUP__"); + String [] group = split( relation.get(groupId), ","); + if( 0 == group.length ){ + return; + } + List dels = new ArrayList(); + for(int i=0,len=book.getReportCount();i relation) throws Exception { + String groupId = (String)request.getParameter("__WIDGET_GROUP__"); + String [] group = split( relation.get(groupId), ","); + if( 0 == group.length ){ + return; + } + int count = book.getReportCount(); + for( int i=0; i cells = sheet.cellIterator(); + while (cells.hasNext() ){ + AbstractWidgetCellElement cell = cells.next(); + Widget widget = cell.getWidget(); + if( null != widget && !ArrayUtils.contains(group,widget.getWidgetName())){ + cell.setWidget(null); + } + } + } +} diff --git a/src/main/java/com/fr/plugin/xxx/report/creator/SPReportletCreator.java b/src/main/java/com/fr/plugin/xxx/report/creator/SPReportletCreator.java new file mode 100644 index 0000000..1d814dd --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/creator/SPReportletCreator.java @@ -0,0 +1,37 @@ +package com.fr.plugin.xxx.report.creator; + +import com.fr.data.NetworkHelper; +import com.fr.general.ComparatorUtils; +import com.fr.plugin.xxx.report.core.SPTemplateReportlet; +import com.fr.plugin.xxx.report.link.ReportletCreator; +import com.fr.stable.web.TemplatePathNode; +import com.fr.stable.web.Weblet; +import com.fr.web.reportlet.OldWeblet; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +public class SPReportletCreator extends ReportletCreator { + public static final SPReportletCreator KEY = new SPReportletCreator(); + + @Override + public Weblet createWebletByRequest(HttpServletRequest req, HttpServletResponse res){ + TemplatePathNode pathNode = queryPath(req); + String reportlet = pathNode.getPath(); + if (oldWebletOrServletCheck(req, pathNode)) { + return OldWeblet.asOldReportlet(reportlet); + } + // 暂时兼容cptx从cpt格式中读取 + if (ComparatorUtils.equals(NetworkHelper.getHTTPRequestParameter(req, FORMAT), X)) { + return new SPTemplateReportlet(reportlet + X); + } + return new SPTemplateReportlet(reportlet); + } + + +} diff --git a/src/main/java/com/fr/plugin/xxx/report/link/ReportletCreator.java b/src/main/java/com/fr/plugin/xxx/report/link/ReportletCreator.java new file mode 100644 index 0000000..6911f56 --- /dev/null +++ b/src/main/java/com/fr/plugin/xxx/report/link/ReportletCreator.java @@ -0,0 +1,90 @@ +package com.fr.plugin.xxx.report.link; + +import com.fr.base.extension.FileExtension; +import com.fr.data.NetworkHelper; +import com.fr.general.ComparatorUtils; +import com.fr.stable.ActorConstants; +import com.fr.stable.ActorFactory; +import com.fr.stable.web.*; +import com.fr.web.reportlet.EmbeddedTplReportlet; +import com.fr.web.reportlet.OldWeblet; +import com.fr.web.reportlet.TemplateReportlet; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +public class ReportletCreator extends AbstractWebletCreator { + + public static final ReportletCreator KEY = new ReportletCreator(); + /** + * hugh:直接把10.0的report-engine的ReportletCreator的代码复制过来,把构造改成public即可 + * 以后如果产品的ReportletCreator发生了变更,同样要copy过来 + */ + public ReportletCreator() { + + } + + @Override + public TemplatePathMarker[] queryPathMarker() { + return new TemplatePathMarker[]{PathMarkerImpl.VIEWLET, PathMarkerImpl.REPORTLET}; + } + + @Override + public FileExtension suffix() { + return FileExtension.CPT; + } + + /** + * 通过http请求构造Weblet + * + * @param req http请求 + * @param res http应答 + * @return 构造的Weblet + * @throws Exception + */ + @Override + public Weblet createWebletByRequest(HttpServletRequest req, HttpServletResponse res) { + TemplatePathNode pathNode = queryPath(req); + String reportlet = pathNode.getPath(); + if (oldWebletOrServletCheck(req, pathNode)) { + return OldWeblet.asOldReportlet(reportlet); + } + // 暂时兼容cptx从cpt格式中读取 + if (ComparatorUtils.equals(NetworkHelper.getHTTPRequestParameter(req, FORMAT), X)) { + return new TemplateReportlet(reportlet + X); + } + return new TemplateReportlet(reportlet); + } + + /** + * 根据模板路径生成合适的Weblet + * + * @param tplPath 模板路径模板名 + * @param parameterMap 参数 + * @return 构造的Weblet + * @throws Exception + */ + @Override + public Weblet createEmbeddedWeblet(String tplPath, Map parameterMap) { + if (tplPath == null || !matchReportTpl(tplPath)) { + return null; + } + return new EmbeddedTplReportlet(tplPath, ActorFactory.getActor(ActorConstants.TYPE_PAGE), parameterMap); + } + + /** + * 是否是报表模板 + * + * @param tplPath 模板路径 + * @return 如果是报表模板返回true,否则false + */ + private boolean matchReportTpl(String tplPath) { + return FileExtension.CPT.matchExtension(tplPath); + } +} diff --git a/src/main/resources/com/fr/plugin/xxx/report/main.css b/src/main/resources/com/fr/plugin/xxx/report/main.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/com/fr/plugin/xxx/report/main.js b/src/main/resources/com/fr/plugin/xxx/report/main.js new file mode 100644 index 0000000..aaec606 --- /dev/null +++ b/src/main/resources/com/fr/plugin/xxx/report/main.js @@ -0,0 +1,143 @@ +/** + * @author 秃破天际 + * @version 10.0 + * Created by 秃破天际 on 2020-04-01 + **/ +!(function () { + window.onload = function(){ + var getQueryVariable = function(variable) { + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i").addClass("hg-list-item").addClass(lv) + .append($("").html(item.name)); + $item.click(function (e) { + FR.SheetController.selectSheetByID(item.id); + setActive(idx); + }); + return $item; + }; + $.extend(FR,{SheetController:{ + /** + * 通过sheet名称切换到指定sheet + * @param name + */ + selectSheetByID: function ( id ) { + var self = this; + if( isWritePlus() ){ + var list = getSheetList(); + list.forEach(function(item,index){ + if( item.id == id ){ + _g().sheetContainer.selectSheet(index); + } + }); + }else{ + _g().$contentPane.data("TabPane").selectTabByName(id); + } + }, + init:function () { + debugger; + var list = getSheetList(); + if( typeof list == "undefined" || list.length <= 1 ){ + return ; + } + var $wrap = $("
").addClass("hg-sheet-ctrl-wrap").appendTo("body"); + var $sideBtn = $("
").addClass("hg-side-hotspot").appendTo($wrap); + var $guidepost = $("
").addClass("hg-guidepost").appendTo($wrap); + var $list = $("
").addClass("hg-list").addClass("hg-card").appendTo($wrap); + $list.hide(); + var showList = function (e) { + var idx = getActiveSheet(); + setActive(idx); + $list.show(); + $guidepost.hide(); + }; + var hideList = function (e) { + $list.hide(); + $guidepost.show(); + }; + $sideBtn.mousemove(showList); + $guidepost.click(showList); + $list.mouseleave(hideList); + var item_height = parseInt(document.body.clientHeight/list.length); + list.forEach(function(item,index){ + var $item = initSheetItem(item,item_height,index).appendTo($list); + items.push($item); + $item.click(hideList); + }); + } + }}); + FR.SheetController.init(); + }; +})(); \ No newline at end of file