动态数据采集业务逻辑
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                动态数据采集业务逻辑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                
                            
                            
                            數據采集之后臺管理模塊
 
 
1.Control:MemoryReportControl
2.進入報表采集頁面并查詢列表/分頁:/index ?repIndex.jsp ??
后臺:
action:
PageDTO dto = memoryReportService.querAdmReportList(map);
model.addAttribute("dto", dto);
return "/admreport/repIndex;
service: MemoryReportServiceImpl.java ? queryPaginatedList
DAO : ? ?MemoryReportDao.java ?querAdmReport/queryAdmReportCount
XML : ?sqlmap-mapping-admin-queryreport.xml ? ?queryreport.query.admreportlist/queryreport.query.admreporCount
 
前臺:
<script type="text/javascript">
$(document).ready(function(){
$(".setup").hide();
$.PaginPan({
currentPage:${dto.currentPage},
totalPage:${dto.totalPage},
pageViewno:9,
wayUrl:'/parp/api/admin/memoryreport/index?pafaRetViewType=jsp&name=${name}¤tPage='
});
});
</script>
? ? 問題:1.pafaRetViewType=jsp ?這個參數 什么意思呢???
 
 
3.查看詳情/修改 /repuppage ?uppage.jsp
后臺:
action:?
String uniquedetid = manageDeptService.uniquedetidlist(id); //查詢組織機構ID。一個報表可能有多個組織機構看?
AdmReportDTO repDto = memoryReportService.getAdmReportDTO(id);//查詢報表詳細信息.
List<BIReportDTO> biList = manageBIReprotService.queryAllBiInfoList();根據BI所有bi數據
service:
ManageDeptServiceImpl.java ? String uniquedetidlist(String reportid);
MemoryReportServiceImpl.java ? ?AdmReportDTO getAdmReportDTO(String id)
ManageBIReprotServiceImpl.java List<BIReportDTO> queryAllBiInfoList()?
dao:
AdmReportDTO getAdmReportDTO(String id)
manageBIReprotDAO.queryAllBiInfoList();
 
查詢組織機構:
select t1.paic_unique_deptid
?from parp_dept_report t, parp_paic_dept_info t1
where t.id_parp_paic_dept_info = t1.id_parp_paic_dept_info
and id_parp_report_info = #reportid#
 
查詢BI源
<select id="bireport.query.bireportinfolist" resultClass="com.paic.reportportal.admin.dto.BIReportDTO">
select t.id_bi_info as biId,t.name as biName,t1.bi_report_extend_attrs_tab as reportTab, t.dispatch_url as dispatchUrl?
from parp_bi_info ?t ,parp_bi_source_type t1 where t.id_bi_source_type=t1.id_bi_source_type order by t.created_date
</select>
 
前臺:1.<a href="<c:url value='/api/admin/memoryreport/repuppage?pafaRetViewType=jsp&'/>id=${item.id}">查看詳情</a> 跳轉到查看詳情
2.EL 表達式加載后臺查詢的值
3.根據BI源的變化 選擇報表擴展屬性Tap頁。/gotoAttrsPage
forReportAttrTab({attrTab:extendTab,tabName:tabName,reportid:$("#reportid").val()},"<c:url value='/api/admin/memoryreport/gotoAttrsPage?pafaRetViewType=jsp'/>",extendTab);
 
 
?
4.失效
5.刪除
<c:if test="${item.isValid=='Y'}">
<a href="javascript:void(0);" οnclick="if(confirm('確認是否失效!')){handleReport('<c:url value='/api/admin/memoryreport/handleReport?pafaRetViewType=jsp'/>','${item.id}','${item.isValid}','invalidation','<c:url value='/api/admin/memoryreport/index?pafaRetViewType=jsp'/>');}">失效</a>
</c:if>
<c:if test="${item.isValid=='N'}">
<a href="javascript:void(0);" οnclick="if(confirm('確認是否啟用!')){handleReport('<c:url value='/api/admin/memoryreport/handleReport?pafaRetViewType=jsp'/>','${item.id}','${item.isValid}','startUp','<c:url value='/api/admin/memoryreport/index?pafaRetViewType=jsp'/>');}">啟用</a>
</c:if>
<a href="javascript:void(0);" οnclick="if(confirm('確認是否刪除!')){handleReport('<c:url value='/api/admin/memoryreport/handleReport?pafaRetViewType=jsp'/>','${item.id}','${item.isValid}','delete','<c:url value='/api/admin/memoryreport/index?pafaRetViewType=jsp'/>');}">刪除</a> </td>
 
 
 
 
6.新增頁面:/torepinpage ? inpage.jsp
 
 
 
 
 
 
新增保存插入報表基本信息/存儲路徑過程:
 
 
1.前臺 inpage.jsp?
<%@ include file="/pages/admreport/userclass.jsp"%>
點擊確定 觸發驗證方法
<td align="center" colspan="2"><input type="button" value="確認" οnclick="validateVal();"/></td>
 
2.validateVal() ?驗證是否重復 是否有效 是否超長。 webEvent.js
if(sta&&validateValForMonitor()){
document.mainform.submit();
}
?
3.驗證成功 提交表單 到后臺 memoryreport/insertOrUpdate
<form id="mainform" name="mainform" action="<c:url value='/api/admin/memoryreport/insertOrUpdate?pafaRetViewType=jsp'/>" enctype="multipart/form-data" method="post">
 
 
4.后臺 ?MemoryReportController.java ?/insertOrUpdate
// 判斷是進行新增還是修改操作
if (StringUtils.isEmpty(reportid)) {
newReportId = memoryReportService.insertAdmReport(mapVal);
mapVal.put("reportid", newReportId);
memoryReportService.insertReportMonitor(mapVal);
 
} else {
memoryReportService.updateAdmReport(mapVal);
// 更新監控SQL配置信息
memoryReportService.updateReportMonitor(mapVal);
 
}
5.后臺Service 新增業務邏輯 ?MemoryReportServiceImpl。java ? insertAdmReport()
//新增業務邏輯
public String insertAdmReport(Map<String, String> map) {
String result = null;
if (StringUtils.isBlank(map.get("reportid"))) {
result = commonDAO.queryGUID();
map.put("reportid", result);
}
setReportTypeID(map);
insertDept(map);
insertOrUpdateEventChannel(map);
memoryReportDAO.insertAdmReport(map);
memoryReportDAO.insertReportAttrs(insertAttrsTableSQL(map));
return result;
}
 
6.DAO
public void insertReportAttrs(Map map) {
log.debug("query insertReportAttrs ?dao start");
this._insert("queryreport.insert.admreportattrs", map);
log.debug("query insertReportAttrs ?dao end");
}
 
map={fieldList=[{value=Y, key=taday_isornot_send}, {value=N, key=eoa_finish_send}, {value=444/925/2/6CCDDE3E001946388FB0509F64F3F8CF/, key=sqlmapper}, {value=CSV, key=download_type}
? ? ? ? ? ? ? ], id_report_info=4D80D3B29AE95A24E0531580140AA64B, attrsTbl=PARP_MB_REPORT_EXTEND_ATTRS
}
<insert id="queryreport.insert.admreportattrs" parameterClass="java.util.HashMap" >
? ? ? ? ?insert into $attrsTbl$
? ? ? ? ?(
? ? ? ? ? ?<iterate property="fieldList" conjunction=",">
? ? ? $fieldList[].key$
? ? ?</iterate>
? ? ? ? ?,id_report_info)
? ? ? ? ?values
? ? ? ? ?(
? ? ? ? ? <iterate property="fieldList" conjunction=",">
? ? ? #fieldList[].value#
? ? ?</iterate>
? ? ? ? ?,#id_report_info#)
? ? ?</insert>
 
 
 
 
 
報表編譯新 ?
SQL編譯提交過程: ? ??
1.inpage.jsp ?Ajax加載執行 ?forReportAttrTab({attrTab:extendTab},"<c:url value='/api/admin/memoryreport/gotoAttrsPage?pafaRetViewType=jsp'/>",extendTab);
2.進入后臺 MemoryReportControl.java ?gotoAttrsPage()方法 ??
返回 return "/admreport/" + attrTab; ? 根據實際情況異步加載 ?報表擴展屬性Tab頁
3.MB_REPORT_EXTEND_ATTRS.jsp ? 點擊<span><a id="updateModule" οnclick="editorViewHtml('editorSql')" style="cursor:pointer">報表編輯(新)</a></span>
4.editorSql() ?/editorSql ? ?進入編譯SQL頁面 editorSql.jsp
5.提交保存并生成新sqlid
function submitForSaveSql() {
if ( !checkDataForCurSql() ) {
return false;
}
EidtorSQLTool.saveSql();
setSqlId();
}
6. Editorsql.js ? ?savesql方法: ? ? ?EidtorSQLTool._submit(EidtorSQLTool.allArray);
7. Editorsql.js ? ?submit方法 ? ? ? ? url:"/commonreport/api/saveSql?pafaRetViewType=jsp",
8.進入后臺 ?ReportConfigsController.java ? saveSql() ? ?/saveSql ?方法 保存
9.最后本地磁盤保存地址 ?.sql ?.data 文件
D:\parp\report\792\135\234\8D40A7974DBF6B9B56E4E7D513C867DD
 
 
 
 
報表編譯窗口模塊:
1.editor.jsp ? 點擊下一步
<a href="javascript:void(0);" οnclick="EidtorSQLTool._nextButton()">
<span class="b_btn">
<span title="下一步" class="gp_btn_img gp_btn_ti0 gp_btn_wd" >下一步</span>
</span>
</a>
2.editorsql.js _nextButton()
_nextButton:function() {
location.href = "/commonreport/api/toparpReportEditor?pafaRetViewType=jsp&path="+EidtorSQLTool.path;
}
 
 
3.進入后臺 ?ReportConfigsController.java ? toparpReportEditor() /toparpReportEditor ? 進入可視化窗口頁面 ?parpReportEditor.jsp
return "/customBIReport/parpReportEditor";
4.parpReportEditor.jsp 頁面 ?工具編輯報表 ? ?最后點擊保存生成 module.html,temp.html ? ?
D:\parp\report\792\135\234\8D40A7974DBF6B9B56E4E7D513C867DD
1)前臺頁面 <form style="width: 100%;height: 100%;" action="javascript:void(0)" οnsubmit="save_file_local(getFckText());">
2) save_file_local() ?AJAX 異步進入后臺?
url : "/commonreport/api/saveHtmlContent?pafaRetViewType=jsp",
 
 
3)進入后臺 ?ReportConfigsController.java ?/saveHtmlContent ?saveHtmlContent() ?生成 module.html,temp.html
 
 
前段保存過程:
1)點擊保存觸發 FCKeditorAPI工具 表單里面的submit事件
<form style="width: 100%;height: 100%;" action="javascript:void(0)" οnsubmit="save_file_local(getFckText());">
2)獲取編輯器內容getFckText()。
var getFckText = function() {
var oEditor = FCKeditorAPI.GetInstance('MyTextarea');//獲取頁面中的FCK對象
return oEditor.GetXHTML(true);//獲取編輯器中的內容..
};
3)將編輯器中的內容轉換成需要保存的HTML內容 ? content = transEditorStrToHtmlFileStr(content);
var colStrArr = [];
var tempContent = "";// 編輯保存頁面內容
function transEditorStrToHtmlFileStr( editorStr ) {
var resultStr = editorStr;// 可不作空判斷,保存為空html文件
//特殊處理input標簽中的屬性cnname
if (resultStr.indexOf("cnname") != -1) {
resultStr = resultStr.replace(" cnname=", " cnName=");
}
resultStr = EditorContent( resultStr );// 翻譯各個控件元素
var headStr = setHead4Selects( resultStr );// 處理獲取文件HEAD內容
if ( !resultStr.startWith('<html>') ) {
resultStr = '<html><head>\r\n' + headStr + '\r\n</head><body>\r\n' + resultStr + '\r\n</body></html>';
// tempContent = '<html><head></head><body>\r\n' + editorStr + '\r\n</body></html>';
tempContent = dealMyAreaTag(editorStr);
}
return resultStr;
}
4)AJAX 異步保存進入后臺方法 保存報表展示及編輯兩個HTML文件
function save_file_local( content ) {
content = transEditorStrToHtmlFileStr(content);
$.ajax({
type : "POST",
data : { "htmlcontent":content, "temphtml":tempContent, "path":"${path}" },
url : "/commonreport/api/saveHtmlContent?pafaRetViewType=jsp",
dataType : "text",
async : false,
contentType : "application/x-www-form-urlencoded; charset=utf-8",
success : function (data) {
alert("編輯成功!");
}
});
}
 
前端頁面插入節點執行過程:
1)頁面開始加載的時候 ?組裝建模樹并加載
/**
* 加載建模結果樹
*/
$(document).ready(function() {
treeArray();
$.fn.zTree.init($("#treeDemo"), setting, tmpzNodes);
});
2)樹的結構 setting 里面綁定 點擊事件 onclick
3)onclik()方法 判斷表格區/非表格區 插入所點擊節點
4)insNewNodeHtml(columnName, columnCnName, nodeType) 插入到頁面
A.獲取頁面中的FCK對象 ?var oEditor = FCKeditorAPI.GetInstance('MyTextarea');
B.判斷編輯要插入的內容
newNodeStr = "<input id=\"" + columnName + "\" title=\"" + columnName + "\" value=\"" + columnCnName + "\" _tabdatainput=\"true\" type=\"text\" readonly=\"readonly\" contenteditable=\"false\" style=\"background-color: #66cccc; width: 80px; height: 18px\" />";?
C.利用 FCKeditorAPI工具插入到頁面 ? oEditor.InsertHtml(newNodeStr);
?
 
 
?
三.前臺數據采集查詢 ? 報表采集數據過程
 
 
1.進入當前報表主頁過程
CustomBIController.java ?/reportMainJsp ? 進入 ?reportMainJsp.jsp 頁面
/reportMainJsp
{REPORT_TYPE_NAME=report, ID_MB_REPORT_EXTEND_ATTRS=4CEEF5A9FF8E30DEE0531580140A0B2C, REPORT_NAME=wangdingxinTest2, PWD_SOURCE=cyberark, TADAY_ISORNOT_SEND=Y, BI_IS_VALID=Y, BI_NAME=自定義BI, BI_VERSION=3.2.3, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, CYBERARK_CRED_APPID=appID, MODULE_HTML_PATH=null, UPDATED_DATE=2017-04-12 09:16:36.0, IS_VALID=N, IS_USER_VALIDATION=null, REFRESHURL=null, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-12 09:16:36.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS, imgPath=http://localhost:8080/commonreport//transFile/518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, MONITORSQL=null, PASSWORD=parp1234, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_CRED_FILEPATH=null, REPORT_IS_VALID=Y, CYBERARK_PWD_FOLDER=folder, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, LINES_PER_PAGE=20, DOWNLOAD_TYPE=CSV, EOA_FINISH_SEND=N, CYBERARK_PWD_KEY=key, DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, REPORT_DESC=wangdingxinTest2基礎報表測試, DISPATCH_URL=http://localhost:8080/commonreport/, IS_REGULAR=N, UPDATED_BY=WANGYUPENG002, CYBERARK_PWD_SAFE=safe, REPORT_ACC_TYPE=API, SQLMAPPER=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, HEAD_EXCEL_PATH=null, USERNAME=parpdata, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_REPORT_INFO=4CEEF5A9FF8C30DEE0531580140A0B2C, STATEMENT_ID=null, HEAD_HTML_PATH=null}
1)獲取reportid?
TokenDTO token = new TokenDTO(tokenString);
paramMap.put("reportid", token.getReportId());
2)根據reportid 查找報表配置基本信息
Map<String, String> contentAndView = reportInfoService.queryReportExtendAttributes(paramMap);
3)根據查詢結果初始化 報表配置信息,并判斷是否準備好數據
if ("Y".equals(MONITOR_IS_VALLID)) {
resultMonitorInfo = (Map<String, String>) customQueryService
.getResultMonitorInfo(contentAndView);
}
 
 
4)返回 進入 報表頁面 ? reportMain.jsp ? 問題://是reportMain.jsp 嗎? ?那后面的/reportHead ?是 怎么進去的?
return "reportMain";
5)reportMain.jsp ?加載Iframe src ?進入裝在報表頭的 方法 ? CustomBiController.java ?/reportHead
frame.src="<c:url value='/api/reportHead?reportid=${reportid}&remoteFlag=${remoteFlag}&isEoa=${isEoa}&eoasessionid=${eoasessionid}&pafaRetViewType=jsp'/>"; ?
 
 
6)reportHead 方法查找報表的基礎 配置信息及 寫入的路勁 ? ? ? ? ? ? ? ? ? ? ?518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/
Map<String, String> contentAndView = customQueryService.getReportViewAndContent(reportId);
查詢modelname List<ReportModuleDTO> mdList = reportModuleService.queryModname(map);
IS_REGULAR=null ?Map resultData = customQueryService.initReportData(contentAndView,storageRootPath + contentAndView.get("content"));
查詢報表名字 配置源基本信息 ? Map reportMap = reportInfoService.queryExtendAttr(reportId);
?
contentAndView={uid=WANGYUPENG002, REPORT_TYPE_NAME=report, BI_IS_VALID=Y, IS_USER_VALIDATION=null, REFRESHURL=null, imgPath=http://localhost:8080/commonreport//transFile/518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_PWD_FOLDER=folder, REPORT_IS_VALID=Y, LINES_PER_PAGE=20, EOA_FINISH_SEND=N, DOWNLOAD_TYPE=CSV, content=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, CYBERARK_PWD_KEY=key, CYBERARK_PWD_SAFE=safe, UPDATED_BY=WANGYUPENG002, USERNAME=parpdata, view=customBIReport/commonReport, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_MB_REPORT_EXTEND_ATTRS=4CEEF5A9FF8E30DEE0531580140A0B2C, operateid=237EB31270724C02B857DE5D70BEB55D, TADAY_ISORNOT_SEND=Y, PWD_SOURCE=cyberark, REPORT_NAME=wangdingxinTest2, BI_VERSION=3.2.3, BI_NAME=自定義BI, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, MODULE_HTML_PATH=null, CYBERARK_CRED_APPID=appID, UPDATED_DATE=2017-04-12 09:16:36.0, IS_VALID=N, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-12 09:16:36.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS, ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, MONITORSQL=null, PASSWORD=parp1234, CYBERARK_CRED_FILEPATH=null, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, REPORT_DESC=wangdingxinTest2基礎報表測試, IS_REGULAR=N, DISPATCH_URL=http://localhost:8080/commonreport/, REPORT_ACC_TYPE=API, SQLMAPPER=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, HEAD_EXCEL_PATH=null, ID_REPORT_INFO=4CEEF5A9FF8C30DEE0531580140A0B2C, STATEMENT_ID=null, HEAD_HTML_PATH=null}
reportMap={REPORT_TYPE_NAME=report, ID_MB_REPORT_EXTEND_ATTRS=4CEEF5A9FF8E30DEE0531580140A0B2C, REPORT_NAME=wangdingxinTest2, PWD_SOURCE=cyberark, TADAY_ISORNOT_SEND=Y, BI_IS_VALID=Y, BI_NAME=自定義BI, BI_VERSION=3.2.3, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, CYBERARK_CRED_APPID=appID, MODULE_HTML_PATH=null, UPDATED_DATE=2017-04-12 09:16:36.0, IS_USER_VALIDATION=null, REFRESHURL=null, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-12 09:16:36.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS, ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, PASSWORD=parp1234, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_CRED_FILEPATH=null, REPORT_IS_VALID=Y, CYBERARK_PWD_FOLDER=folder, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, LINES_PER_PAGE=20, DOWNLOAD_TYPE=CSV, EOA_FINISH_SEND=N, CYBERARK_PWD_KEY=key, DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, REPORT_DESC=wangdingxinTest2基礎報表測試, DISPATCH_URL=http://localhost:8080/commonreport/, IS_REGULAR=N, UPDATED_BY=WANGYUPENG002, CYBERARK_PWD_SAFE=safe, REPORT_ACC_TYPE=API, SQLMAPPER=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, HEAD_EXCEL_PATH=null, USERNAME=parpdata, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_REPORT_INFO=4CEEF5A9FF8C30DEE0531580140A0B2C, STATEMENT_ID=null, HEAD_HTML_PATH=null}
7)返回到 contentAndView.get("view") ? customBIReport/commonReport ?進入 commonReport.jsp 頁面
8)commonReport.jsp ?加載JS
A.temp.html ?加載tableLoadComponentData()方法 ? ?parp-table.js?
<div id="table_jB06XSUFFp"><script type='text/javascript'>tableLoadComponentData("{\"cols\":[{\"headName\":\"報表名\",\"colname\":\"NAME\"},{\"headName\":\"用戶名\",\"colname\":\"OPR_USERNAME\"},{\"headName\":\"是否有效\",\"colname\":\"IS_VALID\"},{\"headName\":\"訪問量\",\"colname\":\"ACC_TYPE\"}],\"sqlid\":\"SQL_KZsxPqMkvG\",\"type\":\"table\",\"isPage\":true,\"componentID\":\"table_jB06XSUFFp\",\"title\":\"\"}",'table_jB06XSUFFp','N')</script></div>
 <script type='text/javascript'>$(function(){if(null!=reportTitle||""!=reportTitle){$('#table_title').html(reportTitle);$('#parpdownload').show();}});</script>
