LAPTOP-SB56SG4Q\86185
3 years ago
23 changed files with 954 additions and 1 deletions
Binary file not shown.
@ -1,3 +1,6 @@ |
|||||||
# open-JSD-8210 |
# open-JSD-8210 |
||||||
|
|
||||||
JSD-8210开源任务材料 |
JSD-8210 开源任务材料\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系hugh处理。 |
@ -0,0 +1,26 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin> |
||||||
|
<id>com.fr.plugin.xxx.report</id> |
||||||
|
<name><![CDATA[ 模板预览定制 ]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>1.3.4</version> |
||||||
|
<env-version>10.0~10.0</env-version> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<jartime>2018-04-01</jartime> |
||||||
|
<description><![CDATA[ ]]></description> |
||||||
|
<change-notes><![CDATA[ |
||||||
|
]]></change-notes> |
||||||
|
<main-package>com.fr.plugin.xxx.report</main-package> |
||||||
|
<function-recorder class="com.fr.plugin.xxx.report.JSImporter"/> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.xxx.report.Init"/> |
||||||
|
<extra-core> |
||||||
|
<CssFileHandler class="com.fr.plugin.xxx.report.CSSImporter"/> |
||||||
|
<JavaScriptFileHandler class="com.fr.plugin.xxx.report.JSImporter"/> |
||||||
|
</extra-core> |
||||||
|
<extra-decision> |
||||||
|
<HttpHandlerProvider class="com.fr.plugin.xxx.report.ServerBridge"/> |
||||||
|
<URLAliasProvider class="com.fr.plugin.xxx.report.Alias"/> |
||||||
|
</extra-decision> |
||||||
|
<extra-report> |
||||||
|
<ActorProvider class="com.fr.plugin.xxx.report.SheetControlActorBridge"/> |
||||||
|
</extra-report> |
||||||
|
</plugin> |
@ -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), |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -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" |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -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) { |
||||||
|
} |
||||||
|
} |
@ -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" |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -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<String,String> 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<len;i++ ){ |
||||||
|
String id = book.getReportName(i); |
||||||
|
FineLoggerFactory.getLogger().info("##### id[{}]={}",i,id); |
||||||
|
JSONObject item = JSONObject.create().put("id",id); |
||||||
|
if( relation.containsKey(id) ){ |
||||||
|
FineLoggerFactory.getLogger().info("##### name[{}]={}",i,relation.get(id)); |
||||||
|
item.put("name",relation.get(id)); |
||||||
|
}else{ |
||||||
|
FineLoggerFactory.getLogger().info("##### name[{}]={}",i,id); |
||||||
|
item.put("name",id); |
||||||
|
} |
||||||
|
result.put(item); |
||||||
|
} |
||||||
|
FineLoggerFactory.getLogger().info("##### result={}",result.toString()); |
||||||
|
WebUtils.flushSuccessMessageAutoClose(req,res,result); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,18 @@ |
|||||||
|
package com.fr.plugin.xxx.report; |
||||||
|
|
||||||
|
import com.fr.decision.fun.HttpHandler; |
||||||
|
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author 秃破天际 |
||||||
|
* @version 10.0 |
||||||
|
* Created by 秃破天际 on 2020-04-17 |
||||||
|
**/ |
||||||
|
public class ServerBridge extends AbstractHttpHandlerProvider { |
||||||
|
@Override |
||||||
|
public HttpHandler[] registerHandlers() { |
||||||
|
return new HttpHandler[]{ |
||||||
|
new Server() |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.fr.plugin.xxx.report; |
||||||
|
|
||||||
|
import com.fr.plugin.xxx.report.actor.SheetControlActor; |
||||||
|
import com.fr.report.fun.impl.AbstractActorProvider; |
||||||
|
import com.fr.report.stable.fun.Actor; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author fr.open |
||||||
|
* @Date 2021/7/14 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class SheetControlActorBridge extends AbstractActorProvider { |
||||||
|
@Override |
||||||
|
public Actor[] createActor() { |
||||||
|
return new Actor[]{new SheetControlActor()}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,40 @@ |
|||||||
|
package com.fr.plugin.xxx.report; |
||||||
|
|
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.main.TemplateWorkBook; |
||||||
|
import com.fr.plugin.xxx.report.core.BuilderProvider; |
||||||
|
import com.fr.plugin.xxx.report.core.ViewSheetBuilder; |
||||||
|
import com.fr.plugin.xxx.report.core.ViewWidgetBuilder; |
||||||
|
import com.fr.report.fun.impl.AbstractReportSessionHelpProvider; |
||||||
|
import com.fr.stable.web.Repository; |
||||||
|
import com.fr.web.core.ReportSessionIDInfor; |
||||||
|
import com.fr.web.core.SessionPoolManager; |
||||||
|
import com.fr.web.request.AbstractReportletRequest; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author fr.open |
||||||
|
* @Date 2021/7/8 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class SpReportSessionHelpProvider extends AbstractReportSessionHelpProvider { |
||||||
|
|
||||||
|
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 void dealWithSession(Repository repository) { |
||||||
|
String sessionID = repository.getSessionID(); |
||||||
|
ReportSessionIDInfor session = SessionPoolManager.getSessionIDInfor(sessionID, ReportSessionIDInfor.class); |
||||||
|
TemplateWorkBook book = session.getWorkBookDefine(); |
||||||
|
for (BuilderProvider builder : builders) { |
||||||
|
try { |
||||||
|
builder.build(book, AbstractReportletRequest.getInstance(repository.getHttpServletRequest())); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(),e); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,83 @@ |
|||||||
|
package com.fr.plugin.xxx.report.actor; |
||||||
|
|
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.main.TemplateWorkBook; |
||||||
|
import com.fr.main.workbook.ResultWorkBook; |
||||||
|
import com.fr.plugin.xxx.report.core.BuilderProvider; |
||||||
|
import com.fr.plugin.xxx.report.core.DsUtils; |
||||||
|
import com.fr.plugin.xxx.report.core.ViewSheetBuilder; |
||||||
|
import com.fr.plugin.xxx.report.core.ViewWidgetBuilder; |
||||||
|
import com.fr.report.core.sheet.SheetSequenceExecutor; |
||||||
|
import com.fr.stable.ArrayUtils; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.WriteActor; |
||||||
|
import com.fr.stable.web.Repository; |
||||||
|
import com.fr.web.RepositoryHelper; |
||||||
|
import com.fr.web.core.ReportSession; |
||||||
|
import com.fr.web.request.AbstractReportletRequest; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @Author fr.open |
||||||
|
* @Date 2021/7/14 |
||||||
|
* @Description |
||||||
|
**/ |
||||||
|
public class SheetControlActor extends WriteActor { |
||||||
|
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 ResultWorkBook executeWorkBook(TemplateWorkBook book, Map parameterMap) { |
||||||
|
for (BuilderProvider builder : builders) { |
||||||
|
try { |
||||||
|
builder.build(book,AbstractReportletRequest.getInstance(parameterMap)); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(),e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return new SheetSequenceExecutor(book, parameterMap).execute(this); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public JSONArray processMultipleSheet(Repository repository) { |
||||||
|
JSONArray array = super.processMultipleSheet(repository); |
||||||
|
ReportSession session = (ReportSession) RepositoryHelper.getSessionIDInfor(repository); |
||||||
|
TemplateWorkBook book = session.getWorkBookDefine(); |
||||||
|
AbstractReportletRequest request = AbstractReportletRequest.getInstance(repository.getHttpServletRequest()); |
||||||
|
Map<String, String> 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; |
||||||
|
} |
||||||
|
} |
@ -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; |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -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<String,Object> parameters = new HashMap<String,Object>(); |
||||||
|
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<String,String> getRelation(String dsName, String keyCol, String valueCol, TemplateWorkBook book, Calculator cal){ |
||||||
|
Map<String,String> rt = new HashMap<String,String>(); |
||||||
|
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<len;i++ ){ |
||||||
|
rt.put( (String)dm.getValueAt( i, kIdx), (String)dm.getValueAt( i, vIdx) ); |
||||||
|
} |
||||||
|
}catch(Exception e){ |
||||||
|
} |
||||||
|
return rt; |
||||||
|
} |
||||||
|
|
||||||
|
public static Map<String,String> getRelation(String dsName, String keyCol, String valueCol, TemplateWorkBook book, ReportletRequest request){ |
||||||
|
Map<String,String> rt = new HashMap<String,String>(); |
||||||
|
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<len;i++ ){ |
||||||
|
rt.put( (String)dm.getValueAt( i, kIdx), (String)dm.getValueAt( i, vIdx) ); |
||||||
|
} |
||||||
|
}catch(Exception e){ |
||||||
|
} |
||||||
|
return rt; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package com.fr.plugin.xxx.report.core; |
||||||
|
|
||||||
|
import com.fr.main.TemplateWorkBook; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.web.request.ReportletRequest; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author 秃破天际 |
||||||
|
* @version 10.0 |
||||||
|
* Created by 秃破天际 on 2020-04-03 |
||||||
|
**/ |
||||||
|
public abstract class RelationBuilder extends BuilderProvider { |
||||||
|
|
||||||
|
private String dsName; |
||||||
|
private String colKey; |
||||||
|
private String colValue; |
||||||
|
|
||||||
|
public RelationBuilder( String dsName, String colKey, String colValue ){ |
||||||
|
this.dsName = dsName; |
||||||
|
this.colKey = colKey; |
||||||
|
this.colValue = colValue; |
||||||
|
} |
||||||
|
protected abstract boolean accept(TemplateWorkBook book, ReportletRequest request)throws Exception; |
||||||
|
|
||||||
|
protected abstract void build(TemplateWorkBook book, ReportletRequest request,Map<String, String> relation)throws Exception; |
||||||
|
|
||||||
|
@Override |
||||||
|
public void build(TemplateWorkBook book, ReportletRequest request )throws Exception{ |
||||||
|
if( !accept(book,request) ){ |
||||||
|
return; |
||||||
|
} |
||||||
|
Map<String, String> 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; |
||||||
|
} |
||||||
|
} |
@ -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; |
||||||
|
} |
||||||
|
} |
@ -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<String, String> relation) throws Exception { |
||||||
|
if( relation.isEmpty() ){ |
||||||
|
return; |
||||||
|
} |
||||||
|
for(int i=0,len=book.getReportCount();i<len;i++){ |
||||||
|
String id = book.getReportName(i); |
||||||
|
if( relation.containsKey(id) ){ |
||||||
|
book.setReportName(i, relation.get(id) ); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,53 @@ |
|||||||
|
package com.fr.plugin.xxx.report.core; |
||||||
|
|
||||||
|
import com.fr.main.TemplateWorkBook; |
||||||
|
import com.fr.stable.ArrayUtils; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.web.request.ReportletRequest; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author 秃破天际 |
||||||
|
* @version 10.0 |
||||||
|
* Created by 秃破天际 on 2020-04-03 |
||||||
|
**/ |
||||||
|
public class ViewSheetBuilder extends RelationBuilder{ |
||||||
|
|
||||||
|
private static final String DS_NAME = "CONF_SHEET_GROUP"; |
||||||
|
private static final String COL_KEY = "id"; |
||||||
|
private static final String COL_VALUE = "group"; |
||||||
|
|
||||||
|
public ViewSheetBuilder(String dsName, String colKey, String colValue) { |
||||||
|
super(dsName, colKey, colValue); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected boolean accept(TemplateWorkBook book, ReportletRequest request) throws Exception { |
||||||
|
String groupId = (String)request.getParameter("__SHEET_GROUP__"); |
||||||
|
return StringUtils.isNotEmpty(groupId); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void build(TemplateWorkBook book, ReportletRequest request, Map<String, String> relation) throws Exception { |
||||||
|
String groupId = (String)request.getParameter("__SHEET_GROUP__"); |
||||||
|
String [] group = split( relation.get(groupId), ","); |
||||||
|
if( 0 == group.length ){ |
||||||
|
return; |
||||||
|
} |
||||||
|
List<String> dels = new ArrayList<String>(); |
||||||
|
for(int i=0,len=book.getReportCount();i<len;i++ ){ |
||||||
|
String id = book.getReportName(i); |
||||||
|
for( int j=0; j<group.length; j++ ){ |
||||||
|
if( !ArrayUtils.contains(group,id) ){ |
||||||
|
dels.add(id); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
for( String id : dels ){ |
||||||
|
book.removeReport(id); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,55 @@ |
|||||||
|
package com.fr.plugin.xxx.report.core; |
||||||
|
|
||||||
|
import com.fr.form.ui.Widget; |
||||||
|
import com.fr.main.TemplateWorkBook; |
||||||
|
import com.fr.report.cell.AbstractWidgetCellElement; |
||||||
|
import com.fr.report.worksheet.WorkSheet; |
||||||
|
import com.fr.stable.ArrayUtils; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.web.request.ReportletRequest; |
||||||
|
|
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* @author 秃破天际 |
||||||
|
* @version 10.0 |
||||||
|
* Created by 秃破天际 on 2020-04-03 |
||||||
|
**/ |
||||||
|
public class ViewWidgetBuilder extends RelationBuilder { |
||||||
|
|
||||||
|
public ViewWidgetBuilder(String dsName, String colKey, String colValue) { |
||||||
|
super(dsName, colKey, colValue); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected boolean accept(TemplateWorkBook book, ReportletRequest request) throws Exception { |
||||||
|
String groupId = (String)request.getParameter("__WIDGET_GROUP__"); |
||||||
|
return StringUtils.isNotEmpty( groupId ); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected void build(TemplateWorkBook book, ReportletRequest request, Map<String, String> 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<count; i++ ){ |
||||||
|
WorkSheet sheet = (WorkSheet)book.getReport(i); |
||||||
|
build( sheet, group ); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void build( WorkSheet sheet, String [] group ){ |
||||||
|
Iterator<AbstractWidgetCellElement> 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); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -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); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -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<String, Object> 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); |
||||||
|
} |
||||||
|
} |
@ -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<vars.length;i++) { |
||||||
|
var pair = vars[i].split("="); |
||||||
|
if(pair[0] == variable){ |
||||||
|
return pair[1]; |
||||||
|
} |
||||||
|
} |
||||||
|
return(false); |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否是填报预览或者数据分析预览 |
||||||
|
* @returns {boolean} |
||||||
|
*/ |
||||||
|
var isWriteOrView = function () { |
||||||
|
return typeof FR != "undefined" && (typeof FR.Write != "undefined" || typeof FR.ViewPane != "undefined") |
||||||
|
}; |
||||||
|
|
||||||
|
/** |
||||||
|
* 是否是新填报预览 |
||||||
|
* @returns {boolean} |
||||||
|
*/ |
||||||
|
var isWritePlus = function () { |
||||||
|
return typeof FR != "undefined" && typeof WT != "undefined"; |
||||||
|
}; |
||||||
|
if( getQueryVariable("_show_") != "true" ||( !isWriteOrView() && !isWritePlus() ) ){ |
||||||
|
return; |
||||||
|
} |
||||||
|
/** |
||||||
|
* 获取当前报表的所有sheet定义 |
||||||
|
* @returns {*} |
||||||
|
*/ |
||||||
|
var getSheetList = function(){ |
||||||
|
var list; |
||||||
|
FR.ajax({ |
||||||
|
url:FR.fineServletURL+"/url/sheet/info?sessionId="+_g().currentSessionID, |
||||||
|
success:function(data){ |
||||||
|
list = FR.jsonDecode(data); |
||||||
|
}, |
||||||
|
async:false |
||||||
|
}); |
||||||
|
return list; |
||||||
|
}; |
||||||
|
/** |
||||||
|
* 获取当前激活的sheet |
||||||
|
*/ |
||||||
|
var getActiveSheet = function () { |
||||||
|
if( isWritePlus() ){ |
||||||
|
return _g().sheetContainer.activeIndex; |
||||||
|
}else{ |
||||||
|
return _g().$contentPane.data("TabPane").activeTabIndex; |
||||||
|
} |
||||||
|
}; |
||||||
|
var $active = null; |
||||||
|
var items = []; |
||||||
|
/** |
||||||
|
* 设置激活的sheet【仅UI,不触发真正的sheet切换】 |
||||||
|
* @param index |
||||||
|
*/ |
||||||
|
var setActive =function ( index ) { |
||||||
|
if( null != $active){ |
||||||
|
$active.removeClass("hg-active"); |
||||||
|
} |
||||||
|
$active = items[index]; |
||||||
|
$active.addClass("hg-active"); |
||||||
|
}; |
||||||
|
|
||||||
|
var initSheetItem = function( item,h,idx ){ |
||||||
|
var lv = "hg-font-lv5"; |
||||||
|
if( h<=27 ){lv = "hg-font-lv4"} |
||||||
|
if( h<=24 ){lv = "hg-font-lv3"} |
||||||
|
if( h<=21 ){lv = "hg-font-lv2"} |
||||||
|
if( h<=18 ){lv = "hg-font-lv1"} |
||||||
|
var $item = $("<li/>").addClass("hg-list-item").addClass(lv) |
||||||
|
.append($("<span/>").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 = $("<div/>").addClass("hg-sheet-ctrl-wrap").appendTo("body"); |
||||||
|
var $sideBtn = $("<div/>").addClass("hg-side-hotspot").appendTo($wrap); |
||||||
|
var $guidepost = $("<div/>").addClass("hg-guidepost").appendTo($wrap); |
||||||
|
var $list = $("<div/>").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(); |
||||||
|
}; |
||||||
|
})(); |
Loading…
Reference in new issue