pioneer
2 years ago
commit
89028fb929
33 changed files with 2633 additions and 0 deletions
@ -0,0 +1,6 @@ |
|||||||
|
# open-JSD-10259 |
||||||
|
|
||||||
|
JSD-10259 预览以及打印时调用客户接口返回图片作为公章水印;及导出支持txt\ |
||||||
|
免责说明:该源码为第三方爱好者提供,不保证源码和方案的可靠性,也不提供任何形式的源码教学指导和协助!\ |
||||||
|
仅作为开发者学习参考使用!禁止用于任何商业用途!\ |
||||||
|
为保护开发者隐私,开发者信息已隐去!若原开发者希望公开自己的信息,可联系【pioneer】处理。 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,33 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><plugin> |
||||||
|
<id>com.fr.plugin.third.party.jsdbacfj</id> |
||||||
|
<name><![CDATA[印章集成_EK]]></name> |
||||||
|
<active>yes</active> |
||||||
|
<version>1.0.26</version> |
||||||
|
<env-version>10.0</env-version> |
||||||
|
<jartime>2019-01-01</jartime> |
||||||
|
<vendor>fr.open</vendor> |
||||||
|
<description><![CDATA[]]></description> |
||||||
|
<change-notes><![CDATA[ |
||||||
|
]]></change-notes> |
||||||
|
<lifecycle-monitor class="com.fr.plugin.third.party.jsdbacfj.OutputPluginLifecycleMonitor"/> |
||||||
|
<extra-core> |
||||||
|
<IconProvider class="com.fr.plugin.third.party.jsdbacfj.export.TxtIconProvider"/> |
||||||
|
<IOFileAttrMark class="com.fr.plugin.third.party.jsdbacfj.export.TxtDelimiterAttrMark"/> |
||||||
|
</extra-core> |
||||||
|
<extra-report> |
||||||
|
<ExtensionButtonProvider class="com.fr.plugin.third.party.jsdbacfj.export.TxtExtensionButtonProvider"/> |
||||||
|
<ExportOperateProvider class="com.fr.plugin.third.party.jsdbacfj.export.TxtExportOperateProvider"/> |
||||||
|
<JavaScriptFileHandler class="com.fr.plugin.third.party.jsdbacfj.export.web.JavaScriptFileHandler"/> |
||||||
|
</extra-report> |
||||||
|
<extra-designer> |
||||||
|
<ToolbarItemProvider class="com.fr.plugin.third.party.jsdbacfj.export.TxtExportToolbarItemProvider"/> |
||||||
|
<MenuHandler class="com.fr.plugin.third.party.jsdbacfj.export.menu.TextDelimiterMenuHandler"/> |
||||||
|
</extra-designer> |
||||||
|
<extra-decision> |
||||||
|
<!--<WebResourceProvider class="com.fr.plugin.third.party.jsdbacfj.web.MainWebResourceProvider"/>--> |
||||||
|
<HttpHandlerProvider class="com.fr.plugin.third.party.jsdbacfj.http.CustomHttpHandlerProvider"/> |
||||||
|
<URLAliasProvider class="com.fr.plugin.third.party.jsdbacfj.http.CustomURLAliasProvider"/> |
||||||
|
<GlobalRequestFilterProvider class="com.fr.plugin.third.party.jsdbacfj.http.SessionGlobalRequestFilterProvider"/> |
||||||
|
</extra-decision> |
||||||
|
<function-recorder class="com.fr.plugin.third.party.jsdbacfj.OutputPluginLifecycleMonitor"/> |
||||||
|
</plugin> |
@ -0,0 +1,28 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj; |
||||||
|
|
||||||
|
import com.fr.intelli.record.Focus; |
||||||
|
import com.fr.intelli.record.Original; |
||||||
|
import com.fr.plugin.context.PluginContext; |
||||||
|
import com.fr.plugin.observer.inner.AbstractPluginLifecycleMonitor; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.config.CustomDataConfig; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.export.TxtIconLoader; |
||||||
|
import com.fr.record.analyzer.EnableMetrics; |
||||||
|
import com.fr.stable.fun.Authorize; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 配置信息初始化 |
||||||
|
*/ |
||||||
|
@EnableMetrics |
||||||
|
public class OutputPluginLifecycleMonitor extends AbstractPluginLifecycleMonitor { |
||||||
|
@Override |
||||||
|
@Focus(id = "com.fr.plugin.third.party.jsdbacfj", text = "plugin-jsdbacfj", source = Original.PLUGIN) |
||||||
|
public void afterRun(PluginContext pluginContext) { |
||||||
|
CustomDataConfig.getInstance(); |
||||||
|
TxtIconLoader.loadIcon(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void beforeStop(PluginContext pluginContext) { |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,754 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.base.Base64; |
||||||
|
import com.fr.data.NetworkHelper; |
||||||
|
import com.fr.file.CacheManager; |
||||||
|
import com.fr.general.ReportDeclareRecordType; |
||||||
|
import com.fr.io.exporter.PDFEmbExporter; |
||||||
|
import com.fr.io.exporter.PDFExporterForPrint; |
||||||
|
import com.fr.json.JSONArray; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.LogUtils; |
||||||
|
import com.fr.page.PageSetProvider; |
||||||
|
import com.fr.plugin.context.PluginContexts; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.config.CustomDataConfig; |
||||||
|
import com.fr.report.ReportContext; |
||||||
|
import com.fr.report.controller.PrintOffsetController; |
||||||
|
import com.fr.report.entity.PrintOffsetEntity; |
||||||
|
import com.fr.report.print.PrintOffsetSign; |
||||||
|
import com.fr.report.print.TypeIP; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.stable.web.SessionProvider; |
||||||
|
import com.fr.third.org.apache.commons.io.FileUtils; |
||||||
|
import com.fr.third.org.apache.commons.lang3.time.DateFormatUtils; |
||||||
|
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||||
|
import com.fr.web.core.ReportRepositoryDeal; |
||||||
|
import com.fr.web.core.ReportSessionIDInfor; |
||||||
|
import com.fr.web.core.SessionPoolManager; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
import org.apache.pdfbox.cos.COSName; |
||||||
|
import org.apache.pdfbox.pdmodel.PDDocument; |
||||||
|
import org.apache.pdfbox.pdmodel.PDPage; |
||||||
|
import org.apache.pdfbox.pdmodel.PDPageContentStream; |
||||||
|
import org.apache.pdfbox.pdmodel.common.PDRectangle; |
||||||
|
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; |
||||||
|
import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.ServletOutputStream; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.*; |
||||||
|
import java.math.BigDecimal; |
||||||
|
import java.nio.ByteBuffer; |
||||||
|
import java.nio.channels.Channels; |
||||||
|
import java.nio.channels.ReadableByteChannel; |
||||||
|
import java.nio.channels.WritableByteChannel; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.nio.file.Path; |
||||||
|
import java.nio.file.Paths; |
||||||
|
import java.util.Collection; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.UUID; |
||||||
|
|
||||||
|
public class StampUtils { |
||||||
|
public static String getImgBase64() { |
||||||
|
String stampBase64 = getStampBase64(); |
||||||
|
if (StringKit.isEmpty(stampBase64)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String dataBase64 = "data:image/png;base64," + stampBase64; |
||||||
|
return dataBase64; |
||||||
|
} |
||||||
|
|
||||||
|
public static String getStampBase64() { |
||||||
|
return getStampBase64("012101"); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getStampBase64(String orgId) { |
||||||
|
try { |
||||||
|
|
||||||
|
String temp = ""; |
||||||
|
if (StringKit.isNotEmpty(temp)) { |
||||||
|
return temp; |
||||||
|
} |
||||||
|
|
||||||
|
String url = CustomDataConfig.getInstance().getStampEsbUrl(); |
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
if (StringKit.isEmpty(orgId)) { |
||||||
|
orgId = "012101"; |
||||||
|
} |
||||||
|
|
||||||
|
String bodyContent = "{\"sysHead\":\n" + |
||||||
|
"{\"userLang\":\"CHINESE\",\n" + |
||||||
|
"\"svcCd\":\"xx\",\n" + |
||||||
|
"\"scnCd\":\"xx\",\n" + |
||||||
|
"\"cnsmSysId\":\"xx\",\n" + |
||||||
|
"\"subSeqNo\":\"" + getId() + "\",\n" + |
||||||
|
"\"seqNo\":\"" + getId() + "\",\n" + |
||||||
|
"\"tranMode\":\"xx\",\n" + |
||||||
|
"\"systemId\":\"xx\",\n" + |
||||||
|
"\"tranDate\":\"" + getcurrentDate() + "\",\n" + |
||||||
|
"\"tranTimestamp\":\"" + getcurrentTimeStamp() + "\",\n" + |
||||||
|
"\"fileFlg\":\"0\",\n" + |
||||||
|
"\"userId\":\"\",\n" + |
||||||
|
"\"branchId\":\"\",\n" + |
||||||
|
"\"company\":\"\",\n" + |
||||||
|
"\"sourceBranchNo\":\"\",\n" + |
||||||
|
"\"apprUserId\":\"\",\n" + |
||||||
|
"\"macValue\":\"\",\n" + |
||||||
|
"\"srcSysTmnlNo\":\"\",\n" + |
||||||
|
"\"srcSysSvrId\":\"\",\n" + |
||||||
|
"\"filePath\":\"\",\n" + |
||||||
|
"\"authFlag\":\"\",\n" + |
||||||
|
"\"apprFlag\":\"\",\n" + |
||||||
|
"\"cnsmSysSvrId\":\"\",\n" + |
||||||
|
"\"destBranchNo\":\"\",\n" + |
||||||
|
"\"tmnIdNo\":\"\",\n" + |
||||||
|
"\"sourceType\":\"\",\n" + |
||||||
|
"\"authUserId\":\"\",\n" + |
||||||
|
"\"programId\":\"\"\n" + |
||||||
|
"},\n" + |
||||||
|
"\"appHead\": {},\n" + |
||||||
|
"\"body\": {\n" + |
||||||
|
"\"tranCd\": \"xx\",\n" + |
||||||
|
"\"chnlNo\": \"xxx\",\n" + |
||||||
|
"\"subBnkNo\": \"xxx\",\n" + |
||||||
|
"\"brNo\": \"xxx." + orgId + "\",\n" + |
||||||
|
"\"tlrNo\": \"xxx\",\n" + |
||||||
|
"\"bsnDt\": \"" + getcurrentDate() + "\",\n" + |
||||||
|
"\"bsnTm\": \"" + getcurrentTime() + "\",\n" + |
||||||
|
"\"chnlSeqNo\": \"" + getId() + "\",\n" + |
||||||
|
"\"mvmtBsnData\": \"\",\n" + |
||||||
|
"\"stmpId\": \"xx\"\n" + |
||||||
|
"}\n" + |
||||||
|
"}"; |
||||||
|
|
||||||
|
LogKit.info("印章集成,请求链接:" + url); |
||||||
|
LogKit.info("印章集成,请求内容:\n" + bodyContent); |
||||||
|
|
||||||
|
|
||||||
|
CloseableHttpClient httpClient = Utils.createHttpClient(url); |
||||||
|
String resBodyContent = Utils.createHttpPostContent(httpClient, url, bodyContent, "", "application/json;charset=UTF-8"); |
||||||
|
httpClient.close(); |
||||||
|
if (StringKit.isEmpty(resBodyContent)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
LogKit.info("印章集成,响应内容:\n" + resBodyContent); |
||||||
|
|
||||||
|
|
||||||
|
JSONObject jsonObject = new JSONObject(resBodyContent); |
||||||
|
if (!jsonObject.containsKey("body")) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
JSONObject bodyJson = jsonObject.getJSONObject("body"); |
||||||
|
if (!bodyJson.containsKey("stmpImgCntnt")) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String base64Content = bodyJson.getString("stmpImgCntnt"); |
||||||
|
if (StringKit.isEmpty(base64Content)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return base64Content; |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.info("印章集成,获取印章出错," + e.getMessage(), e); |
||||||
|
} |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getId() { |
||||||
|
String value = "ORSJ" + DateFormatUtils.format(System.currentTimeMillis(), "yyyyMMddHHmmssSSS"); |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getcurrentDate() { |
||||||
|
String value = DateFormatUtils.format(System.currentTimeMillis(), "yyyyMMdd"); |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getcurrentTime() { |
||||||
|
String value = DateFormatUtils.format(System.currentTimeMillis(), "HHmmss"); |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getcurrentTimeStamp() { |
||||||
|
String value = DateFormatUtils.format(System.currentTimeMillis(), "HHmmssSSS"); |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static Set<String> getStampReportNames() { |
||||||
|
Set<String> names = new HashSet<>(); |
||||||
|
String content = StringKit.trim(CustomDataConfig.getInstance().getStampReportName()); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
return names; |
||||||
|
} |
||||||
|
String[] tempNames = content.split(","); |
||||||
|
if ((tempNames == null) || (tempNames.length <= 0)) { |
||||||
|
return names; |
||||||
|
} |
||||||
|
|
||||||
|
String tempName; |
||||||
|
for (int i = 0, max = tempNames.length - 1; i <= max; i++) { |
||||||
|
tempName = StringKit.trim(tempNames[i]); |
||||||
|
if (StringKit.isEmpty(content)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
names.add(tempName); |
||||||
|
} |
||||||
|
return names; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isStampReport(String path) { |
||||||
|
if (StringKit.isEmpty(path)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
Set<String> tempNames = getStampReportNames(); |
||||||
|
if (tempNames.size() <= 0) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if (tempNames.contains(path)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isNotStampReport(String path) { |
||||||
|
return !isStampReport(path); |
||||||
|
} |
||||||
|
|
||||||
|
//[{reportlet: '印章测试/垫款-保证.cpt', orgId:123456}]
|
||||||
|
//FR.doURLPDFPrint
|
||||||
|
public static boolean isDoURLPDFPrint(String path) { |
||||||
|
if (StringKit.isEmpty(path)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
try { |
||||||
|
JSONArray jsons = new JSONArray(path); |
||||||
|
if ((jsons == null) || (jsons.size() <= 0)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
JSONObject json = jsons.getJSONObject(0); |
||||||
|
if (!json.containsKey("reportlet")) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isNotDoURLPDFPrint(String path) { |
||||||
|
return !isDoURLPDFPrint(path); |
||||||
|
} |
||||||
|
|
||||||
|
public static String getOrgIdByDoURLPDFPrint(String path) { |
||||||
|
if (isNotDoURLPDFPrint(path)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
JSONArray jsons = new JSONArray(path); |
||||||
|
if ((jsons == null) || (jsons.size() <= 0)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
JSONObject json = jsons.getJSONObject(0); |
||||||
|
String orgId = json.getString("orgId", ""); |
||||||
|
return orgId; |
||||||
|
} |
||||||
|
|
||||||
|
public static final String TEMP_DIRECTORY_NAME = "jsdbacfj-export-temp"; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取临时目录 |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getTempDirectory() { |
||||||
|
File file = new File(CacheManager.getProviderInstance().getCacheDirectory(), TEMP_DIRECTORY_NAME); |
||||||
|
return file.getAbsolutePath(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取临时导出目录 |
||||||
|
* |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getTempExportPath() { |
||||||
|
String path = UUID.randomUUID().toString(); |
||||||
|
File file = new File(getTempDirectory(), path); |
||||||
|
return file.getAbsolutePath(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除临时目录 |
||||||
|
*/ |
||||||
|
public static void deleteTempDirectory() throws IOException { |
||||||
|
deleteFile(getTempDirectory()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* jvm退出时删除临时目录 |
||||||
|
*/ |
||||||
|
public static void deleteTempDirectoryByShutdownHook() { |
||||||
|
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { |
||||||
|
@Override |
||||||
|
public void run() { |
||||||
|
try { |
||||||
|
LogKit.info("Delete temporary directory on Shutdown"); |
||||||
|
deleteTempDirectory(); |
||||||
|
} catch (IOException e) { |
||||||
|
LogKit.error("Delete temporary directory on Shutdown," + e.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
}) { |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 删除文件 |
||||||
|
* |
||||||
|
* @param target |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static void deleteFile(String target) throws IOException { |
||||||
|
deleteFile(Paths.get(target)); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 删除文件 |
||||||
|
* |
||||||
|
* @param target |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static void deleteFile(Path target) throws IOException { |
||||||
|
if (Files.isDirectory(target)) { |
||||||
|
FileUtils.deleteDirectory(target.toFile()); |
||||||
|
return; |
||||||
|
} |
||||||
|
Files.deleteIfExists(target); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 复制流 |
||||||
|
* |
||||||
|
* @param inputStream |
||||||
|
* @param outputStream |
||||||
|
* @throws IOException |
||||||
|
*/ |
||||||
|
public static void copyStreamByNio(InputStream inputStream, OutputStream outputStream) throws IOException { |
||||||
|
int bufferSize = 10485760;//1024 * 1024 * 10;
|
||||||
|
ReadableByteChannel input = Channels.newChannel(inputStream); |
||||||
|
WritableByteChannel output = Channels.newChannel(outputStream); |
||||||
|
ByteBuffer byteBuffer = ByteBuffer.allocate(bufferSize); |
||||||
|
while ((input.read(byteBuffer)) != -1) { |
||||||
|
//切换读取模式
|
||||||
|
byteBuffer.flip(); |
||||||
|
output.write(byteBuffer); |
||||||
|
byteBuffer.clear(); |
||||||
|
} |
||||||
|
input.close(); |
||||||
|
outputStream.flush(); |
||||||
|
outputStream.close(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 判断是否是打印请求,需要加上印章 |
||||||
|
* |
||||||
|
* @param req |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static boolean isAddStamp(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String method = req.getMethod(); |
||||||
|
if (!"GET".equalsIgnoreCase(method)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
String reqUrl = req.getRequestURL().toString(); |
||||||
|
if (!reqUrl.endsWith("/decision/view/report")) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
String op = WebUtils.getHTTPRequestParameter(req, "op"); |
||||||
|
if (!"fr_pdfprint".equals(op)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
String cmd = WebUtils.getHTTPRequestParameter(req, "cmd"); |
||||||
|
if (!"native".equals(cmd)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
String sessionID = WebUtils.getHTTPRequestParameter(req, "sessionID"); |
||||||
|
if (StringKit.isEmpty(sessionID)) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
ReportSessionIDInfor reportSessionIDInfor = SessionPoolManager.getSessionIDInfor(sessionID, ReportSessionIDInfor.class); |
||||||
|
if (reportSessionIDInfor == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
String relativePath = reportSessionIDInfor.getRelativePath(); |
||||||
|
if (isStampFlag(reportSessionIDInfor) || StampUtils.isStampReport(relativePath) || StampUtils.isDoURLPDFPrint(relativePath)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public static boolean isStampFlag(ReportSessionIDInfor reportSessionIDInfor) { |
||||||
|
if (reportSessionIDInfor == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
Object value = reportSessionIDInfor.getParameterValue("STAMP"); |
||||||
|
if (value == null) { |
||||||
|
return false; |
||||||
|
} |
||||||
|
if ("1".equals(value)) { |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
public static String getOrgIdByReportSessionIDInfor(ReportSessionIDInfor reportSessionIDInfor) { |
||||||
|
if (!isStampFlag(reportSessionIDInfor)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
Object value = reportSessionIDInfor.getParameterValue("ORGID"); |
||||||
|
if (value == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String orgId = String.valueOf(value); |
||||||
|
return orgId; |
||||||
|
} |
||||||
|
|
||||||
|
public static void addStamp(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws Exception { |
||||||
|
if (!PluginContexts.currentContext().isAvailable()) { |
||||||
|
LogKit.error("印章集成插件试用过期, 请添加许可证"); |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
String sessionID = WebUtils.getHTTPRequestParameter(req, "sessionID"); |
||||||
|
ReportSessionIDInfor reportSessionIDInfor = SessionPoolManager.getSessionIDInfor(sessionID, ReportSessionIDInfor.class); |
||||||
|
if (reportSessionIDInfor == null) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
String relativePath = reportSessionIDInfor.getRelativePath(); |
||||||
|
String orgId = StampUtils.getOrgIdByDoURLPDFPrint(relativePath); |
||||||
|
if (StringKit.isEmpty(orgId)) { |
||||||
|
orgId = StampUtils.getOrgIdByReportSessionIDInfor(reportSessionIDInfor); |
||||||
|
} |
||||||
|
String stampBase64 = StampUtils.getStampBase64(orgId); |
||||||
|
if (StringKit.isEmpty(stampBase64)) { |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
String dirPath = StampUtils.getTempExportPath(); |
||||||
|
Path path = Paths.get(dirPath); |
||||||
|
Files.createDirectories(path); |
||||||
|
String filePath = dirPath + "/a.pdf"; |
||||||
|
String filePath1 = dirPath + "/b.pdf"; |
||||||
|
createPrintPdf(req, filePath, reportSessionIDInfor, sessionID); |
||||||
|
addStampWithPdf(stampBase64, filePath, filePath1); |
||||||
|
writePdfToResponse(req, res, reportSessionIDInfor, filePath1); |
||||||
|
deleteFile(path); |
||||||
|
} |
||||||
|
|
||||||
|
private static void writePdfToResponse(HttpServletRequest req, HttpServletResponse res, ReportSessionIDInfor reportSessionIDInfor, String pdfPath) throws IOException { |
||||||
|
addFrameOptions(req, res); |
||||||
|
boolean previewOption = Boolean.parseBoolean(WebUtils.getHTTPRequestParameter(req, "preview")); |
||||||
|
if (!previewOption) { |
||||||
|
LogUtils.recordPrintInformation(reportSessionIDInfor.getRelativePath(), reportSessionIDInfor.getParameterMap4Execute4Consisent(), ReportDeclareRecordType.PRINT_TYPE_NO_CLIENT, reportSessionIDInfor); |
||||||
|
} |
||||||
|
writePdfToResponse(res, pdfPath); |
||||||
|
} |
||||||
|
|
||||||
|
public static void writePdfToResponse(HttpServletResponse res, String pdfPath) throws IOException { |
||||||
|
res.setContentType("application/pdf"); |
||||||
|
ServletOutputStream servletOutputStream = res.getOutputStream(); |
||||||
|
FileInputStream fileInputStream = new FileInputStream(pdfPath); |
||||||
|
copyStreamByNio(fileInputStream, servletOutputStream); |
||||||
|
} |
||||||
|
|
||||||
|
public static void addFrameOptions(HttpServletRequest req, HttpServletResponse res) { |
||||||
|
String referer = req.getHeader("Referer"); |
||||||
|
if (StringUtils.isEmpty(referer)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
String host = getHost(referer); |
||||||
|
Collection headerNames = res.getHeaderNames(); |
||||||
|
if (headerNames.contains("X-Frame-Options")) { |
||||||
|
res.setHeader("X-Frame-Options", "ALLOW-FROM " + host); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private static String getHost(String value) { |
||||||
|
int index = value.indexOf("/", value.indexOf("//") + 2); |
||||||
|
return index == -1 ? value : value.substring(0, index); |
||||||
|
} |
||||||
|
|
||||||
|
private static void createPrintPdf(HttpServletRequest req, String filePath, ReportSessionIDInfor reportSessionIDInfor, String sessionID) throws Exception { |
||||||
|
float[] offset = getOffset(reportSessionIDInfor); |
||||||
|
reportSessionIDInfor.getPrintContext().setOffset(offset); |
||||||
|
PageSetProvider pageSet = reportSessionIDInfor.getPrintPreviewPageSet4Traversing(); |
||||||
|
FileOutputStream fileOutputStream = new FileOutputStream(filePath); |
||||||
|
PDFExporterForPrint pdfExporter = new PDFExporterForPrint(); |
||||||
|
pdfExporter.export(fileOutputStream, pageSet); |
||||||
|
fileOutputStream.flush(); |
||||||
|
fileOutputStream.close(); |
||||||
|
LogUtils.recordPrintInformation(reportSessionIDInfor.getRelativePath(), reportSessionIDInfor.getParameterMap4Execute4Consisent(), ReportDeclareRecordType.PRINT_TYPE_PDF, reportSessionIDInfor); |
||||||
|
boolean needKeepSession = NetworkHelper.getHTTPRequestBoolParameter(req, "needKeepSession"); |
||||||
|
if (!needKeepSession) { |
||||||
|
SessionPoolManager.closeSession(sessionID); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static float[] getOffset(SessionProvider sessionIDInfor) { |
||||||
|
return getOffset(sessionIDInfor.getWebContext().getAddress(), sessionIDInfor.getWebTitle(), new TypeIP()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static float[] getOffset(String remote_IP, String cptName, TypeIP type) { |
||||||
|
try { |
||||||
|
float[] offset = getRemoteOffset(remote_IP, type); |
||||||
|
type.setType(PrintOffsetSign.SIGN_ALL); |
||||||
|
PrintOffsetController controller = ReportContext.getInstance().getPrintOffsetController(); |
||||||
|
if (controller.findOne(remote_IP, cptName, PrintOffsetSign.SIGN_SINGLE.getSign()) != null) { |
||||||
|
type.setIP(""); |
||||||
|
offset = getRemoteOffset(remote_IP, cptName, type); |
||||||
|
type.setType(PrintOffsetSign.SIGN_SINGLE); |
||||||
|
} |
||||||
|
|
||||||
|
return offset; |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
type.setType(PrintOffsetSign.SIGN_NONE); |
||||||
|
return new float[2]; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static float[] getRemoteOffset(String remote_IP, TypeIP type) { |
||||||
|
return getRemoteOffset(remote_IP, "", PrintOffsetSign.SIGN_ALL.getSign(), type); |
||||||
|
} |
||||||
|
|
||||||
|
private static float[] getRemoteOffset(String remote_IP, String cptName, TypeIP type) { |
||||||
|
return getRemoteOffset(remote_IP, cptName, PrintOffsetSign.SIGN_SINGLE.getSign(), type); |
||||||
|
} |
||||||
|
|
||||||
|
private static float[] getRemoteOffset(String remote_IP, String cptName, String sign, TypeIP type) { |
||||||
|
float[] offset = new float[]{0.0F, 0.0F}; |
||||||
|
PrintOffsetController controller = ReportContext.getInstance().getPrintOffsetController(); |
||||||
|
PrintOffsetEntity entity = controller.findOne(remote_IP, cptName, sign); |
||||||
|
if (entity != null) { |
||||||
|
type.setIP(entity.getIp()); |
||||||
|
offset[0] = Float.parseFloat(entity.getOffsetX()); |
||||||
|
offset[1] = Float.parseFloat(entity.getOffsetY()); |
||||||
|
} |
||||||
|
return offset; |
||||||
|
} |
||||||
|
|
||||||
|
public static void addStampWithPdf111(String stampBase64, String srcFilePath, String targetFilePath) throws Exception { |
||||||
|
PDDocument doc = PDDocument.load(new File(srcFilePath)); |
||||||
|
|
||||||
|
float width = getZoomValue(609f); |
||||||
|
float height = getZoomValue(397f); |
||||||
|
width = 182.7f; |
||||||
|
height = 119.1f; |
||||||
|
|
||||||
|
byte[] stampBytes = Base64.decode(stampBase64); |
||||||
|
PDImageXObject pdImage = PDImageXObject.createFromByteArray(doc, stampBytes, "stamp.png"); |
||||||
|
PDExtendedGraphicsState pdExtGfxState = new PDExtendedGraphicsState(); |
||||||
|
// 设置透明度
|
||||||
|
pdExtGfxState.setNonStrokingAlphaConstant(getStampOpacity()); |
||||||
|
pdExtGfxState.setAlphaSourceFlag(true); |
||||||
|
pdExtGfxState.getCOSObject().setItem(COSName.BM, COSName.MULTIPLY); |
||||||
|
|
||||||
|
float configX = CustomDataConfig.getInstance().getStampPositionX(); |
||||||
|
float configY = CustomDataConfig.getInstance().getStampPositionY(); |
||||||
|
float x = 0; |
||||||
|
float y = 0; |
||||||
|
PDPage page; |
||||||
|
PDPageContentStream contentStream; |
||||||
|
PDRectangle rectangle; |
||||||
|
for (int i = 0, max = doc.getNumberOfPages() - 1; i <= max; i++) { |
||||||
|
page = doc.getPage(i); |
||||||
|
if (i == 0) { |
||||||
|
rectangle = page.getMediaBox(); |
||||||
|
x = getFitValue(configX, rectangle.getWidth(), width); |
||||||
|
y = getFitValue(configY, rectangle.getHeight(), height); |
||||||
|
x = 300; |
||||||
|
y = 100; |
||||||
|
} |
||||||
|
contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true); |
||||||
|
contentStream.setGraphicsStateParameters(pdExtGfxState); |
||||||
|
contentStream.drawImage(pdImage, x, y, width, height); |
||||||
|
contentStream.close(); |
||||||
|
} |
||||||
|
doc.save(targetFilePath); |
||||||
|
doc.close(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void addStampWithPdf(String stampBase64, String srcFilePath, String targetFilePath) throws Exception { |
||||||
|
addStampWithPdf(stampBase64, srcFilePath, targetFilePath, -1, -1, -1, -1, -1); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 在pdf上面添加印章 |
||||||
|
* |
||||||
|
* @param stampBase64 图片base64 |
||||||
|
* @param srcFilePath pdf源位置 |
||||||
|
* @param targetFilePath pdf目标位置 |
||||||
|
* @param stampXThousandths 印章横向位置 按1000来 |
||||||
|
* @param stampYThousandths 印章纵向位置 按1000来 |
||||||
|
* @param stampIntervalThousandths 印章间隔 按1000来 |
||||||
|
* @param stampWidthThousandths 印章宽 按1000来 |
||||||
|
* @param stampHeightThousandths 印章高 按1000来 |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static void addStampWithPdf(String stampBase64, String srcFilePath, String targetFilePath, int stampXThousandths, int stampYThousandths, int stampIntervalThousandths, int stampWidthThousandths, int stampHeightThousandths) throws Exception { |
||||||
|
float defaultX = 300; |
||||||
|
float defaultY = 100; |
||||||
|
float defaultWidth = 182.7f; |
||||||
|
float defaultHeight = 119.1f; |
||||||
|
|
||||||
|
if (StringKit.isEmpty(stampBase64)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
PDDocument doc = PDDocument.load(new File(srcFilePath)); |
||||||
|
byte[] stampBytes = Base64.decode(stampBase64); |
||||||
|
PDImageXObject pdImage = PDImageXObject.createFromByteArray(doc, stampBytes, "stamp.png"); |
||||||
|
PDExtendedGraphicsState pdExtGfxState = new PDExtendedGraphicsState(); |
||||||
|
|
||||||
|
// 设置透明度
|
||||||
|
pdExtGfxState.setNonStrokingAlphaConstant(getStampOpacity()); |
||||||
|
pdExtGfxState.setAlphaSourceFlag(true); |
||||||
|
pdExtGfxState.getCOSObject().setItem(COSName.BM, COSName.MULTIPLY); |
||||||
|
|
||||||
|
PDPage page; |
||||||
|
PDPageContentStream contentStream; |
||||||
|
PDRectangle rectangle; |
||||||
|
|
||||||
|
|
||||||
|
float stampX = 0, stampY = 0, stampInterval = 0; |
||||||
|
float stampWidth = 0, stampHeight = 0; |
||||||
|
|
||||||
|
float pageWidth = 0; |
||||||
|
float pageHeight = 0; |
||||||
|
for (int i = 0, max = doc.getNumberOfPages() - 1; i <= max; i++) { |
||||||
|
page = doc.getPage(i); |
||||||
|
rectangle = page.getMediaBox(); |
||||||
|
pageWidth = rectangle.getWidth(); |
||||||
|
pageHeight = rectangle.getHeight(); |
||||||
|
stampX = defaultX; |
||||||
|
stampY = defaultY; |
||||||
|
stampInterval = 0; |
||||||
|
stampWidth = defaultWidth; |
||||||
|
stampHeight = defaultHeight; |
||||||
|
if (stampXThousandths >= 0) { |
||||||
|
stampX = getRealValue(stampXThousandths, pageWidth); |
||||||
|
} |
||||||
|
if (stampYThousandths >= 0) { |
||||||
|
stampY = getRealValue(stampYThousandths, pageHeight); |
||||||
|
} |
||||||
|
if (stampIntervalThousandths > 0) { |
||||||
|
stampInterval = getRealValue(stampIntervalThousandths, pageHeight); |
||||||
|
} |
||||||
|
|
||||||
|
if (stampWidthThousandths > 0) { |
||||||
|
stampWidth = getRealValue(stampWidthThousandths, pageWidth); |
||||||
|
} |
||||||
|
if (stampHeightThousandths > 0) { |
||||||
|
stampHeight = getRealValue(stampHeightThousandths, pageHeight); |
||||||
|
} |
||||||
|
|
||||||
|
contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true, true); |
||||||
|
contentStream.setGraphicsStateParameters(pdExtGfxState); |
||||||
|
contentStream.drawImage(pdImage, stampX, stampY, stampWidth, stampHeight); |
||||||
|
if (stampInterval > 0) { |
||||||
|
stampY = stampY + stampInterval; |
||||||
|
while (stampY < pageHeight) { |
||||||
|
contentStream.drawImage(pdImage, stampX, stampY, stampWidth, stampHeight); |
||||||
|
stampY = stampY + stampInterval; |
||||||
|
} |
||||||
|
} |
||||||
|
contentStream.close(); |
||||||
|
} |
||||||
|
doc.save(targetFilePath); |
||||||
|
doc.close(); |
||||||
|
|
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
private static float getRealValue(int thousandths, float baseValue) { |
||||||
|
if ((thousandths <= 0) || (baseValue <= 0)) { |
||||||
|
return 0f; |
||||||
|
} |
||||||
|
if (thousandths >= 1000) { |
||||||
|
return baseValue; |
||||||
|
} |
||||||
|
|
||||||
|
float value = thousandths * 0.001f * baseValue; |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static float getFitValue(float configValue, float maxValue, float blankValue) { |
||||||
|
if (configValue <= 0) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
float tempValue; |
||||||
|
if ((configValue + blankValue) >= maxValue) { |
||||||
|
tempValue = maxValue - blankValue; |
||||||
|
if (tempValue <= 0) { |
||||||
|
tempValue = 0; |
||||||
|
} |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
return configValue; |
||||||
|
} |
||||||
|
|
||||||
|
private static float getZoomValue(float value) { |
||||||
|
int zoom = CustomDataConfig.getInstance().getStampScaling(); |
||||||
|
if (zoom <= 0) { |
||||||
|
zoom = 20; |
||||||
|
} |
||||||
|
BigDecimal b = new BigDecimal(String.valueOf(value)); |
||||||
|
b = b.multiply(new BigDecimal(String.valueOf(zoom))); |
||||||
|
b = b.multiply(new BigDecimal("0.01")); |
||||||
|
b = b.setScale(1, BigDecimal.ROUND_HALF_UP); |
||||||
|
return b.floatValue(); |
||||||
|
} |
||||||
|
|
||||||
|
public static float getStampOpacity() { |
||||||
|
int value = CustomDataConfig.getInstance().getStampTransparent(); |
||||||
|
if (value <= 0) { |
||||||
|
value = 0; |
||||||
|
} |
||||||
|
if (value >= 100) { |
||||||
|
value = 100; |
||||||
|
} |
||||||
|
int tempValue = 100 - value; |
||||||
|
BigDecimal b0 = new BigDecimal(String.valueOf(tempValue)); |
||||||
|
BigDecimal b1 = new BigDecimal("100"); |
||||||
|
BigDecimal b2 = b0.divide(b1, 2, BigDecimal.ROUND_HALF_UP); |
||||||
|
float opacityValue = b2.floatValue(); |
||||||
|
return opacityValue; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,376 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.authority.AuthorityContext; |
||||||
|
import com.fr.decision.authority.data.Authority; |
||||||
|
import com.fr.decision.authority.data.User; |
||||||
|
import com.fr.decision.webservice.bean.user.UserBean; |
||||||
|
import com.fr.decision.webservice.bean.user.UserUpdateBean; |
||||||
|
import com.fr.decision.webservice.v10.user.UserService; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.config.CustomDataConfig; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.third.org.apache.commons.lang3.time.DateFormatUtils; |
||||||
|
import com.fr.third.org.apache.http.HttpEntity; |
||||||
|
import com.fr.third.org.apache.http.HttpStatus; |
||||||
|
import com.fr.third.org.apache.http.client.config.RequestConfig; |
||||||
|
import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; |
||||||
|
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.conn.ssl.SSLConnectionSocketFactory; |
||||||
|
import com.fr.third.org.apache.http.entity.StringEntity; |
||||||
|
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.ssl.SSLContextBuilder; |
||||||
|
import com.fr.third.org.apache.http.ssl.TrustStrategy; |
||||||
|
import com.fr.third.org.apache.http.util.EntityUtils; |
||||||
|
import com.fr.third.springframework.web.util.UriUtils; |
||||||
|
|
||||||
|
import javax.net.ssl.HostnameVerifier; |
||||||
|
import javax.net.ssl.SSLContext; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.IOException; |
||||||
|
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.UUID; |
||||||
|
|
||||||
|
public class Utils { |
||||||
|
public static String DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36"; |
||||||
|
public static RequestConfig REQUEST_CONFIG = RequestConfig.custom() |
||||||
|
.setConnectionRequestTimeout(30000) |
||||||
|
.setSocketTimeout(30000) // 服务端相应超时
|
||||||
|
.setConnectTimeout(30000) // 建立socket链接超时时间
|
||||||
|
.build(); |
||||||
|
|
||||||
|
public static CloseableHttpClient createSslHttpClient() { |
||||||
|
try { |
||||||
|
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException { |
||||||
|
return true; |
||||||
|
} |
||||||
|
}).build(); |
||||||
|
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; |
||||||
|
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, hostnameVerifier); |
||||||
|
return HttpClients.custom() |
||||||
|
.setSSLSocketFactory(sslsf) |
||||||
|
.build(); |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error(e.getMessage(), e); |
||||||
|
} |
||||||
|
return HttpClients.createDefault(); |
||||||
|
} |
||||||
|
|
||||||
|
public static CloseableHttpClient createDefaultHttpClient() { |
||||||
|
CloseableHttpClient httpClient = HttpClients.custom() |
||||||
|
.build(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized CloseableHttpClient createHttpClient(String url) { |
||||||
|
CloseableHttpClient httpClient = null; |
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
httpClient = createDefaultHttpClient(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
|
||||||
|
if (url.startsWith("https://")) { |
||||||
|
httpClient = createSslHttpClient(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
httpClient = createDefaultHttpClient(); |
||||||
|
return httpClient; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized String createHttpGetContent(CloseableHttpClient httpClient, String url, String basicAuth) throws IOException { |
||||||
|
if ((httpClient == null) || (StringKit.isEmpty(url))) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
HttpGet httpGet = new HttpGet(url); |
||||||
|
httpGet.addHeader("User-Agent", Utils.DEFAULT_USER_AGENT); |
||||||
|
if (StringKit.isNotEmpty(basicAuth)) { |
||||||
|
httpGet.addHeader("Authorization", basicAuth); |
||||||
|
} |
||||||
|
|
||||||
|
httpGet.setConfig(Utils.REQUEST_CONFIG); |
||||||
|
CloseableHttpResponse response = httpClient.execute(httpGet); |
||||||
|
int statusCode = response.getStatusLine().getStatusCode(); |
||||||
|
if (statusCode != HttpStatus.SC_OK) { |
||||||
|
response.close(); |
||||||
|
LogKit.info("http请求出错,http status:" + statusCode); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
HttpEntity httpEntity = response.getEntity(); |
||||||
|
if (httpEntity == null) { |
||||||
|
response.close(); |
||||||
|
LogKit.info("http请求出错,http响应内容为空"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String responseContent = EntityUtils.toString(httpEntity, "UTF-8"); |
||||||
|
response.close(); |
||||||
|
if (StringKit.isEmpty(responseContent)) { |
||||||
|
LogKit.info("http请求出错,http响应内容为空1"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return responseContent; |
||||||
|
} |
||||||
|
|
||||||
|
public static synchronized String createHttpPostContent(CloseableHttpClient httpClient, String url, String bodyContent, String basicAuth, String contentType) throws IOException { |
||||||
|
if ((httpClient == null) || (StringKit.isEmpty(url))) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
HttpPost httpPost = new HttpPost(url); |
||||||
|
httpPost.addHeader("User-Agent", Utils.DEFAULT_USER_AGENT); |
||||||
|
httpPost.setConfig(Utils.REQUEST_CONFIG); |
||||||
|
if (StringKit.isNotEmpty(basicAuth)) { |
||||||
|
httpPost.addHeader("Authorization", basicAuth); |
||||||
|
} |
||||||
|
if (StringKit.isNotEmpty(contentType)) { |
||||||
|
httpPost.addHeader("Content-Type", contentType); |
||||||
|
} |
||||||
|
StringEntity bodyEntity = new StringEntity(bodyContent, "UTF-8"); |
||||||
|
httpPost.setEntity(bodyEntity); |
||||||
|
CloseableHttpResponse response = httpClient.execute(httpPost); |
||||||
|
int statusCode = response.getStatusLine().getStatusCode(); |
||||||
|
if (statusCode != HttpStatus.SC_OK) { |
||||||
|
response.close(); |
||||||
|
LogKit.info("http请求出错,http status:" + statusCode); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
|
||||||
|
HttpEntity httpEntity = response.getEntity(); |
||||||
|
if (httpEntity == null) { |
||||||
|
response.close(); |
||||||
|
LogKit.info("http请求出错,http响应内容为空"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String responseContent = EntityUtils.toString(httpEntity, "UTF-8"); |
||||||
|
response.close(); |
||||||
|
if (StringKit.isEmpty(responseContent)) { |
||||||
|
LogKit.info("http请求出错,http响应内容为空1"); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return responseContent; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取完整请求链接 |
||||||
|
* |
||||||
|
* @param req 请求 |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getFullRequestUrl(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String url = req.getRequestURL().toString(); |
||||||
|
String queryUrl = req.getQueryString(); |
||||||
|
if ((queryUrl == null) || "null".equalsIgnoreCase(queryUrl)) { |
||||||
|
queryUrl = ""; |
||||||
|
} else { |
||||||
|
queryUrl = "?" + queryUrl; |
||||||
|
} |
||||||
|
String fullUrl = url + queryUrl; |
||||||
|
return fullUrl; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 重定向 |
||||||
|
* |
||||||
|
* @param res |
||||||
|
* @param url |
||||||
|
*/ |
||||||
|
public static void sendRedirect(HttpServletResponse res, String url) { |
||||||
|
if ((res == null) || (StringKit.isEmpty(url))) { |
||||||
|
return; |
||||||
|
} |
||||||
|
res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); |
||||||
|
res.setHeader("Location", url); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public static synchronized String getUuid() { |
||||||
|
String uuid = UUID.randomUUID().toString().replace("-", ""); |
||||||
|
return uuid; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取用户信息 |
||||||
|
* |
||||||
|
* @param userCount 用户数,-1为不限制用户数 |
||||||
|
* @param isAdminContained 是否包含管理员用户 |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static List<UserBean> getAllUsers(int userCount, boolean isAdminContained) throws Exception { |
||||||
|
List<UserBean> userBeans = new ArrayList<>(); |
||||||
|
|
||||||
|
return userBeans; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取不包含管理员的用户信息 |
||||||
|
* |
||||||
|
* @param userCount |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static List<UserBean> getAllUsersWithoutAdmin(int userCount) throws Exception { |
||||||
|
return getAllUsers(userCount, false); |
||||||
|
} |
||||||
|
|
||||||
|
public static List<String> getAllUserNames(int userCount, boolean isAdminContained) throws Exception { |
||||||
|
List<String> userNames = new ArrayList<>(); |
||||||
|
List<UserBean> userBeans = getAllUsers(userCount, isAdminContained); |
||||||
|
UserBean userBean; |
||||||
|
for (int i = 0, max = userBeans.size() - 1; i <= max; i++) { |
||||||
|
userBean = userBeans.get(i); |
||||||
|
userNames.add(userBean.getUsername()); |
||||||
|
} |
||||||
|
return userNames; |
||||||
|
} |
||||||
|
|
||||||
|
public static List<String> getAllUserNamesWithoutAdmin(int userCount) throws Exception { |
||||||
|
return getAllUserNames(userCount, false); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过用户名删除用户,管理员用户无法删除 |
||||||
|
* |
||||||
|
* @param username 用户名 |
||||||
|
* @return |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
public static int deleteUsersByUsername(String username) throws Exception { |
||||||
|
if (StringUtils.isEmpty(username)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
User user = UserService.getInstance().getUserByUserName(username); |
||||||
|
if (user == null) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
String userId = user.getId(); |
||||||
|
List<String> adminUserIds = UserService.getInstance().getAdminUserIdList(); |
||||||
|
if ((adminUserIds != null) && (adminUserIds.size() >= 1) && (adminUserIds.contains(userId))) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
UserUpdateBean userUpdateBean = new UserUpdateBean(); |
||||||
|
userUpdateBean.setRemoveUserIds(new String[]{userId}); |
||||||
|
return UserService.getInstance().deleteUsers(userUpdateBean); |
||||||
|
} |
||||||
|
|
||||||
|
public static int deleteUsersByUsernames(List<String> usernames) throws Exception { |
||||||
|
if ((usernames == null) || (usernames.size() <= 0)) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
String username; |
||||||
|
int totalCount = 0, count; |
||||||
|
for (int i = 0, max = usernames.size() - 1; i <= max; i++) { |
||||||
|
username = usernames.get(i); |
||||||
|
count = deleteUsersByUsername(username); |
||||||
|
totalCount = totalCount + count; |
||||||
|
} |
||||||
|
return totalCount; |
||||||
|
} |
||||||
|
|
||||||
|
public static void editRealNameByUsername(String username, String realName) throws Exception { |
||||||
|
if (StringUtils.isEmpty(username) || StringUtils.isEmpty(realName)) { |
||||||
|
return; |
||||||
|
} |
||||||
|
User user = UserService.getInstance().getUserByUserName(username); |
||||||
|
if (user == null) { |
||||||
|
return; |
||||||
|
} |
||||||
|
UserBean userBean = new UserBean(user.getEmail(), user.isEnable(), user.getMobile(), realName, user.getUserName(), user.getId()); |
||||||
|
UserService.getInstance().editAccount(username, userBean); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据链接获取报表路径 |
||||||
|
* |
||||||
|
* @param url |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public static String getReportPathByUrl(String url) { |
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String reportPath = ""; |
||||||
|
try { |
||||||
|
reportPath = getReportPathWithViewletValueByUrl(url); |
||||||
|
if (StringKit.isEmpty(reportPath)) { |
||||||
|
reportPath = getReportPathWithEntryIdByUrl(url); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error("根据链接获取报表路径出错," + e.getMessage(), e); |
||||||
|
return ""; |
||||||
|
} |
||||||
|
return reportPath; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getReportPathWithViewletValueByUrl(String url) throws UnsupportedEncodingException { |
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
int index = url.indexOf("viewlet="); |
||||||
|
if (index < 0) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
int index1 = url.indexOf("&", index); |
||||||
|
String tempValue = ""; |
||||||
|
if (index1 >= 0) { |
||||||
|
tempValue = url.substring(index + "viewlet=".length(), index1); |
||||||
|
} else { |
||||||
|
tempValue = url.substring(index + "viewlet=".length()); |
||||||
|
} |
||||||
|
if (StringKit.isEmpty(tempValue)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String reportName = UriUtils.decode(UriUtils.decode(tempValue, "UTF-8"), "UTF-8"); |
||||||
|
return reportName; |
||||||
|
} |
||||||
|
|
||||||
|
private static String getReportPathWithEntryIdByUrl(String url) throws Exception { |
||||||
|
//http://localhost:8075/webroot/decision/v10/entry/access/7bfe66ce-8c24-4c9a-8426-f814fb195a89?width=389&height=866
|
||||||
|
if (StringKit.isEmpty(url)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String tempStr = "decision/v10/entry/access/"; |
||||||
|
int index = url.indexOf(tempStr); |
||||||
|
if (index <= 0) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String tempUrl = url.substring(index + tempStr.length()); |
||||||
|
String entryId = ""; |
||||||
|
index = tempUrl.indexOf("?"); |
||||||
|
if (index >= 0) { |
||||||
|
entryId = tempUrl.substring(0, index); |
||||||
|
} else { |
||||||
|
entryId = tempUrl; |
||||||
|
} |
||||||
|
Authority entry = AuthorityContext.getInstance().getAuthorityController().getById(entryId); |
||||||
|
if (entry == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String reportPath = entry.getPath(); |
||||||
|
return reportPath; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.config; |
||||||
|
|
||||||
|
import com.fr.config.*; |
||||||
|
import com.fr.config.holder.Conf; |
||||||
|
import com.fr.config.holder.factory.Holders; |
||||||
|
|
||||||
|
/** |
||||||
|
* 配置数据保存 |
||||||
|
*/ |
||||||
|
@Visualization(category = "印章集成配置") |
||||||
|
public class CustomDataConfig extends DefaultConfiguration { |
||||||
|
public String getNameSpace() { |
||||||
|
return this.getClass().getName(); |
||||||
|
} |
||||||
|
|
||||||
|
private static volatile CustomDataConfig config = null; |
||||||
|
|
||||||
|
public static CustomDataConfig getInstance() { |
||||||
|
if (config == null) { |
||||||
|
config = ConfigContext.getConfigInstance(CustomDataConfig.class); |
||||||
|
} |
||||||
|
return config; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Identifier(value = "stampEsbUrl", name = "印章ESB地址", description = "", status = Status.SHOW) |
||||||
|
private Conf<String> stampEsbUrl = Holders.simple(""); |
||||||
|
|
||||||
|
@Identifier(value = "stampReportName", name = "印章报表名称", description = "多个报表用逗号隔开", status = Status.SHOW) |
||||||
|
private Conf<String> stampReportName = Holders.simple(""); |
||||||
|
|
||||||
|
@Identifier(value = "stampTransparent", name = "印章透明度(%)", description = "此值0至100,值越大越透明", status = Status.SHOW) |
||||||
|
private Conf<Integer> stampTransparent = Holders.simple(75); |
||||||
|
|
||||||
|
|
||||||
|
@Identifier(value = "stampScaling", name = "印章缩放(%)", description = "值越大越图片越大", status = Status.SHOW) |
||||||
|
private Conf<Integer> stampScaling = Holders.simple(75); |
||||||
|
|
||||||
|
|
||||||
|
@Identifier(value = "stampPositionX", name = "印章位置X轴", description = "", status = Status.HIDE) |
||||||
|
private Conf<Integer> stampPositionX = Holders.simple(75); |
||||||
|
|
||||||
|
@Identifier(value = "stampPositionY", name = "印章位置Y轴", description = "", status = Status.HIDE) |
||||||
|
private Conf<Integer> stampPositionY = Holders.simple(75); |
||||||
|
|
||||||
|
|
||||||
|
public String getStampEsbUrl() { |
||||||
|
return stampEsbUrl.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setStampEsbUrl(String stampEsbUrl) { |
||||||
|
this.stampEsbUrl.set(stampEsbUrl); |
||||||
|
} |
||||||
|
|
||||||
|
public String getStampReportName() { |
||||||
|
return stampReportName.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setStampReportName(String stampReportName) { |
||||||
|
this.stampReportName.set(stampReportName); |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getStampTransparent() { |
||||||
|
return stampTransparent.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setStampTransparent(Integer stampTransparent) { |
||||||
|
this.stampTransparent.set(stampTransparent); |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getStampScaling() { |
||||||
|
return stampScaling.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setStampScaling(Integer stampScaling) { |
||||||
|
this.stampScaling.set(stampScaling); |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getStampPositionX() { |
||||||
|
return stampPositionX.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setStampPositionX(Integer stampPositionX) { |
||||||
|
this.stampPositionX.set(stampPositionX); |
||||||
|
} |
||||||
|
|
||||||
|
public Integer getStampPositionY() { |
||||||
|
return stampPositionY.get(); |
||||||
|
} |
||||||
|
|
||||||
|
public void setStampPositionY(Integer stampPositionY) { |
||||||
|
this.stampPositionY.set(stampPositionY); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Object clone() throws CloneNotSupportedException { |
||||||
|
CustomDataConfig cloned = (CustomDataConfig) super.clone(); |
||||||
|
cloned.stampEsbUrl = (Conf<String>) stampEsbUrl.clone(); |
||||||
|
cloned.stampReportName = (Conf<String>) stampReportName.clone(); |
||||||
|
cloned.stampTransparent = (Conf<Integer>) stampTransparent.clone(); |
||||||
|
cloned.stampScaling = (Conf<Integer>) stampScaling.clone(); |
||||||
|
cloned.stampPositionX = (Conf<Integer>) stampPositionX.clone(); |
||||||
|
cloned.stampPositionY = (Conf<Integer>) stampPositionY.clone(); |
||||||
|
return cloned; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export; |
||||||
|
|
||||||
|
public class TxtConstant { |
||||||
|
public static String ICON_NAME ="txt"; |
||||||
|
public static String ICON_PATH ="/com/fr/plugin/third/party/jsdbacfj/txt.png"; |
||||||
|
} |
@ -0,0 +1,88 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export; |
||||||
|
|
||||||
|
import com.fr.json.JSONException; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.stable.fun.impl.AbstractIOFileAttrMark; |
||||||
|
import com.fr.stable.xml.XMLPrintWriter; |
||||||
|
import com.fr.stable.xml.XMLableReader; |
||||||
|
|
||||||
|
public class TxtDelimiterAttrMark extends AbstractIOFileAttrMark { |
||||||
|
public static final String TAG = "TxtDelimiterAttrMark"; |
||||||
|
public static final String DEFAULT_DELIMITER = ","; |
||||||
|
|
||||||
|
/** |
||||||
|
* 分隔符 |
||||||
|
*/ |
||||||
|
private String delimiter = DEFAULT_DELIMITER; |
||||||
|
|
||||||
|
private boolean enableSpecifiedFormat = false; |
||||||
|
|
||||||
|
private String startCell = "A1"; |
||||||
|
|
||||||
|
@Override |
||||||
|
public String xmlTag() { |
||||||
|
return TAG; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void readXML(XMLableReader reader) { |
||||||
|
String tag = reader.getTagName(); |
||||||
|
if (XML_TAG.equals(tag)) { |
||||||
|
delimiter = reader.getAttrAsString("delimiter", ","); |
||||||
|
enableSpecifiedFormat = reader.getAttrAsBoolean("enableSpecifiedFormat", false); |
||||||
|
startCell = reader.getAttrAsString("startCell", "A1"); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void writeXML(XMLPrintWriter writer) { |
||||||
|
writer.startTAG(XML_TAG); |
||||||
|
writer.attr("delimiter", delimiter); |
||||||
|
writer.attr("enableSpecifiedFormat", enableSpecifiedFormat); |
||||||
|
writer.attr("startCell", startCell); |
||||||
|
writer.end(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public TxtDelimiterAttrMark clone() { |
||||||
|
TxtDelimiterAttrMark obj = (TxtDelimiterAttrMark) super.clone(); |
||||||
|
obj.delimiter = delimiter; |
||||||
|
obj.enableSpecifiedFormat = enableSpecifiedFormat; |
||||||
|
obj.startCell = startCell; |
||||||
|
return obj; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public JSONObject createJSONConfig() throws JSONException { |
||||||
|
JSONObject json = super.createJSONConfig(); |
||||||
|
json.put("delimiter", delimiter); |
||||||
|
json.put("enableSpecifiedFormat", enableSpecifiedFormat); |
||||||
|
json.put("startCell", startCell); |
||||||
|
return json; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public String getDelimiter() { |
||||||
|
return delimiter; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDelimiter(String delimiter) { |
||||||
|
this.delimiter = delimiter; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isEnableSpecifiedFormat() { |
||||||
|
return enableSpecifiedFormat; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEnableSpecifiedFormat(boolean enableSpecifiedFormat) { |
||||||
|
this.enableSpecifiedFormat = enableSpecifiedFormat; |
||||||
|
} |
||||||
|
|
||||||
|
public String getStartCell() { |
||||||
|
return startCell; |
||||||
|
} |
||||||
|
|
||||||
|
public void setStartCell(String startCell) { |
||||||
|
this.startCell = startCell; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export; |
||||||
|
|
||||||
|
|
||||||
|
import com.fr.plugin.third.party.jsdbacfj.export.core.TxtExportOperate; |
||||||
|
import com.fr.report.fun.impl.AbstractExportOperateProvider; |
||||||
|
import com.fr.web.core.reserve.Operate; |
||||||
|
|
||||||
|
public class TxtExportOperateProvider extends AbstractExportOperateProvider { |
||||||
|
|
||||||
|
@Override |
||||||
|
public Operate operate() { |
||||||
|
return new TxtExportOperate(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String markType() { |
||||||
|
return "txt"; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,22 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export; |
||||||
|
|
||||||
|
import com.fr.design.fun.impl.AbstractToolbarItem; |
||||||
|
import com.fr.form.ui.Widget; |
||||||
|
|
||||||
|
public class TxtExportToolbarItemProvider extends AbstractToolbarItem { |
||||||
|
|
||||||
|
@Override |
||||||
|
public Class<? extends Widget> classForWidget() { |
||||||
|
return TxtExtensionButtonProvider.class; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String iconPathForWidget() { |
||||||
|
return "/com/fr/plugin/third/party/jsdbacfj/txt.png"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String nameForWidget() { |
||||||
|
return "txt导出"; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,62 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export; |
||||||
|
|
||||||
|
import com.fr.form.ui.Widget; |
||||||
|
import com.fr.js.JavaScript; |
||||||
|
import com.fr.js.JavaScriptImpl; |
||||||
|
import com.fr.report.fun.impl.AbstractExtensionButton; |
||||||
|
import com.fr.stable.web.Repository; |
||||||
|
|
||||||
|
public class TxtExtensionButtonProvider extends AbstractExtensionButton { |
||||||
|
|
||||||
|
public TxtExtensionButtonProvider() { |
||||||
|
super("txt导出", TxtIconLoader.loadIcon()); |
||||||
|
} |
||||||
|
|
||||||
|
public TxtExtensionButtonProvider(String text) { |
||||||
|
super(text); |
||||||
|
} |
||||||
|
|
||||||
|
public TxtExtensionButtonProvider(String text, String iconName) { |
||||||
|
super(text, iconName); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String widgetName() { |
||||||
|
return this.getClass().getName(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Class<? extends Widget> classForDirectoryButton() { |
||||||
|
return this.getClass(); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getParentDirectory() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getType() { |
||||||
|
return "TxtExportOperateProvider.class"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getRelatedCheckBoxTitle() { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isSelected() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setSelected(boolean b) { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected JavaScript clickScript(Repository repository) { |
||||||
|
return new JavaScriptImpl("_g().exportReportToTxt()"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export; |
||||||
|
|
||||||
|
import com.fanruan.api.report.SundryKit; |
||||||
|
|
||||||
|
public class TxtIconLoader { |
||||||
|
public static String loadIcon() { |
||||||
|
String name = TxtConstant.ICON_NAME; |
||||||
|
String path = TxtConstant.ICON_PATH; |
||||||
|
SundryKit.loadToolbarIcon(name, path); |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export; |
||||||
|
|
||||||
|
import com.fr.stable.fun.impl.AbstractIconProvider; |
||||||
|
|
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
public class TxtIconProvider extends AbstractIconProvider { |
||||||
|
private final static Map<String, String> STORE = new HashMap<String, String>(2); |
||||||
|
static { |
||||||
|
STORE.put(TxtConstant.ICON_NAME, TxtConstant.ICON_PATH); |
||||||
|
} |
||||||
|
|
||||||
|
public Map<String, String> map4Icons() { |
||||||
|
return STORE; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,51 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export.core; |
||||||
|
|
||||||
|
import com.fanruan.api.report.export.BaseOperate; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.general.BaseRecordType; |
||||||
|
import com.fr.io.collection.ExportCollection; |
||||||
|
import com.fr.io.exporter.CSVExporter; |
||||||
|
import com.fr.io.exporter.ExportChecker; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.export.TxtDelimiterAttrMark; |
||||||
|
import com.fr.stable.web.SessionProvider; |
||||||
|
import com.fr.web.core.ReportSessionIDInfor; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
public class TxtExportOperate extends BaseOperate { |
||||||
|
|
||||||
|
@Override |
||||||
|
public void setContent(HttpServletRequest req, HttpServletResponse res, SessionProvider sessionProvider, String fileName, boolean isEmbed) { |
||||||
|
res.setContentType("application/octet-stream"); |
||||||
|
res.setHeader("extension", "txt"); |
||||||
|
res.setHeader("Content-disposition", "attachment; filename=" + fileName + ".txt"); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ExportCollection newExportCollection(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, SessionProvider sessionProvider, String s) { |
||||||
|
ReportSessionIDInfor reportSessionIDInfor = (ReportSessionIDInfor) sessionProvider; |
||||||
|
TxtDelimiterAttrMark txtDelimiterAttrMark = (TxtDelimiterAttrMark) reportSessionIDInfor.getIOFileAttrMark(TxtDelimiterAttrMark.TAG); |
||||||
|
String delimiter = TxtDelimiterAttrMark.DEFAULT_DELIMITER; |
||||||
|
boolean enableSpecifiedFormat = false; |
||||||
|
String startCell = "A1"; |
||||||
|
if ((txtDelimiterAttrMark != null) && (StringKit.isNotEmpty(txtDelimiterAttrMark.getDelimiter()))) { |
||||||
|
delimiter = txtDelimiterAttrMark.getDelimiter(); |
||||||
|
enableSpecifiedFormat = txtDelimiterAttrMark.isEnableSpecifiedFormat(); |
||||||
|
startCell = txtDelimiterAttrMark.getStartCell(); |
||||||
|
} |
||||||
|
|
||||||
|
ExportCollection collection = ExportCollection.create(); |
||||||
|
collection.setExporter(new TxtExporter(delimiter, enableSpecifiedFormat,startCell)); |
||||||
|
collection.setRecordType(new BaseRecordType((short) 1999, "txt")); |
||||||
|
//collection.setRecordType(DeclareRecordType.EXPORT_TYPE_CSV);
|
||||||
|
return collection; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public ExportChecker newExportChecker(HttpServletRequest httpServletRequest) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,321 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export.core; |
||||||
|
|
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.base.ConfigManager; |
||||||
|
import com.fr.base.Style; |
||||||
|
import com.fr.interruption.Condition; |
||||||
|
import com.fr.interruption.Conditions; |
||||||
|
import com.fr.interruption.ExporterScene; |
||||||
|
import com.fr.io.core.ExporterUtils; |
||||||
|
import com.fr.io.exporter.CSVExporter; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.main.workbook.ResultWorkBook; |
||||||
|
import com.fr.page.*; |
||||||
|
import com.fr.report.ExtraReportClassManager; |
||||||
|
import com.fr.report.cell.CellElement; |
||||||
|
import com.fr.report.cell.cellattr.CellGUIAttr; |
||||||
|
import com.fr.report.core.ReportUtils; |
||||||
|
import com.fr.report.elementcase.ElementGetter; |
||||||
|
import com.fr.report.fun.ExportEncodeProvider; |
||||||
|
import com.fr.report.report.ECReport; |
||||||
|
import com.fr.report.report.ResultReport; |
||||||
|
import com.fr.stable.ColumnRow; |
||||||
|
import com.fr.stable.monitor.MemoryHelper; |
||||||
|
import com.fr.web.core.ReportRepositoryDeal; |
||||||
|
|
||||||
|
import java.io.OutputStream; |
||||||
|
import java.io.OutputStreamWriter; |
||||||
|
import java.io.PrintWriter; |
||||||
|
import java.io.UnsupportedEncodingException; |
||||||
|
import java.text.Format; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class TxtExporter extends CSVExporter { |
||||||
|
/** |
||||||
|
* 分隔符 |
||||||
|
*/ |
||||||
|
private String delimiter = ","; |
||||||
|
|
||||||
|
private boolean enableSpecifiedFormat = false; |
||||||
|
|
||||||
|
private String startCell = "A1"; |
||||||
|
|
||||||
|
private int startRowIndex = 0; |
||||||
|
private int startColumnIndex = 0; |
||||||
|
|
||||||
|
public TxtExporter() { |
||||||
|
setDelimiter(","); |
||||||
|
} |
||||||
|
|
||||||
|
public TxtExporter(String value, boolean enable, String cell) { |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
value = ","; |
||||||
|
} |
||||||
|
setDelimiter(value); |
||||||
|
setEnableSpecifiedFormat(enable); |
||||||
|
setStartCell(cell); |
||||||
|
} |
||||||
|
|
||||||
|
public void exportReport(OutputStream out, ElementGetter reportCase, int start, int end) throws Exception { |
||||||
|
PrintWriter writer = new PrintWriter(this.getOutputWriter(out)); |
||||||
|
int columnCount = reportCase.getColumnCount(); |
||||||
|
Condition csvChecker = Conditions.get(ExporterScene.CSV); |
||||||
|
|
||||||
|
if (isEnableSpecifiedFormat()) { |
||||||
|
setDelimiter(","); |
||||||
|
setCellIndex(); |
||||||
|
} |
||||||
|
|
||||||
|
int colIndex = 0; |
||||||
|
int valueIndex = 0; |
||||||
|
for (int row = start; row < end; ++row) { |
||||||
|
StringBuffer csvRowBuf = new StringBuffer(); |
||||||
|
Iterator it = reportCase.getRow(row); |
||||||
|
colIndex = 0; |
||||||
|
String str; |
||||||
|
int mark_col; |
||||||
|
for (mark_col = 0; it.hasNext(); ) { |
||||||
|
CellElement cell = (CellElement) it.next(); |
||||||
|
for (int cell_col = cell.getColumn(); mark_col < cell_col; ++mark_col) { |
||||||
|
long cells = (long) (mark_col * row); |
||||||
|
if ((cells & 8191L) == 0L) { |
||||||
|
csvChecker.setMetric(cells); |
||||||
|
MemoryHelper.getMemoryAlarmProcessor().interruptIfConditionMet(csvChecker); |
||||||
|
} |
||||||
|
if ((!isEnableSpecifiedFormat()) || (isEnableSpecifiedFormat() && (colIndex >= this.startColumnIndex))) { |
||||||
|
csvRowBuf.append(this.delimiter); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
Object value = this.getCellValue(cell); |
||||||
|
if (isEnableSpecifiedFormat() && (row >= this.startRowIndex) && (colIndex >= this.startColumnIndex)) { |
||||||
|
str = Style.valueToText(value, null); |
||||||
|
valueIndex = colIndex - this.startColumnIndex + 1; |
||||||
|
if (valueIndex == 1) { |
||||||
|
str = getFirstValue(str); |
||||||
|
} else if (valueIndex == 2) { |
||||||
|
str = getSecondValue(str); |
||||||
|
} else if (valueIndex == 3) { |
||||||
|
str = getThirdValue(str); |
||||||
|
} else if (valueIndex == 4) { |
||||||
|
str = getFourthValue(str); |
||||||
|
} else if (valueIndex == 5) { |
||||||
|
str = getFifthValue(str); |
||||||
|
} |
||||||
|
if (valueIndex >= 6) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
} else { |
||||||
|
Style style = cell.getStyle(); |
||||||
|
Format format = style.getFormat(); |
||||||
|
str = Style.valueToText(value, format); |
||||||
|
if (str.indexOf(",") != -1 || str.indexOf(",") != -1) { |
||||||
|
str = "\"" + str + "\""; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (isEnableSpecifiedFormat() && (colIndex < this.startColumnIndex)) { |
||||||
|
colIndex++; |
||||||
|
continue; |
||||||
|
} |
||||||
|
colIndex++; |
||||||
|
csvRowBuf.append(str); |
||||||
|
} |
||||||
|
|
||||||
|
for (; mark_col < columnCount; ++mark_col) { |
||||||
|
if (mark_col != columnCount - 1) { |
||||||
|
csvRowBuf.append(','); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (isEnableSpecifiedFormat() && (row < this.startRowIndex)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if (isEnableSpecifiedFormat()) { |
||||||
|
writer.println(trimComma(csvRowBuf.toString())); |
||||||
|
} else { |
||||||
|
writer.println(csvRowBuf.toString()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
writer.flush(); |
||||||
|
} |
||||||
|
|
||||||
|
private OutputStreamWriter getOutputWriter(OutputStream out) throws UnsupportedEncodingException { |
||||||
|
ExportEncodeProvider encodeProvider = ExtraReportClassManager.getInstance().getCsvExportEncodeProvider(); |
||||||
|
return encodeProvider != null ? encodeProvider.getCsvOutputStreamWriter(out) : new OutputStreamWriter(out, ConfigManager.getProviderInstance().getServerCharset()); |
||||||
|
} |
||||||
|
|
||||||
|
private Object getCellValue(CellElement cell) { |
||||||
|
Object value = cell.getValue(); |
||||||
|
CellGUIAttr gui = cell.getCellGUIAttr(); |
||||||
|
if (gui != null && !gui.isPrintContent()) { |
||||||
|
value = ""; |
||||||
|
} |
||||||
|
|
||||||
|
return value == null ? "" : value; |
||||||
|
} |
||||||
|
|
||||||
|
public void export(OutputStream out, ResultWorkBook book) throws Exception { |
||||||
|
List paperSettingList = ReportUtils.getPaperSettingListFromWorkBook(book); |
||||||
|
int i = 0; |
||||||
|
|
||||||
|
for (int len = book.getReportCount(); i < len; ++i) { |
||||||
|
this.export(out, book.getResultReport(i), (PaperSettingProvider) paperSettingList.get(i)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public void export(OutputStream out, ResultWorkBook workBook, PageSetCreator pageSet, ReportRepositoryDeal repo, int[] sheets) throws Exception { |
||||||
|
this.export(out, pageSet.createPageSet()); |
||||||
|
} |
||||||
|
|
||||||
|
private void export(OutputStream out, ResultReport report, PaperSettingProvider paperSetting) throws Exception { |
||||||
|
if (report != null) { |
||||||
|
FineLoggerFactory.getLogger().info("UnLayerReport start export"); |
||||||
|
this.exportReport(out, (ECReport) report, 0, ((ECReport) report).getRowCount()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public void export(OutputStream out, PageSetProvider pageSet) throws Exception { |
||||||
|
for (int i = 0; i < pageSet.size(); ++i) { |
||||||
|
ReportPageProvider reportPage = pageSet.getPage(i); |
||||||
|
ClippedPageProvider page = ExporterUtils.support(reportPage); |
||||||
|
if (page == null) { |
||||||
|
break; |
||||||
|
} |
||||||
|
|
||||||
|
this.exportReport(out, (ElementGetter) page, 0, ((ElementGetter) page).getRowCount()); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
public String getDelimiter() { |
||||||
|
return delimiter; |
||||||
|
} |
||||||
|
|
||||||
|
public void setDelimiter(String delimiter) { |
||||||
|
this.delimiter = delimiter; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean isEnableSpecifiedFormat() { |
||||||
|
return enableSpecifiedFormat; |
||||||
|
} |
||||||
|
|
||||||
|
public void setEnableSpecifiedFormat(boolean enable) { |
||||||
|
this.enableSpecifiedFormat = enable; |
||||||
|
} |
||||||
|
|
||||||
|
public String getStartCell() { |
||||||
|
return startCell; |
||||||
|
} |
||||||
|
|
||||||
|
public void setStartCell(String startCell) { |
||||||
|
this.startCell = startCell; |
||||||
|
} |
||||||
|
|
||||||
|
private String getFirstValue(String value) { |
||||||
|
String tempValue = getValue(value, 6); |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
private String getSecondValue(String value) { |
||||||
|
String tempValue = getValue(value, 4); |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
private String getThirdValue(String value) { |
||||||
|
String tempValue = getValue(value, 20); |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
private String getFourthValue(String value) { |
||||||
|
String tempValue = getValue(value, 1); |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
private String getFifthValue(String value) { |
||||||
|
value = StringKit.trim(value); |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
return fillZero(12); |
||||||
|
} |
||||||
|
String value1 = "", value2 = ""; |
||||||
|
int index = value.indexOf("."); |
||||||
|
if (index >= 0) { |
||||||
|
value1 = value.substring(0, index); |
||||||
|
value2 = value.substring(index + 1); |
||||||
|
} else { |
||||||
|
value1 = value; |
||||||
|
} |
||||||
|
value1 = getValue(value1, 10); |
||||||
|
if (StringKit.isEmpty(value2)) { |
||||||
|
value2 = "00"; |
||||||
|
} else if (value2.length() == 1) { |
||||||
|
value2 = value2 + "0"; |
||||||
|
} else if (value2.length() >= 2) { |
||||||
|
value2 = value2.substring(0, 2); |
||||||
|
} |
||||||
|
String tempValue = value1 + value2; |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
private String fillZero(int n) { |
||||||
|
if (n <= 0) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String value = ""; |
||||||
|
for (int i = 0, iMax = n - 1; i <= iMax; i++) { |
||||||
|
value = value + "0"; |
||||||
|
} |
||||||
|
return value; |
||||||
|
} |
||||||
|
|
||||||
|
private String getValue(String value, int length) { |
||||||
|
if (length <= 0) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
value = StringKit.trim(value); |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
return fillZero(length); |
||||||
|
} |
||||||
|
|
||||||
|
if (value.length() == length) { |
||||||
|
return value; |
||||||
|
} |
||||||
|
if (value.length() >= length) { |
||||||
|
return value.substring(value.length() - length); |
||||||
|
} |
||||||
|
|
||||||
|
String tempValue = fillZero(length - value.length()) + value; |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
private void setCellIndex() { |
||||||
|
if (StringKit.isEmpty(this.startCell)) { |
||||||
|
this.startCell = "A1"; |
||||||
|
} |
||||||
|
ColumnRow columnRow = ColumnRow.valueOf(this.startCell); |
||||||
|
|
||||||
|
this.startRowIndex = columnRow.getRow(); |
||||||
|
this.startColumnIndex = columnRow.getColumn(); |
||||||
|
} |
||||||
|
|
||||||
|
private String trimComma(String value) { |
||||||
|
value = StringKit.trim(value); |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String tempValue = value; |
||||||
|
if (",".equals(tempValue.substring(0, 1))) { |
||||||
|
tempValue = tempValue.substring(1); |
||||||
|
} |
||||||
|
if (",".equals(tempValue.substring(tempValue.length() - 1))) { |
||||||
|
tempValue = tempValue.substring(0, tempValue.length() - 1); |
||||||
|
} |
||||||
|
return tempValue; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,48 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export.menu; |
||||||
|
|
||||||
|
import com.fr.base.io.AttrMark; |
||||||
|
import com.fr.design.actions.JTemplateAction; |
||||||
|
import com.fr.design.dialog.DialogActionAdapter; |
||||||
|
import com.fr.design.dialog.UIDialog; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.design.mainframe.JTemplate; |
||||||
|
import com.fr.report.fit.FitProvider; |
||||||
|
|
||||||
|
import java.awt.*; |
||||||
|
import java.awt.event.ActionEvent; |
||||||
|
|
||||||
|
public class TextDelimiterMenuAction extends JTemplateAction { |
||||||
|
private static final Dimension MEDIUM = new Dimension(430, 400); |
||||||
|
|
||||||
|
public TextDelimiterMenuAction(JTemplate template) { |
||||||
|
super(template); |
||||||
|
setName("TXT导出分隔符设置"); |
||||||
|
//setSmallIcon(IconUtils.readIcon("com/tptj/demo/hg/menu/resources/image/demo.png"));
|
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void actionPerformed(ActionEvent e) { |
||||||
|
JTemplate jwb = getEditingComponent(); |
||||||
|
if (null == jwb) { |
||||||
|
return; |
||||||
|
} |
||||||
|
//当前的模板
|
||||||
|
FitProvider wbTpl = (FitProvider) jwb.getTarget(); |
||||||
|
if (!jwb.isJWorkBook()) { |
||||||
|
//不是cpt
|
||||||
|
return; |
||||||
|
} |
||||||
|
TextDelimiterPane pane = new TextDelimiterPane((AttrMark) wbTpl); |
||||||
|
UIDialog dialog = pane.showUnsizedWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { |
||||||
|
@Override |
||||||
|
public void doOk() { |
||||||
|
//做某些操作 从 pane中读取相关的交互结果设置到当前的模板中一般是这样
|
||||||
|
pane.update(); |
||||||
|
jwb.fireTargetModified(); |
||||||
|
} |
||||||
|
}); |
||||||
|
pane.populate(); |
||||||
|
dialog.setSize(MEDIUM); |
||||||
|
dialog.setVisible(true); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,46 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export.menu; |
||||||
|
|
||||||
|
import com.fr.design.fun.impl.AbstractMenuHandler; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.design.mainframe.JTemplate; |
||||||
|
import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; |
||||||
|
import com.fr.design.menu.ShortCut; |
||||||
|
|
||||||
|
public class TextDelimiterMenuHandler extends AbstractMenuHandler { |
||||||
|
private static final int INSERT_POSITION = 2; |
||||||
|
|
||||||
|
@Override |
||||||
|
public int insertPosition(int total) { |
||||||
|
return INSERT_POSITION; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean insertSeparatorBefore() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean insertSeparatorAfter() { |
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String category() { |
||||||
|
return TEMPLATE; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ShortCut shortcut() { |
||||||
|
JTemplate template = DesignerContext.getDesignerFrame().getSelectedJTemplate(); |
||||||
|
return shortcut(template); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public ShortCut shortcut(ToolBarMenuDockPlus plus) { |
||||||
|
//往ToolBarMenuDockPlus里塞感觉也很糟.
|
||||||
|
if (!(plus instanceof JTemplate)) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
return new TextDelimiterMenuAction((JTemplate) plus); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,83 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export.menu; |
||||||
|
|
||||||
|
import com.fanruan.api.design.ui.component.UICheckBox; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.base.io.AttrMark; |
||||||
|
import com.fr.design.dialog.BasicPane; |
||||||
|
import com.fr.design.editor.editor.ColumnRowEditor; |
||||||
|
import com.fr.design.gui.ilable.UILabel; |
||||||
|
import com.fr.design.gui.itextfield.UITextField; |
||||||
|
import com.fr.design.layout.FRGUIPaneFactory; |
||||||
|
import com.fr.design.layout.TableLayout; |
||||||
|
import com.fr.design.layout.TableLayoutHelper; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.export.TxtDelimiterAttrMark; |
||||||
|
import com.fr.stable.ColumnRow; |
||||||
|
|
||||||
|
import javax.swing.*; |
||||||
|
import java.awt.*; |
||||||
|
|
||||||
|
public class TextDelimiterPane extends BasicPane { |
||||||
|
private UITextField delimiterText; |
||||||
|
private UICheckBox enableSpecifiedFormatCheckBox; |
||||||
|
private ColumnRowEditor startColumnRowEditor; |
||||||
|
private AttrMark container; |
||||||
|
|
||||||
|
public TextDelimiterPane(AttrMark container) { |
||||||
|
this.container = container; |
||||||
|
delimiterText = new UITextField(); |
||||||
|
enableSpecifiedFormatCheckBox = new UICheckBox(); |
||||||
|
startColumnRowEditor = new ColumnRowEditor(); |
||||||
|
|
||||||
|
setLayout(FRGUIPaneFactory.createM_BorderLayout()); |
||||||
|
JPanel pane = TableLayoutHelper.createTableLayoutPane( |
||||||
|
new Component[][]{ |
||||||
|
{new UILabel("导出分隔符:"), delimiterText}, |
||||||
|
{new UILabel("导出指定格式:"), enableSpecifiedFormatCheckBox}, |
||||||
|
{new UILabel("导出指定格式的开始位置:"), startColumnRowEditor} |
||||||
|
}, |
||||||
|
new double[]{TableLayout.PREFERRED, TableLayout.PREFERRED, TableLayout.PREFERRED}, |
||||||
|
new double[]{TableLayout.PREFERRED, TableLayout.FILL} |
||||||
|
); |
||||||
|
add(pane, BorderLayout.NORTH); |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
protected String title4PopupWindow() { |
||||||
|
return "TXT导出分隔符设置"; |
||||||
|
} |
||||||
|
|
||||||
|
public void populate() { |
||||||
|
delimiterText.setText(TxtDelimiterAttrMark.DEFAULT_DELIMITER); |
||||||
|
enableSpecifiedFormatCheckBox.setSelected(false); |
||||||
|
TxtDelimiterAttrMark attr = container.getAttrMark(TxtDelimiterAttrMark.TAG); |
||||||
|
if (null != attr) { |
||||||
|
delimiterText.setText(attr.getDelimiter()); |
||||||
|
enableSpecifiedFormatCheckBox.setSelected(attr.isEnableSpecifiedFormat()); |
||||||
|
setStartValue(attr.getStartCell()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void update() { |
||||||
|
TxtDelimiterAttrMark attr = new TxtDelimiterAttrMark(); |
||||||
|
attr.setDelimiter(delimiterText.getText()); |
||||||
|
attr.setEnableSpecifiedFormat(enableSpecifiedFormatCheckBox.isSelected()); |
||||||
|
attr.setStartCell(getStartValue()); |
||||||
|
container.addAttrMark(attr); |
||||||
|
} |
||||||
|
|
||||||
|
private String getStartValue() { |
||||||
|
ColumnRow columnRow = startColumnRowEditor.getValue(); |
||||||
|
if (columnRow == null) { |
||||||
|
return "A1"; |
||||||
|
} |
||||||
|
return columnRow.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
private void setStartValue(String value) { |
||||||
|
if (StringKit.isEmpty(value)) { |
||||||
|
value = "A1"; |
||||||
|
} |
||||||
|
ColumnRow columnRow = ColumnRow.valueOf(value); |
||||||
|
startColumnRowEditor.setValue(columnRow); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,13 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.export.web; |
||||||
|
|
||||||
|
import com.fr.stable.fun.impl.AbstractJavaScriptFileHandler; |
||||||
|
|
||||||
|
public class JavaScriptFileHandler extends AbstractJavaScriptFileHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] pathsForFiles() { |
||||||
|
return new String[]{ |
||||||
|
"/com/fr/plugin/third/party/jsdbacfj/txt_export.js" |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,185 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.http; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.io.TemplateWorkBookIO; |
||||||
|
import com.fr.io.exporter.PDFExporterForPrint; |
||||||
|
import com.fr.main.TemplateWorkBook; |
||||||
|
import com.fr.main.workbook.ResultWorkBook; |
||||||
|
import com.fr.page.PageSetProvider; |
||||||
|
import com.fr.plugin.context.PluginContexts; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.StampUtils; |
||||||
|
import com.fr.report.core.ReportUtils; |
||||||
|
import com.fr.stable.PageActor; |
||||||
|
import com.fr.third.springframework.web.bind.annotation.RequestMethod; |
||||||
|
import com.fr.web.utils.WebUtils; |
||||||
|
import org.apache.pdfbox.multipdf.PDFMergerUtility; |
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.nio.file.Path; |
||||||
|
import java.nio.file.Paths; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class CreatePdfHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.GET; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdbacfj/stamp/pdf"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
addStamp(req, res); |
||||||
|
} |
||||||
|
|
||||||
|
private void addStamp(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("text/plain"); |
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 开始..."); |
||||||
|
if (!PluginContexts.currentContext().isAvailable()) { |
||||||
|
LogKit.error("印章集成插件试用过期, 请添加许可证"); |
||||||
|
WebUtils.printAsString(res, "印章集成插件试用过期, 请添加许可证"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 获取报表路径..."); |
||||||
|
List<String> reportPaths = getReportPaths(req); |
||||||
|
if (reportPaths.size() <= 0) { |
||||||
|
LogKit.error("印章集成,批量生成印章pdf, 没有有效的报表路径"); |
||||||
|
WebUtils.printAsString(res, "没有有效的报表路径"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 获取印章..."); |
||||||
|
String orgId = WebUtils.getHTTPRequestParameter(req, "orgId"); |
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 获取印章,orgId:" + orgId); |
||||||
|
String stampBase64 = StampUtils.getStampBase64(orgId); |
||||||
|
if (StringKit.isEmpty(stampBase64)) { |
||||||
|
LogKit.error("印章集成,批量生成印章pdf, 无法获取印章"); |
||||||
|
WebUtils.printAsString(res, "无法获取印章"); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
StampUtils.addFrameOptions(req, res); |
||||||
|
|
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 生成pdf文件..."); |
||||||
|
String dirPath = StampUtils.getTempExportPath(); |
||||||
|
Path path = Paths.get(dirPath); |
||||||
|
Files.createDirectories(path); |
||||||
|
String filePath = dirPath + "/a.pdf"; |
||||||
|
String filePath1 = dirPath + "/b.pdf"; |
||||||
|
|
||||||
|
String templatePath; |
||||||
|
TemplateWorkBook templateWorkBook; |
||||||
|
ResultWorkBook resultWorkBook; |
||||||
|
PageSetProvider pageSetProvider; |
||||||
|
FileOutputStream fileOutputStream; |
||||||
|
Map<String, Object> parameterMap = createParameterMap(req); |
||||||
|
PDFExporterForPrint pdfExporter = new PDFExporterForPrint(); |
||||||
|
if (reportPaths.size() == 1) { |
||||||
|
templatePath = reportPaths.get(0); |
||||||
|
templateWorkBook = TemplateWorkBookIO.readTemplateWorkBook(templatePath); |
||||||
|
resultWorkBook = templateWorkBook.execute(parameterMap, new PageActor()); |
||||||
|
pageSetProvider = resultWorkBook.generateReportPageSet(ReportUtils.getPaperSettingListFromWorkBook(resultWorkBook)).traverse4Export(); |
||||||
|
fileOutputStream = new FileOutputStream(filePath); |
||||||
|
pdfExporter.export(fileOutputStream, pageSetProvider); |
||||||
|
} else { |
||||||
|
PDFMergerUtility pdfMerger = new PDFMergerUtility(); |
||||||
|
pdfMerger.setDestinationFileName(filePath); |
||||||
|
String tempPath; |
||||||
|
for (int i = 0, max = reportPaths.size() - 1; i <= max; i++) { |
||||||
|
tempPath = dirPath + "/temp" + i + ".pdf"; |
||||||
|
templatePath = reportPaths.get(i); |
||||||
|
templateWorkBook = TemplateWorkBookIO.readTemplateWorkBook(templatePath); |
||||||
|
resultWorkBook = templateWorkBook.execute(parameterMap, new PageActor()); |
||||||
|
pageSetProvider = resultWorkBook.generateReportPageSet(ReportUtils.getPaperSettingListFromWorkBook(resultWorkBook)).traverse4Export(); |
||||||
|
fileOutputStream = new FileOutputStream(tempPath); |
||||||
|
pdfExporter.export(fileOutputStream, pageSetProvider); |
||||||
|
pdfMerger.addSource(tempPath); |
||||||
|
} |
||||||
|
pdfMerger.mergeDocuments(); |
||||||
|
} |
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 添加印章..."); |
||||||
|
|
||||||
|
int stampX = WebUtils.getHTTPRequestIntParameter(req, "stampX", -1); |
||||||
|
int stampY = WebUtils.getHTTPRequestIntParameter(req, "stampY", -1); |
||||||
|
int stampInterval = WebUtils.getHTTPRequestIntParameter(req, "stampInterval", -1); |
||||||
|
int stampWidth = WebUtils.getHTTPRequestIntParameter(req, "stampWidth", -1); |
||||||
|
int stampHeight = WebUtils.getHTTPRequestIntParameter(req, "stampHeight", -1); |
||||||
|
|
||||||
|
StampUtils.addStampWithPdf(stampBase64, filePath, filePath1, stampX, stampY, stampInterval, stampWidth, stampHeight); |
||||||
|
StampUtils.writePdfToResponse(res, filePath1); |
||||||
|
StampUtils.deleteFile(path); |
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 结束..."); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private Map<String, Object> createParameterMap(HttpServletRequest req) { |
||||||
|
Map<String, String[]> tempParas = req.getParameterMap(); |
||||||
|
if ((tempParas == null) || (tempParas.size() <= 0)) { |
||||||
|
return new HashMap<>(); |
||||||
|
} |
||||||
|
Map<String, Object> parameterMap = new HashMap<>(); |
||||||
|
String key; |
||||||
|
Object valueObject; |
||||||
|
for (Map.Entry<String, String[]> tempEntry : tempParas.entrySet()) { |
||||||
|
key = tempEntry.getKey(); |
||||||
|
if ("viewlet".equals(key)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
if ("reportPath".equals(key)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
valueObject = req.getParameter(key); |
||||||
|
parameterMap.put(key, valueObject); |
||||||
|
} |
||||||
|
return parameterMap; |
||||||
|
} |
||||||
|
|
||||||
|
private List<String> getReportPaths(HttpServletRequest req) throws Exception { |
||||||
|
List<String> reportPaths = new ArrayList<>(); |
||||||
|
if (req == null) { |
||||||
|
return reportPaths; |
||||||
|
} |
||||||
|
|
||||||
|
String[] tempPaths = req.getParameterValues("reportPath"); |
||||||
|
if ((tempPaths == null) || (tempPaths.length <= 0)) { |
||||||
|
return reportPaths; |
||||||
|
} |
||||||
|
|
||||||
|
String templatePath; |
||||||
|
TemplateWorkBook templateWorkBook; |
||||||
|
for (int i = 0, max = tempPaths.length - 1; i <= max; i++) { |
||||||
|
templatePath = StringKit.trim(tempPaths[i]); |
||||||
|
LogKit.info("印章集成,批量生成印章pdf, 报表路径:" + templatePath); |
||||||
|
if (StringKit.isEmpty(templatePath) || reportPaths.contains(templatePath)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
templateWorkBook = TemplateWorkBookIO.readTemplateWorkBook(templatePath); |
||||||
|
if (templateWorkBook == null) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
reportPaths.add(templatePath); |
||||||
|
} |
||||||
|
return reportPaths; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,91 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.http; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.StampUtils; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.Utils; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.config.CustomDataConfig; |
||||||
|
import com.fr.third.org.apache.commons.lang3.time.DateFormatUtils; |
||||||
|
import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; |
||||||
|
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; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.UUID; |
||||||
|
|
||||||
|
/** |
||||||
|
* |
||||||
|
*/ |
||||||
|
public class CustomConfigHttpHandler extends BaseHttpHandler { |
||||||
|
|
||||||
|
@Override |
||||||
|
public RequestMethod getMethod() { |
||||||
|
return RequestMethod.GET; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String getPath() { |
||||||
|
return "/jsdbacfj/config"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean isPublic() { |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void handle(HttpServletRequest req, HttpServletResponse res) throws Exception { |
||||||
|
res.setContentType("application/json; charset=utf-8"); |
||||||
|
JSONObject configJson = new JSONObject(); |
||||||
|
configJson.put("status", "failure"); |
||||||
|
|
||||||
|
String refererUrl = req.getHeader("Referer"); |
||||||
|
if (StringKit.isEmpty(refererUrl)) { |
||||||
|
LogKit.info("印章集成,请求头Referer值为空"); |
||||||
|
configJson.put("msg", "请求头Referer值为空"); |
||||||
|
WebUtils.printAsJSON(res, configJson); |
||||||
|
return; |
||||||
|
} |
||||||
|
String currentReportPath = Utils.getReportPathByUrl(refererUrl); |
||||||
|
if (StringKit.isEmpty(currentReportPath)) { |
||||||
|
LogKit.info("印章集成,当前报表路径为空"); |
||||||
|
configJson.put("msg", "当前报表路径为空"); |
||||||
|
WebUtils.printAsJSON(res, configJson); |
||||||
|
return; |
||||||
|
} |
||||||
|
String reportPath = CustomDataConfig.getInstance().getStampReportName(); |
||||||
|
if (StringKit.isEmpty(reportPath)) { |
||||||
|
LogKit.info("印章集成,配置报表路径为空"); |
||||||
|
configJson.put("msg", "配置报表路径为空"); |
||||||
|
WebUtils.printAsJSON(res, configJson); |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
LogKit.info("印章集成,当前报表路径:" + currentReportPath); |
||||||
|
LogKit.info("印章集成,配置报表路径:" + reportPath); |
||||||
|
if (StampUtils.isNotStampReport(currentReportPath)) { |
||||||
|
LogKit.info("印章集成,当前报表路径与配置报表路径不同"); |
||||||
|
configJson.put("msg", "当前报表路径与配置报表路径不同"); |
||||||
|
WebUtils.printAsJSON(res, configJson); |
||||||
|
return; |
||||||
|
} |
||||||
|
LogKit.info("印章集成,印章生效报表路径:" + currentReportPath); |
||||||
|
|
||||||
|
String dataBase64 = StampUtils.getImgBase64(); |
||||||
|
if (StringKit.isEmpty(dataBase64)) { |
||||||
|
LogKit.info("印章集成,图章为空"); |
||||||
|
configJson.put("msg", "图章为空"); |
||||||
|
WebUtils.printAsJSON(res, configJson); |
||||||
|
return; |
||||||
|
} |
||||||
|
configJson.put("dataBase64", dataBase64); |
||||||
|
configJson.put("stampOpacity", StampUtils.getStampOpacity()); |
||||||
|
configJson.put("status", "success"); |
||||||
|
WebUtils.printAsJSON(res, configJson); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.http; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractHttpHandlerProvider; |
||||||
|
import com.fr.decision.fun.impl.BaseHttpHandler; |
||||||
|
|
||||||
|
|
||||||
|
public class CustomHttpHandlerProvider extends AbstractHttpHandlerProvider { |
||||||
|
@Override |
||||||
|
public BaseHttpHandler[] registerHandlers() { |
||||||
|
return new BaseHttpHandler[]{ |
||||||
|
new CustomConfigHttpHandler(), |
||||||
|
new CreatePdfHttpHandler() |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.http; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractURLAliasProvider; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAlias; |
||||||
|
import com.fr.decision.webservice.url.alias.URLAliasFactory; |
||||||
|
import com.fr.stable.fun.Authorize; |
||||||
|
|
||||||
|
@Authorize(callSignKey = "com.fr.plugin.third.party.jsdbacfj") |
||||||
|
public class CustomURLAliasProvider extends AbstractURLAliasProvider { |
||||||
|
@Override |
||||||
|
public URLAlias[] registerAlias() { |
||||||
|
return new URLAlias[]{ |
||||||
|
URLAliasFactory.createPluginAlias("/jsdbacfj/config", "/jsdbacfj/config", true), |
||||||
|
URLAliasFactory.createPluginAlias("/jsdbacfj/stamp/pdf", "/jsdbacfj/stamp/pdf", true), |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,52 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.http; |
||||||
|
|
||||||
|
import com.fanruan.api.log.LogKit; |
||||||
|
import com.fanruan.api.util.StringKit; |
||||||
|
import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider; |
||||||
|
import com.fr.plugin.third.party.jsdbacfj.StampUtils; |
||||||
|
import com.fr.stable.fun.Authorize; |
||||||
|
|
||||||
|
import javax.servlet.FilterChain; |
||||||
|
import javax.servlet.http.HttpServletRequest; |
||||||
|
import javax.servlet.http.HttpServletResponse; |
||||||
|
|
||||||
|
@Authorize(callSignKey = "com.fr.plugin.third.party.jsdbacfj") |
||||||
|
public class SessionGlobalRequestFilterProvider extends AbstractGlobalRequestFilterProvider { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String filterName() { |
||||||
|
return "com.fr.plugin.third.party.jsdbacfj"; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public String[] urlPatterns() { |
||||||
|
return new String[]{"/decision", "/decision/*"}; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) { |
||||||
|
try { |
||||||
|
if (StampUtils.isAddStamp(req)) { |
||||||
|
StampUtils.addStamp(req, res, filterChain); |
||||||
|
return; |
||||||
|
} |
||||||
|
filterChain.doFilter(req, res); |
||||||
|
} catch (Exception e) { |
||||||
|
LogKit.error("印章集成出错," + e.getMessage(), e); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private String getRequestFullUrl(HttpServletRequest req) { |
||||||
|
if (req == null) { |
||||||
|
return ""; |
||||||
|
} |
||||||
|
String query = req.getQueryString(); |
||||||
|
if (StringKit.isEmpty(query) || "null".equalsIgnoreCase(query)) { |
||||||
|
query = ""; |
||||||
|
} else { |
||||||
|
query = "?" + query; |
||||||
|
} |
||||||
|
String url = req.getRequestURL().toString() + query; |
||||||
|
return url; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.web; |
||||||
|
|
||||||
|
import com.fr.web.struct.Component; |
||||||
|
import com.fr.web.struct.Filter; |
||||||
|
import com.fr.web.struct.browser.RequestClient; |
||||||
|
import com.fr.web.struct.category.ScriptPath; |
||||||
|
import com.fr.web.struct.category.StylePath; |
||||||
|
|
||||||
|
public class MainFilesComponent extends Component { |
||||||
|
public static final MainFilesComponent KEY = new MainFilesComponent(); |
||||||
|
private MainFilesComponent(){} |
||||||
|
/** |
||||||
|
* 返回需要引入的JS脚本路径 |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return JS脚本路径 |
||||||
|
*/ |
||||||
|
public ScriptPath script(RequestClient client ) { |
||||||
|
//如果不需要就直接返回 ScriptPath.EMPTY
|
||||||
|
return ScriptPath.build("com/fr/plugin/third/party/jsdbacfj/main.js"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回需要引入的CSS样式路径 |
||||||
|
* @param client 请求客户端描述 |
||||||
|
* @return CSS样式路径 |
||||||
|
*/ |
||||||
|
public StylePath style(RequestClient client ) { |
||||||
|
//如果不需要就直接返回 StylePath.EMPTY;
|
||||||
|
return StylePath.EMPTY; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 通过给定的资源过滤器控制是否加载这个资源 |
||||||
|
* @return 资源过滤器 |
||||||
|
*/ |
||||||
|
public Filter filter() { |
||||||
|
return new Filter(){ |
||||||
|
@Override |
||||||
|
public boolean accept() { |
||||||
|
//任何情况下我们都在平台组件加载时加载我们的组件
|
||||||
|
return true; |
||||||
|
} |
||||||
|
}; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package com.fr.plugin.third.party.jsdbacfj.web; |
||||||
|
|
||||||
|
import com.fr.decision.fun.impl.AbstractWebResourceProvider; |
||||||
|
import com.fr.decision.web.MainComponent; |
||||||
|
import com.fr.report.web.ReportMainComponent; |
||||||
|
import com.fr.web.struct.Atom; |
||||||
|
|
||||||
|
public class MainWebResourceProvider extends AbstractWebResourceProvider { |
||||||
|
@Override |
||||||
|
public Atom attach() { |
||||||
|
//在平台主组件加载时添加我们自己的组件
|
||||||
|
return ReportMainComponent.KEY; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public Atom client() { |
||||||
|
//我们自己要引入的组件
|
||||||
|
return MainFilesComponent.KEY; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
$(function () { |
||||||
|
var url = FR.fineServletURL + "/url/jsdbacfj/config"; |
||||||
|
$.get(url, |
||||||
|
function (data, status) { |
||||||
|
if (status == "success" && data.status && data.status == "success") { |
||||||
|
addStamp(data.imgId, data.dataBase64, data.stampOpacity); |
||||||
|
window.jsdbacfjConfig = window.jsdbacfjConfig || {}; |
||||||
|
window.jsdbacfjConfig.imgId = data.imgId; |
||||||
|
window.jsdbacfjConfig.dataBase64 = data.dataBase64; |
||||||
|
window.jsdbacfjConfig.stampOpacity = data.stampOpacity; |
||||||
|
var timerId = setInterval(function () { |
||||||
|
var stampImg = $("#" + window.jsdbacfjConfig.imgId); |
||||||
|
if (stampImg.length >= 1) { |
||||||
|
return; |
||||||
|
} |
||||||
|
addStamp(window.jsdbacfjConfig.imgId, window.jsdbacfjConfig.dataBase64, window.jsdbacfjConfig.stampOpacity); |
||||||
|
}, 500) |
||||||
|
} |
||||||
|
}, "json"); |
||||||
|
|
||||||
|
function addStamp(imgId, dataBase64, stampOpacity) { |
||||||
|
$("#content-container").prepend('<img id="' + imgId + '" style="position: absolute;right: 0px;width: 121.8px;height: 79.4px;z-index: 100;opacity:' + stampOpacity + '" src="' + dataBase64 + '"></img>') |
||||||
|
} |
||||||
|
|
||||||
|
}); |
After Width: | Height: | Size: 176 B |
@ -0,0 +1,91 @@ |
|||||||
|
|
||||||
|
$(function () { |
||||||
|
if (FR.WritePane) { |
||||||
|
$.extend(FR.WritePane.prototype, { |
||||||
|
exportReportToTxt: function () { |
||||||
|
if (this.fireEvent("before_txt") === false) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var self = this; |
||||||
|
window.location = FR.servletURL + "?op=export&sessionID=" + this.currentSessionID + "&format=txt"; |
||||||
|
try { |
||||||
|
FR.progressBar.call(this, this.currentSessionID, "txt_export"); |
||||||
|
} catch (e) { |
||||||
|
FR.progressBar(self.currentSessionID, "txt_export"); |
||||||
|
} |
||||||
|
self.fireEvent("after_txt"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
if (FR.PagePane) { |
||||||
|
$.extend(FR.PagePane.prototype, { |
||||||
|
exportReportToTxt: function () { |
||||||
|
if (this.fireEvent("before_txt") === false) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var self = this; |
||||||
|
window.location = FR.servletURL + "?op=export&sessionID=" + this.currentSessionID + "&format=txt"; |
||||||
|
try { |
||||||
|
FR.progressBar.call(this, this.currentSessionID, "txt_export"); |
||||||
|
} catch (e) { |
||||||
|
FR.progressBar(self.currentSessionID, "txt_export"); |
||||||
|
} |
||||||
|
self.fireEvent("after_txt"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
if (FR.ViewPane) { |
||||||
|
$.extend(FR.ViewPane.prototype, { |
||||||
|
exportReportToTxt: function () { |
||||||
|
if (this.fireEvent("before_txt") === false) { |
||||||
|
return; |
||||||
|
} |
||||||
|
var self = this; |
||||||
|
window.location = FR.servletURL + "?op=export&sessionID=" + this.currentSessionID + "&format=txt"; |
||||||
|
try { |
||||||
|
FR.progressBar.call(this, this.currentSessionID, "txt_export"); |
||||||
|
} catch (e) { |
||||||
|
FR.progressBar(self.currentSessionID, "txt_export"); |
||||||
|
} |
||||||
|
self.fireEvent("after_txt"); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
//新填报预览
|
||||||
|
if ((typeof (WT) != 'undefined') && (typeof (WT.ReportPage) != 'undefined')) { |
||||||
|
$.extend(WT.ReportPage.prototype, { |
||||||
|
exportReportToTxt: function () { |
||||||
|
var beforeEvent = "beforetotxt"; |
||||||
|
var afterEvent = "aftertotxt"; |
||||||
|
|
||||||
|
if (this.fireEvent(beforeEvent) === false) { |
||||||
|
return |
||||||
|
} |
||||||
|
var self = this; |
||||||
|
this.stopEditAndWaitCal().then(function () { |
||||||
|
WT.net.saveContent(self._getDirtyCellListAll()).then(function (c) { |
||||||
|
if (c !== "success") { |
||||||
|
return WT.createPromiseResult(c) |
||||||
|
} |
||||||
|
self._afterContentSave(); |
||||||
|
//WT.net.exportPDF(b)
|
||||||
|
var a = FR.buildServletUrl({ |
||||||
|
op: "export", |
||||||
|
format: "txt", |
||||||
|
"fr_embedded": true, |
||||||
|
extype: "txt", |
||||||
|
sessionID: FR.SessionMgr.getSessionID() |
||||||
|
}, true); |
||||||
|
WT.net.downloadExportFile(a, "txt"); |
||||||
|
|
||||||
|
})["catch"](WT.toastError).then(function () { |
||||||
|
self.fireEvent(afterEvent) |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
}); |
Loading…
Reference in new issue