fw.comm.js 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090
  1. /**
  2. * @author herong
  3. * 公共类
  4. */
  5. var CFWComm = _FW.fCreateClass();
  6. /**
  7. * 公共类API
  8. */
  9. CFWComm.prototype = {
  10. /**
  11. * 初始化
  12. * */
  13. fInitialize : function(options) {
  14. },
  15. /**
  16. * 类似oracle数据库的nvl函数
  17. * 主要是判断传入对象是空值的话,就替换成传入的默认值
  18. * @param sInputs 被判断对象
  19. * @param sDefaultValue 默认值
  20. * @return 如果sInputs为空,则返回sDefaultValue,若不为空,返回sInputs
  21. * <pre>
  22. * 使用举例:
  23. * var _aResult = CFW.oComm.fnNvl("null",1);//为空时,设置默认值为1
  24. * </pre>
  25. */
  26. fnNvl : function (sInputs,sDefaultValue){
  27. if(typeof(sInputs)=="undefined" || sInputs==null || sInputs=="" || sInputs.toLowerCase()=="null"){
  28. return sDefaultValue;
  29. }else{
  30. return sInputs;
  31. }
  32. },
  33. /**
  34. * 加法函数
  35. * @param double dInput1 (必需)数值1
  36. * @param double dInput2 (必需)数值2
  37. * @returns double dInput1与dInput2相加后的值
  38. * <pre>
  39. * 使用举例:
  40. * var _aResult = CFW.oComm.fnAdd(_iAge,60);//如计算年龄加上60年的值
  41. * </pre>
  42. */
  43. fnAdd : function (dInput1,dInput2){
  44. var r1,r2,m,v,r,t,c;
  45. if(CFW.oValid.fnIsNull(dInput1,"CFW.oComm.fnAdd 数值1")){
  46. return ;
  47. }
  48. if(CFW.oValid.fnIsNull(dInput2,"CFW.oComm.fnAdd 数值2")){
  49. return ;
  50. }
  51. if(!CFW.oValid.fnIsFloat(dInput1)){
  52. return ;
  53. }
  54. if(!CFW.oValid.fnIsFloat(dInput2)){
  55. return ;
  56. }
  57. try{r1=dInput1.toString().split(".")[1].length;}catch(e){r1=0;}
  58. try{r2=dInput2.toString().split(".")[1].length;}catch(e){r2=0;}
  59. /*
  60. m = Math.pow(10,Math.max(r1,r2));
  61. v = (dInput1*m+dInput2*m)/m;
  62. if(v==0){return v;}
  63. r = Math.max(r1,r2);
  64. if(r!=0){
  65. if(v>=0){
  66. v = v+0.000000001; //需要进行特殊处理 例如 135.67 + 1.2=136.869999999999998
  67. }else{
  68. v = v-0.000000001; //需要进行特殊处理 例如 0 - 0.23
  69. }
  70. }
  71. t = v.toString();
  72. if(r!=0){
  73. var iPos = t.indexOf(".");
  74. var re = t.substr(0,iPos + r + 1);
  75. t = re;
  76. }
  77. return t;
  78. */
  79. //使用上述算法:出现异常:8508072.95+2666814.76的返回结果是11174887.70 正常应该返回11174887.71
  80. c = Math.abs(r1 - r2);
  81. m = Math.pow(10, Math.max(r1, r2));
  82. if (c > 0) {
  83. var cm = Math.pow(10, c);
  84. if (r1 > r2) {
  85. dInput1 = Number(dInput1.toString().replace(".", ""));
  86. dInput2 = Number(dInput2.toString().replace(".", "")) * cm;
  87. } else {
  88. dInput1 = Number(dInput1.toString().replace(".", "")) * cm;
  89. dInput2 = Number(dInput2.toString().replace(".", ""));
  90. }
  91. } else {
  92. dInput1 = Number(dInput1.toString().replace(".", ""));
  93. dInput2 = Number(dInput2.toString().replace(".", ""));
  94. }
  95. return (dInput1 + dInput2) / m;
  96. },
  97. /**
  98. * 减法函数
  99. * @param double dInput1(必需) 数值1
  100. * @param double dInput2(必需) 数值2
  101. * @returns double 减后值
  102. * <pre>
  103. * 使用举例:
  104. * var _aResult = CFW.oComm.fnSub(_iAge,60);//如计算年龄减去60年的值
  105. * </pre>
  106. */
  107. fnSub : function (dInput1,dInput2){
  108. var r1,r2,m,v,r,t;
  109. if(CFW.oValid.fnIsNull(dInput1,"CFW.oComm.fnSub 数值1")){
  110. return ;
  111. }
  112. if(CFW.oValid.fnIsNull(dInput2,"CFW.oComm.fnSub 数值2")){
  113. return ;
  114. }
  115. if(!CFW.oValid.fnIsFloat(dInput1)){
  116. return ;
  117. }
  118. if(!CFW.oValid.fnIsFloat(dInput2)){
  119. return ;
  120. }
  121. try{r1=dInput1.toString().split(".")[1].length;}catch(e){r1=0;}
  122. try{r2=dInput2.toString().split(".")[1].length;}catch(e){r2=0;}
  123. m = Math.pow(10,Math.max(r1,r2));
  124. v = (dInput1*m - dInput2*m)/m;
  125. if(v==0){return v;}
  126. r = Math.max(r1,r2);
  127. if(r!=0){
  128. if(v>=0){
  129. v = v+0.000000001; //需要进行特殊处理 例如 135.67 + 1.2=136.869999999999998
  130. }else{
  131. v = v-0.000000001; //需要进行特殊处理 例如 0 - 0.23
  132. }
  133. }
  134. t = v.toString();
  135. if(r!=0){
  136. var iPos = t.indexOf(".");
  137. var re = t.substr(0,iPos + r + 1);
  138. t = re;
  139. }
  140. return t;
  141. },
  142. /**
  143. * js 乘法函数
  144. * @param double dInput1(必需)数值1
  145. * @param double dInput2(必需)数值2
  146. * @returns double 乘后值
  147. * <pre>
  148. * 使用举例:
  149. * var _aResult = CFW.oComm.fnMult(_iJfjs,12);//如计算缴费基数乘以12个月的结果
  150. * </pre>
  151. */
  152. fnMult : function (dInput1,dInput2){
  153. var i,j,v;
  154. if(CFW.oValid.fnIsNull(dInput1,"CFW.oComm.fnMult 数值1")){
  155. return ;
  156. }
  157. if(CFW.oValid.fnIsNull(dInput2,"CFW.oComm.fnMult 数值2")){
  158. return ;
  159. }
  160. if(!CFW.oValid.fnIsFloat(dInput1)){
  161. return ;
  162. }
  163. if(!CFW.oValid.fnIsFloat(dInput2)){
  164. return ;
  165. }
  166. dInput1=String(dInput1);
  167. dInput2=String(dInput2);
  168. i=dInput1.length-dInput1.indexOf(".")-1;
  169. i=(i>=dInput1.length)?0:i;
  170. j=dInput2.length-dInput2.indexOf(".")-1;
  171. j=(j>=dInput2.length)?0:j;
  172. v=dInput1.replace(".","")*dInput2.replace(".","")/Math.pow(10,i+j);
  173. return v;
  174. },
  175. /**
  176. * js 除法函数
  177. * @param double dInput1(必需)数值1
  178. * @param double dInput2(必需)数值2
  179. * @returns double 除后值
  180. * <pre>
  181. * 使用举例:
  182. * var _aResult = CFW.oComm.fnDiv(_iJfje,12);//如计算缴费金额除以12个月的结果
  183. * </pre>
  184. */
  185. fnDiv : function (dInput1,dInput2){
  186. var t1=0,t2=0,r1,r2,v;
  187. if(CFW.oValid.fnIsNull(dInput1,"CFW.oComm.fnDiv 数值1")){
  188. return ;
  189. }
  190. if(CFW.oValid.fnIsNull(dInput2,"CFW.oComm.fnDiv 数值2")){
  191. return ;
  192. }
  193. if(!CFW.oValid.fnIsFloat(dInput1)){
  194. return ;
  195. }
  196. if(!CFW.oValid.fnIsFloat(dInput2)){
  197. return ;
  198. }
  199. if(dInput2==0){
  200. return;
  201. }
  202. try{t1=dInput1.toString().split(".")[1].length;}catch(e){}
  203. try{t2=dInput2.toString().split(".")[1].length;}catch(e){}
  204. with(Math){
  205. r1=Number(dInput1.toString().replace(".",""));
  206. r2=Number(dInput2.toString().replace(".",""));
  207. v =(r1/r2)*pow(10,t2-t1);
  208. }
  209. return v;
  210. },
  211. /**
  212. * 从身份证号码取生日(支持15位、18位身份证号码)
  213. * @param String sSfzh (必需) 身份证号码字符串
  214. * @return String 获取到的生日字符串,格式yyyy-mm-dd
  215. * <pre>
  216. * 使用举例:
  217. * var _sBirthday = CFW.oComm.fnGetBirthday(_sSfzh);
  218. * </pre>
  219. */
  220. fnGetBirthday : function (sSfzh){
  221. var year,month,day,retStr;
  222. if(CFW.oValid.fnIsNull(sSfzh,"CFW.oComm.fnGetBirthday 身份证号码字符串")){
  223. return ;
  224. }
  225. if(sSfzh!=""){
  226. if(sSfzh.length==15){
  227. year = "19" + sSfzh.substring(6,8);
  228. month = sSfzh.substring(8,10);
  229. day = sSfzh.substring(10,12);
  230. retStr = year + "-" + month + "-" + day;
  231. //window.CFW.oWin.fnAlert(year);
  232. //window.CFW.oWin.fnAlert(month);
  233. //window.CFW.oWin.fnAlert(day);
  234. //window.CFW.oWin.fnAlert(retStr);
  235. return retStr;
  236. }
  237. else if(sSfzh.length==18){
  238. year = sSfzh.substring(6,10);
  239. month = sSfzh.substring(10,12);
  240. day = sSfzh.substring(12,14);
  241. retStr = year + "-" + month + "-" + day;
  242. return retStr;
  243. }
  244. }
  245. else
  246. return "";
  247. },
  248. /**
  249. * 校验身份证合法性并提示错误提示信息
  250. * 校验包括:是否有非法字符、日期合法性、18位身份证校验位等(支持15位、18位身份证号码)
  251. * @param String sSfzh (必需) 身份证号码字符串
  252. * @return boolean 合法返回true,不合法返回false
  253. * <pre>
  254. * 使用举例:
  255. * var _bValid = CFW.oComm.fnValidSfzh(_sSfzh);
  256. * </pre>
  257. */
  258. fnValidSfzh : function (sSfzh){
  259. var inputPro = "公民身份号码";
  260. if(sSfzh == null) sSfzh = "";
  261. if(CFW.oValid.fnIsNull(sSfzh,"CFW.oComm.fnValidSfzh 身份证号码字符串")){
  262. return false;
  263. }
  264. if(_CHECK_IDCARD){
  265. var sGmsfz='';
  266. var sFhz='';
  267. var sMsg='';
  268. var mParams = {
  269. "PI_GMSFZ" : sSfzh
  270. };
  271. var obj=this;
  272. CFW.oAJax.doProc("PKG_FW_PUB.CHECK_GMSFZ", mParams, '',
  273. function(mData) {
  274. sFhz=mData[0].PO_FHZ;
  275. if(sFhz=='1'){
  276. sGmsfz=mData[0].PO_GMSFZ;
  277. }else{
  278. sMsg=mData[0].PO_MSG;
  279. }
  280. },
  281. function(sMsg){
  282. },
  283. false
  284. );
  285. if(sFhz=='1'){
  286. return true;
  287. }else{
  288. CFW.oWin.fnAlert(sMsg);
  289. return false;
  290. }
  291. }else{
  292. var format=sSfzh.length;
  293. if(!CFW.oValid._fnIs0AndPosInteger(sSfzh)){
  294. CFW.oWin.fnAlert(inputPro + "输入不合法!");
  295. return false;
  296. }
  297. if(sSfzh == "") return true;
  298. if((format==18)&&(!this._checkCheckStr(sSfzh))) return false;
  299. /*
  300. if(format==15){
  301. sSfzh= this.fnTransact(sSfzh);
  302. format=18;
  303. }*/
  304. if(format==15 || format==18){
  305. if(!this._fnCheckID(sSfzh,inputPro,format))
  306. return false;
  307. }else{
  308. CFW.oWin.fnAlert("公民身份号码的位数输入不正确!");
  309. return false;
  310. }
  311. return true;
  312. }
  313. },
  314. /**
  315. * 转换身份证号(无提示信息)
  316. * 校验包括:是否有非法字符、日期合法性、18位身份证校验位等(支持15位、18位身份证号码)
  317. * @param String sSfzh (必需) 需要转换身份证
  318. * @return 返回值:身份证号码 或 错误代码,如下:
  319. * 0 传入参数str为null
  320. * -1 公民身份证长度不是15或18位
  321. * -2 15位公民身份证不是数字
  322. * -3 18位公民身份证前17位不是数字
  323. * -4 没有通过18位校验
  324. * <pre>
  325. * 使用举例:
  326. * var _sNewSfzh = CFW.oComm.fnTransformSfzhNa(_sSfzh);
  327. * </pre>
  328. */
  329. fnTransformSfzhNa : function (sSfzh){
  330. var newstr="new";
  331. if ((CFW.oValid.fnIsNull(sSfzh)) || (sSfzh == "null") || (sSfzh == "")){
  332. return 0;
  333. }
  334. if(CFW.oValid.fnIsNull(sSfzh,"CFW.oComm.fnTransformSfzhNa 身份证号码字符串")){
  335. return 0;
  336. }
  337. if (sSfzh.length!=15 && sSfzh.length !=18){
  338. //CFW.oWin.fnAlert("公民身份证长度不正确应该为15或18位!");
  339. return -1;
  340. }
  341. if (sSfzh.length==15){
  342. if (isNaN(sSfzh)==true){
  343. //CFW.oWin.fnAlert("15位公民身份证应该为数字!");
  344. return -2;
  345. }
  346. newstr = this.fnTransact(sSfzh);
  347. }
  348. if (sSfzh.length==18){
  349. if (isNaN(sSfzh.substr(0,17))==true){
  350. //CFW.oWin.fnAlert("18位公民身份证前17位应该为数字!");
  351. return -3;
  352. }
  353. newstr = sSfzh;
  354. }
  355. if (this.fnValidSfzh(newstr)==true){
  356. return newstr;
  357. }else{
  358. return -4;
  359. }
  360. },
  361. /**
  362. * 升15位身份证为18位(升位前提示)
  363. * 主要是将传入的15位身份证转换为18位身份证,并提示转换后的18位身份证字符串
  364. * @param String sSfhz15bit (必需) 15位身份证
  365. * @param String sSfts 是否提示,'1'表示提示,'0'表示不提示,默认为'0'
  366. * @return String 18位身份证
  367. * <pre>
  368. * 使用举例:
  369. * var _sNewSfzh = CFW.oComm.fnTransact(_sSfzh);
  370. * </pre>
  371. */
  372. fnTransact : function (sSfhz15bit,iSfts){
  373. if(CFW.oValid.fnIsNull(sSfhz15bit,"CFW.oComm.fnTransact 15位身份证")){
  374. return ;
  375. }
  376. if(CFW.oValid.fnIsNull(iSfts)){
  377. iSfts = '0';
  378. }
  379. if(this.fnValidSfzh(sSfhz15bit) == false){
  380. return ;
  381. }
  382. var getno=sSfhz15bit;
  383. if(getno.length==15){
  384. var wi=new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
  385. // CFW.oWin.fnAlert("wi="+wi[1]);
  386. var ai=new Array(1,0,'X',9,8,7,6,5,4,3,2);
  387. // CFW.oWin.fnAlert("ai="+ai);
  388. var F1=getno.substr(0,6)+"19"+getno.substr(6,15);
  389. // CFW.oWin.fnAlert("F1="+F1);
  390. var F2=new Array();
  391. F2=F1.split("");
  392. // CFW.oWin.fnAlert("F2="+F2[1]);
  393. var i=0;
  394. var j=0;
  395. var sum =0;
  396. for(i = 0 ; i<17; i++){
  397. j = wi[i]*F2[i];
  398. sum = sum + j;
  399. }
  400. // CFW.oWin.fnAlert("sum="+sum);
  401. sum=sum%11;
  402. // CFW.oWin.fnAlert("again.sum="+sum);
  403. F2[17]=ai[sum];
  404. var F3=new String();
  405. for(i=0;i<18;i++){
  406. if(F2[i]=='X'){
  407. F3=F3+"X";
  408. break;
  409. }
  410. F3=F3+''+F2[i];
  411. }
  412. if(iSfts == '1'){
  413. CFW.oWin.fnAlert("身份证自动升位为"+F3);
  414. }
  415. return F3;
  416. }else{
  417. return sSfhz15bit;
  418. }
  419. },
  420. /**
  421. * 升15位身份证为18位(升位前不提示)
  422. * 主要是将传入的15位身份证,转换为18位身份证(其中年份固定为20世纪)
  423. * @param String sSfhz15bit (必需) 15位身份证
  424. * @return String 18位身份证
  425. * <pre>
  426. * 使用举例:
  427. * var _sNewSfzh = CFW.oComm.fnTransactNa(_sSfzh);
  428. * </pre>
  429. */
  430. /*
  431. fnTransactNa : function (sSfhz15bit){
  432. if(CFW.oValid.fnIsNull(sSfhz15bit)){
  433. return ;
  434. }
  435. if(CFW.oComm.fnValidSfzh(sSfhz15bit) == false){
  436. return ;
  437. }
  438. var getno=sSfhz15bit;
  439. if(getno.length==15){
  440. var wi=new Array(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2,1);
  441. // CFW.oWin.fnAlert("wi="+wi[1]);
  442. var ai=new Array(1,0,'X',9,8,7,6,5,4,3,2);
  443. // CFW.oWin.fnAlert("ai="+ai);
  444. var F1=getno.substr(0,6)+"19"+getno.substr(6,15);
  445. // CFW.oWin.fnAlert("F1="+F1);
  446. var F2=new Array();
  447. F2=F1.split("");
  448. // CFW.oWin.fnAlert("F2="+F2[1]);
  449. var i=0;
  450. var j=0;
  451. var sum =0;
  452. for(i = 0 ; i<17; i++){
  453. j = wi[i]*F2[i];
  454. sum = sum + j;
  455. }
  456. // CFW.oWin.fnAlert("sum="+sum);
  457. sum=sum%11;
  458. // CFW.oWin.fnAlert("again.sum="+sum);
  459. F2[17]=ai[sum];
  460. var F3=new String();
  461. for(i=0;i<18;i++){
  462. if(F2[i]=='X'){
  463. F3=F3+"X";
  464. break;
  465. }
  466. eval("F3=F3+"+F2[i]);
  467. }
  468. //CFW.oWin.fnAlert("身份证自动升位为"+F3);
  469. return F3;
  470. }else{
  471. return sSfhz15bit;
  472. }
  473. },
  474. */
  475. /**
  476. * 校验身份证号码是否符合规则 目前仅支持15位和18位的校验
  477. * @param String sInput (必需) 身份证号码
  478. * @param String sObjName (必需) 中文名
  479. * @param String sInput (必需) 号码长度
  480. * @return boolean true/false
  481. * <pre>
  482. * 使用举例:
  483. * CFW.oComm._fnCheckID(sSfzh,inputPro,format);
  484. * </pre>
  485. */
  486. _fnCheckID : function (sInput,sObjName,iFormat){
  487. var temp;
  488. var year,month,day;
  489. //0、校验位数是否为15或18位
  490. if(sInput.length != iFormat){
  491. CFW.oWin.fnAlert("目前不支持校验长度为"+iFormat+"的证件号码,目前仅支持15位或18位身份证号码。");
  492. return false;
  493. }
  494. //1、校验位数是否一致
  495. if(sInput.length != iFormat){
  496. CFW.oWin.fnAlert(sObjName+"格式不对,应为“"+iFormat+"”位。");
  497. return false;
  498. }
  499. //2、校验年份是否合法
  500. if(iFormat==15){
  501. temp=sInput.substring(6,8);
  502. year=parseInt(temp,10);
  503. if(year<00 || year>99){
  504. CFW.oWin.fnAlert(sObjName+"年份应介于00与99之间,请重新输入!");
  505. return false;
  506. }
  507. }else { // if(iFormat==18)
  508. temp=sInput.substring(6,10);
  509. year=parseInt(temp,10);
  510. if(year<1900 || year>2200){
  511. CFW.oWin.fnAlert(sObjName+"年份应介于1900与2200之间,请重新输入!");
  512. return false;
  513. }
  514. }
  515. //3、校验月份是否合法
  516. if(iFormat==15){
  517. temp=sInput.substring(8,10);
  518. }else{ //if(iFormat==18)
  519. temp=sInput.substring(10,12);
  520. }
  521. month=parseInt(temp,10);
  522. if(month<1 ||month>12){
  523. CFW.oWin.fnAlert(sObjName+"月份必须介于1与12之间!");
  524. return false;
  525. }
  526. //4、校验日期是否合法
  527. if(iFormat==15){
  528. temp=sInput.substring(10,12);
  529. }else{ //if(iFormat==18)
  530. temp=sInput.substring(12,14);
  531. }
  532. day=parseInt(temp,10);
  533. if((day==0)||(day>31)){
  534. CFW.oWin.fnAlert(sObjName+"日必须介于0与31之间!");
  535. return false;
  536. }else if(day>28 && day<31){
  537. if(month==2){
  538. if(day!=29){
  539. CFW.oWin.fnAlert(sObjName+year+"年"+month+"月无"+day+"日。" +
  540. "");
  541. return false;
  542. }
  543. else {
  544. if((year%4)!=0){
  545. CFW.oWin.fnAlert(sObjName+year+"年"+month+"月无"+day+"日。");
  546. return false;
  547. }
  548. else {
  549. if((year%100==0)&&(year%400!=0)){
  550. CFW.oWin.fnAlert(sObjName+year+"年"+month+"月无"+day+"日。");
  551. return false;
  552. }
  553. }
  554. }
  555. }
  556. }else if(day==31){
  557. if((month==2)||(month==4)||(month==6)||(month==9)||(month==11)){
  558. CFW.oWin.fnAlert(sObjName+month+"月无"+day+"日");
  559. return false;
  560. }
  561. }
  562. return true;
  563. },
  564. /**
  565. * 功能:构造一个form,发送HTTP请求。发送请求后,构造的form会被删除。
  566. *
  567. * @param action 字符串,必填项,form的action属性。
  568. * @param data 字符串,必填项,form的字段名值对。
  569. * @param method 字符串,非必填项,form的method属性,默认值是POST。
  570. * 为安全起见,尽可能使用post方法,而不是get方法
  571. * @returns
  572. *
  573. * 例子
  574. * var param = {"listWhereCls":" AAE100 ='1' and BAE001 like '4419%'",
  575. * "configId":"fw_authmngr_geneauth_list1",
  576. * "serviceId":"gltExcelService",
  577. * "method":"exportGlt"
  578. * };
  579. * sendRequest(contextPath + '/downFile.do',param);
  580. */
  581. fnSendRequest:function(action,data,method){
  582. method = method || 'post';
  583. var div = document.createElement("div");
  584. var html = "<form method=\""+method+"\" action=\""+action+"\">";
  585. for(var key in data){
  586. var value = data[key];
  587. html += "<input type=\"hidden\" name=\""+key+"\" value=\""+value+"\"/>";
  588. }
  589. html += "</form>";
  590. div.innerHTML=html;
  591. var form = div.getElementsByTagName("form")[0];
  592. document.body.appendChild(form);
  593. form.submit();
  594. document.body.removeChild(form);
  595. },
  596. /**
  597. * <pre>
  598. * 动态异步加载单记录表,多记录表或者JSP到当前页面的目标DIV中
  599. * @param divId 字符串,必填项,目标DIV的id值
  600. * @param type 字符串,必填项,加载的类型,值为'gt','glt','jsp'其中之一。
  601. * @param idOrJsp 字符串,必填项,值为加载gt的id,glt的id,或者是jsp路径。
  602. * 如果是jsp路径,为安全起见,路径后不能包含?a=xx&b=xx的字符串。参数请放在下面的data参数。
  603. * @param data JSON对象,选填项,用作指定gt,glt,jsp的参数.
  604. * 1. gt的参数仅支持defV
  605. * 2. glt的参数支持whereCls,height,width,showContent,editable,expBtns,
  606. * hasPage,pageSize,hasTitle
  607. * 如果gt,glt的参数没有在上述列出,请联系框架组改进,或者使用jsp方式动态加载
  608. * gt,glt方式仅仅用于动态产生简单的单记录表和多记录表,如果需要动态产生复杂的记录表,
  609. * 请编写jsp文件,用jsp方式动态载入
  610. * 3. jsp的参数无限制,与一般请求JSP的参数一样。
  611. * 动态载入JSP,对JSP文件的要求如下: (其实与hnisi:tabPanel下的hnisi:tab的要求类似)
  612. * 3.1 要动态载入的jsp文件,文件头部不能有这么一行
  613. * <%@ include file="/jsp/framework/head.jsp"%>
  614. * 需要将这一行改成
  615. * <%@ include file="/jsp/framework/taglib.jsp"%>
  616. * 从而避免重复导入js文件,
  617. * 3.2 jsp文件里面不要包含<html/>,<head/>,<body/>标签,因为动态载入会载入JSP所有内容
  618. * 如果被动态载入的JSP文件包含了<html/>,<head/>,<body/>那么载入后的页面会包含多个
  619. * <html/>,<head/>,<body/>
  620. *
  621. * 例子:
  622. * jsp页面:
  623. *
  624. * <!--动态内容将被加载到这个DIV中-->
  625. * <div id="dynDiv>
  626. * </div>
  627. *
  628. * js代码
  629. * //1. 动态加载ID=fw_operauth_oper_operator_q的单记录表
  630. * CFW.oComm.fnDynDiv('dynDiv','gt','fw_operauth_oper_operator_q'"});
  631. * CFW.oComm.fnDynDiv('dynDiv','gt','fw_operauth_oper_operator_q',{defV:"#{'OPERTYPE':'2','LOGINID':'test_jc1'}"});
  632. * //2.动态加载多记录表
  633. * CFW.oComm.fnDynDiv('dynDiv','glt','fw_operauth_oper_operator_list',{whereCls:"1=1"});
  634. * CFW.oComm.fnDynDiv('dynDiv','glt','fw_authmngr_role',{whereCls:"1=2",showContent:"false"});
  635. * 动态加载多记录表支持参数
  636. * //3.动态加载jsp页面
  637. * CFW.oComm.fnDynDiv('dynDiv','jsp','/jsp/sysmngr/web/operauth/oper/operator_right.jsp',{OPERTYPE:'2',BAE001:'441901'});
  638. * </pre>
  639. */
  640. fnDynDiv:function(divId,type,idOrJsp,data,func,obj){
  641. data = data || {};
  642. type = type.toLowerCase();
  643. var url = "";
  644. var serverUrl = _getServerURL();
  645. if('jsp' == type){
  646. if(idOrJsp.indexOf('?') != -1){
  647. CFW.oWin.fnAlert("出于安全考虑,不允许在URL上附带参数。请将参数写在函数的data入参。");
  648. return false;
  649. }
  650. url = serverUrl + idOrJsp;
  651. }else if('gt' == type){
  652. var gtId = idOrJsp;
  653. url = serverUrl + "/jsp/framework/gt.jsp";
  654. data.id = gtId;
  655. }else if('glt' == type){
  656. var gltId = idOrJsp;
  657. url = serverUrl + "/jsp/framework/glt.jsp";
  658. data.id = gltId;
  659. }
  660. $("#"+divId).html("<span><img style=\"vertical-align:bottom;\" src=\"" + contextPath + "/js/v2/ui/fwwindow/images/panel_loading.gif\"/></span>" +
  661. "<span>&nbsp;&nbsp;</span>" +
  662. "<span>loading...</span>");
  663. $("#"+divId).load(url,data,function(responseText,status,xhr){
  664. if (status == "error") {
  665. $("#"+divId).html("<span style='color:red;'>动态加载失败: " + xhr.status + " " + xhr.statusText + "</span><br>" + responseText);
  666. }else{
  667. if (func) {
  668. func.call(this,obj);
  669. }
  670. }
  671. });
  672. function _getServerURL(){
  673. var href = window.location.href;
  674. var count = 0;
  675. var i=0;
  676. var pos = -1;
  677. for(;i<href.length;i++){
  678. var c = href.charAt(i);
  679. if('/' == c){
  680. count++ ;
  681. }
  682. if(4 == count){
  683. pos = i;
  684. break;
  685. }
  686. }
  687. return href.substring(0,pos);
  688. }
  689. },
  690. /**
  691. * 功能:判断公民身份号码是否合法
  692. * @param inputstr 字符串
  693. * @returns true/false
  694. * 例子
  695. * _checkCheckStr(inputstr)
  696. */
  697. _checkCheckStr:function(inputstr){
  698. var i=(inputstr.substr(0,1)*7+inputstr.substr(1,1)*9+inputstr.substr(2,1)*10+inputstr.substr(3,1)*5+inputstr.substr(4,1)*8+inputstr.substr(5,1)*4+inputstr.substr(6,1)*2+inputstr.substr(7,1)*1+inputstr.substr(8,1)*6+inputstr.substr(9,1)*3+inputstr.substr(10,1)*7+inputstr.substr(11,1)*9+inputstr.substr(12,1)*10+inputstr.substr(13,1)*5+inputstr.substr(14,1)*8+inputstr.substr(15,1)*4+inputstr.substr(16,1)*2 )% 11 ;
  699. if(i>2){
  700. i=12-i;
  701. }
  702. else if(i==2){
  703. i="X";
  704. }
  705. else if(i<2){
  706. i=1-i;
  707. }
  708. if(inputstr.substr(17,1)==i)
  709. {
  710. return true;
  711. }
  712. else{
  713. CFW.oWin.fnAlert("公民身份号码输入不合法!校验位错误");
  714. return false;
  715. }
  716. },
  717. /**
  718. * 通用报表打印函数
  719. * @param sCfgId 报表配置ID,应用fw_report_conf 内的ID
  720. * @param form dom对象
  721. * @param bNdp (true/false)是否显示直接调用默认的打印机打印的按钮
  722. * @param bNsp (true/false)暂时没有用
  723. * @param sTarget (true/false)指定报表显示方式 可以是 blank、_self、iframe.name
  724. * @param bNeedSaveAsExcel (true/false)是否需要显示导出EXCEL按钮
  725. * @param bNeedPaginationAsXls (true/false)导出的EXCEL文件是否分页
  726. * @param bNeedSaveAsWord (true/false)是否需要显示导出word按钮
  727. * 主要的功能是根据配置ID,查询fw_report_conf表的REPORTPARM字段的值
  728. * 即报表的全部入参。根据入参的名称查询form中相同名称的录入值,自动匹配
  729. * 后传给报表作为查询数据的条件,最后生成报表的预览。
  730. * 使用方法:
  731. * <pre>
  732. * CFW.oComm.fnReportGenerate('bxgx_rydj_grjbzl_rpt',aform,false,true,'blank',true,false,true);
  733. * 具体的使用说明详见手册
  734. * </pre>
  735. */
  736. fnReportGenerate: function (sCfgId,form,bNdp,bNsp,sTarget,bNeedSaveAsExcel,bNeedPaginationAsXls,bNeedSaveAsWord){
  737. var _bNeedSaveAsExcel = bNeedSaveAsExcel||false;
  738. var _bNeedPaginationAsXls = bNeedPaginationAsXls||false;
  739. var _bNeedSaveAsWord = bNeedSaveAsWord || false;
  740. if(sCfgId==''||sCfgId==null){
  741. CFW.oWin.fnAlert("入参报表的配置ID不能为空!");
  742. return;
  743. }
  744. //执行AJAX获取该ID对应的配置
  745. new Service().appendQuery([{
  746. configId:'FW_CONFIG.FW_REPORT_CONF_Q',
  747. parameters:{ID:sCfgId},
  748. transform:'firstRow'
  749. }]).sentAjax(function(data){//处理成功的函数
  750. _rpt_1(sCfgId,data,form,bNdp,bNsp,sTarget,_bNeedSaveAsExcel,_bNeedPaginationAsXls,_bNeedSaveAsWord);
  751. return true;
  752. },function(XMLHttpRequest, textStatus, errorThrown){//处理失败的函数
  753. var tipMsg = XMLHttpRequest.responseText;
  754. CFW.oWin.fnAlert("错误信息:" + tipMsg);
  755. if(window['fwReportGentBack']){
  756. //调用回调函数
  757. fwReportGentBack();
  758. }
  759. });
  760. //内置函数
  761. function _rpt_1(sCfgId,data,dataForm,bNdp,bNsp,sTarget,bNeedSaveAsExcel,bNeedPaginationAsXls,bNeedSaveAsWord){
  762. var frms = document.getElementsByTagName("form");
  763. var iLen = frms.length;
  764. var params = data[0]["REPORTPARM"];
  765. var commService = data[0]["COMMSERVICE"];
  766. var commProc = data[0]["COMMPROC"];
  767. var arrParams;
  768. var tmp="";
  769. var fw_id="";
  770. var fwparams="";
  771. var fwmap = {};
  772. //找出已经存在相同的form删掉
  773. for(var i=0;i<iLen;i++){
  774. if(frms[i].name=='fwrptForm'){
  775. document.body.removeChild(frms[i]);
  776. break;
  777. }
  778. }
  779. var sfc = '1'; //是否重新生成报表数据,默认1为重新生成
  780. try{
  781. sfc =dataForm['FWSFCXSC'].value;
  782. }catch(e){}
  783. tmp+=" <input type=\"hidden\" name=\"FWSFCXSC\" value="+sfc+">";
  784. var where = ''; //WHERE条件
  785. try{
  786. where =dataForm['FWWHERE'].value;
  787. }catch(e){}
  788. tmp+=" <input type=\"hidden\" name=\"FWWHERE\" value="+where+">";
  789. var btnBack ='YES'; //显示返回按钮
  790. try{
  791. btnBack =dataForm['FWBTNBACK'].value;
  792. }catch(e){}
  793. tmp+=" <input type=\"hidden\" name=\"FWBTNBACK\" value="+btnBack+">";
  794. var btnClose ='YES'; //显示关闭按钮
  795. try{
  796. btnClose =dataForm['FWBTNCLOSE'].value;
  797. }catch(e){}
  798. tmp+=" <input type=\"hidden\" name=\"FWBTNCLOSE\" value="+btnClose+">";
  799. arrParams = params.split("|");
  800. iLen = arrParams.length;
  801. if(iLen==0){
  802. CFW.oWin.fnAlert("报表入参不能为空!");
  803. return false;
  804. }
  805. for(var i=0;i<iLen;i++){
  806. var n = arrParams[i];
  807. var s = '';
  808. if(typeof dataForm[n]=='object'){
  809. s = dataForm[n].value;
  810. }
  811. tmp+=" <input type=\"hidden\" name=\""+n+"\" value="+s+"> ";
  812. if(fwparams==''){
  813. fwparams = n+'='+s;
  814. }else{
  815. fwparams+='***'+n+'='+s;
  816. }
  817. fwmap[n] = s;
  818. }
  819. fwmap["FWPARAMS"] = fwparams;
  820. fwmap["REPORTID"] = sCfgId;
  821. fwmap["COMMPROC"] = commProc;
  822. fwmap["FWSFCXSC"] = sfc;
  823. fwmap["FWWHERE"] = where;
  824. if(commService==''||commService==null){
  825. _rpt_2(sCfgId,fw_id,fwparams,tmp,bNdp,bNsp,sTarget,bNeedSaveAsExcel,bNeedPaginationAsXls,bNeedSaveAsWord);
  826. }else{
  827. var arrP = commService.split(".");
  828. //执行AJAX获取该ID对应的配置
  829. new Service({
  830. serviceId:arrP[0],method:arrP[1],
  831. parameters:fwmap
  832. }).sentAjax(function(data){//处理成功的函数
  833. var t = data[0]["PO_FHZ"];
  834. if(t!=null){
  835. if(t!='1'){
  836. var msg = data[0]["PO_MSG"];
  837. CFW.oWin.fnAlert("错误信息:" + msg);
  838. if(window['fwReportGentBack']){
  839. //调用回调函数
  840. fwReportGentBack(t);
  841. }
  842. return true;
  843. }
  844. }
  845. fw_id = data[0]["FW_ID"];
  846. _rpt_2(sCfgId,fw_id,fwparams,tmp,bNdp,bNsp,sTarget,bNeedSaveAsExcel,bNeedPaginationAsXls,bNeedSaveAsWord);
  847. return true;
  848. },function(XMLHttpRequest, textStatus, errorThrown){//处理失败的函数
  849. var tipMsg = XMLHttpRequest;
  850. CFW.oWin.fnAlert("错误信息:" + tipMsg);
  851. if(window['fwReportGentBack']){
  852. //调用回调函数
  853. fwReportGentBack();
  854. }
  855. });
  856. }
  857. }//function _rpt_1
  858. function _rpt_2(sCfgId,fw_id,fwparams,tmp,bNdp,bNsp,tg,bNeedSaveAsExcel,bNeedPaginationAsXls,bNeedSaveAsWord){
  859. //动态创建报表form
  860. var frag = document.createDocumentFragment();
  861. var form = document.createElement("form");
  862. form.name="fwrptForm";
  863. form.action="${ctx}/report.do";
  864. if(tg==''||tg==null){
  865. tg = "blank";
  866. }
  867. form.target=tg;
  868. var str =" <input type=\"hidden\" name=\"configId\" value=\""+sCfgId+"\"> ";
  869. str+=" <input type=\"hidden\" name=\"needDirectPrint\" value=\""+bNdp+"\"> ";
  870. str+=" <input type=\"hidden\" name=\"needSelectPrinter\" value=\""+bNsp+"\"> ";
  871. str+=" <input type=\"hidden\" name=\"ID\" value=\""+fw_id+"\"> ";
  872. str+=" <input type=\"hidden\" name=\"FWPARAMS\" value=\""+fwparams+"\"> ";
  873. str+=" <input type=\"hidden\" name=\"needSaveAsExcel\" value=\""+bNeedSaveAsExcel+"\"> ";
  874. str+=" <input type=\"hidden\" name=\"excelPageStyle\" value=\""+bNeedPaginationAsXls+"\"> ";
  875. str+=" <input type=\"hidden\" name=\"needSaveAsWord\" value=\""+bNeedSaveAsWord+"\"> ";
  876. str+=tmp;
  877. form.innerHTML=str;
  878. frag.appendChild(form);
  879. document.body.appendChild(frag);
  880. form.submit();
  881. if(window['fwReportGentBack']){
  882. //调用回调函数
  883. fwReportGentBack();
  884. }
  885. return true;
  886. }//function _rpt_2
  887. },//function reportGenerate
  888. /**
  889. * 动态加载js脚本
  890. * @param oOpt 参数,JSON数据,内容如下
  891. * 1. url : 需要动态加载的js地址
  892. * 2. beforeFunc :校验函数,只有当校验函数返回结果为true的时候,才动态加载js
  893. * 3. afterFunc : 回调函数,回调函数的参数是script DOM对象。
  894. * @return
  895. * <pre>
  896. * 使用举例:
  897. * 例子:按顺序加载encrypt.js文件和encrypt2文件
  898. * CFW.oComm.fnLoadScript({
  899. * url:curSerUrl + "/js/fw/encrypt.js",
  900. * beforeFunc: function(){return null==document.getElementById("fwencrypt");},//返回true的时候才载入脚本
  901. * afterFunc: function(script){
  902. * if(null != script){
  903. * script.id = "fwencrypt";
  904. * }
  905. * CFW.oComm.fnLoadScript({
  906. * url:curSerUrl + "/js/fw/encrypt2.js",
  907. * beforeFunc: function(){return null==document.getElementById("fwencrypt2");},//返回true的时候才载入脚本
  908. * afterFunc: function(script){
  909. * if(null != script){
  910. * script.id = "fwencrypt2";
  911. * }
  912. * }
  913. * });
  914. * }
  915. * });
  916. * </pre>
  917. */
  918. fnLoadScript : function(oOpt){
  919. var url = oOpt.url || "";
  920. var afterFunc = oOpt.afterFunc || function(){};
  921. var beforeFunc = oOpt.beforeFunc || function(){return true};
  922. if('[object Function]' != Object.prototype.toString.call(beforeFunc)){
  923. beforeFunc = function(){return true};
  924. }
  925. if('[object Function]' != Object.prototype.toString.call(afterFunc)){
  926. afterFunc = function(){};
  927. }
  928. //校验不通过,直接调用回调函数
  929. if(false == beforeFunc()){
  930. afterFunc();
  931. return;
  932. }
  933. //校验通过,则下载script,并且下载执行完毕后调用afterFunc,并且把script作为参数传递
  934. var script = document.createElement('script');
  935. script.src = url;
  936. script.type= 'text/javascript';
  937. if(script.readyState){
  938. script.onreadystatechange = function(){
  939. if('complete' == this.readyState || 'loaded' == this.readyState){
  940. this.onreadystatechange = null;
  941. afterFunc(script);
  942. }
  943. }
  944. }else{
  945. script.onload = function(){
  946. afterFunc(script);
  947. }
  948. }
  949. document.getElementsByTagName("head")[0].appendChild(script);
  950. },
  951. fnDownAttach : function(zlid){
  952. //把文件绝对路径+名字传给downloadform表单
  953. var url = contextPath + '/downFile.do?serviceId=uploadAttachExportService&method=exportFile&ZLID='+encodeURI(zlid);
  954. window.location.href = url;
  955. },
  956. fnDeleteAttach : function(zlid){
  957. var params = {ZLID:zlid};
  958. new Service({
  959. serviceId:'uploadAttachService',
  960. method:'deleteAttach',
  961. parameters:params
  962. }).sentAjax(function(data){
  963. CFW.oGlt.fnRefreshData('fw_comm_attachlist');
  964. alert('操作成功!');
  965. },function(msg){
  966. alert(msg);
  967. });
  968. },
  969. /**
  970. * 调用上传下载组件
  971. * @param ywbh 业务编号
  972. * @param ywlb 业务类别
  973. * @param uploadType 上传类型
  974. * @param uploadService 上传处理方法
  975. * @param uploadPath 上传路径
  976. * @param maxfileSize 限制只能上传N个附件或者不限制附件个数,默认不限制。
  977. * @returns {Boolean}
  978. * <pre>
  979. * CFW.oComm.fnUploadAttach(ywbh,ywlb,uploadType,uploadService,uploadPath,maxfileSize)
  980. * </pre>
  981. */
  982. fnUploadAttach : function(ywbh,ywlb,uploadType,uploadService,uploadPath,maxfileSize){
  983. if(CFW.oValid.fnIsNull(ywbh)){
  984. FWalert('业务编号为空,请核实!');
  985. return;
  986. }
  987. var ywlsh=CFW.oValid.fnIsNull(ywlb)?ywbh:(ywlb+ywbh);
  988. if (CFW.oValid.fnIsNull(uploadType)) {
  989. CFW.oWin.fnAlert('请选择上传类别!!');
  990. return;
  991. }
  992. var paramStr='';
  993. if(!CFW.oValid.fnIsNull(uploadPath)){
  994. paramStr+='&uploadType='+uploadType;
  995. }
  996. if(!CFW.oValid.fnIsNull(uploadPath)){
  997. paramStr+='&uploadPath='+uploadPath;
  998. }
  999. if(!CFW.oValid.fnIsNull(uploadService)){
  1000. paramStr+='&uploadService='+uploadService;
  1001. }
  1002. if(!CFW.oValid.fnIsNull(maxfileSize)){
  1003. paramStr+='&fileSize='+maxfileSize;
  1004. }
  1005. var url=contextPath + "/framework/web/uploadattach.do?ywlsh="+ywlsh+paramStr;
  1006. window.open(url, "newwindow", "height=300, width=800, toolbar =no, menubar=no, scrollbars=yes, resizable=no, location=no, status=no");
  1007. },
  1008. /**
  1009. * 单击回车键就调用TAB键
  1010. * @param event
  1011. * @returns {Boolean}
  1012. * <pre>
  1013. * CFW.oComm._fnEnterToTab(event)
  1014. * </pre>
  1015. */
  1016. _fnEnterToTab : function(event){
  1017. //8 backspace 9 tab 46 delete
  1018. if(event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 46){
  1019. return true;
  1020. }
  1021. if (event.keyCode == 13) {
  1022. event.keyCode = 9;
  1023. return true;
  1024. }
  1025. if(event.ctrlKey||event.shiftKey){return true;}
  1026. return false;
  1027. }
  1028. };