B.tableLoadComponentData 執行加載 parpLoadComponentData()
function tableLoadComponentData(paramJson, divId, columnType, url, recordFlag) {
// 進行必要參數判斷
if (null == paramJson || "" == paramJson || null == divId || "" == divId) {
return;
}
if (null != columnType && "" != columnType && "Y" == columnType) {
jxmColumnJsontoStr(paramJson, divId);
}
parpLoadComponentData(paramJson, divId, url, recordFlag);
}
C. editor-tool.js
加載 parpLoadComponentData ? 異步請求后臺數據,將組裝好的html內容顯示到頁面上。
function parpLoadComponentData(paramJson, divId, url, recordFlag) {
// 進行必要參數判斷 ??
if (null == paramJson || "" == paramJson || null == divId || "" == divId) {
return;
}
var submitUrl = url;
if (url == null || url == "") {
submitUrl = "/commonreport/api/doQueryParpReportData?pafaRetViewType=jsp&reportId=" + reportid;
}
// 創建并記錄執行對象
var dataLoader = new ParpDataLoader(divId, submitUrl, paramJson);
dataLoader.queryData();
var ifRecord = typeof(arguments[3]) != "undefined" ? arguments[3] : true;
if (ifRecord) {
dataLoader.setShadowFlag(true);
parpQueryReportDataAreaMap.put(divId, dataLoader);
}
}
D. ?parp-DataLoader.js ?queryData(); ?查詢進入后臺 /doQueryParpReportData
 
 
9)CustomBiController.java ? /doQueryParpReportData
// 將頁面請求中的參數組裝到json中
executeParamJsonObj.put("requestParam", putAllParameters(request,operateId,parpReportId));
executeParamJsonObj.put("operateid", operateId);
 
// 獲取附加條件參數
JSONObject additionParamJsonObj = jObj.getJSONObject("additionParam");
 
 
return new String(componentHandleChain(umid, parpReportId,
executeParamJsonObj, additionParamJsonObj).getBytes("UTF-8"),
"ISO-8859-1");
}
 
 
 
10)ParpReportController.java ? componentHandleChain()
加載表頭
componentHandleResult = beginHandler.handleParpComponent(umid,
componentType, parpReportId, executeParamJsonObj,
additionParamJsonObj);
 
 
componentHandleResult="<table class="gridtable" width="100%">
<caption class="table_caption"></caption>
<tr>
<th>報表名</th>
<th>用戶名</th>
<th>是否有效</th>
<th>訪問量</th>
</tr>
</table>
<div style="clear:both"></div>"
 
 
 
 
 
<div id="'+shadowID+'" ><img src="/commonreport/images/page/loading-small.gif"/></div>
 
 
 
 
 
 
2.點擊查詢 ?報表查找數據過程 :
commonReport.jsp ?reportMain.jsp ?查詢綁定事件
<input name="查詢" type="button" value="查詢" οnclick="parpRefreshComponentData()"><br>
 
 
1.觸發事件 進入 parpRefreshComponentData(); ? ?parp-report-tools.js?
A.判斷是否是定期采集,若果是定期采集 要驗證采集日期是否填寫,驗證完畢轉移到 審批頁
if(null!=is_myzdcj){
isreportdownload=true;
if(null!=is_regular&&"Y"==is_regular.value){
effective_date=document.getElementById("effective_date");
expiry_date=document.getElementById("expiry_date");
period=document.getElementById("period");
term=document.getElementById("term");
effective_time=document.getElementById("effective_time");
if(!checkDataForMydqcj()){
return false;
}
}
submitToEoanew();
}else{
// 自定義序列化表單內容
$.each(parpQueryReportDataAreaMap.keysRemoveDuplicate(), function(i, field) {
parpQueryReportDataAreaMap.get(this).queryData();
});
}
 
定期采集:
B1.是定期采集 ?驗證完畢進入 submitToEoanew();查詢審批的URL ?。parp-report-tools.js ??
function submitToEoanew() {
var eoaUrl = "";
$.ajax({
type: "GET",
url: "/commonreport/api/queryForEoaUrl?reportId=" + reportid,
async:false,
success: function (data) {
eoaUrl = data + '&callbackFun=getEoaTemplateTmpnew(paramStr)';
}
});
//document.domain = 'paic.com.cn';
document.domain = eoaDomain;
window.open (eoaTemplateUrl + eoaUrl, "_blank",'width=800,height=700,top=100');
}
 
拼接URL和回調函數
回調函數:
1.getEoaTemplateTmpnew();
function getEoaTemplateTmpnew(paramStr){
window.opener.getnewEoaTemplateResultNew('<%=sessionId%>');
window.close();
}
2.getnewEoaTemplateResultNew(); ?parp-report-tools.js?
$.ajax({
type: "POST",
data:datas,
url: "/commonreport/api/queryForEoaAppUrl",
async: false,
success: function (data) {
if (data == "success") {
alert("已生成EOA,EOA審批完成后parp@pingan.com.cn會將數據發送到您的郵箱,請注意查收,謝謝!");
} else {
alert("提交到EOA失敗!");
}
}
});
window.parent.opener = null;
window.parent.open('','_self','');
window.parent.close();
3.后臺 queryForEoaAppUrl(),把定時任務簽報 查詢條件信息插入到表parp_report_eoa_session_detail。 ? SubmitToEoaController.java
 
 
 
? ? B2.進入后臺審批頁面 URL:eoaTemplateUrl + eoaUrl
eoaTemplateUrl="/commonreport/pages/customBIReport/eoaTemplet.jsp?url="
eoaUrl = "http://oas-eoa10-stg1.paic.com.cn/eoa/selectOutSysTemplate.do?requestSysName=PARP_CORE981837949&outSysSessionId=PARP_CORE1375633262&callbackFun=getEoaTemplateTmpnew(paramStr)";
 
 
B3.審批頁面 eoaTemplet.jsp,Ifram src= eoaUrl 跳轉 進入審批頁面 并綁定了回調函數callbackFun=getEoaTemplateTmpnew(paramStr)。
<body>
<table ?align="left" width="100%" cellpadding="0" cellspacing="0">
<tr class="fieldName1">
<td>
<iframe width="100%" name='eoaTemplateIframe' id='eoaTemplateIframe' border="0" cellspacing="0" cellpadding="0" FRAMEBORDER=0
SCROLLING=no Height='650px' src='<%= eoaUrl %>'></iframe>
</td>
</tr>
</table>
</body> ? ?
B4. 點擊確定生產審批流。并執行回調函數 (把定時任務簽報 查詢條件信息插入到表 parp_report_eoa_session_detail )。見回調函數
<input type="button" style="" name="selectTemp" id="selectTemp" value="確 定" οnclick="selectTmpltFlow();" disabled="">
B5.登陸 審批同意通過 ?http://oas-eoa10-stg1.paic.com.cn/eoa/ 。問題:審批同意與外面接口webLogic 回調 執行 是怎么觸發的???同意以此觸發以此嗎? 這個找誰?
? ? ?審批完執行 webLogic 執行回調函數 EoaFeedbackServiceImpl.java 主方法 ? receiveEoaMessage()
?1).修改parp_report_eoa_session_detail 定時任務 簽報信息狀態為Y。updateReportEoaSession(sessionid)
?2).插入定時采集 具體配置任務執行時間到 parp_regular_download_conf
?3)線程發送郵件
B6. receiveEoaMessage()
?定時采集 審批完插入定時采集 具體配置任務執行時間到 parp_regular_download_conf,并發送。executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
?定時采集 ?沒選定時的 ? 直接發送。executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
?if (updateReportEoaSession(sessionid) > 0) {
EoaSessionDetailDTO eoaDTO = querySessionDetail(sessionid);
Map mapVal = new HashMap();
ManipulateEoaUtil.assembleQueryMap(eoaDTO.getQuery_condition(),
mapVal);
// 獲取根據報表ID獲取關聯信息
Map<String, String> reportInfoMap = supportService
.queryReportInfo(eoaDTO.getId_report_info());
if (null != mapVal.get("is_regular")
&& "Y".equals(mapVal.get("is_regular"))) {
insertDownloadConf(eoaDTO, mapVal);
//設置為如果審批完就發送
 
if(reportInfoMap.get("EOA_FINISH_SEND").equals("Y")){
executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
}
} else {
executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
}
 
 
} else {
log.error("update sessionid id error or sessionid not found, sesssid="
+ sessionid + " !!!!!!!!!!!!!!!!!!");
}
?
?
?
B7.executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
private void executeDownloadTask(Map<String, String> reportInfoMap,
EoaSessionDetailDTO eoaDTO, Map eoaVal) throws Exception {
Map mapVal = new HashMap();
String dispatchUrl = reportInfoMap.get("DISPATCH_URL");
 
 
// 通過dispatchUrl判斷是否調用report服務
if (dispatchUrl.contains("commonreport")) {
// 調用report接口進行下載
mapVal.put("umid", eoaDTO.getUmid());
mapVal.put("eoasessionid", eoaDTO.getEoa_session_id());
TransmitUtil.requestRemoteHttpServiceWithoutReponse(dispatchUrl
+ "/api/submitEoaExportTask", mapVal);
} else {
executeLocalEoaDownloadTask(eoaDTO, eoaVal);
}
}
 
 
private void executeLocalEoaDownloadTask(EoaSessionDetailDTO eoaDTO,
Map mapVal) throws Exception {
 
 
ReflectUtil.setTitleThreadLocal(new HashMap());
FileTaskDTO dto = new FileTaskDTO(reportInfoService, mapVal,
eoaDTO.getUmid(), mailSAO);
dto.setEoaModule("EOAMODULE");
downloadThreadPool.submitTask(new AsyncDownloadExcelFileTask(dto,
customQueryService));
}
 
B8.線程執行數據采集,測試郵箱生成載鏈接發送郵件
 
 
 
 
實時采集
C1.不是定期采集 普通的查詢,自定義序列化表單內容
$.each(parpQueryReportDataAreaMap.keysRemoveDuplicate(), function(i, field) {
parpQueryReportDataAreaMap.get(this).queryData();
});
 
