动态数据采集业务逻辑

来源:互联网 发布:三角洲部队 百度软件 编辑:程序博客网 时间:2024/05/16 04:41
数据采集之后台管理模块


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}&currentPage='
});
});
</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.javaList<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);" onclick="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);" onclick="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);" onclick="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="确认" onclick="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" onclick="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);" onclick="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)" onsubmit="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)" onsubmit="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>
&nbsp;<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="查询" onclick="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="确 定" onclick="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)"onclick="topageno('table_jB06XSUFFp',2)">2 </a></li>
<li><a href="javascript:void(0)"onclick="topageno('table_jB06XSUFFp',3)">3 </a></li>
<li><a href="javascript:void(0)"onclick="topageno('table_jB06XSUFFp',4)">4 </a></li>
<li><a href="javascript:void(0)"onclick="topageno('table_jB06XSUFFp',5)">5 </a></li>
<li><a href="javascript:void(0)"onclick="topageno('table_jB06XSUFFp',6)">6 </a></li>
<li><a href="javascript:void(0)"onclick="topageno('table_jB06XSUFFp',7)">7 </a></li>
<li><a href="javascript:void(0)"onclick="topageno('table_jB06XSUFFp',8)">8 </a></li>
<li><a href="javascript:void(0)"onclick="topageno('table_jB06XSUFFp',2)">下一页</a></li>
<li><a href="javascript:void(0)"onclick="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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<span onclick="$(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);" onclick="showdowanload(this);"></a>
2)parp-table.js  showdowanload() function
添加下载div  链接  <div><a href=\"javascript:void(0)\" onclick=\"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?
0 0
原创粉丝点击