You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
182 lines
6.6 KiB
182 lines
6.6 KiB
/* |
|
* Copyright (C), 2015-2019 |
|
* FileName: TableDataHandler |
|
* Author: xxx |
|
* Date: 2019/8/17 22:28 |
|
* Description: PublicHttpHandler |
|
* History: |
|
* <author> <time> <version> <desc> |
|
*/ |
|
package com.fr.plugin.tabledataservice.request; |
|
|
|
import com.fanruan.api.i18n.I18nKit; |
|
import com.fanruan.api.log.LogKit; |
|
import com.fr.base.Parameter; |
|
import com.fr.base.TableData; |
|
import com.fr.data.impl.ConditionTableData; |
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
|
import com.fr.general.ComparatorUtils; |
|
import com.fr.general.data.DataModel; |
|
import com.fr.intelli.record.Focus; |
|
import com.fr.intelli.record.Original; |
|
import com.fr.io.TemplateWorkBookIO; |
|
import com.fr.json.JSONArray; |
|
import com.fr.json.JSONObject; |
|
import com.fr.log.FineLoggerFactory; |
|
import com.fr.main.TemplateWorkBook; |
|
import com.fr.plugin.context.PluginContexts; |
|
import com.fr.plugin.tabledataservice.ConfigTableDataService; |
|
import com.fr.plugin.tabledataservice.Constants; |
|
import com.fr.plugin.tabledataservice.utils.FuncUtils; |
|
import com.fr.record.analyzer.EnableMetrics; |
|
import com.fr.script.Calculator; |
|
import com.fr.stable.StringUtils; |
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
|
import com.fr.web.utils.WebUtils; |
|
|
|
import javax.servlet.http.HttpServletRequest; |
|
import javax.servlet.http.HttpServletResponse; |
|
|
|
/** |
|
* 〈Function Description〉<br> |
|
* 〈TableDataHandler〉 |
|
* |
|
* @author xxx |
|
* @since 1.0.0 |
|
*/ |
|
@EnableMetrics |
|
public class TableDataHandler extends BaseHttpHandler { |
|
|
|
public static final int TOTAL_PAGE_NUMBER = 1; |
|
public static final int START_ROW = 0; |
|
|
|
/** |
|
* tableData转为JSON |
|
* 参考函数 ReportUtils.tableDataToFlexgridObject4WebPreview()修改 |
|
* |
|
* @param tableData |
|
* @param pageNumber |
|
* @param pageSize |
|
* @return |
|
* @throws Exception |
|
*/ |
|
private JSONObject tableDataToJSON(TableData tableData, int pageNumber, int pageSize) throws Exception { |
|
JSONObject resultJSON = JSONObject.create(); |
|
DataModel dataModel = null; |
|
try { |
|
dataModel = tableData.createDataModel(Calculator.createCalculator()); |
|
int rowCount = dataModel.getRowCount(); |
|
int totalPageNumber = TOTAL_PAGE_NUMBER; |
|
int startRow = START_ROW; |
|
int endRow = rowCount - 1; |
|
if (pageNumber > 0 && pageSize > 0) { |
|
totalPageNumber = (rowCount + pageSize - 1) / pageSize; |
|
startRow = (pageNumber - 1) * pageSize; |
|
endRow = (pageNumber * pageSize) - 1; |
|
} |
|
resultJSON.put("err_code", 0).put("err_msg", "") |
|
.put("total_page_number", totalPageNumber) |
|
.put("page_number", pageNumber) |
|
.put("page_size", pageSize); |
|
JSONArray data = JSONArray.create(); |
|
for (int row = startRow; row <= endRow && row < rowCount; row++) { |
|
JSONObject rowObject = JSONObject.create(); |
|
for (int col = 0; col < dataModel.getColumnCount(); col++) { |
|
rowObject.put(dataModel.getColumnName(col), dataModel.getValueAt(row, col)); |
|
} |
|
data.put(rowObject); |
|
} |
|
resultJSON.put("data", data); |
|
|
|
} catch (Exception e) { |
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
} finally { |
|
if (dataModel != null) { |
|
dataModel.release(); |
|
} |
|
} |
|
return resultJSON; |
|
} |
|
|
|
private int isErrorParams(JSONObject params) { |
|
if (!params.has("report_path") || StringUtils.isEmpty(params.getString("report_path"))) { |
|
return 10; |
|
} |
|
if (!params.has("datasource_name") || StringUtils.isEmpty(params.getString("datasource_name"))) { |
|
return 11; |
|
} |
|
if (!params.has("page_number") || ComparatorUtils.equals(params.getInt("page_number"), 0)) { |
|
return 12; |
|
} |
|
if (!params.has("page_size") || ComparatorUtils.equals(params.getInt("page_size"), 0)) { |
|
return 13; |
|
} |
|
String appKey = ConfigTableDataService.getInstance().getAppKey(); |
|
if (StringUtils.isNotEmpty(appKey) && !FuncUtils.validateMD5(appKey, params.getString("report_path"), params.getString("timestamp"), params.getString("sign"))) { |
|
return 15; |
|
} |
|
return 0; |
|
} |
|
|
|
private Parameter[] getParameters(JSONArray param) { |
|
if (param == null) { |
|
return null; |
|
} |
|
Parameter[] parameters = new Parameter[param.size()]; |
|
for (int i = 0; i < param.size(); i++) { |
|
parameters[i] = Parameter.getParameterFromJson(param.getJSONObject(i)); |
|
} |
|
return parameters; |
|
} |
|
|
|
@Override |
|
public RequestMethod getMethod() { |
|
return RequestMethod.POST; |
|
} |
|
|
|
@Override |
|
public String getPath() { |
|
return "/api/data"; |
|
} |
|
|
|
@Override |
|
public boolean isPublic() { |
|
return true; |
|
} |
|
|
|
@Override |
|
@Focus(id = Constants.PLUGIN_ID, text = "Plugin-tabledataservice", source = Original.PLUGIN) |
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
|
if (!PluginContexts.currentContext().isAvailable()) { |
|
LogKit.error(I18nKit.getLocText("Plugin-tabledataservice_Licence_Expired")); |
|
FuncUtils.printErrorJSON(res, 21); |
|
return; |
|
} |
|
JSONObject params = FuncUtils.getParams(req); |
|
LogKit.info("tabledataservice:handle-params, {}", params.toString()); |
|
int errorCode = isErrorParams(params); |
|
if (!ComparatorUtils.equals(errorCode, 0)) { |
|
FuncUtils.printErrorJSON(res, errorCode); |
|
return; |
|
} |
|
TemplateWorkBook workBook = TemplateWorkBookIO.readTemplateWorkBook(params.getString("report_path")); |
|
if (workBook == null) { |
|
FuncUtils.printErrorJSON(res, 14); |
|
return; |
|
} |
|
TableData tableData = workBook.getTableData(params.getString("datasource_name")); |
|
if (tableData == null) { |
|
FuncUtils.printErrorJSON(res, 20); |
|
return; |
|
} |
|
if (params.has("parameters")) { |
|
if (tableData instanceof ConditionTableData) { |
|
((ConditionTableData) tableData).setDefineParameters(getParameters(params.getJSONArray("parameters"))); |
|
} else { |
|
tableData.setParameters(getParameters(params.getJSONArray("parameters"))); |
|
} |
|
} |
|
JSONObject resultJSON = tableDataToJSON(tableData, params.getInt("page_number"), params.getInt("page_size")); |
|
WebUtils.printAsJSON(res, resultJSON); |
|
} |
|
} |