c2.parpDataLoader.queryData(); ? parp-dataLoader.js?
$.ajax({
type:"POST",
data: "parpQueryDataJson=" + queryCondition,
url: ?this.submitUrl,
beforeSend:function(){
if(shadowFlag){
var _height=$("#"+divId).height(),_width =$("#"+divId).width(),_top=$("#"+divId).offset().top,_left=$("#"+divId).offset().left;
$('body').append('<div id="'+shadowID+'" ><img src="/commonreport/images/page/loading-small.gif"/></div>');
$("#"+shadowID+" img").css({'margin-left':(_width/2-22)+'px','margin-top':(_height/2-10)+'px'});
$("#"+shadowID).css({'width':_width+'px','height':_height+'px','top':_top+'px','left':_left+'px'});
$("#"+shadowID).addClass("report_shadow");
}
},
 
 
this.submitUrl="/commonreport/api/doQueryParpReportData?pafaRetViewType=jsp&reportId=4CEEF5A9FF8C30DEE0531580140A0B2C"
 
 
ParpReportController.java
? ? C3.doQueryParpReportData(){
return new String(componentHandleChain(umid, parpReportId,
executeParamJsonObj, additionParamJsonObj).getBytes("UTF-8"),
"ISO-8859-1");
}
?
C4.componentHandleChain(){
// 構造責任鏈
ParpComponentHandlerService beginHandler = parpComponentHandlerChainService.getParpComponentHandlerChain();
String componentHandleResult = beginHandler.handleParpComponent(umid,componentType, parpReportId, executeParamJsonObj,additionParamJsonObj);
return componentHandleResult == null ? "" : componentHandleResult;
}
c5.ParpComponentHander.java ?
任務鏈主方法
public String handleParpComponent(String umid, String componentType,
String parpReportId, JSONObject executeParamJsonObj,
JSONObject additionParamJsonObj) {
 
 
if (componentType.equals(this.getComponentType())) {
return this.handle(umid, componentType, parpReportId,
executeParamJsonObj, additionParamJsonObj);
} else {
if (this.parpComponentHandler == null) {
return "";
} else {
return this.parpComponentHandler.handleParpComponent(umid,
componentType, parpReportId, executeParamJsonObj,
additionParamJsonObj);
}
}
}
 
executeParamJsonObj={"requestParam":{"pafaRetViewType":"jsp","reportId":"4CEEF5A9FF8C30DEE0531580140A0B2C"},"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"operateid":"73DE5721EF4D4A6D834FFD83B9B22084","cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}}
additionParamJsonObj={"componentParam":{"title":"","cols":[{"colname":"NAME","headName":"報表名"},{"colname":"OPR_USERNAME","headName":"用戶名"},{"colname":"IS_VALID","headName":"是否有效"},{"colname":"ACC_TYPE","headName":"訪問量"}],"type":"table","isPage":true,"componentID":"table_jB06XSUFFp","sqlid":"SQL_KZsxPqMkvG"},"userCheckTableColumn":{}}
 
c6.進入到查詢的handler(). ?ParpTableHandler.java?
封裝SQL。寫日志,配置數據源,執行查詢,根據模板把查詢數據填進去,設置HTML 再反回到頁面
handler(){
Map resultMap = customQueryService.createSqlIdMapTab(tableDTO,paramMap, extendAttrMap);
tableDTO.setQueryData((List) ((Map) resultMap.get("dataMap")).get(tableDTO.getSqlID()));
 
BeetTemplateUtil.render(tableDTO);
return tableDTO.getHtml();
}
 
createSqlIdMapTab(){
PARPDatasource.updateDataSource(extendAttrMap);
bindUserInfoToMap(extendAttrMap.get("uid"), mapVal,extendAttrMap);
bindUserUserclassNameToMap(extendAttrMap.get("uid"), "個險-新客服", mapVal,extendAttrMap);
String sql = BeetlKit.render(tableDTO.getSql(), mapVal);
dataMap.put(tableDTO.getSqlID(),
doWithPluginQuery(mapVal, tableDTO.isPage(), extendAttrMap));
Map titleMap = ReflectUtil.getTitleThreadLocal();
resultMap.put("titleMap", titleMap);
resultMap.put("dataMap", dataMap);
return resultMap;
}
 
查數據
doWithPluginQuery(){
writeToLog(extendAttrMap,"[##doWithPluginQuery begin end--]");
session = MybatisUtil.getSessionFactory().openSession();
if ("org.apache.hive.jdbc.HiveDriver".equals(extendAttrMap
.get("DRIVER_CLASS"))
&& null != extendAttrMap.get("HADOOP_QUEUE_CONF")
&& "" != extendAttrMap.get("HADOOP_QUEUE_CONF")) {
Map hadoopSetMap = new HashMap();
hadoopSetMap.put("sql", "set mapred.job.queue.name="
+ extendAttrMap.get("HADOOP_QUEUE_CONF"));
queryResult(hadoopSetMap, session);
}
mapVal.put("isPage", isPage);
return queryResult(mapVal, session);
 
}
 
模板封裝類
BeetTemplateUtil.java?
public static void render(TableDTO tableDTO) throws Exception {
Map mapVal = new HashMap();
if (TABLETYPE.equals(tableDTO.getType())) {
mapVal.put("queryData", tableDTO.getQueryData());
mapVal.put("head", tableDTO.getHead());
mapVal.put("pageDTO", tableDTO.getPageDTO());
mapVal.put("tablename", tableDTO.getTableName());
mapVal.put("divID", tableDTO.getDivID());
mapVal.put("tableTitle", tableDTO.getTableTitle());
tableDTO.setHtml(tempLate(tableDTO.getTableTempName(), mapVal));
} else if (HIVETYPE.equals(tableDTO.getType())) {
mapVal.put("queryData", tableDTO.getQueryData());
mapVal.put("head", tableDTO.getHead());
mapVal.put("limit", tableDTO.getLimit());
int totalPage = calcTotalPage(tableDTO.getQueryData().size(),
tableDTO.getLimit());
Map pagintionData = getPagintionDataInHive(tableDTO, totalPage);
mapVal.put("pagintionData", JSON.toJSON(pagintionData));
mapVal.put("totalPage", totalPage);
tableDTO.setHtml(tempLate(HIVENAME, mapVal));
} else if (ECHARTTYPE.equals(tableDTO.getType())) {
renderEChart(tableDTO);
} else if (CONTENTTYPE.equals(tableDTO.getType())) {
String content = readTxtFile(new FileInputStream(
tableDTO.getStorageRootPath() + "content.html"));
List list = tableDTO.getQueryData();
if (list != null && list.size() > 0) {
Map map = tableDTO.getQueryData().get(0);
tableDTO.setHtml(BeetlKit.render(content, map));
}
 
 
}
}
 
根據模板填數,把查詢結果的數據填寫到模板中生產str
模板代碼:table_new_default.txt ??
D:\Users\WANGDINGXIN732\Desktop\PARP_TOMCAT\tomcat-7.0.52\webapps\commonreport\WEB-INF\classes
BeetTemplateUtil。java
public static String tempLate(String txtName, Map mapVal)
throws IOException {
String classRoot = StringUtils.substringBeforeLast(
BeetTemplateUtil.class.getClassLoader().getResource(txtName)
.getPath(), "/");
GroupTemplate gt = new GroupTemplate(new FileResourceLoader(classRoot),
Configuration.defaultConfiguration());
Template t = gt.getTemplate("/" + txtName);
t.binding(mapVal);
return t.render();
}
 
問題:createSqlIdMapTab ?怎么調用的?
bindUserInfoToMap(extendAttrMap.get("uid"), mapVal,extendAttrMap);
bindUserUserclassNameToMap(extendAttrMap.get("uid"), "個險-新客服", mapVal,extendAttrMap);
dataMap.put(tableDTO.getSqlID(),doWithPluginQuery(mapVal, tableDTO.isPage(), extendAttrMap));
 
bindUserUserclassNameToMap?
mapVal.put("PARP_USER_USERCLASS_NAME", userRightQueryService.queryUserUserclassNameByRootName(umid, rootName));
PARP_USER_USERCLASS_NAME={username=, starttime=, umId=WANGYUPENG002, reportid=4CEEF5A9FF8C30DEE0531580140A0B2C, pageDTO=com.paic.reportportal.adapter.mybatisadapter.util.PageDTO@13755b5, PARP_USER_USERCLASS_NAME=[個險-新客服], currentPage=null, PARP_USER_INFO=com.paic.reportportal.exhibition.dto.UserDTO@1eeb142, reportname=}
doWithPluginQuery?
queryResult(mapVal, session);
 
 
 
 
 
 
 
 
/reportHead
 
{REPORT_TYPE_NAME=eoa_report, ID_MB_REPORT_EXTEND_ATTRS=4C9240E05E897E90E0531580140A835E, REPORT_NAME=wangdingxinTest, PWD_SOURCE=cyberark, TADAY_ISORNOT_SEND=Y, BI_IS_VALID=Y,?
BI_NAME=自定義BI, BI_VERSION=3.2.3, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, CYBERARK_CRED_APPID=appID, MODULE_HTML_PATH=null, UPDATED_DATE=2017-04-11 15:00:12.0, IS_USER_VALIDATION=null,?
REFRESHURL=null, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-07 18:40:26.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS,?
ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, PASSWORD=parp1234, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_CRED_FILEPATH=null, REPORT_IS_VALID=Y,?
CYBERARK_PWD_FOLDER=folder, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, LINES_PER_PAGE=20, DOWNLOAD_TYPE=CSV, EOA_FINISH_SEND=Y, CYBERARK_PWD_KEY=key,
DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, REPORT_DESC=wangdingxinTest當日發送批量修改測試01,?
DISPATCH_URL=http://localhost:8080/commonreport/, IS_REGULAR=N, UPDATED_BY=WANGYUPENG002, CYBERARK_PWD_SAFE=safe, REPORT_ACC_TYPE=API,?
SQLMAPPER=792/135/234/8D40A7974DBF6B9B56E4E7D513C867DD/, HEAD_EXCEL_PATH=null,?
USERNAME=parpdata, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_REPORT_INFO=4C9240E05E877E90E0531580140A835E, STATEMENT_ID=null, HEAD_HTML_PATH=null}
 
 
 
 
 
MB_REPORT_EXTEND_ATTRS
 
 
 
 
[{"nameArray":"[{'name':'NAME','asname':'NAME'},{'name':'OPR_USERNAME','asname':'OPR_USERNAME'},{'name':'IS_VALID','asname':'IS_VALID'},{'name':'COUNT','asname':'COUNT'}]","sql":"SELECT R.NAME AS NAME,L.OPR_USERNAME AS OPR_USERNAME,R.IS_VALID AS IS_VALID,R.ACC_TYPE AS COUNT FROM PARP_REPORT_OPR_LOG L, PARP_REPORT_OPR_INFO I, PARP_REPORT_INFO R WHERE L.QUERY_ID = I.QUERY_ID AND I.ID_REPORT_INFO = R.ID_REPORT_INFO <%if(reportname!=null&&reportname!=''){%> AND R.NAME LIKE '%'||#{reportname}||'%'<%}%> <%if(username!=null && username!=''){%> AND L.OPR_USERNAME LIKE '%'||#{username}||'%' <%}%><%if(starttime!=null && starttime!=''){%> AND to_char(L.CREATED_DATE,'YYYY-MM-DD')>=#{starttime}<%}%> ",
"sqlname":"SQL_wdxTest"},{"nameArray":"[{'name':'NAME','asname':'報表名稱'},{'name':'OPR_USERNAME','asname':'用戶名'},{'name':'IS_VALID','asname':'是否有效'},{'name':'COUNT(L.ID_REPORT_OPR_LOG)','asname':'訪問量'}]","sql":"SELECT R.NAME AS 報表名稱, ? ? ? L.OPR_USERNAME AS 用戶名, ? ?r.IS_VALID as 是否有效, ? COUNT(L.ID_REPORT_OPR_LOG) AS 訪問量 FROM PARP_REPORT_OPR_LOG L, PARP_REPORT_OPR_INFO I, PARP_REPORT_INFO R WHERE L.QUERY_ID = I.QUERY_ID ? AND I.ID_REPORT_INFO = R.ID_REPORT_INFO ? <%if(reportname!=null&&reportname!='')%> ? ?AND r.name LIKE '%'||#{reportname} ||'%' ?<%if(username!=null&&username!='')%> ? AND l.opr_username = #{username} ?<%if(starttime!=null&& starttime!='')%> ? AND to_char(L.created_date,'yyyy-mm-dd') >= #{starttime} ?<%if(valid!=null&&valid!=''){%>AND r.is_valid in ('${valid}')<%}%> ?GROUP BY R.ID_REPORT_INFO, R.NAME, L.OPR_USERNAME, ?r.IS_VALID",
"sqlname":"SQL_wdx_test0411"},{"nameArray":"[{'name':'dd','asname':'dd'}]","sql":"sss","sqlname":"SQL_vnURF7CGuj"}]
 
 
{attrDto={
ID_MB_REPORT_EXTEND_ATTRS=4C9240E05E897E90E0531580140A835E, ID_REPORT_EXTEND_ATTRS=4C9240E05E897E90E0531580140A835E, TADAY_ISORNOT_SEND=Y, MODULE_HTML_PATH=null,?
UPDATED_DATE=2017-04-11 15:00:12.0, EOA_FINISH_SEND=Y, DOWNLOAD_TYPE=CSV, CREATED_BY=WANGYUPENG002, CREATED_DATE=2017-04-07 18:40:26.0, UPDATED_BY=WANGYUPENG002,?
IS_REGULAR=N, SQLMAPPER=792/135/234/8D40A7974DBF6B9B56E4E7D513C867DD/, HEAD_EXCEL_PATH=null, ID_REPORT_INFO=4C9240E05E877E90E0531580140A835E, STATEMENT_ID=null,?
HEAD_HTML_PATH=null}, monitorData={MONITORSQL=null, ID_REPORT_INFO=4C9240E05E877E90E0531580140A835E, IS_VALID=N},
?mctDto=com.paic.reportportal.admin.dto.MailContentTemplateDTO@e9fd6c, eoaReportTypeId=0CC3C92BEFF847C0E0531480140A2241,
?typeList=[com.paic.reportportal.admin.dto.ReportType@111537a, com.paic.reportportal.admin.dto.ReportType@11153b5, com.paic.reportportal.admin.dto.ReportType@11153ef, com.paic.reportportal.admin.dto.ReportType@1115429, com.paic.reportportal.admin.dto.ReportType@1115465, com.paic.reportportal.admin.dto.ReportType@111549f, com.paic.reportportal.admin.dto.ReportType@11154db, com.paic.reportportal.admin.dto.ReportType@1115517, com.paic.reportportal.admin.dto.ReportType@1115554, com.paic.reportportal.admin.dto.ReportType@1115591, com.paic.reportportal.admin.dto.ReportType@11155d9, com.paic.reportportal.admin.dto.ReportType@111561e, com.paic.reportportal.admin.dto.ReportType@111565a, com.paic.reportportal.admin.dto.ReportType@1115696, com.paic.reportportal.admin.dto.ReportType@11156d0, com.paic.reportportal.admin.dto.ReportType@111570b, com.paic.reportportal.admin.dto.ReportType@1115745, com.paic.reportportal.admin.dto.ReportType@111578e, com.paic.reportportal.admin.dto.ReportType@11157ca, com.paic.reportportal.admin.dto.ReportType@1115804, com.paic.reportportal.admin.dto.ReportType@111585f, com.paic.reportportal.admin.dto.ReportType@111589b, com.paic.reportportal.admin.dto.ReportType@11158d6, com.paic.reportportal.admin.dto.ReportType@1115911]}
 
 
 
 
 
 
 
 
 
 
報表 數據查找的時候 最終生成的HTML代碼。
模板代碼:table_new_default.txt ??
D:\Users\WANGDINGXIN732\Desktop\PARP_TOMCAT\tomcat-7.0.52\webapps\commonreport\WEB-INF\classes
<table class="gridtable" width="100%">
<caption class="table_caption"></caption>
<tr>
<th>報表名</th>
<th>用戶名</th>
<th>是否有效</th>
<th>訪問量</th>
</tr>
<tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>子系統清單-PER及時完成率</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr><tr><td>管理報表_成本分類、成本屬性多維分析表</td><td>LIUBAO677</td><td>Y</td><td>SSO</td></tr><tr><td>2.月查詢-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>5.中心KPI單項指標_PER需求實現率</td><td>LIUBAO677</td><td>Y</td><td>SSO</td></tr><tr><td>6.中心KPI單項指標_非項目規范性</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PIR及時解決率(部門)</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>月查詢-PIR及時解決率(部門)</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-人均實現PER數量(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-人均實現PER數量(部門)</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr>
</table>
<div class="search_page" style="width: 95%;">
<div class="pagination">
<ul>
<li class="disablepage">上一頁</li>
<li class="currentpage">1</li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',2)">2 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',3)">3 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',4)">4 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',5)">5 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',6)">6 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',7)">7 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',8)">8 </a></li>
<li><a href="javascript:void(0)"οnclick="topageno('table_jB06XSUFFp',2)">下一頁</a> </li>
<li><a href="javascript:void(0)"οnclick="topageno('table_jB06XSUFFp',5357)">尾頁</a> </li>
<li class="currentpage">共 5357 頁</li>
<li class="currentpage">共 ?107123 條數據</li>
</ul>
</div>
</div>
<!--搜索結果頁碼/翻頁結束-->
<div style="clear:both"></div>
 
 
 
 
 
 
 
 
 
 
 
 
定時器工作步驟:
1.bi-context-quarz.xml ?配置定時采集job作業類、配置作業調度方式、配置調度工廠
A。配置定時采集job作業類
<bean id="quartzTaskDownLoad3" class="com.paic.reportportal.admin.biz.quartz.QuartzTaskDownLoad">
<property name="period">
<bean id="com.paic.reportportal.admin.biz.quartz.QuartzDownLoadPeriod.Day" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> </bean>
</property>
</bean>
<bean id="dayDownLoadRunJobDetail" class="com.paic.pafa.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.paic.pafa.scheduling.quartz.ContextPojoJobInvoker</value>
</property>
<property name="jobDataAsMap"> ?
<map>
<entry key="beanID">
<value>quartzTaskDownLoad3</value>
</entry> ? ? ? ? ? ? ?
<entry key="methodName">
<value>run</value>
</entry>
</map> ?
</property>
<property name="group">
<value>${org.quartz.group.name}</value>
</property>
</bean>
B.配置作業調度觸發方式?
<bean id="dayDownLoadQuartzTaskRunTrigger" class="com.paic.pafa.scheduling.quartz.CronTriggerBean">
<property name="cronExpression">
<value>${download.QuartzTask.day.time}</value>
</property>
<property name="jobDetail">
<ref local="dayDownLoadRunJobDetail" />
</property>
<property name="group">
<value>${org.quartz.group.name}</value>
</property>
</bean>
C.配置調度工廠<!--定義scheduler -->
<bean id="schedulerFactory" class="com.paic.pafa.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false">
<!--?
<property name="calendars">
<map>
<entry key="weekendCalendar">
<ref local="weekendCalendar" />
</entry>
</map>
</property>
-->
<property name="triggers">
<list>
<ref local="lifeQuartzTaskComputeCronTrigger" />
<ref local="lifeQuartzTaskSendMailRunTrigger" />
<ref local="adminQuartzTaskDeleteFileRunTrigger" />
<ref local="adminQuartzTaskComputeCronExpRunTrigger" />
<ref local="statisticsRunTrigger" />
<ref local="nasMonitorRunTrigger" />
<ref local="cognosMonitorRunTrigger" />
<ref local="dayDownLoadQuartzTaskRunTrigger" />
<ref local="noticeLockedUserRunTrigger" />
<ref local="batchReportMailRunTrigger" />
</list>
</property>
。。。。
</bean>
 
2.到時間 進入作業類,觸發作業方法 執行run()
QuartzTaskDownLoad.java ,run()
public void run() throws Exception {
log.info("============QuartzTaskDownLoad run=====period=" + period);
Map map = new HashMap();
queryDownLoadConf(map);
}
3.執行queryDownLoadConf(map);查詢數據庫中的數據采集定時任務列表
List<Map> list = downloadConfService.queryDownLoad(map);
for (Map maps : list) {
if(maps.get("TADAY_ISORNOT_SEND")==null||maps.get("TADAY_ISORNOT_SEND").equals("Y")){
appForward(maps);
}
}
4.appForward(maps)。配置URL ?postMethod, HttpClient 發送請求
public int appForward(Map map) throws Exception {
String url = getDispatchURL(String.valueOf(map.get("ID_REPORT_INFO")))
+ "api/downloadCollectionTask.do";
log.info("============QuartzTaskDownLoad run=====url=" + url);
PostMethod postMethod = new PostMethod(url);
Part[] parts = {
new StringPart("eoasessionid", URLEncoder.encode(
String.valueOf(map.get("EOA_SESSION_ID")), "utf-8")),
new StringPart("period", URLEncoder.encode(
String.valueOf(map.get("PERIOD")), "utf-8")) };
postMethod.setRequestEntity(new MultipartRequestEntity(parts,
postMethod.getParams()));
log.info("---EOA_SESSION_ID-------"
+ String.valueOf(map.get("EOA_SESSION_ID")));
log.info("============QuartzTaskDownLoad postMethod======");
log.info(postMethod);
HttpClient httpClient = new HttpClient();
// 執行請求發送
return httpClient.executeMethod(postMethod);
}
 
 
5.進入 /downloadCollectionTask 任務方法 組合封裝數據。ExportController.java
submitExportTask(mapVal, (String) mapVal.get("umid"), true);
6.submitExportTask()方法。ExportController.java
private void submitExportTask(Map mapVal, String umid, boolean isEoa) {
log.info("============submitExportTask========");
fileLogService.log((String)mapVal.get("operateid"), "============submitExportTask========", (String)mapVal.get("reportid"));
log.info(mapVal);
fileLogService.log((String)mapVal.get("operateid"), mapVal.toString(),(String)mapVal.get("reportid") );
FileTaskDTO dto = new FileTaskDTO(exportService, mapVal, umid, mailSAO,
reportInfoService, umSearchService, userRightQueryService,fileLogService);
if (isEoa) {
dto.setMailModule("EOAMODULE");
}
 
 
recordExportInfoAndSubmitTask(mapVal, umid, dto);
}
7.recordExportInfoAndSubmitTask()。ExportController.java
downloadThreadPool.submitTask(new ExportTask(fileTaskDto, idExport),idExport);
 
