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