@ -0,0 +1,122 @@
|
||||
|
||||
apply plugin: 'java' |
||||
|
||||
|
||||
ext { |
||||
/** |
||||
* 项目中依赖的jar的路径 |
||||
* 1.如果依赖的jar需要打包到zip中,放置在lib根目录下 |
||||
* 2.如果依赖的jar仅仅是编译时需要,防止在lib下子目录下即可 |
||||
*/ |
||||
libPath = "$projectDir/../webroot/WEB-INF/lib" |
||||
|
||||
/** |
||||
* 是否对插件的class进行加密保护,防止反编译 |
||||
*/ |
||||
guard = true |
||||
|
||||
def pluginInfo = getPluginInfo() |
||||
pluginPre = "fine-plugin" |
||||
pluginName = pluginInfo.id |
||||
pluginVersion = pluginInfo.version |
||||
|
||||
outputPath = "$projectDir/../webroot/WEB-INF/plugins/plugin-" + pluginName + "-1.0/classes" |
||||
} |
||||
|
||||
group = 'com.fr.plugin' |
||||
version = '10.0' |
||||
sourceCompatibility = '8' |
||||
|
||||
sourceSets { |
||||
main { |
||||
java.outputDir = file(outputPath) |
||||
output.resourcesDir = file(outputPath) |
||||
} |
||||
} |
||||
|
||||
ant.importBuild("encrypt.xml") |
||||
//定义ant变量 |
||||
ant.projectDir = projectDir |
||||
ant.references["compile.classpath"] = ant.path { |
||||
fileset(dir: libPath, includes: '**/*.jar') |
||||
fileset(dir: ".",includes:"**/*.jar" ) |
||||
} |
||||
|
||||
classes.dependsOn('clean') |
||||
|
||||
task copyFiles(type: Copy,dependsOn: 'classes'){ |
||||
from outputPath |
||||
into "$projectDir/classes" |
||||
} |
||||
|
||||
task preJar(type:Copy,dependsOn: guard ? 'compile_encrypt_javas' : 'compile_plain_javas'){ |
||||
from "$projectDir/classes" |
||||
into "$projectDir/transform-classes" |
||||
include "**/*.*" |
||||
} |
||||
jar.dependsOn("preJar") |
||||
|
||||
task makeJar(type: Jar,dependsOn: preJar){ |
||||
from fileTree(dir: "$projectDir/transform-classes") |
||||
baseName pluginPre |
||||
appendix pluginName |
||||
version pluginVersion |
||||
destinationDir = file("$buildDir/libs") |
||||
|
||||
doLast(){ |
||||
delete file("$projectDir/classes") |
||||
delete file("$projectDir/transform-classes") |
||||
} |
||||
} |
||||
|
||||
task copyFile(type: Copy,dependsOn: ["makeJar"]){ |
||||
from "$buildDir/libs" |
||||
from("$projectDir/lib") { |
||||
include "*.jar" |
||||
} |
||||
from "$projectDir/plugin.xml" |
||||
into file("$buildDir/temp/plugin") |
||||
} |
||||
|
||||
task zip(type:Zip,dependsOn:["copyFile"]){ |
||||
from "$buildDir/temp/plugin" |
||||
destinationDir file("$buildDir/install") |
||||
baseName pluginPre |
||||
appendix pluginName |
||||
version pluginVersion |
||||
} |
||||
|
||||
//控制build时包含哪些文件,排除哪些文件 |
||||
processResources { |
||||
// exclude everything |
||||
// 用*.css没效果 |
||||
// exclude '**/*.css' |
||||
// except this file |
||||
// include 'xx.xml' |
||||
} |
||||
|
||||
/*读取plugin.xml中的version*/ |
||||
def getPluginInfo(){ |
||||
def xmlFile = file("plugin.xml") |
||||
if (!xmlFile.exists()) { |
||||
return ["id":"none", "version":"1.0.0"] |
||||
} |
||||
def plugin = new XmlParser().parse(xmlFile) |
||||
def version = plugin.version[0].text() |
||||
def id = plugin.id[0].text() |
||||
return ["id":id,"version":version] |
||||
} |
||||
|
||||
repositories { |
||||
mavenLocal() |
||||
maven { |
||||
url = uri('http://mvn.finedevelop.com/repository/maven-public/') |
||||
} |
||||
} |
||||
|
||||
dependencies { |
||||
//使用本地jar |
||||
implementation fileTree(dir: 'lib', include: ['**/*.jar']) |
||||
implementation fileTree(dir: libPath, include: ['**/*.jar']) |
||||
} |
||||
|
@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> |
||||
<project> |
||||
<target name="compile_encrypt_javas" depends="copyFiles"> |
||||
<echo message="加密文件"/> |
||||
<echo message="${projectDir}"/> |
||||
<taskdef name="pretreatment" classname="com.fr.plugin.pack.PluginPretreatmentTask"> |
||||
<classpath refid="compile.classpath"/> |
||||
</taskdef> |
||||
<pretreatment baseDir="${projectDir}"/> |
||||
</target> |
||||
<target name="compile_plain_javas" depends="copyFiles"> |
||||
</target> |
||||
</project> |
@ -0,0 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin> |
||||
<id>com.eco.plugin.shsytzfsds</id> |
||||
<name><![CDATA[飞书表格数据集(bi)]]></name> |
||||
<active>yes</active> |
||||
<version>1.0.6</version> |
||||
<env-version>10.0</env-version> |
||||
<jartime>2018-07-31</jartime> |
||||
<vendor>wink</vendor> |
||||
<description><![CDATA[飞书表格数据集(bi)]]></description> |
||||
<change-notes><![CDATA[ |
||||
|
||||
]]></change-notes> |
||||
<main-package>com.eco.plugin.shsytzfsds</main-package> |
||||
|
||||
<extra-decision> |
||||
<WebResourceProvider class="com.eco.plugin.shsytzfsds.webresourceProvider.WebResourceProvider"/> |
||||
<ControllerRegisterProvider class="com.eco.plugin.shsytzfsds.controller.ControllerRegisterProvider"/> |
||||
</extra-decision> |
||||
|
||||
<extra-core> |
||||
<CustomDatasetProvider class="com.eco.plugin.shsytzfsds.biPlublicServerTable.DatasetProvider"/> |
||||
<CustomDatasetProvider class="com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.DatasetProvider"/> |
||||
<DBAccessProvider class="com.eco.plugin.shsytzfsds.db.controller.DBController"/> |
||||
</extra-core> |
||||
<function-recorder class="com.eco.plugin.shsytzfsds.controller.ControllerSelf"/> |
||||
</plugin> |
@ -0,0 +1,42 @@
|
||||
//package com.eco.plugin.shsytzfsds.ServerTable;
|
||||
//
|
||||
//import com.fr.base.TableData;
|
||||
//import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
|
||||
//import com.fr.design.fun.impl.AbstractServerTableDataDefineProvider;
|
||||
//
|
||||
///**
|
||||
// * @author 秃破天际
|
||||
// * @version 10.0
|
||||
// * Created by 秃破天际 on 2021-03-29
|
||||
// **/
|
||||
//public class ServerTable extends AbstractServerTableDataDefineProvider {
|
||||
// @Override
|
||||
// public Class<? extends TableData> classForTableData() {
|
||||
// return com.eco.plugin.shsytzfsds.univalsalServerTable.TableData.class;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Class<? extends TableData> classForInitTableData() {
|
||||
// return com.eco.plugin.shsytzfsds.univalsalServerTable.TableData.class;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Class<? extends AbstractTableDataPane> appearanceForTableData() {
|
||||
// return TableDataPane.class;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public String nameForTableData() {
|
||||
// return "飞书多维表格";
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public String prefixForTableData() {
|
||||
// return "飞书多维表格";
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public String iconPathForTableData() {
|
||||
// return "com/eco/plugin/shsytzfsds/js/bi/feishu.png";
|
||||
// }
|
||||
//}
|
@ -0,0 +1,43 @@
|
||||
//package com.eco.plugin.shsytzfsds.ServerTable;
|
||||
//
|
||||
//import com.eco.plugin.shsytzfsds.univalsalServerTable.TableDataSheet;
|
||||
//import com.fr.base.TableData;
|
||||
//import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
|
||||
//import com.fr.design.fun.impl.AbstractServerTableDataDefineProvider;
|
||||
//
|
||||
///**
|
||||
// * @author 秃破天际
|
||||
// * @version 10.0
|
||||
// * Created by 秃破天际 on 2021-03-29
|
||||
// **/
|
||||
//public class ServerTableSheet extends AbstractServerTableDataDefineProvider {
|
||||
// @Override
|
||||
// public Class<? extends TableData> classForTableData() {
|
||||
// return TableDataSheet.class;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Class<? extends TableData> classForInitTableData() {
|
||||
// return TableDataSheet.class;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public Class<? extends AbstractTableDataPane> appearanceForTableData() {
|
||||
// return TableDataPaneSheet.class;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public String nameForTableData() {
|
||||
// return "飞书电子表格";
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public String prefixForTableData() {
|
||||
// return "飞书电子表格";
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public String iconPathForTableData() {
|
||||
// return "com/eco/plugin/shsytzfsds/js/bi/feishu.png";
|
||||
// }
|
||||
//}
|
@ -0,0 +1,94 @@
|
||||
//package com.eco.plugin.shsytzfsds.ServerTable;
|
||||
//
|
||||
//import com.eco.plugin.shsytzfsds.univalsalServerTable.TableData;
|
||||
//import com.fr.base.BaseUtils;
|
||||
//import com.fr.base.Parameter;
|
||||
//import com.fr.design.data.datapane.preview.PreviewTablePane;
|
||||
//import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
|
||||
//import com.fr.design.gui.ibutton.UIButton;
|
||||
//import com.fr.design.gui.icontainer.UIScrollPane;
|
||||
//import com.fr.design.gui.ilable.UILabel;
|
||||
//import com.fr.design.gui.itableeditorpane.ParameterTableModel;
|
||||
//import com.fr.design.gui.itableeditorpane.UITableEditorPane;
|
||||
//import com.fr.design.gui.itableeditorpane.UITableModelAdapter;
|
||||
//import com.fr.design.gui.itextarea.UITextArea;
|
||||
//import com.fr.design.layout.TableLayout;
|
||||
//import com.fr.design.layout.TableLayoutHelper;
|
||||
//import com.fr.script.Calculator;
|
||||
//import com.fr.stable.ParameterProvider;
|
||||
//
|
||||
//import javax.swing.*;
|
||||
//import java.awt.*;
|
||||
//import java.awt.event.ActionEvent;
|
||||
//import java.awt.event.ActionListener;
|
||||
//
|
||||
///**
|
||||
// * @author 秃破天际
|
||||
// * @version 10.0
|
||||
// * Created by 秃破天际 on 2021-03-29
|
||||
// **/
|
||||
//public class TableDataPane extends AbstractTableDataPane<TableData> {
|
||||
//
|
||||
// private UITextArea config;
|
||||
// private UITableEditorPane<ParameterProvider> parameterTableEditorPane;
|
||||
//
|
||||
// public TableDataPane(){
|
||||
// config = new UITextArea();
|
||||
// setLayout(new BorderLayout());
|
||||
//
|
||||
// UIButton preview = new UIButton(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png"));
|
||||
// preview.addActionListener(new ActionListener() {
|
||||
// @Override
|
||||
// public void actionPerformed(ActionEvent e) {
|
||||
// SwingUtilities.invokeLater(new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// PreviewTablePane.previewTableData(TableDataPane.this.updateBean());
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// add(TableLayoutHelper.createTableLayoutPane(
|
||||
// new Component[][] {{
|
||||
// new UILabel("配置"),preview
|
||||
// }},
|
||||
// new double[] { TableLayout.PREFERRED },
|
||||
// new double[] { TableLayout.FILL,TableLayout.PREFERRED }
|
||||
// ),BorderLayout.NORTH);
|
||||
//
|
||||
// UIScrollPane loadArea = new UIScrollPane(config);
|
||||
// add(loadArea, BorderLayout.CENTER);
|
||||
//
|
||||
// UITableModelAdapter<ParameterProvider> model = new ParameterTableModel();
|
||||
// parameterTableEditorPane = new UITableEditorPane<ParameterProvider>(model);
|
||||
//
|
||||
// add(parameterTableEditorPane,BorderLayout.SOUTH);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void populateBean(TableData data) {
|
||||
// if (data == null) {
|
||||
// return;
|
||||
// }
|
||||
// Calculator c = Calculator.createCalculator();
|
||||
// ParameterProvider[] parameters = data.getParameters(c);
|
||||
// parameterTableEditorPane.populate(parameters);
|
||||
// config.setText( data.getConfig() );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public TableData updateBean() {
|
||||
// TableData data = new TableData();
|
||||
// data.setConfig( config.getText() );
|
||||
// java.util.List<ParameterProvider> parameterProviderList = parameterTableEditorPane.update();
|
||||
// Parameter[] parameters = parameterProviderList.toArray(new Parameter[parameterProviderList.size()]);
|
||||
// data.setParameters(parameters);
|
||||
// return data;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected String title4PopupWindow() {
|
||||
// return "飞书多维表格";
|
||||
// }
|
||||
//}
|
@ -0,0 +1,90 @@
|
||||
//package com.eco.plugin.shsytzfsds.ServerTable;
|
||||
//
|
||||
//import com.eco.plugin.shsytzfsds.univalsalServerTable.TableDataSheet;
|
||||
//import com.fr.base.BaseUtils;
|
||||
//import com.fr.base.Parameter;
|
||||
//import com.fr.design.data.datapane.preview.PreviewTablePane;
|
||||
//import com.fr.design.data.tabledata.tabledatapane.AbstractTableDataPane;
|
||||
//import com.fr.design.gui.ibutton.UIButton;
|
||||
//import com.fr.design.gui.icontainer.UIScrollPane;
|
||||
//import com.fr.design.gui.ilable.UILabel;
|
||||
//import com.fr.design.gui.itableeditorpane.ParameterTableModel;
|
||||
//import com.fr.design.gui.itableeditorpane.UITableEditorPane;
|
||||
//import com.fr.design.gui.itableeditorpane.UITableModelAdapter;
|
||||
//import com.fr.design.gui.itextarea.UITextArea;
|
||||
//import com.fr.design.layout.TableLayout;
|
||||
//import com.fr.design.layout.TableLayoutHelper;
|
||||
//import com.fr.script.Calculator;
|
||||
//import com.fr.stable.ParameterProvider;
|
||||
//
|
||||
//import javax.swing.*;
|
||||
//import java.awt.*;
|
||||
//import java.awt.event.ActionEvent;
|
||||
//import java.awt.event.ActionListener;
|
||||
//
|
||||
//
|
||||
//public class TableDataPaneSheet extends AbstractTableDataPane<TableDataSheet> {
|
||||
//
|
||||
// private UITextArea config;
|
||||
// private UITableEditorPane<ParameterProvider> parameterTableEditorPane;
|
||||
//
|
||||
// public TableDataPaneSheet(){
|
||||
// config = new UITextArea();
|
||||
// setLayout(new BorderLayout());
|
||||
//
|
||||
// UIButton preview = new UIButton(BaseUtils.readIcon("/com/fr/design/images/m_file/preview.png"));
|
||||
// preview.addActionListener(new ActionListener() {
|
||||
// @Override
|
||||
// public void actionPerformed(ActionEvent e) {
|
||||
// SwingUtilities.invokeLater(new Runnable() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// PreviewTablePane.previewTableData(TableDataPaneSheet.this.updateBean());
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// });
|
||||
//
|
||||
// add(TableLayoutHelper.createTableLayoutPane(
|
||||
// new Component[][] {{
|
||||
// new UILabel("配置"),preview
|
||||
// }},
|
||||
// new double[] { TableLayout.PREFERRED },
|
||||
// new double[] { TableLayout.FILL,TableLayout.PREFERRED }
|
||||
// ),BorderLayout.NORTH);
|
||||
//
|
||||
// UIScrollPane loadArea = new UIScrollPane(config);
|
||||
// add(loadArea, BorderLayout.CENTER);
|
||||
//
|
||||
// UITableModelAdapter<ParameterProvider> model = new ParameterTableModel();
|
||||
// parameterTableEditorPane = new UITableEditorPane<ParameterProvider>(model);
|
||||
//
|
||||
// add(parameterTableEditorPane,BorderLayout.SOUTH);
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public void populateBean(TableDataSheet data) {
|
||||
// if (data == null) {
|
||||
// return;
|
||||
// }
|
||||
// Calculator c = Calculator.createCalculator();
|
||||
// ParameterProvider[] parameters = data.getParameters(c);
|
||||
// parameterTableEditorPane.populate(parameters);
|
||||
// config.setText( data.getConfig() );
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// public TableDataSheet updateBean() {
|
||||
// TableDataSheet data = new TableDataSheet();
|
||||
// data.setConfig( config.getText() );
|
||||
// java.util.List<ParameterProvider> parameterProviderList = parameterTableEditorPane.update();
|
||||
// Parameter[] parameters = parameterProviderList.toArray(new Parameter[parameterProviderList.size()]);
|
||||
// data.setParameters(parameters);
|
||||
// return data;
|
||||
// }
|
||||
//
|
||||
// @Override
|
||||
// protected String title4PopupWindow() {
|
||||
// return "飞书电子表格";
|
||||
// }
|
||||
//}
|
@ -0,0 +1,37 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable; |
||||
|
||||
import com.fr.web.struct.AssembleComponent; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Registry; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.category.StylePath; |
||||
|
||||
/** |
||||
* @author Heng.J |
||||
* @version 6.0 |
||||
* Created by Heng.J on 2023/5/30 |
||||
*/ |
||||
public class DatasetComponent extends AssembleComponent { |
||||
|
||||
public static final DatasetComponent KEY = new DatasetComponent(); |
||||
|
||||
@Override |
||||
public Atom[] refer() { |
||||
return new Atom[]{}; |
||||
} |
||||
|
||||
@Override |
||||
public ScriptPath script() { |
||||
return ScriptPath.build("com/eco/plugin/shsytzfsds/js/bi/publicds.js"); |
||||
} |
||||
|
||||
@Override |
||||
public StylePath style() { |
||||
return StylePath.build("com/eco/plugin/shsytzfsds/js/bi/publicds.css"); |
||||
} |
||||
|
||||
@Override |
||||
public Atom[] children() { |
||||
return Registry.getChildren(DatasetComponent.class); |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable; |
||||
|
||||
import com.eco.plugin.shsytzfsds.biPlublicServerTable.generator.DatasetGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.AbstractCustomDatasetProvider; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetGenerator; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 6.0 |
||||
* Created by wink on 2023/5/30 |
||||
*/ |
||||
public class DatasetProvider extends AbstractCustomDatasetProvider { |
||||
|
||||
@Override |
||||
public CustomDatasetGenerator getGenerator() { |
||||
return new DatasetGenerator(); |
||||
} |
||||
} |
@ -0,0 +1,26 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.data.feishu; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* 用户自定义数据链接 |
||||
* |
||||
* @author Heng.J |
||||
* @version 6.0 |
||||
* Created by Heng.J on 2023/6/14 |
||||
*/ |
||||
public class DBConfig { |
||||
|
||||
public static final String URL = "jdbc:mysql://localhost:3306/swift_data1?serverTimezone=Asia/Shanghai&useSSL=false"; |
||||
public static final String USER = "root"; |
||||
public static final String PASSWORD = "123456"; |
||||
|
||||
public static final Map<String, Class<?>> PARAMETER_MAP = new HashMap<>(); |
||||
|
||||
static { |
||||
PARAMETER_MAP.put("driver", String.class); |
||||
PARAMETER_MAP.put("appId", String.class); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,28 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.data.feishu; |
||||
|
||||
import com.eco.plugin.shsytzfsds.utils.DataSetUtils; |
||||
import com.finebi.cbb.api.model.RowIterator; |
||||
import com.finebi.provider.api.dataset.datasource.AbstractDefaultDatasourceGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetContext; |
||||
import com.fr.data.core.db.ColumnInformation; |
||||
|
||||
import java.util.Collections; |
||||
import java.util.Map; |
||||
|
||||
public class FeishuDatasetDatasourceGenerator extends AbstractDefaultDatasourceGenerator { |
||||
|
||||
@Override |
||||
public RowIterator getRowIterator(String jsonContext, CustomDatasetContext datasetContext, ColumnInformation[] columnInfos) { |
||||
return new FeishuRowIterator(jsonContext, Collections.singletonList(datasetContext), null); |
||||
} |
||||
|
||||
@Override |
||||
public Map<String, Class<?>> getParameters(String jsonContext, CustomDatasetContext datasetContext) { |
||||
return DBConfig.PARAMETER_MAP; |
||||
} |
||||
|
||||
@Override |
||||
public ColumnInformation[] createColumnInfos(String jsonContext, CustomDatasetContext datasetContext) { |
||||
return DataSetUtils.getHeader(jsonContext); |
||||
} |
||||
} |
@ -0,0 +1,91 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.data.feishu; |
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.controller.DBController; |
||||
import com.eco.plugin.shsytzfsds.utils.FeiShuUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.Utils; |
||||
import com.finebi.base.concurrent.ExecutorServiceFactory; |
||||
import com.finebi.cbb.api.model.RowIterator; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetContext; |
||||
import com.fr.data.core.db.ColumnInformation; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
|
||||
public class FeishuRowIterator implements RowIterator { |
||||
|
||||
private static int count = 0; |
||||
private String jsonContexts = ""; |
||||
private static List<Object[]> result = new ArrayList<>(); |
||||
|
||||
public FeishuRowIterator(String jsonContexts, List<CustomDatasetContext> datasetContexts, String sql) { |
||||
count =0; |
||||
result = new ArrayList<>(); |
||||
this.jsonContexts = jsonContexts; |
||||
JSONObject param = new JSONObject(jsonContexts); |
||||
String id = param.getString("appid"); |
||||
DBEntity feishuApp = DBController.getById(id); |
||||
String appid = feishuApp.getAppid(); |
||||
String secret = feishuApp.getSecret(); |
||||
String url = param.getString("url"); |
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray header =FeiShuUtils.getTableFields(url,token); |
||||
JSONArray dataArray = FeiShuUtils.getTableData(url,token,""); |
||||
addRowDatas(header,dataArray); |
||||
} |
||||
|
||||
private void init() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void open() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean hasNext() { |
||||
return count < result.size(); |
||||
} |
||||
|
||||
@Override |
||||
public Object[] next() { |
||||
int current = count; |
||||
count++; |
||||
return result.get(current); |
||||
} |
||||
|
||||
@Override |
||||
public void close() { |
||||
} |
||||
|
||||
@Override |
||||
public void cancel() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 添加行数据 |
||||
* @param jsonArray |
||||
*/ |
||||
private void addRowDatas(JSONArray header,JSONArray jsonArray) { |
||||
if(jsonArray == null || jsonArray.size() <= 0){ |
||||
return ; |
||||
} |
||||
|
||||
for(int i =0;i< jsonArray.size();i++){ |
||||
JSONObject fields = jsonArray.getJSONObject(i).getJSONObject("fields"); |
||||
Object[] rowDatas = new Object[header.length()]; |
||||
|
||||
for (int j = 0; j < header.length(); j++) { |
||||
String value = fields.getString(header.getString(j)); |
||||
rowDatas[j] = Utils.isNullStr(value) ? "" :value; |
||||
} |
||||
|
||||
result.add(rowDatas); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.generator; |
||||
|
||||
import com.eco.plugin.shsytzfsds.biPlublicServerTable.data.feishu.FeishuDatasetDatasourceGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.AbstractCustomDatasetGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetDatasourceGenerator; |
||||
import org.jetbrains.annotations.NotNull; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 6.0 |
||||
* Created by wink on 2023/5/30 |
||||
*/ |
||||
public class DatasetGenerator extends AbstractCustomDatasetGenerator { |
||||
|
||||
@Override |
||||
public @NotNull String getName() { |
||||
return "飞书多维表格"; |
||||
} |
||||
|
||||
/** |
||||
* 前端页面相关接口 |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public @NotNull DatasetPageGenerator getPageGenerator() { |
||||
return new DatasetPageGenerator(); |
||||
} |
||||
|
||||
/** |
||||
* 后端数据相关接口 |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public @NotNull CustomDatasetDatasourceGenerator getDatasourceGenerator() { |
||||
return new FeishuDatasetDatasourceGenerator(); |
||||
} |
||||
} |
@ -0,0 +1,49 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.generator; |
||||
|
||||
import com.eco.plugin.shsytzfsds.biPlublicServerTable.DatasetComponent; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetContext; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetPageGenerator; |
||||
import com.fr.web.struct.AssembleComponent; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 6.0 |
||||
* Created by wink on 2023/5/30 |
||||
* 前端接口 |
||||
*/ |
||||
public class DatasetPageGenerator implements CustomDatasetPageGenerator { |
||||
|
||||
/** |
||||
* 图标 |
||||
* @param datasetContext |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public String getIcon(CustomDatasetContext datasetContext) { |
||||
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAkCAYAAAAU/hMoAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVQSURBVFhH7Zd/SF5VGMdlRARRM9dqrCCk/rEw0tH+SDebGw2KUVKSBBGNEfujNUvWP1mNigrbP80/yh+zltooJraUqe8gcOU2bTRW8/XHdGqjLZ02UzdnnnO/Pc8599z33rv7vt53GDHYA1/ur/M+z+c8z3nOvW8KrgO7AblYdv1DSliwLAv7p87j8aFOrBvuwtrhzqSUN9KFsvEhCIu8kS8tobyHtQUyKRWosOYp0CBuirYhJRohtdjHEOppJUVQPjGiACWEnrwdIYwlhGRHsdlbiEyPIbX3BwpOkBw8CMotgkvppomRbulpQ++VaQWZrIVYk1wWLpVQ+nV2Evf2EygHDwLzyExGg24Y/llnkSetnYeypBuHnQ/NXcb9p9s1RChYoxa0TI86oGEtaUgTYHjuEtJP/6gCK4AwsDQmf6iLfHBV/kNIXXoN2j83hRV9XPqQjUSlX2KvTbcZf/HMA7nQYNOZep3q8V2XL+LWXgJIouzvXRiAlLHJ+uU3D+SlKxINR/RADcMguhuD0PkeP//m73MaUoG61il3tweQnp1qReZ3EZTsOownXmlEZkE9MjbtxaqifSh8oxmffHkCfSN/OfHZPJAXpgRWFVuob2dQvW54aKJtg53x2JI/o7Etx6xTs03xke7fXN2A1KerkZpTgWW5n+PO3CrckVupjqxlOZXq/sr1VegbmrAj+CDHpyxkb5cKtOaQ3shN+jm3ftPPdNlm5TxWn+lwZdEG7D6IlK5m3LZ1rwJQUGsqHCgDyPf4Gau2OaombswDOUHrWUPqY1mjxLywQfQQj2lwfsagAj2zU2rTjgG2YUlHE5YW7nFg0tbEMsZgBjSNztNyPkPRjhb1hmO/xryQM5YCNMoqlthWITA5o39gUE12/cb3Pxwb1Nk0gM/WOHAG1C0nmwS5fG0lugfGVRx3hISQrOztFjZ9MI/oCJVfdSStVTU6oPykOSnw4MBPSOloxtKCPQqCs+SH8yvtsQq8/E7EToBJhzYP5MVpLyQDmvPVJcAXEYl/5m1Q15qJGa9jgdrBEdz+TDWtL90cDGrO3QqTRbaEkFkEmf06SV1bqvwv7qL39+9257vKbq5/iY7ioYI6BaDhYiBuQJYzCTpufveQ7U9XyN2oCSH9UtCkR0sE3t8nMTZpYAWEEKhqOIl78qnEFDTeGvSLx92VV6GyGM+SgjQZ5XMGzn1T4NMmiSMnJ/DUqweczJkODoJyizPJ44rLOuwsBpsHcnKGQKi8friY+BmVXa1VnVVeAo9sm8MDL5zC3Ru+dfZCU+4gOJZ5nll0UL1EFhHSSK9TBnQ3F++tGVvO4b6Cw1ieR5t3HEieCD9LL+xA+2/zqlkS2dWQJqB9TFaq0UhZrwlkbP4D6c8dxYqNjVi+7itSHVZubKB7nXh46wQqW3WzJUb0QfI+qbLDwXzBkxFnV0u/Ys218s2ToPOP9tNmxX/OnG6Ob75MSgcyKPi1SPuy1zL55iM3G+8GvKeabSc0pKBJPblTzzQo4LWIIc3WlbND4sAx94tAf8QsZB5I/sHgeQsv7dYZZedGOqg+V+Wzr71Z91/re6wt5RJnRjVUok+/IPNAmm2AXtFoPW6h8GMNq4JfBRYv27H7vCafL5OInKDNnr5skoUz5oVkcbepdzPNmGiP9gq8XS+R/5ZQQd2A7u1KTYK7mia1vlRi59cWjvfbzaF86gSw7zAldpsH0phx4cDSHf6w6D7Lfy8Edn8vUVproaRGkgRK6wTKmwQaj1noPWupb1DzWyXyYPypRWUDh7VAyHjmBLUVdM+txbKkIP8vuwG5OAb8C5svkz2EkBopAAAAAElFTkSuQmCC"; |
||||
} |
||||
|
||||
/** |
||||
* 配置页面根节点dom元素 |
||||
* @param datasetContext |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public String getEditPageHTML(CustomDatasetContext datasetContext) { |
||||
return "<iframe id='publicds' src=\"/webroot/decision/file?path=com/eco/plugin/shsytzfsds/html/dwb.html\" style=\"width:100%;height: 100%;border:none;position: fixed;\n" + |
||||
" top: 0;\n" + |
||||
" left: 0;\n" + |
||||
" width: 100%;\n" + |
||||
" height: 100%;\"></iframe>"; |
||||
} |
||||
|
||||
/** |
||||
* 注册组件 |
||||
* @param datasetContext |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public AssembleComponent getComponent(CustomDatasetContext datasetContext) { |
||||
return DatasetComponent.KEY; |
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet; |
||||
|
||||
import com.fr.web.struct.AssembleComponent; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Registry; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.category.StylePath; |
||||
|
||||
/** |
||||
* @author Heng.J |
||||
* @version 6.0 |
||||
* Created by Heng.J on 2023/5/30 |
||||
*/ |
||||
public class DatasetComponent extends AssembleComponent { |
||||
|
||||
public static final DatasetComponent KEY = new DatasetComponent(); |
||||
|
||||
@Override |
||||
public Atom[] refer() { |
||||
return new Atom[]{}; |
||||
} |
||||
|
||||
@Override |
||||
public ScriptPath script() { |
||||
return ScriptPath.build("com/eco/plugin/shsytzfsds/js/bi/publicds.js"); |
||||
} |
||||
|
||||
@Override |
||||
public StylePath style() { |
||||
return StylePath.build("com/eco/plugin/shsytzfsds/js/bi/publicds.css"); |
||||
} |
||||
|
||||
@Override |
||||
public Atom[] children() { |
||||
return Registry.getChildren(DatasetComponent.class); |
||||
} |
||||
} |
@ -0,0 +1,18 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet; |
||||
|
||||
import com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.generator.DatasetGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.AbstractCustomDatasetProvider; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetGenerator; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 6.0 |
||||
* Created by wink on 2023/5/30 |
||||
*/ |
||||
public class DatasetProvider extends AbstractCustomDatasetProvider { |
||||
|
||||
@Override |
||||
public CustomDatasetGenerator getGenerator() { |
||||
return new DatasetGenerator(); |
||||
} |
||||
} |
@ -0,0 +1,26 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.feishu; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* 用户自定义数据链接 |
||||
* |
||||
* @author Heng.J |
||||
* @version 6.0 |
||||
* Created by Heng.J on 2023/6/14 |
||||
*/ |
||||
public class DBConfig { |
||||
|
||||
public static final String URL = "jdbc:mysql://localhost:3306/swift_data1?serverTimezone=Asia/Shanghai&useSSL=false"; |
||||
public static final String USER = "root"; |
||||
public static final String PASSWORD = "123456"; |
||||
|
||||
public static final Map<String, Class<?>> PARAMETER_MAP = new HashMap<>(); |
||||
|
||||
static { |
||||
PARAMETER_MAP.put("driver", String.class); |
||||
PARAMETER_MAP.put("appId", String.class); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,34 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.feishu; |
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.controller.DBController; |
||||
import com.eco.plugin.shsytzfsds.utils.DataSetUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.FeiShuUtils; |
||||
import com.finebi.cbb.api.model.RowIterator; |
||||
import com.finebi.provider.api.dataset.datasource.AbstractDefaultDatasourceGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetContext; |
||||
import com.fr.data.core.db.ColumnInformation; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
|
||||
import java.util.Collections; |
||||
import java.util.Map; |
||||
|
||||
public class FeishuDatasetDatasourceGenerator extends AbstractDefaultDatasourceGenerator { |
||||
|
||||
@Override |
||||
public RowIterator getRowIterator(String jsonContext, CustomDatasetContext datasetContext, ColumnInformation[] columnInfos) { |
||||
return new FeishuRowIterator(jsonContext, Collections.singletonList(datasetContext), null); |
||||
} |
||||
|
||||
@Override |
||||
public Map<String, Class<?>> getParameters(String jsonContext, CustomDatasetContext datasetContext) { |
||||
return DBConfig.PARAMETER_MAP; |
||||
} |
||||
|
||||
@Override |
||||
public ColumnInformation[] createColumnInfos(String jsonContext, CustomDatasetContext datasetContext) { |
||||
|
||||
return DataSetUtils.getSheetHeader(jsonContext); |
||||
} |
||||
} |
@ -0,0 +1,100 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.feishu; |
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.controller.DBController; |
||||
import com.eco.plugin.shsytzfsds.utils.FeiShuUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.Utils; |
||||
import com.finebi.cbb.api.model.RowIterator; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetContext; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
|
||||
public class FeishuRowIterator implements RowIterator { |
||||
|
||||
private static int count = 0; |
||||
private String jsonContexts = ""; |
||||
private static List<Object[]> result = new ArrayList<>(); |
||||
|
||||
public FeishuRowIterator(String jsonContexts, List<CustomDatasetContext> datasetContexts, String sql) { |
||||
count =0; |
||||
result = new ArrayList<>(); |
||||
this.jsonContexts = jsonContexts; |
||||
JSONObject param = new JSONObject(jsonContexts); |
||||
String id = param.getString("appid"); |
||||
String url = param.getString("url"); |
||||
String rowSelect = param.getString("rowSelect"); |
||||
int headrow = param.getInt("header"); |
||||
String colSelect = param.getString("colSelect"); |
||||
|
||||
int rowsize = rowSelect.equals("custom") ? param.getInt("rowdata"):0; |
||||
String columnSize = colSelect.equals("colcustom") ? param.getString("coldata"):""; |
||||
|
||||
DBEntity feishuApp = DBController.getById(id); |
||||
String appid = feishuApp.getAppid(); |
||||
String secret = feishuApp.getSecret(); |
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray jsonArray =FeiShuUtils.getSheetData(url,token,rowsize,columnSize,headrow,5000,0); |
||||
addRowDatas(jsonArray,headrow); |
||||
} |
||||
|
||||
private void init() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public void open() { |
||||
|
||||
} |
||||
|
||||
@Override |
||||
public boolean hasNext() { |
||||
return count < result.size(); |
||||
} |
||||
|
||||
@Override |
||||
public Object[] next() { |
||||
int current = count; |
||||
count++; |
||||
return result.get(current); |
||||
} |
||||
|
||||
@Override |
||||
public void close() { |
||||
} |
||||
|
||||
@Override |
||||
public void cancel() { |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 添加行数据 |
||||
* @param jsonArray |
||||
*/ |
||||
private void addRowDatas(JSONArray jsonArray,int headerrow) { |
||||
if(jsonArray == null || jsonArray.size() <= 0){ |
||||
return ; |
||||
} |
||||
|
||||
for(int i =0;i< jsonArray.size();i++){ |
||||
if(i == 0){ |
||||
continue; |
||||
} |
||||
|
||||
JSONArray values = jsonArray.getJSONArray(i); |
||||
Object[] rowDatas = new Object[values.length()]; |
||||
|
||||
for (int j = 0; j < values.length(); j++) { |
||||
rowDatas[j] =values.getString(j); |
||||
} |
||||
|
||||
result.add(rowDatas); |
||||
} |
||||
|
||||
|
||||
} |
||||
} |
@ -0,0 +1,37 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.generator; |
||||
|
||||
import com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.feishu.FeishuDatasetDatasourceGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.AbstractCustomDatasetGenerator; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetDatasourceGenerator; |
||||
import org.jetbrains.annotations.NotNull; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 6.0 |
||||
* Created by wink on 2023/5/30 |
||||
*/ |
||||
public class DatasetGenerator extends AbstractCustomDatasetGenerator { |
||||
|
||||
@Override |
||||
public @NotNull String getName() { |
||||
return "飞书电子表格"; |
||||
} |
||||
|
||||
/** |
||||
* 前端页面相关接口 |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public @NotNull DatasetPageGenerator getPageGenerator() { |
||||
return new DatasetPageGenerator(); |
||||
} |
||||
|
||||
/** |
||||
* 后端数据相关接口 |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public @NotNull CustomDatasetDatasourceGenerator getDatasourceGenerator() { |
||||
return new FeishuDatasetDatasourceGenerator(); |
||||
} |
||||
} |
@ -0,0 +1,49 @@
|
||||
package com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.generator; |
||||
|
||||
import com.eco.plugin.shsytzfsds.biPlublicServerTable.sheet.DatasetComponent; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetContext; |
||||
import com.finebi.provider.api.dataset.datasource.CustomDatasetPageGenerator; |
||||
import com.fr.web.struct.AssembleComponent; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 6.0 |
||||
* Created by wink on 2023/5/30 |
||||
* 前端接口 |
||||
*/ |
||||
public class DatasetPageGenerator implements CustomDatasetPageGenerator { |
||||
|
||||
/** |
||||
* 图标 |
||||
* @param datasetContext |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public String getIcon(CustomDatasetContext datasetContext) { |
||||
return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACkAAAAkCAYAAAAU/hMoAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAVQSURBVFhH7Zd/SF5VGMdlRARRM9dqrCCk/rEw0tH+SDebGw2KUVKSBBGNEfujNUvWP1mNigrbP80/yh+zltooJraUqe8gcOU2bTRW8/XHdGqjLZ02UzdnnnO/Pc8599z33rv7vt53GDHYA1/ur/M+z+c8z3nOvW8KrgO7AblYdv1DSliwLAv7p87j8aFOrBvuwtrhzqSUN9KFsvEhCIu8kS8tobyHtQUyKRWosOYp0CBuirYhJRohtdjHEOppJUVQPjGiACWEnrwdIYwlhGRHsdlbiEyPIbX3BwpOkBw8CMotgkvppomRbulpQ++VaQWZrIVYk1wWLpVQ+nV2Evf2EygHDwLzyExGg24Y/llnkSetnYeypBuHnQ/NXcb9p9s1RChYoxa0TI86oGEtaUgTYHjuEtJP/6gCK4AwsDQmf6iLfHBV/kNIXXoN2j83hRV9XPqQjUSlX2KvTbcZf/HMA7nQYNOZep3q8V2XL+LWXgJIouzvXRiAlLHJ+uU3D+SlKxINR/RADcMguhuD0PkeP//m73MaUoG61il3tweQnp1qReZ3EZTsOownXmlEZkE9MjbtxaqifSh8oxmffHkCfSN/OfHZPJAXpgRWFVuob2dQvW54aKJtg53x2JI/o7Etx6xTs03xke7fXN2A1KerkZpTgWW5n+PO3CrckVupjqxlOZXq/sr1VegbmrAj+CDHpyxkb5cKtOaQ3shN+jm3ftPPdNlm5TxWn+lwZdEG7D6IlK5m3LZ1rwJQUGsqHCgDyPf4Gau2OaombswDOUHrWUPqY1mjxLywQfQQj2lwfsagAj2zU2rTjgG2YUlHE5YW7nFg0tbEMsZgBjSNztNyPkPRjhb1hmO/xryQM5YCNMoqlthWITA5o39gUE12/cb3Pxwb1Nk0gM/WOHAG1C0nmwS5fG0lugfGVRx3hISQrOztFjZ9MI/oCJVfdSStVTU6oPykOSnw4MBPSOloxtKCPQqCs+SH8yvtsQq8/E7EToBJhzYP5MVpLyQDmvPVJcAXEYl/5m1Q15qJGa9jgdrBEdz+TDWtL90cDGrO3QqTRbaEkFkEmf06SV1bqvwv7qL39+9257vKbq5/iY7ioYI6BaDhYiBuQJYzCTpufveQ7U9XyN2oCSH9UtCkR0sE3t8nMTZpYAWEEKhqOIl78qnEFDTeGvSLx92VV6GyGM+SgjQZ5XMGzn1T4NMmiSMnJ/DUqweczJkODoJyizPJ44rLOuwsBpsHcnKGQKi8friY+BmVXa1VnVVeAo9sm8MDL5zC3Ru+dfZCU+4gOJZ5nll0UL1EFhHSSK9TBnQ3F++tGVvO4b6Cw1ieR5t3HEieCD9LL+xA+2/zqlkS2dWQJqB9TFaq0UhZrwlkbP4D6c8dxYqNjVi+7itSHVZubKB7nXh46wQqW3WzJUb0QfI+qbLDwXzBkxFnV0u/Ys218s2ToPOP9tNmxX/OnG6Ob75MSgcyKPi1SPuy1zL55iM3G+8GvKeabSc0pKBJPblTzzQo4LWIIc3WlbND4sAx94tAf8QsZB5I/sHgeQsv7dYZZedGOqg+V+Wzr71Z91/re6wt5RJnRjVUok+/IPNAmm2AXtFoPW6h8GMNq4JfBRYv27H7vCafL5OInKDNnr5skoUz5oVkcbepdzPNmGiP9gq8XS+R/5ZQQd2A7u1KTYK7mia1vlRi59cWjvfbzaF86gSw7zAldpsH0phx4cDSHf6w6D7Lfy8Edn8vUVproaRGkgRK6wTKmwQaj1noPWupb1DzWyXyYPypRWUDh7VAyHjmBLUVdM+txbKkIP8vuwG5OAb8C5svkz2EkBopAAAAAElFTkSuQmCC"; |
||||
} |
||||
|
||||
/** |
||||
* 配置页面根节点dom元素 |
||||
* @param datasetContext |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public String getEditPageHTML(CustomDatasetContext datasetContext) { |
||||
return "<iframe id='publicds' src=\"/webroot/decision/file?path=com/eco/plugin/shsytzfsds/html/sheet.html\" style=\"width:100%;height: 100%;border:none;position: fixed;\n" + |
||||
" top: 0;\n" + |
||||
" left: 0;\n" + |
||||
" width: 100%;\n" + |
||||
" height: 100%;\"></iframe>"; |
||||
} |
||||
|
||||
/** |
||||
* 注册组件 |
||||
* @param datasetContext |
||||
* @return |
||||
*/ |
||||
@Override |
||||
public AssembleComponent getComponent(CustomDatasetContext datasetContext) { |
||||
return DatasetComponent.KEY; |
||||
} |
||||
} |
@ -0,0 +1,9 @@
|
||||
package com.eco.plugin.shsytzfsds.constants; |
||||
|
||||
public class Result { |
||||
public static String paramNotNull= "必填参数不能为空"; |
||||
|
||||
public static String needLogin= "请先登录"; |
||||
|
||||
public static String validateFail = "鉴权失败"; |
||||
} |
@ -0,0 +1,20 @@
|
||||
package com.eco.plugin.shsytzfsds.controller; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractControllerRegisterProvider; |
||||
import com.fr.plugin.context.PluginContexts; |
||||
import com.fr.stable.fun.Authorize; |
||||
|
||||
@Authorize(callSignKey = "com.eco.plugin.shsytzfsds") |
||||
public class ControllerRegisterProvider extends AbstractControllerRegisterProvider { |
||||
@Override |
||||
public Class<?>[] getControllers() { |
||||
|
||||
if(!PluginContexts.currentContext().isAvailable()) { |
||||
return new Class[]{}; |
||||
} |
||||
|
||||
return new Class[]{ |
||||
ControllerSelf.class |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,255 @@
|
||||
package com.eco.plugin.shsytzfsds.controller; |
||||
|
||||
import com.eco.plugin.shsytzfsds.constants.Result; |
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.controller.DBController; |
||||
import com.eco.plugin.shsytzfsds.utils.FRUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.FeiShuUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.ResponseUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.Utils; |
||||
import com.finebi.web.action.v5.conf.FineExportAction; |
||||
import com.fr.decision.webservice.annotation.LoginStatusChecker; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.third.springframework.stereotype.Controller; |
||||
import com.fr.third.springframework.web.bind.annotation.GetMapping; |
||||
import com.fr.third.springframework.web.bind.annotation.PostMapping; |
||||
import com.fr.third.springframework.web.bind.annotation.ResponseBody; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.UUID; |
||||
|
||||
@Controller |
||||
@LoginStatusChecker(required = false) |
||||
@FunctionRecorder |
||||
public class ControllerSelf { |
||||
|
||||
@GetMapping(value = "/fsds/getAllPage") |
||||
@ResponseBody |
||||
public void getAllPage(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
|
||||
List<DBEntity> all = DBController.getAllPage(); |
||||
JSONArray allJson = JSONArray.create(all); |
||||
ResponseUtils.successResponse(res,allJson.toString()); |
||||
} |
||||
|
||||
@GetMapping(value = "/fsds/getAll") |
||||
@ResponseBody |
||||
public void getAll(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
|
||||
List<DBEntity> all = DBController.getAll(); |
||||
JSONArray allJson = JSONArray.create(all); |
||||
ResponseUtils.successResponse(res,allJson.toString()); |
||||
} |
||||
|
||||
@GetMapping(value = "/fsds/getById") |
||||
@ResponseBody |
||||
public void getById(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
String id = req.getParameter("id"); |
||||
DBEntity dbEntity = DBController.getById(id); |
||||
JSONObject entityJson = JSONObject.mapFrom(dbEntity); |
||||
ResponseUtils.successResponse(res,entityJson.toString()); |
||||
} |
||||
|
||||
@PostMapping(value = "/fsds/add") |
||||
@ResponseBody |
||||
public void add(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
|
||||
JSONObject param = Utils.getRequestBody(req); |
||||
DBEntity entity = param.mapTo(DBEntity.class); |
||||
|
||||
entity.setId(entity.getAppid()); |
||||
boolean result = DBController.single(entity,null); |
||||
|
||||
if(result){ |
||||
ResponseUtils.successResponse(res,"添加成功"); |
||||
}else{ |
||||
ResponseUtils.failedResponse(res,"添加失败"); |
||||
} |
||||
} |
||||
|
||||
@PostMapping(value = "/fsds/update") |
||||
@ResponseBody |
||||
public void update(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
|
||||
JSONObject param = Utils.getRequestBody(req); |
||||
DBEntity entity = param.mapTo(DBEntity.class); |
||||
|
||||
boolean result = DBController.single(entity,null); |
||||
|
||||
if(result){ |
||||
ResponseUtils.successResponse(res,"修改成功"); |
||||
}else{ |
||||
ResponseUtils.failedResponse(res,"修改失败"); |
||||
} |
||||
} |
||||
|
||||
@PostMapping(value = "/fsds/delete") |
||||
@ResponseBody |
||||
public void delete(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
|
||||
JSONObject param = Utils.getRequestBody(req); |
||||
String ids = param.getString("id"); |
||||
String[] idarray = ids.split(","); |
||||
boolean result = false; |
||||
|
||||
for (int i = 0; i < idarray.length; i++) { |
||||
String id = idarray[i]; |
||||
DBEntity entity = new DBEntity(); |
||||
entity.setId(id); |
||||
result = DBController.single(null,entity); |
||||
} |
||||
|
||||
if(result){ |
||||
ResponseUtils.successResponse(res,"删除成功"); |
||||
}else{ |
||||
ResponseUtils.failedResponse(res,"删除失败"); |
||||
} |
||||
} |
||||
|
||||
@PostMapping(value = "/fsds/getDWB") |
||||
@ResponseBody |
||||
public void getDWB(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
JSONObject param = Utils.getRequestBody(req); |
||||
JSONObject result = new JSONObject(); |
||||
String id = param.getString("appid"); |
||||
String url = param.getString("url"); |
||||
DBEntity feishuApp = DBController.getById(id); |
||||
String appid = feishuApp.getAppid(); |
||||
String secret = feishuApp.getSecret(); |
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray array =FeiShuUtils.getTableFields(url,token); |
||||
|
||||
result.put("header",array); |
||||
|
||||
JSONArray dataArray = FeiShuUtils.getTableData(url,token,""); |
||||
result.put("data",dataArray); |
||||
|
||||
ResponseUtils.successResponse(res,result.toString()); |
||||
} |
||||
|
||||
@PostMapping(value = "/fsds/getSheet") |
||||
@ResponseBody |
||||
public void getSheet(HttpServletRequest req,HttpServletResponse res){ |
||||
try { |
||||
validateLogin(req,res); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
return; |
||||
} |
||||
JSONObject param = Utils.getRequestBody(req); |
||||
String id = param.getString("appid"); |
||||
String url = param.getString("url"); |
||||
String rowSelect = param.getString("rowSelect"); |
||||
int headrow = param.getInt("headrow"); |
||||
String colSelect = param.getString("colSelect"); |
||||
|
||||
int rowsize = rowSelect.equals("custom") ? param.getInt("rowdata"):0; |
||||
String columnSize = colSelect.equals("colcustom") ? param.getString("coldata"):""; |
||||
|
||||
DBEntity feishuApp = DBController.getById(id); |
||||
String appid = feishuApp.getAppid(); |
||||
String secret = feishuApp.getSecret(); |
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray jsonArray =FeiShuUtils.getSheetData(url,token,rowsize,columnSize,headrow,5000,0); |
||||
|
||||
JSONArray dataHeader = new JSONArray(); |
||||
JSONArray datas = new JSONArray(); |
||||
JSONObject data = new JSONObject(); |
||||
for(int i =0;i< jsonArray.size();i++){ |
||||
JSONArray values = jsonArray.getJSONArray(i); |
||||
List<Object> rowDatas = new ArrayList<Object>(); |
||||
data = new JSONObject(); |
||||
|
||||
for (int j = 0; j < values.length(); j++) { |
||||
|
||||
if(i == 0){ |
||||
JSONObject header = new JSONObject(); |
||||
String str =headrow > 0 ? values.getString(j) : String.valueOf(j); |
||||
str = Utils.replaceNullStr(str,String.valueOf(j)); |
||||
header.put("field",str); |
||||
header.put("title",str); |
||||
dataHeader.add(header); |
||||
} |
||||
|
||||
|
||||
String field =dataHeader.getJSONObject(j).getString("field"); |
||||
String value = values.getString(j); |
||||
data.put(field,Utils.isNullStr(value) ? "" : value); |
||||
} |
||||
|
||||
if(i ==0 && headrow > 0){ |
||||
continue; |
||||
} |
||||
|
||||
datas.add(data); |
||||
} |
||||
|
||||
JSONObject result = new JSONObject(); |
||||
result.put("header",dataHeader); |
||||
result.put("data",datas); |
||||
|
||||
ResponseUtils.successResponse(res,result.toString()); |
||||
} |
||||
|
||||
/** |
||||
* 判断是否登陆 |
||||
* @param req |
||||
* @param res |
||||
* @throws Exception |
||||
*/ |
||||
private void validateLogin(HttpServletRequest req,HttpServletResponse res) throws Exception { |
||||
boolean isLogin = FRUtils.isLogin(req); |
||||
|
||||
if(!isLogin){ |
||||
ResponseUtils.failedResponse(res, Result.needLogin); |
||||
throw new Exception("needLogin"); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,73 @@
|
||||
package com.eco.plugin.shsytzfsds.db.bean; |
||||
|
||||
import com.fr.stable.db.entity.BaseEntity; |
||||
import com.fr.stable.db.entity.TableAssociation; |
||||
import com.fr.third.javax.persistence.Column; |
||||
import com.fr.third.javax.persistence.Entity; |
||||
import com.fr.third.javax.persistence.Table; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 10.0 |
||||
* Created by wink on 2021-07-29 |
||||
**/ |
||||
@Entity |
||||
@Table(name = "plugin_entity_fs") |
||||
@TableAssociation(associated = true) |
||||
public class DBEntity extends BaseEntity { |
||||
|
||||
@Column(name = "appname") |
||||
private String appname = null; |
||||
|
||||
@Column(name = "appid") |
||||
private String appid = null; |
||||
|
||||
@Column(name = "secret") |
||||
private String secret = null; |
||||
|
||||
@Column(name = "enable") |
||||
private Boolean enable = null; |
||||
|
||||
@Column(name = "describtion") |
||||
private String describtion = null; |
||||
|
||||
public String getAppname() { |
||||
return appname; |
||||
} |
||||
|
||||
public void setAppname(String appname) { |
||||
this.appname = appname; |
||||
} |
||||
|
||||
public String getAppid() { |
||||
return appid; |
||||
} |
||||
|
||||
public void setAppid(String appid) { |
||||
this.appid = appid; |
||||
} |
||||
|
||||
public String getSecret() { |
||||
return secret; |
||||
} |
||||
|
||||
public void setSecret(String secret) { |
||||
this.secret = secret; |
||||
} |
||||
|
||||
public Boolean getEnable() { |
||||
return enable; |
||||
} |
||||
|
||||
public void setEnable(Boolean enable) { |
||||
this.enable = enable; |
||||
} |
||||
|
||||
public String getDescribtion() { |
||||
return describtion; |
||||
} |
||||
|
||||
public void setDescribtion(String describtion) { |
||||
this.describtion = describtion; |
||||
} |
||||
} |
@ -0,0 +1,153 @@
|
||||
package com.eco.plugin.shsytzfsds.db.controller; |
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.dao.DBDao; |
||||
import com.eco.plugin.shsytzfsds.utils.FRUtils; |
||||
import com.fr.db.fun.impl.AbstractDBAccessProvider; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.record.analyzer.EnableMetrics; |
||||
import com.fr.stable.db.accessor.DBAccessor; |
||||
import com.fr.stable.db.action.DBAction; |
||||
import com.fr.stable.db.dao.DAOContext; |
||||
import com.fr.stable.db.dao.DAOProvider; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 10.0 |
||||
* Created by wink on 2021-07-29 |
||||
**/ |
||||
@EnableMetrics |
||||
@FunctionRecorder |
||||
public class DBController extends AbstractDBAccessProvider { |
||||
|
||||
private static DBAccessor accessor; |
||||
|
||||
public static DBAccessor getAccessor() { |
||||
return accessor; |
||||
} |
||||
|
||||
@Override |
||||
public DAOProvider[] registerDAO() { |
||||
return new DAOProvider[]{ |
||||
DBDao.DAO |
||||
}; |
||||
} |
||||
|
||||
@Override |
||||
public void onDBAvailable(DBAccessor accessor) { |
||||
DBController.accessor = accessor; |
||||
} |
||||
|
||||
/** |
||||
* 单个操作 |
||||
* @param addOrUpdate |
||||
* @param delete |
||||
* @return |
||||
*/ |
||||
public static boolean single(DBEntity addOrUpdate,DBEntity delete){ |
||||
//新增或者删除
|
||||
if(addOrUpdate != null ){ |
||||
try{ |
||||
accessor.runDMLAction(new DBAction<Boolean>() { |
||||
@Override |
||||
public Boolean run(DAOContext context) throws Exception { |
||||
DBEntity ae =context.getDAO(DBDao.class).getById(addOrUpdate.getId()); |
||||
if(ae != null ){ |
||||
context.getDAO(DBDao.class).update(addOrUpdate); |
||||
}else{ |
||||
context.getDAO(DBDao.class).add(addOrUpdate); |
||||
} |
||||
return true; |
||||
} |
||||
}); |
||||
}catch(Throwable e){ |
||||
FRUtils.FRLogError("single addOrUpdate exception ->"+e.getMessage() + addOrUpdate.toString()); |
||||
} |
||||
} |
||||
|
||||
if(delete != null ){ |
||||
try{ |
||||
accessor.runDMLAction(new DBAction<Boolean>() { |
||||
@Override |
||||
public Boolean run(DAOContext context) throws Exception { |
||||
context.getDAO(DBDao.class).remove(delete.getId()); |
||||
return true; |
||||
} |
||||
}); |
||||
}catch(Throwable e){ |
||||
FRUtils.FRLogError("single delete exception ->"+e.getMessage() + delete.toString()); |
||||
} |
||||
} |
||||
|
||||
return true; |
||||
} |
||||
|
||||
/** |
||||
* 根据id获取信息 |
||||
* @param id |
||||
* @return |
||||
*/ |
||||
public static DBEntity getById(final String id){ |
||||
try{ |
||||
return accessor.runQueryAction(new DBAction<DBEntity>() { |
||||
@Override |
||||
public DBEntity run(DAOContext context) throws Exception { |
||||
DBEntity result = context.getDAO(DBDao.class).getById(id); |
||||
|
||||
return result == null ? new DBEntity() : result; |
||||
} |
||||
}); |
||||
}catch(Throwable e){ |
||||
FRUtils.FRLogError("exception getByUsername:"+e.getMessage()); |
||||
} |
||||
|
||||
return new DBEntity(); |
||||
} |
||||
|
||||
/** |
||||
* 获取全部信息 |
||||
* @param |
||||
* @return |
||||
*/ |
||||
public static List<DBEntity> getAll(){ |
||||
try{ |
||||
return accessor.runQueryAction(new DBAction<List<DBEntity>>() { |
||||
@Override |
||||
public List<DBEntity> run(DAOContext context) throws Exception { |
||||
List<DBEntity> result = context.getDAO(DBDao.class).getAll(); |
||||
|
||||
return result == null ? new ArrayList<>() : result; |
||||
} |
||||
}); |
||||
}catch(Throwable e){ |
||||
FRUtils.FRLogError("exception getById:"+e.getMessage()); |
||||
} |
||||
|
||||
return new ArrayList<>(); |
||||
} |
||||
|
||||
/** |
||||
* 获取全部信息 |
||||
* @param |
||||
* @return |
||||
*/ |
||||
public static List<DBEntity> getAllPage(){ |
||||
try{ |
||||
return accessor.runQueryAction(new DBAction<List<DBEntity>>() { |
||||
@Override |
||||
public List<DBEntity> run(DAOContext context) throws Exception { |
||||
List<DBEntity> result = context.getDAO(DBDao.class).getAllPage(); |
||||
|
||||
return result == null ? new ArrayList<>() : result; |
||||
} |
||||
}); |
||||
}catch(Throwable e){ |
||||
FRUtils.FRLogError("exception getById:"+e.getMessage()); |
||||
} |
||||
|
||||
return new ArrayList<>(); |
||||
} |
||||
} |
@ -0,0 +1,66 @@
|
||||
package com.eco.plugin.shsytzfsds.db.dao; |
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.fr.stable.db.dao.BaseDAO; |
||||
import com.fr.stable.db.dao.DAOProvider; |
||||
import com.fr.stable.db.session.DAOSession; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.condition.QueryCondition; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 10.0 |
||||
* Created by wink on 2021-12-03 |
||||
**/ |
||||
public class DBDao extends BaseDAO<DBEntity> { |
||||
|
||||
public DBDao(DAOSession session) { |
||||
super(session); |
||||
} |
||||
|
||||
@Override |
||||
protected Class<DBEntity> getEntityClass() { |
||||
return DBEntity.class; |
||||
} |
||||
|
||||
public final static DAOProvider DAO = new DAOProvider() { |
||||
@Override |
||||
public Class getEntityClass() { |
||||
return DBEntity.class; |
||||
} |
||||
|
||||
@Override |
||||
public Class<? extends BaseDAO> getDAOClass() { |
||||
return DBDao.class; |
||||
} |
||||
}; |
||||
|
||||
public void add(DBEntity entity) throws Exception { |
||||
getSession().persist(entity); |
||||
} |
||||
|
||||
public void remove(String id) throws Exception { |
||||
getSession().remove(QueryFactory.create() |
||||
.addRestriction(RestrictionFactory.eq("id", id)), |
||||
this.getEntityClass()); |
||||
} |
||||
|
||||
public void update(DBEntity entity) throws Exception { |
||||
getSession().merge(entity); |
||||
} |
||||
|
||||
public List<DBEntity> getAll()throws Exception{ |
||||
QueryCondition condition = QueryFactory.create() |
||||
.addRestriction(RestrictionFactory.like("appname", "")); |
||||
return find(condition); |
||||
} |
||||
|
||||
public List<DBEntity> getAllPage()throws Exception{ |
||||
QueryCondition condition = QueryFactory.create() |
||||
.addRestriction(RestrictionFactory.like("appname", "")); |
||||
return find(condition); |
||||
} |
||||
} |
@ -0,0 +1,144 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.controller.DBController; |
||||
import com.eco.plugin.shsytzfsds.utils.FRUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.FeiShuUtils; |
||||
import com.fr.data.AbstractDataModel; |
||||
import com.fr.general.data.TableDataException; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.ParameterProvider; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author 秃破天际 |
||||
* @version 10.0 |
||||
* Created by 秃破天际 on 2021-03-29 |
||||
**/ |
||||
public class DataModel extends AbstractDataModel { |
||||
|
||||
private String config; |
||||
private ParameterProvider[] parameters; |
||||
|
||||
//表头
|
||||
private static String[] dataHeader = {}; |
||||
|
||||
//表数据
|
||||
private List<List<Object>> datas = new ArrayList<>(); |
||||
|
||||
public DataModel(Calculator calculator, ParameterProvider[] parameters, String config){ |
||||
this.parameters = parameters; |
||||
this.config = config; |
||||
try { |
||||
queryData(); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
FRUtils.FRLogInfo("获取数据异常:"+e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public int getColumnCount() throws TableDataException { |
||||
return dataHeader.length; |
||||
} |
||||
|
||||
@Override |
||||
public String getColumnName(int colIdx) throws TableDataException { |
||||
return dataHeader[colIdx]; |
||||
} |
||||
|
||||
@Override |
||||
public int getRowCount() throws TableDataException { |
||||
if (this.datas == null) { |
||||
return 0; |
||||
} |
||||
|
||||
if (datas == null) { |
||||
return 0; |
||||
} |
||||
int count = datas.size(); |
||||
return count; |
||||
} |
||||
|
||||
@Override |
||||
public Object getValueAt(int rowIdx, int colIdx) throws TableDataException { |
||||
if (this.datas == null) { |
||||
return ""; |
||||
} |
||||
|
||||
if ((datas == null) || (datas.size() <= rowIdx)) { |
||||
return ""; |
||||
} |
||||
List<Object> rowValues = datas.get(rowIdx); |
||||
if ((rowValues == null) || (rowValues.size() <= colIdx)) { |
||||
return ""; |
||||
} |
||||
return rowValues.get(colIdx); |
||||
} |
||||
|
||||
@Override |
||||
public void release() throws Exception { |
||||
parameters = null; |
||||
config = null; |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------以下为获取数据的的逻辑
|
||||
/** |
||||
* 查询数据 |
||||
*/ |
||||
private void queryData() throws Exception { |
||||
String feishuid = ""; |
||||
String url = ""; |
||||
for (ParameterProvider pv : this.parameters){ |
||||
if(pv.getName().equals("appid")){ |
||||
feishuid = String.valueOf(pv.getValue()); |
||||
} |
||||
|
||||
if(pv.getName().equals("url")){ |
||||
url = String.valueOf(pv.getValue()); |
||||
} |
||||
} |
||||
|
||||
DBEntity feishuApp = DBController.getById(feishuid); |
||||
String appid = feishuApp.getAppid(); |
||||
String secret = feishuApp.getSecret(); |
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray array =FeiShuUtils.getTableFields(url,token); |
||||
dataHeader = new String[array.length()]; |
||||
for (int i = 0; i < array.length(); i++) { |
||||
dataHeader[i] = array.getString(i); |
||||
} |
||||
|
||||
JSONArray dataArray = FeiShuUtils.getTableData(url,token,""); |
||||
addRowDatas(dataArray); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 添加行数据 |
||||
* @param jsonArray |
||||
*/ |
||||
private void addRowDatas(JSONArray jsonArray) { |
||||
if(jsonArray == null || jsonArray.size() <= 0){ |
||||
return ; |
||||
} |
||||
|
||||
for(int i =0;i< jsonArray.size();i++){ |
||||
JSONObject fields = jsonArray.getJSONObject(i).getJSONObject("fields"); |
||||
List<Object> rowDatas = new ArrayList<Object>(); |
||||
|
||||
for(String header : dataHeader){ |
||||
rowDatas.add(fields.getString(header)); |
||||
} |
||||
|
||||
datas.add(rowDatas); |
||||
} |
||||
|
||||
|
||||
} |
||||
} |
@ -0,0 +1,169 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.controller.DBController; |
||||
import com.eco.plugin.shsytzfsds.utils.FRUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.FeiShuUtils; |
||||
import com.eco.plugin.shsytzfsds.utils.Utils; |
||||
import com.fr.data.AbstractDataModel; |
||||
import com.fr.general.data.TableDataException; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.ParameterProvider; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
|
||||
public class DataModelSheet extends AbstractDataModel { |
||||
|
||||
private String config; |
||||
private ParameterProvider[] parameters; |
||||
|
||||
//表头
|
||||
private static String[] dataHeader = new String[0]; |
||||
|
||||
//表数据
|
||||
private List<List<Object>> datas = new ArrayList<>(); |
||||
|
||||
public DataModelSheet(Calculator calculator, ParameterProvider[] parameters, String config){ |
||||
this.parameters = parameters; |
||||
this.config = config; |
||||
try { |
||||
queryData(); |
||||
} catch (Exception e) { |
||||
e.printStackTrace(); |
||||
FRUtils.FRLogInfo("获取数据异常:"+e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public int getColumnCount() throws TableDataException { |
||||
return dataHeader.length; |
||||
} |
||||
|
||||
@Override |
||||
public String getColumnName(int colIdx) throws TableDataException { |
||||
return dataHeader[colIdx]; |
||||
} |
||||
|
||||
@Override |
||||
public int getRowCount() throws TableDataException { |
||||
if (this.datas == null) { |
||||
return 0; |
||||
} |
||||
|
||||
if (datas == null) { |
||||
return 0; |
||||
} |
||||
int count = datas.size(); |
||||
return count; |
||||
} |
||||
|
||||
@Override |
||||
public Object getValueAt(int rowIdx, int colIdx) throws TableDataException { |
||||
if (this.datas == null) { |
||||
return ""; |
||||
} |
||||
|
||||
if ((datas == null) || (datas.size() <= rowIdx)) { |
||||
return ""; |
||||
} |
||||
List<Object> rowValues = datas.get(rowIdx); |
||||
if ((rowValues == null) || (rowValues.size() <= colIdx)) { |
||||
return ""; |
||||
} |
||||
return rowValues.get(colIdx); |
||||
} |
||||
|
||||
@Override |
||||
public void release() throws Exception { |
||||
parameters = null; |
||||
config = null; |
||||
} |
||||
|
||||
//----------------------------------------------------------------------------以下为获取数据的的逻辑
|
||||
/** |
||||
* 查询数据 |
||||
*/ |
||||
private void queryData() throws Exception { |
||||
String feishuid = ""; |
||||
String url = ""; |
||||
int headrow = 0; |
||||
int rowsize = 0; |
||||
String columnSize = ""; |
||||
for (ParameterProvider pv : this.parameters){ |
||||
if(pv.getName().equals("appid")){ |
||||
feishuid = String.valueOf(pv.getValue()); |
||||
} |
||||
|
||||
if(pv.getName().equals("url")){ |
||||
url = String.valueOf(pv.getValue()); |
||||
} |
||||
|
||||
if(pv.getName().equals("headrow")){ |
||||
String value =String.valueOf(pv.getValue()); |
||||
if(Utils.isNullStr(value)){ |
||||
value = "0"; |
||||
} |
||||
headrow = Integer.valueOf(value); |
||||
if(headrow < 0){ |
||||
headrow = 0; |
||||
} |
||||
} |
||||
|
||||
if(pv.getName().equals("rowsize")){ |
||||
rowsize = Integer.valueOf(String.valueOf(pv.getValue())); |
||||
} |
||||
|
||||
if(pv.getName().equals("columnSize")){ |
||||
columnSize = String.valueOf(pv.getValue()); |
||||
} |
||||
|
||||
} |
||||
|
||||
DBEntity feishuApp = DBController.getById(feishuid); |
||||
String appid = feishuApp.getAppid(); |
||||
String secret = feishuApp.getSecret(); |
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray array =FeiShuUtils.getSheetData(url,token,rowsize,columnSize,headrow,5000,0); |
||||
addRowDatas(array,headrow); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 添加行数据 |
||||
* @param jsonArray |
||||
*/ |
||||
private void addRowDatas(JSONArray jsonArray,int headerrow) { |
||||
if(jsonArray == null || jsonArray.size() <= 0){ |
||||
return ; |
||||
} |
||||
|
||||
for(int i =0;i< jsonArray.size();i++){ |
||||
JSONArray values = jsonArray.getJSONArray(i); |
||||
List<Object> rowDatas = new ArrayList<Object>(); |
||||
|
||||
for (int j = 0; j < values.length(); j++) { |
||||
|
||||
if(i == 0){ |
||||
if(j == 0){ |
||||
dataHeader = new String[values.length()]; |
||||
} |
||||
|
||||
dataHeader[j] = headerrow > 0 ? values.getString(j) : String.valueOf(j); |
||||
} |
||||
|
||||
rowDatas.add(values.getString(j)); |
||||
} |
||||
|
||||
if(i ==0 && headerrow > 0){ |
||||
continue; |
||||
} |
||||
datas.add(rowDatas); |
||||
} |
||||
|
||||
|
||||
} |
||||
} |
@ -0,0 +1,58 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
import com.fr.config.holder.Conf; |
||||
import com.fr.config.holder.factory.Holders; |
||||
import com.fr.data.AbstractParameterTableData; |
||||
import com.fr.general.xml.GeneralXMLTools; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.EncodeConstants; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
|
||||
public class TableData extends AbstractParameterTableData { |
||||
/** |
||||
* 自定义一些配置 |
||||
*/ |
||||
private Conf<String> config = Holders.simple(StringUtils.EMPTY); |
||||
|
||||
public String getConfig() { |
||||
return config.get(); |
||||
} |
||||
|
||||
public void setConfig( String config) { |
||||
this.config.set(config); |
||||
} |
||||
|
||||
@Override |
||||
public DataModel createDataModel(Calculator calculator) { |
||||
return new DataModel( calculator, |
||||
Calculator.processParameters(calculator,super.getParameters(calculator)), |
||||
getConfig() ); |
||||
} |
||||
|
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
super.readXML(reader); |
||||
if (reader.isChildNode()){ |
||||
if ("Attributes".equals(reader.getTagName())) { |
||||
try{ |
||||
String conf = new String(GeneralXMLTools.readByteArray(reader), EncodeConstants.ENCODING_UTF_8); |
||||
setConfig(conf); |
||||
}catch(Exception e){ |
||||
setConfig(StringUtils.EMPTY); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
super.writeXML(writer); |
||||
writer.startTAG("Attributes"); |
||||
try{ |
||||
GeneralXMLTools.writeByteArray(writer, getConfig().getBytes(EncodeConstants.ENCODING_UTF_8)); |
||||
}catch(Exception e){} |
||||
writer.end(); |
||||
} |
||||
} |
@ -0,0 +1,63 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
import com.fr.decision.webservice.bean.BaseBean; |
||||
import com.fr.decision.webservice.bean.dataset.ParameterBean; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 10.0 |
||||
* Created by wink on 2022-11-07 |
||||
**/ |
||||
public class TableDataBean extends BaseBean { |
||||
private List<ParameterBean> parameters = new ArrayList(); |
||||
private String config; |
||||
|
||||
public List<ParameterBean> getParameters() { |
||||
return parameters; |
||||
} |
||||
|
||||
public void setParameters(List<ParameterBean> parameters) { |
||||
this.parameters = parameters; |
||||
} |
||||
|
||||
public String getConfig() { |
||||
return config; |
||||
} |
||||
|
||||
public void setConfig(String config) { |
||||
this.config = config; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object o){ |
||||
return o instanceof TableDataBean |
||||
&& StringUtils.equals(((TableDataBean)o).config, config) |
||||
&& isSameParameter(((TableDataBean)o).parameters); |
||||
} |
||||
|
||||
private boolean isSameParameter(List<ParameterBean> parameters){ |
||||
if( null == parameters && null != this.parameters ){ |
||||
return false; |
||||
} |
||||
if( null != parameters && null == this.parameters ){ |
||||
return false; |
||||
} |
||||
if( parameters.size() != this.parameters.size() ){ |
||||
return false; |
||||
} |
||||
for( int i=0,len= parameters.size();i<len;i++){ |
||||
ParameterBean oItem = parameters.get(i); |
||||
ParameterBean sItem = this.parameters.get(i); |
||||
if( !StringUtils.equals(oItem.getName(),sItem.getName()) || |
||||
!StringUtils.equals(oItem.getValue(),sItem.getValue()) || |
||||
!StringUtils.equals(oItem.getType(),sItem.getType()) ){ |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
} |
@ -0,0 +1,63 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
import com.fr.decision.webservice.bean.BaseBean; |
||||
import com.fr.decision.webservice.bean.dataset.ParameterBean; |
||||
import com.fr.stable.StringUtils; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author wink |
||||
* @version 10.0 |
||||
* Created by wink on 2022-11-07 |
||||
**/ |
||||
public class TableDataBeanSheet extends BaseBean { |
||||
private List<ParameterBean> parameters = new ArrayList(); |
||||
private String config; |
||||
|
||||
public List<ParameterBean> getParameters() { |
||||
return parameters; |
||||
} |
||||
|
||||
public void setParameters(List<ParameterBean> parameters) { |
||||
this.parameters = parameters; |
||||
} |
||||
|
||||
public String getConfig() { |
||||
return config; |
||||
} |
||||
|
||||
public void setConfig(String config) { |
||||
this.config = config; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object o){ |
||||
return o instanceof TableDataBeanSheet |
||||
&& StringUtils.equals(((TableDataBeanSheet)o).config, config) |
||||
&& isSameParameter(((TableDataBeanSheet)o).parameters); |
||||
} |
||||
|
||||
private boolean isSameParameter(List<ParameterBean> parameters){ |
||||
if( null == parameters && null != this.parameters ){ |
||||
return false; |
||||
} |
||||
if( null != parameters && null == this.parameters ){ |
||||
return false; |
||||
} |
||||
if( parameters.size() != this.parameters.size() ){ |
||||
return false; |
||||
} |
||||
for( int i=0,len= parameters.size();i<len;i++){ |
||||
ParameterBean oItem = parameters.get(i); |
||||
ParameterBean sItem = this.parameters.get(i); |
||||
if( !StringUtils.equals(oItem.getName(),sItem.getName()) || |
||||
!StringUtils.equals(oItem.getValue(),sItem.getValue()) || |
||||
!StringUtils.equals(oItem.getType(),sItem.getType()) ){ |
||||
return false; |
||||
} |
||||
} |
||||
return true; |
||||
} |
||||
} |
@ -0,0 +1,58 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
import com.fr.config.holder.Conf; |
||||
import com.fr.config.holder.factory.Holders; |
||||
import com.fr.data.AbstractParameterTableData; |
||||
import com.fr.general.xml.GeneralXMLTools; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.EncodeConstants; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
|
||||
public class TableDataSheet extends AbstractParameterTableData { |
||||
/** |
||||
* 自定义一些配置 |
||||
*/ |
||||
private Conf<String> config = Holders.simple(StringUtils.EMPTY); |
||||
|
||||
public String getConfig() { |
||||
return config.get(); |
||||
} |
||||
|
||||
public void setConfig( String config) { |
||||
this.config.set(config); |
||||
} |
||||
|
||||
@Override |
||||
public DataModelSheet createDataModel(Calculator calculator) { |
||||
return new DataModelSheet( calculator, |
||||
Calculator.processParameters(calculator,super.getParameters(calculator)), |
||||
getConfig() ); |
||||
} |
||||
|
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
super.readXML(reader); |
||||
if (reader.isChildNode()){ |
||||
if ("Attributes".equals(reader.getTagName())) { |
||||
try{ |
||||
String conf = new String(GeneralXMLTools.readByteArray(reader), EncodeConstants.ENCODING_UTF_8); |
||||
setConfig(conf); |
||||
}catch(Exception e){ |
||||
setConfig(StringUtils.EMPTY); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
super.writeXML(writer); |
||||
writer.startTAG("Attributes"); |
||||
try{ |
||||
GeneralXMLTools.writeByteArray(writer, getConfig().getBytes(EncodeConstants.ENCODING_UTF_8)); |
||||
}catch(Exception e){} |
||||
writer.end(); |
||||
} |
||||
} |
@ -0,0 +1,69 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
import com.fr.base.Parameter; |
||||
import com.fr.decision.fun.impl.AbstractUniversalServerTableDataProvider; |
||||
import com.fr.decision.webservice.bean.dataset.ParameterBean; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.plugin.transform.FunctionRecorder; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.ParameterProvider; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Component; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ParserType; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
@FunctionRecorder |
||||
public class UniversalServerTableData extends AbstractUniversalServerTableDataProvider<TableData> { |
||||
@Override |
||||
public Class classForTableData() { |
||||
return TableData.class; |
||||
} |
||||
|
||||
@Override |
||||
public String nameForTableData() { |
||||
return "飞书多维表数据集"; |
||||
} |
||||
|
||||
@Override |
||||
public JSONObject serialize(TableData data) { |
||||
TableDataBean bean = new TableDataBean(); |
||||
bean.setConfig(data.getConfig()); |
||||
List<ParameterBean> parameterBeans = new ArrayList(); |
||||
ParameterProvider[] parameters = data.getParameters(Calculator.createCalculator()); |
||||
for (ParameterProvider parameter : parameters) { |
||||
parameterBeans.add(new ParameterBean(parameter.getValue().getClass().getSimpleName(), |
||||
parameter.getName(), |
||||
parameter.valueToString())); |
||||
} |
||||
bean.setParameters(parameterBeans); |
||||
return JSONObject.mapFrom(bean); |
||||
} |
||||
|
||||
@Override |
||||
public TableData deserialize(TableData data, JSONObject config) { |
||||
TableDataBean bean = config.mapTo(TableDataBean.class); |
||||
TableData dataSet = new TableData(); |
||||
dataSet.setConfig(bean.getConfig()); |
||||
List<ParameterBean> params = bean.getParameters(); |
||||
Parameter[] parameters = new Parameter[params.size()]; |
||||
for (int i = 0; i < parameters.length; ++i) { |
||||
parameters[i] = params.get(i).createParameter(); |
||||
} |
||||
dataSet.setParameters(parameters); |
||||
return dataSet; |
||||
} |
||||
|
||||
@Override |
||||
public Atom client() { |
||||
return new Component() { |
||||
@Override |
||||
public ScriptPath script(RequestClient client) { |
||||
return ScriptPath.build("com/eco/plugin/shsytzfsds/js/univalsalServerTable.js", ParserType.DYNAMIC); |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,67 @@
|
||||
package com.eco.plugin.shsytzfsds.univalsalServerTable; |
||||
|
||||
import com.fr.base.Parameter; |
||||
import com.fr.decision.fun.impl.AbstractUniversalServerTableDataProvider; |
||||
import com.fr.decision.webservice.bean.dataset.ParameterBean; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.ParameterProvider; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Component; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ParserType; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
public class UniversalServerTableDataSheet extends AbstractUniversalServerTableDataProvider<TableDataSheet> { |
||||
@Override |
||||
public Class classForTableData() { |
||||
return TableDataSheet.class; |
||||
} |
||||
|
||||
@Override |
||||
public String nameForTableData() { |
||||
return "飞书表格单sheet数据集"; |
||||
} |
||||
|
||||
@Override |
||||
public JSONObject serialize(TableDataSheet data) { |
||||
TableDataBeanSheet bean = new TableDataBeanSheet(); |
||||
bean.setConfig(data.getConfig()); |
||||
List<ParameterBean> parameterBeans = new ArrayList(); |
||||
ParameterProvider[] parameters = data.getParameters(Calculator.createCalculator()); |
||||
for (ParameterProvider parameter : parameters) { |
||||
parameterBeans.add(new ParameterBean(parameter.getValue().getClass().getSimpleName(), |
||||
parameter.getName(), |
||||
parameter.valueToString())); |
||||
} |
||||
bean.setParameters(parameterBeans); |
||||
return JSONObject.mapFrom(bean); |
||||
} |
||||
|
||||
@Override |
||||
public TableDataSheet deserialize(TableDataSheet data, JSONObject config) { |
||||
TableDataBeanSheet bean = config.mapTo(TableDataBeanSheet.class); |
||||
TableDataSheet dataSet = new TableDataSheet(); |
||||
dataSet.setConfig(bean.getConfig()); |
||||
List<ParameterBean> params = bean.getParameters(); |
||||
Parameter[] parameters = new Parameter[params.size()]; |
||||
for (int i = 0; i < parameters.length; ++i) { |
||||
parameters[i] = params.get(i).createParameter(); |
||||
} |
||||
dataSet.setParameters(parameters); |
||||
return dataSet; |
||||
} |
||||
|
||||
@Override |
||||
public Atom client() { |
||||
return new Component() { |
||||
@Override |
||||
public ScriptPath script(RequestClient client) { |
||||
return ScriptPath.build("com/eco/plugin/shsytzfsds/js/univalsalServerTableSheet.js", ParserType.DYNAMIC); |
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,89 @@
|
||||
package com.eco.plugin.shsytzfsds.utils; |
||||
|
||||
import com.eco.plugin.shsytzfsds.db.bean.DBEntity; |
||||
import com.eco.plugin.shsytzfsds.db.controller.DBController; |
||||
import com.fr.data.core.db.ColumnInformation; |
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
import scala.annotation.meta.field; |
||||
|
||||
import java.sql.Types; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
|
||||
/** |
||||
* 数据集工具类 |
||||
*/ |
||||
public class DataSetUtils { |
||||
|
||||
|
||||
/** |
||||
* 获取数据集请求头 |
||||
* @param paramStr |
||||
* @return |
||||
*/ |
||||
public static ColumnInformation[] getHeader(String paramStr){ |
||||
|
||||
JSONObject param = new JSONObject(paramStr); |
||||
String appid = param.getString("appid"); |
||||
String url = param.getString("url"); |
||||
|
||||
DBEntity feishuApp = DBController.getById(appid); |
||||
String secret = feishuApp.getSecret(); |
||||
|
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray array =FeiShuUtils.getTableFields(url,token); |
||||
|
||||
ColumnInformation[] columnInformations = new ColumnInformation[array.length()]; |
||||
|
||||
for (int i = 0; i < array.length(); i++) { |
||||
ColumnInformation columnInformation = new ColumnInformation(array.getString(i), Types.VARCHAR,"VARCHAR",255,0); |
||||
columnInformations[i] =columnInformation; |
||||
} |
||||
|
||||
return columnInformations; |
||||
} |
||||
|
||||
/** |
||||
* 获取电子表格头 |
||||
* @param paramStr |
||||
* @return |
||||
*/ |
||||
public static ColumnInformation[] getSheetHeader(String paramStr){ |
||||
JSONObject param = new JSONObject(paramStr); |
||||
String id = param.getString("appid"); |
||||
String url = param.getString("url"); |
||||
int headrow = param.getInt("headrow"); |
||||
String colSelect = param.getString("colSelect"); |
||||
|
||||
int rowsize = headrow+1; |
||||
String columnSize = colSelect.equals("colcustom") ? param.getString("coldata"):""; |
||||
|
||||
DBEntity feishuApp = DBController.getById(id); |
||||
String appid = feishuApp.getAppid(); |
||||
String secret = feishuApp.getSecret(); |
||||
String token = FeiShuUtils.getTenantToken(appid,secret); |
||||
JSONArray jsonArray =FeiShuUtils.getSheetData(url,token,rowsize,columnSize,headrow,10,0); |
||||
ColumnInformation[] columnInformations = null; |
||||
for(int i =0;i< jsonArray.size();i++){ |
||||
JSONArray values = jsonArray.getJSONArray(i); |
||||
|
||||
for (int j = 0; j < values.length(); j++) { |
||||
|
||||
if(i == 0){ |
||||
if(j == 0){ |
||||
columnInformations = new ColumnInformation[values.length()]; |
||||
} |
||||
String field =headrow > 0 ? values.getString(j) : String.valueOf(j); |
||||
field = Utils.replaceNullStr(field,String.valueOf(j)); |
||||
ColumnInformation columnInformation = new ColumnInformation(field, Types.VARCHAR,"VARCHAR",255,0); |
||||
columnInformations[j] =columnInformation; |
||||
} |
||||
} |
||||
|
||||
break; |
||||
} |
||||
|
||||
return columnInformations; |
||||
} |
||||
} |
@ -0,0 +1,378 @@
|
||||
package com.eco.plugin.shsytzfsds.utils; |
||||
|
||||
import com.fr.base.ServerConfig; |
||||
import com.fr.base.TableData; |
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.decision.authority.AuthorityContext; |
||||
import com.fr.decision.authority.base.constant.type.operation.ManualOperationType; |
||||
import com.fr.decision.authority.data.User; |
||||
import com.fr.decision.base.util.UUIDUtil; |
||||
import com.fr.decision.privilege.TransmissionTool; |
||||
import com.fr.decision.privilege.encrpt.PasswordValidator; |
||||
import com.fr.decision.webservice.bean.authentication.OriginUrlResponseBean; |
||||
import com.fr.decision.webservice.interceptor.handler.ReportTemplateRequestChecker; |
||||
import com.fr.decision.webservice.login.LogInOutResultInfo; |
||||
import com.fr.decision.webservice.utils.DecisionServiceConstants; |
||||
import com.fr.decision.webservice.utils.DecisionStatusService; |
||||
import com.fr.decision.webservice.utils.UserSourceFactory; |
||||
import com.fr.decision.webservice.v10.login.LoginService; |
||||
import com.fr.decision.webservice.v10.login.event.LogInOutEvent; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.event.EventDispatcher; |
||||
import com.fr.file.TableDataConfig; |
||||
import com.fr.general.data.DataModel; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.script.Calculator; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.stable.query.QueryFactory; |
||||
import com.fr.stable.query.restriction.RestrictionFactory; |
||||
import com.fr.third.springframework.web.method.HandlerMethod; |
||||
import com.fr.web.controller.ReportRequestService; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.Cookie; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import javax.servlet.http.HttpSession; |
||||
import java.io.IOException; |
||||
import java.util.List; |
||||
|
||||
public class FRUtils { |
||||
/** |
||||
* 判断用户是否存在 |
||||
* @param userName |
||||
* @return |
||||
*/ |
||||
public static boolean isUserExist(String userName){ |
||||
if (StringUtils.isEmpty(userName)) { |
||||
return false; |
||||
} else { |
||||
try { |
||||
List userList = AuthorityContext.getInstance().getUserController().find(QueryFactory.create().addRestriction(RestrictionFactory.eq("userName", userName))); |
||||
return userList != null && !userList.isEmpty(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage()); |
||||
return false; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 判断是否登录FR |
||||
* @param req |
||||
* @return |
||||
*/ |
||||
public static boolean isLogin(HttpServletRequest req){ |
||||
return LoginService.getInstance().isLogged(req); |
||||
} |
||||
|
||||
/** |
||||
* 帆软登录 |
||||
* @param httpServletRequest |
||||
* @param httpServletResponse |
||||
* @param userName |
||||
* @param url |
||||
*/ |
||||
public static void login(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String userName,String url){ |
||||
FineLoggerFactory.getLogger().debug("FRLOG:用户名:"+userName+";跳转链接:"+url); |
||||
|
||||
//判断用户名是否为空
|
||||
if(!Utils.isNullStr(userName)){ |
||||
if(isUserExist(userName)){ |
||||
try { |
||||
LoginService.getInstance().login(httpServletRequest, httpServletResponse, userName); |
||||
|
||||
EventDispatcher.fire(LogInOutEvent.LOGIN,new LogInOutResultInfo(httpServletRequest,httpServletResponse,userName,true)); |
||||
FineLoggerFactory.getLogger().debug("FRLOG:登陆成功!"); |
||||
|
||||
if(!Utils.isNullStr(url)){ |
||||
httpServletResponse.sendRedirect(url); |
||||
} |
||||
} catch (Exception e) { |
||||
ResponseUtils.failedResponse(httpServletResponse,"登录异常,请联系管理员!"); |
||||
FineLoggerFactory.getLogger().debug("FRLOGException:"+e.getMessage()); |
||||
} |
||||
}else{ |
||||
ResponseUtils.failedResponse(httpServletResponse,"用户:"+userName+"在帆软系统中不存在!"); |
||||
} |
||||
}else{ |
||||
ResponseUtils.failedResponse(httpServletResponse,"用户名不能为空!"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 帆软登录 |
||||
* @param httpServletRequest |
||||
* @param httpServletResponse |
||||
* @param token |
||||
* @param url |
||||
*/ |
||||
public static void loginByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token,String url){ |
||||
|
||||
FineLoggerFactory.getLogger().debug("FRLOG:token:"+token+";跳转链接:"+url); |
||||
|
||||
//判断用户名是否为空
|
||||
if(!Utils.isNullStr(token)){ |
||||
writeToken2Cookie(httpServletResponse,token,-1); |
||||
|
||||
HttpSession session = httpServletRequest.getSession(true); |
||||
|
||||
httpServletRequest.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME,token); |
||||
|
||||
session.setAttribute(DecisionServiceConstants.FINE_AUTH_TOKEN_NAME, token); |
||||
|
||||
if(!Utils.isNullStr(url)){ |
||||
try { |
||||
httpServletResponse.sendRedirect(url); |
||||
} catch (IOException e) { |
||||
ResponseUtils.failedResponse(httpServletResponse,"跳转异常!"); |
||||
} |
||||
} |
||||
}else{ |
||||
ResponseUtils.failedResponse(httpServletResponse,"token不能为空!"); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 产品原始登录方法 |
||||
* @param req |
||||
* @param res |
||||
* @param username |
||||
* @return |
||||
*/ |
||||
public static JSONObject originLogin(HttpServletRequest req,HttpServletResponse res,String username){ |
||||
// String password = param.getString("password");
|
||||
// password = decryptFRPsd(password);
|
||||
|
||||
FRUtils.FRLogInfo("originLogin:"+username); |
||||
|
||||
if(isUserExist(username)){ |
||||
try { |
||||
String token = LoginService.getInstance().login(req, res, username); |
||||
JSONObject result = new JSONObject(); |
||||
result.put("username",username); |
||||
result.put("validity",-1); |
||||
result.put("accessToken",token); |
||||
result.put("username",username); |
||||
result.put("url","/webroot/decision"); |
||||
JSONObject originUrlResponse = new JSONObject(); |
||||
originUrlResponse.put("originUrl","/webroot/decision"); |
||||
originUrlResponse.put("method","GET"); |
||||
originUrlResponse.put("parameters",new JSONObject()); |
||||
result.put("originUrlResponse",originUrlResponse); |
||||
return new JSONObject().put("data",result); |
||||
} catch (Exception e) { |
||||
ResponseUtils.failedResponse(res,"登录异常,请联系管理员!"); |
||||
} |
||||
}else{ |
||||
ResponseUtils.failedResponse(res,"用户:"+username+"在帆软系统中不存在!"); |
||||
} |
||||
|
||||
return new JSONObject(); |
||||
} |
||||
|
||||
/** |
||||
* 获取token |
||||
* @param httpServletRequest |
||||
* @param httpServletResponse |
||||
* @param username |
||||
* @return |
||||
*/ |
||||
public static String getToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String username){ |
||||
String token = ""; |
||||
try { |
||||
token = LoginService.getInstance().login(httpServletRequest, httpServletResponse, username); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().debug("FRLOG:获取token失败"+e.getMessage()); |
||||
} |
||||
|
||||
return token; |
||||
} |
||||
|
||||
private static void writeToken2Cookie(HttpServletResponse req, String token, int num) { |
||||
try { |
||||
if (StringUtils.isNotEmpty(token)) { |
||||
Cookie cookie = new Cookie("fine_auth_token", token); |
||||
long maxAge = num == -2 ? 1209600000L : (long)num; |
||||
cookie.setMaxAge((int)maxAge); |
||||
cookie.setPath(ServerConfig.getInstance().getCookiePath()); |
||||
req.addCookie(cookie); |
||||
Cookie rememberCookie = new Cookie("fine_remember_login", String.valueOf(num == -2 ? -2 : -1)); |
||||
rememberCookie.setMaxAge((int)maxAge); |
||||
rememberCookie.setPath(ServerConfig.getInstance().getCookiePath()); |
||||
req.addCookie(rememberCookie); |
||||
} else { |
||||
FineLoggerFactory.getLogger().error("empty token cannot save."); |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 后台登出 |
||||
* @param httpServletRequest |
||||
* @param httpServletResponse |
||||
*/ |
||||
public static void logoutByToken(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse,String token) |
||||
{ |
||||
httpServletRequest.setAttribute("fine_auth_token",token); |
||||
logout(httpServletRequest,httpServletResponse); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param httpServletRequest |
||||
* @param httpServletResponse |
||||
*/ |
||||
public static void logout(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse) |
||||
{ |
||||
if(!isLogin(httpServletRequest)){ |
||||
return ; |
||||
} |
||||
|
||||
try { |
||||
LoginService.getInstance().logout(httpServletRequest,httpServletResponse); |
||||
} catch (Exception e) { |
||||
ResponseUtils.failedResponse(httpServletResponse,"登出异常,请联系管理员!"); |
||||
FineLoggerFactory.getLogger().debug("FRLOGException:"+e.getMessage()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 打印FR日志 |
||||
* @param message |
||||
*/ |
||||
public static void FRLogInfo(String message){ |
||||
FineLoggerFactory.getLogger().info("FRLOG:"+message); |
||||
} |
||||
|
||||
/** |
||||
* 打印FR日志-debug |
||||
* @param message |
||||
*/ |
||||
public static void FRLogDebug(String message){ |
||||
FineLoggerFactory.getLogger().debug("FRLOG:"+message); |
||||
} |
||||
|
||||
/** |
||||
* 打印FR日志-error |
||||
* @param message |
||||
*/ |
||||
public static void FRLogError(String message){ |
||||
FineLoggerFactory.getLogger().error("FRLOG:"+message); |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 根据用户名获取用户信息 |
||||
* @param userName |
||||
* @return |
||||
*/ |
||||
public static User getFRUserByUserName(String userName){ |
||||
try { |
||||
return UserService.getInstance().getUserByUserName(userName); |
||||
} catch (Exception e) { |
||||
FRLogInfo("获取用户信息异常:"+e.getMessage()); |
||||
} |
||||
|
||||
return null; |
||||
} |
||||
|
||||
/** |
||||
* 解密FR密码 |
||||
* @param password |
||||
* @return |
||||
*/ |
||||
public static String decryptFRPsd(String password){ |
||||
FRLogInfo("解密密码:"+password); |
||||
return TransmissionTool.decrypt(password); |
||||
} |
||||
|
||||
/** |
||||
* 根据明文密码生成数据库中的密码,用户密码校验用 |
||||
* @return |
||||
*/ |
||||
public static String getDBPsd(String username,String password){ |
||||
PasswordValidator pv = UserSourceFactory.getInstance().getUserSource(ManualOperationType.KEY).getPasswordValidator(); |
||||
String uuid = UUIDUtil.generate(); |
||||
|
||||
return pv.encode(username, password, uuid); |
||||
} |
||||
|
||||
/** |
||||
* 获取带参数的访问链接 |
||||
* @return |
||||
*/ |
||||
public static String getAllUrl(HttpServletRequest httpServletRequest){ |
||||
return WebUtils.getOriginalURL(httpServletRequest); |
||||
} |
||||
|
||||
/** |
||||
* 根据originKey获取源链接 |
||||
* @param req |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
public static String getOriginUrl(HttpServletRequest req) throws Exception { |
||||
String origin = req.getParameter("origin"); |
||||
if (StringUtils.isNotEmpty(origin)) { |
||||
OriginUrlResponseBean originUrlResponseBean = (OriginUrlResponseBean) DecisionStatusService.originUrlStatusService().get(origin); |
||||
DecisionStatusService.originUrlStatusService().delete(origin); |
||||
if (originUrlResponseBean != null) { |
||||
return originUrlResponseBean.getOriginUrl(); |
||||
} |
||||
} |
||||
|
||||
return new OriginUrlResponseBean(TemplateUtils.render("${fineServletURL}")).getOriginUrl(); |
||||
} |
||||
|
||||
/** |
||||
* 判断是否开启模板认证 |
||||
* @param |
||||
* @return |
||||
* @throws Exception |
||||
*/ |
||||
public static boolean isTempAuth(HttpServletRequest req,HttpServletResponse res) throws Exception { |
||||
ReportTemplateRequestChecker checker = new ReportTemplateRequestChecker(); |
||||
HandlerMethod hm = new HandlerMethod(new ReportRequestService(),ReportRequestService.class.getMethod("preview", HttpServletRequest.class, HttpServletResponse.class, String.class)); |
||||
return checker.checkRequest(req,res,hm); |
||||
} |
||||
|
||||
/** |
||||
* 获取数据集数据 |
||||
* @param serverDataSetName |
||||
* @return |
||||
*/ |
||||
public static DataModel getTableData(String serverDataSetName){ |
||||
TableData userdebug = TableDataConfig.getInstance().getTableData(serverDataSetName); |
||||
DataModel userdebugDM = userdebug.createDataModel(Calculator.createCalculator()); |
||||
// userdebugDM.getRowCount();
|
||||
// userdebugDM.getColumnIndex();
|
||||
// userdebugDM.getValueAt()
|
||||
return userdebugDM; |
||||
} |
||||
|
||||
public static String getIndex(HttpServletRequest req){ |
||||
String url = req.getScheme()+"://"+req.getServerName()+":"+String.valueOf(req.getServerPort())+req.getRequestURI(); |
||||
return url; |
||||
} |
||||
|
||||
/** |
||||
* 获取帆软域名 |
||||
* @param req |
||||
* @return |
||||
*/ |
||||
public static String getFRDomain(HttpServletRequest req){ |
||||
String domain = req.getScheme()+"://"+req.getServerName(); |
||||
int port = req.getServerPort(); |
||||
|
||||
if(port != 80){ |
||||
domain += ":"+String.valueOf(req.getServerPort()); |
||||
} |
||||
|
||||
return domain; |
||||
} |
||||
} |
@ -0,0 +1,290 @@
|
||||
package com.eco.plugin.shsytzfsds.utils; |
||||
|
||||
import com.fr.json.JSONArray; |
||||
import com.fr.json.JSONObject; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Locale; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* 飞书工具类 |
||||
*/ |
||||
public class FeiShuUtils { |
||||
private static final String tenant_token_url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"; |
||||
private static final String sheet_data_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/:spreadsheetToken/values/:range"; |
||||
//根据sheettoken获取sheet信息地址
|
||||
private static final String sheet_sheet_url = "https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/:spreadsheetToken/metainfo"; |
||||
private static final String table_data_url = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/records"; |
||||
private static final String table_fields_url = "https://open.feishu.cn/open-apis/bitable/v1/apps/:app_token/tables/:table_id/fields"; |
||||
|
||||
/** |
||||
* 获取自建应用token |
||||
* @param appid |
||||
* @param appSecret |
||||
* @return |
||||
*/ |
||||
public static String getTenantToken(String appid,String appSecret){ |
||||
JSONObject param = new JSONObject(); |
||||
param.put("app_id",appid); |
||||
param.put("app_secret",appSecret); |
||||
|
||||
String result = HttpUtils.HttpPostJson(tenant_token_url,param.toString(),null); |
||||
|
||||
return new JSONObject(result).getString("tenant_access_token"); |
||||
} |
||||
|
||||
/** |
||||
* 获取单sheet数据 |
||||
* @param url |
||||
* @param token |
||||
* @param rowsize 行号,为0时获取全部数据源 |
||||
* @param column 列号 |
||||
* @param headRow 标题行 获取数据时排除此行 |
||||
* @param pagecount 每页数量,此处为行数 |
||||
* @param curentrow 当前行数 |
||||
* @return |
||||
*/ |
||||
public static JSONArray getSheetData(String url,String token,int rowsize,String column,int headRow,int pagecount,int curentrow){ |
||||
JSONArray array = new JSONArray(); |
||||
JSONObject sheetParam = getSheetParam(url,token); |
||||
String sheetToken = sheetParam.getString("sheetToken"); |
||||
String sheetId = sheetParam.getString("sheetId"); |
||||
String rowCount = sheetParam.getString("rowCount"); |
||||
String columnCount = sheetParam.getString("columnCount"); |
||||
|
||||
//最大行为0时获取全部数据
|
||||
if(rowsize <= 0){ |
||||
rowsize = Integer.valueOf(rowCount); |
||||
} |
||||
|
||||
//列名为空时获取全部数据
|
||||
if(Utils.isNullStr(column)){ |
||||
column = numberToLetter(Integer.valueOf(columnCount)); |
||||
} |
||||
|
||||
if(curentrow <= headRow){ |
||||
curentrow = headRow == 0 ? 1 : headRow; |
||||
} |
||||
|
||||
int startrow = curentrow; |
||||
|
||||
curentrow +=pagecount; |
||||
|
||||
if(curentrow > rowsize){ |
||||
curentrow = rowsize; |
||||
} |
||||
|
||||
String range = sheetId+"!A"+startrow+":"+column+curentrow; |
||||
|
||||
String requestUrl =sheet_data_url.replaceAll(":spreadsheetToken",sheetToken).replaceAll(":range",range); |
||||
Map<String,String> header = new HashMap<>(); |
||||
header.put("Authorization","Bearer "+token); |
||||
header.put("Content-Type","application/json; charset=utf-8"); |
||||
|
||||
String result = HttpUtils.httpGet(requestUrl,null,header); |
||||
array.addAll(new JSONObject(result).getJSONObject("data").getJSONObject("valueRange").getJSONArray("values")); |
||||
|
||||
if(curentrow < rowsize){ |
||||
JSONArray childrenArray = getSheetData(url,token,rowsize,column,headRow,pagecount,curentrow+1); |
||||
array.addAll(childrenArray); |
||||
} |
||||
|
||||
return array; |
||||
} |
||||
|
||||
/** |
||||
* 根据url获取sheet参数 |
||||
* @param url |
||||
* @return |
||||
*/ |
||||
private static JSONObject getSheetParam(String url,String token) { |
||||
String[] urls = url.split("\\?"); |
||||
String[] urlParam = urls[0].split("/"); |
||||
String sheetToken =urlParam[urlParam.length-1]; |
||||
String sheetId = ""; |
||||
|
||||
JSONArray sheetArray = getSheetArray(sheetToken,token); |
||||
|
||||
if(urls.length > 1){ |
||||
String paramstr = urls[1]; |
||||
String[] params = paramstr.split("&"); |
||||
|
||||
for (String param : params){ |
||||
String[] kv = param.split("="); |
||||
if(kv[0].equals("sheet")){ |
||||
sheetId = kv[1]; |
||||
break; |
||||
} |
||||
} |
||||
}else{ |
||||
sheetId = sheetArray.getJSONObject(0).getString("sheetId"); |
||||
} |
||||
|
||||
JSONObject result = new JSONObject(); |
||||
result.put("sheetToken",sheetToken); |
||||
result.put("sheetId",sheetId); |
||||
|
||||
|
||||
for (int i = 0; i < sheetArray.length(); i++) { |
||||
JSONObject sheet = sheetArray.getJSONObject(i); |
||||
String sheetIdE = sheet.getString("sheetId"); |
||||
if(sheetIdE.equals(sheetId)){ |
||||
result.put("rowCount",sheet.getString("rowCount")); |
||||
result.put("columnCount",sheet.getString("columnCount")); |
||||
} |
||||
} |
||||
|
||||
return result; |
||||
} |
||||
|
||||
private static JSONArray getSheetArray(String sheetToken,String token){ |
||||
String url = sheet_sheet_url.replaceAll(":spreadsheetToken",sheetToken); |
||||
|
||||
Map<String,String> header = new HashMap<>(); |
||||
header.put("Authorization","Bearer "+token); |
||||
header.put("Content-Type","application/json; charset=utf-8"); |
||||
|
||||
String result = HttpUtils.httpGet(url,null,header); |
||||
|
||||
return new JSONObject(result).getJSONObject("data").getJSONArray("sheets"); |
||||
} |
||||
|
||||
/** |
||||
* 获取多维表数据 |
||||
* @param url |
||||
* @param token |
||||
* @param pageToken |
||||
* @return |
||||
*/ |
||||
public static JSONArray getTableData(String url,String token,String pageToken){ |
||||
JSONArray array = new JSONArray(); |
||||
JSONObject sheetParam = getTableParam(url); |
||||
String app_token = sheetParam.getString("app_token"); |
||||
String table_id = sheetParam.getString("table_id"); |
||||
|
||||
String requestUrl =table_data_url.replaceAll(":app_token",app_token).replaceAll(":table_id",table_id)+"?page_token="+pageToken+"&page_size="+500; |
||||
Map<String,String> header = new HashMap<>(); |
||||
header.put("Authorization","Bearer "+token); |
||||
|
||||
String result = HttpUtils.httpGet(requestUrl,null,header); |
||||
JSONObject data = new JSONObject(result).getJSONObject("data"); |
||||
pageToken = data.getString("page_token"); |
||||
array.addAll(data.getJSONArray("items")); |
||||
boolean hasMore = data.getBoolean("has_more"); |
||||
|
||||
if(hasMore){ |
||||
array.addAll(getTableData(url,token,pageToken)); |
||||
} |
||||
|
||||
return array; |
||||
} |
||||
|
||||
/** |
||||
* 获取多维表字段 |
||||
* @param url |
||||
* @param token |
||||
* @return |
||||
*/ |
||||
public static JSONArray getTableFields(String url,String token){ |
||||
JSONObject sheetParam = getTableParam(url); |
||||
String app_token = sheetParam.getString("app_token"); |
||||
String table_id = sheetParam.getString("table_id"); |
||||
|
||||
String requestUrl =table_fields_url.replaceAll(":app_token",app_token).replaceAll(":table_id",table_id); |
||||
Map<String,String> header = new HashMap<>(); |
||||
header.put("Authorization","Bearer "+token); |
||||
|
||||
String result = HttpUtils.httpGet(requestUrl,null,header); |
||||
JSONObject data = new JSONObject(result).getJSONObject("data"); |
||||
JSONArray fileds =data.getJSONArray("items"); |
||||
|
||||
JSONArray resultArray = new JSONArray(); |
||||
|
||||
for (int i = 0; i < fileds.length(); i++) { |
||||
JSONObject filed = fileds.getJSONObject(i); |
||||
resultArray.add(filed.getString("field_name")); |
||||
} |
||||
|
||||
return resultArray; |
||||
} |
||||
|
||||
/** |
||||
* 解析多维表参数 |
||||
* @param url |
||||
* @return |
||||
*/ |
||||
private static JSONObject getTableParam(String url) { |
||||
String[] urls = url.split("\\?"); |
||||
String[] urlParam = urls[0].split("/"); |
||||
String app_token =urlParam[urlParam.length-1]; |
||||
String paramstr = urls[1]; |
||||
String[] params = paramstr.split("&"); |
||||
String sheetId = ""; |
||||
|
||||
for (String param : params){ |
||||
String[] kv = param.split("="); |
||||
if(kv[0].equals("table")){ |
||||
sheetId = kv[1]; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
JSONObject result = new JSONObject(); |
||||
result.put("app_token",app_token); |
||||
result.put("table_id",sheetId); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
// String token =getTenantToken("cli_a4756c7b3939d00b","4CFoMmAe03YU0kY3ZCsLgfRMnB48Vwxa");
|
||||
|
||||
//14730 客户飞书参数
|
||||
String token =getTenantToken("cli_a52dc2cb0039900c","ugnGbddZTyeTP08ILvR2uhMGsqxVn2Jk"); |
||||
String url = "https://w808buw46o.feishu.cn/base/XSKlbxuXda5VGxs54pmcMpnZnWC?table=tblSfSJcbBFzE182&view=vewA9JsnjJ"; |
||||
// String url = "https://ka04381dfr9.feishu.cn/sheets/RrnVs4bBkhOIYftOH4tc4xiDnUd?sheet=9fc5e2";
|
||||
////// String url = "https://ka04381dfr9.feishu.cn/sheets/RrnVs4bBkhOIYftOH4tc4xiDnUd";
|
||||
// int rowsize = 6;
|
||||
// int headRow = 1;
|
||||
// String column = "C";
|
||||
// int pageCount = 1;
|
||||
// int currentRow = 0;
|
||||
////
|
||||
// JSONArray jsonArray = getSheetData(url,token,rowsize,column,headRow,pageCount,currentRow);
|
||||
|
||||
//多维表
|
||||
// String url = "https://ka04381dfr9.feishu.cn/base/X50lbouzeaI2H4sZazCcVM1lnJg?table=tblznO8etpFgDCcT&view=vewNfD7zhV";
|
||||
//异数据源多维表
|
||||
// String url = "https://ka04381dfr9.feishu.cn/base/Nte9biFa2afxnfsu4SdcXSM9nte?table=tblhXY5sLnZrq3yr&view=vewsaUn2WV";
|
||||
|
||||
//审批多维表
|
||||
// String url = "https://ka04381dfr9.feishu.cn/base/X50lbouzeaI2H4sZazCcVM1lnJg?table=tbllWZFrVSmYHfQ4&view=vewqQwbR9O";
|
||||
|
||||
|
||||
JSONArray tableFields = getTableFields(url,token); |
||||
JSONArray jsonArray = getTableData(url,token,""); |
||||
System.out.println(); |
||||
} |
||||
|
||||
public static String numberToLetter(int num){ |
||||
if(num <= 0){ |
||||
return null; |
||||
} |
||||
|
||||
String letter = ""; |
||||
num--; |
||||
|
||||
do{ |
||||
if(letter.length()>0){ |
||||
num--; |
||||
} |
||||
|
||||
letter = ((char)(num%26+(int)'A'))+letter; |
||||
|
||||
num = (int)((num-num%26)/26); |
||||
}while (num>0); |
||||
|
||||
return letter; |
||||
} |
||||
} |
@ -0,0 +1,260 @@
|
||||
package com.eco.plugin.shsytzfsds.utils; |
||||
|
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.third.org.apache.http.HttpEntity; |
||||
import com.fr.third.org.apache.http.HttpResponse; |
||||
import com.fr.third.org.apache.http.HttpStatus; |
||||
import com.fr.third.org.apache.http.NameValuePair; |
||||
import com.fr.third.org.apache.http.client.CookieStore; |
||||
import com.fr.third.org.apache.http.client.entity.UrlEncodedFormEntity; |
||||
import com.fr.third.org.apache.http.client.methods.HttpGet; |
||||
import com.fr.third.org.apache.http.client.methods.HttpPost; |
||||
import com.fr.third.org.apache.http.conn.ssl.NoopHostnameVerifier; |
||||
import com.fr.third.org.apache.http.entity.StringEntity; |
||||
import com.fr.third.org.apache.http.impl.client.BasicCookieStore; |
||||
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||
import com.fr.third.org.apache.http.impl.client.HttpClients; |
||||
import com.fr.third.org.apache.http.impl.cookie.BasicClientCookie; |
||||
import com.fr.third.org.apache.http.message.BasicNameValuePair; |
||||
import com.fr.third.org.apache.http.ssl.SSLContexts; |
||||
import com.fr.third.org.apache.http.ssl.TrustStrategy; |
||||
import com.fr.third.org.apache.http.util.EntityUtils; |
||||
|
||||
import javax.net.ssl.SSLContext; |
||||
import javax.servlet.http.Cookie; |
||||
import java.io.UnsupportedEncodingException; |
||||
import java.security.cert.CertificateException; |
||||
import java.security.cert.X509Certificate; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
public class HttpUtils { |
||||
|
||||
/** |
||||
* httpGet请求 |
||||
* @param url |
||||
* @return |
||||
*/ |
||||
public static String httpGet(String url,Cookie[] cookies,Map<String,String> header){ |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--url:"+url); |
||||
|
||||
//创建httpClient
|
||||
CloseableHttpClient httpclient = createHttpClient(cookies); |
||||
|
||||
HttpGet getMethod = new HttpGet(url); |
||||
|
||||
if(header != null && header.size() > 0){ |
||||
Set<String> keySet = header.keySet(); |
||||
|
||||
for(String key : keySet){ |
||||
getMethod.setHeader(key,header.get(key)); |
||||
} |
||||
} |
||||
|
||||
try { |
||||
HttpResponse response = httpclient.execute(getMethod); |
||||
int status =response.getStatusLine().getStatusCode(); |
||||
HttpEntity entity = response.getEntity(); |
||||
String returnResult = EntityUtils.toString(entity, "utf-8"); |
||||
|
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--status:"+status +";returnResult:"+returnResult); |
||||
|
||||
httpclient.close(); |
||||
|
||||
if (status == HttpStatus.SC_OK) { |
||||
return returnResult; |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpUtils.get--exception:"+e.getMessage()); |
||||
} |
||||
|
||||
try { |
||||
httpclient.close(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); |
||||
} |
||||
|
||||
return ""; |
||||
} |
||||
|
||||
/** |
||||
* HttpPost请求 |
||||
* @param postMethod |
||||
* @return |
||||
*/ |
||||
private static String HttpPost(HttpPost postMethod){ |
||||
CloseableHttpClient httpclient = createHttpClient(null); |
||||
|
||||
try { |
||||
HttpResponse response = httpclient.execute(postMethod); |
||||
int status = response.getStatusLine().getStatusCode(); |
||||
HttpEntity entity = response.getEntity(); |
||||
String returnResult = EntityUtils.toString(entity, "utf-8"); |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPost:status:"+status+"returnResult:"+returnResult); |
||||
httpclient.close(); |
||||
|
||||
if (status == HttpStatus.SC_OK) { |
||||
return returnResult; |
||||
} |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPost:exception:"+e.getMessage()); |
||||
} |
||||
|
||||
try { |
||||
httpclient.close(); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:http关闭异常:"+e.getMessage()); |
||||
} |
||||
|
||||
return ""; |
||||
} |
||||
|
||||
public static String HttpPostXML(String url, String xmlParam){ |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:url:"+url); |
||||
|
||||
HttpPost postMethod = new HttpPost(url); |
||||
|
||||
postMethod.setHeader("Content-type", "text/html"); |
||||
HttpEntity entity = null; |
||||
try { |
||||
entity = new StringEntity(xmlParam,"utf-8"); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPostXML:参数异常:"+e.getMessage()); |
||||
return ""; |
||||
} |
||||
|
||||
postMethod.setEntity(entity); |
||||
|
||||
return HttpPost(postMethod); |
||||
} |
||||
|
||||
public static String HttpPostText(String url, String xmlParam){ |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPostText:url:"+url); |
||||
|
||||
HttpPost postMethod = new HttpPost(url); |
||||
|
||||
postMethod.setHeader("Content-type", "text/plain"); |
||||
HttpEntity entity = null; |
||||
try { |
||||
entity = new StringEntity(xmlParam,"utf-8"); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPostText:参数异常:"+e.getMessage()); |
||||
return ""; |
||||
} |
||||
|
||||
postMethod.setEntity(entity); |
||||
|
||||
return HttpPost(postMethod); |
||||
} |
||||
|
||||
public static String HttpPostJson(String url, String param,Map<String,String> header){ |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:url:"+url); |
||||
|
||||
HttpPost postMethod = new HttpPost(url); |
||||
|
||||
postMethod.setHeader("Content-Type","application/json"); |
||||
|
||||
if(header != null && header.size() > 0){ |
||||
Set<String> keySet = header.keySet(); |
||||
|
||||
for(String key : keySet){ |
||||
postMethod.setHeader(key,header.get(key)); |
||||
} |
||||
} |
||||
|
||||
if(!Utils.isNullStr(param)){ |
||||
HttpEntity entity = null; |
||||
try { |
||||
entity = new StringEntity(param,"utf-8"); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpPostJSON:参数异常:"+e.getMessage()); |
||||
return ""; |
||||
} |
||||
|
||||
postMethod.setEntity(entity); |
||||
} |
||||
|
||||
return HttpPost(postMethod); |
||||
} |
||||
|
||||
public static String HttpPostForm(String url, Map<String,String> header,Map<String,String> param){ |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpForm:url:"+url); |
||||
|
||||
HttpPost postMethod = new HttpPost(url); |
||||
|
||||
if(header != null && header.size() > 0){ |
||||
Set<String> keySet = header.keySet(); |
||||
|
||||
for(String key : keySet){ |
||||
postMethod.setHeader(key,header.get(key)); |
||||
} |
||||
} |
||||
|
||||
if(param != null && param.size() > 0){ |
||||
List<NameValuePair> params = new ArrayList<NameValuePair>(param.size()); |
||||
|
||||
for(Map.Entry<String,String> map : param.entrySet()){ |
||||
params.add(new BasicNameValuePair(map.getKey(), map.getValue())); |
||||
} |
||||
|
||||
try { |
||||
postMethod.setEntity(new UrlEncodedFormEntity(params, "UTF-8")); |
||||
} catch (UnsupportedEncodingException e) { |
||||
FineLoggerFactory.getLogger().info("FRLOG:HttpForm:异常:"+e.getMessage()); |
||||
return ""; |
||||
} |
||||
} |
||||
|
||||
return HttpPost(postMethod); |
||||
} |
||||
|
||||
private static CloseableHttpClient createHttpClient(Cookie[] cookies){ |
||||
|
||||
SSLContext sslContext = null; |
||||
try { |
||||
sslContext = SSLContexts.custom().loadTrustMaterial(null, new TrustStrategy() { |
||||
@Override |
||||
public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { |
||||
return true; |
||||
} |
||||
}).build(); |
||||
} catch (Exception e) { |
||||
FRUtils.FRLogDebug("exception:"+e.getMessage()); |
||||
} |
||||
|
||||
CloseableHttpClient httpclient = null; |
||||
|
||||
if(cookies != null && cookies.length > 0){ |
||||
CookieStore cookieStore = cookieToCookieStore(cookies); |
||||
|
||||
httpclient = HttpClients.custom().setSslcontext(sslContext). |
||||
setSSLHostnameVerifier(new NoopHostnameVerifier()).setDefaultCookieStore(cookieStore).build(); |
||||
} |
||||
else{ |
||||
httpclient = HttpClients.custom().setSslcontext(sslContext). |
||||
setSSLHostnameVerifier(new NoopHostnameVerifier()).build(); |
||||
} |
||||
|
||||
return httpclient; |
||||
} |
||||
|
||||
/** |
||||
* cookies转cookieStore |
||||
* @param cookies |
||||
* @return |
||||
*/ |
||||
public static CookieStore cookieToCookieStore(Cookie[] cookies){ |
||||
CookieStore cookieStore = new BasicCookieStore(); |
||||
|
||||
if(cookies != null && cookies.length>0){ |
||||
for(Cookie cookie : cookies){ |
||||
BasicClientCookie cookie1 = new BasicClientCookie(cookie.getName(), cookie.getValue()); |
||||
cookieStore.addCookie(cookie1); |
||||
} |
||||
} |
||||
|
||||
return cookieStore; |
||||
} |
||||
} |
@ -0,0 +1,108 @@
|
||||
package com.eco.plugin.shsytzfsds.utils; |
||||
|
||||
import com.fr.json.JSONObject; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.PrintWriter; |
||||
|
||||
public class ResponseUtils { |
||||
private static final int SUCCESS = 200; |
||||
private static final int FAILED = -1; |
||||
|
||||
public static void successResponse(HttpServletResponse res, String body) { |
||||
response(res, body, SUCCESS); |
||||
} |
||||
|
||||
public static void failedResponse(HttpServletResponse res, String body) { |
||||
response(res, body, FAILED); |
||||
} |
||||
|
||||
private static void response(HttpServletResponse res, String body, int code) { |
||||
JSONObject object = new JSONObject(); |
||||
PrintWriter pw; |
||||
try { |
||||
object.put("code", code); |
||||
object.put("data", body); |
||||
pw = WebUtils.createPrintWriter(res); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().debug(e.getMessage()); |
||||
return; |
||||
} |
||||
res.setContentType("application/json;charset=utf-8"); |
||||
String result = object.toString(); |
||||
pw.println(result); |
||||
pw.flush(); |
||||
pw.close(); |
||||
} |
||||
|
||||
public static void response(HttpServletResponse res,JSONObject json){ |
||||
PrintWriter pw; |
||||
try { |
||||
pw = WebUtils.createPrintWriter(res); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().debug(e.getMessage()); |
||||
return; |
||||
} |
||||
res.setContentType("application/json;charset=utf-8"); |
||||
String result = json.toString(); |
||||
pw.println(result); |
||||
pw.flush(); |
||||
pw.close(); |
||||
} |
||||
|
||||
public static void responseText(HttpServletResponse res,String text){ |
||||
PrintWriter pw; |
||||
try { |
||||
pw = WebUtils.createPrintWriter(res); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().debug(e.getMessage()); |
||||
return; |
||||
} |
||||
res.setContentType("text/html;charset=utf-8"); |
||||
pw.println(text); |
||||
pw.flush(); |
||||
pw.close(); |
||||
} |
||||
|
||||
public static void responseXml(HttpServletResponse res,String xml){ |
||||
PrintWriter pw; |
||||
try { |
||||
pw = WebUtils.createPrintWriter(res); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().debug(e.getMessage()); |
||||
return; |
||||
} |
||||
res.setContentType("text/xml;charset=utf-8"); |
||||
pw.println(xml); |
||||
pw.flush(); |
||||
pw.close(); |
||||
} |
||||
|
||||
public static void setCSRFHeader(HttpServletResponse httpServletResponse){ |
||||
httpServletResponse.setHeader("Access-Control-Allow-Origin", "*"); |
||||
httpServletResponse.setHeader("Access-Control-Allow-Methods", "POST,GET,OPTIONS,DELETE,HEAD,PUT,PATCH"); |
||||
httpServletResponse.setHeader("Access-Control-Max-Age", "36000"); |
||||
httpServletResponse.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,Authorization,authorization"); |
||||
} |
||||
|
||||
public static void responseJsonp(HttpServletRequest req, HttpServletResponse res, JSONObject json){ |
||||
PrintWriter pw; |
||||
try { |
||||
pw = WebUtils.createPrintWriter(res); |
||||
} catch (Exception e) { |
||||
FineLoggerFactory.getLogger().debug(e.getMessage()); |
||||
return; |
||||
} |
||||
res.setContentType("text/javascript;charset=utf-8;charset=utf-8"); |
||||
String result = json.toString(); |
||||
|
||||
String jsonp=req.getParameter("callback"); |
||||
|
||||
pw.println(jsonp+"("+result+")"); |
||||
pw.flush(); |
||||
pw.close(); |
||||
} |
||||
} |
@ -0,0 +1,385 @@
|
||||
package com.eco.plugin.shsytzfsds.utils; |
||||
|
||||
import com.fr.base.TemplateUtils; |
||||
import com.fr.data.NetworkHelper; |
||||
import com.fr.decision.webservice.v10.user.UserService; |
||||
import com.fr.io.utils.ResourceIOUtils; |
||||
import com.fr.json.JSONObject; |
||||
import com.fr.stable.CodeUtils; |
||||
import com.fr.stable.StringUtils; |
||||
import com.fr.third.org.apache.commons.codec.digest.DigestUtils; |
||||
import com.fr.web.utils.WebUtils; |
||||
|
||||
import javax.servlet.http.Cookie; |
||||
import javax.servlet.http.HttpServletRequest; |
||||
import javax.servlet.http.HttpServletResponse; |
||||
import java.io.BufferedReader; |
||||
import java.io.InputStream; |
||||
import java.net.InetAddress; |
||||
import java.net.URLEncoder; |
||||
import java.net.UnknownHostException; |
||||
import java.util.HashMap; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.UUID; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
public class Utils { |
||||
|
||||
public static byte[] getByteHeader(byte[] bytes){ |
||||
byte[] newByte = new byte[3]; |
||||
for(int i=0;i<bytes.length;i++){ |
||||
if(i < 3){ |
||||
newByte[i] = bytes[i]; |
||||
continue; |
||||
} |
||||
|
||||
break; |
||||
} |
||||
|
||||
return newByte; |
||||
} |
||||
|
||||
public static String bytesToHexString(byte[] src) { |
||||
StringBuilder stringBuilder = new StringBuilder(); |
||||
if (src == null || src.length <= 0) { |
||||
return null; |
||||
} |
||||
for (int i = 0; i < src.length; i++) { |
||||
int v = src[i] & 0xFF; |
||||
String hv = Integer.toHexString(v); |
||||
if (hv.length() < 2) { |
||||
stringBuilder.append(0); |
||||
} |
||||
stringBuilder.append(hv); |
||||
} |
||||
return stringBuilder.toString(); |
||||
} |
||||
|
||||
/** |
||||
* 判断字符串是否为空 |
||||
* @param str |
||||
* @return true 空字符串 false 非空字符串 |
||||
*/ |
||||
public static boolean isNullStr(String str){ |
||||
return !(str != null && !str.isEmpty() && !"null".equals(str)); |
||||
} |
||||
|
||||
/** |
||||
* 判断字符串是否非空 |
||||
* @param str |
||||
* @return |
||||
*/ |
||||
public static boolean isNotNullStr(String str){ |
||||
return !isNullStr(str); |
||||
} |
||||
|
||||
/** |
||||
* MD5加密 |
||||
* @param str |
||||
* @return |
||||
*/ |
||||
public static String getMd5Str(String str) |
||||
{ |
||||
return DigestUtils.md5Hex(str); |
||||
} |
||||
|
||||
/** |
||||
* 帆软shaEncode加密 |
||||
*/ |
||||
|
||||
public static String shaEncode(String str){ |
||||
return CodeUtils.sha256Encode(str); |
||||
} |
||||
|
||||
/** |
||||
* 获取uuid |
||||
*/ |
||||
public static String uuid(){ |
||||
return UUID.randomUUID().toString(); |
||||
} |
||||
|
||||
/** |
||||
* 替换空字符串 |
||||
* @param str |
||||
* @param replace |
||||
* @return |
||||
*/ |
||||
public static String replaceNullStr(String str,String replace){ |
||||
if(isNullStr(str)){ |
||||
return replace; |
||||
} |
||||
|
||||
return str; |
||||
} |
||||
|
||||
/** |
||||
* 获取请求体 |
||||
* @param req |
||||
* @return |
||||
*/ |
||||
public static JSONObject getRequestBody(HttpServletRequest req){ |
||||
StringBuffer sb = new StringBuffer(); |
||||
String line = null; |
||||
try { |
||||
BufferedReader reader = req.getReader(); |
||||
while ((line = reader.readLine()) != null) |
||||
sb.append(line); |
||||
} catch (Exception e) { |
||||
FRUtils.FRLogDebug("getRequestBody:exception:"+e.getMessage()); |
||||
} |
||||
//将空格和换行符替换掉避免使用反序列化工具解析对象时失败
|
||||
String jsonString = sb.toString().replaceAll("\\s","").replaceAll("\n",""); |
||||
FRUtils.FRLogDebug("reqBody:"+jsonString); |
||||
JSONObject json = new JSONObject(jsonString); |
||||
|
||||
return json; |
||||
} |
||||
|
||||
/** |
||||
* 获取本机ip |
||||
* @return |
||||
* @throws UnknownHostException |
||||
*/ |
||||
public static String getLocalIp() throws UnknownHostException { |
||||
InetAddress localHost = InetAddress.getLocalHost(); |
||||
String ipAddress = localHost.getHostAddress(); |
||||
|
||||
return ipAddress; |
||||
} |
||||
|
||||
/** |
||||
* 获取ip |
||||
* @return |
||||
*/ |
||||
public static String getIp(HttpServletRequest req){ |
||||
String realIp = req.getHeader("X-Real-IP"); |
||||
String fw = req.getHeader("X-Forwarded-For"); |
||||
if (StringUtils.isNotEmpty(fw) && !"unKnown".equalsIgnoreCase(fw)) { |
||||
int para3 = fw.indexOf(","); |
||||
return para3 != -1 ? fw.substring(0, para3) : fw; |
||||
} else { |
||||
fw = realIp; |
||||
if (StringUtils.isNotEmpty(realIp) && !"unKnown".equalsIgnoreCase(realIp)) { |
||||
return realIp; |
||||
} else { |
||||
if (StringUtils.isBlank(realIp) || "unknown".equalsIgnoreCase(realIp)) { |
||||
fw = req.getHeader("Proxy-Client-IP"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getHeader("WL-Proxy-Client-IP"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getHeader("HTTP_CLIENT_IP"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getHeader("HTTP_X_FORWARDED_FOR"); |
||||
} |
||||
|
||||
if (StringUtils.isBlank(fw) || "unknown".equalsIgnoreCase(fw)) { |
||||
fw = req.getRemoteAddr(); |
||||
} |
||||
|
||||
return fw; |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 根据key获取cookie |
||||
* @param req |
||||
* @return |
||||
*/ |
||||
public static String getCookieByKey(HttpServletRequest req,String key){ |
||||
Cookie[] cookies = req.getCookies(); |
||||
String cookie = ""; |
||||
|
||||
if(cookies == null || cookies.length <=0){ |
||||
return ""; |
||||
} |
||||
|
||||
for(int i = 0; i < cookies.length; i++) { |
||||
Cookie item = cookies[i]; |
||||
if (item.getName().equalsIgnoreCase(key)) { |
||||
cookie = item.getValue(); |
||||
} |
||||
} |
||||
|
||||
FRUtils.FRLogDebug("cookie:"+cookie); |
||||
|
||||
return cookie; |
||||
} |
||||
|
||||
/** |
||||
* 判断是否是手机端的链接 |
||||
* @param req |
||||
* @return |
||||
*/ |
||||
public static boolean isMobile(HttpServletRequest req) { |
||||
String[] mobileArray = {"iPhone", "iPad", "android", "windows phone", "xiaomi"}; |
||||
String userAgent = req.getHeader("user-agent"); |
||||
if (userAgent != null && userAgent.toUpperCase().contains("MOBILE")) { |
||||
for(String mobile : mobileArray) { |
||||
if(userAgent.toUpperCase().contains(mobile.toUpperCase())) { |
||||
return true; |
||||
} |
||||
} |
||||
} |
||||
return NetworkHelper.getDevice(req).isMobile(); |
||||
} |
||||
|
||||
/** |
||||
* 只编码中文 |
||||
* @param url |
||||
* @return |
||||
*/ |
||||
public static String encodeCH(String url ){ |
||||
Matcher matcher = Pattern.compile("[\\u4E00-\\u9FA5]*[\\(\\)]").matcher(url); |
||||
|
||||
while(matcher.find()){ |
||||
String chn = matcher.group(); |
||||
url = url.replaceAll(chn, URLEncoder.encode(chn)); |
||||
} |
||||
|
||||
return url; |
||||
} |
||||
|
||||
/** |
||||
* 获取web-inf文件夹下的文件 |
||||
* filename /resources/ip4enc.properties |
||||
*/ |
||||
public static InputStream getResourcesFile(String filename){ |
||||
return ResourceIOUtils.read(filename); |
||||
} |
||||
|
||||
/** |
||||
* |
||||
* @param res |
||||
* @param path /com/fr/plugin/loginAuth/html/getMac.html |
||||
* @param parameterMap |
||||
*/ |
||||
public static void toErrorPage(HttpServletResponse res,String path,Map<String, String> parameterMap){ |
||||
if(parameterMap == null){ |
||||
parameterMap = new HashMap<String, String>(); |
||||
} |
||||
|
||||
try { |
||||
String macPage = TemplateUtils.renderTemplate(path, parameterMap); |
||||
WebUtils.printAsString(res, macPage); |
||||
}catch (Exception e){ |
||||
FRUtils.FRLogError("跳转页面异常"); |
||||
} |
||||
|
||||
} |
||||
|
||||
/** |
||||
* 判断是否是管理员 |
||||
* @param username |
||||
* @return |
||||
*/ |
||||
public static boolean isAdmin(String username) throws Exception{ |
||||
return UserService.getInstance().isAdmin(UserService.getInstance().getUserByUserName(username).getId()); |
||||
} |
||||
|
||||
/** |
||||
* 去掉浏览器中的参数 |
||||
* @param url |
||||
* @param param |
||||
* @return |
||||
*/ |
||||
public static String removeParam(String url,String param){ |
||||
if(!url.contains("?")){ |
||||
return url; |
||||
} |
||||
String[] urls = url.split("\\?"); |
||||
String queryStr = urls[1]; |
||||
String[] params = queryStr.split("&"); |
||||
url = urls[0]; |
||||
for(int i=0;i<params.length;i++){ |
||||
String paramEach = params[i]; |
||||
if(paramEach.contains(param)){ |
||||
continue; |
||||
} |
||||
|
||||
url+=!url.contains("?")?"?"+paramEach:"&"+paramEach; |
||||
} |
||||
|
||||
return url; |
||||
} |
||||
|
||||
/** |
||||
* 获取跳转链接 |
||||
* @param req |
||||
* @param param |
||||
* @return |
||||
*/ |
||||
public static String getRedirectUrl(HttpServletRequest req,String param){ |
||||
String url = FRUtils.getAllUrl(req); |
||||
|
||||
if(isNotNullStr(param)){ |
||||
url = removeParam(url,param); |
||||
} |
||||
|
||||
url = encodeCH(url); |
||||
|
||||
return url; |
||||
} |
||||
|
||||
/** |
||||
* 去除空格换行 |
||||
* @param str |
||||
* @return |
||||
*/ |
||||
public static String trim(String str){ |
||||
return str.trim().replaceAll("\n","").replaceAll("\r",""); |
||||
} |
||||
|
||||
/** |
||||
* list 转化为指定字符分割的字符串 |
||||
* @param list |
||||
* @param list |
||||
* @return |
||||
*/ |
||||
public static String listToStr(List<String> list, String split){ |
||||
String result = ""; |
||||
|
||||
if(list == null || list.size() <= 0){ |
||||
return result; |
||||
} |
||||
|
||||
for(String str : list){ |
||||
result+=","+str; |
||||
} |
||||
|
||||
result = result.substring(1); |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* array 转化为指定字符分割的字符串 |
||||
* @param list |
||||
* @param list |
||||
* @return |
||||
*/ |
||||
public static String arrayToStr(String[] list, String split){ |
||||
String result = ""; |
||||
|
||||
if(list == null ||list.length <= 0){ |
||||
return result; |
||||
} |
||||
|
||||
for(int i=0;i<list.length;i++){ |
||||
String str = list[i]; |
||||
result+=","+str; |
||||
} |
||||
|
||||
result = result.substring(1); |
||||
|
||||
return result; |
||||
} |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.eco.plugin.shsytzfsds.webresourceProvider; |
||||
|
||||
import com.fr.decision.fun.impl.AbstractWebResourceProvider; |
||||
import com.fr.decision.web.MainComponent; |
||||
import com.fr.web.struct.Atom; |
||||
import com.fr.web.struct.Component; |
||||
import com.fr.web.struct.browser.RequestClient; |
||||
import com.fr.web.struct.category.ScriptPath; |
||||
import com.fr.web.struct.category.StylePath; |
||||
|
||||
/** |
||||
* Created by wink on 2021-12-03 |
||||
*/ |
||||
public class WebResourceProvider extends AbstractWebResourceProvider { |
||||
@Override |
||||
public Atom attach() { |
||||
return MainComponent.KEY; |
||||
} |
||||
|
||||
@Override |
||||
public Atom client() { |
||||
return new Component() { |
||||
@Override |
||||
public ScriptPath script(RequestClient requestClient) { |
||||
return ScriptPath.build("/com/eco/plugin/shsytzfsds/js/ui.js"); |
||||
} |
||||
|
||||
@Override |
||||
public StylePath style(RequestClient requestClient) { |
||||
return StylePath.EMPTY; |
||||
// return StylePath.build("/com/fr/plugin/jdfSSO/css/icon.css");
|
||||
} |
||||
}; |
||||
} |
||||
} |
@ -0,0 +1,16 @@
|
||||
.wink-input { |
||||
width : 150px; |
||||
} |
||||
|
||||
.wink-bi-border { |
||||
border:1px solid black |
||||
} |
||||
|
||||
.wink-border-bottom { |
||||
border:none; |
||||
border-bottom: 1px solid black; |
||||
} |
||||
|
||||
.wink-font-weight { |
||||
font-weight: bold; |
||||
} |
@ -0,0 +1,290 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<title>飞书多维表格</title> |
||||
<link rel="stylesheet" href="file?path=com/eco/plugin/shsytzfsds/js/layui/css/layui.css"> |
||||
<link rel="stylesheet" href="file?path=com/eco/plugin/shsytzfsds/css/wink.css"> |
||||
<script src="file?path=com/eco/plugin/shsytzfsds/js/layui/layui.js"></script> |
||||
<script src="file?path=com/eco/plugin/shsytzfsds/js/jquery/jquery-2.1.3.min.js"></script> |
||||
<style> |
||||
|
||||
|
||||
div { |
||||
width:100%; |
||||
/*height:100%*/ |
||||
} |
||||
</style> |
||||
</head> |
||||
<body> |
||||
<div class="layui-fluid" style=""> |
||||
<div class="layui-row" style="position:fixed;top:0;left:0;height:40px;width:100%;line-height: 40px"> |
||||
<div class="layui-col-lg3" style="padding: 10px"> |
||||
数据集名称: |
||||
<input id="name" class="wink-input" style="border:none;border-bottom: 1px solid black"> |
||||
</div> |
||||
<div class="layui-col-lg1 layui-col-md-offset8" style="text-align: right;padding-right: 5px"> |
||||
<button id="cancel" type="button" class="layui-btn layui-btn-primary layui-btn-xs">取消</button> |
||||
<button id="ok" type="button" class="layui-btn layui-btn-normal layui-btn-xs">确认</button> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="position: fixed;top:40px;left:0px;width:100%;height: 100%;"> |
||||
<div class="layui-col-lg3" style="height:100%;padding: 10px"> |
||||
<div class="layui-row" style="height: 40px;line-height: 40px;"> |
||||
<div class="layui-col-lg2 wink-font-weight" style=""> |
||||
飞书应用 |
||||
</div> |
||||
<div class="layui-col-lg10" style=""> |
||||
<select id="app" class="wink-input wink-border-bottom" > |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style=""> |
||||
<div class="layui-col-lg2 wink-font-weight" style=""> |
||||
多维表url |
||||
</div> |
||||
<div class="layui-col-lg10" style=""> |
||||
<input id="url" class="wink-input"> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="layui-col-lg9 " style=""> |
||||
<div class="layui-row" style="height: 40px;line-height: 40px"> |
||||
<div class="layui-col-lg12" style="text-align: right;padding-right: 5px"> |
||||
<button id="view" type="button" class="layui-btn layui-btn-primary layui-btn-xs">预览</button> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="position: fixed;top:80px;width:100%;height: 100%;border : 1px dashed black"> |
||||
<div class="layui-col-lg9 bi-border"> |
||||
<table id="dataTable" lay-filter="dataTable"></table> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<script> |
||||
var configData = {}; |
||||
var table = ""; |
||||
var layer = ""; |
||||
layui.use(['layer', 'form','table','dropdown'], function(){ |
||||
layer = layui.layer; |
||||
var form = layui.form; |
||||
table = layui.table |
||||
var dropdown = layui.dropdown; |
||||
|
||||
|
||||
init(); |
||||
getApp(); |
||||
}); |
||||
|
||||
/** |
||||
* 加载数据 |
||||
*/ |
||||
function init(){ |
||||
initAppList(); |
||||
bindEvent(); |
||||
} |
||||
|
||||
/** |
||||
* 绑定事件 |
||||
*/ |
||||
function bindEvent(){ |
||||
//预览 |
||||
$("#view").click(function(){ |
||||
var height = window.innerHeight/2+"px"; |
||||
var width = window.innerWidth/2+"px"; |
||||
var index = layer.load(2,{ |
||||
offset:[height,width] |
||||
}); |
||||
|
||||
configData.appid = $("#app").val(); |
||||
configData.url = $("#url").val(); |
||||
|
||||
$.ajax({ |
||||
type:"post", |
||||
async:true, |
||||
url:"/webroot/decision/fsds/getDWB", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
data:JSON.stringify(configData), |
||||
contentType:"application/json", |
||||
success:function(data){ |
||||
layer.close(index); |
||||
if(!data.data){ |
||||
alert("预览失败"); |
||||
return ; |
||||
} |
||||
var tableData = JSON.parse(data.data); |
||||
var header = tableData.header; |
||||
header = operater(header); |
||||
var data = tableData.data; |
||||
data = operaterData(data); |
||||
|
||||
var tableHeight = window.innerHeight-90 |
||||
table.render({ |
||||
elem: '#dataTable' //指定原始表格元素选择器(推荐id选择器) |
||||
,height: tableHeight //容器高度 |
||||
,cols: header, |
||||
data:data, |
||||
page:true, |
||||
limit:200, |
||||
skin:"line", |
||||
even: true //开启隔行背景 |
||||
}); |
||||
}, |
||||
error:function(data){ |
||||
layer.close(index); |
||||
} |
||||
}) |
||||
|
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* 处理表格数据 |
||||
*/ |
||||
function operaterData(data){ |
||||
var result = []; |
||||
|
||||
$.each(data,function(index,item){ |
||||
result.push(item.fields); |
||||
}) |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 处理表头数据 |
||||
* @param header |
||||
*/ |
||||
function operater(header){ |
||||
var result = []; |
||||
|
||||
$.each(header,function(index,item){ |
||||
result.push({ |
||||
"field":item, |
||||
"title":item |
||||
}) |
||||
}) |
||||
|
||||
return [result]; |
||||
} |
||||
|
||||
/** |
||||
* 加载飞书应用列表 |
||||
*/ |
||||
function initAppList(){ |
||||
var applist = getApp(); |
||||
|
||||
if(applist){ |
||||
$.each(applist,function(index,app){ |
||||
$("#app").append("<option value='"+app.id+"'>"+app.appname+"</option>") |
||||
}) |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取数据 |
||||
*/ |
||||
function getValue(){ |
||||
return { |
||||
appid:$("#app").val(), |
||||
url:$("#url").val(), |
||||
name:$("#name").val(), |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 设置数据 |
||||
*/ |
||||
function setValue(data){ |
||||
data = JSON.parse(data); |
||||
|
||||
configData = data; |
||||
$("#app").val(data.appid) |
||||
$("#url").val(data.url) |
||||
$("#name").val(data.name) |
||||
} |
||||
|
||||
/** |
||||
* 获取启用的应用数据 |
||||
* @param param |
||||
* @returns {{count, page: (boolean|number|*), items: {}}} |
||||
*/ |
||||
function getApp(){ |
||||
var result = {}; |
||||
$.ajax({ |
||||
type:"get", |
||||
async:false, |
||||
url:"/webroot/decision/fsds/getAll", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
success:function(data){ |
||||
result = JSON.parse(data.data); |
||||
}, |
||||
error:function(data){ |
||||
} |
||||
}) |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 获取多维表数据 |
||||
* @param param |
||||
* @returns {{count, page: (boolean|number|*), items: {}}} |
||||
*/ |
||||
function getDWBData(){ |
||||
configData.appid = $("#app").val(); |
||||
configData.url = $("#url").val(); |
||||
var result = {}; |
||||
$.ajax({ |
||||
type:"post", |
||||
async:false, |
||||
url:"/webroot/decision/fsds/getDWB", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
data:JSON.stringify(configData), |
||||
contentType:"application/json", |
||||
success:function(data){ |
||||
result = JSON.parse(data.data); |
||||
}, |
||||
error:function(data){ |
||||
} |
||||
}) |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 打开加载 |
||||
*/ |
||||
function openLayer(){ |
||||
var height = window.innerHeight/2+"px"; |
||||
var width = window.innerWidth/2+"px"; |
||||
var index = layer.load(2,{ |
||||
offset:[height,width] |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* 校验必填参数 |
||||
*/ |
||||
function validate(){ |
||||
var result = false; |
||||
var appid=$("#app").val(); |
||||
var url=$("#url").val(); |
||||
var name=$("#name").val(); |
||||
if(appid && url && name){ |
||||
result = true; |
||||
}else{ |
||||
alert("请先填写配置信息"); |
||||
|
||||
} |
||||
return result; |
||||
} |
||||
</script> |
||||
</body> |
||||
</html> |
@ -0,0 +1,356 @@
|
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<title>飞书多维表格</title> |
||||
<link rel="stylesheet" href="file?path=com/eco/plugin/shsytzfsds/js/layui/css/layui.css"> |
||||
<link rel="stylesheet" href="file?path=com/eco/plugin/shsytzfsds/css/wink.css"> |
||||
<script src="file?path=com/eco/plugin/shsytzfsds/js/layui/layui.js"></script> |
||||
<script src="file?path=com/eco/plugin/shsytzfsds/js/jquery/jquery-2.1.3.min.js"></script> |
||||
<style> |
||||
|
||||
|
||||
div { |
||||
width:100%; |
||||
/*height:100%*/ |
||||
} |
||||
</style> |
||||
</head> |
||||
<body> |
||||
<div class="layui-fluid" style=""> |
||||
<div class="layui-row" style="position:fixed;top:0;left:0;height:40px;width:100%;line-height: 40px"> |
||||
<div class="layui-col-lg3" style="padding: 10px"> |
||||
数据集名称: |
||||
<input id="name" class="wink-input" style="border:none;border-bottom: 1px solid black"> |
||||
</div> |
||||
<div class="layui-col-lg1 layui-col-md-offset8" style="text-align: right;padding-right: 5px"> |
||||
<button id="cancel" type="button" class="layui-btn layui-btn-primary layui-btn-xs">取消</button> |
||||
<button id="ok" type="button" class="layui-btn layui-btn-normal layui-btn-xs">确认</button> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="position: fixed;top:40px;left:0px;width:100%;height: 100%;"> |
||||
<div class="layui-col-lg3" style="height:100%;padding: 10px"> |
||||
<div class="layui-row" style="height: 40px;line-height: 40px;"> |
||||
<div class="layui-col-lg4 wink-font-weight" style="text-align: right;padding-right: 5px"> |
||||
飞书应用 |
||||
</div> |
||||
<div class="layui-col-lg8" style="padding-left: 10px"> |
||||
<select id="app" class="wink-input wink-border-bottom" > |
||||
</select> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="height:30px;line-height: 30px"> |
||||
<div class="layui-col-lg4 wink-font-weight" style="text-align: right;padding-right: 5px"> |
||||
表格url |
||||
</div> |
||||
<div class="layui-col-lg8" style="padding-left: 10px"> |
||||
<input id="url" class="wink-input"> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="height:30px;line-height: 30px"> |
||||
<div class="layui-col-lg4 wink-font-weight" style="text-align: right;padding-right: 5px"> |
||||
设置表头 |
||||
</div> |
||||
<div class="layui-col-lg8" style="padding-left: 10px"> |
||||
第 <input id="headrow" style="width:100px" value="1"> 行 |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="height:30px;line-height: 30px"> |
||||
<div class="layui-col-lg4 wink-font-weight" style="text-align: right;padding-right: 5px"> |
||||
选取行数据 |
||||
</div> |
||||
<div class="layui-col-lg8 " style="padding-left: 10px"> |
||||
<input id="default" type="radio" value="default" name="row" checked> 默认(第2行~全部行) |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="height:30px;line-height: 30px"> |
||||
<div class="layui-col-lg8 layui-col-md-offset4" style="padding-left: 10px"> |
||||
<input id="custom" type="radio" value="custom" name="row"> 自定义 |
||||
<input id="row" style="width:80px" disabled> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="height:30px;line-height: 30px"> |
||||
<div class="layui-col-lg4 wink-font-weight" style="text-align: right;padding-right: 5px"> |
||||
选取列数据 |
||||
</div> |
||||
<div class="layui-col-lg8" style="padding-left: 10px"> |
||||
<input id="coldefault" type="radio" value="coldefault" name="col" checked> 默认(第A列~最后有数据列) |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="height:30px;line-height: 30px"> |
||||
<div class="layui-col-lg8 layui-col-md-offset4" style="padding-left: 10px"> |
||||
<input id="colcustom" type="radio" value="colcustom" name="col"> 自定义 |
||||
<input id="col" style="width:80px" disabled> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="layui-col-lg9 " style=""> |
||||
<div class="layui-row" style="height: 40px;line-height: 40px"> |
||||
<div class="layui-col-lg12" style="text-align: right;padding-right: 5px"> |
||||
<button id="view" type="button" class="layui-btn layui-btn-primary layui-btn-xs">预览</button> |
||||
</div> |
||||
</div> |
||||
<div class="layui-row" style="position: fixed;top:80px;width:100%;height: 100%;border : 1px dashed black"> |
||||
<div class="layui-col-lg9 bi-border"> |
||||
<table id="dataTable" lay-filter="dataTable"></table> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<script> |
||||
var configData = {}; |
||||
var table = ""; |
||||
var layer = ""; |
||||
layui.use(['layer', 'form','table','dropdown'], function(){ |
||||
layer = layui.layer; |
||||
table = layui.table |
||||
init(); |
||||
getApp(); |
||||
}); |
||||
|
||||
/** |
||||
* 加载数据 |
||||
*/ |
||||
function init(){ |
||||
initAppList(); |
||||
bindEvent(); |
||||
} |
||||
|
||||
/** |
||||
* 绑定事件 |
||||
*/ |
||||
function bindEvent(){ |
||||
//预览 |
||||
$("#view").click(function(){ |
||||
var height = window.innerHeight/2+"px"; |
||||
var width = window.innerWidth/2+"px"; |
||||
var index = layer.load(2,{ |
||||
offset:[height,width] |
||||
}); |
||||
|
||||
var data = getValue(); |
||||
$.ajax({ |
||||
type:"post", |
||||
async:true, |
||||
url:"/webroot/decision/fsds/getSheet", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
data:JSON.stringify(data), |
||||
contentType:"application/json", |
||||
success:function(data){ |
||||
layer.close(index); |
||||
if(!data.data){ |
||||
alert("预览失败"); |
||||
return ; |
||||
} |
||||
var tableData = JSON.parse(data.data); |
||||
var header = tableData.header; |
||||
header = [header]; |
||||
var data = tableData.data; |
||||
var tableHeight = window.innerHeight-90 |
||||
table.render({ |
||||
elem: '#dataTable' //指定原始表格元素选择器(推荐id选择器) |
||||
,height: tableHeight //容器高度 |
||||
,cols: header, |
||||
data:data, |
||||
page:true, |
||||
limit:200, |
||||
skin:"line", |
||||
even: true //开启隔行背景 |
||||
}); |
||||
}, |
||||
error:function(data){ |
||||
layer.close(index); |
||||
} |
||||
}) |
||||
}) |
||||
|
||||
//默认row选择事件 |
||||
$("#default").click(function(){ |
||||
$("#row").attr("disabled",true); |
||||
}) |
||||
//自定义row选择事件 |
||||
$("#custom").click(function(){ |
||||
$("#row").removeAttr("disabled"); |
||||
}) |
||||
//默认col选择事件 |
||||
$("#coldefault").click(function(){ |
||||
$("#col").attr("disabled",true); |
||||
}) |
||||
//自定义col选择事件 |
||||
$("#colcustom").click(function(){ |
||||
$("#col").removeAttr("disabled"); |
||||
}) |
||||
} |
||||
|
||||
/** |
||||
* 处理表格数据 |
||||
*/ |
||||
function operaterData(data){ |
||||
var result = []; |
||||
|
||||
$.each(data,function(index,item){ |
||||
result.push(item.fields); |
||||
}) |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 处理表头数据 |
||||
* @param header |
||||
*/ |
||||
function operater(header){ |
||||
var result = []; |
||||
|
||||
$.each(header,function(index,item){ |
||||
result.push({ |
||||
"field":item, |
||||
"title":item |
||||
}) |
||||
}) |
||||
|
||||
return [result]; |
||||
} |
||||
|
||||
/** |
||||
* 加载飞书应用列表 |
||||
*/ |
||||
function initAppList(){ |
||||
var applist = getApp(); |
||||
|
||||
if(applist){ |
||||
$.each(applist,function(index,app){ |
||||
$("#app").append("<option value='"+app.id+"'>"+app.appname+"</option>") |
||||
}) |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取数据 |
||||
*/ |
||||
function getValue(){ |
||||
|
||||
return { |
||||
appid:$("#app").val(), |
||||
url:$("#url").val(), |
||||
name:$("#name").val(), |
||||
headrow:$("#headrow").val(), |
||||
rowSelect:$("input[name='row']:checked").prop("value"), |
||||
rowdata:$("#row").val(), |
||||
colSelect:$("input[name='col']:checked").prop("value"), |
||||
coldata:$("#col").val(), |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 设置数据 |
||||
*/ |
||||
function setValue(data){ |
||||
console.info(data) |
||||
data = JSON.parse(data); |
||||
console.info(data); |
||||
configData = data; |
||||
$("#app").val(data.appid) |
||||
$("#url").val(data.url) |
||||
$("#name").val(data.name) |
||||
$("#headrow").val(data.headrow) |
||||
|
||||
var rowSelect = data.rowSelect; |
||||
if(rowSelect == "custom"){ |
||||
$("#custom").attr("checked",true); |
||||
$("#row").removeAttr("disabled"); |
||||
$("#row").val(data.rowdata) |
||||
} |
||||
|
||||
var colSelect = data.colSelect; |
||||
if(colSelect == "colcustom"){ |
||||
$("#colcustom").attr("checked",true); |
||||
$("#col").removeAttr("disabled"); |
||||
$("#col").val(data.coldata) |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取启用的应用数据 |
||||
* @param param |
||||
* @returns {{count, page: (boolean|number|*), items: {}}} |
||||
*/ |
||||
function getApp(){ |
||||
var result = {}; |
||||
$.ajax({ |
||||
type:"get", |
||||
async:false, |
||||
url:"/webroot/decision/fsds/getAll", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
success:function(data){ |
||||
result = JSON.parse(data.data); |
||||
}, |
||||
error:function(data){ |
||||
} |
||||
}) |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 获取多维表数据 |
||||
* @param param |
||||
* @returns {{count, page: (boolean|number|*), items: {}}} |
||||
*/ |
||||
function getDWBData(){ |
||||
var data = getValue(); |
||||
var result = {}; |
||||
$.ajax({ |
||||
type:"post", |
||||
async:true, |
||||
url:"/webroot/decision/fsds/getSheet", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
data:JSON.stringify(data), |
||||
contentType:"application/json", |
||||
success:function(data){ |
||||
result = JSON.parse(data.data); |
||||
}, |
||||
error:function(data){ |
||||
} |
||||
}) |
||||
|
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 校验必填参数 |
||||
*/ |
||||
function validate(){ |
||||
var result = false; |
||||
var appid=$("#app").val(); |
||||
var url=$("#url").val(); |
||||
var name=$("#name").val(); |
||||
if(appid && url && name){ |
||||
result = true; |
||||
}else{ |
||||
alert("请先填写配置信息"); |
||||
|
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/** |
||||
* 打开加载 |
||||
*/ |
||||
function openLayer(){ |
||||
var height = window.innerHeight/2+"px"; |
||||
var width = window.innerWidth/2+"px"; |
||||
var index = layer.load(2,{ |
||||
offset:[height,width] |
||||
}); |
||||
} |
||||
</script> |
||||
</body> |
||||
</html> |
After Width: | Height: | Size: 1.4 KiB |
@ -0,0 +1,5 @@
|
||||
#test { |
||||
background-color: #77ee77; |
||||
width: 500px; |
||||
height: 500px; |
||||
} |
@ -0,0 +1,34 @@
|
||||
function render(data, config, saveFn, closeFn) { |
||||
|
||||
console.log('data:', data); |
||||
console.log('config:', config); |
||||
|
||||
var iframe = document.getElementById('publicds').contentWindow; |
||||
|
||||
iframe.document.getElementById("cancel").onclick = function(){ |
||||
closeFn(); |
||||
} |
||||
|
||||
iframe.document.getElementById("ok").onclick = function(){ |
||||
iframe.openLayer(); |
||||
var data = iframe.getValue(); |
||||
data = JSON.stringify(data); |
||||
if(iframe.validate()){ |
||||
saveFn({ |
||||
transferName:JSON.parse(data).name, |
||||
jsonContext:data |
||||
}).then(function(res){ |
||||
console.log(res); |
||||
if(res.code == 200){ |
||||
closeFn(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
} |
||||
|
||||
if(data){ |
||||
iframe.setValue(data.jsonContext); |
||||
} |
||||
} |
||||
new BIPlugin().init(render); |
@ -0,0 +1 @@
|
||||
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-view{display:block;position:relative;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#fafafa;color:#333;font-family:Courier New;font-size:13px}.layui-code-title{position:relative;padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee;font-size:12px}.layui-code-title>.layui-code-about{position:absolute;right:10px;top:0;color:#b7b7b7}.layui-code-about>a{padding-left:10px}.layui-code-view>.layui-code-ol,.layui-code-view>.layui-code-ul{position:relative;overflow:auto}.layui-code-view>.layui-code-ol>li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view>.layui-code-ol>li:first-child,.layui-code-view>.layui-code-ul>li:first-child{padding-top:10px}.layui-code-view>.layui-code-ol>li:last-child,.layui-code-view>.layui-code-ul>li:last-child{padding-bottom:10px}.layui-code-view>.layui-code-ul>li{position:relative;line-height:20px;padding:0 10px;list-style-type:none;*list-style-type:none;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-dark{border:1px solid #0c0c0c;border-left-color:#3f3f3f;background-color:#0c0c0c;color:#c2be9e}.layui-code-dark>.layui-code-title{border-bottom:none}.layui-code-dark>.layui-code-ol>li,.layui-code-dark>.layui-code-ul>li{background-color:#3f3f3f;border-left:none}.layui-code-dark>.layui-code-ul>li{margin-left:6px}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none} |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 11 KiB |
After Width: | Height: | Size: 5.7 KiB |
After Width: | Height: | Size: 701 B |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 299 KiB |
@ -0,0 +1,382 @@
|
||||
|
||||
!(function () { |
||||
var Model = BI.inherit(Fix.Model, { |
||||
_init: function () { |
||||
this.service = BI.Services.getService("dec.service.data.set"); |
||||
}, |
||||
context: ["dataSetName", "ableSave"], |
||||
state: function () { |
||||
var val = this.options.value.datasetData || {}; |
||||
return { |
||||
config : val.config || "", |
||||
parameters: val.parameters || [] |
||||
}; |
||||
}, |
||||
childContext: ["previewAble", "previewedDataSet"], |
||||
watch: { |
||||
previewAble: function (v) { |
||||
this.setAbleSave(v); |
||||
} |
||||
}, |
||||
computed: { |
||||
paramHeader: function () { |
||||
//定义参数列表表头
|
||||
var map = BI.map(BI.Constants.getConstant("dec.constants.data.set.sql.header"), function (i, v) { |
||||
return BI.extend({ |
||||
textAlign: "left", |
||||
height: 30, |
||||
hgap: 10 |
||||
}, v); |
||||
}); |
||||
map.push({ |
||||
textAlign: "left", |
||||
height: 30, |
||||
hgap: 10, |
||||
text: "" |
||||
}); |
||||
return [map]; |
||||
}, |
||||
paramItems: function () { |
||||
var self = this; |
||||
return BI.map(this.model.parameters, function (i, param) { |
||||
return [{ |
||||
type: "bi.text_editor", |
||||
value: param.name, |
||||
textAlign: "left", |
||||
height: 30, |
||||
lgap: 10, |
||||
listeners: [{ |
||||
eventName: BI.TextEditor.EVENT_CHANGE, |
||||
action: function () { |
||||
self.setParamName(i, this.getValue()); |
||||
} |
||||
}] |
||||
}, { |
||||
type: "bi.icon_text_value_combo", |
||||
cls: "field-type-change", |
||||
height: 30, |
||||
items: BI.Constants.getConstant("dec.constants.data.set.sql.field"), |
||||
value: param.type, |
||||
listeners: [{ |
||||
eventName: BI.IconTextValueCombo.EVENT_CHANGE, |
||||
action: function () { |
||||
self.setParamType(i, this.getValue()[0]); |
||||
} |
||||
}] |
||||
}, self.service.createParameterValueItem(param, function (val) { |
||||
self.setParamValue(i, val); |
||||
}),{ |
||||
type: "bi.icon_button", |
||||
cls: "default-delete-font", |
||||
height: 30, |
||||
lgap: 10, |
||||
title: BI.i18nText("Dec-Basic_Delete"), |
||||
handler: function () { |
||||
self.deleteParameter(i); |
||||
} |
||||
}]; |
||||
}); |
||||
}, |
||||
previewAble: function () { |
||||
return BI.isNotEmptyString(this.model.config); |
||||
}, |
||||
previewedDataSet: function () { |
||||
return { |
||||
datasetType: DecCst.DataSet.Type.DEMO_DATA, |
||||
datasetName: this.model.dataSetName, |
||||
datasetData: { |
||||
config: this.model.config, |
||||
parameters: this.model.parameters |
||||
} |
||||
}; |
||||
} |
||||
}, |
||||
actions: { |
||||
initPage: function (cb) { |
||||
var self = this; |
||||
cb(); |
||||
}, |
||||
setConfig: function(v){ |
||||
this.model.config = v; |
||||
}, |
||||
refreshParam: function () { |
||||
var self = this; |
||||
Dec.Utils.getDataSetParameters(this.model.previewedDataSet, function (res) { |
||||
self.model.parameters = self.service.getParameters(res.data, self.model.parameters); |
||||
}); |
||||
}, |
||||
addParamter:function(v){ |
||||
this.model.parameters.push(v); |
||||
}, |
||||
deleteParameter:function(index){ |
||||
this.model.parameters.splice(index, 1); |
||||
}, |
||||
setParamName: function (index, name) { |
||||
this.model.parameters[index].name = name; |
||||
}, |
||||
setParamType: function (index, type) { |
||||
if (this.model.parameters[index].type !== type) { |
||||
this.model.parameters[index].type = type; |
||||
this.model.parameters[index].value = this.service.getDefaultValueByType(type); |
||||
this.model.parameters.splice(0, 0); |
||||
} |
||||
}, |
||||
setParamValue: function (index, val) { |
||||
this.model.parameters[index].value = val; |
||||
}, |
||||
setAbleSave: function (v) { |
||||
this.model.ableSave = v; |
||||
} |
||||
} |
||||
}); |
||||
BI.model("dec.model.data.set.type.sync.data", Model); |
||||
|
||||
|
||||
var DemoData = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "dec-data-set-sql", |
||||
$testId: "dec-data-set-sql", |
||||
value: { |
||||
datasetData: {} |
||||
} |
||||
}, |
||||
_store: function () { |
||||
return BI.Models.getModel("dec.model.data.set.type.sync.data", this.options); |
||||
}, |
||||
watch: { |
||||
config: function (v) { |
||||
this.configEditor.setValue(v); |
||||
}, |
||||
"config || parameters.**": function () { |
||||
this.previewPane.resetPreview(); |
||||
}, |
||||
parameters: function () { |
||||
// this.paramSettingPane.populate(this.model.paramItems, this.model.paramHeader);
|
||||
} |
||||
}, |
||||
beforeInit: function (cb) { |
||||
this.store.initPage(cb); |
||||
}, |
||||
render: function () { |
||||
var self = this; |
||||
self.store.setConfig("1"); |
||||
var feishuApp = getFeishuApp(); |
||||
var parameter = this.model.parameters; |
||||
var appid = ""; |
||||
var url = ""; |
||||
|
||||
$.each(parameter,function(index,item){ |
||||
if(item.name == 'appid'){ |
||||
appid = item.value; |
||||
} |
||||
|
||||
if(item.name == 'url'){ |
||||
url = item.value; |
||||
} |
||||
}) |
||||
|
||||
return { |
||||
type: "bi.htape", |
||||
items: [ |
||||
//左侧的配置界面
|
||||
{ |
||||
el: { |
||||
type: "bi.vtape", |
||||
items: [ |
||||
|
||||
{ |
||||
type: "bi.left", |
||||
height:25, |
||||
items: [ |
||||
{ |
||||
type: "bi.label", |
||||
text:"飞书应用", |
||||
textHeight:25, |
||||
textAlign:"left", |
||||
css:{"font-weight":"bold","color":"black"}, |
||||
width:100, |
||||
rgap:10 |
||||
},{ |
||||
type: "bi.text_value_combo", |
||||
text: "", |
||||
value: appid, |
||||
width: 200, |
||||
allowClear: true, |
||||
height: 24, |
||||
items: feishuApp, |
||||
ref:function(obj){ |
||||
self.checkbox = obj; |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
var appid = self.checkbox.getValue()[0]; |
||||
var url =self.url.getValue(); |
||||
|
||||
self.model.parameters = [{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url}] |
||||
} |
||||
}], |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
type:"dec.wink.item", |
||||
text:"多维表url", |
||||
value:url, |
||||
ref:function(obj){ |
||||
self.url = obj |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
var appid = self.checkbox.getValue()[0]; |
||||
var url =self.url.getValue(); |
||||
|
||||
self.model.parameters = [{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url}] |
||||
} |
||||
}], |
||||
} |
||||
], |
||||
lgap: 10, |
||||
vgap: 15 |
||||
}, |
||||
width: 410, |
||||
lgap: 10, |
||||
vgap: 15 |
||||
}, |
||||
//右侧的预览界面
|
||||
{ |
||||
el: { |
||||
type: "bi.absolute", |
||||
cls: "bi-sortable-holder", |
||||
items: [{ |
||||
el: { |
||||
type: "dec.data.set.preview", |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
self.store.refreshParam(); |
||||
self.previewPane.previewData(); |
||||
} |
||||
}], |
||||
ref: function (_ref) { |
||||
self.previewPane = _ref; |
||||
} |
||||
}, top: 10, right: 10, bottom: 10, left: 10 |
||||
}] |
||||
}, |
||||
hgap: 10, |
||||
vgap: 15 |
||||
} |
||||
] |
||||
}; |
||||
}, |
||||
getValue: function () { |
||||
var appid = this.checkbox.getValue()[0]; |
||||
var url =this.url.getValue(); |
||||
|
||||
return { |
||||
config: this.model.config, |
||||
parameters: [{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url}] |
||||
}; |
||||
} |
||||
}); |
||||
BI.shortcut("dec.data.set.type.sync.data", DemoData); |
||||
|
||||
$.extend(DecCst.DataSet.Type,{DEMO_DATA:"飞书多维表数据集"}); |
||||
BI.config("dec.provider.data.set", function (provider) { |
||||
provider.registerDataSetType({ |
||||
value: DecCst.DataSet.Type.DEMO_DATA, |
||||
text: "飞书多维表数据集", |
||||
cardType: "dec.data.set.type.sync.data", |
||||
iconCls: "management-maintenance-cloud-font", |
||||
ableSave:true |
||||
}); |
||||
}); |
||||
})(); |
||||
|
||||
//ajax--------------------------------------------------------------------------------------------------
|
||||
function getFeishuApp(){ |
||||
var result = {}; |
||||
|
||||
$.ajax({ |
||||
type:"get", |
||||
async:false, |
||||
url:"decision/fsds/getAll", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
success:function(data){ |
||||
result = JSON.parse(data.data); |
||||
}, |
||||
error:function(data){ |
||||
} |
||||
}) |
||||
|
||||
var resultArray = []; |
||||
|
||||
$.each(result,function(index,item){ |
||||
resultArray.push({"text":item.appname,"value":item.id}) |
||||
}) |
||||
|
||||
return resultArray; |
||||
} |
||||
|
||||
//通用组件------------------------------------------------------------------------------------------------
|
||||
//文字+输入框标题
|
||||
var e = BI.inherit(BI.Widget, { |
||||
props: { |
||||
text: "", |
||||
value:"", |
||||
inputType:"text", |
||||
disabled:false |
||||
}, |
||||
render: function () { |
||||
var t = this; |
||||
return { |
||||
type: "bi.left", |
||||
height:25, |
||||
|
||||
items: [ |
||||
{ |
||||
type: "bi.label", |
||||
text:this.options.text, |
||||
textHeight:25, |
||||
textAlign:"left", |
||||
css:{"font-weight":"bold","color":"black"}, |
||||
width:100, |
||||
rgap:10 |
||||
},{ |
||||
type: "bi.editor", |
||||
allowBlank: true, |
||||
value:this.options.value, |
||||
width: 200, |
||||
height: 25, |
||||
cls: "bi-border", |
||||
inputType:this.options.inputType, |
||||
disabled:this.options.disabled, |
||||
validationChecker:function(){ |
||||
return true; |
||||
}, |
||||
ref:function(ref){ |
||||
t.input = ref; |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function() { |
||||
t.fireEvent("EVENT_CHANGE", ""); |
||||
} |
||||
}] |
||||
} |
||||
] |
||||
} |
||||
}, |
||||
getValue:function(){ |
||||
return this.input.getValue(); |
||||
}, |
||||
setValue:function(value){ |
||||
this.input.setValue(value) |
||||
} |
||||
}); |
||||
|
||||
BI.shortcut("dec.wink.item", e); |
@ -0,0 +1,493 @@
|
||||
|
||||
|
||||
/** |
||||
* @author 秃破天际 |
||||
* @version 10.0 |
||||
* Created by 秃破天际 on 2021-03-29 |
||||
**/ |
||||
!(function () { |
||||
var Model = BI.inherit(Fix.Model, { |
||||
_init: function () { |
||||
this.service = BI.Services.getService("dec.service.data.set"); |
||||
}, |
||||
context: ["dataSetName", "ableSave"], |
||||
state: function () { |
||||
var val = this.options.value.datasetData || {}; |
||||
return { |
||||
config : val.config || "", |
||||
parameters: val.parameters || [] |
||||
}; |
||||
}, |
||||
childContext: ["previewAble", "previewedDataSet"], |
||||
watch: { |
||||
previewAble: function (v) { |
||||
this.setAbleSave(v); |
||||
} |
||||
}, |
||||
computed: { |
||||
paramHeader: function () { |
||||
//定义参数列表表头
|
||||
var map = BI.map(BI.Constants.getConstant("dec.constants.data.set.sql.header"), function (i, v) { |
||||
return BI.extend({ |
||||
textAlign: "left", |
||||
height: 30, |
||||
hgap: 10 |
||||
}, v); |
||||
}); |
||||
map.push({ |
||||
textAlign: "left", |
||||
height: 30, |
||||
hgap: 10, |
||||
text: "" |
||||
}); |
||||
return [map]; |
||||
}, |
||||
paramItems: function () { |
||||
var self = this; |
||||
return BI.map(this.model.parameters, function (i, param) { |
||||
return [{ |
||||
type: "bi.text_editor", |
||||
value: param.name, |
||||
textAlign: "left", |
||||
height: 30, |
||||
lgap: 10, |
||||
listeners: [{ |
||||
eventName: BI.TextEditor.EVENT_CHANGE, |
||||
action: function () { |
||||
self.setParamName(i, this.getValue()); |
||||
} |
||||
}] |
||||
}, { |
||||
type: "bi.icon_text_value_combo", |
||||
cls: "field-type-change", |
||||
height: 30, |
||||
items: BI.Constants.getConstant("dec.constants.data.set.sql.field"), |
||||
value: param.type, |
||||
listeners: [{ |
||||
eventName: BI.IconTextValueCombo.EVENT_CHANGE, |
||||
action: function () { |
||||
self.setParamType(i, this.getValue()[0]); |
||||
} |
||||
}] |
||||
}, self.service.createParameterValueItem(param, function (val) { |
||||
self.setParamValue(i, val); |
||||
}),{ |
||||
type: "bi.icon_button", |
||||
cls: "default-delete-font", |
||||
height: 30, |
||||
lgap: 10, |
||||
title: BI.i18nText("Dec-Basic_Delete"), |
||||
handler: function () { |
||||
self.deleteParameter(i); |
||||
} |
||||
}]; |
||||
}); |
||||
}, |
||||
previewAble: function () { |
||||
return BI.isNotEmptyString(this.model.config); |
||||
}, |
||||
previewedDataSet: function () { |
||||
return { |
||||
datasetType: DecCst.DataSet.Type.DEMO_DATA2, |
||||
datasetName: this.model.dataSetName, |
||||
datasetData: { |
||||
config: this.model.config, |
||||
parameters: this.model.parameters |
||||
} |
||||
}; |
||||
} |
||||
}, |
||||
actions: { |
||||
initPage: function (cb) { |
||||
var self = this; |
||||
cb(); |
||||
}, |
||||
setConfig: function(v){ |
||||
this.model.config = v; |
||||
}, |
||||
refreshParam: function () { |
||||
var self = this; |
||||
Dec.Utils.getDataSetParameters(this.model.previewedDataSet, function (res) { |
||||
self.model.parameters = self.service.getParameters(res.data, self.model.parameters); |
||||
}); |
||||
}, |
||||
addParamter:function(v){ |
||||
this.model.parameters.push(v); |
||||
}, |
||||
deleteParameter:function(index){ |
||||
this.model.parameters.splice(index, 1); |
||||
}, |
||||
setParamName: function (index, name) { |
||||
this.model.parameters[index].name = name; |
||||
}, |
||||
setParamType: function (index, type) { |
||||
if (this.model.parameters[index].type !== type) { |
||||
this.model.parameters[index].type = type; |
||||
this.model.parameters[index].value = this.service.getDefaultValueByType(type); |
||||
this.model.parameters.splice(0, 0); |
||||
} |
||||
}, |
||||
setParamValue: function (index, val) { |
||||
this.model.parameters[index].value = val; |
||||
}, |
||||
setAbleSave: function (v) { |
||||
this.model.ableSave = v; |
||||
} |
||||
} |
||||
}); |
||||
BI.model("dec.model.data.set.type.sync.data.sheet", Model); |
||||
|
||||
|
||||
var DemoData = BI.inherit(BI.Widget, { |
||||
props: { |
||||
baseCls: "dec-data-set-sql", |
||||
$testId: "dec-data-set-sql", |
||||
value: { |
||||
datasetData: {} |
||||
} |
||||
}, |
||||
_store: function () { |
||||
return BI.Models.getModel("dec.model.data.set.type.sync.data.sheet", this.options); |
||||
}, |
||||
watch: { |
||||
config: function (v) { |
||||
this.configEditor.setValue(v); |
||||
}, |
||||
"config || parameters.**": function () { |
||||
this.previewPane.resetPreview(); |
||||
}, |
||||
parameters: function () { |
||||
// this.paramSettingPane.populate(this.model.paramItems, this.model.paramHeader);
|
||||
} |
||||
}, |
||||
beforeInit: function (cb) { |
||||
this.store.initPage(cb); |
||||
}, |
||||
render: function () { |
||||
var self = this; |
||||
self.store.setConfig("1"); |
||||
var feishuApp = getFeishuApp(); |
||||
var parameter = this.model.parameters; |
||||
var appid = ""; |
||||
var url = ""; |
||||
var headrow = 0; |
||||
var rowsize = 0; |
||||
var columnSize = "A"; |
||||
|
||||
$.each(parameter,function(index,item){ |
||||
if(item.name == 'appid'){ |
||||
appid = item.value; |
||||
} |
||||
|
||||
if(item.name == 'url'){ |
||||
url = item.value; |
||||
} |
||||
|
||||
if(item.name == 'headrow'){ |
||||
headrow = item.value; |
||||
} |
||||
|
||||
if(item.name == 'rowsize'){ |
||||
rowsize = item.value; |
||||
} |
||||
|
||||
if(item.name == 'columnSize'){ |
||||
columnSize = item.value; |
||||
} |
||||
}) |
||||
|
||||
return { |
||||
type: "bi.htape", |
||||
items: [ |
||||
//左侧的配置界面
|
||||
{ |
||||
el: { |
||||
type: "bi.vtape", |
||||
items: [ |
||||
|
||||
{ |
||||
type: "bi.left", |
||||
height:25, |
||||
items: [ |
||||
{ |
||||
type: "bi.label", |
||||
text:"飞书应用", |
||||
textHeight:25, |
||||
textAlign:"left", |
||||
css:{"font-weight":"bold","color":"black"}, |
||||
width:100, |
||||
rgap:10 |
||||
},{ |
||||
type: "bi.text_value_combo", |
||||
text: "", |
||||
value: appid, |
||||
width: 200, |
||||
allowClear: true, |
||||
height: 24, |
||||
items: feishuApp, |
||||
ref:function(obj){ |
||||
self.checkbox = obj; |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
var appid = self.checkbox.getValue()[0]; |
||||
var url =self.url.getValue(); |
||||
var headrow = self.headrow.getValue(); |
||||
var rowsize = self.rowsize.getValue(); |
||||
var columnSize = self.columnSize.getValue(); |
||||
|
||||
self.model.parameters =[{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url} |
||||
,{"name":"headrow","type":"String","value":headrow},{"name":"rowsize","type":"String","value":rowsize},{"name":"columnSize","type":"String","value":columnSize}, |
||||
] |
||||
} |
||||
}], |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
type: "bi.absolute", |
||||
items:[ |
||||
{ |
||||
type:"dec.wink.item", |
||||
text:"多维表url", |
||||
value:url, |
||||
ref:function(obj){ |
||||
self.url = obj |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
var appid = self.checkbox.getValue()[0]; |
||||
var url =self.url.getValue(); |
||||
var headrow = self.headrow.getValue(); |
||||
var rowsize = self.rowsize.getValue(); |
||||
var columnSize = self.columnSize.getValue(); |
||||
|
||||
self.model.parameters =[{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url} |
||||
,{"name":"headrow","type":"String","value":headrow},{"name":"rowsize","type":"String","value":rowsize},{"name":"columnSize","type":"String","value":columnSize}, |
||||
] |
||||
} |
||||
}], |
||||
}, |
||||
{ |
||||
type:"dec.wink.item", |
||||
text:"表头行号", |
||||
value:headrow, |
||||
ref:function(obj){ |
||||
self.headrow = obj |
||||
}, |
||||
top:40, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
var appid = self.checkbox.getValue()[0]; |
||||
var url =self.url.getValue(); |
||||
var headrow = self.headrow.getValue(); |
||||
var rowsize = self.rowsize.getValue(); |
||||
var columnSize = self.columnSize.getValue(); |
||||
|
||||
self.model.parameters =[{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url} |
||||
,{"name":"headrow","type":"String","value":headrow},{"name":"rowsize","type":"String","value":rowsize},{"name":"columnSize","type":"String","value":columnSize}, |
||||
] |
||||
} |
||||
}], |
||||
}, |
||||
{ |
||||
type:"dec.wink.item", |
||||
text:"截止行号", |
||||
value:rowsize, |
||||
ref:function(obj){ |
||||
self.rowsize = obj |
||||
}, |
||||
top:80, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
var appid = self.checkbox.getValue()[0]; |
||||
var url =self.url.getValue(); |
||||
var headrow = self.headrow.getValue(); |
||||
var rowsize = self.rowsize.getValue(); |
||||
var columnSize = self.columnSize.getValue(); |
||||
|
||||
self.model.parameters =[{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url} |
||||
,{"name":"headrow","type":"String","value":headrow},{"name":"rowsize","type":"String","value":rowsize},{"name":"columnSize","type":"String","value":columnSize}, |
||||
] |
||||
} |
||||
}], |
||||
}, |
||||
{ |
||||
type:"dec.wink.item", |
||||
text:"截止列名", |
||||
value:columnSize, |
||||
ref:function(obj){ |
||||
self.columnSize = obj |
||||
}, |
||||
top:120, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
var appid = self.checkbox.getValue()[0]; |
||||
var url =self.url.getValue(); |
||||
var headrow = self.headrow.getValue(); |
||||
var rowsize = self.rowsize.getValue(); |
||||
var columnSize = self.columnSize.getValue(); |
||||
|
||||
self.model.parameters =[{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url} |
||||
,{"name":"headrow","type":"String","value":headrow},{"name":"rowsize","type":"String","value":rowsize},{"name":"columnSize","type":"String","value":columnSize}, |
||||
] |
||||
} |
||||
}], |
||||
} |
||||
] |
||||
}, |
||||
|
||||
], |
||||
lgap: 10, |
||||
vgap: 15 |
||||
}, |
||||
width: 410, |
||||
lgap: 10, |
||||
vgap: 15 |
||||
}, |
||||
//右侧的预览界面
|
||||
{ |
||||
el: { |
||||
type: "bi.absolute", |
||||
cls: "bi-sortable-holder", |
||||
items: [{ |
||||
el: { |
||||
type: "dec.data.set.preview", |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function () { |
||||
self.store.refreshParam(); |
||||
self.previewPane.previewData(); |
||||
} |
||||
}], |
||||
ref: function (_ref) { |
||||
self.previewPane = _ref; |
||||
} |
||||
}, top: 10, right: 10, bottom: 10, left: 10 |
||||
}] |
||||
}, |
||||
hgap: 10, |
||||
vgap: 15 |
||||
} |
||||
] |
||||
}; |
||||
}, |
||||
getValue: function () { |
||||
var appid = this.checkbox.getValue()[0]; |
||||
var url =this.url.getValue(); |
||||
var headrow = this.headrow.getValue(); |
||||
var rowsize = this.rowsize.getValue(); |
||||
var columnSize = this.columnSize.getValue(); |
||||
return { |
||||
config: this.model.config, |
||||
parameters: [{"name":"appid","type":"String","value":appid},{"name":"url","type":"String","value":url} |
||||
,{"name":"headrow","type":"String","value":headrow},{"name":"rowsize","type":"String","value":rowsize},{"name":"columnSize","type":"String","value":columnSize}, |
||||
] |
||||
}; |
||||
} |
||||
}); |
||||
BI.shortcut("dec.data.set.type.sync.data.sheet", DemoData); |
||||
|
||||
$.extend(DecCst.DataSet.Type,{DEMO_DATA2:"飞书表格单sheet数据集"}); |
||||
|
||||
BI.config("dec.provider.data.set", function (provider) { |
||||
provider.registerDataSetType({ |
||||
value: DecCst.DataSet.Type.DEMO_DATA2, |
||||
text: "飞书表格单sheet数据集", |
||||
cardType: "dec.data.set.type.sync.data.sheet", |
||||
iconCls: "management-maintenance-cloud-font", |
||||
ableSave:true |
||||
}); |
||||
}); |
||||
})(); |
||||
|
||||
//ajax--------------------------------------------------------------------------------------------------
|
||||
function getFeishuApp(){ |
||||
var result = {}; |
||||
|
||||
$.ajax({ |
||||
type:"get", |
||||
async:false, |
||||
url:"decision/fsds/getAll", |
||||
xhrFields:{ |
||||
withCredentials:true |
||||
}, |
||||
success:function(data){ |
||||
result = JSON.parse(data.data); |
||||
}, |
||||
error:function(data){ |
||||
} |
||||
}) |
||||
|
||||
var resultArray = []; |
||||
|
||||
$.each(result,function(index,item){ |
||||
resultArray.push({"text":item.appname,"value":item.id}) |
||||
}) |
||||
|
||||
return resultArray; |
||||
} |
||||
|
||||
//通用组件------------------------------------------------------------------------------------------------
|
||||
//文字+输入框标题
|
||||
var e = BI.inherit(BI.Widget, { |
||||
props: { |
||||
text: "", |
||||
value:"", |
||||
inputType:"text", |
||||
disabled:false |
||||
}, |
||||
render: function () { |
||||
var t = this; |
||||
return { |
||||
type: "bi.left", |
||||
height:25, |
||||
|
||||
items: [ |
||||
{ |
||||
type: "bi.label", |
||||
text:this.options.text, |
||||
textHeight:25, |
||||
textAlign:"left", |
||||
css:{"font-weight":"bold","color":"black"}, |
||||
width:100, |
||||
rgap:10 |
||||
},{ |
||||
type: "bi.editor", |
||||
allowBlank: true, |
||||
value:this.options.value, |
||||
width: 200, |
||||
height: 25, |
||||
cls: "bi-border", |
||||
inputType:this.options.inputType, |
||||
disabled:this.options.disabled, |
||||
validationChecker:function(){ |
||||
return true; |
||||
}, |
||||
ref:function(ref){ |
||||
t.input = ref; |
||||
}, |
||||
listeners: [{ |
||||
eventName: "EVENT_CHANGE", |
||||
action: function() { |
||||
t.fireEvent("EVENT_CHANGE", ""); |
||||
} |
||||
}] |
||||
} |
||||
] |
||||
} |
||||
}, |
||||
getValue:function(){ |
||||
return this.input.getValue(); |
||||
}, |
||||
setValue:function(value){ |
||||
this.input.setValue(value) |
||||
} |
||||
}); |
||||
|
||||
BI.shortcut("dec.wink.item", e); |