8.submitTask() 提交任務 DownloadThreadPool.java?
public void submitTask(Runnable task, String idExport) {
log.info("==Before submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
executor.submit(task);
log.info("==After submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
}
 
 
 
9.ExportTask.Java。線程執行run()方法。 任務的主題方法 發送郵件/下載
 
 
 
 
 
 
 
 
查詢數據庫數據采集定時任務列表SQL
<select id="downloadn.select.download" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
select ?t.effective_date,t.expiry_date,t.period,t1.eoa_session_id, t1.query_condition, t1.umid, t1.id_report_info,t2.taday_isornot_send ?
from?
? ?(select t.id_parp_eoa_session,t.period,t.effective_date,t.expiry_date,effective_time from PARP_REGULAR_DOWNLOAD_CONF t where upper(period)='DAY'
? ? ? union?
? ?select t.id_parp_eoa_session,t.period,t.effective_date,t.expiry_date,effective_time from PARP_REGULAR_DOWNLOAD_CONF t where upper(period)='MONTH' and instr(term,#month#)>0
? ? ? union?
? ?select t.id_parp_eoa_session,t.period,t.effective_date,t.expiry_date,effective_time from PARP_REGULAR_DOWNLOAD_CONF t where upper(period)='WEEK' and instr(term,#week#)>0) t?
? ?,parp_report_eoa_session_detail t1,PARP_MB_REPORT_EXTEND_ATTRS t2,parp_report_info t3
where t1.eoa_session_id=t.id_parp_eoa_session?
?and t1.id_report_info=t2.id_report_info
?and t2.id_report_info=t3.id_report_info
? ? ? and t3.is_valid='Y'
 
<![CDATA[
?and to_date(t.effective_date,'yyyy-mm-dd')<=to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd')
]]>
<![CDATA[
and ?to_date(t.expiry_date,'yyyy-mm-dd')>=to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd')
]]>
<![CDATA[
and to_date(t.effective_time,'HH24:mi')<=to_date(#end#,'HH24:mi') and to_date(t.effective_time,'HH24:mi')>=to_date(#start#,'HH24:mi')
?]]>
</select>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
報表編譯舊方法(上傳寫好的壓縮包)
 
 
1)前臺頁面鏈接 ?MB_REPORT_EXTEND_ATTRS.jsp?
<input type="text" style="display:none" name="extend_attrs_sqlmapper" id="extend_attrs_sqlmapper" size="50" value="${attrDto.SQLMAPPER}" isval="false"/>
<span id="filename"></span>
<span style="display:none;" id="showloading"><img src="/parp/images/page/loading-small.gif"/></span>      
<span οnclick="$(this).uploadFile(
{'i_name':'extend_attrs_sqlmapper',
'i_url':'<c:url value='/api/getTokenInfo?pafaRetViewType=js'/>',
'_ajax':true,
'callbackurl':'<c:url value='/api/admin/memoryreport/rebackFilePath?pafaRetViewType=jsp&filepath='/>'
}
)"?
id="uploadspanextend_attrs_sqlmapper" style="cursor:pointer">報表配置上傳</span>;
 
 
2)進入后臺 ?MemoryReportController.java ? ? /rebackFilePath
return "/admreport/rebackFilePath";
3) 在MB_REPORT_EXTEND_ATTRS.jsp ? ?加載 rebackFilePath.jsp 頁面?
<script language="javaScript">
window.parent.parent.reback(window.parent.parent.uploadArray.i_name,decodeURI('${filepath}'));
</script>
4)加載jquery-upload.js js方法 ? ?uploadArray.showUpload ? 加載上傳文件的文件筐 綁定提交方法
showUpload:function(target){
uploadArray.popUpShowing=true;
if($(target).val()==""||$(target).val()==null){
var y=$(target).offset().top;
var x=$(target).offset().left;
var i_h=$(target).width();
var input_file="<div class='up_ipt'><input type='file' name='file_name' id='file_name' size='"+$(target).attr('size')+"'/></div><div class='up_btn'>upload..</div>";
$("#upload_div").css({'position':'absolute','top':y-1+'px','left':x+'px','z-index':'999'}).empty().append(input_file);
$('.up_btn').click(uploadArray._ajaxEvent);
}
}
5)點擊提交 執行提交方法 uploadArray._ajaxEvent?
_ajaxEvent:function(e){
if(uploadArray._ajax){
uploadArray._ajaxjson();
}else{
uploadArray._ajaxfile();
}
}
6)進入 _ajaxfile js 方法?
_ajaxfile:function(e){
uploadArray.popUpShowing=true;
var id=uploadArray.i_name;
$.ajaxFileUpload({
?data:{'token':uploadArray.token,'callbackurl':''},
?url:uploadArray.i_url!=""?uploadArray.i_url:'/parp/api/upLoadFile?pafaRetViewType=jsp',
?secureuri:false, ? ? ? ? ? ? ? ? ? ? ??
?fileElementId: 'file_name', ? ? ? ? ??
?dataType:'text', ? ? ? ? ? ? ? ? ? ? ?
?success:function(data, status){
$('#'+id).val($.trim(data));
$('#'+id).css('color','red');
uploadArray.hideupload();
?},
?error:function(data, status, e){
?alert("上傳失敗,請重試!");
?}
?});
},
 
7)進入上傳文件的后臺Action ?UpLoadFileController.java ? /upLoadFile
把上傳的文件寫到 新模板編譯的地址里面去,相當于轉換成老方法
點擊上傳 寫文件
 
 
8)點擊確認把 上傳文件保存路徑 寫到DB中去
見 新增保存插入報表基本信息/存儲路徑過程:
 
 
 
 
 
<html><body>
<iframe name="callbackiframe" src="http://localhost:7001/parp/api/admin/memoryreport/rebackFilePath?pafaRetViewType=jsp&filepath=534/393/976/B76E0CF3CDC947498E65E0689CCCA2DC/">
</iframe>
</body></html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
報表下載
1)報表查詢主頁面CommonReport.jsp ?執行下載方法
<div class="icon_down"><a href="javascript:void(0);" οnclick="showdowanload(this);"></a>
2)parp-table.js ?showdowanload() function
添加下載div ?鏈接 ?<div><a href=\"javascript:void(0)\" οnclick=\"parpDownloadComponentData('" + divId + "')\">" + name + "</a></div>";
3)點擊 進入方法 parpDownloadComponentData(),執行下載方法 ? ; ?parp-report-tools.js
dataLoaderCopy.addOrModifyQueryDataJsonByKey("downloadType", dataLoaderCopy.getQueryDataJsonByKey("type"));
// 修改提交數據類型為download
dataLoaderCopy.addOrModifyQueryDataJsonByKey("type", "download");
dataLoaderCopy.downloadData();
4)進入 parpDataLoader.js ?downloadData();
$.ajax({
type:"POST",
data: "parpQueryDataJson=" + queryCondition + "&isMoreReceive=" + isMoreReceive.value + "&isMoreReceiveFlag=" + isMoreReceiveFlag,
url: ?this.submitUrl,
contentType:"application/x-www-form-urlencoded; charset=utf-8",
dataType: "text",
success: function (data) {
},?
error: function (XMLHttpRequest,textStatus,errorThrown) {
}
});
5)進入后臺 ? /doQueryParpReportData ?方法
return new String(componentHandleChain(umid, parpReportId,
executeParamJsonObj, additionParamJsonObj).getBytes("UTF-8"),"ISO-8859-1");
 
 
6)進入componentHandleChain 方法。構造任務鏈,并循環判斷進入相應的任務方法
// 構造責任鏈
ParpComponentHandlerService beginHandler = parpComponentHandlerChainService.getParpComponentHandlerChain();
String componentHandleResult = beginHandler.handleParpComponent(umid,componentType, parpReportId, executeParamJsonObj,additionParamJsonObj);
 
任務方法: ParpChartHandler.java
ParpComponentHandlerChainServiceImpl.java
ParpDownloadHandler.java
ParpEoaHandler.java
ParpSelectHandler.java
ParpTableHandler.java
ParpTextHandler.java
 
7)進入任務方法。例如下載 ?ParpDownloadHandler
A. handle() 主方法
submitExportTask(
convertDownloadParamStr(executeParamJsonObj,additionParamJsonObj, reportId), umid);
B.convertDownloadParamStr() Map convertDownloadParamStr(JSONObject executeParamJsonObj,JSONObject additionParamJsonObj, String reportId) throws Exception { }
設置文件下載的 請求參數、sql模板、sql,文件數據名 ?等參數封裝到 map里。
 
// 構造TableDTO
TableDTO tableDTO = new TableDTO();
FileUtil.readTableFile(tableDtoParamMap, tableDTO, colMap);
// 將頁面請求中的參數設置到下載參數中
JSONObject requestParamJsonObj = executeParamJsonObj
.getJSONObject("requestParam");
if (null != requestParamJsonObj) {
for (String key : requestParamJsonObj.keySet()) {
paramMap.put(key, requestParamJsonObj.getString(key));
}
}
String reportFilePath = reportInfoService.queryReportFilePath(reportId);
// 查詢并設置SQL文件所在路徑
String file = reportFilePath.substring(0,reportFilePath.lastIndexOf("/") + 1);
tableDTO.setStorageRootPath(storageRootPath + file);
// 設置SQL模板內容
tableDTO.setSql(FileUtil.readTxtFile(new FileInputStream(tableDTO.getStorageRootPath() + tableDTO.getSqlID() + ".sql")));
// 設置所使用的table模板文件
tableDTO.setTableTempName("table_new_default.txt");
paramMap.put("tableDTO", tableDTO);
paramMap.put("reportid", reportId);
paramMap.put("operateid", operateid);
// 設置數據文件名稱
paramMap.put("tablename",additionParamJsonObj.getJSONObject("componentParam").getString("componentID"));
 
 
C.submitExportTask()
private void submitExportTask(Map mapVal, String umid) {
log.info("============submitExportTask========");
fileLogService.log((String)mapVal.get("operateid"), "============submitExportTask========", (String)mapVal.get("reportid"));
log.info(mapVal);
fileLogService.log((String)mapVal.get("operateid"), mapVal.toString(), (String)mapVal.get("reportid"));
recordExportInfoAndSubmitTask(mapVal, umid, new FileTaskDTO(
exportService, mapVal, umid, mailSAO, reportInfoService,
umSearchService, userRightQueryService,fileLogService));
}
 
 
 
 
D。 FileTaskDTO() 封裝下載時所需要的業務邏輯
public FileTaskDTO(ExportService exportService, Map mapVal, String userID,
MailSAO mailSAO, ReportInfoService reportInfoService,
UmSearchService umSearchService,
UserRightQueryService userRightQueryService,FileLogService fileLogService) {
super();
this.exportService = exportService;
this.mapVal = mapVal;
this.userID = userID;
this.mailSAO = mailSAO;
this.reportInfoService = reportInfoService;
this.umSearchService = umSearchService;
this.userRightQueryService = userRightQueryService;
this.fileLogService = fileLogService;
}
 
 
E.recordExportInfoAndSubmitTask() ?插入下載文件路勁,ID;更新日志到數據庫;提交下載任務
downloadThreadPool.submitTask(new ExportTask(fileTaskDto, idExport),idExport);
 
