fw.ajax.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. /**
  2. * @author herong 框架-Ajax基类
  3. */
  4. var CFWAjax = _FW.fCreateClass();
  5. /**
  6. * Ajax API
  7. */
  8. CFWAjax.prototype = {
  9. /**
  10. * 初始化
  11. * */
  12. fInitialize : function(options) {
  13. },
  14. /**
  15. * ajax调用Service
  16. * 通过ajax直接请求调用中间层业务处理类(Service)
  17. * @param sServiceName
  18. * (必需) 业务Service类名和方法名,格式: 首字母小写的类名.方法名(方法入参类型必须为IDTO)
  19. * @param mParams
  20. * 入参数json对象,key要求大写
  21. * @param sMessage
  22. * 提示信息
  23. * @param fnSuccessCallback
  24. * (必需) 成功回调方法,方法格式:function(mData){}
  25. * @param fnFailureCallback
  26. * 失败回调方法,方法格式:function(oRequest, sTextStatus, oErrorThrown)
  27. * 此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  28. * @param bSync
  29. * 调用方式:同步/异步。true :异步,false:同步,默认为false
  30. *
  31. * <pre>
  32. * <b>使用举例:</b>
  33. * //传参
  34. * var mParams = {
  35. * &quot;ID&quot; : &quot;1111&quot;,
  36. * &quot;NAME&quot; : &quot;herong&quot;
  37. * };
  38. *
  39. * CFW.oAJax.doService(&quot;bxgxService.query&quot;, mParams, &quot;调用Service &quot;,
  40. * function(mData) {
  41. * //调用成功后返回数据
  42. * }
  43. * );
  44. *
  45. * 或:
  46. *
  47. * CFW.oAJax.doService(&quot;bxgxService.query&quot;, mParams,
  48. * function(mData) {
  49. * //调用成功后返回数据
  50. * }, function(oRequest, sTextStatus, oErrorThrown) {
  51. * //调用失败处理。此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  52. * }
  53. * );
  54. * </pre>
  55. */
  56. doService : function(sServiceName, mParams,sMessage, fnSuccessCallback,
  57. fnFailureCallback, bSync) {
  58. var aServices=[];
  59. var mShareParameters={};
  60. var mServices={};
  61. if(!sServiceName){
  62. return this;
  63. }
  64. var serviceParam=sServiceName.split(".");//service 参数数组,包括service名和方法名
  65. if(serviceParam.length==0 || serviceParam.length>2){
  66. CFW.oWin.fnAlert('服务(sServiceName)定义不正确,请核实!');
  67. return this;
  68. }
  69. if(!serviceParam[0] || !serviceParam[1]){
  70. CFW.oWin.fnAlert('服务定义的serviceId和method不可为空');
  71. return this;
  72. }
  73. if(mParams){
  74. if(typeof mParams !='object'
  75. ||jQuery.isArray(mParams)){
  76. CFW.oWin.fnAlert('服务定义的参数必须是map!');
  77. return;
  78. }
  79. }
  80. mServices.serviceId=serviceParam[0];
  81. mServices.method=serviceParam[1];
  82. mServices.parameters=mParams;
  83. aServices.push(mServices);
  84. var bSync1 = true;
  85. var fnSuccess = fnSuccessCallback;
  86. var fnFailure = fnFailureCallback;
  87. if(bSync!=null&&typeof bSync=='boolean'){
  88. if(!bSync){
  89. bSync1 = false;
  90. }
  91. }
  92. this._fnDoAjax(aServices,mShareParameters,sMessage,fnSuccess,fnFailure,bSync1);
  93. },
  94. /**
  95. * ajax调用存储过程
  96. * 通过ajax直接请求调用存储过程
  97. * @param sProcName
  98. * (必需) 业务存储过程全名,格式:包名.过程名
  99. * @param mParams
  100. * 入参数json对象,key要求大写
  101. * @param sMessage
  102. * 提示信息
  103. * @param fnSuccessCallback
  104. * (必需) 成功回调方法,方法格式:function(mData){}
  105. * @param fnFailureCallback
  106. * 失败回调方法,方法格式:function(oRequest, sTextStatus, oErrorThrown)
  107. * 此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  108. * @param bSync
  109. * 调用方式:同步/异步。true :异步,false:同步,默认为false
  110. *
  111. * <pre>
  112. * <b>使用举例:</b>
  113. * //传参
  114. * var mParams = {
  115. * &quot;ID&quot; : &quot;1111&quot;,
  116. * &quot;NAME&quot; : &quot;herong&quot;
  117. * };
  118. *
  119. * CFW.oAJax.doProc(&quot;pkg_sms.p_test&quot;, mParams, null,
  120. * function(mData) {
  121. * //调用成功后返回数据
  122. * }
  123. * );
  124. *
  125. * 或:
  126. *
  127. * CFW.oAJax.doProc(&quot;pkg_sms.p_test&quot;, mParams, &quot;调用存储过程&quot;,
  128. * function(mData) {
  129. * //调用成功后返回数据
  130. * }, function(oRequest, sTextStatus, oErrorThrown) {
  131. * //调用失败处理。此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  132. * }
  133. * );
  134. *
  135. * </pre>
  136. */
  137. doProc : function(sProcName, mParams,sMessage,fnSuccessCallback, fnFailureCallback,
  138. bSync) {
  139. var aServices=[];
  140. var mShareParameters={};
  141. var mServices={};
  142. if(!sProcName){
  143. return this;
  144. }
  145. if(mParams){
  146. if(typeof mParams !='object'
  147. ||jQuery.isArray(mParams)){
  148. CFW.oWin.fnAlert('服务定义的参数必须是map!');
  149. return;
  150. }
  151. }
  152. mParams['']=sProcName;
  153. mServices.serviceId='directJdbcService';
  154. mServices.method='savePointProcedure';
  155. mServices.parameters=mParams;
  156. aServices.push(mServices);
  157. var bSync1 = true;
  158. var fnSuccess = fnSuccessCallback;
  159. var fnFailure = fnFailureCallback;
  160. if(bSync!=null&&typeof bSync=='boolean'){
  161. if(!bSync){
  162. bSync1 = false;
  163. }
  164. }
  165. this._fnDoAjax(aServices,mShareParameters,sMessage,fnSuccess,fnFailure,bSync1);
  166. },
  167. /**
  168. * ajax执行单个查询
  169. * 通过ajax直接请求Mapper单个查询
  170. * @param sId
  171. * (必需) Mapper配置ID
  172. * @param mParams
  173. * 入参
  174. * @param sMessage
  175. * 提示信息
  176. * @param fnSuccessCallback
  177. * (必需) 成功回调方法,方法格式:function(mData){}
  178. * @param fnFailureCallback
  179. * 失败回调方法,方法格式:function(oRequest, sTextStatus, oErrorThrown)
  180. * 此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  181. * @param sTransform
  182. * 结果集的转换规则:null(无转换)、'firstRow'(取首行)、'breakdown'(分列),值不区分大小写
  183. * @param bSync
  184. * 调用方式:同步/异步。true :异步,false:同步,默认为false
  185. *
  186. * <pre>
  187. * <b>使用举例:</b>
  188. * //传参
  189. * var mParams = {
  190. * &quot;ID&quot; : &quot;1111&quot;,
  191. * &quot;NAME&quot; : &quot;herong&quot;
  192. * };
  193. *
  194. * CFW.oAJax.doQuery(&quot;FW_TEST.TBL_Q&quot;, mParams, &quot;调用Mapper &quot;,
  195. * function(mData) {
  196. * //调用成功后返回数据
  197. * }
  198. * );
  199. *
  200. * 或:
  201. *
  202. * CFW.oAJax.doQuery(&quot;FW_TEST.TBL_Q&quot;, mParams,
  203. * function(mData) {
  204. * //调用成功后返回数据
  205. * }, function(oRequest, sTextStatus, oErrorThrown) {
  206. * //调用失败处理。此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  207. * }
  208. * );
  209. *
  210. * </pre>
  211. */
  212. doQuery : function(sId, mParams, sMessage, fnSuccessCallback,
  213. fnFailureCallback, sTransform, bSync) {
  214. var aServices=[];
  215. var mShareParameters={};
  216. var mServices={};
  217. if(!sId){
  218. CFW.oWin.fnAlert('查询服务必须指定configId属性');
  219. return this;
  220. }
  221. if(mParams){
  222. if(typeof mParams !='object'
  223. ||jQuery.isArray(mParams)){
  224. CFW.oWin.fnAlert('服务定义的参数必须是map!');
  225. return this;
  226. }
  227. }
  228. //如果指定了transform,那么值只能是规定的
  229. if(sTransform){
  230. if('FIRSTROW'!=sTransform.toUpperCase()
  231. &&'BREAKDOWN'!=sTransform.toUpperCase()){
  232. CFW.oWin.fnAlert('transform属性不正确');
  233. return this;
  234. }
  235. }
  236. mParams["_commDo"]=sId;
  237. mServices.serviceId='commService';
  238. mServices.method='query';
  239. mServices.parameters=mParams;
  240. mServices.transform=sTransform;
  241. aServices.push(mServices);
  242. var bSync1 = true;
  243. var fnSuccess = fnSuccessCallback;
  244. var fnFailure = fnFailureCallback;
  245. if(bSync!=null&&typeof bSync=='boolean'){
  246. if(!bSync){
  247. bSync1 = false;
  248. }
  249. }
  250. this._fnDoAjax(aServices,mShareParameters,sMessage,fnSuccess,fnFailure,bSync1);
  251. },
  252. /**
  253. * ajax混合调用,同时调用多个操作
  254. * <pre> 同时调用多个操作 在同一个事物中同时调用多个Action, action: 服务Id,不可为空
  255. * transform: 结果集的转换规则(返回结果集合List<Map<String,Object>>时才会用到):
  256. * null(无转换)、'firstRow'(取首行)、'breakdown'(分列),值不区分大小写。
  257. * 默认不转换。
  258. * shareResults: 共享服务的返回结果,默认不共享false,如果后续服务需要使用到结果里面的参数, 那么就需要明确指定。该参数可以是
  259. * boolean,array或者object,规则如下: 如果值为true时表示全部共享;
  260. * 如果值为array数组,则可以指定返回值中需要共享的值的名,这样返回值的键值对应关系共享;
  261. * 如果值为object对象,则可以额外指定共享名的别名,当要求返回值以新的字段名共享、
  262. * 或者一个以多个新别名共享时就需要用到这种类型,object的属性名表示结果集中需要共享的字段名,属性值表示新的字段名;
  263. * 参数共享处理列表结果集时,整个结果集的数据存放在别名为空串的特殊key上。如果本业务没有返回结果,那么参数共享无效。
  264. * useShare:
  265. * 使用共享参数标志,定义方式与shareResults一样,意义正好想对应。该参数指明是否从共享参数中获取要的值。默认不共享。
  266. * shareNotNull:
  267. * 校验共享参数是否为空,作为useShare的附属属性,默认不校验。 有时希望如果获取到的共享参数是空的,那么不继续执行,那么可以在这里指定哪些一定不能为空。
  268. * 目前只允许三种取值,null,true和别名数组:
  269. * null(即不指定参数值)表示不校验;
  270. * true表示全校验,别名数组表示只校验指定的值(别名是指useShare中新的别名,并非共享池里面的共享别名)。 </pre>
  271. *
  272. * @param aActions
  273. * (必需) 操作定义,格式: [
  274. * {"action":"action1","transform":"","shareResults":"false","useShare":"","shareNotNull":""},
  275. * {"action":"action2","transform":"","shareResults":"false","useShare":"","shareNotNull":""} ]
  276. *
  277. * @param mParams
  278. * 入参,必须是object,object的属性名代表参数名,属性值代表参数值。
  279. * @param sMessage
  280. * 提示信息
  281. * @param fnSuccessCallback
  282. * (必需) 成功回调方法,方法格式:function(mData){}
  283. * @param fnFailureCallback
  284. * 失败回调方法,方法格式:function(oRequest, sTextStatus, oErrorThrown)
  285. * 此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  286. * @param bSync
  287. * 调用方式:同步/异步。true :异步,false:同步,默认为false
  288. *
  289. * <pre>
  290. * <b>使用举例:</b>
  291. * var action1 = [
  292. * {&quot;action&quot;:&quot;bxgxService.query&quot;},
  293. * {&quot;action&quot;:&quot;pkg_sms.p_test&quot;}
  294. * ];
  295. *
  296. * var action2 = [
  297. * {&quot;action&quot;:&quot;bxgxService.query&quot;,&quot;transform&quot;:&quot;firstRow&quot;,&quot;shareResults&quot;:&quot;true&quot;,&quot;useShare&quot;:&quot;&quot;,&quot;shareNotNull&quot;:&quot;&quot;},
  298. * {&quot;action&quot;:&quot;pkg_sms.p_test&quot;,&quot;transform&quot;:&quot;&quot;,&quot;shareResults&quot;:&quot;false&quot;,&quot;useShare&quot;:&quot;true&quot;,&quot;shareNotNull&quot;:&quot;&quot;}
  299. * ];
  300. * //传参
  301. * var mParams = {
  302. * &quot;ID&quot; : &quot;1111&quot;,
  303. * &quot;NAME&quot; : &quot;herong&quot;
  304. * };
  305. *
  306. * CFW.oAJax.doAction(action1, mParams, &quot;混合调用 &quot;,
  307. * function(mData) {
  308. * //调用成功后返回数据
  309. * }
  310. * );
  311. *
  312. * 或:
  313. *
  314. * CFW.oAJax.doAction(action2, mParams,
  315. * function(mData) {
  316. * //调用成功后返回数据
  317. * }, function(oRequest, sTextStatus, oErrorThrown) {
  318. * //调用失败处理。此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  319. * }
  320. * );
  321. *
  322. * </pre>
  323. */
  324. doAction : function(aActions, mParams, sMessage,fnSuccessCallback,
  325. fnFailureCallback, bSync) {
  326. if(aActions.length==0){
  327. CFW.oWin.fnAlert('请至少添加一个服务');
  328. return;
  329. }
  330. var aServices=[];
  331. var mShareParameters={};
  332. for(var index=0; index<aActions.length;index++){
  333. var mServices={};
  334. var action=aActions[index].action;
  335. if(!action){
  336. CFW.oWin.fnAlert('action不能为空,请核实!');
  337. return;
  338. }
  339. var exec = action.split(".");
  340. if(exec.length!=2){
  341. CFW.oWin.fnAlert('action格式不正确,请核实!');
  342. return;
  343. }
  344. var prefix = exec[0];
  345. if(prefix.lastIndexOf("Service")>0){//如果是service
  346. $.extend(true,mServices,{parameters:mParams},
  347. {serviceId:exec[0],method:exec[1]});
  348. }else if(action.toLowerCase().match('^pkg_\\w+\\.\\w+$')){//如果是存储过程
  349. $.extend(true,mServices,{parameters:mParams},
  350. {serviceId:'directJdbcService',method:'savePointProcedure'
  351. ,parameters:{'':action}});
  352. }else{//其余的为mapper
  353. $.extend(true,mServices,{parameters:mParams},
  354. {serviceId:'commService',method:'query'
  355. ,parameters:{'_commDo':action}});
  356. }
  357. //如果指定了transform,那么值只能是规定的
  358. if(aActions[index].transform){
  359. if('FIRSTROW'!=aActions[index].transform.toUpperCase()
  360. &&'BREAKDOWN'!=aActions[index].transform.toUpperCase()){
  361. CFW.oWin.fnAlert('transform属性不正确');
  362. return this;
  363. }
  364. mServices.transform=aActions[index].transform;
  365. }
  366. //shareResults
  367. //转换shareResults,统一转换成map,或者boolean
  368. shareResults = aActions[index].shareResults;
  369. if(shareResults){
  370. if(typeof shareResults =='boolean'){
  371. if(!shareResults){
  372. shareResults =null;
  373. }
  374. }else if(jQuery.isArray(shareResults)){
  375. //转化为map
  376. shareResults={};
  377. $.each(aActions[index].shareResults,function(indexInArray, valueOfElement){
  378. shareResults[valueOfElement]=valueOfElement;
  379. });
  380. }
  381. mServices.shareResults =shareResults;
  382. }
  383. //useShare
  384. useShare = aActions[index].useShare;
  385. if(useShare){
  386. if(typeof useShare =='boolean'){
  387. if(!useShare){
  388. useShare =null;
  389. }
  390. }else if(jQuery.isArray(useShare)){
  391. //转化为map
  392. useShare={};
  393. $.each(aActions[index].useShare,function(indexInArray, valueOfElement){
  394. useShare[valueOfElement]=valueOfElement;
  395. });
  396. }
  397. mServices.useShare =useShare;
  398. }
  399. //shareNotNull,只允许true和字符串数组
  400. shareNotNull = aActions[index].shareNotNull;
  401. if(shareNotNull){
  402. if(typeof shareNotNull !=='boolean' && !jQuery.isArray(shareNotNull)){
  403. CFW.oWin.fnAlert('参数[shareNotNull]的取值必须是true或者字符串数组!');
  404. return this;
  405. }else if(shareNotNull ===false){
  406. shareNotNull = null;
  407. }
  408. mServices.shareNotNull = shareNotNull;
  409. }
  410. aServices.push(mServices);
  411. }
  412. var bSync1 = true;
  413. var fnSuccess = fnSuccessCallback;
  414. var fnFailure = fnFailureCallback;
  415. if(bSync!=null&&typeof bSync=='boolean'){
  416. if(!bSync){
  417. bSync1 = false;
  418. }
  419. }
  420. this._fnDoAjax(aServices,mShareParameters, sMessage,fnSuccess,fnFailure,bSync1);
  421. },
  422. /**
  423. * ajax将参数转换成model直接调用action
  424. *
  425. * @param oper
  426. * 调用的action名称和方法名以"."分隔
  427. *
  428. * @param params
  429. * 共享参数
  430. * @param datas
  431. * 模型对象 离散型参数以"ncm_gt_"开头,格式为{ncm_gt_XXXX:{params:{AAC001:'xxxx','AAB010':'xxxxx'}}}
  432. * 列表行参数以"ncm_glt_"开头,格式为 {ncm_glt_XXXX:{dataset:[{AAC001:'xxxx','AAB010':'xxxxx'},{AAC001:'xxxx','AAB010':'xxxxx'}]}}
  433. * @param sMessage
  434. * 提示信息
  435. * @param fnSuccessCallback
  436. * (必需) 成功回调方法,方法格式:function(mData){}
  437. * @param fnFailureCallback
  438. * 失败回调方法,方法格式:function(oRequest, sTextStatus, oErrorThrown)
  439. * 此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  440. * @param bSync
  441. * 调用方式:同步/异步。true :异步,false:同步,默认为false
  442. *
  443. */
  444. fnDoAjaxModel : function(oper,params,datas,sMessage,fnSuccessCallback,fnFailureCallback,bSync){
  445. var tdata={};
  446. tdata.oper=oper;
  447. tdata.params=params;
  448. tdata.datas=datas;
  449. var mRequest={};
  450. if(!sMessage){
  451. sMessage='正在请求服务,请稍候...';
  452. }else if(typeof sMessage != 'string'){
  453. CFW.oWin.fnAlert('入参错误,请检查程序!');
  454. return ;
  455. }
  456. var fnShowMSG=this._fnShowMsg(sMessage, -1);
  457. if(AJAX_SHOW_PROCESSBAR){
  458. CFW.oTip.fnOpenProcess();
  459. }
  460. $.ajax({
  461. url:contextPath+'/ajaxModel.do'
  462. ,data:{params:JSON.stringify(tdata)}
  463. ,dataType :'json'
  464. ,cache:false
  465. ,async:bSync
  466. ,contentType: "application/x-www-form-urlencoded; charset=utf-8"
  467. ,type:'post'
  468. ,error:function (request, textStatus, errorThrown) {
  469. if(!fnFailureCallback){
  470. CFW.oWin.fnAlert('数据请求错误!');
  471. }else{
  472. fnFailureCallback('数据请求错误!', {'type':'App'});
  473. }
  474. }
  475. ,success:function (data, textStatus) {
  476. if(data!=null && data[headtoken]!=null){
  477. token=data[headtoken];//更新全局变量token标志
  478. }
  479. //校验业务处理是否正确执行
  480. if("1"!=data.FHZ){//出错了,弹出错误提醒
  481. if ("loginTimeout" == data.FHZ) {
  482. if(window.confirm(data.MSG||'')){
  483. window.top.location.href=_selfUrl;
  484. }
  485. } else if("CSRF" == data.FHZ){
  486. showMsg(data.MSG||'',3);
  487. return;
  488. } else {
  489. if(fnFailureCallback){
  490. fnFailureCallback(data.MSG||'', {'type':data.FHZ}, data.MSG);
  491. }else{
  492. CFW.oWin.fnAlertStyle(data.MSG||'',{'type':data.FHZ});
  493. }
  494. }
  495. }else if(!fnSuccessCallback){
  496. }else{
  497. fnSuccessCallback(data.RTN);
  498. }
  499. }
  500. ,beforeSend:function(XMLHttpRequest){
  501. var cToken = $.cookie(headtoken) || token;XMLHttpRequest.setRequestHeader(headtoken,cToken);
  502. $.data(mRequest,'msg',fnShowMSG);
  503. //createProgressBar();
  504. }
  505. ,complete:function( ){
  506. jQuery($.data(mRequest,'msg')).remove();
  507. if(AJAX_SHOW_PROCESSBAR){
  508. CFW.oTip.fnCloseProcess();
  509. }
  510. }
  511. });
  512. },
  513. /**
  514. * ajax混合调用,同时调用多个操作
  515. * <pre> 同时调用多个操作 在同一个事物中同时调用多个Action, action: 服务Id,不可为空
  516. * transform: 结果集的转换规则(返回结果集合List<Map<String,Object>>时才会用到):
  517. * null(无转换)、'firstRow'(取首行)、'breakdown'(分列),值不区分大小写。
  518. * 默认不转换。
  519. * shareResults: 共享服务的返回结果,默认不共享false,如果后续服务需要使用到结果里面的参数, 那么就需要明确指定。该参数可以是
  520. * boolean,array或者object,规则如下: 如果值为true时表示全部共享;
  521. * 如果值为array数组,则可以指定返回值中需要共享的值的名,这样返回值的键值对应关系共享;
  522. * 如果值为object对象,则可以额外指定共享名的别名,当要求返回值以新的字段名共享、
  523. * 或者一个以多个新别名共享时就需要用到这种类型,object的属性名表示结果集中需要共享的字段名,属性值表示新的字段名;
  524. * 参数共享处理列表结果集时,整个结果集的数据存放在别名为空串的特殊key上。如果本业务没有返回结果,那么参数共享无效。
  525. * useShare:
  526. * 使用共享参数标志,定义方式与shareResults一样,意义正好想对应。该参数指明是否从共享参数中获取要的值。默认不共享。
  527. * shareNotNull:
  528. * 校验共享参数是否为空,作为useShare的附属属性,默认不校验。 有时希望如果获取到的共享参数是空的,那么不继续执行,那么可以在这里指定哪些一定不能为空。
  529. * 目前只允许三种取值,null,true和别名数组:
  530. * null(即不指定参数值)表示不校验;
  531. * true表示全校验,别名数组表示只校验指定的值(别名是指useShare中新的别名,并非共享池里面的共享别名)。 </pre>
  532. *
  533. * @param aServices
  534. * service数组
  535. *
  536. * @param mShareParameters
  537. * 共享参数
  538. * @param sMessage
  539. * 提示信息
  540. * @param fnSuccessCallback
  541. * (必需) 成功回调方法,方法格式:function(mData){}
  542. * @param fnFailureCallback
  543. * 失败回调方法,方法格式:function(oRequest, sTextStatus, oErrorThrown)
  544. * 此回调可以根据情况覆盖框架默认错误处理,框架默认错误处理已满足大部分需求。
  545. * @param bSync
  546. * 调用方式:同步/异步。true :异步,false:同步,默认为false
  547. *
  548. */
  549. _fnDoAjax : function(aServices,mShareParameters,sMessage,fnSuccessCallback,fnFailureCallback,bSync){
  550. var mRequest={};
  551. if(!sMessage){
  552. sMessage='正在请求服务,请稍候...';
  553. }else if(typeof sMessage != 'string'){
  554. CFW.oWin.fnAlert('入参错误,请检查程序!');
  555. return ;
  556. }
  557. var fnShowMSG=this._fnShowMsg(sMessage, -1);
  558. if(AJAX_SHOW_PROCESSBAR){
  559. CFW.oTip.fnOpenProcess();
  560. }
  561. $.ajax({
  562. url:contextPath+'/ajaxAdapter.do'
  563. ,data:{parameters:JSON.stringify(aServices),shareArguments:JSON.stringify(mShareParameters)}
  564. ,dataType :'json'
  565. ,cache:false
  566. ,async:bSync
  567. ,contentType: "application/x-www-form-urlencoded; charset=utf-8"
  568. ,type:'post'
  569. ,error:function (request, textStatus, errorThrown) {
  570. if(!fnFailureCallback){
  571. CFW.oWin.fnAlert('数据请求错误!');
  572. }else{
  573. fnFailureCallback('数据请求错误!', {'type':'App'});
  574. }
  575. }
  576. ,success:function (data, textStatus) {
  577. if(data!=null && data[headtoken]!=null){
  578. token=data[headtoken];//更新全局变量token标志
  579. }
  580. //校验业务处理是否正确执行
  581. if("1"!=data.FHZ){//出错了,弹出错误提醒
  582. if ("loginTimeout" == data.FHZ) {
  583. if(window.confirm(data.MSG||'')){
  584. window.top.location.href=_selfUrl;
  585. }
  586. } else if("CSRF" == data.FHZ){
  587. showMsg(data.MSG||'',3);
  588. if(fnFailureCallback){
  589. fnFailureCallback(data.MSG||'', {'type':data.FHZ}, data.MSG);
  590. }
  591. return;
  592. } else {
  593. if(fnFailureCallback){
  594. fnFailureCallback(data.MSG||'', {'type':data.FHZ}, data.MSG);
  595. }else{
  596. CFW.oWin.fnAlertStyle(data.MSG||'',{'type':data.FHZ});
  597. }
  598. }
  599. }else if(!fnSuccessCallback){
  600. }else{
  601. fnSuccessCallback(data.RTN);
  602. }
  603. }
  604. ,beforeSend:function(XMLHttpRequest){
  605. var cToken = $.cookie(headtoken) || token;XMLHttpRequest.setRequestHeader(headtoken,cToken);
  606. $.data(mRequest,'msg',fnShowMSG);
  607. //createProgressBar();
  608. }
  609. ,complete:function( ){
  610. jQuery($.data(mRequest,'msg')).remove();
  611. if(AJAX_SHOW_PROCESSBAR){
  612. CFW.oTip.fnCloseProcess();
  613. }
  614. }
  615. });
  616. },
  617. /**
  618. * 在页面的左上角显示错误消息
  619. * @param sMsg 消息内容
  620. * @param iDelay 秒为单位,0或者负数表示不自动隐藏
  621. **/
  622. _fnShowMsg : function(sMsg,iDelay){
  623. var framework_message_layer;
  624. var clearIntervalID;
  625. var recurrectLocation=function(){
  626. if(framework_message_layer==null)
  627. {clearInterval(clearIntervalID);return;}
  628. var posX,posY;
  629. if (window.innerHeight) {
  630. posX = window.pageXOffset;
  631. posY = window.pageYOffset;
  632. }
  633. else if (document.documentElement && document.documentElement.scrollTop) {
  634. posX = document.documentElement.scrollLeft;
  635. posY = document.documentElement.scrollTop;
  636. }
  637. else if (document.body) {
  638. posX = document.body.scrollLeft;
  639. posY = document.body.scrollTop;
  640. }
  641. framework_message_layer.style.top=String(posY+10)+'px';
  642. framework_message_layer.style.right=String(posX+10)+'px';
  643. };
  644. if(framework_message_layer == null){
  645. framework_message_layer=document.createElement('div');
  646. framework_message_layer.className='err_message_blank_board';
  647. document.body.appendChild(framework_message_layer);
  648. clearIntervalID=window.setInterval(recurrectLocation,100);
  649. recurrectLocation();
  650. }
  651. var my_div = document.createElement('div');
  652. my_div.className='err_message';
  653. //Element.extend(my_div);
  654. my_div.innerHTML=sMsg;
  655. framework_message_layer.appendChild(my_div);
  656. recurrectLocation();
  657. if(iDelay>0){
  658. setTimeout(function(){
  659. jQuery(my_div).remove();
  660. if(jQuery(framework_message_layer).is(':empty')){
  661. jQuery(framework_message_layer).remove();
  662. window.clearInterval(clearIntervalID);
  663. framework_message_layer=null;
  664. }
  665. },iDelay*1000);
  666. }else{
  667. return my_div;
  668. }
  669. }
  670. };