1 /**通用ajax服务的定义对象
2
3 * services可以是单个服务对象,也可以是service服务数组
4 * 具体服务的定义请参考appendServices成员函数
5 */
6 function Service(services){
7 //一直到299行
8 this.services=[];
9 this.shareParameters={};
10 /**添加共享参数,在这里统一设置共享参数
11 */
12 this.addShareParameters=function(shareParameters){
13 this.shareParameters=shareParameters;
14 return this;
15 };
16 /**
17 * 批量调用一般服务
18
19 * 入参可以是一个调用服务的数组或者单个调用服务
20
21 * 每个调用服务有下面的属性
22
23 * serviceId 服务Id,不可为空
24
25 * method 服务方法名,不可为空
26 * parameters 服务参数,必须是object,object的属性名代表参数名,属性值代表参数值。
27
28 * transform:结果集的转换规则(返回结果集合List<Map<String,Object>>时才会用到):null(无转换)、'firstRow'(取首行)、'breakdown'(分列),值不区分大小写
29 * shareResults 共享服务的返回结果,默认不共享false,如果后续服务需要使用到结果里面的参数,
30 * 那么就需要明确指定。该参数可以是 boolean,array或者object,为true时表示全部共享;
31 * 数组可以指定返回值中需要共享的值的名,这样返回值的键值对应关系共享;
32 * object可以额外指定共享名的别名,当要求返回值以新的字段名共享、
33
34 * 或者一个以多个新别名共享时就需要用到这种类型,object的属性名表示结果集中需要共享的字段名,
35 * 属性值表示新的字段名;
36
37 * 参数共享处理列表结果集时,整个结果集的数据存放在别名为空串的特殊key上。如果本业务没有返回结果,那么参数共享无效。
38
39 * useShare 使用共享参数标志,定义方式与shareResults一样,意义正好想对应。该参数指明如果从共享参数中获取要的值。
40
41 * shareNotNull 校验共享参数是否为空,作为useShare的附属属性。
42
43 * 有时希望如果获取到的共享参数是空的,那么不继续执行,那么可以在这里指定哪些一定不能为空。
44
45 * 目前只允许三种取值,null,true和别名数组,null表示不校验,true表示全校验,别名数组表示只校验指定的值(别名是指useShare中新的别名,并非共享池里面的共享别名)。
46
47 */
48 this.appendServices=function(services){//到128行
49 if(!services){
50 return this;
51 }
52 //默认按批量形式添加服务,如果是单个,那么用数组包装
53
54 var tmp_services=services;
55 if(!$.isArray(tmp_services)){
56 tmp_services = [tmp_services];
57 }
58 //每个service必须有serviceId,method
59 for(index in tmp_services){
60 //检查必录项
61 if(!tmp_services[index].serviceId||!tmp_services[index].method){
62 FWalert('服务定义的serviceId和method不可为空');
63 return this;
64 }
65 //检查可选项
66 if(tmp_services[index].parameters){
67 if(typeof tmp_services[index].parameters !='object'
68 ||jQuery.isArray(tmp_services[index].parameters)){
69 FWalert('服务定义的参数必须是map!');
70 return;
71 }
72 }
73 //如果指定了transform,那么值只能是规定的
74
75 if(tmp_services[index].transform){
76 if('FIRSTROW'!=tmp_services[index].transform.toUpperCase()
77 &&'BREAKDOWN'!=tmp_services[index].transform.toUpperCase()){
78 FWalert('transform属性不正确');
79 return this;
80 }
81 }
82 //shareResults
83 //转换shareResults,统一转换成map,或者boolean
84 shareResults = tmp_services[index].shareResults;
85 if(shareResults){
86 if(typeof shareResults =='boolean'){
87 if(!shareResults){
88 shareResults =null;
89 }
90 }else if(jQuery.isArray(shareResults)){
91 //转化为map
92 shareResults={};
93 $.each(tmp_services[index].shareResults,function(indexInArray, valueOfElement){
94 shareResults[valueOfElement]=valueOfElement;
95 });
96 tmp_services[index].shareResults =shareResults;
97 }
98 }
99 //useShare
100 useShare = tmp_services[index].useShare;
101 if(useShare){
102 if(typeof useShare =='boolean'){
103 if(!useShare){
104 tmp_services[index].useShare =null;
105 }
106 }else if(jQuery.isArray(useShare)){
107 //转化为map
108 useShare={};
109 $.each(tmp_services[index].useShare,function(indexInArray, valueOfElement){
110 useShare[valueOfElement]=valueOfElement;
111 });
112 tmp_services[index].useShare =useShare;
113 }
114 }
115 //shareNotNull,只允许true和字符串数组
116 shareNotNull = tmp_services[index].shareNotNull;
117 if(shareNotNull){
118 if(typeof shareNotNull !=='boolean' && !jQuery.isArray(shareNotNull)){
119 FWalert('参数[shareNotNull]的取值必须是true或者字符串数组!');
120 return this;
121 }else if(shareNotNull ===false){
122 tmp_services[index].shareNotNull = null;
123 }
124 }
125 }
126 this.services=this.services.concat(tmp_services);
127 return this;
128 };
129 /**定义添加直接调用存储过程的服务
130
131 * 可以批量添加存储过程。每个存储过程服务的有以下属性:
132 * procName、parameters、shareResults、useShare,
133
134 * 其中procName指明存储过程的名称,其他的请参考appendServices;parameters中的参数名不能是procName
135 * 批量添加存储过程时,用数组存储各个存储过程作为参数传入即可。
136
137 * ...
138 */
139 this.appendProc=function(procedures){
140 如果传入的参数是空,null,''等,那么就返回该对象,实际上就是返回 new Service() 这个对象,@wyl
141 if(!procedures){
142 return this;
143 }
144 默认按批量形式添加服务,如果是单个,那么用数组包装
145 如果传入的不是数组,那么就把这个对象包装成数组,@wyl,并且用临时变量存起来
146 tmp_procedures=procedures;
147 if(!$.isArray(tmp_procedures)){
148 tmp_procedures = [tmp_procedures];
149 }
150 //遍历,一个一个的处理
151 procedure_services =[];
152 for (index in tmp_procedures){
153 //必须有configId属性
154
155 procedure = tmp_procedures[index];
156 if(!procedure.procName){
157 FWalert('存储过程服务必须指定procName属性');
158 return this;
159 }
160 procedure = $.extend(true,{},procedure,
161 {serviceId:'directJdbcService',method:'savePointProcedure'
162 ,parameters:{'':procedure.procName}});
163 //去掉存储过程名称
164 delete procedure.procName;
165 //添加到服务列表
166
167 procedure_services.push(procedure);
168 }
169 return this.appendServices(procedure_services);
170 };
171 /**定义添加调用预定义查询语句的服务
172 * 可以批量添加查询语句。每个查询服务的包括以下属性:
173 * configId、transform、indices,parameters、shareResults、useShare。
174
175 * configId是Mapper.xml中的配置ID(注意写上空间名)
176 * parameters是传递给configId的参数
177
178 * transform:结果集的转换规则:null(无转换)、'firstRow'(取首行)、'breakdown'(分列),值不区分大小写
179
180 * ,该参数要求传入字符串数组类型,元素值指明参数Map中的一个参数名。
181
182 * 其它属性将作为查询语句的备用参数。其他的请参考appendServices;
183
184 * 批量添加查询服务时,用数组存储各个查询服务作为参数传入即可。
185
186 * ...
187 */
188 this.appendQuery=function(querys){
189 if(!querys){
190 return this;
191 }
192 //默认按批量形式添加服务,如果是单个,那么用数组包装
193
194 tmp_querys=querys;
195 if(!$.isArray(tmp_querys)){
196 tmp_querys = [tmp_querys];
197 }
198 //遍历,一个一个的处理
199 query_services = [];
200 for (index in tmp_querys){
201 //必须有configId属性
202
203 var query = tmp_querys[index];
204 if(!query.configId){
205 FWalert('查询服务必须指定configId属性');
206 return this;
207 }
208 //参数索引放入参数串中
209 query = $.extend(true,{},query,
210 {serviceId:'commService',method:'query'
211 ,parameters:{'_commDo':query.configId}});
212
213 //去掉存储过程名称,和参数索引
214 delete query.configId;
215
216 //添加到服务列表
217
218 query_services.push(query);
219 }
220 return this.appendServices(query_services);
221 };
222 /**定义触发ajax的事件
223
224 * message:本次ajax请求的名称,可选。
225
226 * success:处理成功后触发的函数,原型是function(data)。
227
228 * error:处理是否时触发的函数,原型是function(XMLHttpRequest, textStatus, errorThrown);
229 * async:同步或是异步,同步为false、异步是true
230 */
231 this.sentAjax=function(message,success,error,async){
232 if(this.services.length==0){
233 FWalert('请至少添加一个服务');
234 return;
235 }
236 var t_async = true;
237 var t_message = message;
238 var t_success = success;
239 var t_error = error;
240 if(jQuery.isFunction(message)){
241 t_message = '正在请求服务,请稍候...';
242 t_success =message;
243 t_error = success;
244 }else if (typeof message != 'string'){
245 FWalert('入参错误,请检查程序!');
246 return ;
247 }
248 if(async!=null&&typeof async=='boolean'){
249 if(!async){
250 t_async = false;
251 }
252 }
253 var thisrequest={};
254 $.ajax({
255 url:contextPath+'/ajax.do'
256 ,data:{parameters:JSON.stringify(this.services),shareArguments:JSON.stringify(this.shareParameters)}
257 ,dataType :'json'
258 ,cache:false
259 ,async:t_async
260 ,type:'post'
261 ,error:function (request, textStatus, errorThrown) {
262 if(!t_error){
263 FWalert('数据请求错误!');
264 }else{
265 t_error(request, textStatus, errorThrown);
266 }
267 }
268 ,success:function (data, textStatus) {
269 //校验业务处理是否正确执行
270 if("1"!=data.FHZ){//出错了,弹出错误提醒
271 if ("loginTimeout" == data.FHZ) {
272 if(window.confirm(data.MSG||'')){
273 window.top.location.href=_selfUrl;
274 }
275 } else {
276 if(t_error){
277 t_error(data.MSG||'', 'serviceErr', data.MSG);
278 }else{
279 FWalert(data.MSG||'');
280 }
281 }
282 }else if(!t_success){
283 }else{
284 t_success(data.RTN);
285 }
286 }
287 ,beforeSend:function( ){
288 $.data(thisrequest,'msg',showMsg(t_message,-1));
289 //createProgressBar();
290 }
291 ,complete:function( ){
292 hideMsg($.data(thisrequest,'msg'));
293 }
294 });
295 };
296 //添加参数
297 if(services){
298 this.appendServices(services);
299 }
300 }
301 /**
302 * 在页面的左上角显示错误消息
303
304 * @param msg 消息内容
305 * @param timeout 秒为单位,0或者负数表示不自动隐藏
306 * @author 吴英德
307
308 **/
309 var framework_message_layer;
310 var clearIntervalID;
311 function showMsg(msg,delay){
312
313 var recurrectLocation=function(){
314 if(framework_message_layer==null)
315 {clearInterval(clearIntervalID);return;}
316 var posX,posY;
317 if (window.innerHeight) {
318 posX = window.pageXOffset;
319 posY = window.pageYOffset;
320 }
321 else if (document.documentElement && document.documentElement.scrollTop) {
322 posX = document.documentElement.scrollLeft;
323 posY = document.documentElement.scrollTop;
324 }
325 else if (document.body) {
326 posX = document.body.scrollLeft;
327 posY = document.body.scrollTop;
328 }
329 framework_message_layer.style.top=String(posY+10)+'px';
330 framework_message_layer.style.right=String(posX+10)+'px';
331 };
332 if(framework_message_layer == null){
333 framework_message_layer=document.createElement('div');
334 framework_message_layer.className='err_message_blank_board';
335 document.body.appendChild(framework_message_layer);
336 clearIntervalID=window.setInterval(recurrectLocation,100);
337 recurrectLocation();
338 }
339 var my_div = document.createElement('div');
340 my_div.className='err_message';
341 //Element.extend(my_div);
342 my_div.innerHTML=msg;
343 framework_message_layer.appendChild(my_div);
344 recurrectLocation();
345 if(delay>0){
346 setTimeout(function(){
347 jQuery(my_div).remove();
348 if(jQuery(framework_message_layer).is(':empty')){
349 jQuery(framework_message_layer).remove();
350 window.clearInterval(clearIntervalID);
351 framework_message_layer=null;
352 }
353 },delay*1000);
354 }else{
355 return my_div;
356 }
357 }
358
359 /**隐藏右上角对应的消息
360 * @param object 某消息对象,来自showMsg的返回值
361
362 */
363 function hideMsg(object){
364 jQuery(object).remove();
365 }