F:submitTask() ?DownloadThreadPool.java 提交任務?
public void submitTask(Runnable task, String idExport) {
log.info("==Before submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
executor.submit(task);
log.info("==After submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
}
 
G:ExportTask(); ExportTask.java ?構造初始化任務,
public void run() {} 線程執行,
 
H:run() ?下載導出,發送郵件
fileLogService.log(operateid, "========exportToNas1========", reportid);
String naspath = exportService.exportToNas(mapVal);
修改下載路徑狀態
reportInfoService.updateExcelFilePath(dto);
 
 
發送郵件:mailSAO.sendMailNoFile(ExportExcelUtil.assembleMail(
dto,
StringUtils.substringAfterLast(naspath, "/"),
(String) mapVal.get("DISPATCH_URL"),
reportInfoService,
(String) mapVal.get("reportid")));
 
 
 
 
 
 
 
 
 
 
--報表下載保存的路徑
?insert into parp_export_data_detail(id_parp_export, id_report_info, naspath, query_condition, state, umid)
? ? ? ? values (?, ?, ?, ?, ?, ?)
? ? ? ??
 
 
insert into PARP_REPORT_LOGINFO(ID_PARP_LOGINFO,id_report_info,report_operate_id,naslogpath,ID_PARP_EXPORT)
values(sys_guid(),#reportid#,#operateid#,#naslogpath#,#exportid#)
 
 
 
 
 
 
 
 
JSON字符串:
{"executeParam":{"queryParam":{"reportname":"","username":"","starttime":"","umId":"WANGYUPENG002"},"cnNameParam":{"reportname":"報表名","username":"用戶名","starttime":"開始時間"}},"additionParam":{"componentParam":{"cols":[{"headName":"報表名","colname":"NAME"},{"headName":"用戶名","colname":"OPR_USERNAME"},{"headName":"是否有效","colname":"IS_VALID"},{"headName":"訪問量","colname":"ACC_TYPE"}],"sqlid":"SQL_KZsxPqMkvG","type":"download","isPage":true,"componentID":"table_jB06XSUFFp","title":"","downloadType":"table"},"userCheckTableColumn":{}}}
JSON 對象:
{"executeParam":{"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}},"additionParam":{"componentParam":{"title":"","cols":[{"colname":"NAME","headName":"報表名"},{"colname":"OPR_USERNAME","headName":"用戶名"},{"colname":"IS_VALID","headName":"是否有效"},{"colname":"ACC_TYPE","headName":"訪問量"}],"downloadType":"table","type":"download","isPage":true,"componentID":"table_jB06XSUFFp","sqlid":"SQL_KZsxPqMkvG"},"userCheckTableColumn":{}}}
 
 
查詢條件參數:
{"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}}
 
 
 
 
組裝后的JSON對象
{"requestParam":{"pafaRetViewType":"jsp","reportId":"4CEEF5A9FF8C30DEE0531580140A0B2C","isMoreReceiveFlag":"false","isMoreReceive":"undefined"},"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"operateid":"9913079B76A04EA8BC42B335741929E6","cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}}
 
 
 
 
{"componentParam":{"title":"","cols":[{"colname":"NAME","headName":"報表名"},{"colname":"OPR_USERNAME","headName":"用戶名"},{"colname":"IS_VALID","headName":"是否有效"},{"colname":"ACC_TYPE","headName":"訪問量"}],"downloadType":"table","type":"download","isPage":true,"componentID":"table_jB06XSUFFp","sqlid":"SQL_KZsxPqMkvG"},"userCheckTableColumn":{}}
 
 
 
 
 
 
 
 
 
 
 
 
多線程線程池 隊列
DownloadThreadPool.java?
有界隊列:
workQueue = new ArrayBlockingQueue<Runnable>(this.blockingQueueSize);
無界隊列:
workQueue = new LinkedBlockingQueue<Runnable>(this.blockingQueueSize);
重寫異常處理機制
DefaultRejectedExecutionHandler.java
executor.getQueue().put(r);//改成阻塞式的提交 ?add bu Wangdingxin
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
總體架構
1.首先進入后臺管理 所有攔截器 UserWebInterceptor.java ? preHandle 代理方法
 
 
 
 
http://parp-core-stg1.paic.com.cn/parp/pages/eoa/setEoaTemplet.jsp?url=http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2962d86dedc269809728f3926e4060cc&requestSysname=PARP_CORE&sysId=PARP_CORE1968173659
http://localhost:7001/parp/pages/eoa/setEoaTemplet.jsp?url=http://eoadev.paic.com.cn:7001/eoa/setOutsysTemplate.do?validateId=979e36299ae1167e01e1d48c8cbc4837&requestSysname=PARP_CORE&sysId=PARP_CORE1492922801
http://localhost:7001/parp/pages/eoa/setEoaTemplet.jsp?url=http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2b0583552aad30c8e2b3c75554f51f5d&requestSysname=PARP_CORE&sysId=PARP_CORE1280936807
 
 
http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2962d86dedc269809728f3926e4060cc&requestSysname=PARP_CORE&sysId=PARP_CORE1968173659
http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2b0583552aad30c8e2b3c75554f51f5d&requestSysname=PARP_CORE&sysId=PARP_CORE1280936807
http://eoadev.paic.com.cn:7001/ ? eoa/setOutsysTemplate.do?validateId=979e36299ae1167e01e1d48c8cbc4837&requestSysname=PARP_CORE&sysId=PARP_CORE1492922801
 
 
http://eoadev.paic.com.cn:7001/eoa/setOutsysTemplate.do?validateId=d0d530f89e3e7a8d34e7a5501cb20363&requestSysname=PARP_CORE&sysId=PARP_CORE138281584
http://eoadev.paic.com.cn:7001/eoa/setOutsysTemplate.do?
                        
                        
                        1.Control:MemoryReportControl
2.進入報表采集頁面并查詢列表/分頁:/index ?repIndex.jsp ??
后臺:
action:
PageDTO dto = memoryReportService.querAdmReportList(map);
model.addAttribute("dto", dto);
return "/admreport/repIndex;
service: MemoryReportServiceImpl.java ? queryPaginatedList
DAO : ? ?MemoryReportDao.java ?querAdmReport/queryAdmReportCount
XML : ?sqlmap-mapping-admin-queryreport.xml ? ?queryreport.query.admreportlist/queryreport.query.admreporCount
前臺:
<script type="text/javascript">
$(document).ready(function(){
$(".setup").hide();
$.PaginPan({
currentPage:${dto.currentPage},
totalPage:${dto.totalPage},
pageViewno:9,
wayUrl:'/parp/api/admin/memoryreport/index?pafaRetViewType=jsp&name=${name}¤tPage='
});
});
</script>
? ? 問題:1.pafaRetViewType=jsp ?這個參數 什么意思呢???
3.查看詳情/修改 /repuppage ?uppage.jsp
后臺:
action:?
String uniquedetid = manageDeptService.uniquedetidlist(id); //查詢組織機構ID。一個報表可能有多個組織機構看?
AdmReportDTO repDto = memoryReportService.getAdmReportDTO(id);//查詢報表詳細信息.
List<BIReportDTO> biList = manageBIReprotService.queryAllBiInfoList();根據BI所有bi數據
service:
ManageDeptServiceImpl.java ? String uniquedetidlist(String reportid);
MemoryReportServiceImpl.java ? ?AdmReportDTO getAdmReportDTO(String id)
ManageBIReprotServiceImpl.java List<BIReportDTO> queryAllBiInfoList()?
dao:
AdmReportDTO getAdmReportDTO(String id)
manageBIReprotDAO.queryAllBiInfoList();
查詢組織機構:
select t1.paic_unique_deptid
?from parp_dept_report t, parp_paic_dept_info t1
where t.id_parp_paic_dept_info = t1.id_parp_paic_dept_info
and id_parp_report_info = #reportid#
查詢BI源
<select id="bireport.query.bireportinfolist" resultClass="com.paic.reportportal.admin.dto.BIReportDTO">
select t.id_bi_info as biId,t.name as biName,t1.bi_report_extend_attrs_tab as reportTab, t.dispatch_url as dispatchUrl?
from parp_bi_info ?t ,parp_bi_source_type t1 where t.id_bi_source_type=t1.id_bi_source_type order by t.created_date
</select>
前臺:1.<a href="<c:url value='/api/admin/memoryreport/repuppage?pafaRetViewType=jsp&'/>id=${item.id}">查看詳情</a> 跳轉到查看詳情
2.EL 表達式加載后臺查詢的值
3.根據BI源的變化 選擇報表擴展屬性Tap頁。/gotoAttrsPage
forReportAttrTab({attrTab:extendTab,tabName:tabName,reportid:$("#reportid").val()},"<c:url value='/api/admin/memoryreport/gotoAttrsPage?pafaRetViewType=jsp'/>",extendTab);
?
4.失效
5.刪除
<c:if test="${item.isValid=='Y'}">
<a href="javascript:void(0);" οnclick="if(confirm('確認是否失效!')){handleReport('<c:url value='/api/admin/memoryreport/handleReport?pafaRetViewType=jsp'/>','${item.id}','${item.isValid}','invalidation','<c:url value='/api/admin/memoryreport/index?pafaRetViewType=jsp'/>');}">失效</a>
</c:if>
<c:if test="${item.isValid=='N'}">
<a href="javascript:void(0);" οnclick="if(confirm('確認是否啟用!')){handleReport('<c:url value='/api/admin/memoryreport/handleReport?pafaRetViewType=jsp'/>','${item.id}','${item.isValid}','startUp','<c:url value='/api/admin/memoryreport/index?pafaRetViewType=jsp'/>');}">啟用</a>
</c:if>
<a href="javascript:void(0);" οnclick="if(confirm('確認是否刪除!')){handleReport('<c:url value='/api/admin/memoryreport/handleReport?pafaRetViewType=jsp'/>','${item.id}','${item.isValid}','delete','<c:url value='/api/admin/memoryreport/index?pafaRetViewType=jsp'/>');}">刪除</a> </td>
6.新增頁面:/torepinpage ? inpage.jsp
新增保存插入報表基本信息/存儲路徑過程:
1.前臺 inpage.jsp?
<%@ include file="/pages/admreport/userclass.jsp"%>
點擊確定 觸發驗證方法
<td align="center" colspan="2"><input type="button" value="確認" οnclick="validateVal();"/></td>
2.validateVal() ?驗證是否重復 是否有效 是否超長。 webEvent.js
if(sta&&validateValForMonitor()){
document.mainform.submit();
}
?
3.驗證成功 提交表單 到后臺 memoryreport/insertOrUpdate
<form id="mainform" name="mainform" action="<c:url value='/api/admin/memoryreport/insertOrUpdate?pafaRetViewType=jsp'/>" enctype="multipart/form-data" method="post">
4.后臺 ?MemoryReportController.java ?/insertOrUpdate
// 判斷是進行新增還是修改操作
if (StringUtils.isEmpty(reportid)) {
newReportId = memoryReportService.insertAdmReport(mapVal);
mapVal.put("reportid", newReportId);
memoryReportService.insertReportMonitor(mapVal);
} else {
memoryReportService.updateAdmReport(mapVal);
// 更新監控SQL配置信息
memoryReportService.updateReportMonitor(mapVal);
}
5.后臺Service 新增業務邏輯 ?MemoryReportServiceImpl。java ? insertAdmReport()
//新增業務邏輯
public String insertAdmReport(Map<String, String> map) {
String result = null;
if (StringUtils.isBlank(map.get("reportid"))) {
result = commonDAO.queryGUID();
map.put("reportid", result);
}
setReportTypeID(map);
insertDept(map);
insertOrUpdateEventChannel(map);
memoryReportDAO.insertAdmReport(map);
memoryReportDAO.insertReportAttrs(insertAttrsTableSQL(map));
return result;
}
6.DAO
public void insertReportAttrs(Map map) {
log.debug("query insertReportAttrs ?dao start");
this._insert("queryreport.insert.admreportattrs", map);
log.debug("query insertReportAttrs ?dao end");
}
map={fieldList=[{value=Y, key=taday_isornot_send}, {value=N, key=eoa_finish_send}, {value=444/925/2/6CCDDE3E001946388FB0509F64F3F8CF/, key=sqlmapper}, {value=CSV, key=download_type}
? ? ? ? ? ? ? ], id_report_info=4D80D3B29AE95A24E0531580140AA64B, attrsTbl=PARP_MB_REPORT_EXTEND_ATTRS
}
<insert id="queryreport.insert.admreportattrs" parameterClass="java.util.HashMap" >
? ? ? ? ?insert into $attrsTbl$
? ? ? ? ?(
? ? ? ? ? ?<iterate property="fieldList" conjunction=",">
? ? ? $fieldList[].key$
? ? ?</iterate>
? ? ? ? ?,id_report_info)
? ? ? ? ?values
? ? ? ? ?(
? ? ? ? ? <iterate property="fieldList" conjunction=",">
? ? ? #fieldList[].value#
? ? ?</iterate>
? ? ? ? ?,#id_report_info#)
? ? ?</insert>
報表編譯新 ?
SQL編譯提交過程: ? ??
1.inpage.jsp ?Ajax加載執行 ?forReportAttrTab({attrTab:extendTab},"<c:url value='/api/admin/memoryreport/gotoAttrsPage?pafaRetViewType=jsp'/>",extendTab);
2.進入后臺 MemoryReportControl.java ?gotoAttrsPage()方法 ??
返回 return "/admreport/" + attrTab; ? 根據實際情況異步加載 ?報表擴展屬性Tab頁
3.MB_REPORT_EXTEND_ATTRS.jsp ? 點擊<span><a id="updateModule" οnclick="editorViewHtml('editorSql')" style="cursor:pointer">報表編輯(新)</a></span>
4.editorSql() ?/editorSql ? ?進入編譯SQL頁面 editorSql.jsp
5.提交保存并生成新sqlid
function submitForSaveSql() {
if ( !checkDataForCurSql() ) {
return false;
}
EidtorSQLTool.saveSql();
setSqlId();
}
6. Editorsql.js ? ?savesql方法: ? ? ?EidtorSQLTool._submit(EidtorSQLTool.allArray);
7. Editorsql.js ? ?submit方法 ? ? ? ? url:"/commonreport/api/saveSql?pafaRetViewType=jsp",
8.進入后臺 ?ReportConfigsController.java ? saveSql() ? ?/saveSql ?方法 保存
9.最后本地磁盤保存地址 ?.sql ?.data 文件
D:\parp\report\792\135\234\8D40A7974DBF6B9B56E4E7D513C867DD
報表編譯窗口模塊:
1.editor.jsp ? 點擊下一步
<a href="javascript:void(0);" οnclick="EidtorSQLTool._nextButton()">
<span class="b_btn">
<span title="下一步" class="gp_btn_img gp_btn_ti0 gp_btn_wd" >下一步</span>
</span>
</a>
2.editorsql.js _nextButton()
_nextButton:function() {
location.href = "/commonreport/api/toparpReportEditor?pafaRetViewType=jsp&path="+EidtorSQLTool.path;
}
3.進入后臺 ?ReportConfigsController.java ? toparpReportEditor() /toparpReportEditor ? 進入可視化窗口頁面 ?parpReportEditor.jsp
return "/customBIReport/parpReportEditor";
4.parpReportEditor.jsp 頁面 ?工具編輯報表 ? ?最后點擊保存生成 module.html,temp.html ? ?
D:\parp\report\792\135\234\8D40A7974DBF6B9B56E4E7D513C867DD
1)前臺頁面 <form style="width: 100%;height: 100%;" action="javascript:void(0)" οnsubmit="save_file_local(getFckText());">
2) save_file_local() ?AJAX 異步進入后臺?
url : "/commonreport/api/saveHtmlContent?pafaRetViewType=jsp",
3)進入后臺 ?ReportConfigsController.java ?/saveHtmlContent ?saveHtmlContent() ?生成 module.html,temp.html
前段保存過程:
1)點擊保存觸發 FCKeditorAPI工具 表單里面的submit事件
<form style="width: 100%;height: 100%;" action="javascript:void(0)" οnsubmit="save_file_local(getFckText());">
2)獲取編輯器內容getFckText()。
var getFckText = function() {
var oEditor = FCKeditorAPI.GetInstance('MyTextarea');//獲取頁面中的FCK對象
return oEditor.GetXHTML(true);//獲取編輯器中的內容..
};
3)將編輯器中的內容轉換成需要保存的HTML內容 ? content = transEditorStrToHtmlFileStr(content);
var colStrArr = [];
var tempContent = "";// 編輯保存頁面內容
function transEditorStrToHtmlFileStr( editorStr ) {
var resultStr = editorStr;// 可不作空判斷,保存為空html文件
//特殊處理input標簽中的屬性cnname
if (resultStr.indexOf("cnname") != -1) {
resultStr = resultStr.replace(" cnname=", " cnName=");
}
resultStr = EditorContent( resultStr );// 翻譯各個控件元素
var headStr = setHead4Selects( resultStr );// 處理獲取文件HEAD內容
if ( !resultStr.startWith('<html>') ) {
resultStr = '<html><head>\r\n' + headStr + '\r\n</head><body>\r\n' + resultStr + '\r\n</body></html>';
// tempContent = '<html><head></head><body>\r\n' + editorStr + '\r\n</body></html>';
tempContent = dealMyAreaTag(editorStr);
}
return resultStr;
}
4)AJAX 異步保存進入后臺方法 保存報表展示及編輯兩個HTML文件
function save_file_local( content ) {
content = transEditorStrToHtmlFileStr(content);
$.ajax({
type : "POST",
data : { "htmlcontent":content, "temphtml":tempContent, "path":"${path}" },
url : "/commonreport/api/saveHtmlContent?pafaRetViewType=jsp",
dataType : "text",
async : false,
contentType : "application/x-www-form-urlencoded; charset=utf-8",
success : function (data) {
alert("編輯成功!");
}
});
}
前端頁面插入節點執行過程:
1)頁面開始加載的時候 ?組裝建模樹并加載
/**
* 加載建模結果樹
*/
$(document).ready(function() {
treeArray();
$.fn.zTree.init($("#treeDemo"), setting, tmpzNodes);
});
2)樹的結構 setting 里面綁定 點擊事件 onclick
3)onclik()方法 判斷表格區/非表格區 插入所點擊節點
4)insNewNodeHtml(columnName, columnCnName, nodeType) 插入到頁面
A.獲取頁面中的FCK對象 ?var oEditor = FCKeditorAPI.GetInstance('MyTextarea');
B.判斷編輯要插入的內容
newNodeStr = "<input id=\"" + columnName + "\" title=\"" + columnName + "\" value=\"" + columnCnName + "\" _tabdatainput=\"true\" type=\"text\" readonly=\"readonly\" contenteditable=\"false\" style=\"background-color: #66cccc; width: 80px; height: 18px\" />";?
C.利用 FCKeditorAPI工具插入到頁面 ? oEditor.InsertHtml(newNodeStr);
?
?
三.前臺數據采集查詢 ? 報表采集數據過程
1.進入當前報表主頁過程
CustomBIController.java ?/reportMainJsp ? 進入 ?reportMainJsp.jsp 頁面
/reportMainJsp
{REPORT_TYPE_NAME=report, ID_MB_REPORT_EXTEND_ATTRS=4CEEF5A9FF8E30DEE0531580140A0B2C, REPORT_NAME=wangdingxinTest2, PWD_SOURCE=cyberark, TADAY_ISORNOT_SEND=Y, BI_IS_VALID=Y, BI_NAME=自定義BI, BI_VERSION=3.2.3, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, CYBERARK_CRED_APPID=appID, MODULE_HTML_PATH=null, UPDATED_DATE=2017-04-12 09:16:36.0, IS_VALID=N, IS_USER_VALIDATION=null, REFRESHURL=null, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-12 09:16:36.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS, imgPath=http://localhost:8080/commonreport//transFile/518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, MONITORSQL=null, PASSWORD=parp1234, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_CRED_FILEPATH=null, REPORT_IS_VALID=Y, CYBERARK_PWD_FOLDER=folder, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, LINES_PER_PAGE=20, DOWNLOAD_TYPE=CSV, EOA_FINISH_SEND=N, CYBERARK_PWD_KEY=key, DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, REPORT_DESC=wangdingxinTest2基礎報表測試, DISPATCH_URL=http://localhost:8080/commonreport/, IS_REGULAR=N, UPDATED_BY=WANGYUPENG002, CYBERARK_PWD_SAFE=safe, REPORT_ACC_TYPE=API, SQLMAPPER=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, HEAD_EXCEL_PATH=null, USERNAME=parpdata, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_REPORT_INFO=4CEEF5A9FF8C30DEE0531580140A0B2C, STATEMENT_ID=null, HEAD_HTML_PATH=null}
1)獲取reportid?
TokenDTO token = new TokenDTO(tokenString);
paramMap.put("reportid", token.getReportId());
2)根據reportid 查找報表配置基本信息
Map<String, String> contentAndView = reportInfoService.queryReportExtendAttributes(paramMap);
3)根據查詢結果初始化 報表配置信息,并判斷是否準備好數據
if ("Y".equals(MONITOR_IS_VALLID)) {
resultMonitorInfo = (Map<String, String>) customQueryService
.getResultMonitorInfo(contentAndView);
}
4)返回 進入 報表頁面 ? reportMain.jsp ? 問題://是reportMain.jsp 嗎? ?那后面的/reportHead ?是 怎么進去的?
return "reportMain";
5)reportMain.jsp ?加載Iframe src ?進入裝在報表頭的 方法 ? CustomBiController.java ?/reportHead
frame.src="<c:url value='/api/reportHead?reportid=${reportid}&remoteFlag=${remoteFlag}&isEoa=${isEoa}&eoasessionid=${eoasessionid}&pafaRetViewType=jsp'/>"; ?
6)reportHead 方法查找報表的基礎 配置信息及 寫入的路勁 ? ? ? ? ? ? ? ? ? ? ?518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/
Map<String, String> contentAndView = customQueryService.getReportViewAndContent(reportId);
查詢modelname List<ReportModuleDTO> mdList = reportModuleService.queryModname(map);
IS_REGULAR=null ?Map resultData = customQueryService.initReportData(contentAndView,storageRootPath + contentAndView.get("content"));
查詢報表名字 配置源基本信息 ? Map reportMap = reportInfoService.queryExtendAttr(reportId);
?
contentAndView={uid=WANGYUPENG002, REPORT_TYPE_NAME=report, BI_IS_VALID=Y, IS_USER_VALIDATION=null, REFRESHURL=null, imgPath=http://localhost:8080/commonreport//transFile/518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_PWD_FOLDER=folder, REPORT_IS_VALID=Y, LINES_PER_PAGE=20, EOA_FINISH_SEND=N, DOWNLOAD_TYPE=CSV, content=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, CYBERARK_PWD_KEY=key, CYBERARK_PWD_SAFE=safe, UPDATED_BY=WANGYUPENG002, USERNAME=parpdata, view=customBIReport/commonReport, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_MB_REPORT_EXTEND_ATTRS=4CEEF5A9FF8E30DEE0531580140A0B2C, operateid=237EB31270724C02B857DE5D70BEB55D, TADAY_ISORNOT_SEND=Y, PWD_SOURCE=cyberark, REPORT_NAME=wangdingxinTest2, BI_VERSION=3.2.3, BI_NAME=自定義BI, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, MODULE_HTML_PATH=null, CYBERARK_CRED_APPID=appID, UPDATED_DATE=2017-04-12 09:16:36.0, IS_VALID=N, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-12 09:16:36.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS, ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, MONITORSQL=null, PASSWORD=parp1234, CYBERARK_CRED_FILEPATH=null, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, REPORT_DESC=wangdingxinTest2基礎報表測試, IS_REGULAR=N, DISPATCH_URL=http://localhost:8080/commonreport/, REPORT_ACC_TYPE=API, SQLMAPPER=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, HEAD_EXCEL_PATH=null, ID_REPORT_INFO=4CEEF5A9FF8C30DEE0531580140A0B2C, STATEMENT_ID=null, HEAD_HTML_PATH=null}
reportMap={REPORT_TYPE_NAME=report, ID_MB_REPORT_EXTEND_ATTRS=4CEEF5A9FF8E30DEE0531580140A0B2C, REPORT_NAME=wangdingxinTest2, PWD_SOURCE=cyberark, TADAY_ISORNOT_SEND=Y, BI_IS_VALID=Y, BI_NAME=自定義BI, BI_VERSION=3.2.3, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, CYBERARK_CRED_APPID=appID, MODULE_HTML_PATH=null, UPDATED_DATE=2017-04-12 09:16:36.0, IS_USER_VALIDATION=null, REFRESHURL=null, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-12 09:16:36.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS, ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, PASSWORD=parp1234, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_CRED_FILEPATH=null, REPORT_IS_VALID=Y, CYBERARK_PWD_FOLDER=folder, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, LINES_PER_PAGE=20, DOWNLOAD_TYPE=CSV, EOA_FINISH_SEND=N, CYBERARK_PWD_KEY=key, DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, REPORT_DESC=wangdingxinTest2基礎報表測試, DISPATCH_URL=http://localhost:8080/commonreport/, IS_REGULAR=N, UPDATED_BY=WANGYUPENG002, CYBERARK_PWD_SAFE=safe, REPORT_ACC_TYPE=API, SQLMAPPER=518/409/960/D2F5ECEBF8AEE182FFAD7FEBB2C362E4/, HEAD_EXCEL_PATH=null, USERNAME=parpdata, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_REPORT_INFO=4CEEF5A9FF8C30DEE0531580140A0B2C, STATEMENT_ID=null, HEAD_HTML_PATH=null}
7)返回到 contentAndView.get("view") ? customBIReport/commonReport ?進入 commonReport.jsp 頁面
8)commonReport.jsp ?加載JS
A.temp.html ?加載tableLoadComponentData()方法 ? ?parp-table.js?
<div id="table_jB06XSUFFp"><script type='text/javascript'>tableLoadComponentData("{\"cols\":[{\"headName\":\"報表名\",\"colname\":\"NAME\"},{\"headName\":\"用戶名\",\"colname\":\"OPR_USERNAME\"},{\"headName\":\"是否有效\",\"colname\":\"IS_VALID\"},{\"headName\":\"訪問量\",\"colname\":\"ACC_TYPE\"}],\"sqlid\":\"SQL_KZsxPqMkvG\",\"type\":\"table\",\"isPage\":true,\"componentID\":\"table_jB06XSUFFp\",\"title\":\"\"}",'table_jB06XSUFFp','N')</script></div>
 <script type='text/javascript'>$(function(){if(null!=reportTitle||""!=reportTitle){$('#table_title').html(reportTitle);$('#parpdownload').show();}});</script>
B.tableLoadComponentData 執行加載 parpLoadComponentData()
function tableLoadComponentData(paramJson, divId, columnType, url, recordFlag) {
// 進行必要參數判斷
if (null == paramJson || "" == paramJson || null == divId || "" == divId) {
return;
}
if (null != columnType && "" != columnType && "Y" == columnType) {
jxmColumnJsontoStr(paramJson, divId);
}
parpLoadComponentData(paramJson, divId, url, recordFlag);
}
C. editor-tool.js
加載 parpLoadComponentData ? 異步請求后臺數據,將組裝好的html內容顯示到頁面上。
function parpLoadComponentData(paramJson, divId, url, recordFlag) {
// 進行必要參數判斷 ??
if (null == paramJson || "" == paramJson || null == divId || "" == divId) {
return;
}
var submitUrl = url;
if (url == null || url == "") {
submitUrl = "/commonreport/api/doQueryParpReportData?pafaRetViewType=jsp&reportId=" + reportid;
}
// 創建并記錄執行對象
var dataLoader = new ParpDataLoader(divId, submitUrl, paramJson);
dataLoader.queryData();
var ifRecord = typeof(arguments[3]) != "undefined" ? arguments[3] : true;
if (ifRecord) {
dataLoader.setShadowFlag(true);
parpQueryReportDataAreaMap.put(divId, dataLoader);
}
}
D. ?parp-DataLoader.js ?queryData(); ?查詢進入后臺 /doQueryParpReportData
9)CustomBiController.java ? /doQueryParpReportData
// 將頁面請求中的參數組裝到json中
executeParamJsonObj.put("requestParam", putAllParameters(request,operateId,parpReportId));
executeParamJsonObj.put("operateid", operateId);
// 獲取附加條件參數
JSONObject additionParamJsonObj = jObj.getJSONObject("additionParam");
return new String(componentHandleChain(umid, parpReportId,
executeParamJsonObj, additionParamJsonObj).getBytes("UTF-8"),
"ISO-8859-1");
}
10)ParpReportController.java ? componentHandleChain()
加載表頭
componentHandleResult = beginHandler.handleParpComponent(umid,
componentType, parpReportId, executeParamJsonObj,
additionParamJsonObj);
componentHandleResult="<table class="gridtable" width="100%">
<caption class="table_caption"></caption>
<tr>
<th>報表名</th>
<th>用戶名</th>
<th>是否有效</th>
<th>訪問量</th>
</tr>
</table>
<div style="clear:both"></div>"
<div id="'+shadowID+'" ><img src="/commonreport/images/page/loading-small.gif"/></div>
2.點擊查詢 ?報表查找數據過程 :
commonReport.jsp ?reportMain.jsp ?查詢綁定事件
<input name="查詢" type="button" value="查詢" οnclick="parpRefreshComponentData()"><br>
1.觸發事件 進入 parpRefreshComponentData(); ? ?parp-report-tools.js?
A.判斷是否是定期采集,若果是定期采集 要驗證采集日期是否填寫,驗證完畢轉移到 審批頁
if(null!=is_myzdcj){
isreportdownload=true;
if(null!=is_regular&&"Y"==is_regular.value){
effective_date=document.getElementById("effective_date");
expiry_date=document.getElementById("expiry_date");
period=document.getElementById("period");
term=document.getElementById("term");
effective_time=document.getElementById("effective_time");
if(!checkDataForMydqcj()){
return false;
}
}
submitToEoanew();
}else{
// 自定義序列化表單內容
$.each(parpQueryReportDataAreaMap.keysRemoveDuplicate(), function(i, field) {
parpQueryReportDataAreaMap.get(this).queryData();
});
}
定期采集:
B1.是定期采集 ?驗證完畢進入 submitToEoanew();查詢審批的URL ?。parp-report-tools.js ??
function submitToEoanew() {
var eoaUrl = "";
$.ajax({
type: "GET",
url: "/commonreport/api/queryForEoaUrl?reportId=" + reportid,
async:false,
success: function (data) {
eoaUrl = data + '&callbackFun=getEoaTemplateTmpnew(paramStr)';
}
});
//document.domain = 'paic.com.cn';
document.domain = eoaDomain;
window.open (eoaTemplateUrl + eoaUrl, "_blank",'width=800,height=700,top=100');
}
拼接URL和回調函數
回調函數:
1.getEoaTemplateTmpnew();
function getEoaTemplateTmpnew(paramStr){
window.opener.getnewEoaTemplateResultNew('<%=sessionId%>');
window.close();
}
2.getnewEoaTemplateResultNew(); ?parp-report-tools.js?
$.ajax({
type: "POST",
data:datas,
url: "/commonreport/api/queryForEoaAppUrl",
async: false,
success: function (data) {
if (data == "success") {
alert("已生成EOA,EOA審批完成后parp@pingan.com.cn會將數據發送到您的郵箱,請注意查收,謝謝!");
} else {
alert("提交到EOA失敗!");
}
}
});
window.parent.opener = null;
window.parent.open('','_self','');
window.parent.close();
3.后臺 queryForEoaAppUrl(),把定時任務簽報 查詢條件信息插入到表parp_report_eoa_session_detail。 ? SubmitToEoaController.java
? ? B2.進入后臺審批頁面 URL:eoaTemplateUrl + eoaUrl
eoaTemplateUrl="/commonreport/pages/customBIReport/eoaTemplet.jsp?url="
eoaUrl = "http://oas-eoa10-stg1.paic.com.cn/eoa/selectOutSysTemplate.do?requestSysName=PARP_CORE981837949&outSysSessionId=PARP_CORE1375633262&callbackFun=getEoaTemplateTmpnew(paramStr)";
B3.審批頁面 eoaTemplet.jsp,Ifram src= eoaUrl 跳轉 進入審批頁面 并綁定了回調函數callbackFun=getEoaTemplateTmpnew(paramStr)。
<body>
<table ?align="left" width="100%" cellpadding="0" cellspacing="0">
<tr class="fieldName1">
<td>
<iframe width="100%" name='eoaTemplateIframe' id='eoaTemplateIframe' border="0" cellspacing="0" cellpadding="0" FRAMEBORDER=0
SCROLLING=no Height='650px' src='<%= eoaUrl %>'></iframe>
</td>
</tr>
</table>
</body> ? ?
B4. 點擊確定生產審批流。并執行回調函數 (把定時任務簽報 查詢條件信息插入到表 parp_report_eoa_session_detail )。見回調函數
<input type="button" style="" name="selectTemp" id="selectTemp" value="確 定" οnclick="selectTmpltFlow();" disabled="">
B5.登陸 審批同意通過 ?http://oas-eoa10-stg1.paic.com.cn/eoa/ 。問題:審批同意與外面接口webLogic 回調 執行 是怎么觸發的???同意以此觸發以此嗎? 這個找誰?
? ? ?審批完執行 webLogic 執行回調函數 EoaFeedbackServiceImpl.java 主方法 ? receiveEoaMessage()
?1).修改parp_report_eoa_session_detail 定時任務 簽報信息狀態為Y。updateReportEoaSession(sessionid)
?2).插入定時采集 具體配置任務執行時間到 parp_regular_download_conf
?3)線程發送郵件
B6. receiveEoaMessage()
?定時采集 審批完插入定時采集 具體配置任務執行時間到 parp_regular_download_conf,并發送。executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
?定時采集 ?沒選定時的 ? 直接發送。executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
?if (updateReportEoaSession(sessionid) > 0) {
EoaSessionDetailDTO eoaDTO = querySessionDetail(sessionid);
Map mapVal = new HashMap();
ManipulateEoaUtil.assembleQueryMap(eoaDTO.getQuery_condition(),
mapVal);
// 獲取根據報表ID獲取關聯信息
Map<String, String> reportInfoMap = supportService
.queryReportInfo(eoaDTO.getId_report_info());
if (null != mapVal.get("is_regular")
&& "Y".equals(mapVal.get("is_regular"))) {
insertDownloadConf(eoaDTO, mapVal);
//設置為如果審批完就發送
if(reportInfoMap.get("EOA_FINISH_SEND").equals("Y")){
executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
}
} else {
executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
}
} else {
log.error("update sessionid id error or sessionid not found, sesssid="
+ sessionid + " !!!!!!!!!!!!!!!!!!");
}
?
?
?
B7.executeDownloadTask(reportInfoMap, eoaDTO, mapVal);
private void executeDownloadTask(Map<String, String> reportInfoMap,
EoaSessionDetailDTO eoaDTO, Map eoaVal) throws Exception {
Map mapVal = new HashMap();
String dispatchUrl = reportInfoMap.get("DISPATCH_URL");
// 通過dispatchUrl判斷是否調用report服務
if (dispatchUrl.contains("commonreport")) {
// 調用report接口進行下載
mapVal.put("umid", eoaDTO.getUmid());
mapVal.put("eoasessionid", eoaDTO.getEoa_session_id());
TransmitUtil.requestRemoteHttpServiceWithoutReponse(dispatchUrl
+ "/api/submitEoaExportTask", mapVal);
} else {
executeLocalEoaDownloadTask(eoaDTO, eoaVal);
}
}
private void executeLocalEoaDownloadTask(EoaSessionDetailDTO eoaDTO,
Map mapVal) throws Exception {
ReflectUtil.setTitleThreadLocal(new HashMap());
FileTaskDTO dto = new FileTaskDTO(reportInfoService, mapVal,
eoaDTO.getUmid(), mailSAO);
dto.setEoaModule("EOAMODULE");
downloadThreadPool.submitTask(new AsyncDownloadExcelFileTask(dto,
customQueryService));
}
B8.線程執行數據采集,測試郵箱生成載鏈接發送郵件
實時采集
C1.不是定期采集 普通的查詢,自定義序列化表單內容
$.each(parpQueryReportDataAreaMap.keysRemoveDuplicate(), function(i, field) {
parpQueryReportDataAreaMap.get(this).queryData();
});
c2.parpDataLoader.queryData(); ? parp-dataLoader.js?
$.ajax({
type:"POST",
data: "parpQueryDataJson=" + queryCondition,
url: ?this.submitUrl,
beforeSend:function(){
if(shadowFlag){
var _height=$("#"+divId).height(),_width =$("#"+divId).width(),_top=$("#"+divId).offset().top,_left=$("#"+divId).offset().left;
$('body').append('<div id="'+shadowID+'" ><img src="/commonreport/images/page/loading-small.gif"/></div>');
$("#"+shadowID+" img").css({'margin-left':(_width/2-22)+'px','margin-top':(_height/2-10)+'px'});
$("#"+shadowID).css({'width':_width+'px','height':_height+'px','top':_top+'px','left':_left+'px'});
$("#"+shadowID).addClass("report_shadow");
}
},
this.submitUrl="/commonreport/api/doQueryParpReportData?pafaRetViewType=jsp&reportId=4CEEF5A9FF8C30DEE0531580140A0B2C"
ParpReportController.java
? ? C3.doQueryParpReportData(){
return new String(componentHandleChain(umid, parpReportId,
executeParamJsonObj, additionParamJsonObj).getBytes("UTF-8"),
"ISO-8859-1");
}
?
C4.componentHandleChain(){
// 構造責任鏈
ParpComponentHandlerService beginHandler = parpComponentHandlerChainService.getParpComponentHandlerChain();
String componentHandleResult = beginHandler.handleParpComponent(umid,componentType, parpReportId, executeParamJsonObj,additionParamJsonObj);
return componentHandleResult == null ? "" : componentHandleResult;
}
c5.ParpComponentHander.java ?
任務鏈主方法
public String handleParpComponent(String umid, String componentType,
String parpReportId, JSONObject executeParamJsonObj,
JSONObject additionParamJsonObj) {
if (componentType.equals(this.getComponentType())) {
return this.handle(umid, componentType, parpReportId,
executeParamJsonObj, additionParamJsonObj);
} else {
if (this.parpComponentHandler == null) {
return "";
} else {
return this.parpComponentHandler.handleParpComponent(umid,
componentType, parpReportId, executeParamJsonObj,
additionParamJsonObj);
}
}
}
executeParamJsonObj={"requestParam":{"pafaRetViewType":"jsp","reportId":"4CEEF5A9FF8C30DEE0531580140A0B2C"},"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"operateid":"73DE5721EF4D4A6D834FFD83B9B22084","cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}}
additionParamJsonObj={"componentParam":{"title":"","cols":[{"colname":"NAME","headName":"報表名"},{"colname":"OPR_USERNAME","headName":"用戶名"},{"colname":"IS_VALID","headName":"是否有效"},{"colname":"ACC_TYPE","headName":"訪問量"}],"type":"table","isPage":true,"componentID":"table_jB06XSUFFp","sqlid":"SQL_KZsxPqMkvG"},"userCheckTableColumn":{}}
c6.進入到查詢的handler(). ?ParpTableHandler.java?
封裝SQL。寫日志,配置數據源,執行查詢,根據模板把查詢數據填進去,設置HTML 再反回到頁面
handler(){
Map resultMap = customQueryService.createSqlIdMapTab(tableDTO,paramMap, extendAttrMap);
tableDTO.setQueryData((List) ((Map) resultMap.get("dataMap")).get(tableDTO.getSqlID()));
BeetTemplateUtil.render(tableDTO);
return tableDTO.getHtml();
}
createSqlIdMapTab(){
PARPDatasource.updateDataSource(extendAttrMap);
bindUserInfoToMap(extendAttrMap.get("uid"), mapVal,extendAttrMap);
bindUserUserclassNameToMap(extendAttrMap.get("uid"), "個險-新客服", mapVal,extendAttrMap);
String sql = BeetlKit.render(tableDTO.getSql(), mapVal);
dataMap.put(tableDTO.getSqlID(),
doWithPluginQuery(mapVal, tableDTO.isPage(), extendAttrMap));
Map titleMap = ReflectUtil.getTitleThreadLocal();
resultMap.put("titleMap", titleMap);
resultMap.put("dataMap", dataMap);
return resultMap;
}
查數據
doWithPluginQuery(){
writeToLog(extendAttrMap,"[##doWithPluginQuery begin end--]");
session = MybatisUtil.getSessionFactory().openSession();
if ("org.apache.hive.jdbc.HiveDriver".equals(extendAttrMap
.get("DRIVER_CLASS"))
&& null != extendAttrMap.get("HADOOP_QUEUE_CONF")
&& "" != extendAttrMap.get("HADOOP_QUEUE_CONF")) {
Map hadoopSetMap = new HashMap();
hadoopSetMap.put("sql", "set mapred.job.queue.name="
+ extendAttrMap.get("HADOOP_QUEUE_CONF"));
queryResult(hadoopSetMap, session);
}
mapVal.put("isPage", isPage);
return queryResult(mapVal, session);
}
模板封裝類
BeetTemplateUtil.java?
public static void render(TableDTO tableDTO) throws Exception {
Map mapVal = new HashMap();
if (TABLETYPE.equals(tableDTO.getType())) {
mapVal.put("queryData", tableDTO.getQueryData());
mapVal.put("head", tableDTO.getHead());
mapVal.put("pageDTO", tableDTO.getPageDTO());
mapVal.put("tablename", tableDTO.getTableName());
mapVal.put("divID", tableDTO.getDivID());
mapVal.put("tableTitle", tableDTO.getTableTitle());
tableDTO.setHtml(tempLate(tableDTO.getTableTempName(), mapVal));
} else if (HIVETYPE.equals(tableDTO.getType())) {
mapVal.put("queryData", tableDTO.getQueryData());
mapVal.put("head", tableDTO.getHead());
mapVal.put("limit", tableDTO.getLimit());
int totalPage = calcTotalPage(tableDTO.getQueryData().size(),
tableDTO.getLimit());
Map pagintionData = getPagintionDataInHive(tableDTO, totalPage);
mapVal.put("pagintionData", JSON.toJSON(pagintionData));
mapVal.put("totalPage", totalPage);
tableDTO.setHtml(tempLate(HIVENAME, mapVal));
} else if (ECHARTTYPE.equals(tableDTO.getType())) {
renderEChart(tableDTO);
} else if (CONTENTTYPE.equals(tableDTO.getType())) {
String content = readTxtFile(new FileInputStream(
tableDTO.getStorageRootPath() + "content.html"));
List list = tableDTO.getQueryData();
if (list != null && list.size() > 0) {
Map map = tableDTO.getQueryData().get(0);
tableDTO.setHtml(BeetlKit.render(content, map));
}
}
}
根據模板填數,把查詢結果的數據填寫到模板中生產str
模板代碼:table_new_default.txt ??
D:\Users\WANGDINGXIN732\Desktop\PARP_TOMCAT\tomcat-7.0.52\webapps\commonreport\WEB-INF\classes
BeetTemplateUtil。java
public static String tempLate(String txtName, Map mapVal)
throws IOException {
String classRoot = StringUtils.substringBeforeLast(
BeetTemplateUtil.class.getClassLoader().getResource(txtName)
.getPath(), "/");
GroupTemplate gt = new GroupTemplate(new FileResourceLoader(classRoot),
Configuration.defaultConfiguration());
Template t = gt.getTemplate("/" + txtName);
t.binding(mapVal);
return t.render();
}
問題:createSqlIdMapTab ?怎么調用的?
bindUserInfoToMap(extendAttrMap.get("uid"), mapVal,extendAttrMap);
bindUserUserclassNameToMap(extendAttrMap.get("uid"), "個險-新客服", mapVal,extendAttrMap);
dataMap.put(tableDTO.getSqlID(),doWithPluginQuery(mapVal, tableDTO.isPage(), extendAttrMap));
bindUserUserclassNameToMap?
mapVal.put("PARP_USER_USERCLASS_NAME", userRightQueryService.queryUserUserclassNameByRootName(umid, rootName));
PARP_USER_USERCLASS_NAME={username=, starttime=, umId=WANGYUPENG002, reportid=4CEEF5A9FF8C30DEE0531580140A0B2C, pageDTO=com.paic.reportportal.adapter.mybatisadapter.util.PageDTO@13755b5, PARP_USER_USERCLASS_NAME=[個險-新客服], currentPage=null, PARP_USER_INFO=com.paic.reportportal.exhibition.dto.UserDTO@1eeb142, reportname=}
doWithPluginQuery?
queryResult(mapVal, session);
/reportHead
{REPORT_TYPE_NAME=eoa_report, ID_MB_REPORT_EXTEND_ATTRS=4C9240E05E897E90E0531580140A835E, REPORT_NAME=wangdingxinTest, PWD_SOURCE=cyberark, TADAY_ISORNOT_SEND=Y, BI_IS_VALID=Y,?
BI_NAME=自定義BI, BI_VERSION=3.2.3, BI_EXTEND_ATTRS_TBL=PARP_MB_BI_EXTEND_ATTRS, CYBERARK_CRED_APPID=appID, MODULE_HTML_PATH=null, UPDATED_DATE=2017-04-11 15:00:12.0, IS_USER_VALIDATION=null,?
REFRESHURL=null, CYBERARK_AUTHNAME=parpopr, CREATED_DATE=2017-04-07 18:40:26.0, CREATED_BY=WANGYUPENG002, REPORT_EXTEND_ATTRS_TBL=PARP_MB_REPORT_EXTEND_ATTRS,?
ID_MB_BI_EXTEND_ATTRS=0717D4EE19C7FCB4E0531480140A5FF0, PASSWORD=parp1234, BI_TYPE_NAME=MyBatis, BI_DESC=自定義BI, CYBERARK_CRED_FILEPATH=null, REPORT_IS_VALID=Y,?
CYBERARK_PWD_FOLDER=folder, ID_BI_INFO=0717D4EE19C7FCB4E0531480140A5FF0, LINES_PER_PAGE=20, DOWNLOAD_TYPE=CSV, EOA_FINISH_SEND=Y, CYBERARK_PWD_KEY=key,
DRIVER_CLASS=oracle.jdbc.driver.OracleDriver, REPORT_DESC=wangdingxinTest當日發送批量修改測試01,?
DISPATCH_URL=http://localhost:8080/commonreport/, IS_REGULAR=N, UPDATED_BY=WANGYUPENG002, CYBERARK_PWD_SAFE=safe, REPORT_ACC_TYPE=API,?
SQLMAPPER=792/135/234/8D40A7974DBF6B9B56E4E7D513C867DD/, HEAD_EXCEL_PATH=null,?
USERNAME=parpdata, JDBC_URL=jdbc:oracle:thin:@d0parp.dbdev.paic.com.cn:1526:d0parp, ID_REPORT_INFO=4C9240E05E877E90E0531580140A835E, STATEMENT_ID=null, HEAD_HTML_PATH=null}
MB_REPORT_EXTEND_ATTRS
[{"nameArray":"[{'name':'NAME','asname':'NAME'},{'name':'OPR_USERNAME','asname':'OPR_USERNAME'},{'name':'IS_VALID','asname':'IS_VALID'},{'name':'COUNT','asname':'COUNT'}]","sql":"SELECT R.NAME AS NAME,L.OPR_USERNAME AS OPR_USERNAME,R.IS_VALID AS IS_VALID,R.ACC_TYPE AS COUNT FROM PARP_REPORT_OPR_LOG L, PARP_REPORT_OPR_INFO I, PARP_REPORT_INFO R WHERE L.QUERY_ID = I.QUERY_ID AND I.ID_REPORT_INFO = R.ID_REPORT_INFO <%if(reportname!=null&&reportname!=''){%> AND R.NAME LIKE '%'||#{reportname}||'%'<%}%> <%if(username!=null && username!=''){%> AND L.OPR_USERNAME LIKE '%'||#{username}||'%' <%}%><%if(starttime!=null && starttime!=''){%> AND to_char(L.CREATED_DATE,'YYYY-MM-DD')>=#{starttime}<%}%> ",
"sqlname":"SQL_wdxTest"},{"nameArray":"[{'name':'NAME','asname':'報表名稱'},{'name':'OPR_USERNAME','asname':'用戶名'},{'name':'IS_VALID','asname':'是否有效'},{'name':'COUNT(L.ID_REPORT_OPR_LOG)','asname':'訪問量'}]","sql":"SELECT R.NAME AS 報表名稱, ? ? ? L.OPR_USERNAME AS 用戶名, ? ?r.IS_VALID as 是否有效, ? COUNT(L.ID_REPORT_OPR_LOG) AS 訪問量 FROM PARP_REPORT_OPR_LOG L, PARP_REPORT_OPR_INFO I, PARP_REPORT_INFO R WHERE L.QUERY_ID = I.QUERY_ID ? AND I.ID_REPORT_INFO = R.ID_REPORT_INFO ? <%if(reportname!=null&&reportname!='')%> ? ?AND r.name LIKE '%'||#{reportname} ||'%' ?<%if(username!=null&&username!='')%> ? AND l.opr_username = #{username} ?<%if(starttime!=null&& starttime!='')%> ? AND to_char(L.created_date,'yyyy-mm-dd') >= #{starttime} ?<%if(valid!=null&&valid!=''){%>AND r.is_valid in ('${valid}')<%}%> ?GROUP BY R.ID_REPORT_INFO, R.NAME, L.OPR_USERNAME, ?r.IS_VALID",
"sqlname":"SQL_wdx_test0411"},{"nameArray":"[{'name':'dd','asname':'dd'}]","sql":"sss","sqlname":"SQL_vnURF7CGuj"}]
{attrDto={
ID_MB_REPORT_EXTEND_ATTRS=4C9240E05E897E90E0531580140A835E, ID_REPORT_EXTEND_ATTRS=4C9240E05E897E90E0531580140A835E, TADAY_ISORNOT_SEND=Y, MODULE_HTML_PATH=null,?
UPDATED_DATE=2017-04-11 15:00:12.0, EOA_FINISH_SEND=Y, DOWNLOAD_TYPE=CSV, CREATED_BY=WANGYUPENG002, CREATED_DATE=2017-04-07 18:40:26.0, UPDATED_BY=WANGYUPENG002,?
IS_REGULAR=N, SQLMAPPER=792/135/234/8D40A7974DBF6B9B56E4E7D513C867DD/, HEAD_EXCEL_PATH=null, ID_REPORT_INFO=4C9240E05E877E90E0531580140A835E, STATEMENT_ID=null,?
HEAD_HTML_PATH=null}, monitorData={MONITORSQL=null, ID_REPORT_INFO=4C9240E05E877E90E0531580140A835E, IS_VALID=N},
?mctDto=com.paic.reportportal.admin.dto.MailContentTemplateDTO@e9fd6c, eoaReportTypeId=0CC3C92BEFF847C0E0531480140A2241,
?typeList=[com.paic.reportportal.admin.dto.ReportType@111537a, com.paic.reportportal.admin.dto.ReportType@11153b5, com.paic.reportportal.admin.dto.ReportType@11153ef, com.paic.reportportal.admin.dto.ReportType@1115429, com.paic.reportportal.admin.dto.ReportType@1115465, com.paic.reportportal.admin.dto.ReportType@111549f, com.paic.reportportal.admin.dto.ReportType@11154db, com.paic.reportportal.admin.dto.ReportType@1115517, com.paic.reportportal.admin.dto.ReportType@1115554, com.paic.reportportal.admin.dto.ReportType@1115591, com.paic.reportportal.admin.dto.ReportType@11155d9, com.paic.reportportal.admin.dto.ReportType@111561e, com.paic.reportportal.admin.dto.ReportType@111565a, com.paic.reportportal.admin.dto.ReportType@1115696, com.paic.reportportal.admin.dto.ReportType@11156d0, com.paic.reportportal.admin.dto.ReportType@111570b, com.paic.reportportal.admin.dto.ReportType@1115745, com.paic.reportportal.admin.dto.ReportType@111578e, com.paic.reportportal.admin.dto.ReportType@11157ca, com.paic.reportportal.admin.dto.ReportType@1115804, com.paic.reportportal.admin.dto.ReportType@111585f, com.paic.reportportal.admin.dto.ReportType@111589b, com.paic.reportportal.admin.dto.ReportType@11158d6, com.paic.reportportal.admin.dto.ReportType@1115911]}
報表 數據查找的時候 最終生成的HTML代碼。
模板代碼:table_new_default.txt ??
D:\Users\WANGDINGXIN732\Desktop\PARP_TOMCAT\tomcat-7.0.52\webapps\commonreport\WEB-INF\classes
<table class="gridtable" width="100%">
<caption class="table_caption"></caption>
<tr>
<th>報表名</th>
<th>用戶名</th>
<th>是否有效</th>
<th>訪問量</th>
</tr>
<tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>子系統清單-PER及時完成率</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr><tr><td>管理報表_成本分類、成本屬性多維分析表</td><td>LIUBAO677</td><td>Y</td><td>SSO</td></tr><tr><td>2.月查詢-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>受益人-PER及時完成率</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>5.中心KPI單項指標_PER需求實現率</td><td>LIUBAO677</td><td>Y</td><td>SSO</td></tr><tr><td>6.中心KPI單項指標_非項目規范性</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PIR及時解決率(部門)</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>月查詢-PIR及時解決率(部門)</td><td>XINLIU786</td><td>Y</td><td>SSO</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-人均實現PER數量(部門)</td><td>XINLIU786</td><td>Y</td><td>API</td></tr><tr><td>月查詢-人均實現PER數量(部門)</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr><tr><td>月查詢-PER及時完成率(部門)</td><td>LIUBAO677</td><td>Y</td><td>API</td></tr>
</table>
<div class="search_page" style="width: 95%;">
<div class="pagination">
<ul>
<li class="disablepage">上一頁</li>
<li class="currentpage">1</li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',2)">2 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',3)">3 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',4)">4 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',5)">5 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',6)">6 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',7)">7 </a></li>
<li><a href="javascript:void(0)" οnclick="topageno('table_jB06XSUFFp',8)">8 </a></li>
<li><a href="javascript:void(0)"οnclick="topageno('table_jB06XSUFFp',2)">下一頁</a> </li>
<li><a href="javascript:void(0)"οnclick="topageno('table_jB06XSUFFp',5357)">尾頁</a> </li>
<li class="currentpage">共 5357 頁</li>
<li class="currentpage">共 ?107123 條數據</li>
</ul>
</div>
</div>
<!--搜索結果頁碼/翻頁結束-->
<div style="clear:both"></div>
定時器工作步驟:
1.bi-context-quarz.xml ?配置定時采集job作業類、配置作業調度方式、配置調度工廠
A。配置定時采集job作業類
<bean id="quartzTaskDownLoad3" class="com.paic.reportportal.admin.biz.quartz.QuartzTaskDownLoad">
<property name="period">
<bean id="com.paic.reportportal.admin.biz.quartz.QuartzDownLoadPeriod.Day" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean"> </bean>
</property>
</bean>
<bean id="dayDownLoadRunJobDetail" class="com.paic.pafa.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.paic.pafa.scheduling.quartz.ContextPojoJobInvoker</value>
</property>
<property name="jobDataAsMap"> ?
<map>
<entry key="beanID">
<value>quartzTaskDownLoad3</value>
</entry> ? ? ? ? ? ? ?
<entry key="methodName">
<value>run</value>
</entry>
</map> ?
</property>
<property name="group">
<value>${org.quartz.group.name}</value>
</property>
</bean>
B.配置作業調度觸發方式?
<bean id="dayDownLoadQuartzTaskRunTrigger" class="com.paic.pafa.scheduling.quartz.CronTriggerBean">
<property name="cronExpression">
<value>${download.QuartzTask.day.time}</value>
</property>
<property name="jobDetail">
<ref local="dayDownLoadRunJobDetail" />
</property>
<property name="group">
<value>${org.quartz.group.name}</value>
</property>
</bean>
C.配置調度工廠<!--定義scheduler -->
<bean id="schedulerFactory" class="com.paic.pafa.scheduling.quartz.SchedulerFactoryBean"
lazy-init="false">
<!--?
<property name="calendars">
<map>
<entry key="weekendCalendar">
<ref local="weekendCalendar" />
</entry>
</map>
</property>
-->
<property name="triggers">
<list>
<ref local="lifeQuartzTaskComputeCronTrigger" />
<ref local="lifeQuartzTaskSendMailRunTrigger" />
<ref local="adminQuartzTaskDeleteFileRunTrigger" />
<ref local="adminQuartzTaskComputeCronExpRunTrigger" />
<ref local="statisticsRunTrigger" />
<ref local="nasMonitorRunTrigger" />
<ref local="cognosMonitorRunTrigger" />
<ref local="dayDownLoadQuartzTaskRunTrigger" />
<ref local="noticeLockedUserRunTrigger" />
<ref local="batchReportMailRunTrigger" />
</list>
</property>
。。。。
</bean>
2.到時間 進入作業類,觸發作業方法 執行run()
QuartzTaskDownLoad.java ,run()
public void run() throws Exception {
log.info("============QuartzTaskDownLoad run=====period=" + period);
Map map = new HashMap();
queryDownLoadConf(map);
}
3.執行queryDownLoadConf(map);查詢數據庫中的數據采集定時任務列表
List<Map> list = downloadConfService.queryDownLoad(map);
for (Map maps : list) {
if(maps.get("TADAY_ISORNOT_SEND")==null||maps.get("TADAY_ISORNOT_SEND").equals("Y")){
appForward(maps);
}
}
4.appForward(maps)。配置URL ?postMethod, HttpClient 發送請求
public int appForward(Map map) throws Exception {
String url = getDispatchURL(String.valueOf(map.get("ID_REPORT_INFO")))
+ "api/downloadCollectionTask.do";
log.info("============QuartzTaskDownLoad run=====url=" + url);
PostMethod postMethod = new PostMethod(url);
Part[] parts = {
new StringPart("eoasessionid", URLEncoder.encode(
String.valueOf(map.get("EOA_SESSION_ID")), "utf-8")),
new StringPart("period", URLEncoder.encode(
String.valueOf(map.get("PERIOD")), "utf-8")) };
postMethod.setRequestEntity(new MultipartRequestEntity(parts,
postMethod.getParams()));
log.info("---EOA_SESSION_ID-------"
+ String.valueOf(map.get("EOA_SESSION_ID")));
log.info("============QuartzTaskDownLoad postMethod======");
log.info(postMethod);
HttpClient httpClient = new HttpClient();
// 執行請求發送
return httpClient.executeMethod(postMethod);
}
5.進入 /downloadCollectionTask 任務方法 組合封裝數據。ExportController.java
submitExportTask(mapVal, (String) mapVal.get("umid"), true);
6.submitExportTask()方法。ExportController.java
private void submitExportTask(Map mapVal, String umid, boolean isEoa) {
log.info("============submitExportTask========");
fileLogService.log((String)mapVal.get("operateid"), "============submitExportTask========", (String)mapVal.get("reportid"));
log.info(mapVal);
fileLogService.log((String)mapVal.get("operateid"), mapVal.toString(),(String)mapVal.get("reportid") );
FileTaskDTO dto = new FileTaskDTO(exportService, mapVal, umid, mailSAO,
reportInfoService, umSearchService, userRightQueryService,fileLogService);
if (isEoa) {
dto.setMailModule("EOAMODULE");
}
recordExportInfoAndSubmitTask(mapVal, umid, dto);
}
7.recordExportInfoAndSubmitTask()。ExportController.java
downloadThreadPool.submitTask(new ExportTask(fileTaskDto, idExport),idExport);
8.submitTask() 提交任務 DownloadThreadPool.java?
public void submitTask(Runnable task, String idExport) {
log.info("==Before submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
executor.submit(task);
log.info("==After submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
}
9.ExportTask.Java。線程執行run()方法。 任務的主題方法 發送郵件/下載
查詢數據庫數據采集定時任務列表SQL
<select id="downloadn.select.download" parameterClass="java.util.HashMap" resultClass="java.util.HashMap">
select ?t.effective_date,t.expiry_date,t.period,t1.eoa_session_id, t1.query_condition, t1.umid, t1.id_report_info,t2.taday_isornot_send ?
from?
? ?(select t.id_parp_eoa_session,t.period,t.effective_date,t.expiry_date,effective_time from PARP_REGULAR_DOWNLOAD_CONF t where upper(period)='DAY'
? ? ? union?
? ?select t.id_parp_eoa_session,t.period,t.effective_date,t.expiry_date,effective_time from PARP_REGULAR_DOWNLOAD_CONF t where upper(period)='MONTH' and instr(term,#month#)>0
? ? ? union?
? ?select t.id_parp_eoa_session,t.period,t.effective_date,t.expiry_date,effective_time from PARP_REGULAR_DOWNLOAD_CONF t where upper(period)='WEEK' and instr(term,#week#)>0) t?
? ?,parp_report_eoa_session_detail t1,PARP_MB_REPORT_EXTEND_ATTRS t2,parp_report_info t3
where t1.eoa_session_id=t.id_parp_eoa_session?
?and t1.id_report_info=t2.id_report_info
?and t2.id_report_info=t3.id_report_info
? ? ? and t3.is_valid='Y'
<![CDATA[
?and to_date(t.effective_date,'yyyy-mm-dd')<=to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd')
]]>
<![CDATA[
and ?to_date(t.expiry_date,'yyyy-mm-dd')>=to_date(to_char(sysdate, 'yyyy-mm-dd'), 'yyyy-mm-dd')
]]>
<![CDATA[
and to_date(t.effective_time,'HH24:mi')<=to_date(#end#,'HH24:mi') and to_date(t.effective_time,'HH24:mi')>=to_date(#start#,'HH24:mi')
?]]>
</select>
報表編譯舊方法(上傳寫好的壓縮包)
1)前臺頁面鏈接 ?MB_REPORT_EXTEND_ATTRS.jsp?
<input type="text" style="display:none" name="extend_attrs_sqlmapper" id="extend_attrs_sqlmapper" size="50" value="${attrDto.SQLMAPPER}" isval="false"/>
<span id="filename"></span>
<span style="display:none;" id="showloading"><img src="/parp/images/page/loading-small.gif"/></span>      
<span οnclick="$(this).uploadFile(
{'i_name':'extend_attrs_sqlmapper',
'i_url':'<c:url value='/api/getTokenInfo?pafaRetViewType=js'/>',
'_ajax':true,
'callbackurl':'<c:url value='/api/admin/memoryreport/rebackFilePath?pafaRetViewType=jsp&filepath='/>'
}
)"?
id="uploadspanextend_attrs_sqlmapper" style="cursor:pointer">報表配置上傳</span>;
2)進入后臺 ?MemoryReportController.java ? ? /rebackFilePath
return "/admreport/rebackFilePath";
3) 在MB_REPORT_EXTEND_ATTRS.jsp ? ?加載 rebackFilePath.jsp 頁面?
<script language="javaScript">
window.parent.parent.reback(window.parent.parent.uploadArray.i_name,decodeURI('${filepath}'));
</script>
4)加載jquery-upload.js js方法 ? ?uploadArray.showUpload ? 加載上傳文件的文件筐 綁定提交方法
showUpload:function(target){
uploadArray.popUpShowing=true;
if($(target).val()==""||$(target).val()==null){
var y=$(target).offset().top;
var x=$(target).offset().left;
var i_h=$(target).width();
var input_file="<div class='up_ipt'><input type='file' name='file_name' id='file_name' size='"+$(target).attr('size')+"'/></div><div class='up_btn'>upload..</div>";
$("#upload_div").css({'position':'absolute','top':y-1+'px','left':x+'px','z-index':'999'}).empty().append(input_file);
$('.up_btn').click(uploadArray._ajaxEvent);
}
}
5)點擊提交 執行提交方法 uploadArray._ajaxEvent?
_ajaxEvent:function(e){
if(uploadArray._ajax){
uploadArray._ajaxjson();
}else{
uploadArray._ajaxfile();
}
}
6)進入 _ajaxfile js 方法?
_ajaxfile:function(e){
uploadArray.popUpShowing=true;
var id=uploadArray.i_name;
$.ajaxFileUpload({
?data:{'token':uploadArray.token,'callbackurl':''},
?url:uploadArray.i_url!=""?uploadArray.i_url:'/parp/api/upLoadFile?pafaRetViewType=jsp',
?secureuri:false, ? ? ? ? ? ? ? ? ? ? ??
?fileElementId: 'file_name', ? ? ? ? ??
?dataType:'text', ? ? ? ? ? ? ? ? ? ? ?
?success:function(data, status){
$('#'+id).val($.trim(data));
$('#'+id).css('color','red');
uploadArray.hideupload();
?},
?error:function(data, status, e){
?alert("上傳失敗,請重試!");
?}
?});
},
7)進入上傳文件的后臺Action ?UpLoadFileController.java ? /upLoadFile
把上傳的文件寫到 新模板編譯的地址里面去,相當于轉換成老方法
點擊上傳 寫文件
8)點擊確認把 上傳文件保存路徑 寫到DB中去
見 新增保存插入報表基本信息/存儲路徑過程:
<html><body>
<iframe name="callbackiframe" src="http://localhost:7001/parp/api/admin/memoryreport/rebackFilePath?pafaRetViewType=jsp&filepath=534/393/976/B76E0CF3CDC947498E65E0689CCCA2DC/">
</iframe>
</body></html>
報表下載
1)報表查詢主頁面CommonReport.jsp ?執行下載方法
<div class="icon_down"><a href="javascript:void(0);" οnclick="showdowanload(this);"></a>
2)parp-table.js ?showdowanload() function
添加下載div ?鏈接 ?<div><a href=\"javascript:void(0)\" οnclick=\"parpDownloadComponentData('" + divId + "')\">" + name + "</a></div>";
3)點擊 進入方法 parpDownloadComponentData(),執行下載方法 ? ; ?parp-report-tools.js
dataLoaderCopy.addOrModifyQueryDataJsonByKey("downloadType", dataLoaderCopy.getQueryDataJsonByKey("type"));
// 修改提交數據類型為download
dataLoaderCopy.addOrModifyQueryDataJsonByKey("type", "download");
dataLoaderCopy.downloadData();
4)進入 parpDataLoader.js ?downloadData();
$.ajax({
type:"POST",
data: "parpQueryDataJson=" + queryCondition + "&isMoreReceive=" + isMoreReceive.value + "&isMoreReceiveFlag=" + isMoreReceiveFlag,
url: ?this.submitUrl,
contentType:"application/x-www-form-urlencoded; charset=utf-8",
dataType: "text",
success: function (data) {
},?
error: function (XMLHttpRequest,textStatus,errorThrown) {
}
});
5)進入后臺 ? /doQueryParpReportData ?方法
return new String(componentHandleChain(umid, parpReportId,
executeParamJsonObj, additionParamJsonObj).getBytes("UTF-8"),"ISO-8859-1");
6)進入componentHandleChain 方法。構造任務鏈,并循環判斷進入相應的任務方法
// 構造責任鏈
ParpComponentHandlerService beginHandler = parpComponentHandlerChainService.getParpComponentHandlerChain();
String componentHandleResult = beginHandler.handleParpComponent(umid,componentType, parpReportId, executeParamJsonObj,additionParamJsonObj);
任務方法: ParpChartHandler.java
ParpComponentHandlerChainServiceImpl.java
ParpDownloadHandler.java
ParpEoaHandler.java
ParpSelectHandler.java
ParpTableHandler.java
ParpTextHandler.java
7)進入任務方法。例如下載 ?ParpDownloadHandler
A. handle() 主方法
submitExportTask(
convertDownloadParamStr(executeParamJsonObj,additionParamJsonObj, reportId), umid);
B.convertDownloadParamStr() Map convertDownloadParamStr(JSONObject executeParamJsonObj,JSONObject additionParamJsonObj, String reportId) throws Exception { }
設置文件下載的 請求參數、sql模板、sql,文件數據名 ?等參數封裝到 map里。
// 構造TableDTO
TableDTO tableDTO = new TableDTO();
FileUtil.readTableFile(tableDtoParamMap, tableDTO, colMap);
// 將頁面請求中的參數設置到下載參數中
JSONObject requestParamJsonObj = executeParamJsonObj
.getJSONObject("requestParam");
if (null != requestParamJsonObj) {
for (String key : requestParamJsonObj.keySet()) {
paramMap.put(key, requestParamJsonObj.getString(key));
}
}
String reportFilePath = reportInfoService.queryReportFilePath(reportId);
// 查詢并設置SQL文件所在路徑
String file = reportFilePath.substring(0,reportFilePath.lastIndexOf("/") + 1);
tableDTO.setStorageRootPath(storageRootPath + file);
// 設置SQL模板內容
tableDTO.setSql(FileUtil.readTxtFile(new FileInputStream(tableDTO.getStorageRootPath() + tableDTO.getSqlID() + ".sql")));
// 設置所使用的table模板文件
tableDTO.setTableTempName("table_new_default.txt");
paramMap.put("tableDTO", tableDTO);
paramMap.put("reportid", reportId);
paramMap.put("operateid", operateid);
// 設置數據文件名稱
paramMap.put("tablename",additionParamJsonObj.getJSONObject("componentParam").getString("componentID"));
C.submitExportTask()
private void submitExportTask(Map mapVal, String umid) {
log.info("============submitExportTask========");
fileLogService.log((String)mapVal.get("operateid"), "============submitExportTask========", (String)mapVal.get("reportid"));
log.info(mapVal);
fileLogService.log((String)mapVal.get("operateid"), mapVal.toString(), (String)mapVal.get("reportid"));
recordExportInfoAndSubmitTask(mapVal, umid, new FileTaskDTO(
exportService, mapVal, umid, mailSAO, reportInfoService,
umSearchService, userRightQueryService,fileLogService));
}
D。 FileTaskDTO() 封裝下載時所需要的業務邏輯
public FileTaskDTO(ExportService exportService, Map mapVal, String userID,
MailSAO mailSAO, ReportInfoService reportInfoService,
UmSearchService umSearchService,
UserRightQueryService userRightQueryService,FileLogService fileLogService) {
super();
this.exportService = exportService;
this.mapVal = mapVal;
this.userID = userID;
this.mailSAO = mailSAO;
this.reportInfoService = reportInfoService;
this.umSearchService = umSearchService;
this.userRightQueryService = userRightQueryService;
this.fileLogService = fileLogService;
}
E.recordExportInfoAndSubmitTask() ?插入下載文件路勁,ID;更新日志到數據庫;提交下載任務
downloadThreadPool.submitTask(new ExportTask(fileTaskDto, idExport),idExport);
F:submitTask() ?DownloadThreadPool.java 提交任務?
public void submitTask(Runnable task, String idExport) {
log.info("==Before submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
executor.submit(task);
log.info("==After submit task[" + idExport + "]\n Queue size is:"
+ getQueueTaskSize());
}
G:ExportTask(); ExportTask.java ?構造初始化任務,
public void run() {} 線程執行,
H:run() ?下載導出,發送郵件
fileLogService.log(operateid, "========exportToNas1========", reportid);
String naspath = exportService.exportToNas(mapVal);
修改下載路徑狀態
reportInfoService.updateExcelFilePath(dto);
發送郵件:mailSAO.sendMailNoFile(ExportExcelUtil.assembleMail(
dto,
StringUtils.substringAfterLast(naspath, "/"),
(String) mapVal.get("DISPATCH_URL"),
reportInfoService,
(String) mapVal.get("reportid")));
--報表下載保存的路徑
?insert into parp_export_data_detail(id_parp_export, id_report_info, naspath, query_condition, state, umid)
? ? ? ? values (?, ?, ?, ?, ?, ?)
? ? ? ??
insert into PARP_REPORT_LOGINFO(ID_PARP_LOGINFO,id_report_info,report_operate_id,naslogpath,ID_PARP_EXPORT)
values(sys_guid(),#reportid#,#operateid#,#naslogpath#,#exportid#)
JSON字符串:
{"executeParam":{"queryParam":{"reportname":"","username":"","starttime":"","umId":"WANGYUPENG002"},"cnNameParam":{"reportname":"報表名","username":"用戶名","starttime":"開始時間"}},"additionParam":{"componentParam":{"cols":[{"headName":"報表名","colname":"NAME"},{"headName":"用戶名","colname":"OPR_USERNAME"},{"headName":"是否有效","colname":"IS_VALID"},{"headName":"訪問量","colname":"ACC_TYPE"}],"sqlid":"SQL_KZsxPqMkvG","type":"download","isPage":true,"componentID":"table_jB06XSUFFp","title":"","downloadType":"table"},"userCheckTableColumn":{}}}
JSON 對象:
{"executeParam":{"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}},"additionParam":{"componentParam":{"title":"","cols":[{"colname":"NAME","headName":"報表名"},{"colname":"OPR_USERNAME","headName":"用戶名"},{"colname":"IS_VALID","headName":"是否有效"},{"colname":"ACC_TYPE","headName":"訪問量"}],"downloadType":"table","type":"download","isPage":true,"componentID":"table_jB06XSUFFp","sqlid":"SQL_KZsxPqMkvG"},"userCheckTableColumn":{}}}
查詢條件參數:
{"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}}
組裝后的JSON對象
{"requestParam":{"pafaRetViewType":"jsp","reportId":"4CEEF5A9FF8C30DEE0531580140A0B2C","isMoreReceiveFlag":"false","isMoreReceive":"undefined"},"queryParam":{"username":"","umId":"WANGYUPENG002","starttime":"","reportname":""},"operateid":"9913079B76A04EA8BC42B335741929E6","cnNameParam":{"username":"用戶名","starttime":"開始時間","reportname":"報表名"}}
{"componentParam":{"title":"","cols":[{"colname":"NAME","headName":"報表名"},{"colname":"OPR_USERNAME","headName":"用戶名"},{"colname":"IS_VALID","headName":"是否有效"},{"colname":"ACC_TYPE","headName":"訪問量"}],"downloadType":"table","type":"download","isPage":true,"componentID":"table_jB06XSUFFp","sqlid":"SQL_KZsxPqMkvG"},"userCheckTableColumn":{}}
多線程線程池 隊列
DownloadThreadPool.java?
有界隊列:
workQueue = new ArrayBlockingQueue<Runnable>(this.blockingQueueSize);
無界隊列:
workQueue = new LinkedBlockingQueue<Runnable>(this.blockingQueueSize);
重寫異常處理機制
DefaultRejectedExecutionHandler.java
executor.getQueue().put(r);//改成阻塞式的提交 ?add bu Wangdingxin
總體架構
1.首先進入后臺管理 所有攔截器 UserWebInterceptor.java ? preHandle 代理方法
http://parp-core-stg1.paic.com.cn/parp/pages/eoa/setEoaTemplet.jsp?url=http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2962d86dedc269809728f3926e4060cc&requestSysname=PARP_CORE&sysId=PARP_CORE1968173659
http://localhost:7001/parp/pages/eoa/setEoaTemplet.jsp?url=http://eoadev.paic.com.cn:7001/eoa/setOutsysTemplate.do?validateId=979e36299ae1167e01e1d48c8cbc4837&requestSysname=PARP_CORE&sysId=PARP_CORE1492922801
http://localhost:7001/parp/pages/eoa/setEoaTemplet.jsp?url=http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2b0583552aad30c8e2b3c75554f51f5d&requestSysname=PARP_CORE&sysId=PARP_CORE1280936807
http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2962d86dedc269809728f3926e4060cc&requestSysname=PARP_CORE&sysId=PARP_CORE1968173659
http://oas-eoa10-stg1.paic.com.cn/eoa/setOutsysTemplate.do?validateId=2b0583552aad30c8e2b3c75554f51f5d&requestSysname=PARP_CORE&sysId=PARP_CORE1280936807
http://eoadev.paic.com.cn:7001/ ? eoa/setOutsysTemplate.do?validateId=979e36299ae1167e01e1d48c8cbc4837&requestSysname=PARP_CORE&sysId=PARP_CORE1492922801
http://eoadev.paic.com.cn:7001/eoa/setOutsysTemplate.do?validateId=d0d530f89e3e7a8d34e7a5501cb20363&requestSysname=PARP_CORE&sysId=PARP_CORE138281584
http://eoadev.paic.com.cn:7001/eoa/setOutsysTemplate.do?
總結
以上是生活随笔為你收集整理的动态数据采集业务逻辑的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 程序员如何写一份更好的简历
 - 下一篇: 远程桌面看不到任务栏怎么办?